所以univ操作符.我不太明白.
例如:
foo(PredList,[H|_]) :- bar(PredList,H). foo(PredList,[_|T]) :- foo(PredList,T),!. bar([H|_],Item) :- G =.. [H,Item],G. bar([_|T],Item) :- bar(T,Item).
这是做什么的?这看起来看是否另一个谓词是真的.我不明白“..”是什么.
没有univ操作符,你如何重写?
解决方法
Univ(= ..)将一个术语分解成成分列表,或从这样的列表中构建一个术语.尝试:
?- f(x,y) =.. L. L = [f,x,y]. ?- f(x,y,z) =.. [f|Args]. Args = [x,z]. ?- Term =.. [g,y]. Term = g(x,y).
bar似乎调用PredList中每个谓词的Item,其中foo追溯到Items. (使用变量作为谓词不可移植;调用谓词应该是首选的.)
编辑:Kaarel是对的,univ可以由functor / 3和arg / 3替换,如下所示:
bar([H|_],Item) :- functor(Goal,H,1),% unifies Goal with H(_) arg(1,Goal,Item),% unifies first argument of Goal with Item call(Goal). % use this for portability