Domanda

Sto cercando di creare un programma che stampa il numero di numeri lisci all'interno di un intervallo.Una parte del codice è qui:

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

C'è anche un predicato primes che crea tutti i numeri primi da 2 a B.

Ad esempio, se B = 11, quindi FilPrimes = [2,3,5,7,11].

Quando chiamo countsmooth in SWI-Prolog come ?- countsmooth(1, [2,3,5,7,11,13,17,19,23], 1, 100000000, Count). Ottengo un risultato.

ma quando chiamo smooth come ?- smooth(2,100,10000,Smooths). Ottengo il seguente errore:

ERROR: is/2: Arguments are not sufficiently instantiated
.

Nessuna soluzione corretta

Altri suggerimenti

Sono davvero dispiaciuto.Ho provato tutto il giorno per scoprire cosa stava sbagliando e finalmente ho visto che negli stessi posti avevo scritto "filprimes" e in alcuni altri luoghi "Filprimes".

Sono un tale idiota!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top