2010-07-21 2 views
1

Я пытаюсь создать программу, которая печатает, сколько гладких чисел находится в пределах интервала. Часть кода здесь:SWI-Prolog: ОШИБКА: is/2: Аргументы недостаточно созданы

countsmooth(_, [], _, _, Count) :- 
    Count is 0. 
countsmooth(X, [H|T], Min, Max, Count) :- 
    ( Y is X*H, 
     Y =< Max 
    -> ( Y >= Min 
     -> NewX is X*H, 
     countsmooth(X, T, Min, Max, NCount1), 
     countsmooth(NewX, [H|T], Min, Max, NCount2), 
     Count is (1+NCount1+NCount2) 

     ; NewX is X*H, 
     countsmooth(X, T, Min, Max, NCount1), 
     countsmooth(NewX, [H|T], Min, Max, NCount2), 
     Count is (NCount1+NCount2) 
    ) 
    ; Count is 0 
    ). 

smooth(B, I, J, Smooths) :- 
    ( B =< 1 
    -> Smooths is 0 
    ; I =:= 1 
    -> primes(B, FilPrimes), 
     countsmooth(1, Filprimes, I, J, Count), 
     Smooths is (1+Count) 
    ; primes(B, FilPrimes), 
     countsmooth(1, Filprimes, I, J, Count), 
     Smooths is Count 
    ). 

Существует также предикат primes, который создает все простые числа от 2 до B.

Например, если B = 11, то FilPrimes = [2,3,5,7,11].

Когда я звоню countsmooth в SWI-Prolog, например ?- countsmooth(1, [2,3,5,7,11,13,17,19,23], 1, 100000000, Count). Я получаю результат.

Но когда я называю smooth?- smooth(2,100,10000,Smooths). как я получаю следующее сообщение об ошибке:

ERROR: is/2: Arguments are not sufficiently instantiated 

ответ

1

Мне очень жаль. Я весь день пытался выяснить, что происходит, и, наконец, я увидел, что в тех же местах я написал «FilPrimes» и в некоторых других местах «Filprimes».

Я такой идиот!

+2

Как правило, вы можете отслеживать выполнение с помощью графического индикатора SWI-Prolog. Чтобы узнать, что происходит при вызове цели, попробуйте? - gtrace, Goal. – mat