Как читать из предиката пролога в XPCE

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

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 ответ

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

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

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

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

swipl -s textfield.pl -g run

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

Пользовательский ввод

азбука

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

Азбука в окружении звездочек

Демо- класс:

:- 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.

Другие вопросы по тегам