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

gre*_*ghz 3 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).
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

?- intersectionx([1], [1], Z).
Z = [_G305].
Run Code Online (Sandbox Code Playgroud)

为什么不导致Z = [1]?

fal*_*lse 5

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替换任何东西!