2013-03-30 43 views
0

這是使用Prolog的我的第一次,我想知道是否有人能夠給我一些建議。我的邏輯:Prolog的父母關係規則

male(jerry). 
male(stuart). 
male(warren). 
male(peter). 
female(kather). 
female(maryalice). 
female(ann). 
brother(jerry,stuart). 
brother(jerry,kather). 
brother(peter, warren). 
sister(ann, maryalice). 
sister(kather,jerry). 
parent_of(warren,jerry). 
parent_of(maryalice,jerry). 

這是一個家庭作業的一部分,我們只能使用上述事實。爲了知道沃倫和瑪麗愛麗絲也是斯圖爾特和凱瑟的父母,需要實施一些規則。我所做的是:

parent_of(X,Y) :- brother(Z,Y), parent_of(X,Z). 
parent_of(X,Y) :- brother(Y,Z), parent_of(X,Z). 
parent_of(X,Y) :- sister(Z,Y), parent_of(X,Z). 
parent_of(X,Y) :- sister(Y,Z), parent_of(X,Z). 

查詢parent_of(X,Y)在序言中使用上述規則和事實都讓我與X =沃倫,Y =斯圖爾特和X的遞歸值無限循環= maryalice,Y =斯圖爾特。

任何意見將不勝感激。謝謝!

回答

0

如果您從互動提示嘗試了您的查詢,您會發現它的工作原理。我可能會重寫它爲:

?- parent_of(P,C), 
    ((sister(C,OC) ; sister(OC,C)) 
    ; (brother(C,OC) ; brother(OC,C)) 
    ). 

但它確實無所謂。

最簡單的解決方案是使用精確的定義來定義一個謂詞,因爲這個查詢不會調用它,因爲您正在引入一個遞歸調用,並且不會以任何方式終止。所以呢稱它可能是also_parent_of

此外,您的數據庫中有冗餘的事實:brother(jerry,kather)sister(kather,jerry)。我不知道這是否有意,但使用此查詢,您將得到兩次答案P=warren, C=jerry, OC=kather

+0

非常感謝您的幫助!如果可以,我會使用不同的查詢,但我特別要求查詢parent_of .. – arkanitez