作为Prolog的初学者,我发现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).
这是POINT。它会导致不确定!为什么序言不那么“合乎逻辑”?是否有一个替代这个整齐的单行表达式,不会导致不确定?
周末愉快! 瓦
答案 0 :(得分:11)
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).
答案 1 :(得分:1)
怎么样:
relatives(X,Y) :-
married(X,Y);
relative(X,Y);
father_son(X,Y).
family(X,Y) :-
relatives(X,Y);
relatives(Y,X).