JESS: Multislot problem
Title: Multislot problem Hello, I am having a slight problem which is really really bugging me: I have this rule: (defrule bondMVMaxPCOutstanding::calcifnc (declare (auto-focus TRUE)) (rulesfired (rules bondMVMaxPCOutstanding)) ?b <- (grouped-facts (partitionname cusip) (summationvalue ?mv) (partitionvalue ?c) (factcollection $?fc&:(MAIN::checkifcontains productType CVBND $?fc))) ?fact <- (MAIN::findwherecontains productType CVBND ?fc) (test (> (bondMVMaxPCOutstanding::compliant ?mv 1.0) ?*bondMVMaxPCOutstandingValue*)) => . . . . . etc Which uses this function: (deffunction MAIN::findwherecontains (?detail ?value ?col) "returns the fact with the particular details" (foreach ?fact ?col (if (eq (str-compare (call ?fact getSlotValue ?detail) ?value) 0) then (bind ?f ?fact) else (return 0)) ) (if (exists ?f) then (return ?f) else (return FALSE)) ) ?fact <- (MAIN::findwherecontains productType CVBND ?fc) in the rule always stops the rule from activating. I do not understand why. Factcollection is a multifield of facts. I want to retrieve the fact where productType is CVBND. (MAIN::checkifcontains productType CVBND ?fc) succeeds so there is one in the slot, but the above line does not work. Any idea, Thanks in advance for your help! Chirag NOTICE: If received in error, please destroy and notify sender. Sender does not waive confidentiality or privilege, and use is prohibited.
AW: JESS: Multislot problem
I think Chirak wrote: ?fact <- (MAIN::findwherecontains productType CVBND ?fc) in the rule always stops the rule from activating. I do not understand why. Is it possible it stops because you’ve forgotten to enter the ‘$’ in front of the ‘?fc’-multislot-variable? Lars Hübner FH Albstadt-Sigmaringen Institut für angewandte Forschung Tel.: 07431/579-440 Fax.: 07431/579-439 E-Mail: [EMAIL PROTECTED] Internet: http://www.hs-albsig.de/iaf
RE: JESS: Multislot problem
Hello, I have tried it with $?fc with no luck. I have eventually figured out that if I don't use ?fact but in its place (MAIN::findwherecontains productType CVBND ?fc) it works fine but I do not know why! Chirag From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Lars HübnerSent: 17 August 2004 14:41To: [EMAIL PROTECTED]Subject: AW: JESS: Multislot problem I think Chirak wrote: ?fact <- (MAIN::findwherecontains productType CVBND ?fc) in the rule always stops the rule from activating. I do not understand why. Is it possible it stops because you've forgotten to enter the '$' in front of the '?fc'-multislot-variable? Lars Hübner FH Albstadt-Sigmaringen Institut für angewandte Forschung Tel.: 07431/579-440 Fax.: 07431/579-439 E-Mail: [EMAIL PROTECTED] Internet: http://www.hs-albsig.de/iaf NOTICE: If received in error, please destroy and notify sender. Sender does not waive confidentiality or privilege, and use is prohibited.
RE: JESS: Multislot problem
I think that Chirag wrote: >>?fact <- (MAIN::findwherecontains productType CVBND ?fc) in the rule always stops the rule from activating. Hi Chirag, You might be violating the Zen of Jess http://herzberg.ca.sandia.gov/jess/zen.shtml. In your code ?fact <- (MAIN::findwherecontains productType CVBND ?fc) you are trying to use the explicit pattern binding mechanism, "<-", to bind the results of a function call to a variable, which as far as I know, won't work. Patterns binding are just that: a means to bind the actual fact reference of a fact that matches a particular pattern to a variable for use on the RHS of a rule. >>I do not understand why. Jess is looking for an ordered fact named (MAIN::findwherecontains) containing a list of three values in its single slot, and it's rightly not finding any, so the rule never activates. Also, if you look at your function (deffunction MAIN::findwherecontains (?detail ?value ?col) ... you have it returning either 0, a fact reference, or FALSE depending on where the control flows. Then, you're trying to bind that to a variable that's clearly intended to hold a fact reference later... a sure source of future bugs. See if that helps. Cheers! -Jason Jason Morris Morris Technical Solutions [EMAIL PROTECTED] www.morristechnicalsolutions.com fax/phone: 503.692.1088 To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]' in the BODY of a message to [EMAIL PROTECTED], NOT to the list (use your own address!) List problems? Notify [EMAIL PROTECTED]
Re: JESS: few questions
Thanks Ernest Friedman! I removed m_name, it worked fine! [EMAIL PROTECTED] wrote: I think [EMAIL PROTECTED] wrote:> > Is there a way to call one rule from another., instead of recreating> non-similar conditions in another rule too?> If you're worried about duplication on the right-hand-side of rules,you can write a deffunction, and call it on the right-hand-side ofboth rules. If you're worried about duplicate patterns: Jess noticesthis, and the duplication is removed while the Rete network is built;as long as the common patterns are the first patterns in the rule,duplicates will be shared between all rules automatically.Is it required for dynamic bean to have m_name as property and a> constructor?No, of course they don't have to have a "name" property. Because Jessdoesn't construct your Beans itself, they don't even have to have adefault constructor.-Ernest Friedman-Hill Advanced Software Research Phone: (925) 294-2154Sandia National Labs FAX: (925) 294-2234PO Box 969, MS 9012 [EMAIL PROTECTED]Livermore, CA 94550 http://herzberg.ca.sandia.govTo unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'in the BODY of a message to [EMAIL PROTECTED], NOT to the list(use your own address!) List problems? Notify [EMAIL PROTECTED]Thanks and regards,Bhaskar [EMAIL PROTECTED][EMAIL PROTECTED] Do you Yahoo!? Yahoo! Mail Address AutoComplete - You start. We finish.
RE: JESS: few questions
Hi Jason, Thanks for the answers. Can you give me an example fo control-pattern? Thanks Bhaskar Jason Morris <[EMAIL PROTECTED]> wrote: I think that Bhaskar wrote:>> Is there a way to call one rule from another.Hi Bhaskar,First, make sure that you're not trying to procedurally control the rulesfrom firing, otherwise you violate the Zen of Jesshttp://herzberg.ca.sandia.gov/jess/zen.shtml.You might want to try using the "control pattern" technique of simplyplacing an extra fact (usually a simple ordered fact) in LHS of a rule suchthat it prevents the whole rule from activating unless that control fact ispresent in working memory. By binding that fact on the LHS, you can thenretract it on the RHS if the rule fires. Repeat as needed by assertinganother control fact that can govern other rules.>>Is it required for dynamic bean to have m_name as property and aconstructor?I'm not sure what you mean here. As far as I know (having sear! ched JIA andthe docs), if you build your beans according to spec (e.g., implementjava.io.Serializable, provide a zero argument constructor, follow fieldnaming convention and scoping, etc.) you shouldn't have any problems -- myexperience is that Jess is pretty forgiving. Other than that, you caninclude any properties that you want in your bean. BTW - According to JIAp.93, definstances are dynamic by default, unless explicitly created static.Cheers,JasonJason MorrisMorris Technical Solutions[EMAIL PROTECTED]www.morristechnicalsolutions.comfax/phone: 503.692.1088To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'in the BODY of a message to [EMAIL PROTECTED], NOT to the list(use your own address!) List problems? Notify [EMAIL PROTECTED] Do you Yahoo!? New and Improved Yahoo! Mail - Send 10MB messages!
RE: JESS: few questions [control pattern example]
I think that Bhaskar wrote: >>Can you give me an example of control-patterns? Hi Bhaskar, Sure thing. Try saving and running this batch file. (clear) (watch all) (defrule rule-1 "Fires only if a (control-1) fact is present." ;; You might have several of these controlling the application state ?previous-control <-(control-1) ;; Put other patterns here in your real code. => ;; Put other function calls here in your real code. (retract ?previous-control) (assert (control-n))) ;; And you may have many rules in this module ;; all working on some task... (defrule rule-n "Fires only if a (control-n) fact is present." ?previous-control <-(control-n) ;; Put other patterns here in your real code. => ;; Put other function calls here in your real code. (retract ?previous-control) (assert (process-done))) ;; Have the last rule done please turn off the lights :-D (defrule process-is-done "Fires only if process is complete." (process-done) ;; Put other patterns here if needed. => ;; Put other function calls here if needed. ;; Begin the next process or halt (printout t "Process is finished." crlf)) ;; Test (reset) (assert (control-1)) (run) === Jess prints out the following Jess> (batch cc.clp) MAIN::rule-1: +1+1+1+t MAIN::rule-n: +1+1+1+t MAIN::process-is-done: +1+1+1+t ==> Focus MAIN ==> f-0 (MAIN::initial-fact) ==> f-1 (MAIN::control-1) ==> Activation: MAIN::rule-1 : f-1 FIRE 1 MAIN::rule-1 f-1 <== f-1 (MAIN::control-1) ==> f-2 (MAIN::control-n) ==> Activation: MAIN::rule-n : f-2 FIRE 2 MAIN::rule-n f-2 <== f-2 (MAIN::control-n) ==> f-3 (MAIN::process-done) ==> Activation: MAIN::process-is-done : f-3 FIRE 3 MAIN::process-is-done f-3 Process is finished. <== Focus MAIN 3 Jess> Hope this helps! Cheers, Jason Jason Morris Morris Technical Solutions [EMAIL PROTECTED] www.morristechnicalsolutions.com fax/phone: 503.692.1088 To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]' in the BODY of a message to [EMAIL PROTECTED], NOT to the list (use your own address!) List problems? Notify [EMAIL PROTECTED]