(Message 3) From: HELEN HPS (on ERCC DEC-10) Date: Wednesday, 16-Jan-85 14:05:05-GMT To: ecmi08@2972,Pain@EDXA Via: uk.ac.edinburgh.edxa ; (to uk.ac.edinburgh.emas) 16 Jan 85 14:07:08 gmt Msg ID: <132001-454-365@EDXA> -------- /* make_rec Make records from list of relations Alan Bundy 7.7.82 */ make_rec(Concept,Example,VObjs,VRec,Pairs) :- !, specimen(Example,ERelns), gen_list(ERelns,VRelns,Pairs), maplist(second,Pairs,VObjs), maplist(convert,VRelns,VRec). /* Take list of terms and apply gen_term to each member */ gen_list([],[],[]). gen_list([ETerm|ERest], [VTerm|VRest], Pairs) :- gen_term(ETerm,VTerm,Pairs1), gen_list(ERest,VRest,Pairs2), union(Pairs1,Pairs2,Pairs). /* Take term, find all atoms in it and replace with variables, returning list of atom, variable pairs */ gen_term([],[],[]) :- !. gen_term(N,N,[]) :- integer(N), !. gen_term(Atom,Var,[pair(Atom,Var)]) :- atom(Atom), !. gen_term(EStruc,VStruc,Pairs) :- !, EStruc =.. [Func|EArgs], gen_list(EArgs,VArgs,Pairs), VStruc =.. [Func|VArgs]. /* take second argument of pair */ second(pair(F,S),S). /* Convert input relation style into internal representation as predicate tree */ convert(Reln, record(Args,Name,ExPosn)) :- Reln =.. [Pred|Args], length(Args,N), tree(Name,N,Tree), node_at(Pred,Tree,ExPosn). /* find nth element of list */ nth_el(1,[Hd|Tl],Hd). nth_el(N,[Hd|Tl],El) :- nth_el(PN,Tl,El), N is PN + 1. /* Find Position of Node in Tree */ node_at(Node,Tree,[]) :- Tree =.. [Node|SubTrees]. node_at(Node,Tree,[N|Posn]) :- Tree =.. [Root|SubTrees], nth_el(N,SubTrees,SubTree), node_at(Node,SubTree,Posn). --------