|
From: <jom...@us...> - 2009-03-11 20:08:20
|
Revision: 1465
http://jason.svn.sourceforge.net/jason/?rev=1465&view=rev
Author: jomifred
Date: 2009-03-11 20:08:12 +0000 (Wed, 11 Mar 2009)
Log Message:
-----------
improve unification for plan as term
Modified Paths:
--------------
trunk/src/jason/asSyntax/ASSyntax.java
trunk/src/jason/asSyntax/Plan.java
trunk/src/jason/asSyntax/PlanBodyImpl.java
trunk/src/jason/asSyntax/parser/AS2JavaParser.jcc
trunk/src/jason/asSyntax/parser/as2j.java
trunk/src/test/ASParserTest.java
trunk/src/test/PlanTest.java
Modified: trunk/src/jason/asSyntax/ASSyntax.java
===================================================================
--- trunk/src/jason/asSyntax/ASSyntax.java 2009-03-11 08:46:55 UTC (rev 1464)
+++ trunk/src/jason/asSyntax/ASSyntax.java 2009-03-11 20:08:12 UTC (rev 1465)
@@ -173,9 +173,4 @@
public static LogicalFormula parseFormula(String sExpr) throws ParseException {
return (LogicalFormula)new as2j(new StringReader(sExpr)).log_expr();
}
-
- /** creates a new plan's body */
- public static PlanBody parsePlanBody(String sExpr) throws ParseException {
- return (PlanBody)new as2j(new StringReader(sExpr)).plan_body();
- }
}
Modified: trunk/src/jason/asSyntax/Plan.java
===================================================================
--- trunk/src/jason/asSyntax/Plan.java 2009-03-11 08:46:55 UTC (rev 1464)
+++ trunk/src/jason/asSyntax/Plan.java 2009-03-11 20:08:12 UTC (rev 1465)
@@ -102,6 +102,16 @@
}
}
+ @Override
+ public boolean apply(Unifier u) {
+ boolean r = false;
+ // if I am a term, the body also is (for apply)
+ if (isTerm) body.setAsBodyTerm(true);
+ r = super.apply(u);
+ if (isTerm) body.setAsBodyTerm(false);
+ return r;
+ }
+
public void setLabel(Pred p) {
label = p;
if (p != null && p.hasAnnot()) {
Modified: trunk/src/jason/asSyntax/PlanBodyImpl.java
===================================================================
--- trunk/src/jason/asSyntax/PlanBodyImpl.java 2009-03-11 08:46:55 UTC (rev 1464)
+++ trunk/src/jason/asSyntax/PlanBodyImpl.java 2009-03-11 20:08:12 UTC (rev 1465)
@@ -46,9 +46,8 @@
if (b != null) {
srcInfo = b.getSrcInfo();
// the atom issue is solved in TS
- //if (b.isAtom()) {
+ //if (b.isAtom())
// b = ((Atom)b).forceFullLiteralImpl();
- //}
}
term = b;
}
@@ -82,8 +81,16 @@
public boolean isBodyTerm() {
return isTerm;
}
+
+ @Override
+ public boolean isAtom() {
+ return false;
+ }
+
public void setAsBodyTerm(boolean b) {
isTerm = b;
+ if (getBodyNext() != null)
+ getBodyNext().setAsBodyTerm(b);
}
@Override
@@ -143,18 +150,31 @@
// do not apply in next! (except in case this is a term)
boolean ok = false;
+ if (next != null && isTerm) {
+ //next.setAsBodyTerm(true); // to force apply in next
+ ok = next.apply(u);
+ //next.setAsBodyTerm(false);
+ }
+
if (term != null && term.apply(u)) {
if (term.isPlanBody()) { // we cannot have "inner" body literals
+ PlanBody baknext = next;
formType = ((PlanBody)term).getBodyType();
+ next = ((PlanBody)term).getBodyNext();
term = ((PlanBody)term).getBodyTerm();
+ if (baknext != null) {
+ //baknext.setAsBodyTerm(true); // to force apply in next
+ baknext.apply(u);
+ //baknext.setAsBodyTerm(false);
+ getLastBody().add(baknext);
+ }
}
ok = true;
}
- if (next != null && isTerm && next.apply(u))
- ok = true;
-
+
if (ok)
resetHashCodeCache();
+
return ok;
}
@@ -268,18 +288,22 @@
if (term == null) {
return "";
} else {
- String b, e;
- if (isTerm) {
- b = "{ ";
- e = " }";
- } else {
- b = "";
- e = "";
+ StringBuilder out = new StringBuilder();
+ if (isTerm)
+ out.append("{ ");
+ PlanBody pb = this;
+ while (pb != null) {
+ if (pb.getBodyTerm() != null) {
+ out.append(pb.getBodyType());
+ out.append(pb.getBodyTerm());
+ }
+ pb = pb.getBodyNext();
+ if (pb != null)
+ out.append("; ");
}
- if (next == null)
- return b+formType.toString() + term+e;
- else
- return b+formType.toString() + term + "; " + next+e;
+ if (isTerm)
+ out.append(" }");
+ return out.toString();
}
}
Modified: trunk/src/jason/asSyntax/parser/AS2JavaParser.jcc
===================================================================
--- trunk/src/jason/asSyntax/parser/AS2JavaParser.jcc 2009-03-11 08:46:55 UTC (rev 1464)
+++ trunk/src/jason/asSyntax/parser/AS2JavaParser.jcc 2009-03-11 20:08:12 UTC (rev 1465)
@@ -361,7 +361,7 @@
Term plan_term(): { Trigger T = null; Object C = null; PlanBody B = null, B1 = null; Plan P = null; boolean pb = true; Pred L = null; }
// pb = "only plan body"
{
- "{"
+ "{"
[ [<TK_LABEL_AT> L=pred() { pb = false; } ]
T = trigger() { if (T.getType() != TEType.belief) pb = false; }
[ ":" C = log_expr() { pb = false; } ]
@@ -400,7 +400,10 @@
}
// the case of a simple plan body term
+ if (B == null)
+ B = new PlanBodyImpl();
B.setAsBodyTerm(true);
+
return B;
}
}
Modified: trunk/src/jason/asSyntax/parser/as2j.java
===================================================================
--- trunk/src/jason/asSyntax/parser/as2j.java 2009-03-11 08:46:55 UTC (rev 1464)
+++ trunk/src/jason/asSyntax/parser/as2j.java 2009-03-11 20:08:12 UTC (rev 1465)
@@ -565,7 +565,10 @@
}
// the case of a simple plan body term
+ if (B == null)
+ B = new PlanBodyImpl();
B.setAsBodyTerm(true);
+
{if (true) return B;}
throw new Error("Missing return statement in function");
}
@@ -1319,11 +1322,16 @@
finally { jj_save(0, xla); }
}
- final private boolean jj_3R_15() {
- if (jj_3R_17()) return true;
+ final private boolean jj_3R_14() {
+ if (jj_3R_16()) return true;
return false;
}
+ final private boolean jj_3R_17() {
+ if (jj_scan_token(42)) return true;
+ return false;
+ }
+
final private boolean jj_3_1() {
if (jj_scan_token(27)) return true;
if (jj_scan_token(TK_BEGIN)) return true;
@@ -1332,8 +1340,8 @@
return false;
}
- final private boolean jj_3R_14() {
- if (jj_3R_16()) return true;
+ final private boolean jj_3R_13() {
+ if (jj_scan_token(39)) return true;
return false;
}
@@ -1342,16 +1350,6 @@
return false;
}
- final private boolean jj_3R_17() {
- if (jj_scan_token(42)) return true;
- return false;
- }
-
- final private boolean jj_3R_13() {
- if (jj_scan_token(39)) return true;
- return false;
- }
-
final private boolean jj_3R_12() {
Token xsp;
xsp = jj_scanpos;
@@ -1373,6 +1371,11 @@
return false;
}
+ final private boolean jj_3R_15() {
+ if (jj_3R_17()) return true;
+ return false;
+ }
+
public as2jTokenManager token_source;
SimpleCharStream jj_input_stream;
public Token token, jj_nt;
Modified: trunk/src/test/ASParserTest.java
===================================================================
--- trunk/src/test/ASParserTest.java 2009-03-11 08:46:55 UTC (rev 1464)
+++ trunk/src/test/ASParserTest.java 2009-03-11 20:08:12 UTC (rev 1465)
@@ -174,20 +174,28 @@
}
public void testParsingPlanBodyTerm1() throws ParseException {
- Literal l = Literal.parseLiteral("p( {a1(f);a2}, a3, {!g}, {?b;.print(oi) }, 10)");
- assertEquals("p({ a1(f); a2 },a3,{ !g },{ ?b; .print(oi) },10)", l.toString());
+ Literal l = ASSyntax.parseLiteral("p( {a1({f}); a2}, a3, {!g}, {?b;.print(oi) }, 10)");
+ assertEquals("p({ a1({ f }); a2 },a3,{ !g },{ ?b; .print(oi) },10)", l.toString());
assertEquals(5,l.getArity());
assertTrue(l.getTerm(0) instanceof PlanBody);
assertTrue(l.getTerm(0).isPlanBody());
PlanBody pb = (PlanBody)l.getTerm(0);
assertTrue(pb.isBodyTerm());
+ Structure t0 = (Structure)pb.getBodyTerm();
+ assertTrue(t0.getTerm(0).isPlanBody());
+ pb = pb.getBodyNext();
+ assertEquals("{ a2 }", pb.toString());
assertFalse(l.getTerm(1).isPlanBody());
assertTrue(l.getTerm(2).isPlanBody());
assertTrue(l.getTerm(3).isPlanBody());
assertFalse(l.getTerm(4).isPlanBody());
+
+ pb = (PlanBody)ASSyntax.parseTerm("{ }");
+ assertEquals(0, pb.getPlanSize());
}
+
public void testParsingPlanBodyTerm2() throws ParseException {
Unifier un = new Unifier();
Term t = ASSyntax.parseTerm("{ +a(10) }");
@@ -199,7 +207,7 @@
assertTrue(t.isPlanBody());
PlanBody pb = (PlanBody)t;
assertEquals(2, pb.getPlanSize());
-
+
t = ASSyntax.parseTerm("{ -a : b <- c1; c2 }");
assertEquals("{ -a : b <- c1; c2 }", t.toString());
Modified: trunk/src/test/PlanTest.java
===================================================================
--- trunk/src/test/PlanTest.java 2009-03-11 08:46:55 UTC (rev 1464)
+++ trunk/src/test/PlanTest.java 2009-03-11 20:08:12 UTC (rev 1465)
@@ -8,6 +8,7 @@
import jason.asSyntax.PlanBody;
import jason.asSyntax.PlanBodyImpl;
import jason.asSyntax.PlanLibrary;
+import jason.asSyntax.Term;
import jason.asSyntax.VarTerm;
import jason.asSyntax.PlanBody.BodyType;
import jason.asSyntax.parser.ParseException;
@@ -112,4 +113,26 @@
assertEquals(".print(a); !g1", u.get("A3").toString());
}
+ public void testPlanTermWithVarBody() throws ParseException {
+ Term pt = ASSyntax.parseTerm("{ +!g : c <- B }");
+ assertEquals("{ +!g : c <- B }", pt.toString());
+ assertTrue(pt instanceof Plan);
+
+ Unifier u = new Unifier();
+ u.unifies(new VarTerm("B"), ASSyntax.parseTerm("{ .print(a); .print(b); .print(c) }"));
+ pt.apply(u);
+ assertEquals("{ +!g : c <- .print(a); .print(b); .print(c) }", pt.toString());
+
+
+ pt = ASSyntax.parseTerm("{ +!g : c <- B; a1; B }");
+ pt.apply(u);
+ assertEquals("{ +!g : c <- .print(a); .print(b); .print(c); a1; .print(a); .print(b); .print(c) }", pt.toString());
+
+ pt = ASSyntax.parseTerm("{ +!g : c <- .print(0); B; B; .print(d); C }");
+ u.unifies(new VarTerm("C"), ASSyntax.parseTerm("{ a1 }"));
+ pt.apply(u);
+ assertEquals(9, ((Plan)pt).getBody().getPlanSize());
+ assertEquals("{ +!g : c <- .print(0); .print(a); .print(b); .print(c); .print(a); .print(b); .print(c); .print(d); a1 }", pt.toString());
+ }
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|