Pregunta

¿Cómo se prueba para el hecho de la existencia en el RHS de reglas en clips ? Estoy tratando de diseñar una regla que "marcar" el estado actual mediante recuento de cómo existen muchos hechos de gol. Es obvio cómo la prueba de los hechos en la LHS, pero no puedo encontrar la manera de hacer el equivalente en el lado derecho.

Quiero hacer algo como esto, aunque esto no es un código válido clips:

(defrule score-state ""
    ?score <- (score (value ?value))
    =>
    (modify ?score (value (+ (exists (goal-1)) (exists (goal-2)) (exists (goal-3))))))

Así que si existe ninguno de los estados de la meta, entonces no existiría el hecho (puntuación (valor 0)). Por el contrario, si existieran todos los estados de la meta, entonces no existiría el hecho (puntuación (valor 3)).

El manual de referencia menciona la función FACT-existp, pero esto parece requerir se aprobó una dirección de hecho. He intentado utilizar como si fuera (hecho-existp (meta-1)), pero los clips me da un error de sintaxis.

¿Fue útil?

Solución

(deftemplate score
   (slot value))

(deftemplate goal-1)

(deftemplate goal-2)

(deftemplate goal-3)

(deffacts start
   (score (value undefined))
   (goal-1)
   (goal-3))

(deffunction ecount (?g)
   (if (any-factp ((?f ?g)) TRUE)
      then (return 1)
      else (return 0)))

(defrule score-state ""
    ?score <- (score (value undefined))
    =>
    (modify ?score (value (+ (ecount goal-1) (ecount goal-2) (ecount goal-3)))))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top