Prolog箭头操作员

时间:2014-01-11 15:32:32

标签: prolog logic

| ?- true ; (true->false)
yes
| ?- (true->false) ; true.
no
| ?- false ; true.
yes

根据我的理解,'是'/'否'结果告诉用户查询是否成功。查询在谓词true上始终成功,并且始终在false上失败。

  1. 因为;/2表示OR(可交换),前两个查询应该是等效的(都是成功的)

  2. 在谓词逻辑中,公式(true->false)false的计算结果为FALSE,因此最后两个查询应该是等价的

  3. 因此:第二个查询似乎与理论逻辑不一致

    我的推理是否有错误?我觉得我不理解一些基本的东西。

2 个答案:

答案 0 :(得分:9)

这是一个非常好的问题。

为了详细说明@ larsmans的答案,->/2谓词与if-then-else谓词结合时充当;/2。就它而言,它只是if-then

查看if-then-else构造,GNU Prolog manual says中的说明:

  

->/2通常与;/2结合使用来定义if-then-els e,如下所示:Goal1 -> Goal2 ; Goal3.请注意Goal1 -> Goal2 是第一个参数   of(;)/ 2 和Goal3(else部分)是第二个参数。这样的   首先if-then-else控制构造为其创建一个选择点   else-part (直观地与;/2关联)然后执行Goal1。   如果[{1}}]成功,Goal1一起创建的所有选择点   删除了else部分的选择点并执行了Goal2。   如果Goal1失败,则执行Goal3。

在这种情况下,我们有:

Goal1

第一个(true -> false) ; true true,后者成功。一旦发生这种情况,根据谓词行为的描述,将导致您转到第二个Goal1语句(true)的选择点被删除。因此,当遇到Goal3时,会发生故障而没有回溯到第二个false,整个查询都会失败。

但是,如果你做了这样的事情:

true

在第一个foo :- true -> false. foo :- true 子句失败后有一个选择点,所以你得到:

foo

<小时/> 我认为混淆源于将| ?- foo. yes. false ; true进行比较。与(true -> false) ; true更类似的表达式是:

(true -> false) ; true

由于(true, !, false) ; true 的工作原理,它也会评估为false;在第一个子句失败时提供选择点。但是如果第一个子句有一个cut并且消除了选择点,那么它就不会被采用并且查询总体上会失败。

答案 1 :(得分:6)

Prolog中的箭头与一阶逻辑中的物质含义不对应。它是一个三元组“if-then-else”运算符,带有可选的替代选项。由于它在Prolog语法中的实现方式,

(true -> false) ; true

并不代表你的想法。它被解析为true -> false ; true

?- ((true -> false) ; true) =.. Expr.
Expr = [;, (true->false), true].

?- (true -> false ; true) =.. Expr.
Expr = [;, (true->false), true].

所以它失败了,因为它意味着“如果true然后false其他true”,即false