Prolog:没有按预期执行代码

时间:2010-04-06 07:07:09

标签: prolog artificial-intelligence

基本上我试图让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,每个都使用面向(_)格式检查不同的方向,但swipl不喜欢这样并抛出错误。

1 个答案:

答案 0 :(得分:1)

如果第二个变体的作用比find_action/4的最后一个参数的差异有效。我想如果你将right置于第一个变种中,它将停止工作 我想你可以通过使用retractall/1assert/1来达到“魔力”,因为你在那里混淆回溯。你的系统有副作用,所以一旦你成功find_action/4,你就可以减少你的选择,或者做一些反措施,以便在进一步统一的回溯中重新考虑动态facing/1的初始状态。登记/> 尝试在find_action/4之后添加一些跟踪以查看它是否真的失败或进一步失败。