Prolog - Como saber si un numero es primo en ProLog?

   
Vista:

Como saber si un numero es primo en ProLog?

Publicado por Hide (2 intervenciones) el 08/02/2015 16:39:30
Buenas a todos, estaba buscando por Internet como saber si un numero es primo pues estoy empezando en prolog y aun no le pillo bien. Buscando encontré esto:

cicloP(N,A,S):-A>N,S is 0,!.
cicloP(N,A,S):- N mod A=:=0,A=\=N,A1 is A+1,cicloP(N,A1,Sm),S is Sm+A,!.
cicloP(N,A,S):- A1 is A+1,cicloP(N,A1,Sm),S is Sm.
perfect(N):-cicloP(N,1,T),T=:=N.
verifPrimo(N):-cicloP(N,1,T),T=:=1;N=:=1.

Me funciona pero no entiendo bien que es el Sm, que valor tiene o que función cumple en la función, si alguien pudiera explicármelo estaría muy agradecido.

Gracias de antemano ^^
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Como saber si un numero es primo en ProLog?

Publicado por Pablo (4 intervenciones) el 04/06/2017 21:46:56
Ola bueno en Sm se llama a la función cicloP recursivamente hasta que este llegue al caso base que nos dice que cuando
A > N entonces S tendrá el valor 0, la regla N=:=1 esta de mas ya que el 1 no se considera primo por tener solo un divisor

Aqui te dejo otra forma de saber si un numero es primo con funciones recursivas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% numero de divisores
 
ndiv(_,1,1). % caso base
 
ndiv(N,X,ND):-N>1,
	               X>1,
	               0 is N mod X,
	               NX is X-1,
	               ndiv(N,NX,SD),
	               ND is 1+SD.
 
ndiv(N,X,ND):-N>1,
	               X>1,
	               not(0 is N mod X),
	               NX is X-1,
	               ndiv(N,NX,ND).
 
ndiv(N,ND):-ndiv(N,N,ND).
 
es_primo(N):-ndiv(N,2). % verifica si el numero tiene solo 2 divisores,osea si es primo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar