2010-04-06 41 views
1

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

回答

1

如果第二个变体的作用超过了find_action/4的最后一个参数的差异。我想如果你像第一个变种那样放置right它将停止工作。
我想你可以通过使用retractall/1assert/1来击中“一些魔法”,因为你在那里混淆回溯。你的系统有副作用,所以一定要在find_action/4上成功,否则你会削减你的选择,或者采取一些反制措施来恢复动态回溯的初始状态。
尝试在find_action/4后面放一些痕迹,看看它是真的失败还是失败了。