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    ]).
 find_term_in_atom(+Atom, +SearchTerm, ?From, ?To)
   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).
 find_term_in_term(+SearchTerm, +Term, ?TermPos, ?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) :- !