Определение последней остановки линии метро - PullRequest
0 голосов
/ 07 ноября 2018

Моделирование остановок подземного трубопровода примерно так:

stop(line1, 1, a).
stop(line1, 2, b).
stop(line1, 3, d).
stop(line1, 4, e).

Я пытаюсь определить last(L, S), что верно, если станция S является последней станцией в линии L. Так что last(line1, e) верно, но last(line1, d) нет.

Я пытался last(L, S) :- stop(L, N, S), \+stop(L, N+1, _)., но он возвращает true для каждой остановки на линии, и я не понимаю, почему. Станция является последней остановкой линии, если она а) существует на этой линии и б) если линия не имеет остановки после нее. Правильно?

Полагаю, это как-то связано с отрицанием - я все еще склоняю голову к отрицанию в Прологе ...

1 Ответ

0 голосов
/ 07 ноября 2018

Распространенной ошибкой в ​​Прологе является то, что Пролог не прикрепляет семантику к +, - и т. Д.

Если вы напишите:

?- X = 3 + 1.
X = 3+1.

он не интерпретирует это как математическое выражение, где он вычисляет результат, он просто видит его как функтор с двумя аргументами.

Конечно, Пролог может интерпретировать этот термин как математическое выражение, и, если переменные правильно созданы, вычислить результат. Для этого используется is/2 [swi-doc] для этого:

?= X is 3 + 1.
X = 4.

Итак, мы можем оценить N+1 и сохранить его в переменной:

last(L, S) :-
    stop(L, N, S),
    <b>N1 is N+1,</b>
    \+stop(L, N1, _).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...