2011-07-21 21 views
11

La aplicación en la que estoy trabajando es una especie de "configurador". Está escrito en C# e incluso escribí un motor de reglas para ir con él. La idea es que hay un montón de declaraciones lógicas proposicionales, y el usuario puede hacer selecciones. En función de lo que hayan seleccionado, algunos otros elementos son necesarios o no están disponibles por completo.Prolog Beginner - ¿Es esta una mala idea?

Las declaraciones lógica proposicional generalmente toman las siguientes formas:

A => ~X 
ABC => ~(X+Y) 
A+B => Q 
A(~(B+C)) => ~Q A <=> B 

Los símbolos:

=> -- Implication 
<=> -- Material Equivalence 
~ -- Not 
+ -- Or 
Two letters side-by-side -- And 

que soy muy nuevo en Prolog, pero parece que podría ser capaz de manejar todos del "procesamiento de reglas" para mí, lo que me permite salir de mi actual motor de reglas (funciona, pero no es tan rápido o fácil de mantener como me gustaría).

Además, todas las opciones disponibles caen en una jerarquía. Por ejemplo:

Outside 
    Color 
     Red 
     Blue 
     Green 
    Material 
     Wood 
     Metal 

Si un artículo en el segundo nivel (función, como el color) se da a entender, a continuación, un artículo en el tercer nivel (opción, tal como Red) se debe seleccionar. De manera similar, si sabemos que una característica es falsa, todas las opciones debajo de ella también son falsas.

El problema es que cada producto tiene su propio conjunto de reglas. ¿Es un enfoque razonable establecer una base de conocimiento que contenga estos operadores como predicados, y luego, en tiempo de ejecución, comenzar a compilar todas las reglas del producto?

La forma en que imagino que podría funcionar sería establecer la idea de los componentes, las funciones y las opciones. Luego configure las relaciones entre entonces (por ejemplo, si la característica es falsa, entonces todas sus opciones son falsas). En tiempo de ejecución, agregue las reglas específicas del producto. Luego pase todas las selecciones del usuario a una función, recuperando como salida qué elementos son verdaderos y qué elementos son falsos.

No sé todas las implicaciones de lo que estoy preguntando, ya que estoy entrando en Prolog, pero estoy tratando de evitar tomar un mal camino y perder mucho tiempo en el proceso.

Algunas preguntas que pueden ayudar a orientar lo que estoy tratando de averiguar:

  1. ¿Suena esto factible?
  2. ¿Estoy ladrando en el árbol equivocado?
  3. ¿Existen inconvenientes o inquietudes al tratar de crear todas estas reglas en tiempo de ejecución?
  4. ¿Existe un mejor sistema para este tipo de cosas que pueda ser capaz de exprimir en una aplicación C# (Silverlight, para ser exactos)?
  5. ¿Hay otros sistemas de la competencia que deba examinar?
  6. ¿Tiene algún consejo general sobre este tipo de cosas?

Gracias de antemano por su consejo!

+0

Me gustaría cambiar el título de esta pregunta, por lo que contiene la frase "configuración del producto" o algo así. Usted se escribe a sí mismo "El problema es que cada producto tiene su propio conjunto de reglas", por lo que creo que está más interesado en este campo que en la lógica en general. –

Respuesta

7
  1. Claro, pero Prolog tiene una curva de aprendizaje.
  2. La inferencia basada en reglas es el juego de Prolog, aunque es posible que tenga que volver a escribir muchas reglas en Horn clauses.A+B => Q es factible (se convierte en q :- a. q :- b. o q :- (a;b).) pero sus otros ejemplos se deben volver a escribir, incluido A => ~X.
  3. Depende de su compilador Prolog, específicamente si es compatible con la indexación de predicados dinámicos.
  4. Busque términos como "verificación anticipada", "motor de inferencia" y "reglas comerciales". Varias comunidades siguen inventando diferentes terminologías para este problema.
  5. Constraint Handling Rules (CHR) es un lenguaje de programación lógica, implementado como una extensión Prolog, que está mucho más cerca de los motores de reglas de inferencia/encadenamiento directo/reglas de negocio basadas en reglas. Sin embargo, si quieres usarlo, igual tendrás que aprender Prolog básico.
  6. Tenga en cuenta que Prolog es un lenguaje de programación, no es una bala de plata para la inferencia lógica. Corta algunas esquinas de la lógica de primer orden para que las cosas sean más fáciles de computar. Es por eso que solo maneja las cláusulas de Horn: se pueden mapear uno a uno con procedimientos/subrutinas.
4

También puede incluir DCG para generar listas de materiales. La idea es aproximadamente que los terminales pueden usarse para indicar subproductos, y no terminales para definir combinaciones cada vez más complejas de un subproducto hasta que llegue a sus productos configurables finales.

Tomemos por ejemplo los dos pares de valores de atributos Color en {rojo, azul, verde} y Material en {madera, metal}. Estos podrían especificar un pomo de la puerta, por lo que no todas las combinaciones son posibles:

knob(red,wood) --> ['100101']. 
knob(red,metal) --> ['100102']. 
knob(blue,metal) --> ['100202']. 

A continuación, podría definir una puerta, como:

door ... --> knob ..., panel ... 

Curiosamente no se verá ninguna fórmula lógica en una especificación de dicho producto , solo hechos y reglas, y muchos parámetros pasados. Puede usar los parámetros en un componente de adquisición de conocimiento. Simplemente ejecutando los objetivos desinstalados puede derivar valores posibles para los pares de valores de atributo. El predicado setof/3 clasificará y removen duplicados para usted:

?- setof(Color,Material^Bill^knob(Color,Material,Bill,[]),Values). 
Value = [blue, red] 
?- setof(Material,Color^Bill^knob(Color,Material,Bill,[]),Values). 
Material = [metal, wood] 

Ahora se conoce el rango de los atributos y se puede dejar que el usuario final sucesivamente recoger un atributo y un valor. Supongamos que toma el atributo Color y su valor azul. El rango del atributo material, entonces se reduce en consecuencia:

?- setof(Material,Bill^knob(blue,Material,Bill,[]),Values). 
Material = [metal] 

Al final, cuando todos los atributos se han especificado se puede leer el artículo números de los subproductos. Usted puede usar esto para el cálculo de precios, mediante la adición de algunos hechos que le dan información adicional sobre los números de artículo, o para generar listas de pedidos, etc ..:

?- knob(blue,metal,Bill,[]). 
Bill = ['100202'] 

Saludos

PS: Oh parece que la idea de la lista de materiales utilizada en el configurador del producto vuelve a Clocksin & Mellish.Al menos me parece un comentario correspondiente aquí: http://www.amzi.com/manuals/amzi/pro/ref_dcg.htm#DCGBillMaterials

Cuestiones relacionadas