Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Рекурсия


Автор: alafin 27.11.2006, 20:51
Пожалуйста, помогите! Нужно сделать деление списка арифметических данных на два. Если элемент исходного списка не больше значения Comp, он помещается в подсписок  L1, в противном случае - в подсписок L2

Автор: skyboy 27.11.2006, 21:29
Код

domains 
 list= integer*
predicates
 split(list,list,list,list,list,integer)
clauses
 split([],LessThen,GreaterThen,LessThen,GreaterThen,_):-!.
 split([Head|Tail],LessOld,GreaterOld,LessResult,GreaterResult,Divider):-
  Head> Divider, GreaterNew= [Head|GreaterOld], !, split(Tail,LessOld,GreaterNew,LessResult,GreaterResult,Divider),!.
 split([Head|Tail],LessOld,GreaterOld,LessResult,GreaterResult,Divider):-
  LessNew= [Head|LessOld], !,split(Tail,LessNew,GreaterOld,LessResult,GreaterResult,Divider).
goal
 nl,nl,nl,
 X= [10,20,15,5,6,7,3,2],Divider= 12, split(X,[],[],Less,Greater,Divider),
 write("Source is "),write(X),nl,
 write("Less then "),write(Divider),write(":"),write(Less),nl,
 write("Greater then "),write(Divider),write(":"),write(Greater),nl.  

Вот так. переменная X - исходный список; Divider - гранница, относительно которой происходит разделение. Синтаксис - Turbo Prolog, другого под рукой не было.

Автор: alafin 27.11.2006, 23:51
А как код будет выглядеть если делать без отсечения? Заранее спасибо.

Автор: skyboy 28.11.2006, 00:18
у меня работает и без отсечения(просто поудалять + первый(нерекурсивный) вариант предиката сократится на ":-"). отсечение мешало, пока итоговый "запрос" был не в секции goal, а в командной строке - компилятор выдавал все комбинации решений. 
Интересно, а чем помешало отсечение smile

Автор: Artemios 28.11.2006, 03:07
Код

split([],_,[],[]).
split([X|L],Comp,[X|L1],L2):-
    X<Comp,
    split(L,Comp,L1,L2).
split([X|L],Comp,L1,[X|L2]):-
    X>=Comp,
    split(L,Comp,L1,L2).


Цитата

?- split([1,9,2,8,3,7,4,6,5],5,L1,L2).

L1 = [1, 2, 3, 4]
L2 = [9, 8, 7, 6, 5]

Yes
?-       

Автор: alafin 28.11.2006, 23:13
Спасибо, все работает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)