Как читать из предиката пролога в 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.