Domanda

:

Come si fa a testare per fatto esistenza nel RHS di regole in clip ? sto provando a progettare una regola che "segnare" lo stato attuale di conteggio come esistono molti fatti obiettivo. E 'ovvio come banco di prova per i fatti del LHS, ma non riesco a trovare il modo di fare l'equivalente in RHS.

Io voglio fare qualcosa di simile, anche se questo non è valido il codice Clips:

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

In modo che se nessuno degli stati obiettivo esiste, allora non esisterebbe il fatto (punteggio (valore 0)). Al contrario, se tutti gli stati obiettivo esistevano, allora esisterebbe il fatto (punteggio (valore 3)).

Il manuale di riferimento menziona la funzione di realtà-existp, ma ciò sembra richiedere che è passato un indirizzo di fatto. Ho provato ad utilizzare piace (realtà-existp (goal-1)), ma clip mi dà un errore di sintassi.

È stato utile?

Soluzione

(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)))))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top