0

私のクラスの古い決勝戦から:

ここにいくつかのプロローグコードがあります:

mystery(1, 1).
mystery(N, F) :-
    N1 is N-1,
    mystery(N1,F1),
    F is F1*N.

問 1: P で統一されている値は何ですか?

mystery(3, P).

質問 2: Prolog がミステリーを生成して回答した後にセミコロンが押された場合、インタープリターは最終的に "ERROR: Out of local stack" を報告します。このエラーが発生する理由と、エラーを回避するためにミステリーを変更するにはどうすればよいですか?


質問 1: わかった

P = 6 ?

質問 2: セミコロンを押してすべての回答を取得すると、out of local stack エラーが発生します。このコードが何を達成しようとしているのか、またはそれを修正する方法がわからないので、ローカルスタックから出ません。何か案は?

4

2 に答える 2

2

out of stack エラーはおそらく、mystery(1, F1)which が に解決されmystery(1, 1)てさらに解決策を求めたときに、 を呼び出す次の句にヒットしたためですmystery(0, F1)。この時点で、解決策を見つけようとしますが、一致する唯一の句は formystery(-1, F1)を呼び出し、その呼び出しは formystery(-2, F1)などです。これは、保留中の各一致がスタック スペースを使用するため、最初の数値が 1 にラップ アラウンドするか、スタック オーバーフローが発生するまで、一致が呼び出されることを意味します。

于 2010-12-08T22:19:16.463 に答える
0

@David Thornley は、より多くの回答を検索するとスタックが爆発する理由をすでに説明しています。カット演算子を使用して修正できます。

mystery(1, F) :- !, F is 1.
mystery(N, F) :-
    N1 is N-1,
    mystery(N1,F1),
    F is F1*N.

ここでカットすると、最初の引数が の1場合、2 番目のルールが適用されないようになります。

于 2010-12-08T22:39:20.687 に答える