定义事实的传递关系

Define a transitive relation over facts

我是 Prolog 的新手,正在努力学习它。 我想实现类似 a>bb>c 然后 a>c 的传递关系。

我有一套如下规则。

bigger(elephant,horse).
bigger(horse,ant).
bigger(ant, bacteria).
bigger(bacteria,virus).

我们知道大象比病毒大。我想要实现的是,当我使用 smaller(ant,elephant) 时,它应该 return true。我尝试使用的规则 smaller(X,Y)

smaller(Y,X) :-
    bigger(X,Z),
   (bigger(Z,Y);
    Z=Y).

您或许可以使用big_fact/2来描述数据库:

big_fact(elephant,horse).
big_fact(horse,ant).
big_fact(ant, bacteria).
big_fact(bacteria,virus).

那么你可以使用bigger/2作为传递闭包:

bigger(X,Y) :-
    big_fact(X,Y).
bigger(X,Z) :-
    big_fact(X,Y),
    bigger(Y,Z).

如果你在 中 运行 这个,它会生成:

?- bigger(X,Y).
X = elephant,
Y = horse ;
X = horse,
Y = ant ;
X = ant,
Y = bacteria ;
X = bacteria,
Y = virus ;
X = elephant,
Y = ant ;
X = elephant,
Y = bacteria ;
X = elephant,
Y = virus ;
X = horse,
Y = bacteria ;
X = horse,
Y = virus ;
X = ant,
Y = virus ;
false.

?- bigger(virus,Y).
false.

?- bigger(ant,Y).
Y = bacteria ;
Y = virus ;
false.

?- bigger(X,horse).
X = elephant ;
false.

?- bigger(X,bacteria).
X = ant ;
X = elephant ;
X = horse ;
false.

?- bigger(elephant,bacteria).
true ;
false.

所以它是一个传递闭包

然后您可以通过 bigger/2:

定义 smaller/2
smaller(X,Y) :-
    bigger(Y,X).