问题在于family(X,Y) :- family(Y,X).
该规则的一部分是它在每个级别上都保持无条件地与自身统一,并不断向下递归;此递归没有退出条件。
您应该在以下级别进行参数交换above:
family(X,Y) :-
is_family(X,Y);
is_family(Y,X).
is_family(X,Y) :-
married(X,Y);
relative(X,Y);
father_son(X,Y).
或者,您可以制定基本规则below有意义的地方是对称的:
is_married(X,Y) :-
married(X,Y);
married(Y,X).
is_relative(X,Y) :-
relative(X,Y);
relative(Y,X).
你现在可以重写你的family
规则如下:
family(X,Y) :-
is_married(X,Y);
is_relative(X,Y);
father_son(X,Y);
father_son(Y,X).