OK, I’m very, very new to JESS and rules engines, so
please forgive me for a very basic question. I have read “JESS in Action”
but I’m still stumped on this one. I get that the rules engine will match
all possible facts against my rule(s). I think of it as kind of an implied
iteration, versus a loop in a procedural language. But, I’d like to have
some control over the order in which those facts are applied to my rule. For
example, imagine I have a database of stuff on my wish list. I keep the name of
each item and the price. And I have a rule that will match on all of the
entries in the database, and do something like make a shopping list and keep a
running total. So far, so good. But, I have a limited budget, and an infinite
wish list. So, I want to make sure my rule matches the things I want the most,
first. And this is where I’m stuck. I can add a “Priority”
slot. But, how do I write the rule to match on the higher priority facts,
first? I played with a (not …) statement I saw in “JESS in Action”,
but it doesn’t quite do what I’m looking for. I may have 3 priority
1 items and I’ll want the rule to match on all of them, and I might have 2
priority 2 items and I’ll want to rule to match on both of those. But, I
want the rule to match on all of the priority 1 items before any of the
priority 2 items. I pasted my test code below. I’m sure I just haven’t
gotten my mind wrapped around how you do things in this environment, yet. But,
I could use a nudge in the right direction on this one. Thanks in advance for
any suggestions! Eric ; Test Prioritizing Facts. (printout t crlf crlf) (clear) (reset) (deftemplate SomethingIWant
"Stuff I want" (slot
Name (default Whatever) ) (slot
Price (default 10) ) (slot
Priority (default 0) ) (slot
Selected (default false) ) ) (assert
(SomethingIWant
(Name "TiVo")
(Price 200)
(Priority 1) ) ) (assert
(SomethingIWant
(Name "DVD Burner")
(Price 400)
(Priority 5) ) ) (assert
(SomethingIWant
(Name "Wheels")
(Price 1000)
(Priority 2) ) ) (defrule items-to-buy
?ItemFound <- (SomethingIWant (Name ?ItemName)
(Price ?ItemPrice)
(Priority ?ItemPriority1)
(Selected false ) )
?ItemFound2 <- (SomethingIWant (Name ?ItemName2)
(Price ?ItemPrice2)
(Priority ?ItemPriority2) ) ; (not (eq
?ItemName ?ItemName2 ) ) (not
(SomethingIWant (Priority ?ItemPriority2&:(> ?ItemPriority1
?ItemPriority2 )))) ; (test
(<= ?ItemPriority1 ?ItemPriority2 ) ) => (printout
t "Found: " ?ItemName ", " ?ItemPrice ", "
?ItemPriority1 crlf) (modify
?ItemFound (Selected true) ) ) |
- JESS: Getting Facts in Sorted Order Eric W. Bonnett
- Re: JESS: Getting Facts in Sorted Order Dusan Sormaz
- RE: JESS: Getting Facts in Sorted Order Eric W. Bonnett
- Re: JESS: Getting Facts in Sorted Order ejfried
- RE: JESS: Getting Facts in Sorted Order Eric W. Bonnett
- Re: JESS: Getting Facts in Sorted Or... ejfried
- RE: JESS: Getting Facts in Sorte... Eric W. Bonnett