定义事实的传递关系

时间:2015-12-18 17:35:01

标签: prolog transitive-closure

我是Prolog的新手,并试图学习它。 我希望实现像a>bb>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).

1 个答案:

答案 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).

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

?- 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).