我有这些定义:
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]??
最佳答案
Z = [_G305].
表示这个答案对所有术语都是正确的。也就是说,它不是 仅适用于 Z = [1] - 如您所料,但它也适用于 Z = [2]。
显然,这不是您所期望的。
那么错误在哪里呢?检测它的一个简单方法是注意匿名 变量用 _ 表示。
考虑:
intersectionx([H|T], Y, [_|Z]) :- memberx(H, Y), !, intersectionx(T, Y, Z).
^^^
你所写的意思是列表的交集以 H 和另一个列表将是(提供右侧的目标 都是真的)以任何东西开头的列表...用那个 H 替换任何东西!
关于prolog - Z = [_G305] 这样的结果在序言中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102535/