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

List 由相同元素组成的修剪最大前缀,list,prolog,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([], []

对于以下问题,我很难想出一个有效的子句集:给定一个列表
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
部分似乎效率不高。有没有一种简单、迭代的方法来实现这一点?

从一开始就考虑这个问题,我们知道我们希望这个小问题是正确的:

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).

你能再澄清一下这个问题吗?例如,这是真的吗<代码>修剪([a,a,b,b,c],[a,a,b,b],[c])?或者第二个参数是否必须具有所有相同的元素?既然
same([])
是真的,那么您接受这个解决方案,
trim([a,b,c],[a,b,c])
?@潜伏者应该是
trim([a,a,b,b,c],[a,a],[b,b,c])
trim([a,b,c],[a],[b,c])
。后缀应该是非空的,并且具有尽可能长的所有相同元素。我可能应该澄清后缀必须是非空的,除非输入列表为空,在这种情况下,
trim([],[],[])
保持不变。谢谢澄清。当你们说,后缀应该是非空的,并且有所有相同的元素,同时尽可能长,我想你们指的是前缀,而不是后缀。@Lowerer是的,当然,我的错