"Gopher cumple las reglas"
import "github.com/hyperjumptech/grule-rule-engine"
Grule es una biblioteca de Rule Engine para el lenguaje de programación Go (Golang). Inspirado en el aclamado JBOSS Drools y hecho de una manera mucho más sencilla.
Al igual que Drools , Grule tiene su propio DSL o lenguaje específico de dominio.
A continuación se muestra un ejemplo de DRL o lenguaje de reglas de Drools:
rule "SpeedUp"
salience 10
when
$TestCar : TestCarClass( speedUp == true && speed < maxSpeed )
$DistanceRecord : DistanceRecordClass()
then
$TestCar.setSpeed($TestCar.Speed + $TestCar.SpeedIncrement);
update($TestCar);
$DistanceRecord.setTotalDistance($DistanceRecord.getTotalDistance() + $TestCar.Speed);
update($DistanceRecord);
end
El GRL de Grule es el siguiente:
rule SpeedUp "When testcar is speeding up we keep increase the speed." salience 10 {
when
TestCar . SpeedUp == true && TestCar . Speed < TestCar . MaxSpeed
then
TestCar . Speed = TestCar . Speed + TestCar . SpeedIncrement ;
DistanceRecord . TotalDistance = DistanceRecord . TotalDistance + TestCar . Speed ;
}
No hay mejor explicación que el artículo escrito por Martin Fowler. Puedes leer el artículo aquí (RulesEngine de Martin Fowler).
Tomado del sitio web TutorialsPoint (con ligeras modificaciones),
Grule Rule Engine es un sistema de reglas de producción que utiliza un enfoque basado en reglas para implementar un sistema experto. Los sistemas expertos son sistemas basados en conocimiento que utilizan representaciones de conocimiento para procesar el conocimiento adquirido en una base de conocimiento que puede usarse para razonar.
Turing completa un sistema de reglas de producción con un enfoque en la representación del conocimiento para expresar la lógica proposicional y de primer orden de una manera concisa, no ambigua y declarativa.
El cerebro de un sistema de reglas de producción es un motor de inferencia que puede escalar a una gran cantidad de reglas y hechos. El motor de inferencia compara hechos y datos con reglas de producción (también llamadas producciones o simplemente reglas ) para inferir conclusiones que resultan en acciones.
Una regla de producción es una estructura de dos partes que utiliza lógica de primer orden para razonar sobre la representación del conocimiento. Un motor de reglas comerciales es un sistema de software que ejecuta una o más reglas comerciales en un entorno de producción en tiempo de ejecución.
Un motor de reglas le permite definir "Qué hacer" y no "Cómo hacerlo".
(también tomado de TutorialsPoint)
Las reglas son conocimientos que a menudo se expresan como: "Cuando ocurren algunas condiciones, entonces realiza algunas tareas".
When
< Condition is true >
Then
< Take desired Action >
La parte más importante de una regla es su parte cuándo. Si la parte cuando se cumple, se activa la parte entonces .
rule < rule_name > < rule_description >
< attribute > < value > {
when
< conditions >
then
< actions >
}
Las reglas facilitan la expresión de soluciones a problemas difíciles y también la obtención de verificaciones. A diferencia del código, las reglas se escriben con un lenguaje menos complejo; Los analistas de negocios pueden leer y verificar fácilmente un conjunto de reglas.
Los datos residen en los Objetos de Dominio y la lógica empresarial reside en las Reglas. Dependiendo del tipo de proyecto, este tipo de separación puede resultar muy ventajosa.
Al utilizar reglas, crea un depósito de conocimientos (una base de conocimientos) que es ejecutable. Es un único punto de verdad para la política empresarial. Lo ideal es que las reglas sean tan legibles que también puedan servir como documentación.
Dado que las reglas comerciales en realidad se tratan como datos. Ajustar la regla según la naturaleza dinámica de los negocios se vuelve trivial. No es necesario reconstruir el código ni implementarlo como lo hace el desarrollo de software normal; solo necesita implementar conjuntos de reglas y aplicarlas al repositorio de conocimientos.
Los siguientes casos se resuelven mejor con un motor de reglas:
Un sistema experto que debe evaluar hechos para proporcionar algún tipo de conclusión del mundo real. Si no se utiliza un motor de reglas estilo RETE, se codificaría un conjunto en cascada de declaraciones if
/ else
, y las permutaciones de las combinaciones de cómo podrían evaluarse rápidamente se volverían imposibles de gestionar. Un motor de reglas basado en tablas podría ser suficiente, pero aún es más frágil ante el cambio y no es muy fácil de codificar. Un sistema como Grule le permite describir las reglas y los hechos de su sistema, liberándolo de la necesidad de describir cómo se evalúan las reglas frente a esos hechos y ocultándole la mayor parte de esa complejidad.
Un sistema de calificación. Por ejemplo, un sistema bancario puede querer crear una "puntuación" para cada cliente basándose en los registros de transacciones (hechos) del cliente. Podríamos ver su puntaje cambiar según la frecuencia con la que interactúan con el banco, cuánto dinero transfieren hacia adentro y hacia afuera, qué tan rápido pagan sus cuentas, cuánto interés acumulan, cuánto ganan para ellos mismos o para el banco, y pronto. Un desarrollador podría proporcionar un motor de reglas, y luego los expertos en la materia dentro del departamento de análisis de clientes del banco pueden proporcionar la especificación de los hechos y las reglas. Desacoplar estos diferentes equipos coloca las responsabilidades donde deberían estar.
Juegos de computadora. El estado del jugador, las recompensas, las penalizaciones, los daños, las puntuaciones y los sistemas de probabilidad son muchos ejemplos diferentes de dónde las reglas desempeñan un papel importante en la mayoría de los juegos de ordenador. Estas reglas pueden interactuar de maneras muy complejas, muchas veces de maneras que el desarrollador no previó. Codificar estas situaciones dinámicas mediante el uso de un lenguaje de programación (por ejemplo, Lua) puede resultar bastante complejo y un motor de reglas puede ayudar a simplificar enormemente el trabajo.
Sistemas de clasificación. En realidad, esta es una generalización del sistema de calificación descrito anteriormente. Utilizando un motor de reglas, podemos clasificar cosas como la elegibilidad crediticia, la identificación bioquímica, la evaluación de riesgos para productos de seguros, posibles amenazas a la seguridad y muchas más.
Sistema de consejos/sugerencias. Una "regla" es simplemente otro tipo de datos, lo que la convierte en un candidato principal para ser definido por otro programa. Este programa puede ser otro sistema experto o inteligencia artificial. Las reglas pueden ser manipuladas por otros sistemas para abordar nuevos tipos de hechos o información recién descubierta sobre el dominio que el conjunto de reglas pretende modelar.
Hay muchos otros casos de uso que se beneficiarían del uso de un Rule-Engine. Los casos anteriores representan sólo un pequeño número de los posibles.
Sin embargo, es importante recordar que un Rule-Engine no es una solución milagrosa, por supuesto. Existen muchas alternativas para resolver problemas de "conocimiento" en software, y deberían emplearse donde sean más apropiadas. No se emplearía un motor de reglas donde una simple rama if
/ else
sería suficiente, por ejemplo.
Hay algo más a tener en cuenta: algunas implementaciones de motores de reglas son extremadamente costosas, pero muchas empresas obtienen tanto valor de ellas que el costo de ejecutarlas se compensa fácilmente con ese valor. Incluso para casos de uso moderadamente complejos, el beneficio de un motor de reglas sólido que pueda desacoplar equipos y controlar la complejidad empresarial parece ser bastante claro.
Página de documentación aquí
Para profundizar en el tutorial, consulte los documentos Wiki aquí en Github.
Loading rules into KnowledgeBase
:
Para cargar 100
reglas en KnowledgeBase se necesitaron 99342047 ns/op
(tomó el valor más alto), lo que equivale a ~99.342047ms
y ( 49295906 B/op
) ~49.295906MB
de memoria por operación.
Para cargar 1000
reglas en KnowledgeBase se necesitaron 933617752 ns/op
(tomó el valor más alto), lo que equivale a ~933.617752ms
y ( 488126636 B/op
) ~488.126636
memoria por operación
Executing rules against a fact
:
Para ejecutar un hecho contra 100 reglas, Grule Engine tomó ~9697 ns/op
(tomó el valor más alto como base) que es apenas ~0.009697ms
y 3957 B/op
lo cual es bastante rápido.
Para ejecutar un hecho contra 1000 reglas, Grule Engine tomó ~568959 ns/op
(tomó el valor más alto como base) que apenas es ~0.568959ms
y 293710 B/op
, que también es bastante rápido.
Puedes leer el informe detallado aquí
Sí. Necesitamos colaboradores para hacer que Grule sea aún mejor y útil para la comunidad de código abierto.
Si realmente desea ayudarnos, simplemente Fork
el proyecto y solicite la solicitud de extracción. Lea nuestro Manual de Contribuciones y Código de Conducta