我有这些定义:
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).
我得到以下结果:
?- intersectionx([1], [1], Z).
Z = [_G305].
为什么不导致Z = [1] ??
答案 0 :(得分:5)
Z = [_ G305]。
意味着所有条款的答案都是正确的。也就是说,事实并非如此 仅对Z = [1]为真 - 如您所料,但对于Z = [2]也是如此。
显然,这不是你所期望的。
那么错误在哪里?检测它的一个简单方法是注意匿名 变量表示_。
考虑:
intersectionx([H|T], Y, [_|Z]) :- memberx(H, Y), !, intersectionx(T, Y, Z).
^^^
你所写的是指以列表开头的交集 H和另一个列表将是(在右侧提供目标) 都是真的)一个以任何东西开头的清单......用那个H替换任何东西!