Pregunta

Estoy tratando de construir un sistema basado en reglas para interpretar datos. Sin embargo, tengo problemas para decidir una forma de construir la lógica para almacenar e interpretar las reglas.

Actualmente, existe una estructura de base de datos que es bastante compleja, pero se ocupará de todos los aspectos del almacenamiento de los datos de la regla. La idea es que el sistema pueda imitar la forma en que MS Outlook permite a un usuario agregar reglas.

Mis problemas son los siguientes:

  1. ¿Qué patrón debo usar para almacenar estas reglas dentro de los objetos?
  2. ¿Debo usar eval () o la orientación adecuada del objeto para ejecutar las reglas?

Y la regla de ejemplo podría ser:

  

El perro debe tener un collar en el área park

Donde cada elemento (perro, debe tener, collar, en el área, parque) es una pieza lógica separada para ser interpretada.

¡Cualquier consejo general a las preguntas anteriores es muy apreciado!

¿Fue útil?

Solución

Nunca he implementado un sistema como el que usted describe en un "mundo real" contexto, pero he jugado con ellos una cantidad considerable como proyectos de hobby. Mi enfoque preferido es usar algún tipo de lenguaje lógico como Prolog para hacer afirmaciones y verificarlas. Tendrías aseveraciones sobre dónde está el parque, qué significa tener algo, qué es un perro, y luego harías una regla muy parecida a tu ejemplo entre paréntesis al final de tu publicación. Lo siento, mi Prolog está demasiado oxidado para darte un ejemplo útil ... He estado jugando con lenguajes de inferencia locales demasiado tiempo.

Hay intérpretes Prolog disponibles para incrustar en la mayoría de los idiomas, aunque no estoy seguro acerca de PHP5. Podría reunir algo simple que inferencia de encadenamiento hacia adelante en estructuras de datos de reglas de su propia creación en poco tiempo, si no puede encontrar un intérprete de Prolog. Puede que le interesen estas notas sobre inferencia automatizada.

Otros consejos

Probablemente esta respuesta es demasiado trivial / obvia para usted, pero solo pensé en cómo resolvería algo así en mi proyecto actual que es una aplicación Zend Framework. Pensé en el filtro y validatorChains que utiliza ZF. Supongo que tiene un número finito de posibles objetos de entrada, un número finito de condiciones / restricciones y un número finito de acciones. En ese caso, primero creará una instancia de un objeto y lo ejecutará contra una cadena de condiciones (validadores), si se cumplen todas las condiciones, ejecute el objeto contra actionChain. Aquí probablemente tendría que implementar algún tipo de sistema de prioridad de acción ya que algunas acciones deben llevarse a cabo antes que otras. Como 'enviar una notificación' y luego 'eliminar' el objeto en cuestión. Entonces, en ZF, construiría un validador personalizado para cada condición / restricción. No creo que el sistema Outlook sea muy inteligente, lo que significa que no creo que los validadores sean muy genéricos.

En la base de datos podría haber una tabla para las reglas reales, una para las condiciones y otra para las acciones. Entonces podría haber dos tablas de muchos a muchos que vinculen la regla con todas las condiciones y acciones necesarias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top