8

作为 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).

这是要点。它导致终止!为什么 prolog 不那么“合乎逻辑”?是否有替代这种简洁的单行表达式不会导致终止的替代方法?

周末愉快!瓦

4

2 回答 2

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).
于 2012-04-21T10:13:26.550 回答
1

怎么样:

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

family(X,Y) :-
  relatives(X,Y);
  relatives(Y,X).
于 2012-04-21T10:06:03.573 回答