2015-07-16 6 views
3

gen(N,R):генерировать ряд целых чисел - "из локального стека" [начинающий]

R это значение от 0 до N-1, в порядке. N non-zero positive int. N всегда будет предоставлен.

Например: ?- genN(2,R). дает R=0;R=1. я реализовал, как это, но у него есть «из локальной статической ошибки»:

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 

ответ

3

Чтобы понять, почему ваша программа не завершается, используйте . С этой целью мы добавим дополнительные цели false, которые помогут понять, почему цели, которые вы добавили, не имеют значения. Если этот результирующий фрагмент не завершится, ваша оригинальная программа также не завершится. Как вы можете видеть, в этой части не так много. На самом деле ваша программа закончится никогда.

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

(Есть еще несколько вопросов:. Ваше определение будет справедливо и для цели, как gen(-1,0), который, вероятно, не то, что вы хотели)

Лучший способ решить эту проблему сразу, чтобы использовать вместо более сложных для обработки (is)/2 или просто использовать between/3:

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

 Смежные вопросы

  • Нет связанных вопросов^_^