Prolog什么时候断线?

Prolog什么时候断线?,prolog,prolog-toplevel,Prolog,Prolog Toplevel,考虑Prolog中的以下示例程序: p(0). p(1). b1(T) :- T = tri(X, Y, Z), p(X), p(Y), c(T), !, p(Z). c(tri(X, X, _Z)). SWI Prolog为某些查询提供了一些有趣的答案:\ ?- b1(tri(0, Y, Z)). Y = Z, Z = 0 ; Y = 0, Z = 1. 请注意,它确实在第二个答案中打破了界限,但在第一个答案中没有 这让我想知道,断线的确切规则是什么?SWI Prolog何时中断

考虑Prolog中的以下示例程序:

p(0).
p(1).

b1(T) :-
   T = tri(X, Y, Z), p(X), p(Y), c(T), !, p(Z).

c(tri(X, X, _Z)).
SWI Prolog为某些查询提供了一些有趣的答案:\

?- b1(tri(0, Y, Z)).
Y = Z, Z = 0 ;
Y = 0,
Z = 1.
请注意,它确实在第二个答案中打破了界限,但在第一个答案中没有

这让我想知道,断线的确切规则是什么?SWI Prolog何时中断线路,何时不中断?这取决于什么?

所有绑定(Var=Value)都显示在自己的行中,除非两个或多个变量绑定到同一个值。在这种情况下,它在一行上使用以下语法

V1 = V2, V2 = V3, ..., Vn-1 = Vn, Vn = value.

这样做是因为知道两个变量具有相同的值是很有价值的。SWI Prolog中的答案打印为有效的Prolog程序。没有进一步的承诺,版本之间的布局、订购等可能会更改,恕不另行通知。如果希望机器读取结果,请不要使用顶级。

这取决于解释器。您可能可以通过设置稍微改变这种行为。@TomasBy SWI PrologIt如果这与考试分数有任何关系,那将是一个奇怪的(和悲哀的)@TomasBy我重新标记了问题;然而;我想我已经在问题中说过,这是SWI Prolog?SWI使用的确切算法我不知道,但我知道在这种情况下,前两个变量位于第一行的原因是因为它们具有相同的值。SWI希望您看到这一点并认为“Y=Z=0”。其余的都在单独的行中,因为它们的值不同。当然,当你要求另一个解决方案时,它必须开始新的路线。当然,这些变化之间没有区别(您的答案不比SWI正确或不正确,反之亦然),我认为这是SWI的一个特点(GNU不这样做,我不认为)。