修剪由相同元素组成的最大前缀

时间:2018-11-03 12:31:32

标签: list prolog

我很难为下面的问题设置一个有效的子句:给定列表X,找到它的最大前缀,该前缀由相同的元素以及其余的后缀组成。那就是:

| ?- trim([a,a,a,b,b,c], [a,a,a], [b,b,c]).
yes

| ?- trim([a,a,a,a,b,b,c,c], X, Y).
X = [a,a,a,a],
Y = [b,b,c,c]

这是我到目前为止所拥有的:

same([]).
same([_]).
same([X,X|T]) :- same([X|T]).

trim([], [], []).
trim(L, L, []) :- same(L).
trim(L, [A|B], [C|D]) :- append([A|B], [C|D], L), A \= C, same([A|B]).

append部分似乎不太有效。有没有简单,迭代的方式来完成此任务?

1 个答案:

答案 0 :(得分:2)

从一开始就考虑这个问题,我们知道我们希望平凡的情况成立:

trim([], [], []).

然后我们想要最长的重复元素前缀大小写:

trim([X], [X], []).           % Trivial case
trim([X,Y|T], [X], [Y|T]) :-  % Non-repeating element, ends recursion
    dif(X, Y).
trim([X,X|T], [X|Xs], S) :-   % Repeating element, recursive case
    trim([X|T], Xs, S).