2012-12-19 103 views
2

我有這個簡單的程序來檢查,如果一個X元素屬於列表:如何判斷一個元素是否屬於Prolog中的一個列表?

member2(X, [X|_]). 
member2(X,[_|T]):- member2(X,T). 

我試圖寫它的擴展形式(因爲在以前的方式行爲是不太清楚)。所以我把它以下列方式寫:

member2(X, [X|_]). 
member2(X,Y):- Y = [_|T], 
       member2(X,T). 

因此意義更加清晰:

我已經一個事實,即代表基本情況(在X元素屬於列表中,如果它是在名單的頭)。

規則說,我要證明兩兩件事:

1)Y = [_|T]。這是真實的,因爲匿名變量_與任何事物相統一。

2)遞歸搜索元件X在尾部列表。

好吧,我想我的推理是正確的,但該計劃的第二個版本不工作!我想,也許這個問題可能在Y = [_|T]部分

+1

這個程序似乎對我在SWI-PL上的預期工作,究竟是哪裏出了問題?你是否收到錯誤信息? – sharky

回答

1

你的程序是好的,在這兩種形式。這裏還有另外一種方法來重寫它

member2(X, [Y|Ys]) :- 
    X = Y ; member2(X, Ys). 
+0

Okkk ...謝謝...只有一件事...在這個例子中X被統一爲Y ...所以這意味着X變量包含[Y | Ys]列表的首字符? – AndreaNobili

+0

是的,但尾巴被忽略(在第一個選擇) – CapelliC

+0

Tnx ...我今天又發佈了另一個問題...我瘋了...如果你能幫助我... – AndreaNobili

0

我猜爲成員檢查教科書例子:

member_check(X, [X|Tail]). % or [X|_] to avoid the warning 
member_check(X, [Y|Tail]) :- X \= Y, member_check(X, Tail). 

這將可能比你的第二次嘗試更清晰?

相關問題