Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

рекурсия, prolog

40K
19 апреля 2012 года
mego4el
30 / / 19.09.2010
доброго вечера ув. форумчане. Помогите разобраться с простенькой задачей на рекурсию. Никак не получается реализовать восходящую и нисходящую (хвостовую) рекурсию. Предметная область - расписание киносеансов.

sum - должен считать сумму цен по определенной дате (введенной пользователем в переменную Date). вроде бы с циклом все понятно, но вот с полной реализацией трудности(.

Код:
roomnum(sich, 14).
roomnum(dafi, 23).
roomnum(materik, 35).

clock(day, '15:00').
clock(day, '16:00').
clock(day, '17:00').
clock(night, '18:00').
clock(night, '19:00').
clock(night, '20:00').

filmname(1, 'The Matrix').
filmname(2, 'Prolog').
filmname(3, 'SWI').
filmname(4, 'help').
filmname(5, 'editor').

price(min, 12).
price(min, 14).
price(min, 16).
price(max, 18).
price(max, 22).
price(max, 24).

%seance(roomnum,   date,    time,    filmname,  price$, ind)
seance(14, 20, '16:00', 2, 14, 0).
seance(14, 21, '17:00', 3, 16, 1).
seance(14, 20, '18:00', 1, 18, 2).
seance(23, 21, '15:00', 2, 12, 3).
seance(23, 20, '16:00', 3, 14, 4).
seance(23, 20, '17:00', 1, 16, 5).
seance(35, 20, '15:00', 5, 14, 6).
seance(35, 21, '16:00', 4, 14, 7).
seance(35, 21, '17:00', 3, 18, 8).
seance(35, 20, '18:00', 1, 24, 9).
seance(35, 20, '19:00', 2, 22, 10).
seance(14, 20, '19:00', 3, 24, 11).

minprice(Filmname, Time, Price):-
                                 filmname(_,Filmname),
                                 price(min, Price),
                                 clock(day,Time).

maxprice(Filmname, Time, Price):-
                                 filmname(_,Filmname),
                                 price(max,Price),
                                 clock(night,Time).

dayseance(Filmname, Time, RNum, Price):-
                                filmname(_,Filmname),
                                clock(day,Time),
                                roomnum(RNum,_),
                                price(_,Price).
                               
                               
/* сумма цен по определенной дате, рекурсия */

sum(Date,_,0):-
             not(seance(_,Date,_,_,_,_)),!.
sum(Date,N,S):-
             seance(_,Date,_,_,Price,N),
             N1 is N+1,
             sum(Date,N1,S1),
             S is S1+Price.

/* не рекурсивно */
sdsum(Date, Sum):-
                  seance(_,Date,_,_,Price,_),
                  write(Price),nl,
                  summo(X),
                  retract(summo(_)),
                  X2 is X+Price,
                  assert(summo(X2)),
                  fail.
sdsum(_,_)
                  :-
                    summo(X),
                  write('Sum ='),
                  write(X),
                  retract(summo(_)),
                  assert(summo(0)).
                  :-
                    assert(summo(0)).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог