1

次のような事実が与えられた場合:

  • ジェイクはニックより賢い
  • ニックはウェスより賢い
  • ウェスはディックより賢い

Jake の方が Dik よりも賢いかどうかを判断する再帰的なプログラムを作成してください。

私が持っている解決策は次のとおりです。

smarter(jake, nik).
smarter(nik, wes).
smarter(wes, dik).
smarter(X, Y) :-
    smarter(X, Z),
    smarter(Z, Y).

出力:

?- smarter(jake, dik).
True

しかし、私がそれを交換すると:

?- smarter(dik, jake)

出力に「ERROR: Out of local stack」と表示されます。出力に「False」と表示する必要があります。どうすれば修正できますか?

ありがとう

4

1 に答える 1

0

あなたのコードは証明できます

        ?- smarter(jake, dik).

X = jake、Y = dik を使用すると、smarter(jake,nik) (これは事実です)、次に smarter(nik,dik) となるような Z=nik が見つかります (これは、X1=nik、Y1=dik を考慮して証明されます) 、Z1=wes)。

ただし、証明するために

       ?- smarter(dik, jake).

X =dik、Y=jake の場合、prolog は smarter(dik, Z) のような Z を必要とします。しかし、より賢いという事実はありません(dik, Z)。次に、ルールが再び適用されます...そしてループがあります。

修正するアイデア (少なくともこの特定の例) は、事実とルールを区別することです。

isSmarter(jake, nik).
isSmarter(nik, wes).
isSmarter(wes, dik).

smarter(X, Y) :- isSmarter(X,Y).

smarter(X, Y) :-
    isSmarter(X, Z),
    smarter(Z, Y).

これはうまくいくはずです。

于 2015-02-26T13:16:49.657 に答える