Definitivamente hay una manera de usar el solucionador SAT que describió para encontrar todas las soluciones de un problema SAT, aunque puede que no sea la manera más eficiente.
Simplemente use el solucionador para encontrar una solución a su problema original, agregue una cláusula que no haga nada excepto descartar la solución que acaba de encontrar, use el solucionador para encontrar una solución al nuevo problema, y así sucesivamente. Continúa hasta que obtengas un problema insatisfactorio.
Por ejemplo, supongamos que desea satisfacer (X or Y) and (X or Z)
. Hay cinco soluciones:
Cuatro con X
cierto, Y
y Z
arbitraria.
Uno con X
falso, Y
y Z
true.
Así se ejecuta el programa de solución, y digamos que le da la solución (X, Y, Z) = (T, F, F)
. Puede descartar esta solución --- y sólo esta solución --- con la restricción
not (X and (not Y) and (not Z))
Esta restricción puede ser reescrita como la cláusula
(not X) or Y or Z
Así que ahora puede ejecutar su programa de solución de la nuevo problema
(X or Y) and (X or Z) and ((not X) or Y or Z)
y así sucesivamente.
Como dije, esta es una forma de hacer lo que quiera, pero probablemente no sea la manera más eficiente. Cuando su solucionador de SAT está buscando una solución, aprende mucho sobre el problema, pero no le devuelve toda esa información, solo le brinda la solución que encontró. Cuando ejecuta de nuevo el solucionador, tiene que volver a aprender toda la información que se descartó.
¿Puede la persona que downvoted explique por qué? Después de leer esta entrada del blog (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/), pensé que lo que hice aquí fue "no meramente OK, "pero" alentado explícitamente ". – Vectornaut
Está perfectamente bien. Buena respuesta, por cierto. –