indexing/using array properties

52 views
Skip to first unread message

Deepak Agrawal

unread,
Jun 7, 2013, 1:17:55 PM6/7/13
to clip...@googlegroups.com
How do I use array properties in CLIPS.

e.g. I have to perform an operation for 3 facts and store output in array type format corresponding to each fact.
In following code, if facts in trelations satisfy certain property I have to store corresponding facts in relations corresponding to each fact in trelations

(deftemplate part
(slot pname)
(slot ptype))

(deftemplate relation
(slot rname)
(slot rtype)
(multislot part))

(deftemplate constraint
(slot cname)
(slot ctype)
(multislot relation))

(deffacts parts
(part (pname P1)(ptype Plate))
(part (pname P2)(ptype Plate))
(part (pname g1)(ptype girder))
(part (pname g2)(ptype girder))
(part (pname r1)(ptype rib))
(part (pname r2)(ptype rib)))

(deffacts relations
(relation (rname v1)(rtype butt)(part P1 P2))
(relation (rname v2)(rtype fillet)(part r1 P1))
(relation (rname v3)(rtype fillet)(part r1 P2))
(relation (rname v4)(rtype fillet)(part r2 P1))
(relation (rname v5)(rtype fillet)(part r2 P2))
(relation (rname v6)(rtype fillet)(part g1 P1))
(relation (rname v7)(rtype fillet)(part g2 P2))
(relation (rname v8)(rtype through)(part g1 r1))
(relation (rname v9)(rtype through)(part g1 r2))
(relation (rname v10)(rtype through)(part g2 r1))
(relation (rname v11)(rtype through)(part g2 r2)))

(deffacts constraints
(constraint (cname c1)(ctype less)(relation v8 v6))
(constraint (cname c2)(ctype less)(relation v9 v6))
(constraint (cname c3)(ctype or)(relation v10 v7))
(constraint (cname c4)(ctype equal)(relation v11 v7)))

(deftemplate tpart
(slot pname)
(slot ptype))

(deftemplate trelation
(slot rname)
(slot rtype)
(multislot part))

(deftemplate tconstraint
(slot cname)
(slot ctype)
(multislot relation))

(deffacts tpart
(tpart (pname part1)(ptype Plate))
(tpart (pname part2)(ptype rib))
(tpart (pname part3)(ptype girder)))

(deffacts trelations
(trelation (rname rl1)(rtype fillet)(part part1 part2))
(trelation (rname rl2)(rtype fillet)(part part1 part3))
(trelation (rname rl3)(rtype through)(part part2 part3)))

(defrule rule1
(trelation (rtype ?rtype1)(part ?prt1 ?prt2))
(tpart (pname ?prt1)(ptype ?prt1type))
(tpart (pname ?prt2)(ptype ?prt2type))
(relation (rname ?rno)(rtype ?rtype1)(part ?prtn1 ?prtn2))
(part (pname ?prtn1)(ptype ?prtn1type))
(part (pname ?prtn2)(ptype ?prtn2type))
=>
(if(and (or (= (str-compare ?prt1type ?prtn1type) 0)(= (str-compare ?prt1type ?prtn2type) 0))(or (= (str-compare ?prt2type ?prtn1type) 0)(= (str-compare ?prt2type ?prtn2type) 0)))
then
(printout t ?rno crlf)))

CLIPS Support

unread,
Jun 19, 2013, 5:34:04 PM6/19/13
to clip...@googlegroups.com
I can't tell from your description what you're attempting to accomplish, but there's no need to use str-compare for simple equality/inequality comparisons.

(defrule rule1
   (trelation (rtype ?rtype1) (part ?prt1 ?prt2))
   (tpart (pname ?prt1) (ptype ?prt1type))
   (tpart (pname ?prt2) (ptype ?prt2type))
   (relation (rname ?rno) (rtype ?rtype1) (part ?prtn1 ?prtn2))
   (part (pname ?prtn1) (ptype ?prtn1type))
   (part (pname ?prtn2) (ptype ?prtn2type))
   (test (and (or (eq ?prt1type ?prtn1type)
                  (eq ?prt1type ?prtn2type))
              (or (eq ?prt2type ?prtn1type)
                  (eq ?prt2type ?prtn2type))))
   =>
   (printout t ?rno crlf))
Reply all
Reply to author
Forward
0 new messages