Prolog:将包含连续数字段的列表压缩为包含段范围[开始,结束]的列表

问题描述 投票:0回答:1

我是序言新手,我正在尝试解决此练习,但无法获得所需的输出。将整数列表压缩为压缩列表。 List 包含连续整数的段。长度大于 2 的段将被编码为 list [start, end],end 包含在内。如果长度不大于2则保持不变。

样品:

压缩([3,4,6,7,8,9,10,15,16,17,20,22,23,24,25],压缩列表)。

压缩列表 = [3, 4, [6,10],[15, 17],20, [22,25]]。

我的错误输出:

压缩列表 = [[3, [4]], [6,[10]],[15, [17]],20, [22,[25]]]。

我的代码是:

compress([], []).

compress([X], [X]).

compress([X, Y | T], [X | CompressedTail]) :-
    X + 1 =\= Y,
    compress([Y | T], CompressedTail).
    
    
compress([X, Y | T], [[X, YLast] | CompressedTail]) :-
    compress_consecutive([Y | T], YLast, Next),
    compress(Next, CompressedTail).


compress_consecutive([], Last, []) :- Last = [].
compress_consecutive([X], [X], []) :- !.
compress_consecutive([X, Y | T], Last, Next) :-
    X + 1 =:= Y,
    compress_consecutive([Y | T], Last, Next).
    
    
compress_consecutive([X, Y | T], [X], [Y | T]) :- X + 1 =\= Y. ```
prolog swi-prolog
1个回答
0
投票
%compress/2 predicate
% Base case
compress([], []).

% Base case
compress([X], [X]).

compress([X, Y | T], [X | CompressedTail]) :-
    X + 1 =\= Y,
    compress([Y | T], CompressedTail).
    
compress([X, Y, Z| T], [X, Y| CompressedTail]) :-
    X + 1 =:= Y,
    Y + 1 =\= Z,
    compress([Z | T], CompressedTail).
    
    
compress([X, Y | T], [[X, YLast] | CompressedTail]) :-
    compress_consecutive([Y | T], YLast, Next),
    compress(Next, CompressedTail).

% Helper predicate to find the last element of a consecutive segment.
compress_consecutive([], Last, []) :- Last = [].
compress_consecutive([X], X, []) :- !.
compress_consecutive([X, Y | T], Last, Next) :-
    X + 1 =:= Y,
    compress_consecutive([Y | T], Last, Next).
    
    
compress_consecutive([X, Y | T], X, [Y | T]) :- 
X + 1 =\= Y.
© www.soinside.com 2019 - 2024. All rights reserved.