2014-10-17 1 views
0

Я пытаюсь написать программу для решения башен проблемы ханой в Прологе. Ни одна из должностей здесь не помогла мне, поэтому я решил попросить себя. Я написал следующий код. Он хорошо работает на 2-х дисках, но переходит в бесконечный цикл для 3.Пролог - Башни Ханоя

hanoi(1,A,B,_,[(A,B)]). 
hanoi(X,A,B,C,Y):- 
    hanoi(X2,A,C,B,Y1), 
    hanoi(1,A,B,_,[Y2]), 
    hanoi(X2,C,B,A,Y3), 
    append(Y1,[Y2|Y3],Y), 
    X2 is X-1. 

Это называется следующим образом:

?- hanoi(3, a, b, c, Y). 

а, Ь, с колышки. 3 - количество дисков, а X - это то место, где мы хотим получить результат.

Мне нужно получить результат в Y. Я пытаюсь рекурсивно найти ходы для дисков X-1 с привязки от 1 до 3 с использованием 2, 1 диска с привязкой 1 к 2, диски X-1 из привязки 3 до 2 и добавить их. Я не понимаю, что я делаю неправильно. Любая помощь или руководство будут оценены! Благодаря!

+3

Что означают аргументы? Какие из них должны быть приведены к типу термина? Альтернативно: покажите нам, как вы называете этот предикат. –

ответ

2

Очевидная проблема -

Если у вас есть конъюнкция, как:

a, b, c 

У вас есть два чтения этого, логические и процедурные. Логическим показанием будет:

«Соединение верно, если a истинно, а b истинно, а c - это правда».

Процедурный чтение:

«Соединение будет успешным, если a оценивается и успешно, то b оценивается и он также успешно, а затем c оценивается и также успешно.» (или, другими словами, сделайте глубину-первый поиск пространства для решения вопросов)

Если вы достаточно осторожны, процедурное чтение не нужно обсуждать с вашим кодом. Однако это происходит только в том случае, когда все подцели в соединении имеют полное совпадение с логическим и процедурным чтением.

Нарушитель здесь is/2. Это не имеет чисто логического смысла. Он оценивает правый операнд (арифметическое выражение) и объединяет результат с левой (как правило, несвязанной переменной).

Здесь у вас есть соединение (в теле второго предложения), которое гласит, что «оцените a(X), тогда, если это удастся, найдите значение X». Очевидная проблема заключается в том, что a(X) требует, чтобы значение X оценивалось таким образом, чтобы оно заканчивалось.

Итак, переместите is перед всеми подцелями, использующими его результат, или изучите использование ограничений.

+0

Спасибо большое! Ваше объяснение очень полезно. – usb

 Смежные вопросы

  • Нет связанных вопросов^_^