• Viernes 15 de Noviembre de 2024, 05:11

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.


Temas - 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 / 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]