转换列表,Prolog [英] To convert a list,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]]我试过了,但没有用.
i wanna do something like this: Input should be [a,a,a,a,b,c,c,a,a,d,e,e,e,e] And i wanna see output like this: [[4,a],b,[2,c],[2,a],d,[4,e]] I tried it but it didn't work.
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 搜索列表,并只打印带有它的元素.
An important predicate here is the transfer predicate, that packs everything. Modify searches for the list with 1, and just prints the element with it.
对于列表[a,a,a,a,b,b,c] 执行以下操作:
For the list [a,a,a,a,b,b,c] following actions take place:
1- pack predicate 给我们 Packed = [[a, a, a, a], [b, b], [c]]
1- pack predicate gives us Packed = [[a, a, a, a], [b, b], [c]]
2- encoded2 谓词 给我们 Encoded2 = [[4,a],[2,b],[1,c]]
2- encoded2 predicate gives us Encoded2 = [[4,a],[2,b],[1,c]]
3- modify predicate 给我们 Modify = [[4,a],[2,b],c]
3- modify predicate gives us 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
这篇关于转换列表,Prolog的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!