2017-03-06 42 views
0

我想說,如果他是一個父親,他是一個男性否則是女性序言,性別與if_then_else

father(pedro-i,beatriz(1347)). 
father(pedro-i,joão(1349)). 
father(pedro-i,dinis(1354)). 
father(pedro-i,joão_grão_mestre_da_ordem_de_avis). 
mother(constança(1320),luis). 
mother(constança(1320),maria(1342)). 


% I want to say that if is the father then is male else is a female 

IF_then_else(X,Y,Z) :- father(X,Y),male. 
IF_then_else(X,Y,Z) :- female. 

回答

2

第一一句話:謂詞函子啓動用小寫字母,而不是大寫字母:大寫字母用於變量

您似乎錯過了Prolog 中的謂詞不會返回值。他們只能成功失敗(從這個意義上說,他們「返回」一個布爾值)。提供(非布爾型)輸出的方式是使用統一

在這裏,您可以通過將文字的腦袋像這樣做:

if_then_else(X,Y,male) :- father(X,Y). 
if_then_else(X,Y,female).

但是現在有另一個問題:序言回溯。所以這意味着即使第一個子句成功,它也會嘗試第二個子句。所以pedro-i將是malefemale。您可以通過在第二個子句上放置一個後衛來解決這個問題,該子句說如果Prolog無法證明存在father(X,Y)關係,則子句成功。喜歡的東西:

if_then_else(X,Y,male) :- father(X,Y). 
if_then_else(X,Y,female):- \+ father(X,Y).

但是,這會導致計算量很大的問題:它是可能的,它需要很長的時間來證明,有一個father(X,Y).關係,如果沒有這樣的關係,不能證明這樣將需要更多時間(因爲Prolog需要檢查所有分支)。它甚至可能導致無限循環。在這種情況下,您可以使用剪切!)。如果你達成了裁剪,Prolog將不會嘗試在謂詞的以下子句中找到結果。所以,你可以寫:

if_then_else(X,Y,male) :- father(X,Y), !. 
if_then_else(X,Y,female).

或者您可以使用的Prolog的if-then-else structure和使用明確統一:

if_then_else(X,Y,Z) :- 
    ( father(X,Y) -> Z = male ; Z = female ).