Question

Je suis en train de créer un programme qui affiche combien de lisser les numéros sont dans un intervalle.Une partie du code est ici:

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
   ).

Il y a aussi un prédicat primes qui crée tous les nombres premiers à partir de 2 pour B.

Par exemple, si B = 11, puis FilPrimes = [2,3,5,7,11].

Quand je l'appelle countsmooth en SWI-Prolog comme ?- countsmooth(1, [2,3,5,7,11,13,17,19,23], 1, 100000000, Count).Je obtenir un résultat.

Mais quand je l'appelle smooth comme ?- smooth(2,100,10000,Smooths). J'obtiens l'erreur suivante:

ERROR: is/2: Arguments are not sufficiently instantiated

Pas de solution correcte

Autres conseils

Je suis vraiment désolé.J'ai essayé toute la journée pour trouver ce qui n'allait pas et finalement j'ai vu que dans les mêmes endroits que j'avais écrit "FilPrimes" et dans quelques autres endroits "Filprimes".

Je suis comme un idiot!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top