Почему Prolog возвращает true для этого запроса - PullRequest
0 голосов
/ 09 января 2020

Пролог ньюб ie здесь. У меня есть эта программа:

edge(a,b).
edge(b,c).

path(X,X).
path(X,Y):- edge(X,Z),path(Z,Y).

Я не могу понять, почему Пролог возвращает true для этого запроса:

path(a,c)

1 Ответ

0 голосов
/ 09 января 2020

Возвращает true, потому что механизм пролога может доказать ваш запрос.

Вы можете представить, что механизм пролога делает это, когда вы запрашиваете path(a,c):

  • первое предложение path/2 терпит неудачу, потому что не может объединить X с a и c одновременно
  • , поэтому он входит во второе предложение, где X объединяется с a и Y с c, тогда он вызывает edge(a, Z).
  • Поскольку существует факт edge(a,b), Z объединяется с b. Затем он пытается доказать path(b, c)
  • Первое предложение для path/2 снова не выполняется, поскольку он не может объединить X с b и c одновременно
  • , поэтому он входит во второе предложение, где X объединяется с b и Y с c, затем вызывает edge(b, Z). Обратите внимание, что эти переменные (X, Y, Z не являются теми же переменными, что и при первом вызове пути). Затем он пытается доказать path(c, c)
  • Теперь первое предложение для пути / 2 успешно выполняется, так как объединяет X с c и дальнейших целей нет.
  • Предыдущие вызовы path / 2 также успешны, потому что они были в конечной цели в каждом предложении.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...