您也许可以使用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).
如果你在swi-prolog中运行它,它会生成:
?- 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.
所以它是一个传递闭包。
然后,您可以smaller/2
通过以下方式定义bigger/2
:
smaller(X,Y) :-
bigger(Y,X).