Christian Wirth wrote: > Hi, > > i also need to save the resolution list of a call, meaning a list of all > called predicates in the called order (without and/or, but that could be > extracted later). > > Something like this (only an example, not tested): > > rescall(true,_) :- !. > > rescall((A,B),Res) :- rescall(A,Res),rescall(B,Res). > rescall((A;B),Res) :- rescall(A,Res);rescall(B,Res). > > rescall(X,Res) :- > not(booleanfunctor(X)),functor(X,F,A),member(F/A,Res),clause(X,C),rescall(C,Res). This member looks definitely slow, as each time it has to scan the whole Res list from the beginning. Why not rescall(X,[F/A|Res]) :- not(booleanfunctor(X)),functor(X,F,A),clause(X,C),rescall(C,Res). Of course, then you have to change something in the other clauses as well. You could use something like append (but adapted for difference lists) in the clause: rescall((A,B),Res) :- rescall(A,Res),rescall(B,Res). but then you would be again scanning the list from the beginning. So, you could make available the variable that terminates the difference list as another parameter: rescall(true,X,X):- !. rescall((A,B),Res,END) :- rescall(A,Res,EndTemp), rescall(B,EndTemp,END). % Here I am not sure I understand what you want: % rescall((A;B),Res) :- rescall(A,Res);rescall(B,Res). rescall(X,[F/A|Res],End) :- not(booleanfunctor(X)), functor(X,F,A), clause(X,C), rescall(C,Res,End). Cheers, Marco -- Marco Gavanelli, Ph.D. in Computer Science Dept of Engineering University of Ferrara Tel/Fax +39-0532-97-4833 http://www.ing.unife.it/docenti/MarcoGavanelli/Received on Fri May 14 2010 - 15:56:21 CEST
This archive was generated by hypermail 2.2.0 : Thu Feb 02 2012 - 02:31:58 CET