在prolog中定义is_a谓词?

Mαz*_*zen 3 inheritance predicate prolog

我正在尝试is_a/2在Prolog中定义继承检查谓词,但到目前为止我的所有试验都失败了.

is_a(X, Y)每当Y是X例如的超谓语应返回true:

object(bare).
object(mammal).
object(animal).
object(bird).
is_a(bare, mammal).
is_a(mammal, animal).
is_a(bird, animal).
is_a(X, Y):- <definition goes here>.
Run Code Online (Sandbox Code Playgroud)

定义应该使得以下查询将返回true:

?- is_a(bare, animal).
true.
Run Code Online (Sandbox Code Playgroud)

我尝试以明显的方式定义它,但我陷入无限循环:

is_a(X, Y):- X\==Y, object(X), object(Y), object(Z), is_a(X, Z), is_a(Z, Y).
Run Code Online (Sandbox Code Playgroud)

有什么建议?

3le*_*gos 5

避免无限循环的一种方法是添加一个谓词,它显示"直接"继承(不可传递),即direct/2.然后你可以这样写:

object(bare).
object(mammal).
object(animal).
object(bird).

direct(bare, mammal).
direct(mammal, animal).
direct(bird, animal).

isa(X, Y) :- object(X), object(Y), direct(X, Y).
isa(X, Y) :- object(X), object(Y), object(Z), direct(X, Z), isa(Z, Y).
Run Code Online (Sandbox Code Playgroud)

然后你得到:

?- findall(X, isa(X, animal), L).
   L = [mammal,bird,bare] ? ;
   no
Run Code Online (Sandbox Code Playgroud)

我不确定这究竟是你要求的.