AjRools (1) Motor de Reglas en C#

Published on Author lopezLeave a comment

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
end

Tengo 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
end

pero 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

http://twitter.com/ajlopez

Leave a Reply

Your email address will not be published. Required fields are marked *