Prolog中析取的交换性

时间:2014-03-01 09:34:20

标签: prolog prolog-toplevel commutativity

我刚刚开始学习Prolog,我遇到了一个我不明白的问题。 当我问:

?- fail; true.

Prolog回答:

true

这是我所期待的。但是,如果我问:

?- true; fail.

Prolog回答:

true ;
false.

..我不明白为什么。析取运算符应该是可交换的。为什么这两个Prolog的答案不同?

3 个答案:

答案 0 :(得分:3)

另请注意,Prolog析取运算符(;)/2一般来说可交换。例如:

?- !; write(else).
true.

?- write(then); !.
then
true ;
true.

析取的右分支仅在回溯时尝试如果在执行左分支时未切断隐式选择点。请注意以下条款:

foo :- (!; write(else)).

相当于:

foo :- !.
foo :- write(else).

因此,削减和(其他)副作用导致(;)/2不表现为逻辑分离。

答案 1 :(得分:1)

它只是顶级互动的细节,然后根据您正在使用的Prolog解释器,您可以观察到不同的行为。

SWI-Prolog在介绍性documentation中提供了一些信息:

  

2.1.2执行查询

     

加载程序后,可以询问Prolog有关该程序的查询。下面的询问询问Prolog什么食物'sam'喜欢。系统以X =响应,如果它可以证明某个X的目标。用户可以键入分号(;)或空格键6如果他想要另一个解决方案。如果您不想查看更多答案,请使用返回键。如果用户使用返回键或Prolog知道没有更多答案,则Prolog以句点(。)完成输出。如果Prolog找不到(更多)答案,那就写错了。

答案 2 :(得分:1)

关于prolog如何显示结果的困惑。当您在prolog中进行查询时,它将尝试查找所有可能的答案。这意味着它将从第一个事实或子句开始,按顺序遍历它们,当它最终使查询成立时,显示答案。如果在找到最后一个解决方案的过程中有选择点,prolog会提示用户寻找更多可能的成功解决方案。

以下情况:

?- false ; true.

此查询首先查看失败的false子句,然后由于存在分离;,请在; true之后检查该子句。这成功了,prolog显示:

true

请注意,当它找到此解决方案时,没有更多选择,因此没有提示进一步解决方案。

现在让我们看看第二个例子:

?- true ; false.

Prolog查看第一个子句true,并成功并告诉用户:

true

但是在这种情况下,它没有用尽所有可能的解决方案,因为有一个分离;创造了另一种选择。因此,当您在提示符下输入;时:

true ;

你告诉prolog寻找更多解决方案。 Prolog返回并在分离后检查该子句并遇到false。这失败了,没有其他解决方案。因此,您对进一步解决方案的请求失败,并且prolog输出{{​​1}}:

false

第一个true ; false 表示它成功了。 true表示没有找到更多解决方案,第二次尝试失败。

Prolog的行为是通过适当的条款顺序寻求解决方案,只要你要求它们直到它失败,就提出它们。当它最终失败时,你得到false。一些序言输出false。上述行为不是交换问题。