• Domingo 22 de Diciembre de 2024, 07:31

Autor Tema:  Número Perfecto En Prolog  (Leído 13924 veces)

msi

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Número Perfecto En Prolog
« en: Domingo 5 de Diciembre de 2004, 00:57 »
0
Hola, siento recurrir a esta situación pero es que mi cerebro se ha quedado estancando en este problema y no consigo averiguar la solución. Quisiera resolver el siguiente problema:

 perfecto(+N)
Un número entero positivo es perfecto si es igual a la suma de todos sus divisores (excepto él mismo). Por ejemplo, 6=1+2+3. Escribir un predicado perfecto(+N) que satisfaga si N es perfecto.

Creo que para saber si un número es divisor de N sería correcto algo como 0 =:= N mod "ese divisor",

En ese caso, tendría que sumar ese valor para al final comprobar que la suma de los divisores da N, ¿no?

El problema que encuentro es que no se como poner la llamada recursiva (para que pruebe el resto de números) ya que si pongo algo como:


0 =:= N mod N1,    /*en caso de cumplirse sería un divisor asi que tengo que sumarlo */
 Temp is Aux + N1,
perfecto(  ).   /*llamada recursiva*/

Hay caso en los que los números no son divisibles y por lo tanto no llegaría a entrar en la llamada recursiva, pero me interesa seguir  comprobando el resto de números.

Si pongo la llamada recursiva encima no consigo arreglar el código para que realize las sumas de los divisores.  

He buscado en google y leidos manuales pero la solución a algo tan simple como esto no encuentro.

Cualquier ayuda es bien recibida.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Número Perfecto En Prolog
« Respuesta #1 en: Domingo 5 de Diciembre de 2004, 04:30 »
0
Editado:

No llegue a leer la parte que dice "en prolog"... :P

msi

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Número Perfecto En Prolog
« Respuesta #2 en: Domingo 5 de Diciembre de 2004, 23:44 »
0
Gracias por contestar. Leí tu mensaje antes de editarlo y aunque no me valía el lenguaje te agradezco el esfuerzo.

Voy a intentar explicar un poco mejor lo que intento buscar. Un ejemplo de factorial en prolog sería:

factorial(+N,-R), que dado un número entero mayor o igual que 0 en N, devuelva en R el factorial de N. La solución sería:

factorial(0,1).
factorial(N,Res):- N >0 ,
                   X is N-1 ,
                   factorial(X,Temp) ,
                   Res is N * Temp.


He visto que también se puede poner el factorial como:

factorial(N,R):- fact(N,1,R).
fact(0,R,R).
fact(N,Acum,R):- N > 0,
                         Acum1 is Acum * N,
                         N1 is N - 1,
                         fact(N1, Acum1,R).


He intentado encontrar solución mediante la 1º forma pero soy capaz así que supongo que es de la 2º manera.

Necesito alguna orientación para hallar la solución que aunque no debe ser muy dificil me tiene ofuscado.

Saludos.

fuhrer

  • Miembro MUY activo
  • ***
  • Mensajes: 329
  • Nacionalidad: mx
    • Ver Perfil
    • http://admin.busquenoseninternet.com
Re: Número Perfecto En Prolog
« Respuesta #3 en: Lunes 6 de Diciembre de 2004, 20:51 »
0
Hola que tal,

creo que puedes probar algo como esto:

perfecto(n):-
0 =:= N mod N1,
Temp is Aux + N1,
perfecto( ).

primero realizas lo que dices que haces, despues puedes agregar:

perfecto(n):-
perfecto( ).

Como has de saber prolog se basa en la logica clasica y si no puede validar tu primer clausula donde es divisible y luego sumas, creas la otra clausula donde pruebe con el siguiente numero, asi no pierdes la recursividad que tienes. Y bueno, lo demas (condicion de paro, incremento) imagino ya has de saber como es.

Si no, escribe lo que tengas hecho por si necesitas mas ayuda.

msi

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Número Perfecto En Prolog
« Respuesta #4 en: Jueves 9 de Diciembre de 2004, 01:24 »
0
Hola de nuevo. Ya he conseguido averiguar el código del número perfecto. He tenido que utilizar una función auxiliar pero creo que cumple el objetivo. Mi problema era que tenía que comprobar todos los números y claro, si uno no era divisor fallaba el objetivo con lo que no seguía comprobando, así que como sólo hay que comprobar una suma pues sumo 0 y listo.

esdivisor(A,B,R):- 0=:= A mod B, R is B.            
      
esdivisor(A,B,R):- 0=\= A mod B, R is 0.



perfecto(N):-   perf(N,1,0).    /*1 es el indice que ira de 1 a N, 0 es la suma temporal */

perf(N,N,N).   /*Si el resultado de las sumas es igual al número es que es perfecto */

perf(N,Ind,R):-
Ind < N,
Ind1 is Ind + 1,
esdivisor(N,Ind,Temp),
R1 is R + Temp,
perf(N,Ind1,R1).


Gracias Amilius y fuhrer y espero que ésto le sirva a algún próximo forero.
Un saludo.