2016-03-17 74 views
0

我是Prolog的新手。是否有可能在Prolog中「聲明」一個列表爲事實,然後輕鬆訪問?我正在研究家庭樹型問題。首先,我想宣佈一羣男性屬於男性名單。然後我希望能夠查詢某個人是否是男性。這裏是我到目前爲止已經編寫的代碼:在Prolog中聲明和搜索列表的正確方法?

% ------------------------------------------------------------------------- % 
% Facts: 

males([john, joseph, aaron, peter, paul, mark, ben, adam, daniel]). 


% ------------------------------------------------------------------------- % 
% Rules: 

% Member of a List 
member(X, [X|_]). 
member(X, [_|T]) :- member(X, T). 

male(X) :- member(X, males). 

然而,未如預期我的輸出:

21 ?- male(john). 

假。

我知道我的()成員規則工作,因爲我可以產生如下結果:

23 ?- member(john, [peter, paul, john]). 

真正

任何人都可以點我在正確的方向?先謝謝你。

+0

這不是Prolog的工作方式。 'males'不是返回列表的函數。這是一個事實,你聲明,並且需要被查詢:'男性(X).'查詢將返回'X = [約翰,約瑟夫,亞倫,彼得,保羅,馬克,本,亞當,丹尼爾]'。但請參閱鮑里斯的回答,以更正確地說明這些事實。 – lurker

回答

0

我不是在序言的專家,但我知道解決這個(可能不是唯一的一個)

男性(X): - 男性(Y),會員(X,Y)

我的理解是謂詞不返回變量,它們賦值給給定的參數,所以Y現在被分配了男性陣列,現在你可以在Y中尋找X

+0

感謝您澄清謂詞如何工作。那是我的問題。當然,你的解決方案是有效的。謝謝! – ArtVandelay

1

通常的適當的在Prolog中這樣做的方法是將您的列表聲明爲事實表:

male(john). 
male(joseph). 
% etc 

如果你不喜歡這樣,你已經確定你的male/1並可以查詢它要麼是這樣的:

?- male(joseph). 
true. 

或者這樣:

?- male(M). 
M = john ; 
M = joseph ; 
% etc 

您可以通過閱讀與Prolog的開始通過first chapter of "Learn Prolog Now!"。它的第一個例子與你的問題完全一樣。

相關問題