在序言中,Z = [_G305]的结果是什么意思?

时间:2010-11-05 00:08:36

标签: prolog

我有这些定义:

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] ??

1 个答案:

答案 0 :(得分:5)

Z = [_ G305]。

意味着所有条款的答案都是正确的。也就是说,事实并非如此 仅对Z = [1]为真 - 如您所料,但对于Z = [2]也是如此。

显然,这不是你所期望的。

那么错误在哪里?检测它的一个简单方法是注意匿名 变量表示_。

考虑:

intersectionx([H|T], Y, [_|Z]) :- memberx(H, Y), !, intersectionx(T, Y, Z).
                        ^^^

你所写的是指以列表开头的交集 H和另一个列表将是(在右侧提供目标) 都是真的)一个以任何东西开头的清单......用那个H替换任何东西!