3

というわけで、Unity3Dでゲームを開発しており、IAプランニングはPrologを使用しています。私の問題はサルとバナナの問題に非常に似ていますが、新しい初期状態をアサートする際に問題があります。

初期状態を変更することで、私のキャラクターは、環境上で重要な何かが変化したときはいつでも、自分の行動を計画し直すことができます.

しかし、私の問題に戻りましょう:

ソケットを介してプロローグに文字列を渡しています。事実のリストを作成したいと考えています。次に、これらの事実を計画手順の初期状態として使用したいと思います。

バイト配列を文字のリストに変換することで、ソケットの入力ストリームを SWI ターミナルに書き込むことができます。出力ストリームに何かを書き込むことで、プロローグ サーバーから文字列を取得することもできます。しかし、これらの文字/文字列を事実のリストに変換する方法がわかりません。

また、命令型プログラミング言語で関数に引数を渡すのと同じように (その場合)、事実のリストを初期状態として使用したいと思います。

私がやりたいことは、次のようなものです(疑似コード):

% on the prolog server, we have a main function
% we get a bytestream (In), 
% turn it into a list of facts
% use it as the initial state
% and write Plan to the output stream (Out).

loopback(In, Out) :-    
    \+at_end_of_stream(In),     
    read_pending_input(In, Codes, []),              
    atom_codes(AtomList, Codes),       %bytes into a list of atoms
    toFacts(Init, AtomList),           %??? Init = AtomList to list of facts
    test(Init, Plan),                  %pass Init as the initial state
    format(Out, '~s', Plan),            %Get the plan back and write to the output
    flush_output(Out),
    loopback(In, Out).

% Init should look like this - a mere list of facts:
Init = [on(monkey, floor),
        on(box, floor),
        at(monkey, a),
        at(box, b),
        at(bananas, c),
        status(bananas, hanging)].

% The planning predicate - Init as an argument, Plan is the result
test(Init, Plan):- 
    write('Initial state:'),nl, 
    write_sol(Init),
    Goal = [status(bananas, grabbed)],
    nl,write('Goal state:'),nl,
    write(Goal),nl,
        solve(Init,Goal,Plan).

私は今本当に立ち往生しています。誰かが私を助けてくれることを願っています。ありがとうございました!

参考文献:

フルモンキーバナナ問題コード.

SWI ソケット サーバーのコード例。

4

2 に答える 2

2

多くの選択肢があります: 最も単純なのはread_from_codesのようです

test :-  
  S = "[on(monkey, floor),
        on(box, floor),
        at(monkey, a),
        at(box, b),
        at(bananas, c),
        status(bananas, hanging)].",
  read_from_codes(S, T),
  writeln(T).

結果は

?- test.
[on(monkey,floor),on(box,floor),at(monkey,a),at(box,b),at(bananas,c),status(bananas,hanging)]
true.

しかし、 JSONのような専用のプロトコルを使用すると、構造化データの交換がより簡単になる可能性があります。AJAX/jQuery経由で使用しました。あなたのユースケースではやり過ぎかもしれません...

于 2012-10-23T06:13:55.930 に答える
1

http://tinycog.sourceforge.net/では、SWI-Prolog HTTP サーバーと Unity3D HTTP 呼び出しを使用して、両端で JSON ライブラリを使用してインターフェイスを構築し、複雑な用語などをエンコードしています。実際には、Unity3D 側の小さな C# スクリプトです。すべてのゲームオブジェクトの位置を SWI-Server に送信し、「goto」、「grab」、「fire」など、Unity3D レベルで実行されるコマンドのリストを受信するだけです。SWI-Prolog コードは GIT リポジトリにあり、C# の Unity3D コードはプロジェクト ファイルのクライアント ZIP の一部です。

于 2015-10-25T13:13:12.547 に答える