首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要转换列表,请执行Prolog

要转换列表,请执行Prolog
EN

Stack Overflow用户
提问于 2020-12-24 23:21:48
回答 1查看 55关注 0票数 0

我想这样做:输入应该是a,b,c,c,a,a,d,e,e,我想看到这样的输出:[4,a,b,2,c,2,a,d,4,e]我试过了,但没有效果。

代码语言:javascript
复制
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] 
EN

回答 1

Stack Overflow用户

发布于 2020-12-25 16:20:16

这里一个重要的谓词是传输谓词,它打包了所有内容。Modify搜索带有1的列表,并且只打印带有它的元素。

对于列表a,b,b,c,将执行以下操作:

1- 包谓词给出了Packed = [a,b,b,c]

2- encoded2谓词给出了Encoded2 = [4,a,2,b,1,c]

3- 修改谓词给我们提供了Modify = [4,a,2,b,c]

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65440215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档