Frage

Wie Sie tatsächlich Existenz testen in der RHS von Regeln in Clips ? Ich versuche zu Design eine Regel, die den aktuellen Zustand durch Zählen, wie viele Ziel Fakten existieren „Score“. Es ist offensichtlich, wie man Test für Tatsachen in der LHS, aber ich kann nicht finden, wie das Äquivalent in der RHS zu tun.

Ich möchte etwas tun, wenn auch diese nicht gültig Clips-Code ist:

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

So dass, wenn keine der Zielzustände existiert, dann gäbe es existiert die Tatsache, (Score (Wert 0)). Umgekehrt, wenn alle die Zielzustände existiert, dann gäbe es existieren die Tatsache, (Score (Wert 3)).

Das Referenzhandbuch erwähnt die Funktion fact-existp, aber dies scheint zu verlangen, es ist eine Tatsache Adresse übergeben wird. Ich habe versucht, es wie (fact-existp (Ziel-1)) verwenden, aber Clips gibt mir einen Syntaxfehler.

War es hilfreich?

Lösung

(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)))))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top