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).