Ошибка бесконечной рекурсии с условиями? - PullRequest
0 голосов
/ 08 июля 2019

В моей базе данных есть следующие факты и правила.

above(b, a).
above(c, b).
above(d, c).
above(X,Y):-above(X,Z),above(Z,Y).
below(X,Y):- above(Y,X).

Это работает так, как предназначено для положительного случая, поэтому, если я сделаю запрос,

above(c,a).

Возвращаемое значение - True.Однако, когда я попробовал запрос ниже, ожидая Ложь,

above(a,c).

Я получил сообщение,

  Stack sizes: local: 0.2Gb, global: 16Kb, trail: 3Kb
  Stack depth: 2,839,964, last-call: 0%, Choice points: 12
  Probable infinite recursion (cycle):
    [2,839,964] above(a, _1394)
    [2,839,963] above(a, _1420)

Насколько я понял, поскольку атома нетX связан с above(a,X)., и действительно этот запрос возвращает False, первое условие моего правила не будет выполнено, и этого будет достаточно, чтобы сделать вывод, что запрос является False.Похоже, что это не так.Как я могу настроить правила так, чтобы они возвращали False, все еще работая, как предназначено для положительных случаев?

1 Ответ

1 голос
/ 08 июля 2019

Поскольку above(a, X) не соответствует первым трем предложениям (фактам), оно входит в четвертое предложение above(X, Y) :- ....Самое первое, что вы делаете после этого - above(X, Z), то есть above(a, Z).Затем он пробует первые три предложения, которые терпят неудачу, и затем он снова достигает above(X, Y).Это источник вашей бесконечной рекурсии.

Решение состоит в том, чтобы отделить ваше правило от ваших фактов, переименовав один из них, например:

is_above(b, a).
is_above(c, b).
is_above(d, c).

above(X,Y):- is_above(X,Z), above(Z,Y).
below(X,Y):- above(Y,X).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...