[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [obm-l] Clausula PROLOG para numeros primos



Usando a clausula que vc escreveu no email original eu recebi:
?- primo(9,2).
No.
?- primo(11,2).
No.

Depois que eu adicionei a linha que ja te mandei passou a funcionar:
?- primo(9,2).
No.
?-primo(11,2).
Yes.
?- primo( 12345341, 2 )
Yes.

O output que vc descreveu nao bate com a sua clausula original.  Da
um trace no programa.  De qualquer forma vc pode tentar esse aqui
tb que ja esta optimizado pra usar so ate a raiz quadrada de N.  Ainda
esta longe de ser o melhor, ja que precisamos testar apenas os primos
<= sqrt(X):

/* -- versao um pouco melhorada -- */

/* se chegou ate 1 e pq X e primo */
primo( X, 1 ) :- true.

/* equanto N > 1, teste ate achar A = 0 */
primo(X, N) :-
	N > 1,
	A is (X mod N),
	A\=0,
	N1 is N-1,
	primo(X, N1).

/* nao tem pq usar 2 argumentos nao e mesmo?
    Para X, escolha o maior inteiro <= sqrt(x),
    que sera o maior divisor possivel de X. */
primo(X) :-
	A is floor( sqrt( X ) ),
	primo( X, A ).


=========================================================================
Instruções para entrar na lista, sair da lista e usar a lista em
http://www.mat.puc-rio.br/~nicolau/olimp/obm-l.html
=========================================================================