Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Приостановка предиката
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,227
Сказал(а) спасибо: 25
Поблагодарили 49 раз(а) в 49 сообщениях
Регистрация: 16.10.2005
По умолчанию Приостановка предиката - 13.06.2014, 01:50

При работе с консолью не составляет труда написать такой предикат (схематично):
Visual Prolog Код:
работа:-
  генераторВариантов(Вариант),
  сообщениеПользователю(Вариант),
  ожиданиеОтвета(Ответ),
  обработка(Вариант, Ответ),
  fail.
работа.

Есть ли в Visual Prolog возможность как-либо реализовать подобную схему в рамках одного диалога?
Чтобы после ожидания ответа пользователя произошел нормальный откат к развилке в генераторе вариантов?
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,227
Сказал(а) спасибо: 25
Поблагодарили 49 раз(а) в 49 сообщениях
Регистрация: 16.10.2005
По умолчанию 13.06.2014, 03:25

Придумал такой костыль:
Visual Prolog Код:
инициализация:-
  генераторВариантов(Вариант),
  assert(вариант(Вариант),
  fail.
инициализация:-
  вариант(Вариант),  
  сообщениеПользователю(Вариант).

нажатиеКнопки:-
  retract(вариант(Вариант)),  
  чтениеОтвета(Ответ),
  обработка(Вариант, Ответ),
  вариант(Вариант),  
  сообщениеПользователю(Вариант).
нажатиеКнопки.

Но вряд ли справится ли мой костыль, если несколько усложнить первоначальное задание:
Visual Prolog Код:
работа:-
  генераторЧудовищногоКоличестваВариантов(Вариант),
  фильтрПоДаннымБазы(Вариант)
  сообщениеПользователю(Вариант),
  ожиданиеОтвета(Ответ),
  обработка(Вариант, Ответ, Данные),
  коррекцияБазы(Вариант, Ответ, Данные),
  fail.
работа.
Ответить с цитированием
  (#3 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 13.06.2014, 09:16

Генерация вариантов при нажатии на кнопку происходит с самого начала - перебираются все возможные варианты, пока не встретится новый вариант, подходящий по всем ограничениям.
Но поскольку ограничений становится больше с каждым шагом, неподходящие варианты отбрасываются все раньше.
По ответу пользователя формируется новое ограничение, потом процесс запускается заново.
Ответить с цитированием
  (#4 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,827
Сказал(а) спасибо: 2
Поблагодарили 284 раз(а) в 284 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 13.06.2014, 12:06

Цитата:
Сообщение от Alexiski Посмотреть сообщение
Есть ли в Visual Prolog возможность как-либо реализовать подобную схему в рамках одного диалога?
Чтобы после ожидания ответа пользователя произошел нормальный откат к развилке в генераторе вариантов?
Если пользователь должен отвечать на каждый ВариантРешения, то предикат ожиданиеОтвета(Ответ) должен получить сигнал от тех контролов, через которые пользователь ввёл ответ.
Единственная тонкость в поставленной Вами задаче - посылка и приём такого сигнала. Если сигнала нет, то предикат ожиданиеОтвета(Ответ) ждёт.
Ответить с цитированием
  (#5 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,227
Сказал(а) спасибо: 25
Поблагодарили 49 раз(а) в 49 сообщениях
Регистрация: 16.10.2005
По умолчанию 14.06.2014, 12:56

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Единственная тонкость в поставленной Вами задаче - посылка и приём такого сигнала
Это понятно. Собственно, вопрос так и звучит - можно ли как-то приостановить работу предиката в ожидании некоторого события, чтобы при этом сохранялась возможность действий пользователя с элементами графического интерфейса. Или не приостанавливая - есть ли возможность обрабатывать события от пользовательского интерфейса, не завершая текущего предиката?

Цитата:
Сообщение от Alison Посмотреть сообщение
Генерация вариантов при нажатии на кнопку происходит с самого начала
На текущий момент склоняюсь именно к такому варианту.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
VictorY VictorY на форуме
Member
 
Аватар для VictorY
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 43 раз(а) в 43 сообщениях
Регистрация: 10.02.2005
По умолчанию 14.06.2014, 23:38

Цитата:
Сообщение от Alexiski Посмотреть сообщение
Это понятно. Собственно, вопрос так и звучит - можно ли как-то приостановить работу предиката в ожидании некоторого события, чтобы при этом сохранялась возможность действий пользователя с элементами графического интерфейса. Или не приостанавливая - есть ли возможность обрабатывать события от пользовательского интерфейса, не завершая текущего предиката?
Вообще-то это решается применением предиката Result=vpi::processEvents(), который вставляется в качестве одного из предикатов цикла. В GUI, насколько представляю, аналога пока нет.

Исполнение этого предиката приводит к обработке GUI-событий. После разгребания очереди этих событий (и их соответствующей обработки) исполнение передается предикату, следующему за этим (vpi::processEvents()). Возвращаемый параметр Result в большинстве случаев можно игнорировать.
Ответить с цитированием
  (#7 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,827
Сказал(а) спасибо: 2
Поблагодарили 284 раз(а) в 284 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 15.06.2014, 01:44

Здесь наверное можно использовать защитника (guard). Т.е. обработка и коррекция базы не начнётся до тех пор, пока не получен например флаг (факт) сообщения от пользователя.
Ответить с цитированием
  (#8 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,227
Сказал(а) спасибо: 25
Поблагодарили 49 раз(а) в 49 сообщениях
Регистрация: 16.10.2005
По умолчанию 15.06.2014, 04:05

Цитата:
Сообщение от VictorY Посмотреть сообщение
vpi::processEvents()
Я так и думал, что что-то подобное есть!

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Здесь наверное можно использовать защитника (guard)
Мы люди тёмные, нам бы на пальцах показать или в мануал носом ткнуть..
Ответить с цитированием
  (#9 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 454
Сказал(а) спасибо: 17
Поблагодарили 30 раз(а) в 30 сообщениях
Регистрация: 28.03.2012
По умолчанию 15.06.2014, 09:40

Цитата:
Сообщение от VictorY Посмотреть сообщение
Вообще-то это решается применением предиката Result=vpi::processEvents(), который вставляется в качестве одного из предикатов цикла. В GUI, насколько представляю, аналога пока нет.
наверно опечатка (дальше по тексту это понятно), в консольном приложении нет аналогов, т.к. там нет GUI событий.
Ответить с цитированием
  (#10 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 454
Сказал(а) спасибо: 17
Поблагодарили 30 раз(а) в 30 сообщениях
Регистрация: 28.03.2012
По умолчанию 15.06.2014, 09:48

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Здесь наверное можно использовать защитника (guard).
разговор о мониторах. см Language Reference/Monitors - wiki.visual-prolog.com

Но тогда надо свободно владеть работой с несколькими thread'ами. Это не просто. Надо много чего знать и много чего держать в голове при написании multithread программы. Мониторы и pfc\multiThread\monitorQueue -конечно помогут в этом. Но не будет ли это приделывания слона к хвосту?
Ответить с цитированием
  (#11 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 15.06.2014, 10:29

Думаю, что здесь речь идет о более простых вещах, просто связанных с переделыванием консольной программу в GUI-шную.
Проблема возникает в сочетании генерации вариантов и общения с пользователем. Впрямую консольную программу переделать обычно не удается.
После каждого нажатия на кнопку, когда считывается ответ от пользователя в той или иной форме, генерацию вариантов нужно производить заново (предикат вызывать заново). Но ее можно ограничивать, учитывая ответы пользователя: менять пределы, в которых генерируются варианты, например.
Ответить с цитированием
  (#12 (permalink)) Старый
VictorY VictorY на форуме
Member
 
Аватар для VictorY
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 43 раз(а) в 43 сообщениях
Регистрация: 10.02.2005
По умолчанию 15.06.2014, 11:56

Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
наверно опечатка (дальше по тексту это понятно), в консольном приложении нет аналогов, т.к. там нет GUI событий.
Мне кажется Alexiski работает в GUI-контексте.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,827
Сказал(а) спасибо: 2
Поблагодарили 284 раз(а) в 284 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 15.06.2014, 12:32

Цитата:
Сообщение от Alison Посмотреть сообщение
После каждого нажатия на кнопку, когда считывается ответ от пользователя в той или иной форме, генерацию вариантов нужно производить заново (предикат вызывать заново).
ЗАЧЕМ? Можно работать на откатах.
Всё делать так, как описал автор темы в Приостановка предиката. При этом предикат ожидания ответа пользователя не должен напрямую опрашивать контролы, а просто ждать сигнала от события ввода пользователем ответа.
Ответить с цитированием
  (#14 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 15.06.2014, 14:20

Реализуй в GUI-проекте "Быки и коровы", когда компьютер не знает, что загадал пользователь, а просто отгадывает и подбирает вариант по ответам (тривиальная программа, за 5 минут пишется), поймешь, о чем идет речь.
Ответить с цитированием
  (#15 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,827
Сказал(а) спасибо: 2
Поблагодарили 284 раз(а) в 284 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 17.06.2014, 14:38

Цитата:
Сообщение от Alison Посмотреть сообщение
поймешь, о чем идет речь.
Да, собственно, понимание у меня было всегда.
Если по простому, то вывод фактов на откате в GUI можно сделать и так (автоматически создаваемый код не привожу):
Visual Prolog Код:
implement mainForm
    inherits formWindow
    open core, vpiDomains

facts
f:(string).

clauses
f("qwe"). f("кен"). f("uio"). f("вап").

clauses
    display(Parent) = Form :-
        Form = new(Parent),
        Form:show().

constructors
    new : (window Parent).
clauses
    new(Parent) :-
        vpi::init(),
        formWindow::new(Parent),
        generatedInitialize().

predicates
    onPushButtonClick : button::clickResponder.
clauses
    onPushButtonClick(_Source) = button::defaultAction :-
        listbox_ctl:clearAll(),
        f(S),
        listbox_ctl:add(S),
        Q = vpiCommonDialogs::getString("Title","Prompt","InitStr"),
        listbox_ctl:add(Q),
        fail;
        succeed.
Если у тебя, Alison, есть непонимание или неприятие, то можно заменить стандартный диалог getString/3 другим стандартным диалогом или диалогом, созданным пользователем.
Вместо диалога можно организовать тред опроса нажатия кнопки на самой форме. Ну и обработку нажатия кнопки поместить в тред. Как то так. Кнопка с фактом-гардой, так сказать.

Последний раз редактировалось Винитарх; 17.06.2014 в 14:50
Ответить с цитированием
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с написанием предиката cannoneer Prolog 5 23.01.2014 17:57
Передача фактов в качестве аргументов предиката? tumanovalex Prolog 5 29.12.2012 21:31
Телефонный справочник. c помощью предиката findall BlackYul Prolog 18 27.11.2011 19:03
Проблема с описание предиката. Bar90 Prolog 1 23.10.2011 23:40
Логическая ошибка предиката Sardar Prolog 4 10.08.2011 08:49
Нужно написать три предиката Angelikachka Prolog 0 12.10.2010 21:25
Нужно объяснить принцип работы предиката zlob.jc Prolog 4 31.05.2010 03:14
определить функцию предиката Alenka-dev Prolog 1 26.04.2010 14:24
Списки. Три простеньких предиката. Guest01 Prolog 6 05.04.2010 18:45
Работа предиката lbox_add (VIP5.2) Niagen Prolog 14 27.12.2007 11:33
ошибка при объявления глобального предиката Oemor Prolog 10 23.05.2007 21:24
Объявление типа предиката 5565610 Prolog 29 23.10.2006 15:01



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