Prolog lists of ascending number inside a list

落爺英雄遲暮 提交于 2020-01-15 12:15:21

问题


I Have a list of [1,2,3,1,0] at start but need to split it into a number of sub lists where the new lists becomes [[1,2,3],[1],[0]].

The basic concept that I know in prolog is by comparing numbers.

    ascending([Head | [HeadTail|TailTail]]) :- Head =< HeadTail.

回答1:


we can do with basic list' pattern matching

ascending([A], [[A]]).
ascending([A,B|T], R) :-
    ( A > B -> R = [[A],P|Q] ; P = [M|N], R = [[A,M|N]|Q] ),
    ascending([B|T], [P|Q]).

test:

1 ?- ascending([1,2],X).
X = [[1, 2]] ;
false.

2 ?- ascending([2,1],X).
X = [[2], [1]] ;
false.

3 ?- ascending([1,2,3,1,0],X).
X = [[1, 2, 3], [1], [0]] ;
false.



回答2:


% Trivial base case
asc([],[]).

% Invoke helper
asc([Ah|Ar],B) :- asc(Ar,[Ah],[],B).

% asc(InputList, CurrentSublistReversed, PreviousSublistsReversed, Result )

% No more input; add unreversed CurrentSublist & unreverse result
asc([],A,C,D) :- reverse(A,Ar), reverse([Ar|C],D).

% Next value gets added to head of current reversed sublist
asc([Ah|Ar],[Bh|Bt],C,D) :- Ah >= Bh, asc( Ar, [Ah,Bh|Bt], C, D).

% Unreverse current sblist, add to head of reversed list of previous sublists; start new sublist
asc([Ah|Ar],[Bh|Bt],C,D) :- Ah < Bh, reverse( [Bh|Bt], Br ), asc( Ar, [Ah], [Br|C], D ).


来源:https://stackoverflow.com/questions/29301224/prolog-lists-of-ascending-number-inside-a-list

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!