prolog - 要转换列表,Prolog
问题描述
我想做这样的事情:输入应该是 [a,a,a,a,b,c,c,a,a,d,e,e,e,e] 我想看到这样的输出:[[4 ,a],b,[2,c],[2,a],d,[4,e]] 我试过了,但是没用。
squeeze([], []).
squeeze([X|Xs], Ys) :-
squeeze(Xs, X-1, [], Ys).
squeeze([], Current, Acc, Ys) :- reverse(Ys, [Current|Acc]).
squeeze([X|Xs], X-N, Acc, Ys) :-
N1 is N+1,
squeeze(Xs, X-N1, Acc, Ys).
squeeze([X|Xs], C-N, Acc, Ys) :-
dif(X,C),
squeeze(Xs, X-1, [C-N|Acc], Ys).
?- squeeze([a,a,a,a,b,c,c,a,a,d,e,e,e,e], X).
X = [a-4, b-1, c-2, a-2, d-1, e-4]
解决方案
这里的一个重要谓词是传输谓词,它包含所有内容。Modify 用 1 搜索列表,并用它打印元素。
对于列表[a,a,a,a,b,b,c]发生以下操作:
1- pack 谓词给我们 Packed = [[a, a, a, a], [b, b], [c]]
2- encoded2 谓词给我们 Encoded2 = [[4,a],[2,b],[1,c]]
3- modify 谓词给我们 Modify = [[4,a],[2,b],c]
encode_modified([H|T],Modified):-
pack([H|T],Packed),
encoded2(Packed,Encoded1),
modify(Encoded1,Modified).
encoded2([],[]).
encoded2([H|T],[[Len,Element]|Ph]):-
length(H,Len),
nth0(0,H,Element),
encoded2(T,Ph).
pack([],[]).
pack([H|T],[Z|Zs]):-
transfer(H,T,Ys,Z),
pack(Ys,Zs).
transfer(X,[],[],[X]).
transfer(X,[X|Xs],Ys,[X|Zs]):-
transfer(X,Xs,Ys,Zs).
transfer(X,[Y|Ys],[Y|Ys],[X]):-
X\=Y.
modify([],[]).
modify([H|T],[A2|L]):-
H=[A1,A2],
A1=1,
modify(T,L).
modify([H|T],[H|L]):-
H=[A1,_],
A1\=1,
modify(T,L).
Examples:
?-encode_modified([v,v,b,b,b,b,b,g,t,t,t,t,t,t,t],Modified).
OUTPUT:
Modified = [[2, v], [5, b], g, [7, t]]
false
?-encode_modified([a,a,a,a,b,c,c,a,a,d,e,e,e,e],Modified).
OUTPUT:
Modified = [[4, a], b, [2, c], [2, a], d, [4, e]]
false
?-encode_modified([2,3,3,3,6,6,8,9,9],Modified).
OUTPUT:
Modified = [2, [3, 3], [2, 6], 8, [2, 9]]
false