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