替代表达Prolog的“交换性”?(Alternative to express “Commutat

2019-07-29 02:45发布

作为一个初学者到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替代?

尼斯周末! 瓦

Answer 1:

有问题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).


Answer 2:

怎么样:

relatives(X,Y) :-
  married(X,Y);
  relative(X,Y);
  father_son(X,Y).

family(X,Y) :-
  relatives(X,Y);
  relatives(Y,X).


文章来源: Alternative to express “Commutativity” in Prolog?