【问题标题】:Prolog: Not executing code as expectedProlog:未按预期执行代码
【发布时间】:2014-01-25 22:08:29
【问题描述】:

基本上,我试图让 AI 代理根据给定的感知导航世界。我的问题是处理代理如何移动。基本上,我创建了 find_action/4 以便我们传递感知、动作、当前单元格和代理所面临的方向。就目前而言,整个代码如下所示:http://wesnoth.pastebin.com/kdNvzZ6Y

我的问题主要在于第 102 到 106 行。基本上,在当前形式下,代码不起作用,即使代理实际上面向右侧,也会跳过 find_action(我已经验证了这一点)。这个破代码如下:

% If we are headed right, take a left turn
find_action([_, _, _, _, _], Action, _, right) :-
   retractall(facing(_)),
   assert(facing(up)),
   Action = turnleft .

但是,经过一些实验,我得出以下结论:

% If we are headed right, take a left turn
find_action([_, _, _, _, _], Action, _, _) :-
   facing(right),
   retractall(facing(_)),
   assert(facing(up)),
   Action = turnleft .

我不完全确定这是为什么。我也尝试创建几个相同的 find_action,每个都使用 faces(_) 格式检查不同的方向,但是 swipl 不喜欢这样并抛出错误。

【问题讨论】:

    标签: prolog artificial-intelligence


    【解决方案1】:

    如果第二个变体比find_action/4 的最后一个参数的差异有效。我想如果您将right 放在第一个变体中,它将停止工作。
    我想你可以通过使用retractall/1 和assert/1 来达到“一些魔力”,因为你在那里混淆了回溯。您的系统有副作用,因此请确保一旦您在find_action/4 上取得成功,您将削减替代方案或采取一些对策来恢复动态facing/1 的初始状态,以便从进一步统一回溯。
    尝试在find_action/4 之后添加一些痕迹,看看是真的失败了还是进一步失败了。

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多