• Viernes 15 de Noviembre de 2024, 05:04

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - msi

Páginas: [1]
1
Inteligencia Artificial / Mostrar Todas Las Soluciones En Prolog
« en: Jueves 23 de Diciembre de 2004, 01:07 »
Hola, sigo aprendiendo prolog y queria saber como mostrar todos los resultados posibles. Estoy con un ejemplo de combinar un elemento en todas las posiciones de una lista pero sólo me muestra el primer resultado. Todavia no he llegado a la sección de cortes y fallos por lo que supongo que se podrá resolver sin ellos.

El ejemplo en cuestión es: insertart(L1,e,L2), por ej: insertart([1,2,3],a,L) y deberia ir mostrando:
L=[a,1,2,3]
L=[1,a,2,3]
L=[1,2,a,3]
L=[1,2,3,a]

Para resolverlo utilizo una lista auxiliar inicialmente vacia en la que iré concatenando con la cabeza de la lista para poder ir desplazando el elemento.

insertart(L,E,L2):- combinar(L,E,[],L2).

Para ir "moviendo" el elemento, voy concatenando quedando el resultado que quiero mostrar en L2 y así recursivamente hasta que L quede vacia. Algo como:

combinar([],E,L1,L2):-   concatenar(L1,[E],L2).

combinar([X|Xs],E,L1,L2):- concatenar(L1,[E],Ltemp), concatenar(Ltemp,[X|Xs],L2), concatenar(L1,[X],L1temp),combinar(Xs,E,L1temp,L3).

Es decir, en este predicado ->  concatenar(Ltemp,[X|Xs],L2) <- está el resultado que quiero mostrar (L2).

He seguido trazas y calcula bien las combinaciones pero a la hora de mostrar las listas, sólo muestra la primera, L=[a,1,2,3].

¿Cómo debo hacer para que muestre el resto? ¿Es necesario poner algun corte o fallo?

Muchas gracias.

2
Inteligencia Artificial / Re: Número Perfecto En Prolog
« en: Jueves 9 de Diciembre de 2004, 01:24 »
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.

3
Inteligencia Artificial / Re: Número Perfecto En Prolog
« en: Domingo 5 de Diciembre de 2004, 23:44 »
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.

4
Inteligencia Artificial / Número Perfecto En Prolog
« en: Domingo 5 de Diciembre de 2004, 00:57 »
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.

Páginas: [1]