Глубина Первый поиск Пролог
Я пытаюсь решить проблему с водой, кувшином (один 7L, один 4L, получить 5L в 7L кувшине), используя поиск в отделе. Однако, что-то продолжает идти не так, когда я пытаюсь вернуть новое состояние от одного из моих действий. Код Пролога
Я не могу понять, что идет не так, вот как выглядит результат после трассировки: введите описание изображения здесь
Заранее благодарю за любую помощь!
1 ответ
Решение
Вы должны скопировать и вставить свой код в свой вопрос; мы не можем копировать и вставлять его из ваших изображений, что делает его более полезным для вас, что, в свою очередь, снижает вероятность того, что мы вам поможем.
В любом случае я заметил некоторые проблемы:
- Ваше первое правило для
go_to_goal/3
не говорит об отношении междуClosedList
а такжеPath
, Вы вычислите путь, но никогда не сможете сообщить его вызывающей стороне. (Опять же, вы также игнорируетеPath
вsolve/0
...) Если ваша система Prolog выдает вам предупреждения о "одноэлементной переменной", вы никогда не должны игнорировать их! - Вы используете
==
оператор не прав. ЦельState == (5, X)
утверждает, что в конце вы ищете пару, где первый компонент равен 5 (эта часть в порядке), а второй компонент является несвязанной переменной. Фактически, после ваших вычислений второй компонент пары будет связан с некоторым арифметическим термином. Это сравнение всегда будет неудачным. Вы должны использовать=
(унификация) вместо оператора.==
используется редко, в особых ситуациях. - Если вы поставите термин, как
X+Y-7
в заголовок правила, оно не будет оцениваться по числу. Если вы хотите, чтобы он был оценен в число, вы должны использоватьis/2
в теле ваших правил. - Однако вашей самой непосредственной проблемой является следующее (видно из трассы, которую вы опубликовали): Второе предложение
go_to_goal/3
пытается позвонитьaction/2
с парой(0, 0)
в качестве первого аргумента. Это всегда терпит неудачу, потому что первый аргумент каждого предложенияaction/2
это терминstate(X, Y)
, Если вы измените это наstate(0, 0)
вgo_to_goal/3
, вы должны быть в состоянии сделать немного прогресса.