Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Центральный цикл (рекурсия) или перевычисляемый предикат
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported_Black_Dragon imported_Black_Dragon вне форума
Member
 
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2005
По умолчанию Центральный цикл (рекурсия) или перевычисляемый предикат - 14.10.2005, 10:46

Есть предикат (running), который из начального списка чисел строит другой список, используя генератор случайных чисел.
Надо по ентр-у в цикле по новой генерить список и показывать.

1. Вариант:
Код:
        start() :-
            Numb=maximum-minimum,
            initlist(Numb,List0s),
            running(count,0.35,10,List0s,List1s),
            console::clearOutput(),
            console::write(List1s),console::nl,
            dwritel(List1s).
            'q' = console::readchar(),!.
        start() :- start().
Все работает, но меня смущает, что чем долшье работает, тем дальше в стек погружаемся... (жрем ресурсы)

Решил по другому сделать, методом возврата
2. Вариант:
Код:
        work() :-
            Numb=maximum-minimum,
            initlist(Numb,List0s),!,
            running(count,0.35,10,List0s,List1s),
            console::clearOutput(),
            console::write(List1s),console::nl,
            dwritel(List1s),
            'q' = console::readchar().
        start() :- work(),!.
        start().
Код:
running : (integer,real,integer,rlist,rlist) nondeterm (i,i,i,i,o).
work: () nondeterm.
Работает только один раз!!!, это означает что running при возврате не пересчитывается или сие не возможно?
Код:
        running(0,_,_,Xs,Xs).
        running(Numcount,Proc,Kv,Xs,X1s) :-
            Numcount>0,
            Res = formul0(Proc,Kv),
            setnum(Res,Xs,1,X2s),
            Numcount1 = Numcount-1,
            running(Numcount1,Proc,Kv,X2s,X1s).
Ответить с цитированием
  (#2 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,862
Сказал(а) спасибо: 2
Поблагодарили 287 раз(а) в 287 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 17.10.2005, 21:39

Напишите конкретно, что Вам нужно сделать в Вашей задаче. Мне кажется, проблемы со стеком возникают по Вашей вине. Опишите задачу и я Вам подскажу как правильно написать цикл.
Ответить с цитированием
  (#3 (permalink)) Старый
imported_Black_Dragon imported_Black_Dragon вне форума
Member
 
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2005
По умолчанию 18.10.2005, 11:20

Цитата:
Originally posted by Винитарх
[b]Напишите конкретно, что Вам нужно сделать в Вашей задаче. Мне кажется, проблемы со стеком возникают по Вашей вине. Опишите задачу и я Вам подскажу как правильно написать цикл.
Проблема не вызвана конкретной задачай, а сама задача неавела на возможные проблемы:
1. Посмотрите код (вариант 2): генерится определенным образом начальный список List0s (целых чисел) из нужного количества элемента, и есть предикат running с кучей мат функций и других вспомогательных предикатов с мат. функциями, который из исходного списка List0s генерит другой список List1s с помошью мат расчетов. Я хотел сделать (см код), что если не нажата кнопка q, повторить расчет списка List1s по новой методом отката и повторного пересчета (бактрейтинг), но у меня не получается сделать так, т.е. при не выполнении 'q' = console::readchar(). происходит откат до running, так как перед ней стоит !, но она не является nondeterm (что бы дыло бы ее пересчет), и текущая ветка work не выполняется и и выполняется другая ветак work.
т.е. можно ли сделать running с мат функциями, где используется math::random() - nondeterm.
или у меня ошибка в коде, что моя идея не коректно работает (так как сейчас поставил перед running предикат succeed, но результат тот же, пересчета нету)

2. Идея выполнять программу пока нажатая кнопка не q имеет два решения (имхо), это методом отката как я хотел сделать выше или рекурсией, как кодом - вариант 1, который для моего случая и оказался работоспособным.
Так вот из книги (которая у вас в отсканированом виде тут выложена, у меня в текстовом) есть рекурсия и цикл, цикл имеет фикс объем, а рекурсия порождает каждый разновые объемы память. Вот как быть с главным циклом программы (я вообще, для будующих своих программ), который должен долго крутится (т.е. я не до конца понял как правильно сделать рекрсию), мой вариант 1 это что?
Ответить с цитированием
  (#4 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,862
Сказал(а) спасибо: 2
Поблагодарили 287 раз(а) в 287 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 19.10.2005, 14:02

Цитата:
Есть предикат (running), который из начального списка чисел строит другой список, используя генератор случайных чисел.
Надо по ентр-у в цикле по новой генерить список и показывать.
Вам надо использовать цикл типа repeat-fail.
Добавьте repeat и всё должно заработать как надо:
Код:
start():-repeat,running(),'q' = console::readchar().
Итого:
Код:
        start() :- 
           Numb=maximum-minimum, 
           initlist(Numb,List0s),
            repeat,
            running(count,0.35,10,List0s,List1s), 
            console::clearOutput(), 
            console::write(List1s),console::nl, 
            dwritel(List1s). 
            'q' = console::readchar(),!. 
        start() :- start().
Ответить с цитированием
  (#5 (permalink)) Старый
imported_Black_Dragon imported_Black_Dragon вне форума
Member
 
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2005
По умолчанию 19.10.2005, 22:07

Цитата:
Originally posted by Винитарх
[b]<div class='quotetop'>Цитата
Цитата:
Есть предикат (running), который из начального списка чисел строит другой список, используя генератор случайных чисел.
Надо по ентр-у в цикле по новой генерить список и показывать.
Вам надо использовать цикл типа repeat-fail.
Добавьте repeat и всё должно заработать как надо:
start():-repeat,running(),'q' = console::readchar().[/code]
[/quote]
Почетав свою книжку к этому уже пришел, спасибо
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Предикат exists(+P, +L) Елена88 Prolog 2 23.12.2011 09:19
Глючит центральный коммутатор Leonil Администрирование и базы данных 0 27.04.2011 11:27
ПРЕДИКАТ readln HASKI Prolog 2 09.04.2011 14:19
Предикат Гадюка Prolog 6 19.11.2010 16:41
Предикат bound User№345672 Prolog 4 07.11.2010 20:33
Определить функциональный предикат jen1234 Lisp 3 23.05.2010 18:47
Предикат Edit CaliberovDizz Prolog 4 18.04.2009 23:44
Напишите предикат p на формулу ABBA@12 Lisp 4 03.03.2009 07:14
Как определить симметричный предикат? vanek Prolog 1 04.11.2008 18:17
Предикат clause wiwzik Prolog 1 07.08.2008 22:20
Предикат LISTP как с ним работать sko2 Lisp 6 03.12.2007 22:59
Существует ли предикат? Бляк Prolog 28 11.05.2006 13:18



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов