Sunday, 15 January 2012

Defining "if and only if" rules in CLIPS -



Defining "if and only if" rules in CLIPS -

i have defined "if-and-only-if" rule in clips expert system, requires 2 rules instead of 1 rule:

;the rules doifoil , doifblackandflammable (deftemplate object (slot type) (slot color) (slot flammable) ) (defrule doifoil (object (type oil)) => (assert (object (color black) (flammable yes))) ) (defrule doifblackandflammable (object (color black) (flammable yes)) => (assert (object (type oil))) ) (deffacts result (object (type oil) ) )

would possible re-write rule in less redundant way?

since facts can't duplicated, can have conditions of rule check either fact , have actions of rule assert both:

(defrule oilifandonlyifblackandflammable (or (object (type oil)) (object (color black) (flammable yes))) => (assert (object (type oil)) (object (color black) (flammable yes))))

alternately, can write general rule (which more complicated) matches fact (in simpler representation) representing if , if relationship:

(deftemplate object (slot type (default unspecified)) (slot color (default unspecified)) (slot flammable (default unspecified))) (deftemplate iff (slot type1 (default unspecified)) (slot color1 (default unspecified)) (slot flammable1 (default unspecified)) (slot type2 (default unspecified)) (slot color2 (default unspecified)) (slot flammable2 (default unspecified))) (deffacts result (object (type oil))) (deffacts iff (iff (type1 oil) (color2 black) (flammable2 yes))) (defrule iff (iff (type1 ?type1) (color1 ?color1) (flammable1 ?flammable1) (type2 ?type2) (color2 ?color2) (flammable2 ?flammable2)) (object (type ?type) (color ?color) (flammable ?flammable)) (test (or (and (or (eq ?type ?type1) (eq ?type1 unspecified)) (or (eq ?color ?color1) (eq ?color1 unspecified)) (or (eq ?flammable ?flammable1) (eq ?flammable1 unspecified))) (and (or (eq ?type ?type2) (eq ?type2 unspecified)) (or (eq ?color ?color2) (eq ?color2 unspecified)) (or (eq ?flammable ?flammable2) (eq ?flammable2 unspecified))))) => (assert (object (type ?type1) (color ?color1) (flammable ?flammable1)) (object (type ?type2) (color ?color2) (flammable ?flammable2))))

clips

No comments:

Post a Comment