Prolog继承规则

时间:2011-12-12 15:22:06

标签: prolog

为了确定动物是斗牛犬,我有以下谓词:

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认识到斗牛犬的特征,并回归真实?

2 个答案:

答案 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支持制表)