Pregunta

I tiene un conjunto de objetos con atributos y un grupo de reglas que, cuando se aplica al conjunto de objetos, proporciona un subconjunto de esos objetos. Para que esto sea más fácil de entender voy a dar un ejemplo concreto.

Mis objetos son personas y cada uno tiene tres atributos: país de origen, sexo y grupo de edad (todos los atributos son discretos). Tengo un montón de reglas, como "todos varones de los EE.UU.", que se corresponden con los subconjuntos de este conjunto más amplio de objetos.

Estoy buscando ya sea un "motor de inferencia" Java existente o algo similar, que será capaz de asignar a las reglas a un subconjunto de personas, o consejos sobre cómo hacer para crear mi propia. He leído en los motores de reglas, pero ese término parece ser utilizado exclusivamente para los sistemas expertos que exteriorizan las reglas de negocio, y por lo general no incluye ninguna forma avanzada de la inferencia. Estos son algunos ejemplos de los escenarios más complejos que tienen que tratar con:

  1. I necesita la conjunción de reglas. Así que cuando se presenta con tanto "incluyen todos los hombres" y "excluye todas las personas de Estados Unidos en el 10 - grupo de edad de 20 años," Sólo estoy interesado en los machos fuera de los EE.UU., y los machos dentro de los EE.UU. que están fuera del 10 - 20 grupo de edad.

  2. Reglas puede tener diferentes prioridades (definido explícitamente). Por lo que una regla que diga "excluye todos los hombres" anulará una regla que dice "incluyen todos los estados de los varones."

  3. reglas pueden estar en conflicto. Así que podría tener tanto un "incluyen todos los hombres" y un "excluir a todos los hombres", en cuyo caso las prioridades tendrán que resolver la cuestión.

  4. Las reglas son simétricos. Así que "incluir a todos los hombres" es equivalente a "excluir todas las mujeres."

  5. Reglas (o más bien subconjuntos) pueden tener reglas meta (definidos explícitamente) asociados con ellos. Estas reglas meta tendrán que ser aplicado en cualquier caso que se aplica la regla original, o si el subconjunto se alcanza a través de la inferencia. Por lo tanto, si una norma meta de "excluir a los EE.UU." está unido a la regla de "incluir a todos los hombres", y proporcionar el motor con la regla de "excluir todas las mujeres", que debería ser capaz de inferir que el "excluye todas las mujeres" subconjunto es equivalente al subconjunto "incluyen todos los hombres", y como tal se aplica la regla de "excluir a los EE.UU.", además.

Puedo con toda probabilidad en vivo y sin punto 5, pero yo no necesitar todas las otras propiedades mencionadas. Tanto mis reglas y los objetos se almacenan en una base de datos y pueden ser actualizados en cualquier momento, por lo que había necesidad de una instancia del 'motor de inferencia' cuando sea necesario y destruirlo después.

¿Fue útil?

Solución

Hay un montón de Prolog incrustado como solucionadores de SLD para Java; mi enfoque preferido es usar mini-Kanren de Scala , ya que es limpio y permite su uso Scala de manejar perezosamente los resultados de las consultas, pero no lo ha usado en cualquier profundidad. Ver Embedded Prolog Interpreter / Compiler para Java para otras opciones, así como Ross 'respuesta.

solucionadores de SLD manejar todas sus criterios, siempre que tengan algunas características adicionales que Prolog tiene:

  1. conjunción de reglas de procesamiento: objetivo básico SLD;
  2. Las reglas pueden tener diferentes prioridades: regla de corte de Prolog permite la representación de la negación, siempre y cuando las consultas son decidable;
  3. Reglas puede estar en conflicto: Una vez más, la corte puede asegurarse de que las cláusulas de prioridad más baja no se aplican si se cumplen los objetivos de mayor prioridad. Hay algunas maneras de hacer esto.
  4. reglas son simétricos: Con corte, este se asegura fácilmente para predicados decidibles
  5. .
  6. Reglas (o más bien subconjuntos) pueden tener reglas meta (definida explícitamente) asociado con ellos:. El ejemplo parece sugerir que esto es equivalente a 4, así que no estoy seguro de que consiga lo que está después aquí

Las ventajas y desventajas de SLD solucionadores más herramientas basadas en lógica descripción son:

  1. programático de potencia, flexibilidad: por lo general se pueden encontrar soluciones a las dificultades de programación de modelos, donde lógicas descriptivas posible que tenga que replantearse sus modelos. Pero, por supuesto ausencia de medios cinta adhesiva que las soluciones lógicas Descripción obligan a ser limpia, lo que podría ser una buena disciplina.
  2. Robustez: solucionadores de SLD son una tecnología muy bien entendida, mientras que las herramientas de lógica Descripción menudo no son muchos pasos de su nacimiento en una tesis doctoral
  3. .
  4. La ausencia de herramientas semánticas: Descripción de la lógica tiene buenas conexiones con la lógica de primer orden y la lógica del modelo, y le da un muy rico conjunto de técnicas para razonar sobre ellos. La flexibilidad de Prolog normalmente hace esto muy duro.

Si usted no tiene experiencia especial en la descripción de la lógica, me gustaría recomendar un solucionador de SLD.

Otros consejos

En el caso que usted describe pienso que usted desea utilizar en cadena hacia atrás, en lugar de encadenamiento hacia adelante (como los sistemas de RETE Drools están encadenamiento progresivo, en su comportamiento por defecto).

tuProlog . Fácil de unirse con Java, 100% puro Java, y sin duda puede hacer la inferencia de que deseas. Tendrá que entender lo suficiente sobre Prolog para caracterizar el conjunto de reglas.

Prova también puede hacer inferencia y manejar los sistemas de reglas complejas.

Este bonito mucho sonidos como la descripción lógica y bases de conocimiento a mí. Tiene conceptos, funciones y individuums.

Si desea desplegar su problema como una descripción de razonamiento basado en la lógica, que debe estar bien modelado de su problema y ejecutar un razonador en él.

Hay algunos razonadores availaibe libre, una lista se puede encontrar aquí .

Nota sin embargo, que esto es más bien un enfoque complejo y potente.

Es posible que desee tener una mirada especial en KAON2 y DIG cuando se utiliza Java.

Creo que se puede utilizar una especie de ID3 algoritmo para extraer un conjunto de reglas desde el estado inicial de los objetos. No sé cualquier aplicación Java concreta, aunque los puntos de Wikipedia para diferentes implementaciones de Ruby a C (no puedo publicar más de un hipervínculo :-)), pero no es un algoritmo difícil de aprender.

Una vez que se construye el árbol de decisión, que puede expresarse en formato regla, se podría utilizar para ver a qué clase pertenece sus objetos: a todos los varones de los EE.UU., a todas las mujeres entre 10 y 20, y ... cuando alguien actualiza sus objetos en la base de datos, puede reconstruir el árbol de decisión.

Ok, esto puede ser una respuesta tonta. Pero voy a intentarlo de todos modos .... Se podría usar BeanShell para hacer cosas como esta:

  • Crear un simple comando de selección (algo así como select (inicialSet, paramName, paramValue)) que devuelven un conjunto de elementos que está en inicialSet y combinar sus parametros.

  • Crea algunas constantes que pueden ayudarle a escribir buenos guiones BeanShell.

De esta manera usted puede escribir sus reglas como las secuencias de comandos simples y reglas nido.

Por lo tanto, este

I necesita la conjunción de reglas. Así que cuando se presenta con tanto "incluyen todos los hombres" y "excluye todas las personas de Estados Unidos en el 10 - grupo de edad de 20 años," Sólo estoy interesado en los machos fuera de los EE.UU., y los machos dentro de los EE.UU. que están fuera del 10 - 20 grupo de edad.

se convirtió en un script como el siguiente:

originalSet = getOriginalSet(); //Get all from DB

//elements in originalSet that have gender=male
males = select(originalSet, PARAM.GENDER, GENDER.MALE);

//elements in males that have age in [10,20]
youngMaleGuys = select(males, PARAM.AGE, AGE.10_20);

//Exclude from
males.removeAll(youngMaleGuys);

notYoungUSMaleGuys = select(males, PARAM.COUNTRY, COUNTRY.US);

males.removeAll(notYoungUSMaleGuys);

return resp;

Por supuesto, esto es una mierda. Lo hice ahora. Pero se puede escribir comandos muy bonito y de encontrar una manera de hacer esto más fácil de leer.

No tan rápido, pero de fácil mantenimiento y leer (creo). Y usted no tiene que worrie sobre el pedido

Eso es todo. Lo intenté. :)

Uno de los más poderosos motores de reglas de producción basados ??en Java (motor de inferencia) es JBoss BABEANDO.

http://jboss.org/drools

Voy a ser honesto, aunque, a menos que su aplicación conseguir mucho más complicado, utilizando un motor de reglas es un exceso MANERA. Por otro lado, si la aplicación se hace demasiado grande y tiene demasiadas reglas en conflicto, entonces no será capaz de proporcionar un resultado.

Si usted puede controlar su dominio del cliente o el problema mejor, que sería mejor para los motores de inferencia evitar por completo.

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