2012-04-20 73 views
1

我想在我的prolog程序中編寫一個規則來確定某人是否是別人的兄弟。Prolog程序存在異常

例如,如果我鍵入brother_of(chris,X),它將返回christy,因爲chris是christy的兄弟。但是,當我輸入這個時,我得到一個存在異常。我已經包括了一些事實來涵蓋一切,但也許這是我的規則定義中的一個問題?代碼如下。

/* Facts */ 
female(ella). 
female(jodi). 
female(sonya). 
female(jane). 
female(christy). 
female(mary). 
male(arnold). 
male(chris). 
male(louis). 
male(mark). 
father(arnold). 
father(louis). 
father(mark). 
mother(ella). 
mother(jodi). 
mother(jane). 
mother(mary). 
father_of(arnold, chris). /* arnold is the father of chris */ 
father_of(arnold, christy). 
father_of(louis, mark). 
father_of(mark, arnold). 
mother_of(mary, chris). 
mother_of(mary, christy).   
mother_of(jane, arnold).  
mother_of(ella, sonya). 
mother_of(jodi, ella). 
mother_of(jodi, mark). 

/* Rules */ 

brother_of(X, Y) :- 
    male(X), 
    ((father_of(Z, X), father_of(Z, Y)); 
    (mother_of(W, X), mother_of(W, Y))), 
    X =\= Y. 

回答

1

操作=\=在算術僅使用(AFAIK),以查看是否兩個術語是不同的(非unifiable)使用操作員\=

X \= Y. 

更新:簡要介紹cut!)目標:當裁剪用在謂詞中時,意味着除了已經找到的答案之外,不應該搜索更多的答案(即,您正在搜索樹中「剪切剩餘的分支」)。例如:在達到切割

first_child(X,Y) :- 
    father_of(X,Y), !. 

?- first_child(arnold,Y). 

Y = chris ; 

no 

後,所有的選擇要點以前切被丟棄(但新的能後,系統會創建)。在你的例子中,你知道如果X和Y有同一個父親,那麼他們是否也有同樣的母親是無關緊要的。所以,你可以將切「共同父」部分成功後右:

brother_of(X, Y) :- 
    male(X), 
    ((father_of(Z, X), father_of(Z, Y), X \= Y, !); # If cut is reached, will not run the next line 
    (mother_of(W, X), mother_of(W, Y), X \= Y)). 

不過請注意,使用切有許多陷阱(請參閱「綠色切割」與「紅切」鏈接的維基百科文章)但在這裏描述太多了。 (注意我如何重複X \= Y - 如果我沒有這樣做,程序有時會失敗)

最後,我還想指出,使用;往往是不鼓勵在編寫Prolog代碼時(您可以在需要時使用雖然)。相反,它寫在兩個子句:

brother_of(X, Y) :- 
    male(X), 
    father_of(Z, X), 
    father_of(Z, Y), 
    X \= Y, 
    !. 
brother_of(X, Y) :- 
    male(X), 
    mother_of(W, X), 
    mother_of(W, Y), 
    X \= Y. 

(這; VS兩個子句是有點主觀的,雖然如此,我不會說太多關於它...只知道兩種方式都是可能的,並會產生相同的結果)

+0

工作,謝謝!但是,現在當我問兄弟_(克里斯,X)時,它會再次返回克里斯蒂。克里斯蒂第一次返回後,我輸入「;」以確保沒有更多,不應該這樣它應該返回「否」,但它再次返回christy。任何想法爲什麼? – aclark 2012-04-20 03:18:21

+0

您需要[cut](http://en.wikipedia.org/wiki/Cut_%28logic_programming%29)目標:'!'。問我是否需要關於如何使用它的幫助(不知道你是否已經在你的研究中看到它) – mgibsonbr 2012-04-20 03:31:45

+0

實際上我沒有看到它。我如何使用它? – aclark 2012-04-20 03:37:19