3

gen(N,R):

R0 から N-1 までの値です。 N非ゼロの正の整数。N常に与えられます。

例: ?- genN(2,R). このように実装しましたがR=0;R=1.、「out of local static error」があります:

gen(X,0).
gen(X,R) :-
  gen(X,R1),
  R is R1+1,
  R<X,       % why this line
  R>=0.      % and this line can't keep the range successfully?

結果:

 ?- genN2(3,R).  
    R = 0 ;
    R = 1 ;
    R = 2 ;
    ERROR: Out of local stack
4

1 に答える 1

3

プログラムが終了しない理由を理解するには、を使用します。この目的falseのために、追加した目標が無関係である理由を理解するのに役立ついくつかの追加の目標を挿入します。この結果のフラグメントが終了しない場合、元のプログラムも終了しません。ご覧のとおり、その部分ではあまり何も起きていません。実際、あなたのプログラムは決して終了しません。

gen(_X,0) :- false .
ゲン(X、R): -
  gen(X,R1), false ,
   R は R1+1 ,
   R<X ,
   R>=0 .

(さらにいくつかの問題があります。あなたの定義は、gen(-1,0)おそらく意図したものではないような目標にも当てはまります。)

これを一度に解決する最善の方法は、より複雑な処理や単純な使用ではなく、 を使用することです。(is)/2between/3

gen(N0, R) :-
   N1 is N0-1,
   between(0, N1, R).
于 2015-07-16T21:18:30.863 に答える