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
<ejfr...@sandia.gov>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 <mcmil...@gmail.com>
> Reply-To: <jess-users@sandia.gov>
> Date: Wed, 11 Jan 2012 14:38:31 -0500
> To: <jess-users@sandia.gov>
> 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
>

Reply via email to