首页 > 解决方案 > 要转换列表,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] 

标签: prolog

解决方案


这里的一个重要谓词是传输谓词,它包含所有内容。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

推荐阅读