我目前正在学习序言并从事99项序言练习。 我有一个压缩列表的问题,因此应删除所有重复的元素。
所需结果:
?- compress([a,a,a,a,b,c,c,a,a,d,e,e,e,e],X).
X = [a,b,c,d,e]
我的代码当前如下所示:
compress([],[]).
compress([H|T], X) :-
( \+ member(H, X) ->
append([H],X,X)
), compress(T,X).
通过用trace
运行它,总是在第一次追加之后失败,并返回false。
有谁知道如何解决这个问题?
答案 0 :(得分:2)
append([H],X,X)
-此行无意义。如果X
是一个有限列表,则不能在其前添加一个非空列表,而仍然获得相同的列表X
。
Prolog程序是事实和演绎规则的陈述,例如数学证明,而不是x = [h] + x
等命令。没有与Java / C ++ / JavaScript程序相同的“变量”。
特别地,compress([H|T], X) :- foo, compress(T,X).
看起来也很奇怪,因为您说压缩列表[H|T]
(即X
)的结果与压缩列表{{1 }}(也T
),但前提是X
是正确的。
此外,如果您想为foo
获得[a,b]
,则可能必须添加额外的谓词。谓词不能“记住”任何东西(例如,它不能“遍历所有项目并且仅获得第一个出现的东西。)它只能进行递归调用。
如果您只保留最后一次出现,可以用以下方式编写:
[a,b,a]