2016-11-24 74 views
0

我正在努力解決爲什麼這不起作用。使用SWI-Prolog,我試圖:序言:如何在下一條規則中使用一條規則的答案

  1. 使用people(List)規則從女性(姓名,eee)事實創建女性名字列表(名爲List)。
  2. 使用重複(列表,元)裁定找到人(名單)生成列表中的任何重複的名字

雙方人民和重複規則對自己工作得很好,但是當我嘗試結合他們的程序總是在使用頌歌的情況下返回false,應該返回true。

female(carol,eee). 
female(clare,eee). 
female(mel,eee). 
female(grace,eee). 
female(clare,eee). 
female(carol,eee). 


%% duplicate(List, Element) is true for every matching pair of _Element_ in _List_ 
duplicate([First|Rest], Element) :- 
    duplicate_1(Rest, First, Element). 

% First occurrence 
duplicate_1([This|Rest], X, X) :- % first occurrence 
    duplicate_2(Rest, This, X). 
duplicate_1([This|Rest], _, X) :- % look further for first occurrence 
    duplicate_1(Rest, This, X). 

% Second occurrence 
duplicate_2(_, X, X). % second occurrence 
duplicate_2([This|Rest], _, X) :- % look further for second occurrence 
    duplicate_2(Rest, This, X). 


people(List) :- findall(X, female(X,eee), List). 

我試圖進入終端:

?- people(Y), duplicate(Y, carol). 

任何幫助,將不勝感激!

回答

2

你需要你發現重複後停止遞歸調用:

female(carol,eee). 
female(clare,eee). 
female(mel,eee). 
female(grace,eee). 
female(clare,eee). 
female(carol,eee). 


%% duplicate(List, Element) is true for every matching pair of _Element_ in _List_ 
duplicate([First|Rest], Element) :- 
    duplicate_1(Rest, First, Element). 

% First occurrence 
duplicate_1([This|Rest], X, X) :- % first occurrence 
    duplicate_2(Rest, This, X), !. 
duplicate_1([This|Rest], _, X) :- % look further for first occurrence 
    duplicate_1(Rest, This, X). 

% Second occurrence 
duplicate_2(_, X, X):-!. % second occurrence 
duplicate_2([This|Rest], _, X) :- % look further for second occurrence 
    duplicate_2(Rest, This, X). 


people(List) :- findall(X, female(X,eee), List). 

閱讀有關cut(!)。