Prolog GNU-大学操作员?解释一下

Prolog GNU-大学操作员?解释一下,prolog,operator-keyword,backtracking,meta-predicate,Prolog,Operator Keyword,Backtracking,Meta Predicate,所以是大学的接线员。我不太明白 例如: 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(=…)将一个术语分解为一个成分列表

所以是大学的接线员。我不太明白

例如:

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, y, z].

?- Term =.. [g,x,y].
Term = g(x, y).
bar
似乎调用
Item
上的
PredList
中的每个谓词,并对
Item
进行回溯。(使用变量作为谓词是不可移植的;应首选
调用
谓词。)

编辑:卡雷尔是对的,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

我认为最合适的重写是:

 bar( [H|_], Item ) :- call(H, Item).
call/n
尚未成为ISO核心标准的一部分,但在不久的将来可能会成为(*)。许多Prolog系统已经支持它们了

与简单的
(=..)/2
函子/3
+
arg/3
解决方案相比,应该优先使用
调用/n
call/n
解决方案能够处理闭包(**)

使用简单的
(=..)/2
functor/3
+
arg/3
解决方案,用户只能在第一个列表参数中使用原子调用
bar/2
。例如:

 p1(1).
 p2(2).
 ?- bar( [p1, p2], 1 ).
 Yes
 ?- bar( [p1, p2], 2 ).
 Yes
 ?- bar( [p1, p2], 3 ).
 No
有了闭包,我们就不局限于原子,而且我们可以节省一些编码工作。例如,我们可以直接执行以下操作:

 ?- bar( [=(1), =(2)], 1 ).
 Yes
 ?- bar( [=(1), =(2)], 2 ).
 Yes
 ?- bar( [=(1), =(2)], 3 ).
 No
致意

(*)
技术勘误表草案2

(**)
谁发明的?:
call/n
谓词

+1询问如何在没有大学的情况下重写。顺便说一句,ISO谓词functor/3和arg/3在某些情况下可能会起作用,应该是首选,但我不确定它们是否总是可以使用。@Kaarel,+1。更新了我的答案。很好的答案。澄清一下:univ操作符将左侧的术语与右侧的列表统一起来,因此列表的开头是函子,而列表的结尾是参数。@larsmans:您正在强迫
H
成为原子。因此,您正在阻止部分应用程序!参见@Cookie Monster的解决方案。关于“谁发明了它”:我所知道的第一个书面来源是Richard O'Keefe于1984年7月25日首次公开宣布的1984年Prolog可评估谓词拟议标准草案。你发现一个前体仅限于某些未完全指定的lambda类型,但不允许在Mycroft,O'Keefe中部分应用Prolog的多态类型系统,AI杂志,1984年8月。我想这符合以下陈述“(1)Alan Mycroft和我一起发明了call/N。没有其他人参与。”在第二个参考文献中找到的韩国的?不知怎么的。但并非完全如此。还有其他一些说法表明,
call/N
是在那篇论文中发明的。那一定是这篇论文,而不是草稿,因为草稿是由韩国撰写的,论文是由Mycroft&ROK撰写的,ROK在新闻交流中说的(我的第二篇参考文献标记为(**))这是米克罗夫特和罗克发明的。这是在没有资料来源的情况下常见的推理所表明的。但这并不能代替阅读报纸。