2015-04-04 2 views
2

В примере, как это потребностьprolog- разорвать список

?- runs([3,4,5,4,2,7,5,6,6,8,3], RunList). 
RunList = [[3, 4, 5], [4], [2, 7], [5, 6, 6, 8], [3]] 

списка, чтобы быть разорван в ряду неубывающей последовательности последовательных чисел. Мой код:

next([],0). 
next([H|_],R):- 
    R is H. 

runs1([],[]). 
runs1([H|T],R):- 
    runs1(T,R1), 
    next(T,X), 
    H=<X, 
    R = [H|R1]. 
runs1([H|T],R):- 
    runs1(T,R1), 
    next(T,X), 
    H>X, 
    R = [[H]|R1]. 

Я пробовал много методов, но до сих пор не знаю, как писать ...

Надежда кто-то может мне помочь.

Заранее спасибо.

+2

возможно дубликат [Извлечение последовательностей (списков) Пролог] (http://stackoverflow.com/questions/29405498/extracting-sequences-lists-prolog) – lurker

ответ

-1
runs([], []):-!. 
runs([H|T], S):- 
    runs(T, TS), 
    ins(H, TS, S). 

ins(E, [], [[E]]):-!. 
ins(E, [[H|T]|TL], [[E, H|T]|TL]):- 
    H >= E, !. 
ins(E, TL, [[E]|TL]). 
+2

Было бы хорошо, чтобы объяснить, почему ОП их не удалось и ваше решение работает. Кроме того, хотя это работает в одном направлении (как * функция *), оно не определяет a * отношение *, поэтому 'run (L, [[3, 4, 5], [4], [2, 7] [5, 6, 6, 8], [3]]). «Выходит из строя, а не дает, L = [3,4,5,4,2,7,5,6,6,8,3]». – lurker

+0

Как я могу решить эту проблему? - У вас есть какой-нибудь пример этой техники - это так интересно для меня. – rrrfer

+1

См. ссылку, представленную в комментарии к исходному вопросу, для нескольких примеров. – lurker

1

Для логически чистый и монотонные взгляда реализации на my answer на соответствующий вопрос "Extracting sequences (Lists) Prolog".

Представляю мета-предикат splitlistIfAdj/3, который основан на if_/3, предложенном @false в this answer. splitlistIfAdj/3 обеспечивает логическую устойчивость, оставаясь при этом детерминированным.

Предикат, переданный splitlistIfAdj/3, должен подчиняться тому же соглашению, что и (=)/3, и memberd_truth/3. В вашем случае нам нужно определение (#>)/3:

#>(X,Y,Truth) :- X #> Y #<==> B, =(B,1,Truth). 

Давайте использовать splitlistIfAdj/3 и (#>)/3 в примере вы дали:

?- splitlistIfAdj(#>,[3,4,5,4,2,7,5,6,6,8,3],Pss). 
Pss = [[3,4,5],[4],[2,7],[5,6,6,8],[3]].   % succeeds deterministically 

Теперь давайте спросим более общий запрос:

?- splitlistIfAdj(#>,[A,B],Pss). 
Pss = [[A],[B]], A#>=_X,  B+1#=_X ; 
Pss = [[A,B]], A#>=_Y#<==>_Z, B+1#=_Y, _Z in 0..1, dif(_Z,1). 

Наконец, давайте запустим запрос, который @lurker предложил в своем комментарии к ответу @ rrrfer:

?- splitlistIfAdj(#>, Ls, [[3,4,5],[4],[2,7],[5,6,6,8],[3]]). 
Ls = [3,4,5,4,2,7,5,6,6,8,3] ; 
false. 
Смежные вопросы