|
From: <jom...@us...> - 2008-06-24 15:44:49
|
Revision: 1343
http://jason.svn.sourceforge.net/jason/?rev=1343&view=rev
Author: jomifred
Date: 2008-06-24 08:20:36 -0700 (Tue, 24 Jun 2008)
Log Message:
-----------
fix the bug with return variables in "call" rules/plans
Modified Paths:
--------------
trunk/src/jason/asSemantics/Agent.java
trunk/src/jason/asSemantics/TransitionSystem.java
trunk/src/jason/asSemantics/VarsCluster.java
trunk/src/jason/asSyntax/Atom.java
trunk/src/jason/asSyntax/DefaultTerm.java
trunk/src/jason/asSyntax/Literal.java
trunk/src/jason/asSyntax/Pred.java
trunk/src/jason/asSyntax/Structure.java
trunk/src/jason/asSyntax/Term.java
trunk/src/jason/asSyntax/VarTerm.java
trunk/src/test/VarTermTest.java
Modified: trunk/src/jason/asSemantics/Agent.java
===================================================================
--- trunk/src/jason/asSemantics/Agent.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSemantics/Agent.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -360,7 +360,7 @@
public void addInitialGoalsInTS() {
for (Literal g: initialGoals) {
- g.makeVarsAnnon();
+ g.makeVarsAnnon(null);
if (! g.hasSource())
g.addAnnot(BeliefBase.TSelf);
getTS().getC().addAchvGoal(g,Intention.EmptyInt);
Modified: trunk/src/jason/asSemantics/TransitionSystem.java
===================================================================
--- trunk/src/jason/asSemantics/TransitionSystem.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSemantics/TransitionSystem.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -467,7 +467,7 @@
}
// free variables in an event cannot conflict with those in the plan
body = (Literal)body.clone();
- body.makeVarsAnnon();
+ body.makeVarsAnnon(null);
conf.C.addAchvGoal(body, conf.C.SI);
confP.step = State.StartRC;
break;
@@ -658,7 +658,7 @@
// they are anonymous)
Literal tel = topIM.getPlan().getTrigger().getLiteral();
tel.apply(topIM.unif);
- tel.makeVarsAnnon();
+ tel.makeVarsAnnon(topIM.unif);
im.unif.unifies(tel, g);
}
}
Modified: trunk/src/jason/asSemantics/VarsCluster.java
===================================================================
--- trunk/src/jason/asSemantics/VarsCluster.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSemantics/VarsCluster.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -30,6 +30,7 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
+import java.util.TreeSet;
import java.util.logging.Logger;
import org.w3c.dom.Document;
@@ -79,7 +80,7 @@
if (vl == null) {
// v1 has no value
if (vars == null) {
- vars = new HashSet<VarTerm>();
+ vars = new TreeSet<VarTerm>();
}
vars.add(vt);
} else if (vl instanceof VarsCluster) {
Modified: trunk/src/jason/asSyntax/Atom.java
===================================================================
--- trunk/src/jason/asSyntax/Atom.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSyntax/Atom.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -155,6 +155,7 @@
@Override public void makeTermsAnnon() { }
@Override public void makeVarsAnnon() { }
+ @Override public void makeVarsAnnon(Unifier un) { }
@Override
protected int calcHashCode() {
Modified: trunk/src/jason/asSyntax/DefaultTerm.java
===================================================================
--- trunk/src/jason/asSyntax/DefaultTerm.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSyntax/DefaultTerm.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -53,6 +53,7 @@
}
public boolean isVar() { return false; }
+ public boolean isUnnamedVar() { return false; }
public boolean isLiteral() { return false; }
public boolean isRule() { return false; }
public boolean isList() { return false; }
Modified: trunk/src/jason/asSyntax/Literal.java
===================================================================
--- trunk/src/jason/asSyntax/Literal.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSyntax/Literal.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -165,7 +165,7 @@
Unifier ruleUn = ruleIt.next(); // evaluation result
Literal rhead = rule.headClone();
rhead.apply(ruleUn);
- rhead.makeVarsAnnon();
+ rhead.makeVarsAnnon(ruleUn);
Unifier unC = un.copy();
if (unC.unifiesNoUndo(Literal.this, rhead)) {
@@ -187,7 +187,7 @@
if (cloneAnnon == null) {
cloneAnnon = (Literal)Literal.this.clone();
cloneAnnon.apply(un);
- cloneAnnon.makeVarsAnnon();
+ cloneAnnon.makeVarsAnnon(null);
}
Unifier ruleUn = new Unifier();
if (ruleUn.unifiesNoUndo(cloneAnnon, rule)) { // the rule head unifies with the literal
Modified: trunk/src/jason/asSyntax/Pred.java
===================================================================
--- trunk/src/jason/asSyntax/Pred.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSyntax/Pred.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -417,7 +417,7 @@
* @param changes is the map of replacements
*/
@Override
- protected void makeVarsAnnon(Map<VarTerm,UnnamedVar> changes) {
+ protected void makeVarsAnnon(Unifier un, Map<VarTerm,UnnamedVar> changes) {
if (annots != null) {
Iterator<ListTerm> i = annots.listTermIterator();
while (i.hasNext()) {
@@ -427,16 +427,17 @@
// replace ta to an unnamed var
UnnamedVar uv = changes.get(ta);
if (uv == null) {
- uv = new UnnamedVar();
+ VarTerm vt = (VarTerm)ta;
+ uv = vt.preferredUnnamedVar(un);
changes.put((VarTerm)ta, uv);
}
lt.setTerm(uv);
} else if (ta.isStructure()) {
- ((Structure)ta).makeVarsAnnon(changes);
+ ((Structure)ta).makeVarsAnnon(un,changes);
}
}
}
- super.makeVarsAnnon(changes);
+ super.makeVarsAnnon(un, changes);
}
@Override
Modified: trunk/src/jason/asSyntax/Structure.java
===================================================================
--- trunk/src/jason/asSyntax/Structure.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSyntax/Structure.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -310,15 +310,17 @@
/** Replaces all variables of the term for unnamed variables (_). */
public void makeVarsAnnon() {
- makeVarsAnnon(new HashMap<VarTerm,UnnamedVar>());
+ makeVarsAnnon(null, new HashMap<VarTerm,UnnamedVar>());
}
- /**
- * Replaces all variables of the term for unnamed variables (_).
- *
- * @param changes is the map of replacements
- */
- protected void makeVarsAnnon(Map<VarTerm,UnnamedVar> changes) {
+ /** Replaces all variables of the term for unnamed variables (_).
+ if un != null, unnamed vars unified to the var are preferred */
+ public void makeVarsAnnon(Unifier un) {
+ makeVarsAnnon(un, new HashMap<VarTerm,UnnamedVar>());
+ }
+
+ /** change all vars by unnamed vars, if un != null, unnamed vars unified to the var are preferred */
+ protected void makeVarsAnnon(Unifier un, Map<VarTerm,UnnamedVar> changes) {
final int size = getArity();
for (int i=0; i<size; i++) {
Term ti = getTerm(i);
@@ -326,14 +328,15 @@
// replace ti to an unnamed var
UnnamedVar uv = changes.get(ti);
if (uv == null) {
- uv = new UnnamedVar();
+ VarTerm vt = (VarTerm)ti;
+ uv = vt.preferredUnnamedVar(un);
changes.put((VarTerm)ti, uv);
}
setTerm(i,uv);
} else if (ti.isStructure()) {
Structure tis = (Structure)ti;
if (tis.hasTerm()) {
- tis.makeVarsAnnon(changes);
+ tis.makeVarsAnnon(un, changes);
}
}
}
Modified: trunk/src/jason/asSyntax/Term.java
===================================================================
--- trunk/src/jason/asSyntax/Term.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSyntax/Term.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -12,6 +12,7 @@
public interface Term extends Cloneable, Comparable<Term>, Serializable, ToDOM {
public boolean isVar();
+ public boolean isUnnamedVar();
public boolean isLiteral();
public boolean isRule();
public boolean isList();
Modified: trunk/src/jason/asSyntax/VarTerm.java
===================================================================
--- trunk/src/jason/asSyntax/VarTerm.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/jason/asSyntax/VarTerm.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -53,8 +53,6 @@
private Term value = null;
- private String unnamedId = null; // set when transformed in unnamed var
-
public VarTerm(String s) {
super(s);
if (s != null && Character.isLowerCase(s.charAt(0))) {
@@ -81,7 +79,6 @@
// do not call constructor with term parameter!
VarTerm t = new VarTerm(super.getFunctor());
t.setSrc(this);
- t.unnamedId = this.unnamedId;
if (hasAnnot())
t.setAnnots((ListTerm) getAnnots().clone());
return t;
@@ -94,22 +91,9 @@
}
public boolean isUnnamedVar() {
- return unnamedId != null;
+ return false;
}
- /** change the functor of the var to _ */
- public void setUnnamed() {
- unnamedId = UnnamedVar.createNewName();
- }
- public void setUnnamed(String id) {
- unnamedId = id;
- }
-
- /** undo the setUnanamed() */
- public void setNamed() {
- unnamedId = null;
- }
-
@Override
public boolean isGround() {
return value != null && value.isGround();
@@ -161,6 +145,19 @@
return false;
}
+ protected UnnamedVar preferredUnnamedVar(Unifier un) {
+ if (un != null) {
+ // check if I have a var cluster with another unnamed var there
+ // and then prefer that unnamed var instead of a new one
+ Term vl = un.get(this);
+ if (vl != null && vl instanceof VarsCluster)
+ for (VarTerm v: (VarsCluster)vl)
+ if (v.isUnnamedVar())
+ return (UnnamedVar)v;
+ }
+ return new UnnamedVar();
+ }
+
/**
* returns the value of this var.
*/
@@ -208,10 +205,7 @@
@Override
public String getFunctor() {
if (value == null) {
- if (unnamedId != null)
- return unnamedId;
- else
- return super.getFunctor();
+ return super.getFunctor();
} else if (value.isStructure()) {
return ((Structure)getValue()).getFunctor();
} else {
Modified: trunk/src/test/VarTermTest.java
===================================================================
--- trunk/src/test/VarTermTest.java 2008-06-24 13:15:06 UTC (rev 1342)
+++ trunk/src/test/VarTermTest.java 2008-06-24 15:20:36 UTC (rev 1343)
@@ -484,15 +484,5 @@
x.apply(u);
assertEquals(x.toString(), "10");
- }
-
- public void testTransformUnnamed() {
- VarTerm x = new VarTerm("X");
- assertFalse(x.isUnnamedVar());
- x.setUnnamed();
- assertTrue(x.isUnnamedVar());
- assertFalse("X".equals(x.toString()));
- x.setNamed();
- assertTrue("X".equals(x.toString()));
- }
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|