Ricktee
The problem is that when you modify ?a, you do not include the exisiting
values of $?station in the create$ call, so station just gets set to
?name. You need to use (modify ?a (station (create$ ?station ?name)))
), which should mean that if $?station consisted of "station3" and
?name was "station1", then the value of the station slot will be set to
"station3", "station1", which will then make the (test (not(member$
?name $?station))) trigger.
David
ricktee wrote:
Note the test to check that lower-legs isn't already there, if the
test is not there the rule will run forever; maybe Ernest can
provide a way to change the value without having the resulting
modified fact retrigger the rule.
I'm sorry, I didn't understand this part at 1st. Why would the rule keep
triggering when the RHS fact is changed?
But I think I finally experience the problem with my code, the prog just
keep running
Attached below is my code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gym machine and the body part it worksout
(deftemplate gym-station
(slot ident)
(multislot purpose) );;close
(deffacts gym-station-data
(gym-station (ident station1) (purpose arms-upperfront back))
(gym-station (ident station2) (purpose legs))
(gym-station (ident station3) (purpose abs shoulders arms-upperfront))
(gym-station (ident station4) (purpose abs shoulders legs)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;; to find the gym machine that worksout specific
body part
(deftemplate station-matcher
(slot ident)
(multislot station))
(deffacts station-matcher-data
(station-matcher (ident arms-upperfront) (station))
(station-matcher (ident legs) (station))
(station-matcher (ident abs) (station)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;to find which machine helps to
workout arms-upperfront
(defrule detect-arms-upperfront
(gym-station (ident ?name) (purpose $?purpose))
?a <-(station-matcher (ident ?body-part) (station $?station))
(test (eq arms-upperfront ?body-part))
(test (not(member$ ?name $?station)))
(test (member$ arms-upperfront $?purpose))
=> (modify ?a (station (create$ ?name))) );close
(reset)
(run)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
I have added the codeX
(test (not(member$ ?name $?station)))
but why would the rule trigger again? After the rule ran once, at the 2nd
run, shouldn't codeX stop it? Since the gym-station ident "station3" will be
added into the station-matcher multislot "station". So the codeX test at the
2nd run should be "false" which shouldn't trigger the rule again.
I'm not a bright student, so if its too messy to explain, then its ok : )
I guess the indirect question I'm asking is - do I really need to get
Jess70p1 to solve this prob?
thanks again, rgds
Rick
Ernest Friedman-Hill wrote:
On Mar 14, 2007, at 11:33 AM, David Corsar wrote:
Note the test to check that lower-legs isn't already there, if the
test is not there the rule will run forever; maybe Ernest can
provide a way to change the value without having the resulting
modified fact retrigger the rule.
Nothing you can do in Jess 6, really; that's why Jess 7 added the "no-
loop" rule declaration. Add "(declare (no-loop TRUE))" to a rule in
Jess 7, and no modifies on the RHS will cause the rule to reactivate.
---------------------------------------------------------
Ernest Friedman-Hill
Advanced Software Research Phone: (925) 294-2154
Sandia National Labs FAX: (925) 294-2234
PO Box 969, MS 9012 [EMAIL PROTECTED]
Livermore, CA 94550 http://www.jessrules.com
--------------------------------------------------------------------
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]
--------------------------------------------------------------------
--
David Corsar
Department of Computing Science
Meston Building
University of Aberdeen
Aberdeen
AB24 3UE
Scotland
UK
Phone +44 (0)1224 274485
http://www.csd.abdn.ac.uk/~dcorsar
[EMAIL PROTECTED]
--------------------------------------------------------------------
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]
--------------------------------------------------------------------