views:

38

answers:

1

Basically I am attempting to have an AI agent navigate a world based on given percepts. My issue is handling how the agent moves. Basically, I have created find_action/4 such that we pass in the percepts, action, current cell, and the direction the agent is facing. As it stands the entire code looks like: http://wesnoth.pastebin.com/kdNvzZ6Y

My issue is mainly with lines 102 to 106. Basically, in it's current form the code does not work and the find_action is skipped even when the agent is in fact facing right (I have verified this). This broken code is as follows:

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

However, after some experimentation I have concluded that the following works:

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

I am not entire sure why this is. I've attempted to create several identical find_action's as well, each checking a different direction using the facing(_) format, however swipl does not like this and throws an error.

Any help would be greatly appreciated.

+1  A: 

If second variant works than difference in last parameter of find_action/4. I guess if you'll put there right as in first variant it will stop working.
I guess that you can hit "some magic" by using that retractall/1 and assert/1, because you are confusing backtracking there. Your system have side effect, so be sure that once you succeed on find_action/4 you'll cut your alternatives or will do some counter-measures to restrore initial state of dynamic facing/1 on backtracking from further unification.
Try to put some traces just after find_action/4 to see is it really fails or it fails further.

ony