というわけで、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).
私は今本当に立ち往生しています。誰かが私を助けてくれることを願っています。ありがとうございました!
参考文献: