En 2011, hice algo de investigación sobre el estado del arte en motores de reglas, especialmente en Java. Mis enlaces visitados:
http://delicious.com/ajlopez/ruleengine
Estuve leyendo sobre JBoss Drools Expert (ver http://delicious.com/ajlopez/drools). En diciembre, asistí a una Meetup del JBoss Group en Buenos Aires (ver post)
En los lejanos ochenta, me encontré con el algoritmo Rete (ver The Rete Matching Algorithm, Dr.Dobb’s). Despues de toda esta investigación, decidí entretenerme escribiendo un motor de reglas en C#. Pueden seguir mi progreso en:
https://github.com/ajlopez/AjRools
La solución actual:
Como es usual, lo codifiqué usando TDD.
Tiene hechos (facts) que son afirmados, como por ejemplo Temperature = 38. Y tiene reglas (rules) que basadas en los hechos afirmados producen y afirman otros hechos. Tengo planeado agregar acciones que ejecuten código, además de afirmar nuevos hechos. Un ejemplo de regla:
# Rules example rules # Rule for Child Fever rule when Temperature > 38 Age <= 12 then HasFever is true end # Rule for Adult Fever rule when Temperature > 37 Age > 12 then HasFever is true end endTengo la idea de extender el motor a soportar objetos con propiedades, no solo variables simples:
rule when p is_a Patient p.Temperature is 39 then p.HasFever is true endpero esto está todavía en desarrollo. No adopté aún un algoritmo tipo Rete. Quiero tener primero una implementación que ejecute, con tests. Entonces, voy a mejorar la implementación interna (algo ingenua) para tomar en cuenta los cambios incrementales en la lista de hechos conocidos. Teniendo los tests, es un ejercicio de refactoring.
Trabajo pendiente: soporte de objeto con propiedades, sesión (un objeto que permita que un programa consuma un conjunto de reglas), etc.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com