1/***************************************************************************** 2 * This file is part of the Prolog Development Tool (PDT) 3 * 4 * WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start 5 * Mail: pdt@lists.iai.uni-bonn.de 6 * Copyright (C): 2004-2012, CS Dept. III, University of Bonn 7 * 8 * All rights reserved. This program is made available under the terms 9 * of the Eclipse Public License v1.0 which accompanies this distribution, 10 * and is available at http://www.eclipse.org/legal/epl-v10.html 11 * 12 ****************************************************************************/ 13 14:- module( parse_term_from_atom, 15 [ atom_to_term/4 % (+TermAtom,Term,VarNames,TermPos) 16 , find_term_in_atom/4 % (+Atom,+SearchTerm,From,To) 17 , find_term_in_term/5 % (+SearchTerm,+Term,TermPos,From,To) 18 ] 19 ). 20 % TODO: 21 % Complete definition of find_term_in_term/5 so that it also 22 % searches correctly in terms with lists. 23 24 25 26% This is an extension to the predefined predicate: 27% atom_to_term(+Atom, -Term, -Bindings)! 28% one can think of the predefined predicate as being 29% defined by: 30% atom_to_term(TermAtom, -Term, -Bindings) :- 31% atom_to_term(TermAtom,Term,_,Bindings). 32 33atom_to_term(TermAtom,Term,VarNames,TermPos) :- 34 new_memory_file(MemFile), 35 open_memory_file(MemFile,write,Out), 36 write(Out,TermAtom), 37 write(Out,'.'), 38 close(Out), 39 open_memory_file(MemFile,read,In), 40 read_term(In,Term,[ 41 subterm_positions(TermPos), 42 variable_names(VarNames)% , variables(Vars) 43 ]).
47find_term_in_atom(Atom,SearchTerm,From,To) :-
48 atom_to_term(Atom,TermFromAtom,_,AllTermPos),
49 find_term_in_term(SearchTerm,TermFromAtom,AllTermPos,From,To).
52find_term_in_term(SearchTerm,Term,AllTermPos,From,To) :- 53 nonvar(SearchTerm), 54 nonvar(Term), 55 find_term_in_term__(SearchTerm,Term,AllTermPos,From,To). 56 57find_term_in_term__(SearchTerm,Term,AllTermPos,From,To) :- 58 SearchTerm = Term, 59 !, 60 extract_position(AllTermPos,From,To). 61% TODO: The following clause is still incomplete, se TODO marker: 62%find_term_in_term__(SearchTerm,Term,TermPos,From,To) :- 63% list(Term), 64% !, 65% TermPos = list_position(From, To, ElemsPos, TailPos), % See manual for read_term/3. 66% % TODO: Deal with ElemsPos and eventually TailPos, 67% nth1(N,SubPosList,ArgumentPos), 68% find_term_in_term(SearchTerm,Argument,ArgumentPos,From,To). 69find_term_in_term__(SearchTerm,Term,TermPos,From,To) :- 70 TermPos = term_position(_,_,_,_,SubPosList), % See manual for read_term/3. 71 arg(N,Term,Argument), 72 nth1(N,SubPosList,ArgumentPos), 73 find_term_in_term(SearchTerm,Argument,ArgumentPos,From,To). 74 75 76%find_term_in_term(SearchTerm,Term,AllTermPos,From,To) :- 77% find_term_in_term(SearchTerm,Term,AllTermPos,0,From,To). % init 78% 79%find_term_in_term(SearchTerm,Term,AllTermPos,FromStart,From,To) :- 80% nonvar(SearchTerm), 81% nonvar(Term), 82% find_term_in_term__(SearchTerm,Term,AllTermPos,FromStart,From,To). 83% 84%find_term_in_term__(SearchTerm,Term,AllTermPos,FromStart,From,To) :- 85% SearchTerm = Term, 86% !, 87% extract_position(AllTermPos,FromTerm,ToTerm), 88% From is FromStart+FromTerm, 89% To is FromStart+ToTerm. 90%find_term_in_term__(SearchTerm,Term,TermPos,FromStart,From,To) :- 91% TermPos = term_position(FromTerm,_,_,_,SubPosList), % See manual for read_term/3. 92% arg(N,Term,Argument), 93% nth1(N,SubPosList,ArgumentPos), 94% FromStartNew is FromStart+FromTerm, 95% find_term_in_term(SearchTerm,Argument,ArgumentPos,FromStartNew,From,To). 96 97% For the meaning of the terms in the first argument 98% see the SWI-Prolog manual entry for read_term/3: 99extract_position( term_position(From, To, _, _, _), From,To) :- !. 100extract_position( From-To, From,To) :- !. 101extract_position( string_position(From, To), From,To) :- !. 102extract_position( brace_term_position(From, To, _), From,To) :- !. 103extract_position( list_position(From, To, _, _), From,To) :- !