[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
=========================================================================