Thanks for the help guys.  Here is what I ended up with.  This works, but
I'm sure it's not the most efficient way to solve the problem.

(defrule setCalculatedCostGCI20k5k
    (HrBenefitJoin (hrBenefitConfigId "00001-0000000076")(benefitJoinId
?bjid)(calculatedCost ?cost)(OBJECT ?obj)(coveredPersonId
?cPer)(payingPersonId ?pPer)(relationshipId ?rel))
    (Person (personId ?cPer)(dob ?dob)(OBJECT ?objP))
=>
    (printout t "age = " (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) " for " ?bjid " " crlf)

    (if (eq ?rel nil) then
        (if (< (call ?objP calcAgeAsOf(call com.arahant.utils.DateUtils now
)) 30) then
            (call ?obj overrideAgeCost 11.55)
         else (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 40) then
                (call ?obj overrideAgeCost 18.95)
              else (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 50) then
                    (call ?obj overrideAgeCost 38.35)
                    else (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 60) then
                        (call ?obj overrideAgeCost 65.95)
                          else (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 70) then
                                    (call ?obj overrideAgeCost 104.35)
                                else
                                    (printout t "age greater than 69 ... "
(call ?objP calcAgeAsOf(call com.arahant.utils.DateUtils now )) " for "
?bjid " " crlf))))))
     else (if (neq ?rel nil) then
                (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 30) then
                    (call ?obj overrideAgeCost 4.20)
                 else (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 40) then
                        (call ?obj overrideAgeCost 6.05)
                      else (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 50) then
                            (call ?obj overrideAgeCost 10.90)
                            else (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 60) then
                                (call ?obj overrideAgeCost 17.80)
                                  else (if (< (call ?objP calcAgeAsOf(call
com.arahant.utils.DateUtils now )) 70) then
                                            (call ?obj overrideAgeCost
27.40)
                                        else
                                            (printout t "age greater than 69
... " (call ?objP calcAgeAsOf(call com.arahant.utils.DateUtils now )) " for
" ?bjid " " crlf))))))))
    (printout t "setCalculatedCostGCI function fired for " ?bjid ".
overrideAgeCost =  " (call ?obj overrideAgeCost) crlf)
;    (printout t "setCalculatedCostGCI function fired for " ?bjid " " crlf)

)

On Thu, Jan 6, 2011 at 10:32 AM, Wolfgang Laun <wolfgang.l...@gmail.com>wrote:

> This additional information does not require a fundamentally different
> approach.
>
> Using the same set of facts CostEmployee/CostSpouse, we can now use
> two rules, one calculating the cost for the employee, and the other
> one for the spouse.
>
> (defrule calc-self
>  ?hbj <- (HrBenefitJoin (hrBenefitConfigId "00001-0000000073")
>                 (calculatedCost 0)
>                 {relationshipId  == nil}
>                 (payingPersonId  ?pPer)
>                 (coveredPersonId ?cPer) )
>  (Person        (personId        ?cPer) (dob ?dob) )
>  (CostEmployee  (lo ?lo&:(<= ?lo (yrs ?dob)))
>                 (hi ?hi&:(>= ?hi (yrs ?dob)))(cost ?cost))
> =>
>  (printout t "Cost for " ?cPer " paid by himself: " ?cost crlf )
> )
>
> (defrule calc-other
>  ?hbj <- (HrBenefitJoin (hrBenefitConfigId "00001-0000000073")
>                 (calculatedCost 0)
>                 {relationshipId  != nil}
>                 (payingPersonId  ?pPer)
>                 (coveredPersonId ?cPer) )
>  (Person        (personId        ?cPer) (dob ?dob) )
>  (CostSpouse    (lo ?lo&:(<= ?lo (yrs ?dob)))
>                 (hi ?hi&:(>= ?hi (yrs ?dob)))(cost ?cost))
> =>
>  (printout t "Cost for " ?cPer " paid by " ?pPer ": " ?cost crlf )
> )
>
> The date calculation is abstracted into a
>   (deffunction yrs (?dob) ... (return ?yrs) )
>
> Implementing this in Jess or in Java is a simple programming exercise,
> but it presumably it depends on some technical/legal issues, e.g., it
> may not be possible to use "today" as a basis for calculating the
> difference in years from the person's dob.
>
> Since there's no information what to do with the resulting cost, it's
> just printed to standard output, but updating slot calculatedCost in
> HrBenefitJoin is straightforward.
>
> Cheers
> Wolfgang
>
>
> On 05/01/2011, Derek Adams <dad...@arahant.com> wrote:
> > the facts that I am working with are:
> >
> > (HrBenefitJoin (hrBenefitConfigId "00001-0000000073")(benefitJoinId
> > ?bjid)(calculatedCost ?cost)(OBJECT ?obj)(coveredPersonId
> > ?cPer)(payingPersonId ?pPer)(relationshipId ?rel))
> > (Person (personId ?cPer)(dob ?dob)(OBJECT ?objP))
> >
> > ?rel is what identifies the "covered person" as spouse or employee.  If
> ?rel
> > is nil, it's employee, else it's spouse.
> >
> > So ?objP is my covered person (either spouse or employee).
> >
> > On Wed, Jan 5, 2011 at 3:36 PM, Wolfgang Laun
> > <wolfgang.l...@gmail.com>wrote:
> >
> >> With this kind of problem, there are (at least) two approaches. Given
> that
> >> Employee and Spouse are represented as facts:
> >>    (deftemplate Spouse   (slot name)(slot age))
> >>    (deftemplate Employee (slot name)(slot age)(slot spouse))
> >>
> >>    (deffacts test-facts
> >>       (Employee (name "John Smith")(age 35)(spouse "Jane Smith"))
> >>       (Spouse   (name "Jane Smith")(age 28))
> >>       (Employee (name "Honey Rider")(age 39)(spouse "James Rider"))
> >>       (Spouse   (name "James Rider")(age 45))
> >>    )
> >>
> >> (1) You can write one rule for each possible combination of age
> brackets.
> >>
> >> (defrule compute_1_1
> >>     (Employee (name ?name){age >= 18 && age <= 29}(spouse ?spouse))
> >>     (Spouse   {name == ?spouse}{age >= 18 && age <= 29})
> >> =>
> >>     (printout t "cost " ?name " " (+  11.55 6.65) crlf)
> >> )
> >> ... more boring code ...
> >> (defrule compute_3_3
> >>     (Employee (name ?name){age >= 40 && age <= 49}(spouse ?spouse))
> >>     (Spouse   {name == ?spouse}{age >= 40 && age <= 49})
> >> =>
> >>     (printout t "cost " ?name " " (+  38.35 20.05) crlf)
> >> )
> >>
> >> (2) You can represent the tables for the costs as facts:
> >>    (deftemplate CostEmployee (slot lo)(slot hi)(slot cost))
> >>    (deftemplate CostSpouse   (slot lo)(slot hi)(slot cost))
> >>
> >>    (deffacts costs
> >>        (CostEmployee (lo 18)(hi 29)(cost 11.55))
> >>        (CostEmployee (lo 30)(hi 39)(cost 18.95))
> >>        (CostEmployee (lo 40)(hi 49)(cost 38.35))
> >>        (CostSpouse   (lo 18)(hi 29)(cost  6.65))
> >>        (CostSpouse   (lo 30)(hi 39)(cost 10.35))
> >>        (CostSpouse   (lo 40)(hi 49)(cost 20.05))
> >>    )
> >>
> >> and use a single rule:
> >>
> >>    (defrule compute
> >>        (Employee (name ?name)(age ?ageE)(spouse ?spouse))
> >>        (Spouse   {name == ?spouse}(age ?ageS))
> >>        (CostEmployee {lo <= ?ageE}{hi >= ?ageE}(cost ?costE))
> >>        (CostSpouse   {lo <= ?ageS}{hi >= ?ageS}(cost ?costS))
> >>    =>
> >>        (printout t "cost " ?name " " (+  ?costE ?costS) crlf)
> >>    )
> >>
> >> HTH
> >> Wolfgang
> >>
> >>
> >>
> >>
> >>
> >> On 5 January 2011 22:30, Wolfgang Laun <wolfgang.l...@gmail.com> wrote:
> >>
> >>> Sent on behalf of Derek Adams:
> >>>
> >>>
> >>> Hey Jess Users!  This is my first post, so I apologize for anything
> >>> "noob"
> >>> that I say/do...
> >>>
> >>> I'm very new to Jess.  I understand the basics but applying my
> knowledge
> >>> for the first time is proving more difficult than I anticipated.  Here
> is
> >>> the problem:
> >>>
> >>> I need to set up a rule in Jess that calculates the cost of a benefit
> >>> based on age and enrollees.
> >>> *
> >>> Example:
> >>> The Benefit Configuration is "Employee $10k / Spouse $5k"
> >>> The enrollees are the employee (John Smith age 30) and spouse (Jane
> Smith
> >>> and 28).
> >>> The costs are calculated as follows:
> >>>
> >>> Age               Employee            Spouse
> >>> 18-29            11.55                    6.65
> >>> 30-39            18.95                   10.35
> >>> 40-49            38.35                   20.05*
> >>>
> >>> *So John's cost is 18.95 and Jane's cost is 6.65 for a total of 25.60*.
> >>>
> >>> Any advice would be greatly appreciated!
> >>>
> >>> Thanks,
> >>>
> >>> Derek Adams
> >>>
> >>
> >>
> >
> >
> > --
> > *Derek Adams*
> > Lead Developer
> > Arahant LLC
> > Work: 615-376-5500 ext. 314
> > Cell: 270-543-0920
> >
>
>
> --------------------------------------------------------------------
> To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
> in the BODY of a message to majord...@sandia.gov, NOT to the list
> (use your own address!) List problems? Notify owner-jess-us...@sandia.gov.
> --------------------------------------------------------------------
>
>


--
*Derek Adams*
Lead Developer
Arahant LLC
Work: 615-376-5500 ext. 314
Cell: 270-543-0920

Reply via email to