Как читать из предиката пролога в XPCE - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть следующий простой предикат пролога:

tst(In, Out) :- Out = In.

Идея ясна, просто верните то же самое в «Out», как было получено в «In». Хорошо, теперь я хочу включить этот предикат пролога в программу XPCE. Я создал окно и добавил кнопку, которая должна вызывать этот предикат пролога, а затем отображать значение, возвращенное в «Out». Я думал, что достижение этой задачи будет так же просто, как

send(Dialog, append(button(execute_command, and(
  message(@prolog, tst, InputText?selection, prolog(Output)),
  message(@prolog, write, prolog(Output)),
  message(@prolog, nl))))),

но, к сожалению, это не работает так, как я хочу. Вместо этого он теперь печатает внутреннюю ссылку «Out». Например:

?- _L204

Есть идеи, в чем здесь моя ошибка?

1 Ответ

0 голосов
/ 11 декабря 2010

Из Prolog установить значения в PCE легко, используя send / 3 или send / 4 . Поэтому одним из способов решения этой проблемы является использование предиката Prolog для вызова метода, который устанавливает значение для объекта PCE.

Объекты могут содержать другие объекты и иметь переменные класса и экземпляра в области видимости. Все, что нужно коду Пролога, это ссылка на объект: вызывая предикат со ссылкой на объект, предикат может вызывать соответствующий метод для передачи значения.

Вот некоторый код, который создает объект на основе диалогового класса. Кнопка в объекте при нажатии вызовет предикат (аналогичный тому, который описан в этом вопросе), который создаст значение на основе переданного значения, а затем установит это значение в переменной экземпляра диалоговое окно . Он также поместит значение в элемент управления text _ item .

Этот исходный код программы textfield.pl и может быть запущен с

swipl -s textfield.pl -g run

Текст по умолчанию:
Demo Text

Ввод пользователя

ABC

Текст, обновляемый программой посредством сообщений, отправляемых в GUI из предиката, вызванного кнопкой:

ABC surrounded by asterisks

демо класс:

:- use_module(library(pce)).

:- pce_begin_class(demo, dialog).
/* Instance variables*
         name,   type,  access, description */
variable(result, name*, get,    "Result from Prolog Callback").

initialise(Demo) :->
    "Create something that get/4 and send/3 can work with."::
    send(Demo, send_super, initialise, 'Demo'),
    send(Demo, append, new(InputText, text_item(input, 'Demo Text'))),
    send(Demo, append,
         button(execute_command,
            and(message(@prolog,doIt, Demo,InputText?selection),
            message(@prolog,printIt,Demo)))).
:- pce_end_class.

Код, вызываемый кнопкой:

%%% Create a new value based on the input string
%%% Write the new value back to the 'input' member of the
%%% 'demo' object.  Also put the value int the 'result' slot.
doIt(Demo,Word) :-
    concat_atom(['*** ' , Word, ' *** '] ,WordGotDid),
    format("doIt: Setting result: ~w...~n", [WordGotDid]),
    get(Demo,member,input,InputText),
    send(InputText,selection,WordGotDid),
    send(Demo,slot,result,WordGotDid).

%%% Read and display the 'result' slot.
printIt(Demo) :-
    get(Demo,slot,result,Result),
    write('\nResult: "'),
    write(Result),
    write('"\n').

Основная программа:

%%% Create an object that has fields that can be mutated.
run :- new(Demo,demo),
    send(Demo,open).

После просмотра демонстраций и написания этого кода мое мнение может измениться, как только я закончу изучать XPCE: несмотря на то, что в Прологе можно программировать с помощью сообщений из XPCE, просматривая демонстрационный код, не так, как это сделано. Программирование выполняется на Прологе или на каком-либо другом языке, и в качестве клея используется Пролог, в то время как XPCE - это в основном пассивный графический интерфейс, вроде HTML-форм. Программа создает объекты XPCE, изменяет их состояние и считывает значения из них. XPCE обычно не пишет в программу, кроме небольших сообщений, связанных с графическим интерфейсом; но даже это обычно делается в методах объектов XPCE.

...