2015-12-18 34 views
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

參見[標籤:傳遞閉合],具體的[定義](http://stackoverflow.com/q/26946133/1613573) 。 – mat

+0

@lurker正在工作,因爲它是第二條規則,不適用於'較小(病毒,大象)' – Harwee

+1

正如@mat指出的那樣,您需要傳遞閉包。所以如果你把它分成兩個子句,你會有:更小(X,Y): - 更大(Y,X)。和更小(X,Y): - 更大(Z,X) Z,Y)。' – lurker

回答

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/2bigger/2

smaller(X,Y) :- 
    bigger(Y,X).