GNU Prolog `delete/3` 谓词异常?
Anomaly in GNU Prolog `delete/3` predicate?
我发现 GNU Prolog(版本 1.4.2)中的行为不一致 delete/3
谓词:
| ?- delete([a,b,c], b, R).
R = [a,c]
yes
| ?- delete([(a,_), (b,_), (c,_)], (b,_), R).
R = [(a,_),(b,_),(c,_)]
yes
| ?- member( (b,_), [(a,_), (b,_), (c,_)] ).
true ? ;
no
| ?- select((b,_), [(a,_), (b,_), (c,_)], R).
R = [(a,_),(c,_)] ? ;
no
| ?-
除了 delete([(a,_), (b,_), (c,_)], (b,_), R).
之外的所有上述结果都是我所期望的。例如,如果您 运行 SWI Prolog 中的同一组查询,delete([(a,_), (b,_), (c,_)], (b,_), R).
会产生 R = [(a,_), (c,_)]
,正如我所期望的那样。
我的问题是,这是否是基于 delete/3
谓词的某些特定 "interpretation" 预期的,或者它可能是 GNU Prolog 中的错误?
这个名字 delete
非常没有描述性。这是否意味着删除所有 equal 元素或所有 matching 元素?如果是后者,我们正在删除的元素与列表中的元素之间的统一是否在移动到下一个列表元素时进行或被撤消?
从上面的跟踪,特别是第二个查询,似乎 delete/3
使用相等而不是统一(如您所知,匿名变量的每次出现都是不同的变量)。文档证实了这一点:
http://www.gprolog.org/manual/gprolog.html#sec213
确实没有错误,因为对于 delete/3
谓词的唯一语义没有达成共识。至多,人们一致认为库谓词的名称不好。只是在任何 Prolog 库中都应避免的谓词名称。也就是说,与旧代码的兼容性通常会导致它的存在。
我发现 GNU Prolog(版本 1.4.2)中的行为不一致 delete/3
谓词:
| ?- delete([a,b,c], b, R).
R = [a,c]
yes
| ?- delete([(a,_), (b,_), (c,_)], (b,_), R).
R = [(a,_),(b,_),(c,_)]
yes
| ?- member( (b,_), [(a,_), (b,_), (c,_)] ).
true ? ;
no
| ?- select((b,_), [(a,_), (b,_), (c,_)], R).
R = [(a,_),(c,_)] ? ;
no
| ?-
除了 delete([(a,_), (b,_), (c,_)], (b,_), R).
之外的所有上述结果都是我所期望的。例如,如果您 运行 SWI Prolog 中的同一组查询,delete([(a,_), (b,_), (c,_)], (b,_), R).
会产生 R = [(a,_), (c,_)]
,正如我所期望的那样。
我的问题是,这是否是基于 delete/3
谓词的某些特定 "interpretation" 预期的,或者它可能是 GNU Prolog 中的错误?
这个名字 delete
非常没有描述性。这是否意味着删除所有 equal 元素或所有 matching 元素?如果是后者,我们正在删除的元素与列表中的元素之间的统一是否在移动到下一个列表元素时进行或被撤消?
从上面的跟踪,特别是第二个查询,似乎 delete/3
使用相等而不是统一(如您所知,匿名变量的每次出现都是不同的变量)。文档证实了这一点:
http://www.gprolog.org/manual/gprolog.html#sec213
确实没有错误,因为对于 delete/3
谓词的唯一语义没有达成共识。至多,人们一致认为库谓词的名称不好。只是在任何 Prolog 库中都应避免的谓词名称。也就是说,与旧代码的兼容性通常会导致它的存在。