2

我是 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).
4

1 回答 1

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).
于 2015-12-18T18:03:20.450 回答