Я не могу понять, почему следующий запрос из данного кода Пролога генерирует ошибку Out of local stack
.
Пролог-код:
likes(g,c).
likes(c,a).
likes(c,b).
likes(b,a).
likes(b,d).
likes(X,Z) :- likes(X,Y), likes(Y,Z).
запрос
?- likes(g,X).
приводит к
X = c ;
X = a ;
X = b ;
ERROR: Out of local stack
Редактировать 1 Вот как я думаю, что Пролог должен обрабатывать этот запрос,
likes(g,c) is a fact, so X={c}
likes(g,b) <= likes(g,c) and likes(c,b), so X={c,b}
likes(g,a) <= likes(g,b) and likes(b,a), so X={c,b,a}
likes(g,d) <= likes(g,b) and likes(b,d), so X={c,b,a,d}
likes(g,a) and false, so nothing to add to X
likes(g,d) and false, so nothing to add to X
end of backtracking search.
Редактировать 2 Мне удалось получить то, что я искал, с помощью следующей модификации кода:
likes(g,c).
likes(c,a).
likes(c,b).
likes(b,a).
likes(b,d).
indirect_likes(A,B):- likes(A,B).
indirect_likes(A,C):- likes(B,C), indirect_likes(A,B).
запрос
?- косвенные_лайки(г,какой).
приводит к
Which = c ;
Which = a ;
Which = b ;
Which = a ;
Which = d ;
false.
Тем не менее, есть еще кое-что, что я не могу понять в обосновании. Если я изменю последнее правило на
indirect_likes(A,C):- indirect_likes(A,B), likes(B,C).
Тогда я получаю ERROR: Out of local stack
! Насколько я знаю, логическая конъюнкция коммутативна.
supp/2
? - person C.B.   schedule 07.01.2014