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

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Hunter Mcmillen
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 | Threaded
Open this post in threaded view
|

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

Friedman-Hill, Ernest
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 <[hidden email]>
Reply-To: <[hidden email]>
Date: Wed, 11 Jan 2012 14:38:31 -0500
To: <[hidden email]>
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 | Threaded
Open this post in threaded view
|

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

Hunter Mcmillen
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 <[hidden email]> 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 <[hidden email]>
Reply-To: <[hidden email]>
Date: Wed, 11 Jan 2012 14:38:31 -0500
To: <[hidden email]>
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 | Threaded
Open this post in threaded view
|

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

Friedman-Hill, Ernest
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 <[hidden email]>
Reply-To: <[hidden email]>
Date: Wed, 11 Jan 2012 16:37:11 -0500
To: <[hidden email]>
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 <[hidden email]> 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 <[hidden email]>
Reply-To: <[hidden email]>
Date: Wed, 11 Jan 2012 14:38:31 -0500
To: <[hidden email]>
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 | Threaded
Open this post in threaded view
|

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

Hunter Mcmillen
After a couple hours on the mail archive, I found the problem. When I added the defglobal to the Rete engine I used this command:

Defglobal playerIDGlobal = new Defglobal("*PLAYER_ID*", new Value(self.getID()));
engine.addDefglobal(playerIDGlobal);

But this doesn't specify a type for the Value object, so when I tried to match against ?*PLAYER_ID* on the lhs of my rules it always returned false because the type of the defglobal was defaulted to Java object. I changed the command to this:

Defglobal playerIDGlobal = new Defglobal("*PLAYER_ID*", new Value(self.getID(), RU.INTEGER));
engine.addDefglobal(playerIDGlobal);

And now everything seems to be working fine, Just out of curiosity though how does Jess infer types of variables when it is matching on the lhs of rules?

Thanks,
Hunter McMillen

On Wed, Jan 11, 2012 at 6:04 PM, Friedman-Hill, Ernest <[hidden email]> wrote:
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 <[hidden email]>
Reply-To: <[hidden email]>
Date: Wed, 11 Jan 2012 16:37:11 -0500
To: <[hidden email]>
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 <[hidden email]> 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 <[hidden email]>
Reply-To: <[hidden email]>
Date: Wed, 11 Jan 2012 14:38:31 -0500
To: <[hidden email]>
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