我是prolog的新手,我编写了这段代码,假定该代码返回列表的所有子列表而没有其中的某些成员。
contained(X, Y) :-
member(M, Y).
select(M, Y, X).
我键入的查询是:
contained(X, [1,2]) .
预期结果是:
[1],
[2]
我得到的结果是:
true,
true
我想念什么?
答案 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)
的谓词,该谓词对于M
,Y
和X
。
您可以在此处用逗号(.
)替换,
:
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).