gpt4 book ai didi

prolog - 使用 "or"运算符和使用多个子句之间有什么区别吗?

转载 作者:行者123 更新时间:2023-12-03 15:18:37 26 4
gpt4 key购买 nike

结果和执行有什么不同(如果有的话)

memb(X, [Y,L]) :- X == Y ; memb(X,L).
memb(X, [Y,L]) :- X == Y.
memb(X, [Y,L]) :- memb(X,L).

最佳答案

没有语义差异但是 调用谓词时可能存在性能差异。让我们用一个例子来说明:

walk([]).
walk([_| Tail]) :-
walk(Tail).
假设 Prolog 系统实现了第一个参数索引,以下查询不会创建任何选择点:
| ?- walk([]).
yes

| ?- walk([_,_,_]).
yes
我们可以重写 walk/1谓词变成一个语义等价的子句:
walk(List) :- List = []; List = [_| Tail], walk(Tail).
但现在我们会得到:
| ?- walk([]).                                             
true ? ;
no

| ?- walk([_,_,_]).
true ? ;
no
IE。我们失去了第一个参数索引在避免创建虚假选择点方面的好处(当调用带有绑定(bind)参数的 walk/1 谓词时)。
编写主体为析取的子句通常不是一个好的编程习惯。在大多数情况下,使用单独的子句使代码更易于阅读并且(如上例所示)更高效。但是大多数编码指南规则都有异常(exception),这里也是如此。有时,从句标题与一个或多个参数子术语相结合,这是一种相对昂贵的操作。例如:
foo([_, _, Three| _], bar(_, [_, Second]), _) :-
...
这是一个人为的例子,但复杂的头部统一通常可以在非平凡的代码中找到。通过使用单个子句和析取可以避免重复它的多个子句的复杂子句头部统一的成本,因为它只会执行一次(每次调用谓词)。

关于prolog - 使用 "or"运算符和使用多个子句之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66224432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com