From: <jom...@us...> - 2015-12-11 13:05:54
|
Revision: 1867 http://sourceforge.net/p/jason/svn/1867 Author: jomifred Date: 2015-12-11 13:05:52 +0000 (Fri, 11 Dec 2015) Log Message: ----------- revise unifier for namespaces/negated vars Modified Paths: -------------- trunk/build.xml trunk/doc/index.html trunk/src/jason/asSemantics/Unifier.java trunk/src/jason/asSyntax/ASSyntax.java trunk/src/jason/asSyntax/Literal.java trunk/src/jason/asSyntax/LiteralImpl.java trunk/src/jason/asSyntax/Pred.java trunk/src/jason/asSyntax/Structure.java trunk/src/jason/asSyntax/VarTerm.java trunk/src/jason/bb/ChainBB.java trunk/src/jason/bb/DefaultBeliefBase.java trunk/src/jason/stdlib/package.html trunk/src/test/ASParserTest.java trunk/src/test/BeliefBaseTest.java trunk/src/test/NSTest.java trunk/src/test/VarTermTest.java Added Paths: ----------- trunk/src/jason/bb/StructureWrapperForLiteral.java Modified: trunk/build.xml =================================================================== --- trunk/build.xml 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/build.xml 2015-12-11 13:05:52 UTC (rev 1867) @@ -13,7 +13,7 @@ <property name="dist.properties" value="${basedir}/bin/dist.properties" /> <property name="version" value="1" /> - <property name="release" value="4.2" /> + <property name="release" value="2.beta" /> <property name="distDir" value="${env.HOME}/tmp/x/Jason-${version}.${release}" /> <property name="distFile" value="${env.HOME}/Jason-${version}.${release}" /> Modified: trunk/doc/index.html =================================================================== --- trunk/doc/index.html 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/doc/index.html 2015-12-11 13:05:52 UTC (rev 1867) @@ -17,7 +17,7 @@ <li><a href="faq.html">FAQ</a> (html)</li><br/> -<li><a href="api/jason/stdlib/package-summary.html#package_description">Stantard internal actions</a> (html)</li> +<li><a href="api/jason/stdlib/package-summary.html#package.description">Stantard internal actions</a> (html)</li> <li><a href="api/jason/functions/package-summary.html">Stantard arithmetic functions</a> (html)</li> <li>API of all classes: generated by <a href="api/index.html">JavaDoc</a>.</li><br> Modified: trunk/src/jason/asSemantics/Unifier.java =================================================================== --- trunk/src/jason/asSemantics/Unifier.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/asSemantics/Unifier.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -76,6 +76,7 @@ if (vl != null && vl.isVar()) { // optimised deref return get((VarTerm)vl); } + /* vars in unifier are not negated anymore! (works like namespace) if (vl == null) { // try negated value of the var //System.out.println("for "+vtp+" try "+new VarTerm(vtp.negated(), vtp.getFunctor())+" in "+this); vl = function.get( new VarTerm(vtp.negated(), vtp.getFunctor()) ); @@ -88,6 +89,7 @@ ((Literal)vl).setNegated(((Literal)vl).negated()); } } + */ return vl; } @@ -209,11 +211,6 @@ } } - /*if (t1g.isCyclicTerm()) - remove(t1g.getCyclicVar()); - if (t2g.isCyclicTerm()) - remove(t2g.getCyclicVar()); - */ return ok; } @@ -229,22 +226,18 @@ final boolean t1gisvar = t1g.isVar(); final boolean t2gisvar = t2g.isVar(); - + // one of the args is a var if (t1gisvar || t2gisvar) { + final VarTerm t1gv = t1gisvar ? (VarTerm)t1g : null; + final VarTerm t2gv = t2gisvar ? (VarTerm)t2g : null; - // deref vars - final VarTerm t1gv = t1gisvar ? deref((VarTerm)t1g) : null; - final VarTerm t2gv = t2gisvar ? deref((VarTerm)t2g) : null; - // get their values - //final Term t1vl = t1gisvar ? function.get(t1gv) : t1g; - //final Term t2vl = t2gisvar ? function.get(t2gv) : t2g; final Term t1vl = t1gisvar ? get(t1gv) : t1g; final Term t2vl = t2gisvar ? get(t2gv) : t2g; - + if (t1vl != null && t2vl != null) { // unifies the two values of the vars - return unifiesNoUndo(t1vl, t2vl); + return unifiesNoUndo(t1vl, t2vl); } else if (t1vl != null) { // unifies var with value return bind(t2gv, t1vl); } else if (t2vl != null) { @@ -329,35 +322,32 @@ if (! vt1.getNS().equals(vt2.getNS())) return false; - if (vt1.negated() && vt2.negated()) { // in the case of ~A = ~B, put A=B in the unifier - vt1 = new VarTerm(vt1.getFunctor()); - vt2 = new VarTerm(vt2.getFunctor()); + if (vt1.negated() != vt2.negated()) { + return false; } + + vt1 = getVarForUnifier(vt1); + vt2 = getVarForUnifier(vt2); final int comp = vt1.compareTo(vt2); + //System.out.println(vt1+"="+vt2+" ==> "+getVarForUnifier(vt1) +"="+ getVarForUnifier(vt2)+" in "+this+" cmp="+comp); if (comp < 0) { - function.put((VarTerm)vt1.clone(), vt2.clone()); + function.put(vt1, vt2); } else if (comp > 0){ - function.put((VarTerm)vt2.clone(), vt1.clone()); + function.put(vt2, vt1); } // if they are the same (comp == 0), do not bind return true; } public boolean bind(VarTerm vt, Term vl) { if (vt.negated()) { // negated vars unifies only with negated literals - if (vl.isLiteral()) { - if (!((Literal)vl).negated()) { - return false; - } else { - // put also the positive case in the unifier - Literal vlp = (Literal)vl.clone(); - vlp.setNegated(Literal.LPos); - unifies(new VarTerm(vt.getFunctor()), vlp); - } - } else { + if (!vl.isLiteral() || !((Literal)vl).negated()) { return false; - } + } + vl = (Literal)vl.clone(); + ((Literal)vl).setNegated(Literal.LPos); } + // namespace if (vl.isLiteral()) { Literal lvl = (Literal)vl; if (! unifiesNamespace(vt, lvl) ) @@ -370,9 +360,15 @@ vl = new CyclicTerm((Literal)vl, (VarTerm)vt.clone()); } - function.put((VarTerm) vt.cloneNS(Literal.DefaultNS), vl); + function.put(getVarForUnifier(vt), vl); return true; } + + private VarTerm getVarForUnifier(VarTerm v) { + v = (VarTerm)deref(v).cloneNS(Literal.DefaultNS); + v.setNegated(Literal.LPos); + return v; + } public void clear() { function.clear(); Modified: trunk/src/jason/asSyntax/ASSyntax.java =================================================================== --- trunk/src/jason/asSyntax/ASSyntax.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/asSyntax/ASSyntax.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -66,6 +66,8 @@ static { keywords.add(new PredicateIndicator("atomic", 0)); + keywords.add(new PredicateIndicator("breakpoint", 0)); + keywords.add(new PredicateIndicator("all_unifs", 0)); keywords.add(new PredicateIndicator("default", 0)); keywords.add(new PredicateIndicator("source", 0)); @@ -76,15 +78,15 @@ keywords.add(new PredicateIndicator("untell", 0)); keywords.add(new PredicateIndicator("achieve", 0)); keywords.add(new PredicateIndicator("unachieve", 0)); - keywords.add(new PredicateIndicator("ask", 0)); keywords.add(new PredicateIndicator("askOne", 0)); keywords.add(new PredicateIndicator("askAll", 0)); keywords.add(new PredicateIndicator("askHow", 0)); keywords.add(new PredicateIndicator("tellHow", 0)); + keywords.add(new PredicateIndicator("untellHow", 0)); } - public void addKeyword(PredicateIndicator pi) { + public static void addKeyword(PredicateIndicator pi) { keywords.add(pi); } @@ -149,6 +151,13 @@ return new VarTerm(functor); } + /** creates a new variable term (possibly negated) */ + public static VarTerm createVar(boolean negated, String functor) { + VarTerm v = new VarTerm(functor); + v.setNegated(negated); + return v; + } + /** creates a new anonymous (or unnamed) variable */ public static VarTerm createVar() { return new UnnamedVar(); Modified: trunk/src/jason/asSyntax/Literal.java =================================================================== --- trunk/src/jason/asSyntax/Literal.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/asSyntax/Literal.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -124,7 +124,12 @@ /** returns all terms of this literal */ public List<Term> getTerms() { return Structure.emptyTermList; } /** returns all terms of this literal as an array */ - public Term[] getTermsArray() { return getTerms().toArray(Structure.emptyTermArray); } + public Term[] getTermsArray() { + if (hasTerm()) + return getTerms().toArray(Structure.emptyTermArray); + else + return Structure.emptyTermArray; + } private static final List<VarTerm> emptyListVar = new ArrayList<VarTerm>(); /** returns all singleton vars (that appears once) in this literal */ @@ -507,7 +512,7 @@ tfunctor = ASSyntax.parseTerm( ((StringTerm)tfunctor).getString() ); } - Literal l = new LiteralImpl(ns, pos,((Atom)tfunctor).getFunctor(),5); + Literal l = new LiteralImpl(ns, pos,((Atom)tfunctor).getFunctor()); if (i.hasNext()) { l.setTerms(((ListTerm)i.next()).cloneLT()); Modified: trunk/src/jason/asSyntax/LiteralImpl.java =================================================================== --- trunk/src/jason/asSyntax/LiteralImpl.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/asSyntax/LiteralImpl.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -50,12 +50,6 @@ type = pos; } - /** if pos == true, the literal is positive, otherwise it is negative */ - public LiteralImpl(Atom namespace, boolean pos, String functor, int nbTerms) { - super(namespace, functor, nbTerms); - type = pos; - } - public LiteralImpl(Literal l) { super(l); type = !l.negated(); @@ -74,16 +68,18 @@ type = pos; } + /** if pos == true, the literal is positive, otherwise it is negative */ + public LiteralImpl(Atom namespace, boolean pos, String functor) { + super(namespace, functor); + type = pos; + } + /** creates a literal based on another but in another name space and signal */ public LiteralImpl(Atom namespace, boolean pos, Literal l) { super(namespace, l); type = pos; } - protected LiteralImpl(String functor, int terms) { - super(functor, terms); - } - @Override public boolean isAtom() { return super.isAtom() && !negated(); Modified: trunk/src/jason/asSyntax/Pred.java =================================================================== --- trunk/src/jason/asSyntax/Pred.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/asSyntax/Pred.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -50,14 +50,14 @@ super(functor); } - public Pred(Atom namespace, String functor, int nbTerms) { - super(namespace, functor, nbTerms); - } - public Pred(Literal l) { this(l.getNS(), l); } + public Pred(Atom namespace, String functor) { + super(namespace, functor); + } + public Pred(Atom namespace, Literal l) { super(namespace, l); Modified: trunk/src/jason/asSyntax/Structure.java =================================================================== --- trunk/src/jason/asSyntax/Structure.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/asSyntax/Structure.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -59,28 +59,27 @@ public Structure(String functor) { //this.functor = (functor == null ? null : functor.intern()); // it does not improve performance in test i did! - super(functor); - this.terms = new ArrayList<Term>(5); + this(DefaultNS, functor); } - public Structure(Atom namespace, String functor, int nbTerms) { - //this.functor = (functor == null ? null : functor.intern()); // it does not improve performance in test i did! - super(namespace, functor); - if (nbTerms > 0) - this.terms = new ArrayList<Term>(5); - } - - public Structure(Literal l) { this(l.getNS(), l); } + + public Structure(Atom namespace, String functor) { + //this.functor = (functor == null ? null : functor.intern()); // it does not improve performance in test i did! + super(namespace, functor); + } + public Structure(Atom namespace, Literal l) { super(namespace, l); final int tss = l.getArity(); - terms = new ArrayList<Term>(tss); - for (int i = 0; i < tss; i++) - terms.add(l.getTerm(i).clone()); + if (tss > 0) { + terms = new ArrayList<Term>(tss); + for (int i = 0; i < tss; i++) + terms.add(l.getTerm(i).clone()); + } //isGround = null; } @@ -88,9 +87,11 @@ protected Structure(Literal l, Unifier u) { super(l, u); final int tss = l.getArity(); - terms = new ArrayList<Term>(tss); - for (int i = 0; i < tss; i++) - terms.add(l.getTerm(i).capply(u)); + if (tss > 0) { + terms = new ArrayList<Term>(tss); + for (int i = 0; i < tss; i++) + terms.add(l.getTerm(i).capply(u)); + } resetHashCodeCache(); //isGround = null; } @@ -217,6 +218,7 @@ @Override public void addTerm(Term t) { if (t == null) return; + if (terms == null) terms = new ArrayList<Term>(5); terms.add(t); //if (!t.isGround()) // isGround = false; @@ -226,6 +228,7 @@ @Override public void delTerm(int index) { + if (terms == null) return; terms.remove(index); predicateIndicatorCache = null; resetHashCodeCache(); @@ -234,8 +237,8 @@ @Override public Literal addTerms(Term ... ts ) { + if (terms == null) terms = new ArrayList<Term>(5); for (Term t: ts) - //addTerm(t); terms.add(t); predicateIndicatorCache = null; resetHashCodeCache(); @@ -244,8 +247,8 @@ @Override public Literal addTerms(List<Term> l) { + if (terms == null) terms = new ArrayList<Term>(5); for (Term t: l) - //addTerm(t); terms.add(t); predicateIndicatorCache = null; resetHashCodeCache(); @@ -263,6 +266,7 @@ @Override public void setTerm(int i, Term t) { + if (terms == null) terms = new ArrayList<Term>(5); terms.set(i,t); resetHashCodeCache(); //if (!t.isGround() && isGround()) @@ -270,7 +274,10 @@ } public Term getTerm(int i) { - return terms.get(i); + if (terms == null) + return null; + else + return terms.get(i); } @Override Modified: trunk/src/jason/asSyntax/VarTerm.java =================================================================== --- trunk/src/jason/asSyntax/VarTerm.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/asSyntax/VarTerm.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -66,12 +66,9 @@ e.printStackTrace(); } } - public VarTerm(boolean negated, String functor) { - super(negated, functor); - } public VarTerm(Atom namespace, String functor) { - super(namespace, LPos, functor, 0); + super(namespace, LPos, functor); } public VarTerm(Atom namespace, Literal v) { @@ -90,14 +87,6 @@ } @Override - protected int calcHashCode() { - int result = getFunctor().hashCode(); - if (negated()) result += 3271; - // Do not consider NS! - return result; - } - - @Override public Term capply(Unifier u) { if (u != null) { Term vl = u.get(this); @@ -119,10 +108,17 @@ vl = vl.capply(u); // should clone here, since there is no cloning in unify - if (getNS() != Literal.DefaultNS && vl.isLiteral()) { - // use var ns for the value ns - vl = ((Literal)vl).cloneNS( (Atom)getNS().capply(u) ); // this var ns could be a var, so capply + if (vl.isLiteral()) { + if (getNS() != Literal.DefaultNS) { + // TODO: change capply to has the new namespace as parameter and them remove this code + // use var ns for the value ns + vl = ((Literal)vl).cloneNS( (Atom)getNS().capply(u) ); // this var ns could be a var, so capply + } + if (negated()) { + ((Literal)vl).setNegated(Literal.LNeg); + } } + // decide whether to use var annots in apply // X = p[a] @@ -143,15 +139,7 @@ } public Term clone() { - // do not call constructor with term parameter! - //VarTerm t = new VarTerm(super.getFunctor()); - //t.setNegated(!negated()); - VarTerm t = new VarTerm(this.getNS(), this); - //t.srcInfo = this.srcInfo; - //t.hashCodeCache = this.hashCodeCache; - //if (hasAnnot()) - // t.setAnnots(getAnnots().cloneLT()); - return t; + return new VarTerm(this.getNS(), this); } @Override @@ -177,6 +165,10 @@ return false; } + // DO NOT consider ns in equals and hashcode! + // idem for negated + // in the unifier, the vars have no ns neither negation + @Override public boolean equals(Object t) { if (t == null) return false; @@ -184,19 +176,28 @@ // is t also a var? (its value must also be null) if (t instanceof VarTerm) { final VarTerm tAsVT = (VarTerm) t; - // DO NOT consider ns in equals of hashcode! - return negated() == tAsVT.negated() && getFunctor().equals(tAsVT.getFunctor()); // && getNS().equals(tAsVT.getNS()); + return //negated() == tAsVT.negated() && + getFunctor().equals(tAsVT.getFunctor()); // && getNS().equals(tAsVT.getNS()); } return false; } + + @Override + protected int calcHashCode() { + int result = getFunctor().hashCode(); + //if (negated()) result += 3271; // TODO: review + // Do not consider NS and negated! (in unifier, A = ~A) + return result; + } + public int compareTo(Term t) { if (t == null || t.isUnnamedVar()) return -1; else if (t.isVar()) { - if (!negated() && ((VarTerm)t).negated()) - return -1; - else + //if (!negated() && ((VarTerm)t).negated()) + // return -1; + //else return getFunctor().compareTo(((VarTerm)t).getFunctor()); } else { return 1; Modified: trunk/src/jason/bb/ChainBB.java =================================================================== --- trunk/src/jason/bb/ChainBB.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/bb/ChainBB.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -52,8 +52,10 @@ Structure bbs = Structure.parse(s); String[] bbargs = new String[bbs.getArity()]; int i = 0; - for (Term t: bbs.getTerms()) { - bbargs[i++] = t.isString() ? ((StringTerm)t).getString(): t.toString(); + if (bbs.hasTerm()) { + for (Term t: bbs.getTerms()) { + bbargs[i++] = t.isString() ? ((StringTerm)t).getString(): t.toString(); + } } bb.init(ag, bbargs); bb = bb.getNextAdapter(); Modified: trunk/src/jason/bb/DefaultBeliefBase.java =================================================================== --- trunk/src/jason/bb/DefaultBeliefBase.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/bb/DefaultBeliefBase.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -372,10 +372,10 @@ final class BelEntry { final private Deque<Literal> list = new LinkedBlockingDeque<Literal>(); // maintains the order of the beliefs - final private Map<LiteralWrapper,Literal> map = new ConcurrentHashMap<LiteralWrapper,Literal>(); // to find content faster + final private Map<StructureWrapperForLiteral,Literal> map = new ConcurrentHashMap<StructureWrapperForLiteral,Literal>(); // to find content faster public void add(Literal l, boolean addInEnd) { - map.put(new LiteralWrapper(l), l); + map.put(new StructureWrapperForLiteral(l), l); if (addInEnd) { list.addLast(l); } else { @@ -384,7 +384,7 @@ } public void remove(Literal l) { - Literal linmap = map.remove(new LiteralWrapper(l)); + Literal linmap = map.remove(new StructureWrapperForLiteral(l)); if (linmap != null) { list.remove(linmap); } @@ -399,7 +399,7 @@ } public Literal contains(Literal l) { - return map.get(new LiteralWrapper(l)); + return map.get(new StructureWrapperForLiteral(l)); } protected Object clone() { @@ -416,16 +416,6 @@ s.append(l+":"+l.hashCode()+","); } return s.toString(); - } - - /** a literal that uses equalsAsTerm for equals */ - final class LiteralWrapper implements Comparable<LiteralWrapper> { - final private Literal l; - public LiteralWrapper(Literal l) { this.l = l; } - public int hashCode() { return l.hashCode(); } - public boolean equals(Object o) { return o instanceof LiteralWrapper && l.equalsAsStructure(((LiteralWrapper)o).l); } - public String toString() { return l.toString(); } - public int compareTo(LiteralWrapper o) { return l.compareTo(o.l); } - } + } } } Added: trunk/src/jason/bb/StructureWrapperForLiteral.java =================================================================== --- trunk/src/jason/bb/StructureWrapperForLiteral.java (rev 0) +++ trunk/src/jason/bb/StructureWrapperForLiteral.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -0,0 +1,14 @@ +package jason.bb; + +import jason.asSyntax.Literal; + +/** a literal that uses equalsAsTerm for equals */ +public final class StructureWrapperForLiteral implements Comparable<StructureWrapperForLiteral> { + final private Literal l; + public StructureWrapperForLiteral(Literal l) { this.l = l; } + public int hashCode() { return l.hashCode(); } + public boolean equals(Object o) { return o instanceof StructureWrapperForLiteral && l.equalsAsStructure(((StructureWrapperForLiteral)o).l); } + public String toString() { return l.toString(); } + public int compareTo(StructureWrapperForLiteral o) { return l.compareTo(o.l); } + public Literal getLiteral() { return l; } +} Modified: trunk/src/jason/stdlib/package.html =================================================================== --- trunk/src/jason/stdlib/package.html 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/jason/stdlib/package.html 2015-12-11 13:05:52 UTC (rev 1867) @@ -34,6 +34,7 @@ <li>{@link jason.stdlib.findall findall}: find a list of beliefs of some kind.</li> <li>{@link jason.stdlib.setof setof}: find a set of beliefs of some kind.</li> <li>{@link jason.stdlib.count count}: count the number of beliefs of some kind.</li> + <li>{@link jason.stdlib.name_space name_space}: checks whether an argument is a name space.</li> </ul> @@ -142,7 +143,7 @@ <li>{@link jason.stdlib.random random}: produces random numbers.</li> - <li>{@link jason.stdlib.include include}: loads a source code at run time.</li> + <li>{@link jason.stdlib.include include}: imports a source code at run time.</li> </ul> </body> Modified: trunk/src/test/ASParserTest.java =================================================================== --- trunk/src/test/ASParserTest.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/test/ASParserTest.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -49,7 +49,7 @@ assertTrue(l.negated()); Literal l1 = ASSyntax.parseLiteral("~B"); Literal l2 = ASSyntax.parseLiteral("B"); - assertFalse(l1.equals(l2)); + assertTrue(l1.equals(l2)); // see comment in varterm equals } public void testTrue() throws ParseException { Modified: trunk/src/test/BeliefBaseTest.java =================================================================== --- trunk/src/test/BeliefBaseTest.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/test/BeliefBaseTest.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -21,6 +21,7 @@ import jason.bb.DefaultBeliefBase; import jason.bb.JDBCPersistentBB; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -630,6 +631,30 @@ assertEquals(ag.getBB().size(), c.size()); } + public void testBUF() { + Agent ag = new Agent(); + ag.initAg(); + + ag.getBB().add(Literal.parseLiteral("a(10)[source(bob)]")); + List<Literal> percepts = new ArrayList<Literal>(); + percepts.add(Literal.parseLiteral("a(10)")); + percepts.add(Literal.parseLiteral("a(20)")); + + assertEquals(2,ag.buf(percepts)); + assertEquals(2,ag.getBB().size()); + + assertEquals(0,ag.buf(new ArrayList<Literal>(percepts))); + assertEquals(2,ag.getBB().size()); + + percepts.remove(1); // remove a(20) + assertEquals(1,ag.buf(new ArrayList<Literal>(percepts))); + assertEquals(1,ag.getBB().size()); + + percepts.clear(); + assertEquals(1,ag.buf(new ArrayList<Literal>(percepts))); + assertEquals(1,ag.getBB().size()); + } + private int iteratorSize(@SuppressWarnings("rawtypes") Iterator i) { int c = 0; while (i.hasNext()) { Modified: trunk/src/test/NSTest.java =================================================================== --- trunk/src/test/NSTest.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/test/NSTest.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -128,9 +128,9 @@ // ns::A = ns::B // A -> B u = new Unifier(); assertTrue(u.unifies(p1, p6)); - assertTrue(u.unifies(new VarTerm("A"), ASSyntax.parseLiteral("ns::bob(45)"))); - Literal t = (Literal)p1.capply(u); - assertEquals("ns::bob(45)", t.toString()); + assertFalse(u.unifies(new VarTerm("A"), ASSyntax.parseLiteral("ns::bob(45)"))); + //Literal t = (Literal)p1.capply(u); + //assertEquals("ns::bob(45)", t.toString()); // ns::A = other::B // fail u = new Unifier(); Modified: trunk/src/test/VarTermTest.java =================================================================== --- trunk/src/test/VarTermTest.java 2015-12-11 11:01:07 UTC (rev 1866) +++ trunk/src/test/VarTermTest.java 2015-12-11 13:05:52 UTC (rev 1867) @@ -562,7 +562,7 @@ Literal l2 = ASSyntax.parseLiteral("~p(1)"); Unifier u = new Unifier(); assertTrue(u.unifies(l1, l2)); // ~B = ~p(1) - assertEquals(u.get((VarTerm)l1).toString(),"~p(1)"); + assertEquals(u.get((VarTerm)l1).toString(),"p(1)"); // apply in ~B should result in ~p(1) assertEquals(l1.capply(u).toString(),"~p(1)"); @@ -584,6 +584,11 @@ assertEquals(l1.capply(u).toString(),"~p(1)"); l1 = ASSyntax.parseLiteral("~B"); + l2 = ASSyntax.parseLiteral("A"); + u = new Unifier(); + assertFalse(u.unifies(l1, l2)); + + l1 = ASSyntax.parseLiteral("~B"); l2 = ASSyntax.parseLiteral("~A"); u = new Unifier(); assertTrue(u.unifies(l1, l2)); @@ -601,38 +606,39 @@ l2 = ASSyntax.parseLiteral("~A"); u = new Unifier(); assertTrue(u.unifies(l1, l2)); // A = B - // if ~A = ~p(10), apply in B should be p(10). + // if ~A = ~p(10), then B -> p(10). assertTrue(u.unifies(l2, ASSyntax.parseLiteral("~p(10)"))); //l2.apply(u); - assertEquals(l2.capply(u).toString(),"~p(10)"); + assertEquals("~p(10)", l2.capply(u).toString()); //l1.apply(u); - assertEquals(l1.capply(u).toString(),"~p(10)"); // ~B is ~p(10) + assertEquals("~p(10)", l1.capply(u).toString()); // ~B is ~p(10) VarTerm vb = new VarTerm("B"); //vb.apply(u); - assertEquals(vb.capply(u).toString(),"p(10)"); // B is p(10) + assertEquals("p(10)", vb.capply(u).toString()); u = new Unifier(); u.unifies(new VarTerm("A"),ASSyntax.parseLiteral("p(10)")); u.unifies(new VarTerm("B"),ASSyntax.parseLiteral("~p(10)")); assertFalse(u.unifies(new VarTerm("A"), new VarTerm("B"))); + l1 = ASSyntax.parseLiteral("~B"); l2 = ASSyntax.parseLiteral("~A"); assertFalse(u.unifies(l1, l2)); u = new Unifier(); u.unifies(new VarTerm("A"),ASSyntax.parseLiteral("p(10)")); - assertFalse(u.unifies(new VarTerm(Literal.LNeg,"B"),new VarTerm("A"))); + assertFalse(u.unifies( ASSyntax.createVar(Literal.LNeg, "B"), new VarTerm("A"))); u = new Unifier(); u.unifies(new VarTerm("A"),ASSyntax.parseLiteral("~p(10)")); - vb = new VarTerm(Literal.LNeg,"B"); + vb = ASSyntax.createVar(Literal.LNeg, "B"); assertTrue(u.unifies(vb,new VarTerm("A"))); //vb.apply(u); assertEquals(vb.capply(u).toString(),"~p(10)"); u = new Unifier(); u.unifies(new VarTerm("A"),ASSyntax.parseLiteral("~p(10)")); - vb = new VarTerm(Literal.LNeg,"B"); + vb = ASSyntax.createVar(Literal.LNeg, "B"); assertTrue(u.unifies(vb,new VarTerm("A"))); vb = new VarTerm("B"); //vb.apply(u); @@ -643,6 +649,7 @@ // => apply B is ~p(10) // apply A is p(10) // apply ~A is ~p(10) + /* should not work any more (B = ~A does not unify) l1 = ASSyntax.parseLiteral("B"); l2 = ASSyntax.parseLiteral("~A"); u = new Unifier(); @@ -654,7 +661,8 @@ //l1.apply(u); assertEquals(l1.capply(u).toString(),"~p(10)"); //l2.apply(u); - assertEquals(l2.capply(u).toString(),"~p(10)"); + assertEquals(l2.capply(u).toString(),"~p(10)"); + */ } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |