定义事实的传递关系
Define a transitive relation over facts
我是 Prolog 的新手,正在努力学习它。
我想实现类似 a>b
和 b>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).
如果你在 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.
所以它是一个传递闭包。
然后您可以通过 bigger/2
:
定义 smaller/2
smaller(X,Y) :-
bigger(Y,X).
我是 Prolog 的新手,正在努力学习它。
我想实现类似 a>b
和 b>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).
如果你在 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.
所以它是一个传递闭包。
然后您可以通过 bigger/2
:
smaller/2
smaller(X,Y) :-
bigger(Y,X).