Prolog继承规则

Prolog继承规则,prolog,Prolog,要确定动物是斗牛犬,我有以下谓词: bulldog(X):- body(X,muscular), weight(X,heavy), face(X,wrinkled), nose(X,pushed-in). 如果我有一条狗,就叫它“菲菲”,并告诉我以下事实: body(fifi,muscular). weight(fifi,heavy). face(fifi,wrinkled). nose(fifi,pushed-in). 当我输入以下语句时: bulldog(

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

bulldog(X):-
    body(X,muscular),
    weight(X,heavy),
    face(X,wrinkled),
    nose(X,pushed-in).
如果我有一条狗,就叫它“菲菲”,并告诉我以下事实:

body(fifi,muscular).
weight(fifi,heavy).
face(fifi,wrinkled).
nose(fifi,pushed-in).
当我输入以下语句时:

bulldog(fifi).
它会变成现实

现在让我们假设我有另一个斗牛犬“fofo”和以下谓词:

bulldog(fofo).
当我问这样的问题时

body(fofo,muscular). / weight(fofo,heavy).

然后它将返回false。如何让Prolog识别牛头犬的特征并返回true?

您必须在知识库中添加关于
fofofo
的额外事实。Prolog做了一个,这意味着任何不能从程序中列出的事实/规则中证明的东西都是假的。

你写的是,如果某个东西是肌肉发达的、沉重的、皱巴巴的、被推入的,那么它就是一只牛头犬,但不是,如果某个东西是一只牛头犬,那么它就是肌肉发达的、沉重的、被推入时皱巴巴的

要做到这一点,你可以写:

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支持tabling)