我发现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
谓词的某些特定“解释”预期的,还是GNU Prolog中的错误?
答案 0 :(得分:4)
名称delete
极不具描述性。是否意味着删除所有相等元素或所有匹配元素?如果是后者,在移动到下一个列表元素或撤消时,我们要删除的元素与列表中的元素之间是否存在统一?
从上面的跟踪,特别是第二个查询,似乎delete/3
使用的是相等而不是统一(正如您所知,每次出现的匿名变量都是一个不同的变量)。文件证实了这一点:
http://www.gprolog.org/manual/gprolog.html#sec213
由于对delete/3
谓词的唯一语义没有达成共识,因此确实没有错误。至多,人们一致认为图书馆谓词的名称不好。只是在任何Prolog库中应该避免的谓词名称。也就是说,与旧代码的兼容性通常会导致其存在。