Луис, мне не совсем понятно, что вы собираетесь делать с этим кодом, но пара комментариев, которые, возможно, могут помочь.
Вещи, начинающиеся с заглавной буквы в Прологе, - это переменные, с которыми нужно сопоставлять правила. _
- это специальный символ, который можно использовать вместо имени переменной, чтобы указать, что любое значение может совпадать.
Следовательно,
next_safe(_)
может дать вам верный / ложный ответ, только если вы дадите ему конкретное значение. Одним из основных преимуществ Prolog является способность объединяться с переменной посредством обратного отслеживания (как сказал только один). Это будет означать, что при правильном написании вы можете просто спросить Prolog next_safe(X).
, и он вернет все возможные значения (безопасные ходы), которые объединяются с X.
Чтобы вернуться к первому пункту о заглавных буквах. Это означает, что OK
на самом деле является переменной, ожидающей сопоставления. Это фактически пустое поле, которое вы пытаетесь сопоставить с другим пустым полем. Я думаю, что вы намереваетесь использовать значение ok
, которое отличается. Вы не присваиваете переменные так же, как в других стилях программирования. Что-то вроде следующего может быть ближе к тому, что вы ищете, хотя я все еще не уверен, что это правильно, поскольку похоже, что вы пытаетесь назначить вещи, но я не уверен, как работает ваш nth1
.
Cells = [ok, _, _, _, _, _] .
...
next_safe(NewLoc) :-
facing(CurrentDirection),
delta(CurrentDirection, Delta),
in_cell(OldLoc),
NewLoc is OldLoc + Delta,
nth1(NewLoc, Cells, ok).