|
From: <jom...@us...> - 2008-08-16 10:13:20
|
Revision: 1355
http://jason.svn.sourceforge.net/jason/?rev=1355&view=rev
Author: jomifred
Date: 2008-08-16 10:13:14 +0000 (Sat, 16 Aug 2008)
Log Message:
-----------
use the classical "deref" for vars binding instead of VarsCluster
Modified Paths:
--------------
trunk/applications/as-unit-test/src/jason/tests/BugVarsAsArg.java
trunk/src/jason/asSemantics/Agent.java
trunk/src/jason/asSemantics/TransitionSystem.java
trunk/src/jason/asSemantics/Unifier.java
trunk/src/jason/asSyntax/Literal.java
trunk/src/jason/asSyntax/ObjectTermImpl.java
trunk/src/jason/asSyntax/PlanBodyImpl.java
trunk/src/jason/asSyntax/Pred.java
trunk/src/jason/asSyntax/Structure.java
trunk/src/jason/asSyntax/UnnamedVar.java
trunk/src/jason/asSyntax/VarTerm.java
trunk/src/test/TermTest.java
trunk/src/test/VarTermTest.java
Removed Paths:
-------------
trunk/src/jason/asSemantics/VarsCluster.java
Modified: trunk/applications/as-unit-test/src/jason/tests/BugVarsAsArg.java
===================================================================
--- trunk/applications/as-unit-test/src/jason/tests/BugVarsAsArg.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/applications/as-unit-test/src/jason/tests/BugVarsAsArg.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -20,12 +20,19 @@
"test_rule(A,a(A)). "+
"ml0(L,L). "+
"ml(V1,V2,R) :- ml0([V1,V2],R). "+
+
+ "append([], L, L). "+
+ "append([H|T], L1, [H|L2]) :- append(T, L1, L2). "+
+
"+!test1 <- ?test_rule(T,A); A = a(V); T=45; jason.asunit.print(V). "+
- "+!test2 <- ?ml(A,B,L); A=1; B=2; jason.asunit.print(L). "
+ "+!test2 <- ?ml(A,B,L); A=1; B=2; jason.asunit.print(L). "+
+ "+!test3 <- L=[X,Y]; ?append(L, [Z], L2); Z=a; X=f; Y=i; jason.asunit.print(L2). "
);
}
- @Test
+
+
+ @Test
public void testRule1() {
ag.addGoal("test1");
ag.assertPrint("45", 5);
@@ -36,4 +43,10 @@
ag.addGoal("test2");
ag.assertPrint("[1,2]", 5);
}
+
+ @Test
+ public void testRule3() {
+ ag.addGoal("test3");
+ ag.assertPrint("[f,i,a]", 10);
+ }
}
Modified: trunk/src/jason/asSemantics/Agent.java
===================================================================
--- trunk/src/jason/asSemantics/Agent.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSemantics/Agent.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -367,7 +367,7 @@
public void addInitialGoalsInTS() {
for (Literal g: initialGoals) {
- g.makeVarsAnnon(null);
+ g.makeVarsAnnon();
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-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSemantics/TransitionSystem.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -403,7 +403,7 @@
return;
}
Unifier u = im.unif;
- PlanBody h = im.getCurrentStep();
+ PlanBody h = im.getCurrentStep();
h.apply(u);
Literal body = null;
@@ -466,8 +466,8 @@
body.addAnnot(BeliefBase.TSelf);
}
// free variables in an event cannot conflict with those in the plan
- body = (Literal)body.clone();
- body.makeVarsAnnon(null);
+ body = body.copy();
+ body.makeVarsAnnon(u);
conf.C.addAchvGoal(body, conf.C.SI);
confP.step = State.StartRC;
break;
@@ -479,8 +479,8 @@
// programmer set some annotation
body.addAnnot(BeliefBase.TSelf);
}
- body = (Literal)body.clone();
- body.makeVarsAnnon();
+ body = body.copy();
+ body.makeVarsAnnon(u);
conf.C.addAchvGoal(body, Intention.EmptyInt);
updateIntention();
break;
@@ -495,7 +495,7 @@
if (f instanceof Literal) { // generate event when using literal in the test (no events for log. expr. like ?(a & b))
body = (Literal)f.clone();
if (body.isLiteral()) { // in case body is a var with content that is not a literal (note the VarTerm pass in the instanceof Literal)
- body.makeVarsAnnon();
+ body.makeVarsAnnon(u);
Trigger te = new Trigger(TEOperator.add, TEType.test, body);
if (ag.getPL().hasCandidatePlan(te)) {
Event evt = new Event(te, conf.C.SI);
@@ -553,7 +553,7 @@
newfocus = conf.C.SI;
// rename free vars
- body.makeVarsAnnon();
+ body.makeVarsAnnon(u);
// call BRF
try {
Modified: trunk/src/jason/asSemantics/Unifier.java
===================================================================
--- trunk/src/jason/asSemantics/Unifier.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSemantics/Unifier.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -70,16 +70,22 @@
* other's value
*/
public Term get(VarTerm vtp) {
- return function.get(vtp);
+ Term vl = function.get(vtp);
+ if (vl != null && vl.isVar()) { // optimised deref
+ return get((VarTerm)vl);
+ }
+ return vl;
}
+ /*
public Term get(Term t) {
if (t.isVar()) {
- return function.get((VarTerm) t);
+ return function.get( deref((VarTerm) t));
} else {
return null;
}
}
+ */
public boolean unifies(Trigger te1, Trigger te2) {
return te1.sameType(te2) && unifies(te1.getLiteral(), te2.getLiteral());
@@ -143,19 +149,21 @@
// X = p(1), An = a, R=[b]
if (ok && np1 != null) { // they are predicates
if (np1.isVar() && np1.hasAnnot()) {
- Term np1vl = function.get((VarTerm) np1);
- if (np1vl.isPred()) {
- Pred pvl = (Pred)np1vl.clone();
+ np1 = deref( (VarTerm)np1);
+ Term np1vl = function.get( (VarTerm) np1);
+ if (np1vl != null && np1vl.isPred()) {
+ Pred pvl = (Pred)np1vl.clone();
pvl.clearAnnots();
- function.put((VarTerm) np1, pvl);
+ bind((VarTerm) np1, pvl);
}
}
if (np2.isVar() && np2.hasAnnot()) {
+ np2 = deref( (VarTerm)np2);
Term np2vl = function.get((VarTerm) np2);
- if (np2vl.isPred()) {
+ if (np2vl != null && np2vl.isPred()) {
Pred pvl = (Pred)np2vl.clone();
pvl.clearAnnots();
- function.put((VarTerm) np2, pvl);
+ bind((VarTerm) np2, pvl);
}
}
}
@@ -179,74 +187,31 @@
final boolean t1gisvar = t1g.isVar();
final boolean t2gisvar = t2g.isVar();
- // both are vars
- if (t1gisvar && t2gisvar) {
- VarTerm t1gv = (VarTerm) t1g;
- VarTerm t2gv = (VarTerm) t2g;
-
- // get their values
- Term t1vl = function.get(t1gv);
- Term t2vl = function.get(t2gv);
+ // one of the args is a var
+ if (t1gisvar || t2gisvar) {
- // if the variable value is a var cluster, it means it has no value
- if (t1vl instanceof VarsCluster)
- t1vl = null;
- if (t2vl instanceof VarsCluster)
- t2vl = null;
+ // deref vars
+ final VarTerm t1gv = t1gisvar ? deref((VarTerm)t1g) : null;
+ final VarTerm t2gv = t2gisvar ? deref((VarTerm)t2g) : null;
- // both has value, their values should unify
- if (t1vl != null && t2vl != null)
- return unifiesNoUndo(t1vl, t2vl);
+ // get their values
+ final Term t1vl = t1gisvar ? function.get(t1gv) : t1g;
+ final Term t2vl = t2gisvar ? function.get(t2gv) : t2g;
- // only t1 has value, t1's value should unify with var t2
- if (t1vl != null)
- return unifiesNoUndo(t2gv, t1vl);
-
- // only t2 has value, t2's value should unify with var t1
- if (t2vl != null)
- return unifiesNoUndo(t1gv, t2vl);
-
- // both are var with no value, like X=Y
- // we must ensure that these vars will form a cluster
- //if (! t1gv.isUnnamedVar() && ! t2gv.isUnnamedVar()) {
- VarTerm t1c = (VarTerm) t1gv.clone();
- VarTerm t2c = (VarTerm) t2gv.clone();
- VarsCluster cluster = new VarsCluster(t1c, t2c, this);
- if (cluster.hasValue()) {
- // all vars of the cluster should have the same value
- for (VarTerm vtc : cluster)
- function.put(vtc, cluster);
+ if (t1vl != null && t2vl != null) {
+ // unifies the two values of the vars
+ return unifiesNoUndo(t1vl, t2vl);
+ } else if (t1vl != null) {
+ bind(t2gv, t1vl);
+ } else if (t2vl != null) {
+ bind(t1gv, t2vl);
+ } else { //if (t1gv != null && t2gv != null) {
+ // unify two vars
+ bind(t1gv, t2gv);
}
- //}
return true;
- }
-
- // t1 is var that doesn't occur in t2
- if (t1gisvar) {
- VarTerm t1gv = (VarTerm) t1g;
- // if t1g is not free, must unify values
- Term t1vl = function.get(t1gv);
- if (t1vl != null && !(t1vl instanceof VarsCluster))
- return unifiesNoUndo(t1vl,t2g);
- else if (!t2g.hasVar(t1gv))
- return setVarValue(t1gv, t2g);
- else
- return false;
- }
-
- // t2 is var that doesn't occur in t1
- if (t2gisvar) {
- VarTerm t2gv = (VarTerm) t2g;
- // if t1g is not free, must unify values
- Term t2vl = function.get(t2gv);
- if (t2vl != null && !(t2vl instanceof VarsCluster))
- return unifiesNoUndo(t2vl,t1g);
- else if (!t1g.hasVar(t2gv))
- return setVarValue(t2gv, t1g);
- else
- return false;
- }
-
+ }
+
// both terms are not vars
// if any of the terms is not a structure (is a number or a
@@ -300,21 +265,40 @@
return true;
}
-
- protected boolean setVarValue(VarTerm vt, Term value) {
- // if the var has a cluster, set value for all cluster
- Term currentVl = function.get(vt);
- if (currentVl != null && currentVl instanceof VarsCluster) {
- VarsCluster cluster = (VarsCluster) currentVl;
- for (VarTerm cvt : cluster)
- function.put(cvt, value); //(Term) value.clone()); // the clone is done in apply
- } else {
- // no value in cluster
- function.put((VarTerm) vt.clone(), value); //(Term) value.clone()); // the clone is done in apply
+
+ public VarTerm deref(VarTerm v) {
+ Term vl = function.get(v);
+ // original def (before optimise)
+ // if (vl != null && vl.isVar())
+ // return deref(vl);
+ // return v;
+
+ VarTerm first = v;
+ while (vl != null && vl.isVar()) {
+ v = (VarTerm)vl;
+ vl = function.get(v);
}
- return true;
+ if (first != v) {
+ function.put(first, v); // optimise map
+ }
+ return v;
}
-
+
+
+
+ public void bind(VarTerm vt1, VarTerm vt2) {
+ final int comp = vt1.compareTo(vt2);
+ if (comp < 0) {
+ function.put((VarTerm)vt1.clone(), vt2);
+ } else if (comp > 0){
+ function.put((VarTerm)vt2.clone(), vt1);
+ } // if they are the same (comp == 0), do not bind
+ }
+
+ private void bind(VarTerm vt, Term vl) {
+ function.put((VarTerm) vt.clone(), vl);
+ }
+
public void clear() {
function.clear();
}
Deleted: trunk/src/jason/asSemantics/VarsCluster.java
===================================================================
--- trunk/src/jason/asSemantics/VarsCluster.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSemantics/VarsCluster.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -1,130 +0,0 @@
-//----------------------------------------------------------------------------
-// Copyright (C) 2003 Rafael H. Bordini, Jomi F. Hubner, et al.
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// To contact the authors:
-// http://www.dur.ac.uk/r.bordini
-// http://www.inf.furb.br/~jomi
-//
-//----------------------------------------------------------------------------
-
-package jason.asSemantics;
-
-import jason.asSyntax.DefaultTerm;
-import jason.asSyntax.Term;
-import jason.asSyntax.VarTerm;
-
-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;
-import org.w3c.dom.Element;
-
-
-/**
- Stores a set of vars that were unified.
-
- E.g.: when X = Y = W = Z the unifier function maps
- X -> { X, Y, W, Z }
- Y -> { X, Y, W, Z }
- W -> { X, Y, W, Z }
- Z -> { X, Y, W, Z }
- where { X, Y, W, Z } is a VarsCluster instance.
-
- So when one var is assigned to a value, all vars in the
- cluster receive this same value.
-
- @author Jomi
-*/
-public class VarsCluster extends DefaultTerm implements Iterable<VarTerm> {
-
- private static final long serialVersionUID = 1L;
- private static Logger logger = Logger.getLogger(VarsCluster.class.getName());
-
- private static int idCount = 0;
-
- private int id = 0;
- private Set<VarTerm> vars = null;
- private Unifier u;
-
- // used in clone
- protected VarsCluster(Unifier u) {
- this.u = u;
- }
-
- public VarsCluster(VarTerm v1, VarTerm v2, Unifier u) {
- id = ++idCount;
- this.u = u;
- add(v1);
- add(v2);
- }
-
- private void add(VarTerm vt) {
- Term vl = u.get(vt);
- if (vl == null) { // vt is not in a VarsCluster
- if (vars == null)
- vars = new TreeSet<VarTerm>();
- vars.add(vt);
- } else if (vl instanceof VarsCluster) {
- // since vt is in a VarsCluster, join the two sets here
- if (vars == null)
- vars = ((VarsCluster) vl).vars;
- else
- vars.addAll(((VarsCluster) vl).vars);
- } else {
- logger.warning("joining var that has value!");
- }
- }
-
- public Iterator<VarTerm> iterator() {
- return vars.iterator();
- }
-
- public boolean equals(Object o) {
- if (o == null) return false;
- if (o == this) return true;
- if (o instanceof VarsCluster) return vars.equals(((VarsCluster) o).vars);
- return false;
- }
-
- public boolean hasValue() {
- return vars != null && !vars.isEmpty();
- }
-
- public Object clone() {
- VarsCluster c = new VarsCluster(u);
- c.vars = new HashSet<VarTerm>();
- for (VarTerm vt : this.vars) {
- c.vars.add((VarTerm) vt.clone());
- }
- return c;
- }
-
- protected int calcHashCode() {
- return vars.hashCode();
- }
-
- public Element getAsDOM(Document document) {
- return null;
- }
-
- public String toString() {
- return "_VC" + id;
- }
-}
Modified: trunk/src/jason/asSyntax/Literal.java
===================================================================
--- trunk/src/jason/asSyntax/Literal.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSyntax/Literal.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -185,9 +185,9 @@
// it is used to define what will be the unifier used
// inside the rule.
if (cloneAnnon == null) {
- cloneAnnon = (Literal)Literal.this.clone();
+ cloneAnnon = Literal.this.copy();
cloneAnnon.apply(un);
- cloneAnnon.makeVarsAnnon(null);
+ cloneAnnon.makeVarsAnnon(un);
}
Unifier ruleUn = new Unifier();
if (ruleUn.unifiesNoUndo(cloneAnnon, rule)) { // the rule head unifies with the literal
@@ -198,7 +198,7 @@
}
}
} else {
- Unifier u = (Unifier) un.clone();
+ Unifier u = un.copy();
if (u.unifiesNoUndo(Literal.this, b)) {
current = u;
return;
Modified: trunk/src/jason/asSyntax/ObjectTermImpl.java
===================================================================
--- trunk/src/jason/asSyntax/ObjectTermImpl.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSyntax/ObjectTermImpl.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -6,7 +6,8 @@
import org.w3c.dom.Element;
public class ObjectTermImpl extends DefaultTerm implements ObjectTerm {
-
+ private static final long serialVersionUID = 1L;
+
private final Object o;
private Method mclone;
private boolean hasTestedClone = false;
Modified: trunk/src/jason/asSyntax/PlanBodyImpl.java
===================================================================
--- trunk/src/jason/asSyntax/PlanBodyImpl.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSyntax/PlanBodyImpl.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -17,6 +17,8 @@
*/
public class PlanBodyImpl extends Structure implements PlanBody, Iterable<PlanBody> {
+ private static final long serialVersionUID = 1L;
+
public static final String BODY_PLAN_FUNCTOR = ";";
private Term term = null;
Modified: trunk/src/jason/asSyntax/Pred.java
===================================================================
--- trunk/src/jason/asSyntax/Pred.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSyntax/Pred.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -417,27 +417,30 @@
* @param changes is the map of replacements
*/
@Override
- protected void makeVarsAnnon(Unifier un, Map<VarTerm,UnnamedVar> changes) {
+ public void makeVarsAnnon(Unifier un) {
if (annots != null) {
Iterator<ListTerm> i = annots.listTermIterator();
while (i.hasNext()) {
ListTerm lt = i.next();
Term ta = lt.getTerm();
- if (ta.isVar()) {
- // replace ta to an unnamed var
- UnnamedVar uv = changes.get(ta);
- if (uv == null) {
- VarTerm vt = (VarTerm)ta;
- uv = vt.preferredUnnamedVar(un);
- changes.put((VarTerm)ta, uv);
- }
- lt.setTerm(uv);
+
+ if (ta.isVar() && !ta.isUnnamedVar()) {
+ // replace ta to an unnamed var
+ VarTerm vt = un == null ? (VarTerm)ta : un.deref((VarTerm)ta);
+ UnnamedVar uv;
+ if (vt.isUnnamedVar()) {
+ uv = (UnnamedVar)vt;
+ } else {
+ uv = new UnnamedVar();
+ un.bind(vt, uv);
+ }
+ lt.setTerm(uv);
} else if (ta.isStructure()) {
- ((Structure)ta).makeVarsAnnon(un,changes);
+ ((Structure)ta).makeVarsAnnon(un);
}
}
}
- super.makeVarsAnnon(un, changes);
+ super.makeVarsAnnon(un);
}
@Override
Modified: trunk/src/jason/asSyntax/Structure.java
===================================================================
--- trunk/src/jason/asSyntax/Structure.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSyntax/Structure.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -308,35 +308,31 @@
return true;
}
- /** Replaces all variables of the term for unnamed variables (_). */
+ /** Replaces all variables by unnamed variables (_). */
public void makeVarsAnnon() {
- makeVarsAnnon(null, new HashMap<VarTerm,UnnamedVar>());
+ makeVarsAnnon(new Unifier());
}
- /** 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) {
+ /** change all vars by unnamed vars, the unifier un is used to consistently replace vars. */
+ public void makeVarsAnnon(Unifier un) {
final int size = getArity();
for (int i=0; i<size; i++) {
Term ti = getTerm(i);
- if (ti.isVar()) {
+ if (ti.isVar() && !ti.isUnnamedVar()) {
// replace ti to an unnamed var
- UnnamedVar uv = changes.get(ti);
- if (uv == null) {
- VarTerm vt = (VarTerm)ti;
- uv = vt.preferredUnnamedVar(un);
- changes.put((VarTerm)ti, uv);
- }
- setTerm(i,uv);
+ VarTerm vt = un == null ? (VarTerm)ti : un.deref((VarTerm)ti);
+ UnnamedVar uv = null;
+ if (vt.isUnnamedVar()) {
+ uv = (UnnamedVar)vt;
+ } else {
+ uv = new UnnamedVar();
+ un.bind(vt, uv);
+ }
+ setTerm(i,uv);
} else if (ti.isStructure()) {
Structure tis = (Structure)ti;
if (tis.hasTerm()) {
- tis.makeVarsAnnon(un, changes);
+ tis.makeVarsAnnon(un);
}
}
}
Modified: trunk/src/jason/asSyntax/UnnamedVar.java
===================================================================
--- trunk/src/jason/asSyntax/UnnamedVar.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSyntax/UnnamedVar.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -67,11 +67,13 @@
return super.compareTo(t);
} else if (t instanceof UnnamedVar) {
if (myId > ((UnnamedVar)t).myId)
+ return -1;
+ else if (myId < ((UnnamedVar)t).myId)
return 1;
- else if (myId < ((UnnamedVar)t).myId)
- return -1;
else
return 0;
+ } else if (t instanceof VarTerm) {
+ return 1;
} else {
return super.compareTo(t);
}
Modified: trunk/src/jason/asSyntax/VarTerm.java
===================================================================
--- trunk/src/jason/asSyntax/VarTerm.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/jason/asSyntax/VarTerm.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -25,7 +25,6 @@
import jason.asSemantics.Agent;
import jason.asSemantics.Unifier;
-import jason.asSemantics.VarsCluster;
import jason.asSyntax.parser.as2j;
import java.io.StringReader;
@@ -141,7 +140,7 @@
if (value == null) {
Term vl = u.get(this);
//System.out.println("applying "+this+"="+vl+" un="+u);
- if (vl != null && !(vl instanceof VarsCluster)) {
+ if (vl != null) { // && !(vl instanceof VarsCluster)) {
setValue(vl);
value.apply(u); // in case t has var args
return true;
@@ -151,20 +150,6 @@
}
return false;
}
-
- protected UnnamedVar preferredUnnamedVar(Unifier un) {
- if (un != null) {
- // check if I am in a var cluster with another unnamed var,
- // i.e. I am unified with an unnamed var,
- // 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.
@@ -200,6 +185,8 @@
public int compareTo(Term t) {
if (value != null)
return value.compareTo(t);
+ else if (t.isUnnamedVar())
+ return -1;
else
return super.compareTo(t);
}
Modified: trunk/src/test/TermTest.java
===================================================================
--- trunk/src/test/TermTest.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/test/TermTest.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -12,6 +12,7 @@
import jason.asSyntax.Structure;
import jason.asSyntax.Term;
import jason.asSyntax.Trigger;
+import jason.asSyntax.UnnamedVar;
import jason.asSyntax.VarTerm;
import jason.asSyntax.Trigger.TEOperator;
import jason.asSyntax.Trigger.TEType;
@@ -578,9 +579,9 @@
u.clear();
assertTrue(u.unifies(l1, l2));
l2.apply(u);
- assertEquals(l2.toString(), "calc(32,33,33)");
+ assertEquals("calc(32,33,33)", l2.toString());
l1.apply(u);
- assertEquals(l1.toString(), "calc(32,33,33)");
+ assertEquals("calc(32,33,33)", l1.toString());
}
public void testMakeVarAnnon3() {
@@ -591,7 +592,35 @@
assertEquals(3, v.size());
assertEquals("vl("+l1.getTerm(1)+")",l1.getAnnots("vl").get(0).toString());
}
+
+ public void testMakeVarAnnon4() {
+ Literal l = Literal.parseLiteral("p(X)");
+ Unifier u = new Unifier();
+ u.unifies(new UnnamedVar(4), new VarTerm("X"));
+ u.unifies(new VarTerm("X"), new UnnamedVar(2));
+ u.unifies(new UnnamedVar(2), new VarTerm("Y"));
+ u.unifies(new UnnamedVar(10), new VarTerm("Y"));
+ u.unifies(new VarTerm("X"), new VarTerm("Z"));
+ /*
+ Iterator<VarTerm> i = u.binds(new VarTerm("X"));
+ while (i.hasNext()) {
+ System.out.println(i.next());
+ }
+ */
+ l.makeVarsAnnon(u);
+ //System.out.println(u+ " "+l);
+ assertEquals("p(_2)", l.toString());
+ }
+ public void testMakeVarAnnon5() {
+ Literal l = Literal.parseLiteral("p(X,Y)[s(Y)]");
+ Unifier u = new Unifier();
+ u.unifies(new VarTerm("X"), new VarTerm("Y"));
+ l.makeVarsAnnon(u);
+ assertEquals(l.getTerm(0), l.getTerm(1));
+ assertEquals("[s("+l.getTerm(0)+")]", l.getAnnots().toString());
+ }
+
public void testAddAnnots() {
Literal p1 = Literal.parseLiteral("p1");
Literal p2 = Literal.parseLiteral("p2[a1,a2]");
Modified: trunk/src/test/VarTermTest.java
===================================================================
--- trunk/src/test/VarTermTest.java 2008-08-11 09:41:14 UTC (rev 1354)
+++ trunk/src/test/VarTermTest.java 2008-08-16 10:13:14 UTC (rev 1355)
@@ -74,7 +74,6 @@
u.unifies(x9,x8);
u.unifies(x7,x4);
-
u.unifies(x3,new Structure("a"));
assertEquals(u.get(x1).toString(),"a");
assertEquals(u.get(x2).toString(),"a");
@@ -493,11 +492,14 @@
public void testUnnamedvarsorder() {
// the order is important for the "return" of plans/rules (where makeVarAnnon is used)
// the most recently created unnamed vars should come first
- List<UnnamedVar> l = new ArrayList<UnnamedVar>();
+ List<VarTerm> l = new ArrayList<VarTerm>();
l.add(new UnnamedVar(5));
+ l.add(new VarTerm("F"));
l.add(new UnnamedVar(6));
l.add(new UnnamedVar(11));
+ l.add(new VarTerm("B"));
Collections.sort(l);
- assertEquals("[_5, _6, _11]", l.toString());
+ assertEquals("[B, F, _11, _6, _5]", l.toString()); // this order is VERY important for unification!
}
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|