|
From: <jom...@us...> - 2009-03-18 14:40:29
|
Revision: 1473
http://jason.svn.sourceforge.net/jason/?rev=1473&view=rev
Author: jomifred
Date: 2009-03-18 14:40:06 +0000 (Wed, 18 Mar 2009)
Log Message:
-----------
add unifier in the current_intention
Modified Paths:
--------------
trunk/demos/failure/a.asl
trunk/doc/faq/faq.tex
trunk/release-notes.txt
trunk/src/jason/asSemantics/IntendedMeans.java
trunk/src/jason/asSemantics/Unifier.java
trunk/src/jason/asSyntax/Pred.java
trunk/src/jason/asSyntax/Structure.java
trunk/src/jason/asSyntax/UnnamedVar.java
trunk/src/jason/stdlib/concat.java
trunk/src/jason/stdlib/current_intention.java
trunk/src/jason/stdlib/plan_label.java
trunk/src/jason/stdlib/relevant_plans.java
trunk/src/test/ListTermTest.java
Modified: trunk/demos/failure/a.asl
===================================================================
--- trunk/demos/failure/a.asl 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/demos/failure/a.asl 2009-03-18 14:40:06 UTC (rev 1473)
@@ -16,6 +16,6 @@
!print_im(IntendedMeans).
+!print_im([]).
-+!print_im([im(_PlanLabel,Body)|R])
- <- .println("* ",Body);
++!print_im([im(PlanLabel,Body,Unif)|R])
+ <- .println("* ",Body," * unifier: ",Unif);
!print_im(R).
Modified: trunk/doc/faq/faq.tex
===================================================================
--- trunk/doc/faq/faq.tex 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/doc/faq/faq.tex 2009-03-18 14:40:06 UTC (rev 1473)
@@ -887,13 +887,13 @@
\begin{verbatim}
intention(1,
[
- im(l__6[source(self)],{ .current_intention(I); ..... }),
- im(l__5[source(self)],{ .fail"]),
- im(l__4[source(self)],{ !g5(X)[source(self)]; .print(endg4) }),
- im(l__3[source(self)],{ !g4(X)[source(self)]; .print(endg3) }),
- im(l__2[source(self)],{ !g3(X)[source(self)]; .print(endg2) }),
- im(l__1[source(self)],{ !g2(X)[source(self)]; .print(endg1) }),
- im(l__0[source(self)],{ !g1(X)[source(self)]; .print("End, X=",X) })
+ im(l__6[source(self)], { .current_intention(I); ... }, [map(I,...),...]),
+ im(l__5[source(self)], { .fail }, []),
+ im(l__4[source(self)], { !g5(X); .print(endg4) }, [map(X,failure)]),
+ im(l__3[source(self)], { !g4(X); .print(endg3) }, [map(X,failure)]),
+ im(l__2[source(self)], { !g3(X); .print(endg2) }, [map(X,failure)]),
+ im(l__1[source(self)], { !g2(X); .print(endg1) }, [map(X,failure)]),
+ im(l__0[source(self)], { !g1(X); .print("End, X=",X) }, [map(X,failure)])
]
)
\end{verbatim}
Modified: trunk/release-notes.txt
===================================================================
--- trunk/release-notes.txt 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/release-notes.txt 2009-03-18 14:40:06 UTC (rev 1473)
@@ -15,6 +15,11 @@
It may be used in send tellHow
.send(bob, tellHow, { +te : c <- a1 }).
+
+ It is also used by internal actions that 'return' plans, like
+ . plan_label
+ . relevant_plans
+ . current_intention
The advantages are that unification works
e.g. .at("now +1 m", {+stop(ID)})
@@ -30,7 +35,10 @@
// add a plan with a fixed event/context and body
// given as a parameter
-
+- The performance is improved (+- 15%) by not cloning all the
+ plan in the creation of intended means
+
+
Changes in the GUI
- When closing the window of MAS Console, the application is also
stopped.
Modified: trunk/src/jason/asSemantics/IntendedMeans.java
===================================================================
--- trunk/src/jason/asSemantics/IntendedMeans.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/asSemantics/IntendedMeans.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -129,11 +129,10 @@
public Term getAsTerm() {
if (planBody instanceof PlanBodyImpl) {
- //Plan p = new Plan((Pred)plan.getLabel().clone(), getTrigger().clone(), plan.getContext(), planBody.clonePB());
- //p.makeVarsAnnon();
+ // TODO: use same replacements (Var -> Unnamed var) for the plan and for the unifier
PlanBody bd = (PlanBody)((PlanBodyImpl)planBody.clone()).makeVarsAnnon();
bd.setAsBodyTerm(true);
- return ASSyntax.createStructure("im", ASSyntax.createString(plan.getLabel()), bd);
+ return ASSyntax.createStructure("im", ASSyntax.createString(plan.getLabel()), bd, unif.getAsTerm());
} else {
return ASSyntax.createAtom("noimplementedforclass"+planBody.getClass().getSimpleName());
}
Modified: trunk/src/jason/asSemantics/Unifier.java
===================================================================
--- trunk/src/jason/asSemantics/Unifier.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/asSemantics/Unifier.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -23,10 +23,15 @@
package jason.asSemantics;
+import jason.asSyntax.ASSyntax;
+import jason.asSyntax.ListTerm;
+import jason.asSyntax.ListTermImpl;
import jason.asSyntax.Literal;
import jason.asSyntax.Pred;
+import jason.asSyntax.Structure;
import jason.asSyntax.Term;
import jason.asSyntax.Trigger;
+import jason.asSyntax.UnnamedVar;
import jason.asSyntax.VarTerm;
import java.util.HashMap;
@@ -279,6 +284,19 @@
public String toString() {
return function.toString();
}
+
+ public Term getAsTerm() {
+ ListTerm lf = new ListTermImpl();
+ ListTerm tail = lf;
+ for (VarTerm k: function.keySet()) {
+ Term vl = function.get(k).clone();
+ if (vl instanceof Literal)
+ ((Literal)vl).makeVarsAnnon();
+ Structure pair = ASSyntax.createStructure("map", new UnnamedVar("_"+UnnamedVar.getUniqueId()+k), vl); // the var must be changed to avoid cyclic references latter
+ tail = tail.append(pair);
+ }
+ return lf;
+ }
public int size() {
return function.size();
Modified: trunk/src/jason/asSyntax/Pred.java
===================================================================
--- trunk/src/jason/asSyntax/Pred.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/asSyntax/Pred.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -406,7 +406,7 @@
if (vt.isUnnamedVar()) {
uv = (UnnamedVar)vt;
} else {
- uv = new UnnamedVar();
+ uv = new UnnamedVar("_"+UnnamedVar.getUniqueId()+ta);
un.bind(vt, uv);
}
lt.setTerm(uv);
Modified: trunk/src/jason/asSyntax/Structure.java
===================================================================
--- trunk/src/jason/asSyntax/Structure.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/asSyntax/Structure.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -287,7 +287,7 @@
if (vt.isUnnamedVar()) {
uv = (UnnamedVar)vt;
} else {
- uv = new UnnamedVar();
+ uv = new UnnamedVar( "_"+UnnamedVar.getUniqueId()+ti);
un.bind(vt, uv);
}
setTerm(i,uv);
Modified: trunk/src/jason/asSyntax/UnnamedVar.java
===================================================================
--- trunk/src/jason/asSyntax/UnnamedVar.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/asSyntax/UnnamedVar.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -42,13 +42,17 @@
public UnnamedVar(String name) {
super( name.length() == 1 ? "_" + (varCont++) : name);
- myId = varCont++;
+ myId = varCont;
}
public UnnamedVar(int id) {
super("_" + id);
myId = id;
}
+
+ public static int getUniqueId() {
+ return varCont++;
+ }
public Term clone() {
if (hasValue()) {
Modified: trunk/src/jason/stdlib/concat.java
===================================================================
--- trunk/src/jason/stdlib/concat.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/stdlib/concat.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -53,6 +53,13 @@
<li> <code>.concat([a,b,c],[d,e],[f,g],X)</code>: <code>X</code> unifies with <code>[a,b,c,d,e,f,g]</code>.
</ul>
+ <p>Note: this internal action does not implement backtrack. You if need backtrack, you can add
+ and use the following rules in your code:
+ <pre>
+ concat([ ], L, L).
+ concat([H|T], L, [H|M]) :- concat(T, L, M).
+ </pre>
+
@see jason.stdlib.delete
@see jason.stdlib.length
@see jason.stdlib.member
@@ -94,7 +101,7 @@
return un.unifies(result, args[args.length-1]);
- } else {
+ } else if (args[0].isString()) {
// string concat
if (!args[args.length-1].isVar() && !args[args.length-1].isString()) {
throw JasonException.createWrongArgument(this,"Last argument '"+args[args.length-1]+"' is not a string nor a variable.");
@@ -112,6 +119,8 @@
sr.append(vl);
}
return un.unifies(new StringTermImpl(sr.toString()), args[args.length-1]);
+ } else {
+ throw JasonException.createWrongArgument(this,"First argument '"+args[0]+"' must be a list or string.");
}
}
}
Modified: trunk/src/jason/stdlib/current_intention.java
===================================================================
--- trunk/src/jason/stdlib/current_intention.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/stdlib/current_intention.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -41,16 +41,16 @@
where each intended means has the form:<br><br>
- <code>im(<i>plan label</i>,<i>plan body term</i>)</code><br><br>
+ <code>im(<i>plan label</i>,<i>plan body term</i>, <i>unification function (a list of maps)</i>)</code><br><br>
For example:<br><br>
<blockquote>
<code>intention(1,<br>
[<br>
- im(l__6[source(self)],{ .current_intention(I); .print(end) }),<br>
- im(l__5[source(self)],{ .fail}),<br>
- im(l__4[source(self)],{ !g5(X); .print(endg4) }),<br>
+ im(l__6[source(self)],{ .current_intention(I); .print(end) }, [map(I, ....)]),<br>
+ im(l__5[source(self)],{ .fail }, []),<br>
+ im(l__4[source(self)],{ !g5(X); .print(endg4) }, [map(X, test)]),<br>
...<br>
])</code>
</blockquote>
Modified: trunk/src/jason/stdlib/plan_label.java
===================================================================
--- trunk/src/jason/stdlib/plan_label.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/stdlib/plan_label.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -80,6 +80,7 @@
p = (Plan)p.clone();
p.getLabel().delSources();
p.setAsPlanTerm(true);
+ p.makeVarsAnnon();
//String ps = p.toASString().replaceAll("\"", "\\\\\"");
//return un.unifies(new StringTermImpl(ps), args[0]);
return un.unifies(p, args[0]);
Modified: trunk/src/jason/stdlib/relevant_plans.java
===================================================================
--- trunk/src/jason/stdlib/relevant_plans.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/jason/stdlib/relevant_plans.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -95,10 +95,10 @@
for (Option opt: rp) {
// remove sources (this IA is used for communication)
Plan np = (Plan)opt.getPlan().clone();
- if (np.getLabel() != null) {
+ if (np.getLabel() != null)
np.getLabel().delSources();
- }
np.setAsPlanTerm(true);
+ np.makeVarsAnnon();
//StringTerm stplan = new StringTermImpl(np.toASString().replaceAll("\\\"", "\\\\\""));
//last = last.append(stplan);
last = last.append(np);
Modified: trunk/src/test/ListTermTest.java
===================================================================
--- trunk/src/test/ListTermTest.java 2009-03-17 22:19:02 UTC (rev 1472)
+++ trunk/src/test/ListTermTest.java 2009-03-18 14:40:06 UTC (rev 1473)
@@ -1,6 +1,7 @@
package test;
import jason.asSemantics.Unifier;
+import jason.asSyntax.ASSyntax;
import jason.asSyntax.Atom;
import jason.asSyntax.ListTerm;
import jason.asSyntax.ListTermImpl;
@@ -21,11 +22,11 @@
protected void setUp() throws Exception {
super.setUp();
- l1 = ListTermImpl.parseList("[a,b,c]");
- l2 = ListTermImpl.parseList("[a(1,2),b(r,t)|T]");
- l3 = ListTermImpl.parseList("[A|T]");
- l4 = ListTermImpl.parseList("[X,b,T]");
- l5 = ListTermImpl.parseList("[[b,c]]");
+ l1 = ASSyntax.parseList("[a,b,c]");
+ l2 = ASSyntax.parseList("[a(1,2),b(r,t)|T]");
+ l3 = ASSyntax.parseList("[A|T]");
+ l4 = ASSyntax.parseList("[X,b,T]");
+ l5 = ASSyntax.parseList("[[b,c]]");
//System.out.println("l1="+l1+"\nl2="+l2+"\nl3="+l3+"\nl4="+l4);
//System.out.println("l5="+l5);
}
@@ -37,11 +38,17 @@
assertEquals(l4.size(), 3);
assertEquals(l5.size(), 1);
- ListTerm l = new ListTermImpl();
+ ListTerm l = new ListTermImpl();
l.add(new Structure("a"));
l.add(new Structure("a"));
l.add(new Structure("a"));
assertEquals(l.size(), 3);
+
+ assertTrue(l1.isList());
+ assertTrue(l2.isList());
+ assertTrue(l3.isList());
+ assertTrue(l4.isList());
+ assertTrue(l5.isList());
}
public void testToString() {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|