SWI-Пролог:ОШИБКА:есть/2:Аргументы недостаточно конкретизированы
-
18-09-2020 - |
Вопрос
Я пытаюсь создать программу, которая печатает, сколько гладких чисел находится в интервале.Часть кода находится здесь:
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-Прологе вроде?- 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
Нет правильного решения
Другие советы
Мне очень жаль.Я целый день пытался выяснить, что не так, и наконец увидел, что в тех же местах написано «FilPrimes», а в некоторых других местах «Filprimes».
Я такой идиот!
Не связан с StackOverflow