Prolog子句体含否定式时顺序调换致结果不同的技术咨询
Prolog否定式子句位置影响结果的原因
先看你给出的示例代码:
married(john). male(john). male(kev). bachelor1(X) :- \+ married(X), male(X). bachelor2(X) :- male(X), \+ married(X).
两者执行结果不同的核心原因,在于Prolog的\+(否定失败)是基于变量绑定状态工作的,它不是纯逻辑上的全称否定,而是“当无法证明当前目标为真时,判定否定目标为真”。
为什么bachelor1(X).找不到结果?
执行bachelor1(X)时,先处理\+ married(X),此时X是完全未绑定的变量。Prolog会尝试寻找能让married(X)成立的解,发现married(john)存在,所以\+ married(X)直接判定为假,整个子句失败,根本不会执行后面的male(X),自然找不到任何符合条件的X。
为什么bachelor2(X).能找到kev?
执行bachelor2(X)时,先处理male(X):
- 首先X被绑定到john,接着检查
\+ married(john)——因为married(john)是已定义的事实,能被证明为真,所以否定判定为假,触发回溯; - 回溯后X被绑定到kev,再检查
\+ married(kev)——由于没有married(kev)这个事实,无法证明它为真,所以否定判定为真,最终返回X=kev。
简单来说,先绑定变量再做否定,是针对具体值做判断;先做否定再绑定变量,否定会先尝试所有可能的绑定,只要存在一个能让原目标为真的绑定,否定就会失败。
内容的提问来源于stack exchange,提问作者user27739063
相关产品推荐
相关产品推荐

