我是序言新手,我正在尝试解决此练习,但无法获得所需的输出。将整数列表压缩为压缩列表。 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. ```
%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.