Как я могу сделать вывод, используя пролог? - PullRequest
2 голосов
/ 06 апреля 2020

Содержимое pl-файла.

isabove(g,b1).
isabove(b1,w1).
isabove(w2,b2).
isabove(b2,b3).
isabove(X,Z):-isabove(X,Y),isabove(Y,Z).
color(g,gray).`enter code here`
color(b1,blue).
color(b2,blue).
color(b3,blue).
color(w1,white).
color(w2,white).

затем Когда выполняется следующая команда? - isabove (X, Y).

results
X = g,
Y = b1 ;
X = b1,
Y = w1 ;
X = w2,
Y = b2 ;
X = b2,
Y = b3 ;
X = g,
Y = w1 ;

ERROR: Stack limit (2.0Gb) exceeded
ERROR:   Stack sizes: local: 2.0Gb, global: 2Kb, trail: 0Kb
ERROR:   Stack depth: 24,399,533, last-call: 0%, Choice points: 5
ERROR:   Probable infinite recursion (cycle):
ERROR:     [24,399,533] user:isabove(w1, _814)
ERROR:     [24,399,532] user:isabove(w1, _834)
?-  =

'isabove(X,Z):-isabove(X,Y),isabove(Y,Z). 

Эта часть, кажется, вызывает проблему, но мне интересно, почему это проблема и как ее исправить, чтобы получить желаемый ответ. Ответы я подожду. Спасибо.

1 Ответ

2 голосов
/ 06 апреля 2020

Определение isabove как:

isabove(X,Z) :- isabove(X,Y), isabove(Y,Z).

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

Какой обычно делает делает предикат для знания, и тот, который определяет транзитивное замыкание . Действительно:

above(g,b1).
above(b1,w1).
above(w2,b2).
above(b2,b3).

isabove(X, Y) :-
    above(X, Y).
isabove(X,Z) :-
    above(X,Y),
    isabove(Y,Z).

Здесь мы гарантируем прогресс , поскольку above/2 объединит X и Y, и в итоге мы достигли верхнего элемента, поэтому он не сможет найдите элемент выше.

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