| ?- true ; (true->false)
yes
| ?- (true->false) ; true.
no
| ?- false ; true.
yes
Run Code Online (Sandbox Code Playgroud)
根据我的理解,"是"/"否"结果告诉用户查询是否成功.查询始终在谓词上成功,true并且始终失败false.
因为;/2意味着OR(可交换)前两个查询应该是等价的(都是成功的)
在预测逻辑中公式(true->false)和false评估为FALSE,因此最后两个查询应该是等价的
因此:第二个查询似乎与理论逻辑不一致
我的推理是否有错误?我觉得我不理解一些基本的东西.
这个问题问得好.
为了详细说明@ larsmans的答案,->/2谓词作为if-then-else与;/2谓词结合的时间.就它而言,它只是if-then.
看一下这个if-then-else结构,GNU Prolog手册中的描述说:
->/2通常结合使用;/2以定义if-then-else如下:Goal1 -> Goal2 ; Goal3.注意这Goal1 -> Goal2是(;)/ 2的第一个参数,而Goal3(else部分)是第二个参数.这样的if-then-else控制构造首先为else部分创建一个选择点(直观地与之相关联;/2),然后执行Goal1. 如果[ofGoal1] 成功,Goal1将删除与else部分的选择点一起创建的所有选择点,并执行Goal2.如果Goal1失败,则执行Goal3.
在这种情况下,我们有:
(true -> false) ; true
Run Code Online (Sandbox Code Playgroud)
第一个true是Goal1成功的.一旦发生这种情况,根据谓词行为的描述,将导致您进入第二个true语句(Goal3)的选择点被删除.因此,当false遇到问题时,发生故障而没有回溯到第二个true并且整个查询失败.
但是,如果你做了这样的事情:
foo :-
true -> false.
foo :-
true
Run Code Online (Sandbox Code Playgroud)
在第一个foo子句失败后有一个选择点,所以你得到:
| ?- foo.
yes.
Run Code Online (Sandbox Code Playgroud)
false ; true与之比较(true -> false) ; true.更类似的表达方式(true -> false) ; true是:
(true, !, false) ; true
Run Code Online (Sandbox Code Playgroud)
false由于;工作原因,这也将评估.该;规定在第一条出现故障的情况下,选择点.但是如果第一个子句有一个cut并且消除了选择点,那么它将不被采用并且查询总体上失败.
Prolog中的箭头与一阶逻辑中的材料含义不对应.它是一个三元组"if-then-else"运算符,带有可选的替代选项.由于它在Prolog语法中的实现方式,
(true -> false) ; true
Run Code Online (Sandbox Code Playgroud)
并不意味着你的想法.它被解析为true -> false ; true:
?- ((true -> false) ; true) =.. Expr.
Expr = [;, (true->false), true].
?- (true -> false ; true) =.. Expr.
Expr = [;, (true->false), true].
Run Code Online (Sandbox Code Playgroud)
所以它失败了,因为它意味着"如果true那么false其他true",即false.