; ------------------------------------------------------------------------------------------------------ ; Fact types ; ------------------------------------------------------------------------------------------------------ (deftemplate client ; reprezentuje klienta (slot name ; nazwa klienta (type STRING) ) (slot class ; klasa klienta (type STRING) (default "") (allowed-strings "" "silver" "gold" "platinum") ) ) (deftemplate clientEvaluation (slot client ; nazwa klienta (type STRING) ) (slot rating ; ocena klienta (type NUMBER) (range 0 1) ) ) (deftemplate loanRequest (slot client ; nazwa klienta (type STRING) ) (slot amountAsk ; wysokosc zadanej pozyczki (type INTEGER) (range 0 500000) (default 0) ) ) (deftemplate riskBrancher (slot client ; nazwa klienta (type STRING) ) (slot riskLevel ; wysokosc ryzyka (type INTEGER) (default 1000) ) (slot ratingMin ; minimalna ocena (type NUMBER) (range 0 1) ) ) (deftemplate matchingAssessor (slot client (type STRING) ) (slot amountAsk (type INTEGER) ) ) (deftemplate ratingAssessor (slot client (type STRING) ) (slot amountAsk (type INTEGER) ) (slot ratingMin ; minimalna ocena (type NUMBER) (range 0 1) ) ) (deftemplate decision (slot client (type STRING) ) (slot amountAsk (type INTEGER) ) (slot amountGrant (type INTEGER) (range -1 500000) ; -1 oznacza ze nie przyznano kredytu - failure ) ) ; ------------------------------------------------------------------------------------------------------ ; Defining facts ; ------------------------------------------------------------------------------------------------------ (deffacts initial-facts (client (name "nilper") (class "silver")) (client (name "bold") (class "gold")) (client (name "claritum") (class "platinum")) (client (name "ralcitum")) (clientEvaluation (client "nilper") (rating 0.77)) (clientEvaluation (client "bold") (rating 0.79)) (clientEvaluation (client "claritum") (rating 0.91)) (clientEvaluation (client "ralcitum") (rating 0.91)) (loanRequest (client "bold") (amountAsk 200)) (loanRequest (client "claritum") (amountAsk 200)) (loanRequest (client "claritum") (amountAsk 400000)) (loanRequest (client "ralcitum") (amountAsk 500000)) (loanRequest (client "nilper") (amountAsk 200)) (loanRequest (client "nilper") (amountAsk 1100)) (loanRequest (client "bold") (amountAsk 1100)) (loanRequest (client "ralcitum") (amountAsk 200)) ) ; ------------------------------------------------------------------------------------------------------ ; Rules ; ------------------------------------------------------------------------------------------------------ (defrule loanProcessor (loanRequest (client ?clientname) (amountAsk ?amountask&:(>= ?amountask 0)&:(<= ?amountask 500000))) (client (name ?clientname)) => (assert (riskBrancher (client ?clientname) (riskLevel 1000) (ratingMin 0.8))) ; (printout t "Processing loan request for client " ?clientname ". Asked amount: " ?amountask crlf) ) (defrule riskBrancher1 (riskBrancher (client ?clientname) (riskLevel ?risklevel)) (loanRequest (client ?clientname) (amountAsk ?amountask&:(< ?amountask ?risklevel))) => (assert (matchingAssessor (client ?clientname) (amountAsk ?amountask))) ;(printout t "For client " ?clientname ": The asked amount is less than risk level: asked = " ?amountask ", risk = " ?risklevel crlf) ) (defrule riskBrancher2 (riskBrancher (client ?clientname) (riskLevel ?risklevel) (ratingMin ?ratingmin)) (loanRequest (client ?clientname) (amountAsk ?amountask&:(>= ?amountask ?risklevel))) => (assert (ratingAssessor (client ?clientname) (amountAsk ?amountask) (ratingMin ?ratingmin))) ;(printout t "For client " ?clientname ": The asked amount is greater or equal than/to risk level: asked = " ?amountask ", risk = " ?risklevel crlf) ) (defrule matchingAssessor1 (matchingAssessor (client ?clientname) (amountAsk ?amountask)) (client (name ?clientname) (class "platinum")) => (assert (decision (client ?clientname) (amountAsk ?amountask) (amountGrant ?amountask))) (printout t "---- Loan decision for client " ?clientname " ----" crlf "Asked amount: " ?amountask crlf "Grant amount: " ?amountask crlf) ) (defrule matchingAssessor2 (matchingAssessor (client ?clientname) (amountAsk ?amountask)) (client (name ?clientname) (class "gold")) => (assert (decision (client ?clientname) (amountAsk ?amountask) (amountGrant (* 0.75 ?amountask)))) (printout t "---- Loan decision for client " ?clientname " ----" crlf "Asked amount: " ?amountask crlf "Grant amount: " (* 0.75 ?amountask) crlf) ) (defrule matchingAssessor3 (matchingAssessor (client ?clientname) (amountAsk ?amountask)) (client (name ?clientname) (class ?class&:(not(member$ ?class (create$ "gold" "platinum"))))) => (assert (decision (client ?clientname) (amountAsk ?amountask) (amountGrant -1))) (printout t "---- Loan decision for client " ?clientname " ----" crlf "Client has incorrect class. Grant amount: -1" crlf) ) (defrule ratingAssessor1 (ratingAssessor (client ?clientname) (amountAsk ?amountask) (ratingMin ?ratingmin)) (clientEvaluation (client ?clientname) (rating ?rating&:(>= ?rating ?ratingmin))) => (assert (decision (client ?clientname) (amountAsk ?amountask) (amountGrant (* ?amountask ?rating)))) (printout t "---- Loan decision for client " ?clientname " ----" crlf "Asked amount: " ?amountask crlf "Grant amount: " (* ?amountask ?rating) crlf) ) (defrule ratingAssessor2 (ratingAssessor (client ?clientname) (amountAsk ?amountask) (ratingMin ?ratingmin)) (clientEvaluation (client ?clientname) (rating ?rating&:(< ?rating ?ratingmin))) => (assert (decision (client ?clientname) (amountAsk ?amountask) (amountGrant -1))) (printout t "---- Loan decision for client " ?clientname " ----" crlf "Client rating is less than minimal rating. Grant amount: -1" crlf) ) ; ---------------------------------------------- (set-static-constraint-checking TRUE) ;(set-dynamic-constraint-checking TRUE) ;(set-fact-duplication TRUE) (reset) ;(watch facts) ;(facts) ;(agenda) (run) (exit)