Re: JESS: [EXTERNAL] How to negate a variable when in lhs of a rule

"Friedman-Hill, Ernest" <[email protected]> Wed, 11 Jan 2012 23:04:01 +0000
Newsgroups gmane.comp.java.jess
Message-ID <CB337F3A.7906%[email protected]>
For everything to work right, you always have to use the asterisks (as I said, they're part of the name), and you must include a (defglobal)  declaration before using the variable. Setting a global variable "by hand" without declaring it first produces undefined results (I.e., it'll work right some of the time.)

From: Hunter McMillen <[email protected]<mailto:[email protected]>>
Reply-To: <[email protected]<mailto:[email protected]>>
Date: Wed, 11 Jan 2012 16:37:11 -0500
To: <[email protected]<mailto:[email protected]>>
Subject: Re: JESS: [EXTERNAL] How to negate a variable when in lhs of a rule

I placed the asterisks around PLAYER_ID then still received an error when the rule fired: " No such variable *PLAYER_ID*" But then noticed that when I call setVariable, I name the variable PLAYER_ID not *PLAYER_ID* so I changed my statement to this:

engine.getGlobalContext().setVariable("*PLAYER_ID*", new Value(player.getID());

and everything works fine.

Does getGlobalContext().setVariable(...) define global variables implicitly? or do you have to include the asterisks like I did?

Thanks.
Hunter McMillen

On Wed, Jan 11, 2012 at 3:13 PM, Friedman-Hill, Ernest <[email protected]<mailto:[email protected]>> wrote:
The asterisks are part of the defglobal's name. You're not comparing to the defglobal: you're binding the value in the slot to a new variable. It's not legal to negate such a constraint in its first use, as the error message said. You need to use

 (unit (ID ?id) (typeID ?typeID) (player ~?*PLAYER_ID*))


From: Hunter McMillen <[email protected]<mailto:[email protected]>>
Reply-To: <[email protected]<mailto:[email protected]>>
Date: Wed, 11 Jan 2012 14:38:31 -0500
To: <[email protected]<mailto:[email protected]>>
Subject: JESS: [EXTERNAL] How to negate a variable when in lhs of a rule

Hi everyone,

I am trying to differentiate between Objects that belong to a certain user inside two of my rules.

I have a variable created from Java like this:

engine.getGlobalContext().setVariable("PLAYER_ID", new Value(player.getID());

And I want to use this variable in rules to determine which objects belong to each player.

This rule works fine when just using ?PLAYER_ID
(defrule myUnitSeen
   (unit (ID ?id) (typeID ?typeID) (player ?PLAYER_ID))
=>
 .....)

But when I try to negate the variable I get an error, "First use of variable negated: PLAYER_ID"
(defrule enemyUnitSeen
   (unit (ID ?id) (typeID ?typeID) (player ~?PLAYER_ID))
=>
 .....)

How can I specify anything other than ?PLAYER_ID on the lhs of a rule?

Thanks,
Hunter McMillen