使用Member和Append压缩Prolog中的列表

时间:2018-12-20 12:50:56

标签: prolog

我目前正在学习序言并从事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。 有谁知道如何解决这个问题?

1 个答案:

答案 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]