为了更好地理解序言、列表和递归作为一个整体,我正在完成分配给自己的各种简单任务。其中包括从列表中删除重复条目。
我定义了一个规则:
is_on(Item, [Ah|At]) :- Ah = Item; is_on(Item, At).
这将检查“项目”是否在列表 X 上。所以我想我可以扩展它来定义一个 filter_double 谓词:
filter_doubles([Ah|At], Result) :-
(not(is_on(Ah, At)) ->
Result = [Ah|Result]
;
filter_doubles(At, Result)
).
这对我来说非常有意义:如果 Ah 没有出现在列表的其余部分(它的尾部)中,则使用列表构造将 a 添加到结果的前面,否则递归列表的其余部分。显然Prolog不这么认为:
47 ?- filter_doubles([1,2,3,3,4,2,1,1], Z).
Z = [3|**].
我在这方面想得太迫切了吗?