2016-11-20 29 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], [], []).