2016-11-20 31 views
0

我想寫一個Prolog代碼,但我無法得到這個返回true。我試圖找到一個列表,所有元素都包含在另外兩個列表中。例如,所有列表A元素都可以在B和C列表中找到,而不是在一起。 我的Prolog代碼:爲什麼prolog中的這一行返回false?

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

first([H0|T0], [H0|T1], A) :- 
    member(H0, A), 
    first(T0, [H0|T1], A). 
first([H0|T0], [_|T1], A) :- 
    first([H0|T0], T1, A). 

其中一個元素是否在一個列表成員謂詞返回true。使用predicate'first'我試圖使用成員謂詞在C列表中查找A和B的匹配元素。如果我找到了,然後在第一個列表中進一步比較它的第一個元素和第二個列表元素,再次,如果我匹配,我檢查是否可以在第三個列表中找到它。我希望它這樣做,但是當我跑

?- first([4, 6, 4], [4, 5, 6, 4], [1, 2, 4, 6]). 

它給出了錯誤,我不明白爲什麼。這在某個地方似乎是一個簡單的注意錯誤,但我無法讓自己頭腦發熱。

+0

你似乎缺乏空列出了基本情況。 –

回答

1

我不知道任何有關prolog,但像我之前被邏輯錯誤咬過的每個人。 (=

正如我評論,你似乎缺少基本情況爲first([], _, _)一個例子:

first([4], [4], [4]) :- 
    member(4, [4]), // quite true 
    first([], [4], [4]). // No matching rule, as all those assume an existing head in the first argument 
+0

是的,這是我的錯誤,謝謝!解決了 – Oskars

0

我不知道我理解你的問題,但讓我嘗試到指定更多的謂詞第一/ 3

first(+L, +L1, +L2) 
    succeeds if every element of L is found either in L1 or in L2. 

如果這是你要找的是什麼,然後:

first([], _, _). 
first([E|L], L1, L2) :- 
    (member(E, L1); member(E, L2)), 
    first(L, L1, L2). 
成功個

例子:

first([1, 2, 3], [1, 2, 3], [1, 2]). 
first([1], [1, 2, 3], [1, 2]). 
first([1, 2, 3], [1, 2, 3], []). 

faiure的例子:

first([1, 2, 3, 5], [1, 2, 3], [1, 2]). 
first([7], [1, 2, 3], [1, 2]). 
first([1, 2, 3], [], []).