Вы столкнулись с явлением левая рекурсия . Решение цели subset(X, Z)
сводится к решению цели subset(X, Y)
с новой несвязанной переменной Y
, и это приводит к решению той же цели subset(X, Z)
и т. Д. До бесконечности. Левых рекурсий следует избегать.
Обычный подход состоит в том, чтобы разобраться в основных фактах и правилах транзитивных замыканий. Вы можете попробовать:
subset1(tomatoes, fruits).
subset1(fruits, food).
subset(X, Y) :- subset1(X, Y).
subset(X, Z) :- subset1(X, Y), subset(Y, Z).
member1(t1, tomatoes).
member1(t2, tomatoes).
member(X, Y) :- member1(X, Y).
member(X, Z) :- member1(X, Y), subset(Y, Z).
?- member(t1, food). ===> TRUE
В этой формулировке нет рекурсии слева. Сначала проверяется прямой факт, который может прекратить рекурсию. Только при отсутствии факта выполняется рекурсивный вызов.