为了确定动物是斗牛犬,我有以下谓词:
bulldog(X):-
body(X,muscular),
weight(X,heavy),
face(X,wrinkled),
nose(X,pushed-in).
如果我有一只狗,称他为“fifi”,并提供以下事实:
body(fifi,muscular).
weight(fifi,heavy).
face(fifi,wrinkled).
nose(fifi,pushed-in).
当我输入以下声明时:
bulldog(fifi).
它将返回true。
现在让我说我有另一个斗牛犬“fofo”并遵循谓词:
bulldog(fofo).
当我问一些像
这样的东西时body(fofo,muscular). / weight(fofo,heavy).
然后它将返回false。我能做些什么才能让Prolog认识到斗牛犬的特征,并回归真实?
答案 0 :(得分:1)
您必须向知识库添加有关fofo
的额外事实。 Prolog提出closed-world assumption,意味着程序中列出的事实/规则无法证明的任何内容都是假的。
答案 1 :(得分:1)
你所写的东西是斗牛犬,如果它是肌肉发达的,沉重的,皱纹的和推入的,但如果它是牛头犬那么就没那么那么它就会变得肌肉发达,沉重,皱起来。
要做到这一点你可以写:
body(X,muscular):-
bulldog(X).
等...
但是,如果你有:
body(X,muscular):-
bulldog(X).
bulldog(X):-
body(X,muscular),
....
你将陷入无限循环。 您可以使用不同的谓词名称来解决它:
body(X,muscular):-
bulldog(X).
is_bulldog(X):-
body(X,muscular),
....
或以某种方式检测循环并停止它(某些prolog版本,如XSB支持制表)