Prolog箭头操作员

oct*_*ian 8 logic prolog

| ?- true ; (true->false)
yes
| ?- (true->false) ; true.
no
| ?- false ; true.
yes
Run Code Online (Sandbox Code Playgroud)

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

  1. 因为;/2意味着OR(可交换)前两个查询应该是等价的(都是成功的)

  2. 在预测逻辑中公式(true->false)false评估为FALSE,因此最后两个查询应该是等价的

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

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

lur*_*ker 9

这个问题问得好.

为了详细说明@ 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. 如果[of Goal1] 成功,Goal1将删除else部分的选择点一起创建的所有选择点,并执行Goal2.如果Goal1失败,则执行Goal3.

在这种情况下,我们有:

(true -> false) ; true
Run Code Online (Sandbox Code Playgroud)

第一个trueGoal1成功的.一旦发生这种情况,根据谓词行为的描述,将导致您进入第二个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并且消除了选择点,那么它将不被采用并且查询总体上失败.


Fre*_*Foo 6

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.