Hi,
Thanks for pointing this out, i've since changed the helper code to look
like what is shown below. Everything seems to work fine except for a message
i get when running insertFactToMultislot method:
"No overloading of method 'insertFactToMultislot'"
Although the function works fine and inserts a new fact in the multislot
specified.
What do you think is causing this message to appear. The following shows the
working memory after running each method

Template
-----------------
(deftemplate Human
(slot Name (type STRING))
(multislot Ancestors)
(multislot Pets)
)

Initial facts asserted
-----------------------
(assert
(Human (Name "a")
(Ancestors (assert (Human (Name "b")))(assert (Human (Name "c"))))
(Pets "j" "k")
))
f-0   (MAIN::initial-fact)
f-1   (MAIN::Human (Name "b") (Ancestors ) (Pets ))
f-2   (MAIN::Human (Name "c") (Ancestors ) (Pets ))
f-3   (MAIN::Human (Name "a") (Ancestors <Fact-1> <Fact-2>) (Pets "j" "k"))
For a total of 4 facts.

running setSlotValue(works fine)
--------------------
(defrule setSlotValue
"sets a slot value"
?fact <- (Human (Name "a"))
=>
(call ?jessHelper setSlotValue ?fact Name "b" 2)
)

f-0   (MAIN::initial-fact)
f-1   (MAIN::Human (Name "b") (Ancestors ) (Pets ))
f-2   (MAIN::Human (Name "c") (Ancestors ) (Pets ))
f-3   (MAIN::Human (Name "b") (Ancestors <Fact-1> <Fact-2>) (Pets "j" "k"))
For a total of 4 facts.

running addValueToMultislot(works fine)
--------------------
(defrule addValueToMultislot
"add normal value to multislot"
?fact <- (Human (Name "b"))
=>
(call ?jessHelper addValueToMultislot ?fact Pets "l" 2)
(call ?jessHelper setSlotValue ?fact Name "c" 2)
)
f-0   (MAIN::initial-fact)
f-1   (MAIN::Human (Name "b") (Ancestors ) (Pets ))
f-2   (MAIN::Human (Name "c") (Ancestors ) (Pets ))
f-3   (MAIN::Human (Name "c") (Ancestors <Fact-1> <Fact-2>) (Pets "j" "k"
"l"))
For a total of 4 facts.

running insertFactToMultislot(works fine, except for the message "No
overloading of method 'insertFactToMultislot'")
--------------------
(defrule insertFactToMultislot
"inserts fact to multislot"
?fact <- (Human (Name "c"))
=>
(call ?jessHelper insertFactToMultislot ?fact Ancestors (assert (Human (Name
"d"))))
(call ?jessHelper setSlotValue ?fact Name "d" 2)
)
f-0   (MAIN::initial-fact)
f-1   (MAIN::Human (Name "b") (Ancestors ) (Pets ))
f-2   (MAIN::Human (Name "c") (Ancestors ) (Pets ))
f-3   (MAIN::Human (Name "d") (Ancestors <Fact-1> <Fact-2> <Fact-4>) (Pets
"j" "k" "l"))
f-4   (MAIN::Human (Name "d") (Ancestors ) (Pets ))
For a total of 5 facts.


JessHelper class
-----------------------
package mypackage2;
import java.util.*;
import jess.*;
import jess.awt.*;
public class JessHelper
{
  Rete engine=null;
  public JessHelper(Rete engine)
  {
    this.engine=engine;
  }
  public Fact getFactByTemplateSlotValue(String strTemplate, String strSlot,
String strValue)
  {
    /*
     * Get the deftemplate
     * Get all the facts
     * Loop through facts and find one of deftemplate with name
     *
     */
     if(engine!=null)
     {
       Iterator facts = engine.listFacts();
       while(facts.hasNext())
       {
        Fact fact =(Fact)facts.next();
        Deftemplate template = fact.getDeftemplate();
        try
        {
          if((template.getBaseName().equals(strTemplate))&&(fact.getSlotValu
e(strSlot).toString().equals(strValue)))
          {
            return fact;
          }
        }
        catch (JessException e)
        {
          System.out.println(e.getMessage() + " JessHelper:
getFactByTemplateSlotValue");
        }
       }
     }
     return null;
  }

  public void setSlotValue(Fact fact,String slotName,String slotValue,int
type)
  {
    try
    {
      //fact.setSlotValue(slotName,new Value(slotValue,type));
      engine.modify(fact,slotName,new Value(slotValue,type));
    }
    catch (JessException e)
    {
      System.out.println(e.getMessage() + " JessHelper: setSlotValue");
    }
  }

   public void addValueToMultislot(Fact fact,String multislotName,String
slotValue,int type)
  {
    try
    {
      Value value=fact.getSlotValue(multislotName);
      ValueVector vecValue =value.listValue(engine.getGlobalContext());
      vecValue = (ValueVector) vecValue.clone();
      vecValue.add(new Value(slotValue,type));
      engine.modify(fact,multislotName,new Value(vecValue,RU.LIST));
      //fact.setSlotValue(multislotName,vecValue.);
    }
    catch (JessException e)
    {
      System.out.println(e.getMessage() + " JessHelper:
addValueToMultislot");
    }
  }
  public void insertFactToMultislot(Fact fact,String multislotName,Fact
factValue)
  {
    try
    {
      Value value=fact.getSlotValue(multislotName);
      ValueVector vecValue =value.listValue(engine.getGlobalContext());
      vecValue = (ValueVector) vecValue.clone();
      vecValue.add(new jess.FactIDValue(factValue));
      engine.modify(fact,multislotName,new Value(vecValue,RU.LIST));

      //fact.setSlotValue(multislotName,vecValue.);
    }
    catch (JessException e)
    {
      System.out.println(e.getMessage() + " JessHelper:
insertFactToMultislot");
    }
  }
  public void setMultislotValue(Fact fact,String multislotName,String
currentValue,String newValue,int newValueType)
  {
    try
    {
      Value value=fact.getSlotValue(multislotName);
      ValueVector vecValue =value.listValue(engine.getGlobalContext());
      int index=getIndexValueVector(vecValue,currentValue);
      if(index!=-1)
        vecValue.set(new Value(newValue,newValueType),index);
    }
    catch (JessException e)
    {
      System.out.println(e.getMessage() + " JessHelper:
setValueOfMultislot");
    }
  }
  public void removeMultislotValue(Fact fact, String multislotName,String
slotValue)
  {
    try
    {
      Value value=fact.getSlotValue(multislotName);
      ValueVector vecValue =value.listValue(engine.getGlobalContext());
      vecValue = (ValueVector) vecValue.clone();
      int index=getIndexValueVector(vecValue,slotValue);
      if(index!=-1)
      {
        vecValue.remove(index);
        engine.modify(fact,multislotName,new Value(vecValue,RU.LIST));
      }
    }
    catch (JessException e)
    {
      System.out.println(e.getMessage() + " JessHelper:
removeMultislotValue");
    }
  }
   public void removeMultislotFactValue(Fact fact, String multislotName,Fact
factToBeRemoved)
  {
    try
    {
      Value value=fact.getSlotValue(multislotName);
      ValueVector vecValue =value.listValue(engine.getGlobalContext());
      vecValue = (ValueVector) vecValue.clone();
      int index=getIndexValueVector(vecValue,factToBeRemoved);
      if(index!=-1)
      {
        vecValue.remove(index);
        engine.modify(fact,multislotName,new Value(vecValue,RU.LIST));
      }
    }
    catch (JessException e)
    {
      System.out.println(e.getMessage() + " JessHelper:
removeMultislotValue");
    }
  }
  public int getIndexValueVector(ValueVector valueVector,String slotValue)
  {
    try
    {
      for (int i=0;i<valueVector.size();i++)
      {
        System.out.println(valueVector.get(i).atomValue(engine.getGlobalCont
ext()) + " " +slotValue);
        //System.out.println(valueVector.get(i).variableValue(engine.getGlob
alContext()) + " " +slotValue);
        if(valueVector.get(i).atomValue(engine.getGlobalContext()).equals(sl
otValue))
        {
          return i;
        }
      }
    }
    catch (JessException e)
    {
      System.out.println(e.getMessage() + " JessHelper:
getIndexValueVector");
    }
    return -1;
  }
  public int getIndexValueVector(ValueVector valueVector,Fact fact)
  {
    try
    {
      for (int i=0;i<valueVector.size();i++)
      {
        //System.out.println(valueVector.get(i).atomValue(engine.getGlobalCo
ntext()) + " " +slotValue);
        System.out.println(valueVector.get(i).factValue(engine.getGlobalCont
ext()) + " " +fact.toString());
        Fact
f=(Fact)valueVector.get(i).factValue(engine.getGlobalContext());
        if(f.getFactId()==fact.getFactId())
        {
          return i;
        }
      }
    }
    catch (Exception e)
    {
      System.out.println(e.getMessage() + " JessHelper:
getIndexValueVector");
    }
    return -1;
  }
}
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
Behalf Of [EMAIL PROTECTED]
Sent: 19 January 2005 15:55
To: [email protected]
Subject: Re: JESS: Inserting a fact created using assert into a
multislot in in java


Well, the error is coming from this line:

   vecValue.add(new Value(factValue,RU.FACT));

This is invoking the Value constructor that takes a ValueVector and a
type, rather than the specific constructor that takes a Fact alone.
If you did use the right constructor, though, you'd still get an
error:

  Message: Cannot use jess.Value to represent fact-ids. You must use
  class jess.FactIDValue,

as described in section 4.2.1 of the manual. In any case, the error
message you actually did see should recognize this mistake and explain
it; thanks for the report.

Now, all that aside, I must state in the strongest possible terms that
you *cannot* do this. You cannot, under any circumstances, make
modifications to Fact objects in working memory except by using the
modify function or the Rete.modify method. Doing so will corrupt
working memory and result in undefined behavior (see manual section
4.7). To use Rete.modify(), you could rewrite your helper as

       Value value=fact.getSlotValue(multislotName);
       ValueVector vecValue =value.listValue(engine.getGlobalContext());
       vecValue = (ValueVector) vecValue.clone();
       vecValue.add(new FactIDValue(factValue));
       engine.modify(fact, multislotName, vecValue);


I think portalguy wrote:
[Charset iso-8859-1 unsupported, filtering to ASCII...]
> I'm calling a java function to insert a fact (created in jess script using
> assert) into a multislot, however I get the following message "Not a
vector
> type: "nil" JessHelper: insertFactToMultislot"
> In the example below I'm basically adding an ancestor of type Human
template
> to a multislot field.
>
> Thanks in advance for the help.
>
>
> JessScript
> -----------
> (deftemplate Human
> (slot Name (type STRING))
> (multislot Ancestors))
>
> (assert (Human (Name "a")
> (Ancestors (assert (Human (Name "b")))(assert (Human (Name "c"))))
> ))
>
> (defrule addToMS
> "add to multislot"
> ?fact <- (Human (Name "a"))
> =>
> (call ?jessHelper insertFactToMultislot ?fact Ancestors (assert (Human
(Name
> "d"))))
> )
>
> java function
> --------------
>  public void insertFactToMultislot(Fact fact,String multislotName,Fact
> factValue)
>   {
>     try
>     {
>       Value value=fact.getSlotValue(multislotName);
>       ValueVector vecValue =value.listValue(engine.getGlobalContext());
>       vecValue.add(new Value(factValue,RU.FACT));
>     }
>     catch (JessException e)
>     {
>       System.out.println(e.getMessage() + " JessHelper:
> insertFactToMultislot");
>     }
>   }
>
>
>
>
> --------------------------------------------------------------------
> 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]
> --------------------------------------------------------------------
>



---------------------------------------------------------
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://herzberg.ca.sandia.gov

--------------------------------------------------------------------
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]
--------------------------------------------------------------------

--------------------------------------------------------------------
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]
--------------------------------------------------------------------

Reply via email to