3

因此,我正在使用 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).

我现在真的很困惑,我希望有人能帮助我。谢谢!

参考:

完整的猴子香蕉问题代码。

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# 脚本只需将所有 GameObjects 的位置发送到 SWI-Server 并接收要在 Unity3D 级别上执行的命令列表,包括“goto”、“grab”和“fire”。SWI-Prolog 代码位于 GIT 存储库中,C# 中的 Unity3D 代码是项目文件中客户端 ZIP 的一部分。

于 2015-10-25T13:13:12.547 回答