Prolog-从列表中删除成员

时间:2019-06-12 20:25:20

标签: prolog

我是prolog的新手,我编写了这段代码,假定该代码返回列表的所有子列表而没有其中的某些成员。

contained(X, Y) :-
member(M, Y).
select(M, Y, X).

我键入的查询是:

contained(X, [1,2]) .

预期结果是:

[1],
[2]

我得到的结果是:

true,
true

我想念什么?

1 个答案:

答案 0 :(得分:1)

您犯的错误是,您在.的末尾写了一个点( member(M, Y) )。这意味着Prolog认为您写过:

contained(X, Y) :-
    member(M, Y).  %% notice the dot (.) here
select(M, Y, X).

因此,您在此处将contained(X, Y)定义为member(M, Y),此外,您实现了一个名为select(M, Y, X)的谓词,该谓词对于MYX

您可以在此处用逗号(.)替换,

contained(X, Y) :-
    member(M, Y),
    select(M, Y, X).

话虽这么说,您在这里不需要member/2。实际上,通过使用成员,如果列表包含重复的值,将导致多次产生相同的列表。

您只需在此处将select/3 [swi-doc]与通配符(_)一起使用即可删除:

contained(X, Y) :-
    select(_, Y, X).

或者我们可以使用显式递归:

contained(T, [_|T]).
contained([H|T1], [H|T2]) :-
    contained(T1, T2).