我是Prolog的新手,并试图学习它。
我希望实现像a>b
和b>c
然后a>c
这样的传递关系。
我有一套以下规则。
bigger(elephant,horse).
bigger(horse,ant).
bigger(ant, bacteria).
bigger(bacteria,virus).
我们知道大象比病毒大。我想要实现的是,当我使用smaller(ant,elephant)
时,它应该返回true
。我尝试使用的规则smaller(X,Y)
是
smaller(Y,X) :-
bigger(X,Z),
(bigger(Z,Y);
Z=Y).
答案 0 :(得分:2)
您可以使用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).