因此,我正在使用 Unity3D 开发游戏,并且正在使用 Prolog 进行 IA 规划。我的问题与猴子和香蕉问题非常相似,但是我在断言新的初始状态时遇到了问题。
通过改变初始状态,我的角色将能够在环境中重要的事情发生变化时再次计划他的行动。
但是让我们回到我的问题:
我通过套接字将一个字符串传递给prolog,并且我想建立一个事实列表。然后,我想将这些事实用作我的计划程序的初始状态。
通过将字节数组转换为字符列表,我可以在 SWI 终端上写入套接字的输入流。通过在输出流上写一些东西,我还可以从 prolog 服务器返回一个字符串。但我不知道我应该如何将这些字符/字符串变成事实列表。
另外,我想使用该事实列表作为初始状态,通过将其传递给规划过程,就像我将参数传递给命令式编程语言中的函数(如果是这样的话)。
我想做的是这样的(伪代码):
% 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).
我现在真的很困惑,我希望有人能帮助我。谢谢!
参考: