GNU Prolog中的异常`delete / 3`谓词?

时间:2015-03-26 21:28:53

标签: 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谓词的某些特定“解释”预期的,还是GNU Prolog中的错误?

1 个答案:

答案 0 :(得分:4)

名称delete极不具描述性。是否意味着删除所有相等元素或所有匹配元素?如果是后者,在移动到下一个列表元素或撤消时,我们要删除的元素与列表中的元素之间是否存在统一?

从上面的跟踪,特别是第二个查询,似乎delete/3使用的是相等而不是统一(正如您所知,每次出现的匿名变量都是一个不同的变量)。文件证实了这一点:

http://www.gprolog.org/manual/gprolog.html#sec213

由于对delete/3谓词的唯一语义没有达成共识,因此确实没有错误。至多,人们一致认为图书馆谓词的名称不好。只是在任何Prolog库中应该避免的谓词名称。也就是说,与旧代码的兼容性通常会导致其存在。