• Domingo 22 de Diciembre de 2024, 07:16

Autor Tema:  Mostrar Todas Las Soluciones En Prolog  (Leído 5209 veces)

msi

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Mostrar Todas Las Soluciones En Prolog
« en: Jueves 23 de Diciembre de 2004, 01:07 »
0
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.

etxe

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Mostrar Todas Las Soluciones En Prolog
« Respuesta #1 en: Viernes 24 de Diciembre de 2004, 18:20 »
0
Hola, creo que simplemente tienes que poner punto y coma (;) detrás de cada una de las soluciones y a continuación pulsar "intro", y así sucesivamente hasta que el programa agote todas las posibles soluciones y te responda "No":

?- insertart([1,2,3],a,L).
L=[a,1,2,3];
L=[1,a,2,3];
L=[1,2,a,3];
L=[1,2,3,a];

No

Si la ejecución del predicado insertart/3 se produce dentro de un programa más amplio, o como parte de la ejecución de otro predicado mayor, para obtener todas las soluciones deberías emplear los predicados findall/3, bagof/3 ó setof/3. Para saber como se manejan y la diferencia entre cada uno de ellos, te aconsejo que acudas, caso de utilizar el intérprete SWI-Prolog, al manual de referencia, concretamente a la sección "4.30 Finding all Solutions to a Goal".