setof bagof prolog prolog-setof

Cómo elegir entre bagof, setof y findall en Prolog



forall prolog (2)

¡Esa es una gran pregunta!

No estoy tratando de dar una respuesta exhaustiva, pero me gustaría sugerir algunas líneas de pensamiento que pueden ayudarlo a comprender mejor estos predicados:

  • Piensa cuáles de estos predicados son más fundamentales en el sentido de qué se puede expresar en términos de qué . Por ejemplo, ¿puedes expresar findall/3 en términos de setof/3 ? ¿Y qué pasa al revés? Esto ayuda a ver lo que necesita proporcionar al menos para implementar todos estos predicados.
  • Piensa en qué propiedades declarativas son preservadas por estos predicados. Por ejemplo, ¿el orden en que se encuentran las soluciones influye en los resultados? ¿Para cuál de estos predicados precisamente? ¿Puede alguno de estos predicados fallar ? ¿En qué casos precisamente?
  • Piense en la complejidad del espacio y el tiempo de cada uno de estos predicados. ¿Cuáles de estos predicados, si los hay, se pueden implementar y usar de manera más eficiente que otros? ¿Y a qué costo y compensaciones?

Además, le recomiendo que lea el libro de Richard O''Keefe, The Craft of Prolog, para obtener información valiosa sobre estos predicados.

¿Cómo se elige entre bagof, setof y findall? ¿Hay alguna diferencia importante? ¿Cuál es el más comúnmente utilizado y cuál es el más seguro? Gracias por sus comentarios / respuestas.

findall/3 página del manual de SWI-Prolog en findall/3 y encontré que eran muy similares.


Una diferencia importante que encontré entre findall / 3 y bagof / 3 es que este último no copia los términos que acumula en la lista. Esto puede ser fundamental, por ejemplo, cuando su lista recopilará variables atribuidas , como las que usa al modelar un problema con la biblioteca (clpfd).