我有这些定义:
memberx(X, [X|_]).
memberx(X, [_|T]) :- memberx(X, T).
intersectionx([], _, []).
intersectionx([H|T], Y, [_|Z]) :- memberx(H, Y), !, intersectionx(T, Y, Z).
intersectionx([_|T], Y, Z) :- intersectionx(T, Y, Z).
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
?- intersectionx([1], [1], Z).
Z = [_G305].
Run Code Online (Sandbox Code Playgroud)
为什么不导致Z = [1]?
Z = [_ G305].
意味着这个答案适用于所有条款.也就是说,Z = [1]不仅如你所愿,而且Z = [2]也是如此.
显然,这不是你所期望的.
那么错误在哪里?检测它的一种简单方法是注意表示_的匿名变量.
考虑:
intersectionx([H|T], Y, [_|Z]) :- memberx(H, Y), !, intersectionx(T, Y, Z).
^^^
Run Code Online (Sandbox Code Playgroud)
您所写的内容意味着以H开头的列表和另一个列表的交集将是(前提是右侧的目标都是真的)一个以任何东西开头的列表......用那个H替换任何东西!