prolog - Z = [_G305] 这样的结果在序言中意味着什么?

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

最佳答案

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/

相关文章:

list - 仅包括非唯一元素

prolog - bagof/3是不可预测的

prolog - λProlog 拒绝假设的推理查询?

indexing - 第一个参数索引

list - 将元素添加到子列表

list - Prolog 在列表中查找第 K 个元素

prolog - 在递归/回溯中累积

prolog - 在 Prolog 中创建二叉树

prolog - 在 Prolog 中编辑 Eliza 聊天机器人

prolog - SWI-Prolog 中未定义的过程