2013-10-14 80 views
4

有誰能告訴我爲什麼我的阿姨關係不工作?只要我試圖調用它,它就會返回false。Prolog家庭關係,意外的失敗

我在它下面寫的叔叔關係似乎很完美。我無法弄清楚有什麼不同。我試了(不是(母親(X,Y))。在最後,但也不會改變任何東西。

/* FACTS */ 
parents(david, george, noreen). 
parents(jennifer, george, noreen). 
parents(georgejr, george, noreen). 
parents(scott, george, noreen). 
parents(joanne, george, noreen). 
parents(jessica, david, edel). 
parents(clara, david, edel). 
parents(michael, david, edel). 
parents(laura, georgejr, susan). 
parents(anna, scott, siobhan). 


/* Relationships */ 
father(X, Y) :- parents(Y, X, _). 
male(X) :- father(X, _). 

mother(X, Y) :- parents(Y, _, X). 
female(X) :- mother(X, _). 

grandfather(X, Y) :- father(X, Z), father(Z, Y). 
grandfather(X, Y) :- father(X, Z), mother(Z, Y). 

grandmother(X, Y) :- mother(X, Z), mother(Z, Y). 
grandmother(X, Y) :- mother(X, Z), father(Z, Y). 

brother(X, Y) :- male(X), father(Z, X), father(Z, Y). 

sister(X, Y) :- female(X), father(Z, X), father(Z, Y). 

aunt(X,Y) :- sister(X,Z), parents(Y, Z, _). 
aunt(X,Y) :- sister(X,Z), parents(Y, _, Z). 

uncle(X, Y) :- brother(X, Z), parents(Y, Z, _), not(father(X,Y)). 
uncle(X, Y) :- brother(X, Z), parents(Y, _, Z), not(father(X,Y)). 

回答

1

你引入大量的冗餘和至少陌生的檢查機制。

fathermother關係意味着您指定的parents/3關係,parents(child,father,morther),我不明白你爲什麼要定義兩個查詢。

什麼不順心的是,弟弟和妹妹的關係將在brother(X,X)成功。人們可以用避免這種X \= X,這是b原則上你在阿姨條款中解決了什麼問題。

此外,您需要提供其他信息。 malefemale關係只有在人(X)有子女時才能解決。然而,如果你自己沒有孩子,那麼可以成爲阿姨或叔叔。

這應該工作:

/* FACTS */ 

parents(david, george, noreen). 
parents(jennifer, george, noreen). 
parents(georgejr, george, noreen). 
parents(scott, george, noreen). 
parents(joanne, george, noreen). 
parents(jessica, david, edel). 
parents(clara, david, edel). 
parents(michael, david, edel). 
parents(laura, georgejr, susan). 
parents(anna, scott, siobhan). 


/* Relationships */ 

parent(X,Y) :- parents(Y,X,_). 
parent(X,Y) :- parents(Y,_,X). 

father(X, Y) :- parents(Y, X, _). 

male(michael). 
male(X) :- father(X, _). 

mother(X, Y) :- parents(Y, _, X). 

female(joanne). 
female(jessica). 
female(jennifer). 
female(clara). 
female(laura). 
female(anna). 
female(X) :- mother(X, _). 

grandfather(X, Y) :- father(X, Z), father(Z, Y). 
grandfather(X, Y) :- father(X, Z), mother(Z, Y). 

grandmother(X, Y) :- mother(X, Z), mother(Z, Y). 
grandmother(X, Y) :- mother(X, Z), father(Z, Y). 

brother(X, Y) :- male(X), father(Z, X), father(Z, Y), X \= Y. 

sister(X, Y) :- female(X), father(Z, X), father(Z, Y), X \= Y. 

aunt(X,Y) :- sister(X,Z), parent(Z,Y). 

uncle(X, Y) :- brother(X, Z), parent(Z,Y). 
+0

我從講師欄中獲得了上述所有代碼中的阿姨/叔叔關係。你能告訴我我需要改變什麼嗎?我對prolog非常陌生,相當迷茫。 – Danny

+0

請稍等,我正在進行一些測試(沒有冒犯)。我現在也在編輯答案(我想提供一些基本信息)。 –

+0

感謝您抽出時間。 – Danny

3

簡短的回答是,一個uncle工作(那種)和aunt不會因爲你的malefemale的定義是有缺陷的:它不認人男性或女性,除非他們有孩子。在你的事實中,沒有女性(按名稱判斷)誰會有孩子並且有一個有孩子的兄弟姐妹。這也是出於同樣的原因,scott不應該出現在叔叔的名單中。

修復這個很簡單:你既可以

  1. 下降來推斷的性別,並說明性別,而不是規則,或
  2. son/daughter事實+ parents規則取代parents事實,並推斷性別來自某人是某人的女兒的事實。
+0

嗯,我理解你的解決方案。正如我已經提到的,我的講師給了我所有的代碼,並被告知寫一個阿姨,叔叔和表弟的規則。是否有任何方法可以按照規則/事實進行操作?還是我從一開始就提供了有缺陷的代碼? – Danny

+0

@DannyWalsh爲了知道某人是別人的阿姨,你需要知道這是一位父母的女性兄弟姐妹,或者是父母之一的男性兄弟姐妹的配偶。從你提出的集合來看,告訴別人性別的唯一方法就是等待他們生個孩子,並且看到他們最終結束的父母關係的哪一方。沒有介紹新的事實,我不知道如何解決這個問題。這裏是第一種方法的演示([link](http://ideone.com/zkkjIk))。 – dasblinkenlight

3

你在問爲什麼aunt(A,P)沒有任何解決方案。換句話說,

有沒有阿姨。

這是一個系統的方式來使用程序切片來定位問題。由於與aunt/2相關的程序是純粹的單調程序,因此我們可以非常系統地定位問題。

您的問題是這樣的:您的目標aunt(A,P)太專門化了。我們現在嘗試推廣它。但只要目標仍然失敗。以這種方式,我們將獲得仍然失敗的最大泛化。因此,問題必須在其餘部分的某個地方。

首先,讓我在你的程序介紹如下定義:

:- op(950,fx, *). 

*_. 

這允許「註釋掉」一個目標前綴*。以這種方式,我們將推廣您的計劃。讓我們試試這個與阿姨的定義。也就是說,在目標前插入*,重新加載示例並查看它是否仍然失敗。以下是它的最大泛化:

aunt(X,Y) :- sister(X,Z), *parents(Y, Z, _). 
aunt(X,Y) :- sister(X,Z), *parents(Y, _, Z).

即使這種泛化失敗!換句話說,也是sister/2總是失敗。

沒有姐妹。

sister(X, Y) :- female(X), father(Z, X), *father(Z, Y).

即使上面的失敗!

有沒有父親的女性。

您可以堅持這一點,或者繼續,通過用目標的定義代替目標。

sister(X, Y) :- mother(X,_), parents(X, Z, _), *father(Z, Y).

多了一個:

sister(X, Y) :- parents(_,_,X), parents(X, Z, _), *father(Z, Y).

因此,只有母親可能是姐妹,這當然是有點過分的限制的。