我很难为下面的问题设置一个有效的子句:给定列表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
部分似乎不太有效。有没有简单,迭代的方式来完成此任务?
答案 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).