2010-04-06 17 views
1

Fondamentalement, je tente d'avoir un agent d'IA naviguer dans un monde basé sur des percepts donnés. Mon problème est de savoir comment l'agent se déplace. Fondamentalement, j'ai créé find_action/4 de telle sorte que nous passions aux percepts, à l'action, à la cellule courante et à la direction de l'agent. Le code entier ressemble à: http://wesnoth.pastebin.com/kdNvzZ6YProlog: N'exécutant pas le code comme prévu

Mon problème concerne principalement les lignes 102 à 106. Fondamentalement, dans sa forme actuelle, le code ne fonctionne pas et la fonction find_action est ignorée même lorsque l'agent est en fait orienté vers la droite (J'ai vérifié ceci). Ce code est cassé comme suit:

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

Cependant, après quelques essais, je conclus que les travaux suivants:

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

Je ne suis pas sûr tout le pourquoi. J'ai aussi essayé de créer plusieurs find_action identiques, chacune vérifiant une direction différente en utilisant le format facing (_), mais swipl n'aime pas ça et lance une erreur.

Répondre

1

Si la deuxième variante fonctionne à la différence du dernier paramètre de find_action/4. Je suppose que si vous mettez là right comme dans la première variante, il va cesser de fonctionner.
Je suppose que vous pouvez frapper "un peu de magie" en utilisant ce retractall/1 et assert/1, parce que vous êtes confus backtracking là-bas. Votre système a un effet secondaire, alors assurez-vous qu'une fois que vous réussissez sur find_action/4, vous couperez vos alternatives ou vous ferez quelques contre-mesures pour restreindre l'état initial de la dynamique facing/1 en revenant de l'unification ultérieure.
Essayez de mettre quelques traces juste après find_action/4 pour voir si elle échoue vraiment ou si elle échoue davantage.