| ?- true ; (true->false)
yes
| ?- (true->false) ; true.
no
| ?- false ; true.
yes
根据我的理解,'是'/'否'结果告诉用户查询是否成功。查询在谓词true
上始终成功,并且始终在false
上失败。
因为;/2
表示OR(可交换),前两个查询应该是等效的(都是成功的)
在谓词逻辑中,公式(true->false)
和false
的计算结果为FALSE,因此最后两个查询应该是等价的
因此:第二个查询似乎与理论逻辑不一致
我的推理是否有错误?我觉得我不理解一些基本的东西。
答案 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
。