0

次の単純なプロローグ述語があります。

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

アイデアは明らかです。「In」で受け取ったものと同じものを「Out」で返すだけです。さて、このプロローグ述語を 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

ここで私の間違いは何ですか?

4

1 に答える 1

0

From Prolog PCE で値を設定するのは簡単で、send/3またはsend/4を使用します。したがって、これを回避する 1 つの方法は、Prolog 述語で、PCE オブジェクトに値を設定するメソッドを呼び出すことです。

オブジェクトには他のオブジェクトを含めることができ、スコープ内にクラス変数とインスタンス変数を含めることができます。Prolog コードで必要なのは、オブジェクトへの参照だけです。オブジェクト参照を使用して述語を呼び出すことにより、述語は適切なメソッドを呼び出して値を伝達できます。

ダイアログクラスに基づいてオブジェクトを作成するコードを次に示します。オブジェクトのボタンが押されると、渡されたものに基づいて値を作成する述語 (この質問のものと同様) が呼び出され、その値がdialogのインスタンス変数に設定されます。また、値をtext_itemコントロールに入れます

このプログラム ソースはtextfield.plであり、次のコマンドで実行できます。

swipl -s textfield.pl -g run

デフォルトのテキスト:
デモテキスト

ユーザー入力

ABC

プッシュボタンによって呼び出された述語から GUI に送信されたメッセージを介して、プログラムによって更新されたテキスト:

アスタリスクで囲まれた ABC

デモクラス:

:- 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 の勉強を終えると、これは変わる可能性がある私の意見です。それが行われる方法。プログラミングは Prolog やその他の言語で行われ、Prolog を接着剤として使用しますが、XPCE はほとんどが受動的な GUI であり、HTML フォームのようなものです。このプログラムは XPCE オブジェクトを作成し、それらの状態を変更し、それらから値を読み取ります。XPCE は通常、GUI 関連の小さなメッセージ以外はプログラムに書き込みません。しかし、それも通常 XPCE オブジェクトのメソッドで行われます。

于 2010-12-11T13:44:53.300 に答える