Prolog箭头运算符
据我所知,“是”/“否”结果告诉用户查询是否成功。查询在谓词Prolog箭头运算符,prolog,logic,Prolog,Logic,据我所知,“是”/“否”结果告诉用户查询是否成功。查询在谓词true上总是成功的,而在false上总是失败的 自/2表示或(可交换)前两个查询应相等(均成功) 在谓词逻辑中,公式(true->false)和false计算为false,因此最后两个查询应该是等价的 因此:第二个查询似乎与理论逻辑不一致 我的推理有错误吗?我觉得我没有理解一些基本的东西。序言中的箭头与一阶逻辑中的实质含义不符。它是一个三元“if-then-else”运算符,带有可选选项。因为它是用Prolog语法实现的 | ?- t
true
上总是成功的,而在false
上总是失败的
(true->false)
和false
计算为false,因此最后两个查询应该是等价的我的推理有错误吗?我觉得我没有理解一些基本的东西。序言中的箭头与一阶逻辑中的实质含义不符。它是一个三元“if-then-else”运算符,带有可选选项。因为它是用Prolog语法实现的
| ?- true ; (true->false)
yes
| ?- (true->false) ; true.
no
| ?- false ; true.
yes
并不意味着你认为它能做什么。它被解析为true->false;正确
:
(true -> false) ; true
所以它失败了,因为它意味着“如果
true
那么false
否则true
”,也就是说false
,这是一个非常好的问题
为了详细说明@larsmans的答案,->/2
谓词在与组合时充当if-then-else
/2
谓词。就其本身而言,它只是if-then
查看if-then-else
结构,以下内容中给出了描述:
->/2
经常与组合/2
定义一个if-then els
e如下:Goal1->Goal2;Goal3.
注意,Goal1->Goal2
是第一个参数
(;)/2和Goal3(else部分)的第二个参数。这样的
if-then-else
控件构造首先为
else部分(直观地与;/2
)关联),然后执行目标1
。
如果[在Goal1
]中]成功,则由Goal1
创建的所有选择点与
删除else零件的选择点并执行Goal2。
如果目标1失败,则执行目标3
在这种情况下,我们有:
?- ((true -> false) ; true) =.. Expr.
Expr = [;, (true->false), true].
?- (true -> false ; true) =.. Expr.
Expr = [;, (true->false), true].
第一个true
是Goal1
,它成功了。一旦发生这种情况,根据谓词行为的描述,将删除引导您到第二个true
语句(Goal3
)的选择点。因此,当遇到false
时,会出现故障,并且不会回溯到第二个true
,整个查询都会失败
但是,如果您做了如下操作:
(true -> false) ; true
在第一个foo
子句失败后有一个选择点,因此您得到:
foo :-
true -> false.
foo :-
true
我认为混淆源于比较
false;带(真->假)的true
;正确
。与(true->false)更相似的表达式;正确的
是:
| ?- foo.
yes.
由于
的原因,它也将计算为false
代码>工作。代码>在第一个子句失败时提供一个选择点。但是,如果第一个子句有一个切分并删除了选择点,那么它将不会被接受,整个查询将失败。你的意思是说“如果true
那么false
否则true
”?@octavian:嗯,是的。修正了这个问题。表达式不能被视为;(>(真、假)、真)
?在这种情况下,如何“删除else部分的选择点[…]”,因为“->/2”是“”/2',所以它不应该改变它的定义?@octavian,如果你拿的类似例子来说,实际上它是一致的;((真、!、假)、假)
。该查询将返回false
,因为即使第一个表达式是false
,选择点也已被切掉。我对我的回答作了进一步的解释。这确实是一个难得的好问题和有趣的问题我只想补充一点,省略假选项是很自然的((true->false;false);true.
),这个问题表明在序言中我们应该非常小心。@octavian我的答案令人满意吗?
(true, !, false) ; true