作为一个初学者到Prolog的,我发现在序言的可交换表达式是相当不直观。
例如,如果我想表达的X和Y是在一个家庭,如:
family(X,Y) :-
married(X,Y);
relative(X,Y);
father_son(X,Y).
我还要补充以下的定义,以使其“交换”:
married(Y,X);
relative(Y,X);
father_son(Y,X).
但是,我们使用Prolog的,因为我们要编写优雅的代码......所以,我希望只添加一条线(而不是上述三)原文:
family(Y,X).
这里是点。 它会导致untermination! 为什么是序言没有那么“逻辑”? 并且在那里这种整齐一行表达不导致untermination替代?
尼斯周末! 瓦
有问题family(X,Y) :- family(Y,X).
规则的部分是,它保持在每一级无条件与自身统一,并保持递归下降; 没有退出条件出这个递归。
你应该在水平之上的说法交换:
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).
或者,你可以做以下对称的基本规则下才有意义:
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).
怎么样:
relatives(X,Y) :-
married(X,Y);
relative(X,Y);
father_son(X,Y).
family(X,Y) :-
relatives(X,Y);
relatives(Y,X).