He escrito a little app que analiza expresiones en árboles sintácticos abstractos. En este momento, uso un montón de heurísticas contra la expresión para decidir cómo evaluar mejor la consulta. Desafortunadamente, hay ejemplos que hacen que el plan de consulta sea extremadamente malo.¿Dónde podría encontrar un método para convertir una expresión booleana arbitraria en una forma normal conjuntiva o disyuntiva?
He encontrado una manera de mejorar las conjeturas sobre cómo se deben evaluar las consultas, pero primero debo poner mi expresión en CNF o DNF para obtener respuestas correctas. Sé que esto podría resultar en tiempo y espacio potencialmente exponenciales, pero para las consultas típicas mis usuarios ejecutan esto no es un problema.
Ahora, la conversión a CNF o DNF es algo que hago a mano todo el tiempo para simplificar expresiones complicadas. (Bueno, tal vez no todo el tiempo, pero sé cómo se hace usando, por ejemplo, leyes de demorgan, leyes distributivas, etc.) Sin embargo, no estoy seguro de cómo comenzar a traducir eso en un método que se puede implementar como un algoritmo . He visto documentos sobre optimización de consultas, y varios comienzan con "bueno, primero ponemos cosas en CNF" o "primero ponemos cosas en DNF", y nunca parecen explicar su método para lograr eso.
¿Dónde debería empezar?
Esto es suficiente para comenzar. Gracias :) –
¿Alguna sugerencia para una forma de "distribuir OR sobre AND" cuando hay más de unos pocos términos (por ejemplo, niveles múltiples de AND y OR anidados y muchas variables)? – jamie
@Jamie: Necesita generar recursivamente una multiplicación por cada par. No es diferente de FOILing :). En el peor de los casos, esto lleva tiempo exponencial. (La conversión a CNF o DNF está en el corazón del problema original NP Complete, satisfiability) –