8

Prolog の初心者として、Prolog の可換式はまったく直感的ではないことがわかりました。

たとえば、X と Y が 1 つのファミリに属していることを表現したい場合は、次のようになります。

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

また、「交換可能」にするために、定義に次を追加する必要があります。

      married(Y,X);
      relative(Y,X);
      father_son(Y,X).

しかし、エレガントなコードを書きたいので、Prologを使用しています...したがって、元のコードに(上記の3行ではなく)1行だけ追加したいと思います:

      family(Y,X).

ここがPOINTです。それは未終了につながります!プロローグがそれほど「論理的」ではないのはなぜですか? そして、未終了につながらない、このきちんとした 1 行の表現に代わるものはありますか?

素敵な週末を!ワット

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 に答える