转换列表,Prolog [英] To convert a list,Prolog

查看:49
本文介绍了转换列表,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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆