2015-03-27 2 views
1

У меня есть список [1,2,3,1,0] при запуске, но его нужно разбить на несколько подписок, где новые списки становятся [[1,2 , 3], [1], [0]].Списки прологов возрастания в списке

Основная концепция, которую я знаю в прологе, - это сравнение чисел.

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

ответ

2

мы можем сделать с основным списком»шаблоном

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]). 

тест:

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. 
0
% 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). 
+0

Он отлично работает. Спасибо Скотту. – chosenman

+0

Есть ли способ не использовать обратный вместо этого? – chosenman

+0

Вы можете создать списки в правильном порядке, используя 'append', но тогда вам нужно будет отслеживать * tail * текущего подсписок (что можно упростить, сделав его своим параметром). Если это проблема производительности, я думаю, что использование «обратного» будет быстрее (один обход вместо этого каждый раз, когда вы добавляете), но вам нужно будет просмотреть его. –

Смежные вопросы