Prolog 语句之间的序言差异

Prolog 语句之间的序言差异,prolog,Prolog,有人能给我解释一下为什么是: notmarried(P) :- \+(married(P)), male(P). 不同的是: notmarried(P) :- male(P), \+(married(P)). 好问题 答案与逻辑纯度有关:在Prolog中,否定被实现为否定即失败。一般来说,目标\+G说明此时G无法证明——并不是说G在逻辑上是错误的 因此,您编写的连词可能不是可交换的。主题是prolog中的变量可以绑定到某个值(X=foo)或未绑定(尚未知道值) 现在,假设以下事实: mar

有人能给我解释一下为什么是:

notmarried(P) :- \+(married(P)), male(P). 
不同的是:

notmarried(P) :- male(P), \+(married(P)).
好问题

答案与逻辑纯度有关:在Prolog中,否定被实现为否定即失败。一般来说,目标
\+G
说明此时
G
无法证明——并不是说
G
在逻辑上是错误的


因此,您编写的连词可能不是可交换的。

主题是prolog中的变量可以绑定到某个值(X=foo)或未绑定(尚未知道值)

现在,假设以下事实:

married(tom).
married(john).
在“未结婚”之后必须做什么

?

p可以是除“tom”或“john”之外的任何值。但prolog无法将这一事实存储在“P”中(基本语句除外)。所以,“未结婚”的结果是“是的,有可能有一些人未结婚”和P未绑定。在P未绑定的情况下,male(P)取第一个male,我们得到了第一个答案

现在,第二个查询:

male(P), \+married(P).

在male之后,prolog将p绑定到其中一个male。现在,它将检查这个男性是否已婚,回答是/否。如果不是,它将回溯到另一个雄性,依此类推。

\+/1
通常只有在其参数为地面时才是正确的。例如:
?-\+married(P),P=test。
如果有已婚者,无论是否
?-married(test)都会失败。
本身成功。相反,
?-P=test,\+已婚(P)。
因此
?-\+已婚(test)。
成功,除非
?-married(test)。
成功。因此,只有当其参数是ground(第二版)时,才最好使用
\+/1
。请记住,“语句”来自命令式编程。Prolog有目标、规则和事实,而不是语句。好的,首先,你能告诉我+\operator的含义吗?这就是否定,对吗?然后,如果我有知识库:男性(马克)。男(汤姆)。已婚(汤姆)我将从这两个陈述中得到相同的答案。因此,我不理解我的书中这个例子的要点。@АаСаСаааааМаааааа。“逻辑错误”和“不可证明(此时)”之间有区别……是的,我现在明白了。
male(P), \+married(P).