2016-11-28 1 views
0

J'essaie de résoudre un problème d'eau, pichet (un 7L, un 4L, obtenir 5L dans le pichet 7L) en utilisant la première recherche dept. Cependant, quelque chose continue de mal tourner chaque fois que j'essaie d'obtenir un nouvel état de retour d'une de mes actions. Prolog CodeProfondeur Première recherche Prolog

Je ne peux pas comprendre ce qui se passe mal, c'est ce que la sortie ressemble après trace: enter image description here

Merci à l'avance pour toute aide!

Répondre

0

Vous devez copier et coller votre code dans votre question; nous ne pouvons pas le copier et le coller à partir de vos images, ce qui le rend plus efficace pour vous aider, ce qui diminue la probabilité que nous vous aidions.

Quelques problèmes que je remarqué quand même:

  • Votre première règle pour go_to_goal/3 ne parle pas de la relation entre ClosedList et Path. Vous calculerez le chemin mais ne pourrez jamais le communiquer à l'appelant. (Encore une fois, vous ignorez également Path dans solve/0 ...) Si votre système Prolog vous donne des avertissements «variable singleton», vous ne devriez jamais les ignorer! Vous utilisez l'opérateur == incorrect. L'objectif State == (5, X) indique qu'à la fin vous cherchez une paire dont le premier composant est 5 (cette partie est bien) et le second composant est une variable non liée. En fait, après vos calculs, le second composant de la paire sera lié à un terme arithmétique. Cette comparaison échouera toujours. Vous devez utiliser l'opérateur = (unification) à la place. == est rarement utilisé, dans des situations particulières.
  • Si vous mettez un terme tel que X+Y-7 en tête d'une règle, il ne sera pas évalué par un nombre. Si vous voulez qu'il soit évalué à un nombre, vous devez utiliser is/2 dans le corps de vos règles.
  • Votre problème le plus immédiat, cependant, est le suivant (visible à partir de la trace que vous avez posté): La deuxième clause de go_to_goal/3 essaie d'appeler action/2 avec une paire (0, 0) comme premier argument. Cela échoue toujours parce que le premier argument de chaque clause de action/2 est un terme state(X, Y). Si vous changez cela en state(0, 0) en go_to_goal/3, vous devriez être en mesure de faire un petit peu de progrès.