2015-07-16 1 views
3

gen(N,R):générer une gamme de ints - "hors de pile locale" [Débutant]

R est compris entre 0 et N-1, dans l'ordre. N int. Int. N sera toujours donné.

Par exemple: ?- genN(2,R). donne R=0;R=1. Je mis en œuvre comme ça, mais il a « de l'erreur statique locale »:

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? 

Résultat:

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

Répondre

3

Pour comprendre pourquoi votre programme ne se termine pas, utilisez un . À cette fin, nous insérons quelques objectifs supplémentaires false qui aident à comprendre pourquoi les objectifs que vous avez ajoutés ne sont pas pertinents. Si ce fragment ne se termine pas, votre programme d'origine ne s'arrête pas non plus. Comme vous pouvez le voir, il n'y a pas beaucoup de choses dans cette partie. En fait, votre programme se terminera jamais.

gen(_X,0) :- false. 
gen(X,R) :- 
    gen(X,R1), false, 
    R is R1+1, 
    R<X, 
    R>=0.

(Il y a quelques autres questions. Votre définition serait vrai aussi pour un objectif comme gen(-1,0) ce qui est probablement pas ce que vous aviez l'intention)

La meilleure façon de résoudre ce problème est d'utiliser à la fois au lieu du plus complexe à gérer (is)/2 ou simplement utiliser between/3:

gen(N0, R) :- 
    N1 is N0-1, 
    between(0, N1, R).