您或許可以使用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).
參見[標籤:傳遞閉合],具體的[定義](http://stackoverflow.com/q/26946133/1613573) 。 – mat
@lurker正在工作,因爲它是第二條規則,不適用於'較小(病毒,大象)' – Harwee
正如@mat指出的那樣,您需要傳遞閉包。所以如果你把它分成兩個子句,你會有:更小(X,Y): - 更大(Y,X)。和更小(X,Y): - 更大(Z,X) Z,Y)。' – lurker