From 25b489814180cc56ac8cd45168e3b4eaf370a6f4 Mon Sep 17 00:00:00 2001
From: jgeldart <jgeldart@91dfdad4-c543-0410-b26a-7d79dded8189>
Date: Sat, 9 Feb 2008 18:29:21 +0000
Subject: [PATCH] Initial import of the library-fied OpenNARS. Based upon
 revision 14 of the standard NARS application. There is still much to do in
 order to make this a proper library including overhauling the way parameters
 are done and simplifying the code-flow in the reasoner itself. NullPointer
 exceptions to be expected at the moment, unfortunately. This also includes
 the start of my work on the Non-Axiomatic Ontology Language (LOAN).

---
 open-nars/LICENSE.txt                         |  339 ++
 .../com/googlecode/opennars/entity/Base.java  |  142 +
 .../opennars/entity/BudgetValue.java          |  163 +
 .../googlecode/opennars/entity/Concept.java   |  315 ++
 .../com/googlecode/opennars/entity/Goal.java  |   35 +
 .../com/googlecode/opennars/entity/Item.java  |   78 +
 .../googlecode/opennars/entity/Judgement.java |   82 +
 .../googlecode/opennars/entity/Question.java  |   38 +
 .../googlecode/opennars/entity/Sentence.java  |  156 +
 .../opennars/entity/ShortFloat.java           |   78 +
 .../com/googlecode/opennars/entity/Task.java  |   77 +
 .../googlecode/opennars/entity/TaskLink.java  |   88 +
 .../googlecode/opennars/entity/TermLink.java  |  170 +
 .../opennars/entity/TruthValue.java           |   81 +
 .../googlecode/opennars/entity/package.html   |   21 +
 .../opennars/inference/BudgetFunctions.java   |  239 ++
 .../inference/CompositionalRules.java         |  370 ++
 .../opennars/inference/MatchingRules.java     |  205 +
 .../opennars/inference/RuleTables.java        |  440 ++
 .../opennars/inference/StructuralRules.java   |  435 ++
 .../opennars/inference/SyllogisticRules.java  |  512 +++
 .../opennars/inference/TruthFunctions.java    |  369 ++
 .../opennars/inference/UtilityFunctions.java  |   58 +
 .../opennars/inference/package.html           |   35 +
 .../opennars/language/CompoundTerm.java       |  638 +++
 .../opennars/language/Conjunction.java        |  133 +
 .../language/ConjunctionParallel.java         |  127 +
 .../language/ConjunctionSequence.java         |   97 +
 .../opennars/language/DifferenceExt.java      |  105 +
 .../opennars/language/DifferenceInt.java      |  107 +
 .../opennars/language/Disjunction.java        |  129 +
 .../opennars/language/Equivalence.java        |   99 +
 .../opennars/language/EquivalenceAfter.java   |  100 +
 .../opennars/language/EquivalenceWhen.java    |   95 +
 .../opennars/language/ImageExt.java           |  172 +
 .../opennars/language/ImageInt.java           |  172 +
 .../opennars/language/Implication.java        |   93 +
 .../opennars/language/ImplicationAfter.java   |   99 +
 .../opennars/language/ImplicationBefore.java  |   99 +
 .../opennars/language/ImplicationWhen.java    |   99 +
 .../opennars/language/Inheritance.java        |   90 +
 .../opennars/language/Instance.java           |   43 +
 .../opennars/language/InstanceProperty.java   |   43 +
 .../opennars/language/IntersectionExt.java    |  139 +
 .../opennars/language/IntersectionInt.java    |  139 +
 .../opennars/language/Negation.java           |   97 +
 .../googlecode/opennars/language/Product.java |   99 +
 .../opennars/language/Property.java           |   43 +
 .../googlecode/opennars/language/SetExt.java  |  124 +
 .../googlecode/opennars/language/SetInt.java  |  124 +
 .../opennars/language/Similarity.java         |   99 +
 .../opennars/language/Statement.java          |  281 ++
 .../googlecode/opennars/language/Tense.java   |   53 +
 .../opennars/language/TenseFuture.java        |  106 +
 .../opennars/language/TensePast.java          |  106 +
 .../opennars/language/TensePresent.java       |  102 +
 .../googlecode/opennars/language/Term.java    |  129 +
 .../opennars/language/Variable.java           |  234 ++
 .../googlecode/opennars/language/package.html |   71 +
 .../com/googlecode/opennars/main/Memory.java  |  462 +++
 .../googlecode/opennars/main/Parameters.java  |  103 +
 .../googlecode/opennars/main/Reasoner.java    |  241 ++
 .../com/googlecode/opennars/main/package.html |   27 +
 .../googlecode/opennars/operation/GoTo.java   |   41 +
 .../googlecode/opennars/operation/Open.java   |   42 +
 .../opennars/operation/Operator.java          |   53 +
 .../googlecode/opennars/operation/Pick.java   |   40 +
 .../opennars/operation/package.html           |   16 +
 .../com/googlecode/opennars/overview.html     |   14 +
 .../parser/InvalidInputException.java         |   31 +
 .../googlecode/opennars/parser/Parser.java    |   17 +
 .../googlecode/opennars/parser/loan/loan.g    |  474 +++
 .../opennars/parser/loan/loan.tokens          |   76 +
 .../opennars/parser/loan/loanLexer.java       | 3574 +++++++++++++++++
 .../opennars/parser/loan/loanParser.java      | 3160 +++++++++++++++
 .../parser/narsese/NarseseParser.java         |  385 ++
 .../com/googlecode/opennars/storage/Bag.java  |  213 +
 .../opennars/storage/ConceptBag.java          |   46 +
 .../opennars/storage/Distributor.java         |   76 +
 .../googlecode/opennars/storage/TaskBag.java  |   42 +
 .../opennars/storage/TaskLinkBag.java         |   40 +
 .../opennars/storage/TermLinkBag.java         |   56 +
 .../googlecode/opennars/storage/package.html  |   35 +
 open-nars/lib/antlr-runtime-3.0.1.jar         |  Bin 0 -> 105209 bytes
 open-nars/lib/stringtemplate-3.0.jar          |  Bin 0 -> 161716 bytes
 85 files changed, 18276 insertions(+)
 create mode 100644 open-nars/LICENSE.txt
 create mode 100644 open-nars/com/googlecode/opennars/entity/Base.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/BudgetValue.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/Concept.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/Goal.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/Item.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/Judgement.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/Question.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/Sentence.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/ShortFloat.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/Task.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/TaskLink.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/TermLink.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/TruthValue.java
 create mode 100644 open-nars/com/googlecode/opennars/entity/package.html
 create mode 100644 open-nars/com/googlecode/opennars/inference/BudgetFunctions.java
 create mode 100644 open-nars/com/googlecode/opennars/inference/CompositionalRules.java
 create mode 100644 open-nars/com/googlecode/opennars/inference/MatchingRules.java
 create mode 100644 open-nars/com/googlecode/opennars/inference/RuleTables.java
 create mode 100644 open-nars/com/googlecode/opennars/inference/StructuralRules.java
 create mode 100644 open-nars/com/googlecode/opennars/inference/SyllogisticRules.java
 create mode 100644 open-nars/com/googlecode/opennars/inference/TruthFunctions.java
 create mode 100644 open-nars/com/googlecode/opennars/inference/UtilityFunctions.java
 create mode 100644 open-nars/com/googlecode/opennars/inference/package.html
 create mode 100644 open-nars/com/googlecode/opennars/language/CompoundTerm.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Conjunction.java
 create mode 100644 open-nars/com/googlecode/opennars/language/ConjunctionParallel.java
 create mode 100644 open-nars/com/googlecode/opennars/language/ConjunctionSequence.java
 create mode 100644 open-nars/com/googlecode/opennars/language/DifferenceExt.java
 create mode 100644 open-nars/com/googlecode/opennars/language/DifferenceInt.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Disjunction.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Equivalence.java
 create mode 100644 open-nars/com/googlecode/opennars/language/EquivalenceAfter.java
 create mode 100644 open-nars/com/googlecode/opennars/language/EquivalenceWhen.java
 create mode 100644 open-nars/com/googlecode/opennars/language/ImageExt.java
 create mode 100644 open-nars/com/googlecode/opennars/language/ImageInt.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Implication.java
 create mode 100644 open-nars/com/googlecode/opennars/language/ImplicationAfter.java
 create mode 100644 open-nars/com/googlecode/opennars/language/ImplicationBefore.java
 create mode 100644 open-nars/com/googlecode/opennars/language/ImplicationWhen.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Inheritance.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Instance.java
 create mode 100644 open-nars/com/googlecode/opennars/language/InstanceProperty.java
 create mode 100644 open-nars/com/googlecode/opennars/language/IntersectionExt.java
 create mode 100644 open-nars/com/googlecode/opennars/language/IntersectionInt.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Negation.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Product.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Property.java
 create mode 100644 open-nars/com/googlecode/opennars/language/SetExt.java
 create mode 100644 open-nars/com/googlecode/opennars/language/SetInt.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Similarity.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Statement.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Tense.java
 create mode 100644 open-nars/com/googlecode/opennars/language/TenseFuture.java
 create mode 100644 open-nars/com/googlecode/opennars/language/TensePast.java
 create mode 100644 open-nars/com/googlecode/opennars/language/TensePresent.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Term.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Variable.java
 create mode 100644 open-nars/com/googlecode/opennars/language/package.html
 create mode 100644 open-nars/com/googlecode/opennars/main/Memory.java
 create mode 100644 open-nars/com/googlecode/opennars/main/Parameters.java
 create mode 100644 open-nars/com/googlecode/opennars/main/Reasoner.java
 create mode 100644 open-nars/com/googlecode/opennars/main/package.html
 create mode 100644 open-nars/com/googlecode/opennars/operation/GoTo.java
 create mode 100644 open-nars/com/googlecode/opennars/operation/Open.java
 create mode 100644 open-nars/com/googlecode/opennars/operation/Operator.java
 create mode 100644 open-nars/com/googlecode/opennars/operation/Pick.java
 create mode 100644 open-nars/com/googlecode/opennars/operation/package.html
 create mode 100644 open-nars/com/googlecode/opennars/overview.html
 create mode 100644 open-nars/com/googlecode/opennars/parser/InvalidInputException.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/Parser.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/loan.g
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/loan.tokens
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/loanLexer.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/loanParser.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/narsese/NarseseParser.java
 create mode 100644 open-nars/com/googlecode/opennars/storage/Bag.java
 create mode 100644 open-nars/com/googlecode/opennars/storage/ConceptBag.java
 create mode 100644 open-nars/com/googlecode/opennars/storage/Distributor.java
 create mode 100644 open-nars/com/googlecode/opennars/storage/TaskBag.java
 create mode 100644 open-nars/com/googlecode/opennars/storage/TaskLinkBag.java
 create mode 100644 open-nars/com/googlecode/opennars/storage/TermLinkBag.java
 create mode 100644 open-nars/com/googlecode/opennars/storage/package.html
 create mode 100644 open-nars/lib/antlr-runtime-3.0.1.jar
 create mode 100644 open-nars/lib/stringtemplate-3.0.jar

diff --git a/open-nars/LICENSE.txt b/open-nars/LICENSE.txt
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/open-nars/LICENSE.txt
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/open-nars/com/googlecode/opennars/entity/Base.java b/open-nars/com/googlecode/opennars/entity/Base.java
new file mode 100644
index 0000000..4ccd318
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/Base.java
@@ -0,0 +1,142 @@
+/*
+ * Base.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.main.Parameters;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * Each Sentence has a list of serial numbers of a constant length.
+ * The input sentence gets a unique number.
+ * The derived sentences inherits from its parents.
+ */
+public class Base implements Cloneable {            // make it part of TruthValue?
+    private static final int MAXLENGTH = Parameters.MAXMUM_LABEL_RECORD_LENGTH;
+    private static final String opener = Symbols.Base_opener;
+    private static final String closer = Symbols.Base_closer;
+    private static final String separator = Symbols.Base_separator;
+    private static final String separator0 = Symbols.Base_separator0;
+    
+    // for each base
+    private int length;
+    private long list[] = new long[MAXLENGTH];
+    
+    // sequential number, for the whole system
+    private static long current = 0;
+    
+    // generate a new number --- serial number or generation time?
+    // called in StringParser
+    public Base() {
+        current++;
+        length = 1;
+        list[0] = current;
+    }
+    
+    // the first one is no shorter than the second
+    private Base(Base first, Base second) {
+        int i1, i2, j;
+        i1 = i2 = j = 0;
+        while (i2 < second.length() && j < MAXLENGTH) {
+            list[j] = first.list(i1);
+            i1++;
+            j++;
+            list[j] = second.list(i2);
+            i2++;
+            j++;
+        }
+        while (i1 < first.length() && j < MAXLENGTH) {
+            list[j] = first.list(i1);
+            i1++;
+            j++;
+        }
+        length = j;
+    }
+    
+    // try to merge two Bases, return null if have overlap
+    public static Base make(Base first, Base second) {
+        for (int i = 0; i < first.length(); i++)
+            for (int j = 0; j < second.length(); j++)
+                if (first.list(i) == second.list(j))
+                    return null;
+        if (first.length() > second.length())
+            return new Base(first, second);
+        else
+            return new Base(second, first);
+    }
+    
+    // Initialize the machenism
+    // called in Center
+    public static void init() {
+        current = 0;
+    }
+    
+    public int length() {
+        return length;
+    }
+    
+    public long list(int i) {
+        return list[i];
+    }
+
+    // to check for subset
+    public boolean include(Base s) {
+        boolean result = false;
+        if (length >= s.length())
+            for (int i = 0; i < s.length(); i++) {
+                result = false;
+                for (int j = 0; j < length; j++)
+                    if (list[j] == s.list(i)) {
+                        result = true;
+                        break;
+                    }
+                if (result == false)
+                    break;
+            }
+        return result;
+    }
+    
+    public boolean equals(Object that) {
+        return ((that instanceof Base) && this.include((Base) that) && ((Base) that).include(this));
+    }
+    
+    // called for update
+    public long latest() {
+        long v = list[0];
+        for (int i = 1; i < length(); i++) 
+            if (list[i] > v)
+                v = list[i];
+        return v;
+    }
+    
+    // for display
+    public String toString() {
+        String buf = new String(opener + length + separator0);
+        for (int i = 0; i < length; i++) {
+            buf = buf.concat(Long.toString(list[i]));
+            if (i < (length - 1))
+                buf = buf.concat(separator);
+            else
+                buf = buf.concat(closer);
+        }
+        return buf;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/entity/BudgetValue.java b/open-nars/com/googlecode/opennars/entity/BudgetValue.java
new file mode 100644
index 0000000..a2c5bc5
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/BudgetValue.java
@@ -0,0 +1,163 @@
+/*
+ * BudgetValue.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.inference.*;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * A triple of priority (current), durability (decay), and quality (long-term average).
+ */
+public class BudgetValue implements Cloneable {
+    public static final char mark = Symbols.BUDGET_VALUE_MARK;       // default
+    public static final char separator = Symbols.VALUE_SEPARATOR;    // default
+    protected ShortFloat priority;      // short-term, first-order
+    protected ShortFloat durability;    // short-term, second-order
+    protected ShortFloat quality;       // long-term
+	private Memory memory;
+	protected BudgetFunctions budgetfunctions;
+    
+    /* ----- constructors ----- */
+    
+    public BudgetValue(Memory memory) {
+        priority = new ShortFloat(0.01f);
+        durability = new ShortFloat(0.01f);
+        quality = new ShortFloat(0.01f);
+        this.memory = memory;
+        this.budgetfunctions = new BudgetFunctions(memory);
+    }
+
+    public BudgetValue(float p, float d, float q, Memory memory) {
+        priority = new ShortFloat(p);
+        durability = new ShortFloat(d);
+        quality = new ShortFloat(q);
+        this.memory = memory;
+        this.budgetfunctions = new BudgetFunctions(memory);
+    }
+
+    public BudgetValue(BudgetValue v, Memory memory) { // clone, not copy
+        priority = new ShortFloat(v.getPriority());
+        durability = new ShortFloat(v.getDurability());
+        quality = new ShortFloat(v.getQuality());
+        this.memory = memory;
+        this.budgetfunctions = new BudgetFunctions(memory);
+    }
+
+    public Object clone() {
+        return new BudgetValue(this.getPriority(), this.getDurability(), this.getQuality(), this.memory);
+    }
+
+    /* ----- priority ----- */
+
+    public float getPriority() {
+        return priority.getValue();
+    }
+
+    public void setPriority(float v) {
+        priority.setValue(v);
+    }
+    
+    public void incPriority(float v) {
+        priority.setValue(UtilityFunctions.or(priority.getValue(), v));
+    }
+
+    public void decPriority(float v) {
+        priority.setValue(UtilityFunctions.and(priority.getValue(), v));
+    }
+
+    /* ----- durability ----- */
+
+    public float getDurability() {
+        return durability.getValue();
+    }
+    
+    public void setDurability(float v) {
+        durability.setValue(v);
+    }
+    
+    public void incDurability(float v) {
+        durability.setValue(UtilityFunctions.or(durability.getValue(), v));
+    }
+
+    public void decDurability(float v) {
+        durability.setValue(UtilityFunctions.and(durability.getValue(), v));
+    }
+
+    /* ----- quality ----- */
+
+    public float getQuality() {
+        return quality.getValue();
+    }
+    
+    public void setQuality(float v) {
+        quality.setValue(v);
+    }
+        
+    public void incQuality(float v) {
+        quality.setValue(UtilityFunctions.or(quality.getValue(), v));
+    }
+
+    public void decQuality(float v) {
+        quality.setValue(UtilityFunctions.and(quality.getValue(), v));
+    }
+
+    /* ----- utility ----- */
+
+    public void merge(BudgetValue that) {
+        this.budgetfunctions.merge(this, that);
+    }
+
+    // called from Memory only
+    public float singleValue() {
+//        return (priority.getValue() + quality.getValue()) * durability.getValue() / 2.0f;
+        return UtilityFunctions.aveAri(priority.getValue(), durability.getValue(), quality.getValue());
+    }
+    
+    public boolean aboveThreshold() {
+        return (singleValue() > 0.001); // to be revised to depend on how busy the system is
+    }
+    
+    // full output
+    public String toString() {
+        return mark + priority.toString() + separator + durability.toString() + separator + quality.toString() + mark;
+    }
+
+    // short output
+    public String toString2() {
+        return mark + priority.toString2() + separator + durability.toString2() + separator + quality.toString2() + mark;
+    }
+
+	/**
+	 * @param memory the memory to set
+	 */
+	public void setMemory(Memory memory) {
+		this.memory = memory;
+	}
+
+	/**
+	 * @return the memory
+	 */
+	public Memory getMemory() {
+		return memory;
+	}
+}
diff --git a/open-nars/com/googlecode/opennars/entity/Concept.java b/open-nars/com/googlecode/opennars/entity/Concept.java
new file mode 100644
index 0000000..b32ce46
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/Concept.java
@@ -0,0 +1,315 @@
+/*
+ * Concept.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import java.util.*;
+import java.io.*;
+
+import com.googlecode.opennars.inference.*;
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.*;
+import com.googlecode.opennars.operation.*;
+import com.googlecode.opennars.parser.*;
+import com.googlecode.opennars.storage.*;
+
+
+/**
+ * A concept contains information directly related to a term, including directly and indirectly related tasks and beliefs.
+ * <p>
+ * To make sure the space will be released, no other will refer to a concept, except in a concept bag.
+ */
+public final class Concept extends Item {
+    /* Constant term as the unique ID of the concept */
+    private Term term;
+    /* Direct Task lists (they may never be used for a Term that is not used as a Statement) */
+    private ArrayList<Judgement> directBeliefs;      // Judgments with the same content
+    private ArrayList<Goal> directGoals;            // Goals that can be directly achieved
+    private Question directQuestion;                // Question that can be directly answered
+    private boolean revisible = true;               // truth value of judgments can be revised
+    /* Link bags for indirect processing (always used) */
+    private ArrayList<TermLink> linkTemplates;  // templates of TermLink, only in Concepts for CompoundTerms
+    private TaskLinkBag taskLinks;
+    private TermLinkBag termLinks;
+    
+    /* ---------- constructor ---------- */
+    
+    /**
+     * Constructor
+     * @param tm A constant term corresponding to the concept
+     */
+    public Concept(Term tm, Memory memory) {
+        super(memory);
+        term = tm;
+        key = tm.toString();
+        directBeliefs = new ArrayList<Judgement>();
+        directGoals = new ArrayList<Goal>();
+        directQuestion = null;
+        taskLinks = new TaskLinkBag();
+        termLinks = new TermLinkBag();
+        if (tm instanceof CompoundTerm) {
+            linkTemplates = ((CompoundTerm) tm).prepareComponentLinks(getMemory());
+            checkRevisibility();
+        }
+    }
+    
+    private void checkRevisibility() {
+        revisible = !(term instanceof Tense);                                   // no tense
+        if (revisible)
+            revisible = ((key.indexOf("()") < 0) && (key.indexOf("(#")) < 0);   // no dependent variable
+    }
+    
+    /* ---------- add direct information as Tasks ---------- */
+    
+    /**
+     * New task to be directly processed in a constant time, called from Memory only
+     * @param task The task to be processed
+     */
+    public void directProcess(Task task) {
+        getMemory().currentTask = task;
+        Sentence sentence = task.getSentence();
+        if (sentence instanceof Question)
+            processQuestion(task);
+        else if (sentence instanceof Goal)
+            processGoal(task);
+        else
+            processJudgment(task);
+        getMemory().activateConcept(this, task.getBudget());
+    }
+    
+    /**
+     * New question to be directly answered by existing beliefs
+     * @param task The task to be processed
+     */
+    private void processQuestion(Task task) {
+        if (directQuestion == null)
+            directQuestion = (Question) task.getSentence();         // remember it
+        for (int i = 0; i < directBeliefs.size(); i++) {
+            Judgement judg = directBeliefs.get(i);
+            getMemory().getRuletables().getMatchingRules().trySolution(directQuestion, judg, task);    // look for better answer
+        }
+    }
+    
+    /**
+     * New judgment
+     * @param task The task to be processed
+     */
+    private void processJudgment(Task task) {
+        Judgement judg = (Judgement) task.getSentence();
+        if (revisible)
+            reviseTable(task, directBeliefs);
+        else
+            updateTable(task);
+        if (task.getPriority() > 0) {               // if still valuable --- necessary???
+            if (directQuestion != null)
+                getMemory().getRuletables().getMatchingRules().trySolution(directQuestion, judg, task);
+            for (int i = 0; i < directGoals.size(); i++) {
+                Goal goal = directGoals.get(i);
+                getMemory().getRuletables().getMatchingRules().trySolution(goal, judg, task);
+            }
+            addToTable(judg, directBeliefs, getMemory().getParameters().MAXMUM_BELIEF_LENGTH);
+        }
+    }
+    
+    /**
+     * New goal
+     * @param task The task to be processed
+     */
+    private void processGoal(Task task) {
+        Goal goal = (Goal) task.getSentence();
+        if (revisible)
+            reviseTable(task, directGoals);
+        else
+            updateTable(task);
+        for (int i = 0; i < directBeliefs.size(); i++) {
+            Judgement judg = directBeliefs.get(i);
+            getMemory().getRuletables().getMatchingRules().trySolution(goal, judg, task);
+        }
+        if (task.getPriority() > 0) {              // if still valuable
+            addToTable(goal, directGoals, getMemory().getParameters().MAXMUM_GOALS_LENGTH);         // with the feedbacks
+        }
+        decisionMaking(task);
+    }
+    
+    private void decisionMaking(Task task) {    // add plausibility
+        Goal goal = (Goal) task.getSentence();
+        float desire = 2 * goal.getTruth().getExpectation() - 1;
+        float quality = (desire < 0) ? 0 : desire;
+        task.setQuality(quality);
+    }
+    
+    // revise previous beliefs or goals
+    private void reviseTable(Task task, ArrayList table) {
+        Judgement belief;
+        for (int i = 0; i < table.size(); i++) {    // call select()
+            belief = (Judgement) table.get(i);
+            if (belief.noOverlapping((Judgement) task.getSentence()))
+                getMemory().getRuletables().getMatchingRules().revision(task, belief, false);
+        }
+    }
+    
+    // to be rewritten
+    private void updateTable(Task task) {
+//        Judgement belief;
+//        for (int i = 0; i < directBeliefs.size(); i++) {    // call select()
+//            belief = directBeliefs.get(i);
+//            if (((Judgement) task.getSentence()).getBase().latest() > belief.getBase().latest())
+//                getMemory().getRuletables().getMatchingRules().update(task, belief);
+//        }
+    }
+    
+    // add the Task as a new direct Belief or Goal, remove redundant ones
+    // table sorted by rank
+    private void addToTable(Judgement newJudgement, ArrayList table, int capacity) {
+        float rank1 = this.budgetfunctions.rankBelief(newJudgement);    // for the new belief
+        Base base1 = newJudgement.getBase();
+        Judgement judgement2;
+        float rank2;
+        int i;
+        for (i = 0; i < table.size(); i++) {        // go through everyone
+            judgement2 = (Judgement) table.get(i);
+            rank2 = this.budgetfunctions.rankBelief(judgement2); // previous belief
+            if (rank1 >= rank2) {
+                if (newJudgement.equivalentTo(judgement2))
+                    return;
+                table.add(i, newJudgement);
+                break;
+            }
+        }
+        if (table.size() == capacity)
+            table.remove(capacity - 1);
+        else if (i == table.size())
+            table.add(newJudgement);
+    }
+
+    // return a piece of Belief to be used with the task
+    // get the first qualified one
+    public Judgement getBelief(Task task) {
+        Sentence sentence = task.getSentence();
+        Judgement belief;
+        for (int i = 0; i < directBeliefs.size(); i++) {
+            belief = directBeliefs.get(i);
+            if ((sentence instanceof Question) || belief.noOverlapping((Judgement) sentence)) {
+                return belief;
+            }
+        }
+        return null;
+    }
+    
+    /* ---------- insert relational information as Links ---------- */
+    
+    public ArrayList<TermLink> getTermLinks() {
+        return linkTemplates;
+    }
+    
+    // insert TaskLink into the task base, called from Memory only
+    public void insertTaskLink(TaskLink taskLink) {
+        BudgetValue budget = taskLink.getBudget();
+        taskLinks.putIn(taskLink);
+        getMemory().activateConcept(this, budget);       // activate the concept
+        if (term instanceof CompoundTerm)
+            buildTermLinks(budget);
+    }
+    
+    private void buildTermLinks(BudgetValue budget) {
+        Term t;
+        Concept c;
+        TermLink cLink1, cLink2;
+        BudgetValue subBudget = this.budgetfunctions.distributeAmongLinks(budget, linkTemplates.size());
+        if (!subBudget.aboveThreshold())
+            return;
+        for(TermLink link : linkTemplates) {
+            t = link.getTarget();
+            c = getMemory().getConcept(t);
+            cLink1 = new TermLink(t, link, subBudget, getMemory());
+            insertTermLink(cLink1);   // this link to that
+            cLink2 = new TermLink(term, link, subBudget, getMemory());
+            c.insertTermLink(cLink2);   // that link to this
+            if (t instanceof CompoundTerm)
+                c.buildTermLinks(subBudget);
+        }
+    }
+    
+    // insert TermLink into the Belief base, called from Memory only
+    public void insertTermLink(TermLink cLink) {
+        termLinks.putIn(cLink);
+        getMemory().activateConcept(this, cLink.getBudget());
+    }
+    
+    /* ---------- main loop ---------- */
+    
+    // a single step of syllogism within a concept
+    public void fire() {
+        TaskLink tLink = (TaskLink) taskLinks.takeOut();
+        if (tLink == null)
+            return;
+        getMemory().currentTaskLink = tLink;
+        getMemory().currentBeliefLink = null;
+        Task task = tLink.getTargetTask();
+        getMemory().currentTask = task;
+        if ((tLink.getType() == TermLink.TRANSFORM) && !task.isStructual()) {
+            getMemory().getRuletables().transformTask(task, tLink);      // inference from a TaskLink and the Task --- for Product and Image
+            return; // cannot be used otherwise
+        }
+        TermLink bLink = (TermLink) termLinks.takeOut(tLink);  // to avoid repeated syllogism
+        if (bLink != null) {
+            getMemory().currentBeliefLink = bLink;
+            getMemory().getRuletables().reason(tLink, bLink);
+            termLinks.putBack(bLink);
+        }
+        taskLinks.putBack(tLink);
+    }
+    
+    /* ---------- utility ---------- */
+    
+    public Term getTerm() {     // called from Memory only
+        return term;
+    }
+    
+    public String toString() {  // called from concept bag
+    	return (super.toString2() + " " + key);
+    }
+    
+    public float getQuality() {         // re-calculate-and-set? consider syntactic complexity?
+        return UtilityFunctions.and(taskLinks.averagePriority(), termLinks.averagePriority());
+    }
+    
+    /* ---------- reporting ---------- */
+    
+    // display direct belief, questions, and goals
+    public String displayContent() {
+        StringBuffer buffer = new StringBuffer();
+        if (directBeliefs.size() > 0) {
+            buffer.append("  Beliefs:\n");
+            for (int i = 0; i < directBeliefs.size(); i++)
+                buffer.append(directBeliefs.get(i) + "\n");
+        }
+        if (directGoals.size() > 0) {
+            buffer.append("\n  Goals:\n");
+            for (int i = 0; i < directGoals.size(); i++)
+                buffer.append(directGoals.get(i) + "\n");
+        }
+        if (directQuestion != null)
+            buffer.append("\n  Question:\n" + directQuestion + "\n");
+        return buffer.toString();
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/entity/Goal.java b/open-nars/com/googlecode/opennars/entity/Goal.java
new file mode 100644
index 0000000..8cf4c42
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/Goal.java
@@ -0,0 +1,35 @@
+/*
+ * Goal.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.language.Term;
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * A Goal is an event to be realized, and may conain query variables
+ */
+public class Goal extends Judgement {
+    public Goal(Term term, char punc, TruthValue t, Base b, Memory memory) {
+        super(term, punc, t, b, memory);
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/entity/Item.java b/open-nars/com/googlecode/opennars/entity/Item.java
new file mode 100644
index 0000000..636d801
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/Item.java
@@ -0,0 +1,78 @@
+/*
+ * Item.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * An item is an object that can be put into a Bag,
+ * and it participates in the resource competation of the system.
+ */
+public abstract class Item extends BudgetValue implements Cloneable {
+
+	/**
+     * The key of the Item, unique in a Bag
+     */
+    protected String key;   // uniquely define an Item in a bag
+    
+    protected Item(Memory memory) {
+    	super(memory);
+    }
+    
+    protected Item(BudgetValue v, Memory memory) {
+        super(v, memory);
+    }
+            
+    /**
+     * Get the current key
+     * @return Current key value
+     */
+    public String getKey() {
+        return key;
+    }
+    
+    /**
+     * Set a new key value
+     * @param k New key value
+     */
+    public void setKey(String k) {
+        key = k;
+    }
+
+    /**
+     * Get current BudgetValue
+     * @return Current BudgetValue
+     */
+    public BudgetValue getBudget() {
+        return this;
+    }
+
+    /**
+     * Set new BudgetValue
+     * @param v new BudgetValue
+     */
+    public void setBudget(BudgetValue v) {      // is this necessary?
+        setPriority(v.getPriority());
+        setDurability(v.getDurability());
+        setQuality(v.getQuality());
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/entity/Judgement.java b/open-nars/com/googlecode/opennars/entity/Judgement.java
new file mode 100644
index 0000000..0d632d9
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/Judgement.java
@@ -0,0 +1,82 @@
+/*
+ * Judgement.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.language.Term;
+import com.googlecode.opennars.main.*;
+
+/**
+ * A Judgement is an piece of new knowledge to be absorbed.
+ */
+public class Judgement extends Sentence {
+    
+    public Judgement(Term term, char punc, TruthValue t, Base b, Memory memory) {
+        content = term;
+        punctuation = punc;
+        truth = t;
+        base = b;
+        this.memory = memory;
+    }
+  
+    public TruthValue getTruth() {
+        return truth;
+    }
+
+    public float getFrequency() {
+        return truth.getFrequency();
+    }
+
+    public float getConfidence() {
+        return truth.getConfidence();
+    }
+
+    public Base getBase() {
+        return base;
+    }
+
+    boolean equivalentTo(Judgement judgement2) {
+        return (truth.equals(judgement2.getTruth()) && base.equals(judgement2.getBase())); // may have different key
+    }
+
+    public float getExpectationDifference(Judgement that) {
+        return getTruth().getExpDifAbs(that.getTruth());
+    }
+    
+    public float solutionQuality(Sentence sentence) {
+        Term problem = sentence.getContent(); 
+        if (sentence instanceof Goal) 
+            return truth.getExpectation();
+        else if (problem.isConstant())          // "yes/no" question
+            return truth.getConfidence();                                 // by confidence
+        else                                                            // "what" question or goal
+            return truth.getExpectation() / content.getComplexity();      // by likelihood/simplicity, to be refined
+    }
+    
+    public boolean noOverlapping(Judgement judgement) {
+        Base b = Base.make(base, judgement.getBase());
+        if (b == null)
+            return false;
+        memory.currentBase = b;
+        return true;
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/entity/Question.java b/open-nars/com/googlecode/opennars/entity/Question.java
new file mode 100644
index 0000000..aa677eb
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/Question.java
@@ -0,0 +1,38 @@
+/*
+ * Question.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.language.Term;
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * A Question is a sentence without a truth value needs evaluation, and may conain query variables
+ */
+public class Question extends Sentence {
+
+    public Question(Term term, char punc, Memory memory) {
+        content = term;
+        punctuation = punc;
+        this.memory = memory;
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/entity/Sentence.java b/open-nars/com/googlecode/opennars/entity/Sentence.java
new file mode 100644
index 0000000..1d1d60e
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/Sentence.java
@@ -0,0 +1,156 @@
+/*
+ * Sentence.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.*;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A Sentence contains a Statement, a TruthValue, and a Base list.
+ *<p>
+ * It is used as the premises and conclusions of all inference rules.
+ */
+public abstract class Sentence {    
+    protected Term content;
+    protected char punctuation;
+    protected TruthValue truth = null;
+    protected Base base = null;
+    protected boolean input = false;            // whether it is an input sentence
+    protected Judgement bestSolution = null;       // for Question and Goal
+    protected Memory memory;					// to change things
+//    protected Object token;						// to track information through inferences
+    
+    /**
+     * Make a Sentence from an input String. Called by StringParser.
+     * @param term The content of the sentence
+     * @param punc The punctuation (and therefore, type) of the sentence
+     * @param truth The truth value of the sentence, if it is a Judgement (or Goal)
+     * @param base The base of the truth value (for Judgement or Goal)
+     * @return the Sentence generated from the arguments
+     */
+    public static Sentence make(Term term, char punc, TruthValue truth, Base base, Memory memory) {
+        if (term instanceof CompoundTerm)
+            ((CompoundTerm) term).renameVariables();
+        switch (punc) {
+            case Symbols.JUDGMENT_MARK:
+                return new Judgement(term, punc, truth, base, memory);
+            case Symbols.GOAL_MARK:
+                return new Goal(term, punc, truth, base, memory);
+            case Symbols.QUESTION_MARK:
+                return new Question(term, punc, memory);
+            default:
+                return null;
+        }
+    }
+
+    /**
+     * Make a derived Sentence. Called by memory 
+     * @param term The content of the sentence
+     * @param oldS A sample sentence providing the type of the new sentence
+     * @param truth The truth value of the sentence, if it is a Judgement (or Goal)
+     * @param base The base of the truth value (for Judgement or Goal)
+     * @return the Sentence generated from the arguments
+     */
+    public static Sentence make(Sentence oldS, Term term, TruthValue truth, Base base, Memory memory) {
+        if (term instanceof CompoundTerm)
+            ((CompoundTerm) term).renameVariables();
+        if (oldS instanceof Question)
+            return new Question(term, Symbols.QUESTION_MARK, memory);
+        if (oldS instanceof Goal)
+            return new Goal(term, Symbols.GOAL_MARK, truth, base, memory);
+        return new Judgement(term, Symbols.JUDGMENT_MARK, truth, base, memory);
+    }
+    
+    public Term getContent() {
+        return content;
+    }
+
+    public Term cloneContent() {
+        return (Term) content.clone();
+    }
+
+    public TruthValue getTruth() {
+        return null;
+    }
+
+    public Base getBase() {
+        return null;
+    }
+    
+    // distinguish Judgement from Goal
+    public boolean isJudgment() {
+        return (punctuation == Symbols.JUDGMENT_MARK);
+    }
+
+    public boolean isInput() {
+        return input;
+    }
+    
+    public void setInput() {
+        input = true;
+    }
+
+    public Judgement getBestSolution() {
+        return bestSolution;
+    }
+    
+    public void setBestSolution(Judgement judg) {
+        bestSolution = judg;
+        if (input)
+            memory.report(judg, false);        // report answer to input question
+    }
+    
+    // display a sentence
+    public String toString() {
+        StringBuffer s = new StringBuffer();
+        s.append(content.getName());
+        s.append(punctuation + " ");
+        if (truth != null) {
+            s.append(truth.toString()); 
+            s.append(base.toString());
+        }
+        if (bestSolution != null)
+            s.append("BestSolution: " + bestSolution);
+        
+        return s.toString();
+    }
+    
+    // display a sentence in compact form (2 digits)
+    public String toString2() {
+        StringBuffer s = new StringBuffer();
+        s.append(content.getName());
+        s.append(punctuation + " ");
+        if (truth != null) {
+            s.append(truth.toString2()); 
+        }
+        return s.toString();
+    }
+
+	public boolean isGoal() {
+		return (this.punctuation == Symbols.GOAL_MARK);
+	}
+	
+	public boolean isQuestion() {
+		return (this.punctuation == Symbols.QUESTION_MARK);
+	}
+}
diff --git a/open-nars/com/googlecode/opennars/entity/ShortFloat.java b/open-nars/com/googlecode/opennars/entity/ShortFloat.java
new file mode 100644
index 0000000..654691d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/ShortFloat.java
@@ -0,0 +1,78 @@
+/*
+ * ShortFloat.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+/**
+ * A float value in [0, 1], with 4 digits accuracy.
+ */
+public class ShortFloat implements Cloneable {
+    
+    // the values are saved as short integers (-32768 to 32767, only 0 to 10000 used),
+    // but used as float
+    private short value;
+    
+    public ShortFloat(float v) {
+        setValue(v);
+    }
+    
+    // access value
+    public float getValue() {
+        return (float) (value * 0.0001);
+    }
+
+    public short getShortValue() {
+        return value;
+    }
+    
+    // set new value, rounded, with validity checking
+    public void setValue(float v) {
+        if ((v < 0) || (v > 1))
+            System.out.println("!!! Wrong value: " + v);
+        else
+            value = (short) (v * 10000.0 + 0.5);
+    }
+    
+    public boolean equals(Object that) {
+        return ((that instanceof ShortFloat) && (value == ((ShortFloat) that).getShortValue()));
+    }
+    
+    // full output
+    public String toString() {
+        if (value == 10000)
+            return "1.0000";
+        else {
+            String s = String.valueOf(value);
+            while (s.length() < 4)
+                s = "0" + s;
+            return "0." + s;
+        }
+    }
+    
+    // output with 2 digits, rounded
+    public String toString2() {
+        String s = toString();
+        if (s.length() > 4)
+            return s.substring(0, 4);
+        else
+            return s;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/entity/Task.java b/open-nars/com/googlecode/opennars/entity/Task.java
new file mode 100644
index 0000000..fd2943f
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/Task.java
@@ -0,0 +1,77 @@
+/*
+ * Task.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * A task to be processed.
+ */
+public class Task extends Item {
+    private Sentence sentence;
+    protected boolean structual = false;        // whether it is based on a structual rule
+           
+    public Task(Sentence s, BudgetValue b, Memory memory) {
+        super(b, memory);
+        sentence = s;
+        key = sentence.toString();
+    }
+    
+    public Sentence getSentence() {
+        return sentence;
+    }
+
+    public Term getContent() {
+        return sentence.getContent();
+    }
+
+    public boolean isStructual() {
+        return structual;
+    }
+    
+    public void setStructual() {
+        structual = true;
+    }
+
+    public void merge(Item that) {
+        ((BudgetValue) this).merge(that.getBudget());
+        structual = (structual || ((Task) that).isStructual());
+    }
+
+    public String toString() {
+        StringBuffer s = new StringBuffer();
+        s.append(super.toString());
+        s.append(sentence);
+        return s.toString();
+    }
+
+    public String toString2() {
+        StringBuffer s = new StringBuffer();
+        if (sentence instanceof Question)
+            s.append(sentence);
+        else
+            s.append(((Judgement) sentence).toString2());
+        return s.toString();
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/entity/TaskLink.java b/open-nars/com/googlecode/opennars/entity/TaskLink.java
new file mode 100644
index 0000000..45e51f1
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/TaskLink.java
@@ -0,0 +1,88 @@
+/*
+ * TaskLink.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import java.util.*;
+
+import com.googlecode.opennars.language.Term;
+import com.googlecode.opennars.main.*;
+
+/**
+ * Reference to a Task.
+ * <p>
+ * The reason to separate a Task and a TaskLink is that a Task can be linked from multiple Concepts, with different BudgetValue.
+ */
+public class TaskLink extends TermLink {
+    private static final int RECORD_LENGTH = Parameters.TASK_INFERENCE_RECORD_LENGTH;
+    private Task targetTask;        // now "target" means a term !!!
+    private ArrayList<String> record; // remember the CompositionLinks that has been used recently
+    
+    public TaskLink(Task t, TermLink template, BudgetValue v, Memory memory) {
+        super(v, memory);
+        if (template == null) {
+            type = TermLink.SELF;
+            index = null;
+        } else {
+            type = template.getType();
+            index = template.getIndices();            
+        }
+        targetTask = t;
+        record = new ArrayList<String>(Parameters.TASK_INFERENCE_RECORD_LENGTH);
+        setKey();
+        key += t.getKey();
+    }
+    
+    public Task getTargetTask() {
+        return targetTask;
+    }
+    
+    public ArrayList<String> getRecord() {
+        return record;
+    }
+    
+    public void merge(Item that) {
+        ((BudgetValue) this).merge(that.getBudget());
+        ArrayList<String> v = ((TaskLink) that).getRecord();
+        for (int i = 0; i < v.size(); i++)
+            if (record.size() <= RECORD_LENGTH)
+                record.add(v.get(i));
+    }
+
+    // To check whether a TaskLink can use a TermLink
+    // return false if they intereacted recently
+    // called in CompositionBag only
+    // move into Task ?
+    public boolean novel(TermLink bLink) {
+        Term bTerm = bLink.getTarget();
+        if (bTerm.equals(targetTask.getSentence().getContent()))
+            return false;
+        String key = bLink.getKey();
+        for (int i = 0; i < record.size(); i++)
+            if (key.equals((String) record.get(i)))
+                return false;
+        record.add(key);       // add knowledge reference to record
+//        if (record.size() > RECORD_LENGTH)         // keep a constant length --- allow repeatation
+//            record.remove(0);
+        return true;
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/entity/TermLink.java b/open-nars/com/googlecode/opennars/entity/TermLink.java
new file mode 100644
index 0000000..cc60788
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/TermLink.java
@@ -0,0 +1,170 @@
+/*
+ * TermLink.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.language.CompoundTerm;
+import com.googlecode.opennars.language.Term;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A link between a compound term and a component term
+ * <p>
+ * A TermLink links the current Term to a target Term, which is 
+ * either a component of, or compound made from, the current term.
+ * <p>
+ * Both terms are constant.
+ * <p>
+ * The index value(s) indicates the location of the component in the compound.
+ */
+public class TermLink extends Item {
+
+    public static final short SELF = 0;                 // TaskLink only
+    public static final short COMPONENT = 1;
+    public static final short COMPOUND = 2;
+    public static final short COMPONENT_STATEMENT = 3;
+    public static final short COMPOUND_STATEMENT = 4;
+    public static final short COMPONENT_CONDITION = 5;
+    public static final short COMPOUND_CONDITION = 6;
+    public static final short TRANSFORM = 7;            // TaskLink only
+        
+    private Term target;
+    protected short type;
+    protected short[] index;
+    
+    public TermLink(Memory memory) {
+    	super(memory);
+    }
+    
+    /**
+     * Simplest constructor, called in CompoundTerm and Implication
+     * @param t target Term
+     * @param p link type
+     * @param i component index in compound
+     */
+    public TermLink(Term t, short p, int i, Memory memory) {
+    	super(memory);
+        target = t;
+        type = p;
+        index = new short[1];
+        index[0] = (short) i;
+        setKey();
+    }
+
+    public TermLink(Term t, short p, int i, int j, Memory memory) {
+    	super(memory);
+        target = t;
+        type = p;
+        index = new short[2];
+        index[0] = (short) i;
+        index[1] = (short) j;
+        setKey();
+    }
+
+    public TermLink(Term t, short p, int i, int j, int k, Memory memory) {
+    	super(memory);
+        target = t;
+        type = p;
+        index = new short[3];
+        index[0] = (short) i;
+        index[1] = (short) j;
+        index[2] = (short) k;
+        setKey();
+    }
+
+    protected TermLink(BudgetValue v, Memory memory) {
+        super(v, memory);
+    }
+    
+    // the CompotionLink that is actually inserted
+    public TermLink(Term t, TermLink template, BudgetValue v, Memory memory) {
+        super(v, memory);
+        target = t;
+        type = template.getType();
+        if (template.getTarget().equals(target)) 
+            type = reverse(type);
+        index = template.getIndices();
+        setKey();
+    }
+
+    protected void setKey() {
+        String at1, at2;
+        if (toComponent()) {
+            at1 = Symbols.LinkToComponent_at1;
+            at2 = Symbols.LinkToComponent_at2;
+        } else {
+            at1 = Symbols.LinkToCompound_at1;
+            at2 = Symbols.LinkToCompound_at2;            
+        }
+        String in = "T" + type;
+        if (index != null)
+            for (int i = 0; i < index.length; i++) {
+                in += "-" + (index[i]+1);
+            }
+        key = at1 + in + at2;
+        if (target != null)
+            key += target;
+    }
+    
+    public Term getTarget() {
+        return target;
+    }
+
+    public short getType() {
+        return type;
+    }
+    
+    public boolean toComponent() {
+        return ((type % 2) > 0);
+    }
+
+    public int indexLength() {
+        return (index == null)? 0 : index.length;
+    }
+    
+    public short[] getIndices() {
+        return index;
+    }
+    
+    public short getIndex(int i) {
+        if ((index != null) && (i < index.length))
+            return index[i];
+        else
+            return -1;
+    }
+    
+    protected short reverse(short i) {
+        if ((i % 2) == 0)
+            return (short) (i - 1);
+        else
+            return (short) (i + 1);
+    }
+    
+    public String toString() {
+        return (super.toString() + " " + key);
+    }
+
+    public String toString2() {
+        return (super.toString2() + " " + key);
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/entity/TruthValue.java b/open-nars/com/googlecode/opennars/entity/TruthValue.java
new file mode 100644
index 0000000..ecf9d71
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/TruthValue.java
@@ -0,0 +1,81 @@
+/*
+ * TruthValue.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.entity;
+
+import com.googlecode.opennars.language.Term;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * Frequency and confidence.
+ */
+public class TruthValue { // implements Cloneable {
+    public static final char DELIMITER = Symbols.TRUTH_VALUE_MARK;       // default
+    public static final char SEPARATOR = Symbols.VALUE_SEPARATOR;    // default
+    protected ShortFloat frequency;
+    protected ShortFloat confidence;
+        
+    public TruthValue(float f, float c) {
+        frequency = new ShortFloat(f);
+        confidence = new ShortFloat(c);
+    }
+    
+    public TruthValue(TruthValue v) {
+        frequency = new ShortFloat(v.getFrequency());
+        confidence = new ShortFloat(v.getConfidence());
+    }
+        
+    public float getFrequency() {
+        return frequency.getValue();
+    }
+        
+    public float getConfidence() {
+        return confidence.getValue();
+    }
+        
+    public float getExpectation() {
+        return (float) (confidence.getValue() * (frequency.getValue() - 0.5) + 0.5);
+    }
+    
+    public float getExpDifAbs(float e) {
+        return Math.abs(e - getExpectation());
+    }
+    
+    public float getExpDifAbs(TruthValue t) {
+        return getExpDifAbs(t.getExpectation());
+    }
+    
+    public boolean equals(Object that) {
+        return ((that instanceof TruthValue) 
+                && (getFrequency() == ((TruthValue) that).getFrequency())
+                && (getConfidence() == ((TruthValue) that).getConfidence()));
+    }
+    
+    // full output
+    public String toString() {
+        return DELIMITER + frequency.toString() + SEPARATOR + confidence.toString() + DELIMITER;
+    }
+    
+    // short output
+    public String toString2() {
+        return DELIMITER + frequency.toString2() + SEPARATOR + confidence.toString2() + DELIMITER;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/entity/package.html b/open-nars/com/googlecode/opennars/entity/package.html
new file mode 100644
index 0000000..ffbdf26
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/entity/package.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<body bgcolor="white">
+
+Data entities that are independently stored
+
+<h2>Package Specification</h2>
+
+<ul>
+<li>ShortFloats: BudgetValue (priority/durability/quality) and TruthValue (frequency/confidence)</li>
+<li>Base: serial numbers associated to TruthVallue</li>
+<li>Sentence: a Term, a TruthValue, and a Base. A Sentence can be a Judgment, a Goal, or a Question.</li>
+<li>Task: a Sentence to be processed.</li>
+<li>TermLink: built in pair between a compound term and a component term.</li>
+<li>TaskLink: special TermLink refering to a Task, whose Term equals or directly contains the current Term.</li>
+<li>Concept: labeled by a Term, contains a TaskLink bag and a TermLink bag for indirect tasks/beliefs, as well as beliefs/questions/goals directly on the Term.</li>
+<li>Item: Concept, Task, or TermLink</li>
+</ul>    
+
+</body>
+</html>
diff --git a/open-nars/com/googlecode/opennars/inference/BudgetFunctions.java b/open-nars/com/googlecode/opennars/inference/BudgetFunctions.java
new file mode 100644
index 0000000..a491a76
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/BudgetFunctions.java
@@ -0,0 +1,239 @@
+/*
+ * BudgetFunctions.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.inference;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.language.Term;
+import com.googlecode.opennars.main.*;
+
+/**
+ * Budget functions controlling the resources allocation
+ */
+public class BudgetFunctions extends UtilityFunctions {    
+    
+	private Memory memory;
+	
+	public BudgetFunctions(Memory memory) {
+		this.memory = memory;
+	}
+	
+    /* ----------------------- Belief evaluation ----------------------- */
+    
+    /**
+     * Determine the quality of a judgment by its truth value
+     * <p>
+     * Mainly decided by confidence, though binary judgment is also preferred
+     * @param t The truth value of a judgment
+     * @return The quality of the judgment, according to truth value only
+     */
+    public  float truthToQuality(TruthValue t) {
+        float freq = t.getFrequency();
+        float conf = t.getConfidence();
+        return and(conf, Math.abs(freq - 0.5f) + freq * 0.5f);
+    }
+
+    /**
+     * Determine the rank of a judgment by its confidence and originality (base length)
+     * <p>
+     * @param judg The judgment to be ranked
+     * @return The rank of the judgment, according to truth value only
+     */
+    public  float rankBelief(Judgement judg) {
+//        TruthValue truth = judg.getTruth();
+//        float quality = truthToQuality(truth);
+        float confidence = judg.getConfidence();
+        float originality = 1.0f / (judg.getBase().length() + 1);
+        return or(confidence, originality);
+    }
+    
+    /* ----- Functions used both in direct and indirect processing of tasks ----- */
+
+    /**
+     * Evaluate the quality of a belief as a solution to a problem, then reward the belief and de-prioritize the problem
+     * @param problem The problem (question or goal) to be solved
+     * @param solution The belief as solution
+     * @param task The task to be immediatedly processed, or null for continued process
+     * @return The budget for the new task which is the belief activated, if necessary
+     */
+     BudgetValue solutionEval(Sentence problem, Judgement solution, Task task) {
+        BudgetValue budget = null;
+        boolean feedbackToLinks = false;
+        if (task == null) {                 // called in continued processing
+            task = memory.currentTask;
+            feedbackToLinks = true;
+        }
+        boolean judgmentTask = task.getSentence().isJudgment();
+        float quality;                      // the quality of the solution
+        if (problem instanceof Question) 
+            quality = solution.solutionQuality((Question) problem);
+        else // problem is goal
+            quality = solution.getTruth().getExpectation();
+        if (judgmentTask)
+            task.incPriority(quality);
+        else {
+            task.setPriority(Math.min(1 - quality, task.getPriority()));
+            budget = new BudgetValue(quality, task.getDurability(), truthToQuality(solution.getTruth()), memory);
+        }
+        if (feedbackToLinks) {
+            TaskLink tLink = memory.currentTaskLink;
+            tLink.setPriority(Math.min(1 - quality, tLink.getPriority()));
+            TermLink bLink = memory.currentBeliefLink;
+            bLink.incPriority(quality);
+        }
+        return budget;
+    }
+
+    /**
+     * Evaluate the quality of a revision, then de-prioritize the premises
+     * @param tTruth The truth value of the judgment in the task
+     * @param bTruth The truth value of the belief
+     * @param truth The truth value of the conclusion of revision
+     * @param task The task to be immediatedly or continuely processed
+     * @return The budget for the new task 
+     */
+     BudgetValue revise(TruthValue tTruth, TruthValue bTruth, TruthValue truth, Task task, boolean feedbackToLinks) {
+        float difT = truth.getExpDifAbs(tTruth);
+        task.decPriority(1 - difT);
+        task.decDurability(1 - difT);
+        if (feedbackToLinks) {
+            TaskLink tLink = memory.currentTaskLink;
+            tLink.decPriority(1 - difT);
+            tLink.decDurability(1 - difT);
+            TermLink bLink = memory.currentBeliefLink;
+            float difB = truth.getExpDifAbs(bTruth);
+            bLink.decPriority(1 - difB);            
+            bLink.decDurability(1 - difB);
+        }
+        float dif = truth.getConfidence() - Math.max(tTruth.getConfidence(), bTruth.getConfidence());
+        float priority = or(dif, task.getPriority());
+        float durability = or(dif, task.getDurability());
+        float quality = truthToQuality(truth);
+        return new BudgetValue(priority, durability, quality, memory);
+    }
+    
+    /* ----------------------- Links ----------------------- */
+    
+    public  BudgetValue distributeAmongLinks(BudgetValue b, int n) {
+        float priority = (float) (b.getPriority() / Math.sqrt(n));
+        return new BudgetValue(priority, b.getDurability(), b.getQuality(), memory);
+    }
+
+    /* ----------------------- Concept ----------------------- */
+
+    /**
+     * Activate a concept by an incoming item (Task, TaskLink, or TermLink)
+     * @param concept The concept
+     * @param budget The budget for the new item 
+     */
+    public  void activate(Concept concept, BudgetValue budget) {
+        float quality = aveAri(concept.getQuality(), budget.getPriority());
+        float oldPri = concept.getPriority();
+        float priority = or(oldPri, quality);
+        float durability = aveAri(concept.getDurability(), budget.getDurability(), oldPri / priority);
+        concept.setPriority(priority);
+        concept.setDurability(durability);
+        concept.setQuality(quality);
+    }
+
+    /* ---------------- Bag functions, on all Items ------------------- */
+    
+    /**
+     * Decrease Priority after an item is used, called in Bag
+     * <p>
+     * After a constant time, p should become d*p.  Since in this period, the item is accessed c*p times, 
+     * each time p-q should multiple d^(1/(c*p)). 
+     * The intuitive meaning of the parameter "forgetRate" is: after this number of times of access, 
+     * priority 1 will become d, it is a system parameter adjustable in run time.
+     *
+     * @param budget The previous budget value
+     * @param forgetRate The budget for the new item
+     */
+    public static  void forget(BudgetValue budget, float forgetRate, float relativeThreshold) {
+        double quality = budget.getQuality() * relativeThreshold;      // re-scaled quality
+        double p = budget.getPriority() - quality;                     // priority above quality
+        if (p > 0)
+            quality += p * Math.pow(budget.getDurability(), 1.0 / (forgetRate * p));    // priority Durability
+        budget.setPriority((float) quality);
+    }
+    
+    /**
+     * Merge an item into another one in a bag, when the two are identical except in budget values
+     * @param baseValue The budget value to be modified
+     * @param adjustValue The budget doing the adjusting
+     */
+    public  void merge(BudgetValue baseValue, BudgetValue adjustValue) {
+        baseValue.incPriority(adjustValue.getPriority());
+        baseValue.setDurability(Math.max(baseValue.getDurability(), adjustValue.getDurability()));
+        baseValue.setQuality(Math.max(baseValue.getQuality(), adjustValue.getQuality()));
+    }
+
+    /* ----- Task derivation in MatchingRules and SyllogisticRules ----- */
+
+    /**
+     * Forward inference result and adjustment
+     * @param truth The truth value of the conclusion
+     * @return The budget value of the conclusion
+     */
+     BudgetValue forward(TruthValue truth) {
+        return budgetInference(truthToQuality(truth), 1);
+    }
+    
+    // backward inference result and adjustment
+    public  BudgetValue backward(TruthValue truth) {
+        return budgetInference(truthToQuality(truth), 1);
+    }
+    
+    public  BudgetValue backwardWeak(TruthValue truth) {
+        return budgetInference(w2c(1) * truthToQuality(truth), 1);
+    }
+
+    /* ----- Task derivation in CompositionalRules and StructuralRules ----- */
+
+    // forward inference with CompoundTerm conclusion and adjustment
+    public  BudgetValue compoundForward(TruthValue truth, Term content) {
+        return budgetInference(truthToQuality(truth), content.getComplexity());
+    }
+    
+    public  BudgetValue compoundBackward(Term content) {
+        return budgetInference(1, content.getComplexity());
+    }
+
+    public  BudgetValue compoundBackwardWeak(Term content) {
+        return budgetInference(w2c(1), content.getComplexity());
+    }
+
+    /* ----- common function for all inference ----- */
+    
+    private  BudgetValue budgetInference(float qual, int complexity) {
+        TaskLink tLink = memory.currentTaskLink;
+        TermLink bLink = memory.currentBeliefLink;
+        float priority = tLink.getPriority();
+        float durability = tLink.getDurability();
+        float quality = (float) (qual / Math.sqrt(complexity));
+        if (bLink != null) {
+            priority = aveAri(priority, bLink.getPriority());
+            durability = aveAri(durability, bLink.getDurability());
+            bLink.incPriority(quality);
+        }
+        return new BudgetValue(and(priority, quality), and(durability, quality), quality, memory);
+    }    
+}
diff --git a/open-nars/com/googlecode/opennars/inference/CompositionalRules.java b/open-nars/com/googlecode/opennars/inference/CompositionalRules.java
new file mode 100644
index 0000000..0a6b77b
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/CompositionalRules.java
@@ -0,0 +1,370 @@
+/*
+ * CompositionalRules.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.inference;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.*;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * Compound term composition and decomposition rules, with two premises.
+ * <p>
+ * Forward inference only, except the last rule (abdDepOuter) can also be used backward.
+ */
+public class CompositionalRules {
+	
+	private Memory memory;
+	private BudgetFunctions budgetfunctions;
+	
+	public CompositionalRules(Memory memory) {
+		this.memory = memory;
+		this.budgetfunctions = new BudgetFunctions(memory);
+	}
+    
+    /* -------------------- intersections and differences -------------------- */
+    
+    /**
+     * {<S ==> M>, <P ==> M>} |- {<(S|P) ==> M>, <(S&P) ==> M>, <(S-P) ==> M>, <(P-S) ==> M>}
+     * 
+     * @param sentence The first premise
+     * @param belief The second premise
+     * @param index The location of the shared term
+     */
+     void composeCompound(Sentence sentence, Judgement belief, int index) {
+        if (!sentence.isJudgment())
+            return;                             // forward only
+        Statement content1 = (Statement) sentence.getContent();
+        Statement content2 = (Statement) belief.getContent();
+        if (content1.getClass() != content2.getClass())
+            return;
+        if (content1.getTemporalOrder() != content2.getTemporalOrder())
+            return;
+        Term component1, component2;
+        component1 = content1.componentAt(1 - index);
+        component2 = content2.componentAt(1 - index);
+        Term component = content1.componentAt(index);
+        if ((component1 instanceof CompoundTerm) && ((CompoundTerm) component1).containAllComponents(component2)) {
+            decomposeCompound((CompoundTerm) component1, component2, component, index, true);
+            return;
+        } else if ((component2 instanceof CompoundTerm) && ((CompoundTerm) component2).containAllComponents(component1)) {
+            decomposeCompound((CompoundTerm) component2, component1, component, index, false);
+            return;
+        }
+        Term t1 = null;
+        Term t2 = null;
+        Term t3 = null;
+        Term t4 = null;
+        TruthValue v1 = sentence.getTruth();
+        TruthValue v2 = belief.getTruth();
+        if (index == 0) {
+            if (content1 instanceof Inheritance) {
+                t1 = IntersectionInt.make(component1, component2, this.memory);
+                t2 = IntersectionExt.make(component1, component2, this.memory);
+                t3 = DifferenceExt.make(component1, component2, this.memory);
+                t4 = DifferenceExt.make(component2, component1, this.memory);
+            } else if (content1 instanceof Implication) {
+                t1 = Disjunction.make(component1, component2, this.memory);
+                t2 = Conjunction.make(component1, component2, this.memory);
+                t3 = Conjunction.make(component1, Negation.make(component2, this.memory), this.memory);
+                t4 = Conjunction.make(component2, Negation.make(component1, this.memory), this.memory);
+            }
+            processComposed(content1, component, t1, TruthFunctions.union(v1, v2));
+            processComposed(content1, component, t2, TruthFunctions.intersection(v1, v2));
+            processComposed(content1, component, t3, TruthFunctions.difference(v1, v2));
+            processComposed(content1, component, t4, TruthFunctions.difference(v2, v1));
+            if (content1.isConstant())
+                introVarDepOuter(content1, content2, index);
+        } else {
+            if (content1 instanceof Inheritance) {
+                t1 = IntersectionExt.make(component1, component2, this.memory);
+                t2 = IntersectionInt.make(component1, component2, this.memory);
+                t3 = DifferenceInt.make(component1, component2, this.memory);
+                t4 = DifferenceInt.make(component2, component1, this.memory);
+            } else if (content1 instanceof Implication) {
+                t1 = Conjunction.make(component1, component2, this.memory);
+                t2 = Disjunction.make(component1, component2, this.memory);
+                t3 = Disjunction.make(component1, Negation.make(component2, this.memory), this.memory);
+                t4 = Disjunction.make(component2, Negation.make(component1, this.memory), this.memory);
+            }
+            processComposed(content1, t1, component, TruthFunctions.union(v1, v2));
+            processComposed(content1, t2, component, TruthFunctions.intersection(v1, v2));
+            processComposed(content1, t3, component, TruthFunctions.difference(v1, v2));
+            processComposed(content1, t4, component, TruthFunctions.difference(v2, v1));
+            if (content1.isConstant())
+                introVarDepOuter(content1, content2, index);
+        }
+    }
+    
+    /**
+     * Finish composing compound term
+     * @param statement Type of the content
+     * @param subject Subject of content
+     * @param predicate Predicate of content
+     * @param truth TruthValue of the content
+     */
+    private  void processComposed(Statement statement, Term subject, Term predicate, TruthValue truth) {
+        if ((subject == null) || (predicate == null)) 
+            return;
+        Term content = Statement.make(statement, subject, predicate, this.memory);
+        if ((content == null) || content.equals(statement) || content.equals(this.memory.currentBelief.getContent()))
+            return;
+        BudgetValue budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+    
+    /**
+     * {<(S|P) ==> M>, <P ==> M>} |- <S ==> M>
+     * @param compound The compound term to be decomposed
+     * @param component The part of the compound to be removed
+     * @param term1 The other term in the content
+     * @param index The location of the shared term: 0 for subject, 1 for predicate
+     * @param compoundTask Whether the compound comes from the task
+     */
+    private  void decomposeCompound(CompoundTerm compound, Term component, Term term1, int index, boolean compoundTask) {
+        Term term2 = CompoundTerm.reduceComponents(compound, component, this.memory);
+        if (term2 == null)
+            return;
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        Judgement belief = this.memory.currentBelief;
+        Statement oldContent = (Statement) task.getContent();
+        TruthValue v1, v2;
+        if (compoundTask) {
+            v1 = sentence.getTruth();
+            v2 = belief.getTruth();
+        } else {
+            v1 = belief.getTruth();
+            v2 = sentence.getTruth();
+        }
+        TruthValue truth = null;
+        Term content;
+        if (index == 0) {
+            content = Statement.make(oldContent, term1, term2, this.memory);
+            if (content == null)
+                return;
+            if (oldContent instanceof Inheritance) {
+                if (compound instanceof IntersectionExt) {
+                    truth = TruthFunctions.reduceConjunction(v1, v2);
+                } else if (compound instanceof IntersectionInt) {
+                    truth = TruthFunctions.reduceDisjunction(v1, v2);
+                } else if ((compound instanceof SetInt) && (component instanceof SetInt)) {
+                    truth = TruthFunctions.reduceConjunction(v1, v2);
+                } else if ((compound instanceof SetExt) && (component instanceof SetExt)) {
+                    truth = TruthFunctions.reduceDisjunction(v1, v2);
+                } else if (compound instanceof DifferenceExt) {
+                    if (compound.componentAt(0).equals(component)) {
+                        truth = TruthFunctions.reduceDisjunction(v2, v1);
+                    } else {
+                        truth = TruthFunctions.reduceConjunctionNeg(v1, v2);
+                    }
+                }
+            } else if (oldContent instanceof Implication) {
+                if (compound instanceof Conjunction) {
+                    truth = TruthFunctions.reduceConjunction(v1, v2);
+                } else if (compound instanceof Disjunction) {
+                    truth = TruthFunctions.reduceDisjunction(v1, v2);
+                }
+            }
+        } else {
+            content = Statement.make(oldContent, term2, term1, this.memory);
+            if (content == null)
+                return;
+            if (oldContent instanceof Inheritance) {
+                if (compound instanceof IntersectionInt) {
+                    truth = TruthFunctions.reduceConjunction(v1, v2);
+                } else if (compound instanceof IntersectionExt) {
+                    truth = TruthFunctions.reduceDisjunction(v1, v2);
+                } else if ((compound instanceof SetExt) && (component instanceof SetExt)) {
+                    truth = TruthFunctions.reduceConjunction(v1, v2);
+                } else if ((compound instanceof SetInt) && (component instanceof SetInt)) {
+                    truth = TruthFunctions.reduceDisjunction(v1, v2);
+                } else if (compound instanceof DifferenceInt) {
+                    if (compound.componentAt(1).equals(component)) {
+                        truth = TruthFunctions.reduceDisjunction(v2, v1);
+                    } else {
+                        truth = TruthFunctions.reduceConjunctionNeg(v1, v2);
+                    }
+                }
+            } else if (oldContent instanceof Implication) {
+                if (compound instanceof Disjunction) {
+                    truth = TruthFunctions.reduceConjunction(v1, v2);
+                } else if (compound instanceof Conjunction) {
+                    truth = TruthFunctions.reduceDisjunction(v1, v2);
+                }
+            }
+        }
+        BudgetValue budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+        
+    /**
+     * {(||, S, P), P} |- S
+     * @param compound The compound term to be decomposed
+     * @param component The part of the compound to be removed
+     * @param compoundTask Whether the compound comes from the task
+     */
+     void decomposeStatement(CompoundTerm compound, Term component, boolean compoundTask) {
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        if (!sentence.isJudgment())
+            return;
+        Judgement belief = this.memory.currentBelief;
+        Term content = CompoundTerm.reduceComponents(compound, component, this.memory);
+        if (content == null)
+            return;
+        TruthValue v1, v2;
+        if (compoundTask) {
+            v1 = sentence.getTruth();
+            v2 = belief.getTruth();
+        } else {
+            v1 = belief.getTruth();
+            v2 = sentence.getTruth();
+        }        
+        TruthValue truth = null;
+        if (compound instanceof Conjunction) {
+            if (sentence instanceof Goal) {
+                if (compoundTask)
+                    truth = TruthFunctions.reduceDisjunction(v1, v2);
+                else
+                    return;
+            } else if (sentence instanceof Judgement)
+                truth = TruthFunctions.reduceConjunction(v1, v2);
+        } else if (compound instanceof Disjunction) {
+            if (sentence instanceof Goal) {
+                if (compoundTask)
+                    truth = TruthFunctions.reduceConjunction(v1, v2);
+                else
+                    return;
+            } else if (sentence instanceof Judgement)
+                truth = TruthFunctions.reduceDisjunction(v1, v2);
+        } else
+            return;
+        BudgetValue budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+    
+    /* ---------------- dependent variable and conjunction ---------------- */
+    
+    /**
+     * {<M --> S>, <M --> P>} |- (&&, <#x() --> S>, <#x() --> P>>
+     * @param premise1 The first premise <M --> P>
+     * @param premise2 The second premise <M --> P>
+     * @param index The location of the shared term: 0 for subject, 1 for predicate
+     */
+    private  Conjunction introVarDep(Statement premise1, Statement premise2, int index) {
+        Statement state1, state2;
+        Variable v1 = new Variable(Symbols.VARIABLE_TAG + "0()");
+        Variable v2 = new Variable(Symbols.VARIABLE_TAG + "0()");
+        if (index == 0) {
+            state1 = Statement.make(premise1, v1, premise1.getPredicate(), this.memory);
+            state2 = Statement.make(premise2, v2, premise2.getPredicate(), this.memory);
+        } else {
+            state1 = Statement.make(premise1, premise1.getSubject(), v1, this.memory);
+            state2 = Statement.make(premise2, premise2.getSubject(), v2, this.memory);
+        }
+        Conjunction content = (Conjunction) Conjunction.make(state1, state2, this.memory);
+        return content;
+    }
+
+    /**
+     * Introduce a dependent variable in an outer-layer conjunction
+     * @param premise1 The first premise <M --> S>
+     * @param premise2 The second premise <M --> P>
+     * @param index The location of the shared term: 0 for subject, 1 for predicate
+     */
+    private  void introVarDepOuter(Statement premise1, Statement premise2, int index) {
+        Term content = introVarDep(premise1, premise2, index);
+        TruthValue v1 = this.memory.currentTask.getSentence().getTruth();
+        TruthValue v2 = this.memory.currentBelief.getTruth();
+        TruthValue truth = TruthFunctions.intersection(v1, v2);
+        BudgetValue budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+    
+    /**
+     * Introduce a dependent variable in an inner-layer conjunction
+     * @param compound The compound containing the first premise
+     * @param component The first premise <M --> S>
+     * @param premise The second premise <M --> P>
+     */
+     void introVarDepInner(CompoundTerm compound, Term component, Term premise) {
+        if (!(component instanceof Statement) || !(component.getClass() == premise.getClass()))
+            return;
+        Statement premise1 = (Statement) premise;
+        Statement premise2 = (Statement) component;
+        int index;
+        if (premise1.getSubject().equals(premise2.getSubject()))
+            index = 0;
+        else if (premise1.getPredicate().equals(premise2.getPredicate()))
+            index = 1;
+        else
+            return;
+        Term innerContent = introVarDep(premise1, premise2, index);
+        if (innerContent == null)
+            return;
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        Judgement belief = this.memory.currentBelief;
+        Term content = task.getContent();
+        if (compound instanceof Implication)
+            content = Statement.make((Statement) content, compound.componentAt(0), innerContent, this.memory);
+        else if (compound instanceof Conjunction)
+            content = CompoundTerm.replaceComponent(compound, component, innerContent, this.memory);
+        TruthValue truth = null;
+        if (sentence instanceof Goal)
+            truth = TruthFunctions.intersection(belief.getTruth(), sentence.getTruth());    // to be revised
+        else if (sentence instanceof Judgement)
+            truth = TruthFunctions.intersection(belief.getTruth(), sentence.getTruth());
+        else
+            return; // don't do it for questions
+        BudgetValue budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+
+    /**
+     * {(&&, <#x() --> S>, <#x() --> P>>, <M --> P>} |- <M --> S>
+     * @param compound The compound term to be decomposed
+     * @param component The part of the compound to be removed
+     * @param compoundTask Whether the compound comes from the task
+     */
+     void abdVarDepOuter(CompoundTerm compound, Term component, boolean compoundTask) {
+        Term content = CompoundTerm.reduceComponents(compound, component, this.memory);
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        Judgement belief = this.memory.currentBelief;
+        TruthValue v1 = sentence.getTruth();
+        TruthValue v2 = belief.getTruth();
+        TruthValue truth = null;
+        BudgetValue budget;
+        if (sentence instanceof Question)
+            budget = (compoundTask ? this.budgetfunctions.backward(v2) : this.budgetfunctions.backwardWeak(v2));
+        else {
+            if (sentence instanceof Goal)
+                truth = (compoundTask ? TruthFunctions.desireStrong(v1, v2) : TruthFunctions.desireWeak(v1, v2));
+            else
+                truth = (compoundTask ? TruthFunctions.existAnalogy(v1, v2) : TruthFunctions.existAnalogy(v2, v1));
+            budget = this.budgetfunctions.compoundForward(truth, content);
+        }
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/inference/MatchingRules.java b/open-nars/com/googlecode/opennars/inference/MatchingRules.java
new file mode 100644
index 0000000..0942515
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/MatchingRules.java
@@ -0,0 +1,205 @@
+/*
+ * MatchingRules.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.inference;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * Directly process a task by a belief, with only two Terms in both
+ */
+public class MatchingRules {
+	
+	private Memory memory;
+	private BudgetFunctions budgetfunctions;
+	
+	public MatchingRules(Memory memory) {
+		this.memory = memory;
+		this.budgetfunctions = new BudgetFunctions(memory);
+	}
+    
+    /* -------------------- same contents -------------------- */
+    
+    // the task and belief match each other
+    // forward inference only
+    // called only for Figure 0 of syllogism, in ThreeTermRules
+    public  void match(Task task, Judgement belief) {
+        Sentence sentence = task.getSentence();
+        if (sentence.isJudgment())
+            revision(task, belief, true);
+        else
+            trySolution(sentence, belief, null);
+    }
+    
+    // to be rewritten
+    public  void update(Task newBelief, Judgement oldBelief) {
+//        Base label = Base.make(newBelief.getBase(), oldBelief.getBase());
+//        if ((label == null) || (label.length() == 0))
+//            return;
+//        Task updatedNewBelief = (Task) newBelief.clone();
+//        Task updatedOldBelief = (Task) oldBelief.clone();
+//        Term content = oldBelief.getContent();
+//        Term toPast = Past.make(content);
+//        updatedOldBelief.setContent(toPast);
+//        updatedNewBelief.setBase(label);
+//        TruthValue truth = TruthFunctions.revision(newBelief.getTruth(), oldBelief.getTruth());
+//        float confidence = truth.getConfidence();
+//        updatedNewBelief.setConfidence(confidence);
+//        BudgetValue usage = this.budgetfunctions.update(newBelief, oldBelief);
+//        updatedNewBelief.setBudget(usage);
+//        this.memory.derivedTask(updatedNewBelief);
+//        this.memory.derivedTask(updatedOldBelief);
+    }
+    
+    // called from Concept (direct) and match (indirect)
+    public  void revision(Task task, Judgement belief, boolean feedbackToLinks) {
+        Judgement judgement = (Judgement) task.getSentence();
+        TruthValue tTruth = judgement.getTruth();
+        TruthValue bTruth = belief.getTruth();
+        TruthValue truth = TruthFunctions.revision(tTruth, bTruth);
+        BudgetValue budget = this.budgetfunctions.revise(tTruth, bTruth, truth, task, feedbackToLinks);
+        Term content = judgement.getContent();
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+
+    /**
+     * Check if a Judgement provide a better answer to a Question
+     * @param task The task to be processed
+     */
+    public  void trySolution(Sentence problem, Judgement belief, Task task) {
+        Judgement oldBest = problem.getBestSolution();
+        if (betterSolution(belief, oldBest, problem)) {
+            problem.setBestSolution(belief);
+            BudgetValue budget = this.budgetfunctions.solutionEval(problem, belief, task);
+            if (budget != null)
+                this.memory.activatedTask(budget, belief, problem.isInput());
+        }
+    }
+    
+    // s1 is a better answer to q than s2 is
+    private  boolean betterSolution(Judgement newSol, Judgement oldSol, Sentence problem) {
+        if (oldSol == null)
+            return true;
+        else
+            return (newSol.solutionQuality(problem) > oldSol.solutionQuality(problem));
+    }
+
+    /* -------------------- same terms, difference relations -------------------- */
+    
+    // the task and belief match each other reversely
+    // forward inference only
+    // called only for Figure 5 of syllogism
+    public  void matchReverse() {
+        Task task = this.memory.currentTask;
+        Judgement belief = this.memory.currentBelief;
+        if (task.getContent().getTemporalOrder() != CompoundTerm.temporalReverse(belief.getContent().getTemporalOrder()))
+            return;
+        Sentence sentence = task.getSentence();
+        if (sentence.isJudgment())
+            inferToSym((Judgement) sentence, belief);
+        else
+            conversion();
+    }
+    
+    // Inheritance matches Similarity
+    // forward inference only
+    // called from ThreeTermRules only
+    public  void matchAsymSym(Sentence asym, Sentence sym, int figure) { // (Task task, Sentence belief, int order, boolean inhSim) {
+        CompoundTerm.TemporalOrder order1 = asym.getContent().getTemporalOrder();
+        CompoundTerm.TemporalOrder order2 = sym.getContent().getTemporalOrder();
+        CompoundTerm.TemporalOrder order = CompoundTerm.temporalInferenceWithFigure(order1, order2, figure);
+        if (order == CompoundTerm.TemporalOrder.UNSURE)
+            return;
+        if (this.memory.currentTask.getSentence().isJudgment())
+            inferToAsym((Judgement) asym, (Judgement) sym, order);
+        else {
+            convertRelation();
+        }
+    }
+
+    /* -------------------- two-premise inference rules -------------------- */
+    
+    /**
+     * Produce Similarity/Equivalence from a pire of reversed Inheritance/Implication
+     * @param judgement1 The first premise
+     * @param judgement2 The second premise
+     */
+    private  void inferToSym(Judgement judgement1, Judgement judgement2) {
+        Statement s1 = (Statement) judgement1.getContent();
+        Statement s2 = (Statement) judgement2.getContent();
+        Term t1 = s1.getSubject();
+        Term t2 = s1.getPredicate();
+        Term content;
+        if (s1 instanceof Inheritance)
+            content = Similarity.make(t1, t2, this.memory);
+        else if (s1 instanceof ImplicationAfter)
+            content = EquivalenceAfter.make(t1, t2, this.memory);
+        else if (s1 instanceof ImplicationBefore)
+            content = EquivalenceAfter.make(t2, t1, this.memory);
+        else
+            content = Equivalence.make(t1, t2, this.memory);
+        TruthValue value1 = judgement1.getTruth();
+        TruthValue value2 = judgement2.getTruth();
+        TruthValue truth = TruthFunctions.intersection(value1, value2);
+        BudgetValue budget = this.budgetfunctions.forward(truth);
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+    
+    /**
+     * Produce an Inheritance/Implication from a Similarity/Equivalence and a reversed Inheritance/Implication
+     * @param asym The asymmetric premise
+     * @param sym The symmetric premise
+     */
+    private  void inferToAsym(Judgement asym, Judgement sym, CompoundTerm.TemporalOrder order) {
+        Statement statement = (Statement) asym.getContent();
+        Term sub = statement.getPredicate();
+        Term pre = statement.getSubject();
+        Statement content = Statement.make(statement, sub, pre, order, this.memory);
+        TruthValue truth = TruthFunctions.reduceConjunction(sym.getTruth(), asym.getTruth());
+        BudgetValue budget = this.budgetfunctions.forward(truth);
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+
+    /* -------------------- one-premise inference rules -------------------- */
+    
+    /**
+     * Produce an Inheritance/Implication from a reversed Inheritance/Implication
+     */
+    private  void conversion() {
+        TruthValue truth = TruthFunctions.conversion(this.memory.currentBelief.getTruth());
+        BudgetValue budget = this.budgetfunctions.forward(truth);
+        this.memory.singlePremiseTask(truth, budget);
+    }
+    
+    // switch between Inheritance/Implication and Similarity/Equivalence
+    private  void convertRelation() {
+        TruthValue truth = this.memory.currentBelief.getTruth();
+        if (((Statement) this.memory.currentTask.getContent()).isCommutative())
+            truth = TruthFunctions.implied(truth);
+        else
+            truth = TruthFunctions.implying(truth);
+        BudgetValue budget = this.budgetfunctions.forward(truth);
+        this.memory.singlePremiseTask(truth, budget);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/inference/RuleTables.java b/open-nars/com/googlecode/opennars/inference/RuleTables.java
new file mode 100644
index 0000000..a34caef
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/RuleTables.java
@@ -0,0 +1,440 @@
+/*
+ * RuleTables.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.inference;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * Table of inference rules, indexed by the CompositionLinks for the task and the belief.
+ * Used for indirective processing of a task
+ */
+public class RuleTables {
+    
+	private Memory memory;
+	
+	private SyllogisticRules syllogisticrules;
+	private StructuralRules structuralrules;
+	private MatchingRules matchingrules;
+	private CompositionalRules compositionalrules;
+	
+	public RuleTables(Memory memory) {
+		this.memory = memory;
+		this.syllogisticrules = new SyllogisticRules(memory);
+		this.structuralrules = new StructuralRules(memory);
+		this.matchingrules = new MatchingRules(memory);
+		this.compositionalrules = new CompositionalRules(memory);
+	}
+	
+	public MatchingRules getMatchingRules() {
+		return this.matchingrules;
+	}
+	
+    /* ----- inferences with two composition links ----- */
+    
+    public  void reason(TaskLink tLink, TermLink bLink) {
+        Task task = memory.currentTask;
+        Term taskTerm = (Term) task.getContent().clone();         // cloning for substitution
+        Term beliefTerm = (Term) bLink.getTarget().clone();       // cloning for substitution
+        Concept beliefConcept = memory.termToConcept(beliefTerm);
+        Judgement belief = null;
+        if (beliefConcept != null)
+            belief = beliefConcept.getBelief(task);
+        memory.currentBelief = belief;  // may be null
+        if ((belief != null) && (Variable.findSubstitute(Variable.VarType.QUERY, taskTerm, beliefTerm) != null))
+            matchingrules.match(task, belief);
+        short tIndex = tLink.getIndex(0);
+        short bIndex = bLink.getIndex(0);
+        switch(tLink.getType()) {
+            case TermLink.SELF:
+                switch(bLink.getType()) {
+                    case TermLink.COMPONENT:
+                        compoundAndSelf((CompoundTerm) taskTerm, beliefTerm, true);
+                        break;
+                    case TermLink.COMPOUND:
+                        compoundAndSelf((CompoundTerm) beliefTerm, taskTerm, false);
+                        break;
+                    case TermLink.COMPONENT_STATEMENT:  // detachment
+                        if (belief != null)
+                            syllogisticrules.detachment((Statement) taskTerm, null, true, bIndex);
+                        break;
+                    case TermLink.COMPOUND_STATEMENT:   // detachment
+                        if (belief != null)
+                            syllogisticrules.detachment((Statement) beliefTerm, null, false, bIndex); //task, beliefTerm);
+                        break;
+                    case TermLink.COMPONENT_CONDITION:
+                        if (belief != null)
+                            syllogisticrules.conditionalDedInd((Implication) taskTerm, bIndex, beliefTerm, tIndex);
+                        break;
+                    case TermLink.COMPOUND_CONDITION:
+                        if (belief != null)
+                            syllogisticrules.conditionalDedInd((Implication) beliefTerm, bIndex, taskTerm, tIndex);
+                        break;
+                    default:
+                }
+                break;
+            case TermLink.COMPOUND:
+                switch(bLink.getType()) {
+                    case TermLink.COMPOUND:
+                        compoundAndCompound((CompoundTerm) taskTerm, tIndex, (CompoundTerm) beliefTerm, bIndex);
+                        break;
+                    case TermLink.COMPOUND_STATEMENT:
+                        compoundAndStatement((CompoundTerm) taskTerm, tIndex, (Statement) beliefTerm, bIndex, beliefTerm);
+                        break;
+                    default:
+                }
+                break;
+            case TermLink.COMPOUND_STATEMENT:
+                switch(bLink.getType()) {
+                    case TermLink.COMPONENT:
+                        componentAndStatement((CompoundTerm) memory.currentTerm, bIndex, (Statement) taskTerm, tIndex);
+                        break;
+                    case TermLink.COMPOUND:
+                        compoundAndStatement((CompoundTerm) beliefTerm, bIndex, (Statement) taskTerm, tIndex, beliefTerm);
+                        break;
+                    case TermLink.COMPOUND_STATEMENT:
+                        if (belief != null)
+                            syllogisms(tLink, bLink, taskTerm, beliefTerm);
+                        break;
+                    case TermLink.COMPOUND_CONDITION:
+                        if (belief != null)
+                            conditionalDedIndWithVar((Implication) beliefTerm, bIndex, (Statement) taskTerm, tIndex);
+                        break;
+                    default:
+                }
+                break;
+            case TermLink.COMPOUND_CONDITION:
+                switch(bLink.getType()) {
+                    case TermLink.COMPOUND_STATEMENT:
+                        if (belief != null)
+                            conditionalDedIndWithVar((Implication) taskTerm, tIndex, (Statement) beliefTerm, bIndex);
+                        break;
+                    default:
+                }
+                break;
+            default:
+                // to be revised to cover all types
+        }
+    }
+    
+    /* ----- syllogistic inferences ----- */
+    
+    /**
+     * Meta-table of syllogistic rules, indexed by the content classes of the sentence and the belief
+     */
+    private  void syllogisms(TaskLink tLink, TermLink bLink, Term taskTerm, Term beliefTerm) {
+        Sentence sentence = memory.currentTask.getSentence();
+        Judgement belief = memory.currentBelief;
+        int figure;
+        if (taskTerm instanceof Inheritance) {
+            if (beliefTerm instanceof Inheritance) {
+                figure = indexToFigure(tLink, bLink);
+                asymmetricAsymmetric(sentence, belief, figure);
+            } else if (beliefTerm instanceof Similarity) {
+                figure = indexToFigure(tLink, bLink);
+                asymmetricSymmetric(sentence, belief, figure);
+            } else
+                detachmentWithVar((Statement) beliefTerm, false, bLink.getIndex(0), (Statement) taskTerm, belief);
+        } else if (taskTerm instanceof Similarity) {
+            if (beliefTerm instanceof Inheritance) {
+                figure = indexToFigure(bLink, tLink);
+                asymmetricSymmetric(belief, sentence, figure);
+            } else if (beliefTerm instanceof Similarity) {
+                figure = indexToFigure(bLink, tLink);
+                symmetricSymmetric(belief, sentence, figure);
+            }
+        } else if (taskTerm instanceof Implication) {
+            if (beliefTerm instanceof Implication) {
+                figure = indexToFigure(tLink, bLink);
+                asymmetricAsymmetric(sentence, belief, figure);
+            } else if (beliefTerm instanceof Equivalence) {
+                figure = indexToFigure(tLink, bLink);
+                asymmetricSymmetric(sentence, belief, figure);
+            } else if (beliefTerm instanceof Inheritance)
+                detachmentWithVar((Statement) taskTerm, true, tLink.getIndex(0), (Statement) beliefTerm, belief);
+            // or intro 2nd ind var
+        } else if (taskTerm instanceof Equivalence) {
+            if (beliefTerm instanceof Implication) {
+                figure = indexToFigure(bLink, tLink);
+                asymmetricSymmetric(belief, sentence, figure);
+            } else if (beliefTerm instanceof Equivalence) {
+                figure = indexToFigure(bLink, tLink);
+                symmetricSymmetric(belief, sentence, figure);
+            } else if (beliefTerm instanceof Inheritance)
+                detachmentWithVar((Statement) taskTerm, true, tLink.getIndex(0), (Statement) beliefTerm, belief);
+        }
+    }
+    
+    private  int indexToFigure(TermLink link1, TermLink link2) {
+        return (link1.getIndex(0) + 1) * 10 + (link2.getIndex(0) + 1);    // valid value: 11, 12, 21, 22
+    }
+    
+    /**
+     * Syllogistic rules whose both premises are on the same asymmetric relation
+     */
+    private  void asymmetricAsymmetric(Sentence sentence, Judgement belief, int figure) {
+        Statement s1 = (Statement) sentence.cloneContent();
+        Statement s2 = (Statement) belief.cloneContent();
+        Term t1, t2;
+        switch (figure) {
+            case 11:    // induction
+                if (Variable.unify(Variable.VarType.INDEPENDENT, s1.getSubject(), s2.getSubject(), s1, s2)) {
+                    t1 = s2.getPredicate();
+                    t2 = s1.getPredicate();
+                    syllogisticrules.abdIndCom(t1, t2, sentence, belief, figure);
+                    compositionalrules.composeCompound(sentence, belief, 0);
+                }
+                break;
+            case 12:    // deduction
+                if (Variable.unify(Variable.VarType.INDEPENDENT, s1.getSubject(), s2.getPredicate(), s1, s2)) {
+                    t1 = s2.getSubject();
+                    t2 = s1.getPredicate();
+                    if (Variable.unify(Variable.VarType.QUERY, t1, t2, s1, s2))
+                        matchingrules.matchReverse();
+                    else
+                        syllogisticrules.dedExe(t1, t2, sentence, belief);
+                }
+                break;
+            case 21:    // exemplification
+                if (Variable.unify(Variable.VarType.INDEPENDENT, s1.getPredicate(), s2.getSubject(), s1, s2)) {
+                    t1 = s1.getSubject();
+                    t2 = s2.getPredicate();
+                    if (Variable.unify(Variable.VarType.QUERY, t1, t2, s1, s2))
+                        matchingrules.matchReverse();
+                    else
+                        syllogisticrules.dedExe(t1, t2, sentence, belief);
+                }
+                break;
+            case 22:    // abduction
+                if (Variable.unify(Variable.VarType.INDEPENDENT, s1.getPredicate(), s2.getPredicate(), s1, s2)) {
+                    t1 = s1.getSubject();
+                    t2 = s2.getSubject();
+                    if (! syllogisticrules.conditionalAbd(t1, t2, s1, s2)) {         // if conditional abduction, skip the following
+                        syllogisticrules.abdIndCom(t1, t2, sentence, belief, figure);
+                        compositionalrules.composeCompound(sentence, belief, 1);
+                    }
+                }
+                break;
+            default:
+        }
+    }
+    
+    /**
+     * Syllogistic rules whose first premise is on an asymmetric relation, and the second on a symmetric relation
+     */
+    private  void asymmetricSymmetric(Sentence asym, Sentence sym, int figure) {
+        Statement asymSt = (Statement) asym.cloneContent();
+        Statement symSt = (Statement) sym.cloneContent();
+        Term t1, t2;
+        switch (figure) {
+            case 11:
+                if (Variable.unify(Variable.VarType.INDEPENDENT, asymSt.getSubject(), symSt.getSubject(), asymSt, symSt)) {
+                    t1 = asymSt.getPredicate();
+                    t2 = symSt.getPredicate();
+                    if (Variable.unify(Variable.VarType.QUERY, t1, t2, asymSt, symSt))
+                        matchingrules.matchAsymSym(asym, sym, figure); //task, belief, order1 - order2, false);
+                    else
+                        syllogisticrules.analogy(t2, t1, asym, sym, figure);
+                }
+                break;
+            case 12:
+                if (Variable.unify(Variable.VarType.INDEPENDENT, asymSt.getSubject(), symSt.getPredicate(), asymSt, symSt)) {
+                    t1 = asymSt.getPredicate();
+                    t2 = symSt.getSubject();
+                    if (Variable.unify(Variable.VarType.QUERY, t1, t2, asymSt, symSt))
+                        matchingrules.matchAsymSym(asym, sym, figure); //task, belief, order1 - order2, false);
+                    else
+                        syllogisticrules.analogy(t2, t1, asym, sym, figure);
+                }
+                break;
+            case 21:
+                if (Variable.unify(Variable.VarType.INDEPENDENT, asymSt.getPredicate(), symSt.getSubject(), asymSt, symSt)) {
+                    t1 = asymSt.getSubject();
+                    t2 = symSt.getPredicate();
+                    if (Variable.unify(Variable.VarType.QUERY, t1, t2, asymSt, symSt))
+                        matchingrules.matchAsymSym(asym, sym, figure); //task, belief, order1 - order2, false);
+                    else
+                        syllogisticrules.analogy(t1, t2, asym, sym, figure);
+                }
+                break;
+            case 22:
+                if (Variable.unify(Variable.VarType.INDEPENDENT, asymSt.getPredicate(), symSt.getPredicate(), asymSt, symSt)) {
+                    t1 = asymSt.getSubject();
+                    t2 = symSt.getSubject();
+                    if (Variable.unify(Variable.VarType.QUERY, t1, t2, asymSt, symSt))
+                        matchingrules.matchAsymSym(asym, sym, figure); //task, belief, order1 - order2, false);
+                    else
+                        syllogisticrules.analogy(t1, t2, asym, sym, figure);
+                }
+                break;
+        }
+    }
+    
+    /**
+     * Syllogistic rules whose both premises are on the same symmetric relation
+     */
+    private  void symmetricSymmetric(Judgement belief, Sentence sentence, int figure) {
+        Statement s1 = (Statement) belief.cloneContent();
+        Statement s2 = (Statement) sentence.cloneContent();
+        switch (figure) {
+            case 11:
+                if (Variable.unify(Variable.VarType.INDEPENDENT, s1.getSubject(), s2.getSubject(), s1, s2))
+                    syllogisticrules.resemblance(s1.getPredicate(), s2.getPredicate(), belief, sentence, figure);
+                break;
+            case 12:
+                if (Variable.unify(Variable.VarType.INDEPENDENT, s1.getSubject(), s2.getPredicate(), s1, s2))
+                    syllogisticrules.resemblance(s1.getPredicate(), s2.getSubject(), belief, sentence, figure);
+                break;
+            case 21:
+                if (Variable.unify(Variable.VarType.INDEPENDENT, s1.getPredicate(), s2.getSubject(), s1, s2))
+                    syllogisticrules.resemblance(s1.getSubject(), s2.getPredicate(), belief, sentence, figure);
+                break;
+            case 22:
+                if (Variable.unify(Variable.VarType.INDEPENDENT, s1.getPredicate(), s2.getPredicate(), s1, s2))
+                    syllogisticrules.resemblance(s1.getSubject(), s2.getSubject(), belief, sentence, figure);
+                break;
+        }
+    }
+    
+    /* ----- conditional inferences ----- */
+    
+    private  void detachmentWithVar(Statement statement, boolean compoundTask, int index, CompoundTerm compound, Sentence belief) {
+        Term component = statement.componentAt(index);
+        Term inh = (compound instanceof Tense) ? compound.componentAt(0) : compound;
+        if ((component instanceof Inheritance) && (belief != null)) {
+            if (component.isConstant())
+                syllogisticrules.detachment(statement, compound, compoundTask, index);
+            else if (Variable.unify(Variable.VarType.INDEPENDENT, component, inh, statement, compound))
+                syllogisticrules.detachment(statement, compound, compoundTask, index);
+            else if ((statement instanceof Implication) && (memory.currentTask.getSentence().isJudgment())) {
+                syllogisticrules.introVarIndInner(statement, statement.getPredicate(), inh);    // tense???
+                compositionalrules.introVarDepInner(statement, statement.getPredicate(), inh);  // tense???
+            }
+        }
+    }
+    
+    private  void conditionalDedIndWithVar(Implication conditional, short index, Statement statement, short side) {
+        CompoundTerm condition = (CompoundTerm) conditional.getSubject();
+        Term component = condition.componentAt(index);
+        Term component2 = null;
+        if (statement instanceof Inheritance)
+            component2 = statement;
+        else if (statement instanceof Implication)
+            component2 = statement.componentAt(side);
+        if ((component2 != null) && Variable.unify(Variable.VarType.INDEPENDENT, component, component2, conditional, statement))
+            syllogisticrules.conditionalDedInd(conditional, index, statement, -1);
+    }
+    
+    /* ----- structural inferences ----- */
+    
+    private  void compoundAndSelf(CompoundTerm compound, Term component, boolean compoundTask) {
+        if ((compound instanceof Conjunction) || (compound instanceof Disjunction)) {
+            if (memory.currentBelief != null)
+                compositionalrules.decomposeStatement(compound, component, compoundTask);
+            else if (compound.containComponent(component))
+                structuralrules.structuralCompound(compound, component, compoundTask);
+        } else if ((compound instanceof Negation) && !memory.currentTask.isStructual()) {
+            if (compoundTask)
+                structuralrules.transformNegation(((Negation) compound).componentAt(0));
+            else
+                structuralrules.transformNegation(compound);
+        }
+    }
+    
+    private  void compoundAndCompound(CompoundTerm taskTerm, int tIndex, CompoundTerm beliefTerm, int bIndex) {
+        if (taskTerm.getClass() == beliefTerm.getClass()) {
+            if (taskTerm.size() > beliefTerm.size())
+                compoundAndSelf(taskTerm, beliefTerm, true);
+            else if (taskTerm.size() < beliefTerm.size())
+                compoundAndSelf(beliefTerm, taskTerm, false);
+        }
+    }
+    
+    private  void compoundAndStatement(CompoundTerm compound, short index, Statement statement, short side, Term beliefTerm) {
+        Term component = compound.componentAt(index);
+        Task task = memory.currentTask;
+        if (component.getClass() ==  statement.getClass()) {
+            if ((compound instanceof Conjunction) && (memory.currentBelief != null)) {
+                if (Variable.unify(Variable.VarType.DEPENDENT, component, statement, compound, statement))
+                    compositionalrules.abdVarDepOuter(compound, component, statement.equals(beliefTerm));
+                else if (task.getSentence().isJudgment()) {
+                    syllogisticrules.introVarIndInner(compound, component, statement);
+                    compositionalrules.introVarDepInner(compound, component, statement);
+                }
+            }
+        } else {
+            if (compound instanceof Tense) {
+                if (component instanceof Inheritance)
+                    detachmentWithVar(statement, statement.equals(beliefTerm), side, compound, memory.currentBelief);
+                else {
+                    Sentence belief = memory.currentBelief;
+                    if (belief != null)
+                        syllogisticrules.detachment(statement, compound, statement.equals(beliefTerm), side);
+                }
+            } else if (!task.isStructual() && task.getSentence().isJudgment()) {
+                if (statement instanceof Inheritance) {
+                    structuralrules.structuralCompose1(compound, index, statement);
+                    if (!(compound instanceof SetExt) && !(compound instanceof SetInt))
+                        structuralrules.structuralCompose2(compound, index, statement, side);    // {A --> B, A @ (A&C)} |- (A&C) --> (B&C)
+                } else if (statement instanceof Similarity)
+                    structuralrules.structuralCompose2(compound, index, statement, side);    // {A <-> B, A @ (A&C)} |- (A&C) <-> (B&C)
+            }
+        }
+    }
+    
+    private  void componentAndStatement(CompoundTerm compound, short index, Statement statement, short side) {
+        if (!memory.currentTask.isStructual()) {
+            if (statement instanceof Inheritance) {
+                structuralrules.structuralDecompose1(compound, index, statement, side);
+                if (!(compound instanceof SetExt) && !(compound instanceof SetInt))
+                    structuralrules.structuralDecompose2(statement);   // {(C-B) --> (C-A), A @ (C-A)} |- A --> B
+                else
+                    structuralrules.transformSetRelation(compound, statement, side);
+            } else if (statement instanceof Similarity) {
+                structuralrules.structuralDecompose2(statement);   // {(C-B) --> (C-A), A @ (C-A)} |- A --> B
+                if ((compound instanceof SetExt) || (compound instanceof SetInt))
+                    structuralrules.transformSetRelation(compound, statement, side);
+            } else if ((statement instanceof Implication) && (compound instanceof Negation))
+                structuralrules.contraposition(statement);
+        }
+    }
+    
+    /* ----- inference with one composition link ----- */
+    
+    public  void transformTask(Task task,  TaskLink tLink) {          // move to StructuralRules???
+        CompoundTerm content = (CompoundTerm) task.getContent().clone();
+        short[] indices = tLink.getIndices();
+        Term inh = null;
+        if (indices.length == 2) {
+            inh = content;
+        } else if (indices.length == 3) {
+            if ((content instanceof Implication) && (content.componentAt(0) instanceof Conjunction))
+                inh = ((CompoundTerm) content.componentAt(0)).componentAt(indices[0]);
+            else
+                inh = content.componentAt(indices[0]);
+        }
+        if (inh instanceof Inheritance)
+            structuralrules.transformProductImage((Inheritance)inh, content, indices, task);
+    }
+    
+}
diff --git a/open-nars/com/googlecode/opennars/inference/StructuralRules.java b/open-nars/com/googlecode/opennars/inference/StructuralRules.java
new file mode 100644
index 0000000..607061a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/StructuralRules.java
@@ -0,0 +1,435 @@
+/*
+ * StructuralRules.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.inference;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.*;
+import com.googlecode.opennars.parser.*;
+
+
+/**
+ * Forward inference rules involving compound terms.
+ * Input premises are one sentence and one BeliefLink.
+ */
+public class StructuralRules {
+    
+	private Memory memory;
+	private BudgetFunctions budgetfunctions;
+	
+	public StructuralRules(Memory memory) {
+		this.memory = memory;
+		this.budgetfunctions = new BudgetFunctions(memory);
+	}
+	
+    /* -------------------- transform between compounds and components -------------------- */
+    
+    /**
+     * {<A --> B>} |- <(A&C) --> (B&C)>
+     * @param compound The compound term
+     * @param index The location of the indicated term in the compound
+     * @param statement The premise
+     * @param side The location of the indicated term in the premise
+     */
+     void structuralCompose2(CompoundTerm compound, short index, Statement statement, short side) {
+        Term sub = statement.getSubject();
+        Term pred = statement.getPredicate();
+        ArrayList<Term> components = compound.cloneComponents();
+        if (((side == 0) && components.contains(pred)) || ((side == 1) && components.contains(sub)))
+            return;     // both terms in compound
+        if (side == 0) {
+            sub = compound;
+            components.set(index, pred);
+            pred = CompoundTerm.make(compound, components, this.memory);
+        } else {
+            components.set(index, sub);
+            sub = CompoundTerm.make(compound, components, this.memory);
+            pred = compound;
+        }
+        if ((sub == null) || (pred == null))
+            return;
+        Term content;
+        if (switchOrder(compound, index))
+            content = Statement.make(statement, pred, sub, this.memory);     // {A --> B, A @ (C-A)} |- (C-B) --> (C-A)
+        else
+            content = Statement.make(statement, sub, pred, this.memory);     // the other cases
+        if (content == null)
+            return;
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        BudgetValue budget;
+        if (sentence instanceof Question) {
+            budget = this.budgetfunctions.compoundBackwardWeak(content);
+        } else {
+            if (compound.size() > 1) {
+                if (sentence.isJudgment())
+                    truth = TruthFunctions.implying(truth);
+                else // Goal
+                    truth = TruthFunctions.implied(truth);
+            }
+            budget = this.budgetfunctions.compoundForward(truth, content);
+        }
+        this.memory.singlePremiseTask(budget, content, truth);
+    }
+
+    /**
+     * {<(A&C) --> (B&C)>} |- <A --> B>
+     * @param statement The premise
+     */
+     void structuralDecompose2(Statement statement) {
+        Term subj = statement.getSubject();
+        Term pred = statement.getPredicate();
+        if (subj.getClass() != pred.getClass())
+            return;
+        CompoundTerm sub = (CompoundTerm) subj;
+        CompoundTerm pre = (CompoundTerm) pred;
+        if (sub.size() != pre.size())
+            return;
+        int index = -1;
+        Term t1, t2;
+        for (int i = 0; i < sub.size(); i++) {
+            t1 = sub.componentAt(i);
+            t2 = pre.componentAt(i);
+            if (!t1.equals(t2)) {
+                if (index < 0)
+                    index = i;
+                else
+                    return;
+            }
+        }
+        t1 = sub.componentAt(index);
+        t2 = pre.componentAt(index);
+        Term content;
+        if (switchOrder(sub, (short) index)) {
+        	// System.out.println("Switch order: " + t1.toString() + " " + t2.toString());
+            content = Statement.make(statement, t2, t1, this.memory);
+            // System.out.println(content);
+        }
+        else {
+        	// System.out.println("No switch: " + t1.toString() + " " + t2.toString());
+            content = Statement.make(statement, t1, t2, this.memory);
+            // System.out.println(content);
+        }
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        BudgetValue budget;
+        if (sentence instanceof Question) {
+            budget = this.budgetfunctions.compoundBackward(content);
+        } else {
+            if (sub.size() > 1) {
+                if (sentence.isJudgment())
+                    truth = TruthFunctions.implied(truth);
+                else // Goal
+                    truth = TruthFunctions.implying(truth);
+            }
+            budget = this.budgetfunctions.compoundForward(truth, content);
+        }
+        this.memory.singlePremiseTask(budget, content, truth);
+    }
+    
+    private  boolean switchOrder(CompoundTerm compound, short index) {
+        return ((((compound instanceof DifferenceExt) || (compound instanceof DifferenceInt)) && (index == 1)) ||
+                ((compound instanceof ImageExt) && (index != ((ImageExt) compound).getRelationIndex())) ||
+                ((compound instanceof ImageInt) && (index != ((ImageInt) compound).getRelationIndex())));
+    }
+    
+    /**
+     * {<A --> B>} |- <A --> (B&C)>
+     * @param compound The compound term
+     * @param index The location of the indicated term in the compound
+     * @param statement The premise
+     */
+     void structuralCompose1(CompoundTerm compound, short index, Statement statement) {
+        if (!this.memory.currentTask.getSentence().isJudgment())
+            return;
+        Term component = compound.componentAt(index);
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        Term subj = statement.getSubject();
+        Term pred = statement.getPredicate();
+        if (component.equals(subj)) {
+            if (compound instanceof IntersectionExt)                        // {A --> B, A @ (A&C)} |- (A&C) --> B
+                structuralStatement(compound, pred, TruthFunctions.implying(truth));
+            else if (compound instanceof IntersectionInt)                   // {A --> B, A @ (A|C)} |- (A|C) --> B
+                structuralStatement(compound, pred, TruthFunctions.implied(truth));
+            else if ((compound instanceof DifferenceExt) && (index == 0))   // {A --> B, A @ (A-C)} |- (A-C) --> B
+                structuralStatement(compound, pred, TruthFunctions.implying(truth));
+            else if (compound instanceof DifferenceInt)
+                if (index == 0)                                             // {A --> B, A @ (A~C)} |- (A~C) --> B
+                    structuralStatement(compound, pred, TruthFunctions.implied(truth));
+                else                                                        // {A --> B, A @ (C~A)} |- (C~A) --> B
+                    structuralStatement(compound, pred, TruthFunctions.negImply(truth));
+        } else if (component.equals(pred)) {
+            if (compound instanceof IntersectionExt)                        // {B --> A, A @ (A&C)} |- B --> (A&C)
+                structuralStatement(subj, compound, TruthFunctions.implied(truth));
+            else if (compound instanceof IntersectionInt)                   // {B --> A, A @ (A|C)} |- B --> (A|C)
+                structuralStatement(subj, compound, TruthFunctions.implying(truth));
+            else if (compound instanceof DifferenceExt)
+                if (index == 0)                                             // {B --> A, A @ (A-C)} |- B --> (A-C)
+                    structuralStatement(subj, compound, TruthFunctions.implied(truth));
+                else                                                        // {B --> A, A @ (C-A)} |- B --> (C-A)
+                    structuralStatement(subj, compound, TruthFunctions.negImply(truth));
+            else if ((compound instanceof DifferenceInt) && (index == 0))   // {B --> A, A @ (A~C)} |- B --> (A~C)
+                structuralStatement(subj, compound, TruthFunctions.implying(truth));
+        }
+    }
+    
+    /**
+     * {<(A&C) --> B>} |- <A --> B>
+     * @param compound The compound term
+     * @param index The location of the indicated term in the compound
+     * @param statement The premise
+     * @param side The location of the indicated term in the premise
+     */
+     void structuralDecompose1(CompoundTerm compound, short index, Statement statement, short side) {
+        if (!this.memory.currentTask.getSentence().isJudgment())
+            return;
+        Term component = compound.componentAt(index);
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        Term subj = statement.getSubject();
+        Term pred = statement.getPredicate();
+        if (compound.equals(subj)) {
+            if (compound instanceof IntersectionExt)                        // {(A&C) --> B, A @ (A&C)} |- A --> B
+                structuralStatement(component, pred, TruthFunctions.implied(truth));
+            else if (compound instanceof IntersectionInt)                   // {(A|C) --> B, A @ (A|C)} |- A --> B
+                structuralStatement(component, pred, TruthFunctions.implying(truth));
+            else if ((compound instanceof DifferenceExt) && (index == 0))   // {(A-C) --> B, A @ (A-C)} |- A --> B
+                structuralStatement(component, pred, TruthFunctions.implied(truth));
+            else if (compound instanceof DifferenceInt)
+                if (index == 0)                                             // {(A~C) --> B, A @ (A~C)} |- A --> B
+                    structuralStatement(component, pred, TruthFunctions.implying(truth));
+                else                                                        // {(C~A) --> B, A @ (C~A)} |- A --> B
+                    structuralStatement(component, pred, TruthFunctions.negImply(truth));
+        } else if (compound.equals(pred)) {
+            if (compound instanceof IntersectionExt)                        // {B --> (A&C), A @ (A&C)} |- B --> A
+                structuralStatement(subj, component, TruthFunctions.implying(truth));
+            else if (compound instanceof IntersectionInt)                   // {B --> (A&C), A @ (A&C)} |- B --> A
+                structuralStatement(subj, component, TruthFunctions.implied(truth));
+            else if (compound instanceof DifferenceExt)
+                if (index == 0)                                             // {B --> (A-C), A @ (A-C)} |- B --> A
+                    structuralStatement(subj, component, TruthFunctions.implying(truth));
+                else                                                        // {B --> (C-A), A @ (C-A)} |- B --> A
+                    structuralStatement(subj, component, TruthFunctions.negImply(truth));
+            else if ((compound instanceof DifferenceInt) && (index == 0))   // {B --> (A~C), A @ (A~C)} |- B --> A
+                structuralStatement(subj, component, TruthFunctions.implied(truth));
+        }
+    }
+    
+    /**
+     * Common final operations of the above two methods
+     * @param subject The subject of the new task
+     * @param predicate The predicate of the new task
+     * @param truth The truth value of the new task
+     */
+    private  void structuralStatement(Term subject, Term predicate, TruthValue truth) { // Inheritance only?
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        Term content = Statement.make((Statement) task.getContent(), subject, predicate, this.memory);
+        if (content == null)
+            return;
+        BudgetValue budget = this.budgetfunctions.compoundForward(truth, content);
+//        if (sentence instanceof Question)
+//            budget = this.budgetfunctions.compoundBackward(content);
+//        else
+//            budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.singlePremiseTask(budget, content, truth);
+    }
+    
+    /* -------------------- set transform -------------------- */
+    
+    /**
+     * {<S --> {P}>} |- <S <-> {P}>
+     * @param compound The set compound
+     * @param statement The premise
+     * @param side The location of the indicated term in the premise
+     */
+     void transformSetRelation(CompoundTerm compound, Statement statement, short side) {
+        if (compound.size() > 1)
+            return;
+        if (statement instanceof Inheritance)
+            if (((compound instanceof SetExt) && (side == 0)) || ((compound instanceof SetInt) && (side == 1)))
+                return;
+        Term sub = statement.getSubject();
+        Term pre = statement.getPredicate();
+        Term content;
+        if (statement instanceof Inheritance) {
+            content = Similarity.make(sub, pre, this.memory);
+        } else {
+            if (((compound instanceof SetExt) && (side == 0)) || ((compound instanceof SetInt) && (side == 1)))
+                content = Inheritance.make(pre, sub, this.memory);
+            else
+                content = Inheritance.make(sub, pre, this.memory);
+        }
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        BudgetValue budget;
+        if (sentence instanceof Question)
+            budget = this.budgetfunctions.compoundBackward(content);
+        else
+            budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.singlePremiseTask(budget, content, truth);
+    }
+    
+    /* -------------------- products and images transform -------------------- */
+    
+     void transformProductImage(Inheritance inh, CompoundTerm oldContent, short[] indices, Task task) {
+        Term subject = null;
+        Term predicate = null;
+        short index = indices[indices.length - 1];
+        short side = indices[indices.length - 2];
+        CompoundTerm comp = (CompoundTerm) inh.componentAt(side);
+        if (comp instanceof Product) {
+            if (side == 0) {           // Product as subject
+                subject = comp.componentAt(index);
+                predicate = ImageExt.make((Product) comp, inh.getPredicate(), index, this.memory);
+            } else {
+                subject = ImageInt.make((Product) comp, inh.getSubject(), index, this.memory);
+                predicate = comp.componentAt(index);
+            }
+        } else if ((comp instanceof ImageExt) && (side == 1)) {   // ImageExt as predicate
+            if (index == ((ImageExt) comp).getRelationIndex()) {
+                subject = Product.make(comp, inh.getSubject(), index, this.memory);
+                predicate = comp.componentAt(index);
+            } else {
+                subject = comp.componentAt(index);
+                predicate = ImageExt.make((ImageExt) comp, inh.getSubject(), index, this.memory);
+            }
+        } else if ((comp instanceof ImageInt) && (side == 0)) {   // ImageInt as subject
+            if (index == ((ImageInt) comp).getRelationIndex()) {
+                subject = comp.componentAt(index);
+                predicate = Product.make(comp, inh.getPredicate(), index, this.memory);
+            } else {
+                subject = ImageInt.make((ImageInt) comp, inh.getPredicate(), index, this.memory);
+                predicate = comp.componentAt(index);
+            }
+        } else //        if ((subject == null) || (predicate == null))
+            return;
+        Inheritance newInh = Inheritance.make(subject, predicate, this.memory);
+        Term content = null;
+        if (indices.length == 2)
+            content = newInh;
+        else {
+            ArrayList<Term> componentList;
+            if ((oldContent instanceof Implication) && (oldContent.componentAt(0) instanceof Conjunction)) {
+                componentList = ((CompoundTerm) oldContent.componentAt(0)).cloneComponents();
+                componentList.set(indices[0], newInh);
+                Term newCond = Conjunction.make(componentList, this.memory);
+                content = Implication.make(newCond, ((Statement) oldContent).getPredicate(), this.memory);
+            } else
+                componentList = oldContent.cloneComponents();
+            componentList.set(indices[0], newInh);
+            if (oldContent instanceof Conjunction)
+                content = Conjunction.make(componentList, this.memory);
+            else if ((oldContent instanceof Implication) || (oldContent instanceof Equivalence))
+                content = Statement.make((Statement) oldContent, componentList.get(0), componentList.get(1), this.memory);
+        }
+        if (content == null)
+            return;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        BudgetValue budget;
+        if (sentence instanceof Question)
+            budget = this.budgetfunctions.compoundBackward(content);
+        else
+            budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.singlePremiseTask(budget, content, truth);
+    }
+    
+    /* --------------- Disjunction and Conjunction transform --------------- */
+    
+    /**
+     * {(&&, A, B)} |- A
+     * @param compound The premise
+     * @param component The recognized component in the premise
+     * @param compoundTask Whether the compound comes from the task
+     */
+     void structuralCompound(CompoundTerm compound, Term component, boolean compoundTask) {
+        Term content = (compoundTask ? component : compound);
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        BudgetValue budget;
+        if (sentence instanceof Question) {
+            budget = this.budgetfunctions.compoundBackward(content);
+        } else {
+            if ((sentence.isJudgment()) == (compoundTask == (compound instanceof Conjunction)))
+                truth = TruthFunctions.implying(truth);
+            else
+                truth = TruthFunctions.implied(truth);
+            budget = this.budgetfunctions.compoundForward(sentence.getTruth(), content);
+        }
+        this.memory.singlePremiseTask(budget, content, truth);
+    }
+    
+    /* --------------- Negation related rules --------------- */
+    
+    /**
+     * {A} |- (--, A)
+     * @param content The premise
+     */
+     void transformNegation(Term content) {
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        if (sentence instanceof Judgement)
+            truth = TruthFunctions.negation(truth);
+        BudgetValue budget;
+        if (sentence instanceof Question)
+            budget = this.budgetfunctions.compoundBackward(content);
+        else
+            budget = this.budgetfunctions.compoundForward(truth, content);
+        this.memory.singlePremiseTask(budget, content, truth);
+    }
+    
+    /**
+     * {<A ==> B>} |- <(--B) ==> (--A)>
+     * @param statement The premise
+     */
+     void contraposition(Statement statement) {
+        Term subj = statement.getSubject();
+        Term pred = statement.getPredicate();
+        Term content = Statement.make(statement, Negation.make(pred, this.memory), Negation.make(subj, this.memory), CompoundTerm.temporalReverse(statement.getTemporalOrder()), this.memory);
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        TruthValue truth = sentence.getTruth();
+        BudgetValue budget;
+        if (sentence instanceof Question) {
+            if (content instanceof Implication)
+                budget = this.budgetfunctions.compoundBackwardWeak(content);
+            else
+                budget = this.budgetfunctions.compoundBackward(content);
+        } else {
+            if (content instanceof Implication)
+                truth = TruthFunctions.contraposition(truth);
+            budget = this.budgetfunctions.compoundForward(truth, content);
+        }
+        this.memory.singlePremiseTask(budget, content, truth);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/inference/SyllogisticRules.java b/open-nars/com/googlecode/opennars/inference/SyllogisticRules.java
new file mode 100644
index 0000000..2825835
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/SyllogisticRules.java
@@ -0,0 +1,512 @@
+/*
+ * SyllogisticRules.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.inference;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+
+/**
+ * Syllogisms: Inference rules based on the transitivity of the relation.
+ */
+public class SyllogisticRules {
+    
+	private Memory memory;
+	private BudgetFunctions budgetfunctions;
+	
+	public SyllogisticRules(Memory memory) {
+		this.memory = memory;
+		this.budgetfunctions = new BudgetFunctions(memory);
+	}
+	
+    /* --------------- rules used in both first-order inference and higher-order inference --------------- */
+    
+    /**
+     * {<S ==> M>, <M ==> P>} |- {<S ==> P>, <P ==> S>}
+     * @param term1 Subject of the first new task
+     * @param term2 Predicate of the first new task
+     * @param sentence The first premise
+     * @param belief The second premise
+     */
+    void dedExe(Term term1, Term term2, Sentence sentence, Judgement belief) {
+        if (Statement.invalidStatement(term1, term2))
+            return;
+        CompoundTerm.TemporalOrder order1 = sentence.getContent().getTemporalOrder();
+        CompoundTerm.TemporalOrder order2 = belief.getContent().getTemporalOrder();
+        CompoundTerm.TemporalOrder order = CompoundTerm.temporalInference(order1, order2);
+        if (order == CompoundTerm.TemporalOrder.UNSURE)
+            return;
+        Statement content1 = Statement.make((Statement) sentence.getContent(), term1, term2, order, this.memory);
+        Statement content2 = Statement.make((Statement) sentence.getContent(), term2, term1, CompoundTerm.temporalReverse(order), this.memory);
+        TruthValue value1 = sentence.getTruth();
+        TruthValue value2 = belief.getTruth();
+        TruthValue truth1 = null;
+        TruthValue truth2 = null;
+        BudgetValue budget1, budget2;
+        Task task = this.memory.currentTask;
+        if (sentence instanceof Question) {
+            budget1 = this.budgetfunctions.backwardWeak(value2);
+            budget2 = this.budgetfunctions.backwardWeak(value2);
+        } else {
+            if (sentence instanceof Goal) {
+                truth1 = TruthFunctions.desireWeak(value1, value2);
+                truth2 = TruthFunctions.desireWeak(value1, value2);
+            } else {
+                truth1 = TruthFunctions.deduction(value1, value2);
+                truth2 = TruthFunctions.exemplification(value1, value2);
+            }
+            budget1 = this.budgetfunctions.forward(truth1);
+            budget2 = this.budgetfunctions.forward(truth2);
+        }
+        this.memory.doublePremiseTask(budget1, content1, truth1);
+        this.memory.doublePremiseTask(budget2, content2, truth2);
+    }
+    
+    /**
+     * {<M ==> S>, <M ==> P>} |- {<S ==> P>, <P ==> S>, <S <=> P>}
+     * @param term1 Subject of the first new task
+     * @param term2 Predicate of the first new task
+     * @param sentence The first premise
+     * @param belief The second premise
+     * @param figure Locations of the shared term in premises
+     */
+    void abdIndCom(Term term1, Term term2, Sentence sentence, Judgement belief, int figure) {
+        if (Statement.invalidStatement(term1, term2))
+            return;
+        Statement st1 = (Statement) sentence.getContent();
+        Statement st2 = (Statement) belief.getContent();
+        CompoundTerm.TemporalOrder order1 = st1.getTemporalOrder();
+        CompoundTerm.TemporalOrder order2 = st2.getTemporalOrder();
+        CompoundTerm.TemporalOrder order;
+        if (figure == 11)
+            order = CompoundTerm.temporalInference(order1, CompoundTerm.temporalReverse(order2));
+        else
+            order = CompoundTerm.temporalInference(CompoundTerm.temporalReverse(order1), order2);
+        if (order == CompoundTerm.TemporalOrder.UNSURE)
+            return;
+        Statement statement1 = Statement.make(st1, term1, term2, order, this.memory);
+        Statement statement2 = Statement.make(st1, term2, term1, CompoundTerm.temporalReverse(order), this.memory);
+        Statement statement3 = Statement.makeSym(st1, term1, term2, order, this.memory);
+        TruthValue truth1 = null;
+        TruthValue truth2 = null;
+        TruthValue truth3 = null;
+        BudgetValue budget1, budget2, budget3;
+        TruthValue value1 = sentence.getTruth();
+        TruthValue value2 = belief.getTruth();
+        if (sentence instanceof Question) {
+            budget1 = this.budgetfunctions.backward(value2);
+            budget2 = this.budgetfunctions.backwardWeak(value2);
+            budget3 = this.budgetfunctions.backward(value2);
+        } else {
+            if (sentence instanceof Goal) {
+                truth1 = TruthFunctions.desireStrong(value1, value2);
+                truth2 = TruthFunctions.desireWeak(value2, value1);
+                truth3 = TruthFunctions.desireStrong(value1, value2);
+            } else {
+                truth1 = TruthFunctions.abduction(value1, value2);
+                truth2 = TruthFunctions.abduction(value2, value1);
+                truth3 = TruthFunctions.comparison(value1, value2);
+            }
+            budget1 = this.budgetfunctions.forward(truth1);
+            budget2 = this.budgetfunctions.forward(truth2);
+            budget3 = this.budgetfunctions.forward(truth3);
+        }
+        this.memory.doublePremiseTask(budget1, statement1, truth1);
+        this.memory.doublePremiseTask(budget2, statement2, truth2);
+        this.memory.doublePremiseTask(budget3, statement3, truth3);
+        if (statement1.isConstant()) {
+            this.memory.doublePremiseTask(budget1, introVarInd(statement1, st2, st1, figure), truth1);
+            this.memory.doublePremiseTask(budget2, introVarInd(statement2, st1, st2, figure), truth2);
+            this.memory.doublePremiseTask(budget3, introVarInd(statement3, st1, st2, figure), truth3);
+        }
+    }
+    
+    /**
+     * {<S ==> P>, <M <=> P>} |- <S ==> P>
+     * @param term1 Subject of the new task
+     * @param term2 Predicate of the new task
+     * @param asym The asymmetric premise
+     * @param sym The symmetric premise
+     * @param figure Locations of the shared term in premises
+     */
+    void analogy(Term term1, Term term2, Sentence asym, Sentence sym, int figure) {
+        if (Statement.invalidStatement(term1, term2))
+            return;
+        Statement asymSt = (Statement) asym.getContent();
+        Statement symSt = (Statement) sym.getContent();
+        CompoundTerm.TemporalOrder order1 = asymSt.getTemporalOrder();
+        CompoundTerm.TemporalOrder order2 = symSt.getTemporalOrder();
+        CompoundTerm.TemporalOrder order;
+        switch (figure) {
+            case 11:
+            case 12:
+                order = CompoundTerm.temporalInferenceWithFigure(order2, order1, figure);
+                break;
+            case 21:
+            case 22:
+                order = CompoundTerm.temporalInferenceWithFigure(order1, order2, figure);
+                break;
+            default:
+                return;
+        }
+        if (order == CompoundTerm.TemporalOrder.UNSURE)
+            return;
+        Term content = Statement.make(asymSt, term1, term2, order, this.memory);
+        TruthValue truth = null;
+        BudgetValue budget;
+        Sentence sentence = this.memory.currentTask.getSentence();
+        CompoundTerm taskTerm = (CompoundTerm) sentence.getContent();
+        if (sentence instanceof Question) {
+            if (taskTerm.isCommutative())
+                budget = this.budgetfunctions.backwardWeak(asym.getTruth());
+            else
+                budget = this.budgetfunctions.backward(sym.getTruth());
+        } else {
+            if (sentence instanceof Goal) {
+                if (taskTerm.isCommutative())
+                    truth = TruthFunctions.desireWeak(asym.getTruth(), sym.getTruth());
+                else
+                    truth = TruthFunctions.desireStrong(asym.getTruth(), sym.getTruth());
+            } else
+                truth = TruthFunctions.analogy(asym.getTruth(), sym.getTruth());
+            budget = this.budgetfunctions.forward(truth);
+        }
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+    
+    /**
+     * {<S <=> M>, <M <=> P>} |- <S <=> P>
+     * @param term1 Subject of the new task
+     * @param term2 Predicate of the new task
+     * @param belief The first premise
+     * @param sentence The second premise
+     * @param figure Locations of the shared term in premises
+     */
+    void resemblance(Term term1, Term term2, Judgement belief, Sentence sentence, int figure) {
+        if (Statement.invalidStatement(term1, term2))
+            return;
+        Statement st1 = (Statement) belief.getContent();
+        Statement st2 = (Statement) sentence.getContent();
+        CompoundTerm.TemporalOrder order1 = st1.getTemporalOrder();
+        CompoundTerm.TemporalOrder order2 = st2.getTemporalOrder();
+        CompoundTerm.TemporalOrder order = CompoundTerm.temporalInferenceWithFigure(order1, order2, figure);
+        if (order == CompoundTerm.TemporalOrder.UNSURE)
+            return;
+        Term statement = Statement.make(st1, term1, term2, order, this.memory);
+        TruthValue truth = null;
+        BudgetValue budget;
+        Task task = this.memory.currentTask;
+        if (sentence instanceof Question) {
+            budget = this.budgetfunctions.backward(belief.getTruth());
+        } else {
+            if (sentence instanceof Goal)
+                truth = TruthFunctions.desireStrong(sentence.getTruth(), belief.getTruth());
+            else
+                truth = TruthFunctions.resemblance(belief.getTruth(), sentence.getTruth());
+            budget = this.budgetfunctions.forward(truth);
+        }
+        this.memory.doublePremiseTask(budget, statement, truth);
+    }
+    
+    /* --------------- rules used only in conditional inference --------------- */
+    
+    /**
+     * {<S ==> P>, S} |- P
+     * @param statement The premise statement
+     * @param compound The compound containing the shared component, can be null
+     * @param compoundTask Whether the component comes in the task
+     * @param side The location of the shared term in the statement
+     */
+    void detachment(Statement statement, CompoundTerm compound, boolean compoundTask, int side) {
+        if (!(statement instanceof Implication) && !(statement instanceof Equivalence)) // necessary?
+            return;
+        Sentence sentence = this.memory.currentTask.getSentence();
+        Judgement belief = this.memory.currentBelief;
+        TruthValue value1, value2;
+        if (compoundTask) {
+            value2 = sentence.getTruth();
+            value1 = belief.getTruth();
+        } else {
+            value1 = sentence.getTruth();
+            value2 = belief.getTruth();
+        }
+        TruthValue truth = null;
+        BudgetValue budget;
+        if (sentence instanceof Question) {
+            if (statement instanceof Equivalence)
+                budget = this.budgetfunctions.backward(belief.getTruth());
+            else if (side == 0)
+                budget = this.budgetfunctions.backwardWeak(belief.getTruth());
+            else
+                budget = this.budgetfunctions.backward(belief.getTruth());
+        } else {
+            if (sentence instanceof Goal) {
+                if (statement instanceof Equivalence)
+                    truth = TruthFunctions.desireStrong(value1, value2);
+                else if (side == 0)
+                    truth = TruthFunctions.desireInd(value1, value2);
+                else
+                    truth = TruthFunctions.desireDed(value1, value2);
+            } else {
+                if (statement instanceof Equivalence)
+                    truth = TruthFunctions.analogy(value1, value2);
+                else if (side == 0)
+                    truth = TruthFunctions.deduction(value1, value2);
+                else
+                    truth = TruthFunctions.abduction(value1, value2);
+            }
+            budget = this.budgetfunctions.forward(truth);
+        }
+        Term content = statement.componentAt(1 - side);
+        if (!content.isConstant())
+            return;
+        if ((compound != null) && (compound instanceof Tense)){
+            CompoundTerm.TemporalOrder order1 = compound.getTemporalOrder();
+            CompoundTerm.TemporalOrder order2 = statement.getTemporalOrder();
+            CompoundTerm.TemporalOrder order;
+            if (side == 0)
+                order = CompoundTerm.temporalInference(order1, order2);
+            else
+                order = CompoundTerm.temporalInference(order1, CompoundTerm.temporalReverse(order2));
+            if (order == CompoundTerm.TemporalOrder.UNSURE)
+//                order = order1;
+                return;
+            content = Tense.make(content, order, this.memory);
+        }
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+    
+    /**
+     * {<(&&, S1, S2) ==> P>, <M ==> S1>} |- <(&&, M, S2) ==> P>
+     * @param premise1 The conditional premise
+     * @param index The location of the shared term in the condition of premise1
+     * @param premise2 The premise which, or part of which, appears in the condition of premise1
+     * @param side The location of the shared term in premise2: 0 for subject, 1 for predicate, -1 for the whole term
+     */
+    void conditionalDedInd(Implication premise1, short index, Term premise2, int side) {
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        Judgement belief = this.memory.currentBelief;
+        Conjunction oldCondition = (Conjunction) premise1.getSubject();
+        CompoundTerm.TemporalOrder order1 = premise1.getTemporalOrder();
+        CompoundTerm.TemporalOrder order2 = premise2.getTemporalOrder();
+        boolean deduction = (side != 0);
+        if (!(order1 == order2))                                    // to be refined to cover tense
+            if (!(deduction && ((side == -1) || (index == 0))))     // don't replace middle conditions
+                return;
+        Term newComponent = null;
+        if (side == 0)
+            newComponent = ((Statement) premise2).getPredicate();
+        else if (side == 1)
+            newComponent = ((Statement) premise2).getSubject();
+        Term newCondition = CompoundTerm.replaceComponent(oldCondition, index, newComponent, this.memory);
+        Term content = Statement.make(premise1, newCondition, premise1.getPredicate(), order1, this.memory);
+        if (content == null)
+            return;
+        TruthValue value1 = sentence.getTruth();
+        TruthValue value2 = belief.getTruth();
+        TruthValue truth = null;
+        BudgetValue budget;
+        boolean conditionalTask = (Variable.findSubstitute(Variable.VarType.INDEPENDENT, premise2, belief.getContent()) != null);
+        if (sentence instanceof Question) {
+            budget = this.budgetfunctions.backwardWeak(value2);
+        } else {
+            if (sentence instanceof Goal) {
+                if (conditionalTask)
+                    truth = TruthFunctions.desireWeak(value1, value2);
+                else if (deduction)
+                    truth = TruthFunctions.desireInd(value1, value2);
+                else
+                    truth = TruthFunctions.desireDed(value1, value2);
+                budget = this.budgetfunctions.forward(truth);
+            } else {
+                if (deduction)
+                    truth = TruthFunctions.deduction(value1, value2);
+                else if (conditionalTask)
+                    truth = TruthFunctions.induction(value2, value1);
+                else
+                    truth = TruthFunctions.induction(value1, value2);
+            }
+            budget = this.budgetfunctions.forward(truth);
+        }
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+    
+    /**
+     * {<(&&, S1, S2) ==> P>, <(&&, S1, S3) ==> P>} |- <S2 ==> S3>
+     * @param cond1 The condition of the first premise
+     * @param cond2 The condition of the second premise
+     * @param st1 The first premise
+     * @param st2 The second premise
+     * @return Whether there are derived tasks
+     */
+    boolean conditionalAbd(Term cond1, Term cond2, Statement st1, Statement st2) {
+        if (!(st1 instanceof Implication) || !(st2 instanceof Implication))
+            return false;
+        if (!(cond1 instanceof Conjunction) && !(cond2 instanceof Conjunction))
+            return false;
+        CompoundTerm.TemporalOrder order1 = st1.getTemporalOrder();
+        CompoundTerm.TemporalOrder order2 = st2.getTemporalOrder();
+        if (order1 != CompoundTerm.temporalReverse(order2))
+            return false;
+        Term term1 = null;
+        Term term2 = null;
+        if (cond1 instanceof Conjunction) {
+            term1 = CompoundTerm.reduceComponents((Conjunction) cond1, cond2, this.memory);
+        }
+        if (cond2 instanceof Conjunction) {
+            term2 = CompoundTerm.reduceComponents((Conjunction) cond2, cond1, this.memory);
+        }
+        if ((term1 == null) && (term2 == null))
+            return false;
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        Judgement belief = this.memory.currentBelief;
+        TruthValue value1 = sentence.getTruth();
+        TruthValue value2 = belief.getTruth();
+        boolean keepOrder = (Variable.findSubstitute(Variable.VarType.INDEPENDENT, st1, task.getContent()) != null);
+        Term content;
+        TruthValue truth = null;
+        BudgetValue budget;
+        if (term1 != null) {
+            if (term2 != null)
+                content = Statement.make(st2, term2, term1, order2, this.memory);
+            else
+                content = term1;
+            if (sentence instanceof Question) {
+                budget = this.budgetfunctions.backwardWeak(value2);
+            } else {
+                if (sentence instanceof Goal) {
+                    if (keepOrder)
+                        truth = TruthFunctions.desireDed(value1, value2);
+                    else
+                        truth = TruthFunctions.desireInd(value1, value2);
+                } else
+                    truth = TruthFunctions.abduction(value2, value1);
+                budget = this.budgetfunctions.forward(truth);
+            }
+            this.memory.doublePremiseTask(budget, content, truth);
+        }
+        if (term2 != null) {
+            if (term1 != null)
+                content = Statement.make(st1, term1, term2, order1, this.memory);
+            else
+                content = term2;
+            if (sentence instanceof Question) {
+                budget = this.budgetfunctions.backwardWeak(value2);
+            } else {
+                if (sentence instanceof Goal) {
+                    if (keepOrder)
+                        truth = TruthFunctions.desireDed(value1, value2);
+                    else
+                        truth = TruthFunctions.desireInd(value1, value2);
+                } else
+                    truth = TruthFunctions.abduction(value1, value2);
+                budget = this.budgetfunctions.forward(truth);
+            }
+            this.memory.doublePremiseTask(budget, content, truth);
+        }
+        return true;
+    }
+    
+    /* --------------- rules used for independent variable introduction --------------- */
+    
+    /**
+     * {<C ==> <M --> P>>, <M --> S>} |- <(&&,C,<#x --> S>) ==> <#x --> P>>
+     * @param compound The compound statement: Implication or Conjunction
+     * @param component The component to be used as a premise in internal induction
+     * @param premise The second premise, directly used in internal induction
+     */
+    void introVarIndInner(CompoundTerm compound, Term component, Term premise) {
+        Task task = this.memory.currentTask;
+        Sentence sentence = task.getSentence();
+        if (!sentence.isJudgment())
+            return;
+        if (!(component instanceof Statement))
+            return;
+        if (component.getClass() != premise.getClass())
+            return;
+        Variable v1 = new Variable(Symbols.VARIABLE_TAG + "0");
+        Variable v2 = new Variable(Symbols.VARIABLE_TAG + "0");
+        Statement premise1 = (Statement) premise;
+        Statement premise2 = (Statement) component;
+        CompoundTerm.TemporalOrder order1 = premise1.getTemporalOrder();
+        CompoundTerm.TemporalOrder order2 = premise2.getTemporalOrder();
+        if (order1 != CompoundTerm.temporalReverse(order2))
+            return;
+        int figure;
+        if (premise1.getSubject().equals(premise2.getSubject()))
+            figure = 11;
+        else if (premise1.getPredicate().equals(premise2.getPredicate()))
+            figure = 22;
+        else
+            return;
+        Statement innerContent = introVarInd(null, premise1, premise2, figure);
+        if (innerContent == null)
+            return;
+        Sentence belief = this.memory.currentBelief;
+        Term content;
+        if (compound instanceof Implication) {
+            content = Statement.make((Statement) compound, compound.componentAt(0), innerContent, this.memory);
+        } else if (compound instanceof Conjunction) {
+            content = CompoundTerm.replaceComponent(compound, component, innerContent, this.memory);
+        } else
+            return;
+        TruthValue truth;
+        if (premise.equals(sentence.getContent()))
+            truth = TruthFunctions.abduction(sentence.getTruth(), belief.getTruth());
+        else
+            truth = TruthFunctions.abduction(belief.getTruth(), sentence.getTruth());
+        BudgetValue budget = this.budgetfunctions.forward(truth);
+        this.memory.doublePremiseTask(budget, content, truth);
+    }
+    
+    /**
+     * {<M --> S>, <M --> P>} |- <<#x --> S> ==> <#x --> P>>
+     * @param temp The template for the new task <S --> P>
+     * @param premise1 The first premise <M --> P>
+     * @param premise2 The second premise <M --> P>
+     * @param figure The figure indicating the location of the shared term
+     */
+    private Statement introVarInd(Statement temp, Statement premise1, Statement premise2, int figure) {
+        Statement state1, state2;
+        Variable v1 = new Variable(Symbols.VARIABLE_TAG + "0");
+        Variable v2 = new Variable(Symbols.VARIABLE_TAG + "0");
+        if (figure == 11) {
+            state1 = Statement.make(premise1, v1, premise1.getPredicate(), this.memory);
+            state2 = Statement.make(premise2, v2, premise2.getPredicate(), this.memory);
+        } else {
+            state1 = Statement.make(premise1, premise1.getSubject(), v1, this.memory);
+            state2 = Statement.make(premise2, premise2.getSubject(), v2, this.memory);
+        }
+        Statement content;
+        if ((temp == null) || !temp.isCommutative())
+            content = Implication.make(state1, state2, this.memory);
+        else
+            content = Equivalence.make(state1, state2, this.memory);
+        return content;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/inference/TruthFunctions.java b/open-nars/com/googlecode/opennars/inference/TruthFunctions.java
new file mode 100644
index 0000000..63fe480
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/TruthFunctions.java
@@ -0,0 +1,369 @@
+/*
+ * TruthFunctions.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.inference;
+
+import com.googlecode.opennars.entity.TruthValue;
+
+/**
+ * All truth value functions used in inference rules 
+ */
+public final class TruthFunctions extends UtilityFunctions {
+    
+    /* ----- Single Argument Functions, called in MatchingRules and StructuralRules ----- */
+
+    /**
+     * {A} |- (--A)
+     * @param v1 Truth value of the premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue negation(TruthValue v1) {
+        float f = 1 - v1.getFrequency();
+        float c = v1.getConfidence();
+        return new TruthValue(f, c);
+    }
+    
+    /**
+     * {<A ==> B>} |- <B ==> A>
+     * @param v1 Truth value of the premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue conversion(TruthValue v1) {
+        float f1 = v1.getFrequency();
+        float c1 = v1.getConfidence();
+        float w = and(f1, c1);
+        float c = w2c(w);
+        return new TruthValue(1, c);
+    }
+    
+    /**
+     * {<A ==> B>} |- <(--, B) ==> (--, A)>
+     * @param v1 Truth value of the premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue contraposition(TruthValue v1) {
+        float f1 = v1.getFrequency();
+        float c1 = v1.getConfidence();
+        float w = and(1-f1, c1);
+        float c = w2c(w);
+        return new TruthValue(0, c);
+    }
+    
+    /**
+     * {<A ==> B>, A} |- B
+     * @param v1 Truth value of the premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue implying(TruthValue v1) {
+        float f1 = v1.getFrequency();
+        float c1 = v1.getConfidence();
+        float c = and(f1, c1);
+        return new TruthValue(f1, c);
+    }
+
+    /**
+     * {<A ==> B>, B} |- A
+     * @param v1 Truth value of the premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue implied(TruthValue v1) {
+        float f1 = v1.getFrequency();
+        float c1 = v1.getConfidence();
+        float c = w2c(c1);
+        return new TruthValue(f1, c);
+    }
+    
+    /**
+     * {<A ==> (--, B)>, A} |- B
+     * @param v1 Truth value of the premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue negImply(TruthValue v1) {
+        return negation(implying(v1));
+    }
+    
+    /* -------------------- called in MatchingRules -------------------- */
+    
+    /**
+     * {<S ==> P>, <S ==> P>} |- <S ==> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue revision(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float w1 = c1 / (1 - c1);
+        float w2 = c2 / (1 - c2);
+        float f = (w1 * f1 + w2 * f2) / (w1 + w2);
+        float c = (w1 + w2) / (w1 + w2 + 1);
+        return new TruthValue(f, c);
+    }
+    
+    /* -------------------- called in SyllogisticRules -------------------- */
+    
+    /**
+     * {<S ==> M>, <M ==> P>} |- <S ==> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue deduction(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f = and(f1, f2);
+        float c = and(c1, c2, f);
+        return new TruthValue(f, c);
+    }
+    
+    /**
+     * {<S ==> M>, <P ==> M>} |- <S ==> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue abduction(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float w = and(f2, c1, c2);
+        float c = w2c(w);
+        return new TruthValue(f1, c);
+    }
+    
+    /**
+     * {<M ==> S>, <M ==> P>} |- <S ==> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue induction(TruthValue v1, TruthValue v2) {
+        return abduction(v2, v1);
+    }
+    
+    /**
+     * {<M ==> S>, <P ==> M>} |- <S ==> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue exemplification(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float w = and(f1, f2, c1, c2);
+        float c = w2c(w);
+        return new TruthValue(1, c);
+    }
+    
+    /**
+     * {<M ==> S>, <M ==> P>} |- <S <=> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue comparison(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f0 = or(f1, f2);
+        float f = (f0 == 0) ? 0 : (and(f1, f2) / f0) ;
+        float w = and(f0, c1, c2);
+        float c = w2c(w);
+        return new TruthValue(f, c);
+    }
+    
+    /**
+     * {<S ==> M>, <M <=> P>} |- <S ==> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue analogy(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f = and(f1, f2);
+        float c0 = and(f2, c2);
+        float c = and(c1, c0, c0);
+        return new TruthValue(f, c);
+    }
+    
+    /**
+     * {<S <=> M>, <M <=> P>} |- <S <=> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue resemblance(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f = and(f1, f2);
+        float c = and(c1, c2, or(f1, f2));
+        return new TruthValue(f, c);
+    }
+    
+    // -------------------- desire rules -------------------- //
+    
+    // strong backword inference on goals
+    // called in SyllogisticRules and HighOrderRules
+    static TruthValue desireStrong(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f = and(f1, f2);
+        float c = and(c1, c2, f2);
+        return new TruthValue(f, c);
+    }
+    
+    // weak backword inference on goals
+    // called in SyllogisticRules and HighOrderRules
+    static TruthValue desireWeak(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f = and(f1, f2);
+        float c = and(c1, c2, f2, w2c(1.0f));
+        return new TruthValue(f, c);
+    }
+    
+    // strong backword inference on goals
+    // called in HighOrderRules only
+    static TruthValue desireDed(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f = and(f1, f2);
+        float c = and(f, c1, c2);
+        return new TruthValue(f, c);
+    }
+    
+    // called in HighOrderRules only
+    static TruthValue desireInd(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float w = and(f2, c1, c2);
+        float c = w2c(w);
+        return new TruthValue(f1, c);
+    }
+    
+    /* -------------------- called in CompositionalRules -------------------- */
+    
+    /**
+     * {<M --> S>, <M <-> P>} |- <M --> (S|P)>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue union(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f = or(f1, f2);
+        float c = or(and(f1, c1), and(f2, c2)) + and(1 - f1, 1 - f2, c1, c2);
+        return new TruthValue(f, c);
+    }
+    
+    /**
+     * {<M --> S>, <M <-> P>} |- <M --> (S&P)>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue intersection(TruthValue v1, TruthValue v2) {
+        float f1 = v1.getFrequency();
+        float f2 = v2.getFrequency();
+        float c1 = v1.getConfidence();
+        float c2 = v2.getConfidence();
+        float f = and(f1, f2);
+        float c = or(and(1 - f1, c1), and(1 - f2, c2)) + and(f1, f2, c1, c2);
+        return new TruthValue(f, c);
+    }
+    
+    /**
+     * {<M --> S>, <M <-> P>} |- <M --> (S-P)>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue difference(TruthValue v1, TruthValue v2) {
+        TruthValue v0 = negation(v2);
+        return intersection(v1, v0);
+    }
+    
+    /**
+     * {(||, A, B), (--, B)} |- A
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue reduceDisjunction(TruthValue v1, TruthValue v2) {
+        TruthValue v0 = intersection(v1, negation(v2));
+        return implying(v0);
+    }
+    
+    /**
+     * {(--, (&&, A, B)), B} |- (--, A)
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue reduceConjunction(TruthValue v1, TruthValue v2) {
+        TruthValue v0 = intersection(negation(v1), v2);
+        return negation(implying(v0));
+    }
+    
+    /**
+     * {(--, (&&, A, (--, B))), (--, B)} |- (--, A)
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue reduceConjunctionNeg(TruthValue v1, TruthValue v2) {
+        return reduceConjunction(v1, negation(v2));
+    }
+    
+    /**
+     * {(&&, <#x() ==> M>, <#x() ==> P>), S ==> M} |- <S ==> P>
+     * @param v1 Truth value of the first premise
+     * @param v2 Truth value of the second premise
+     * @return Truth value of the conclusion
+     */
+    static TruthValue existAnalogy(TruthValue v1, TruthValue v2) {
+        return abduction(v1, v2);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/inference/UtilityFunctions.java b/open-nars/com/googlecode/opennars/inference/UtilityFunctions.java
new file mode 100644
index 0000000..ef3075a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/UtilityFunctions.java
@@ -0,0 +1,58 @@
+/*
+ * UtilityFunctions.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.inference;
+
+import com.googlecode.opennars.main.Parameters;
+
+/**
+ * Common functions on real numbers in [0,1].
+ */
+public class UtilityFunctions {
+
+    // arithmetic average
+    public static float aveAri(float... arr) {
+        float sum = 0;
+        for(int i=0; i<arr.length; i++)
+            sum += arr[i];
+        return sum / arr.length;
+    }
+
+    public static float or(float... arr) {
+        float product = 1;
+        for(int i=0; i<arr.length; i++)
+            product *= (1 - arr[i]);
+        return 1 - product;
+    }
+    
+    public static float and(float... arr) {
+        float product = 1;
+        for(int i=0; i<arr.length; i++)
+            product *= arr[i];
+        return product;
+    }
+    
+    // weight to confidence
+    public static float w2c(float v) {
+        return v / (v + Parameters.NEAR_FUTURE);
+    }    
+}
+
diff --git a/open-nars/com/googlecode/opennars/inference/package.html b/open-nars/com/googlecode/opennars/inference/package.html
new file mode 100644
index 0000000..95e3f32
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/inference/package.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<body bgcolor="white">
+
+The inference rules and control functions
+
+<h2>Package Specification</h2>
+
+Every task is processed in two stages:
+<ol>
+<li>Direct processing by matching, in the concept corresponding to the content, in one step. It happens when the task is inserted into memory.</li>
+<li>Indirect processing by reasoning, in related concepts and unlimited steps. It happens in each inference cycle.</li>
+</ol>
+The transmission from (1) to (2) corresponds to "decision making".
+<p>
+Inference between premises with no shared term can only happen in task buffer, between tasks based on common evidence.
+<p>
+In matching, the new task is compared with all existing direct Tasks in that Concept, to carry out:
+<ul>
+<li>revision: between judgments on non-overlapping evidence</li>
+<li>update: between judgments</li>
+<li>satisfy: between a Judgment and a Question/Goal</li>
+<li>merge: between items of the same type and base</li>
+</ul>
+<p>
+In reasoning, there are two basic types:
+<ol>
+<li>Between a Task and a TermLink (syntatic information)</li>
+<li>Between a Task and a Belief obtained by following a TermLink (semantic information).</li>
+</ol>
+In each case, there may be multiple applicable rules, which will be applied in parallel. For each rule, each conclusion is formed in three stages, to determine (1) the content (as a Term), (2) the truth-value or desire-value, and (3) the budget-value, in that order.
+<p>
+In the system, forward inference (the task is a Judgment) and backward inference (the task is a Question or Goal) are mostly isomorphic to each other, so that the inference rules produce clonclusions with the same content for different types of tasks. However, there are exceptions. For example, backward inference does not generate more complex terms.
+</body>
+</html>
diff --git a/open-nars/com/googlecode/opennars/language/CompoundTerm.java b/open-nars/com/googlecode/opennars/language/CompoundTerm.java
new file mode 100644
index 0000000..0aac00e
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/CompoundTerm.java
@@ -0,0 +1,638 @@
+/*
+ * CompoundTerm.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A Term with internal structure
+ * <p>
+ * Formed by a term operator with one or more component Terms.
+ * <p>
+ * This abstract class contains default methods for all CompoundTerms.
+ */
+public abstract class CompoundTerm extends Term {
+    
+    /**
+     * list of (direct) components
+     */
+    protected ArrayList<Term> components;
+    
+    /**
+     * list of open variables in the compound
+     */
+    protected ArrayList<Variable> openVariables;    // always necessary?
+    
+    /**
+     * list of closed variables in the compound
+     */
+    protected ArrayList<Variable> closedVariables;    // remove???
+    
+    /**
+     * syntactic complexity of the compound, which is the sum of those of its components plus 1
+     */
+    protected short complexity;
+    
+    
+    // abstract methods
+    public abstract Object clone();
+    public abstract String operator();
+    
+    /* ----- object builders, called from subclasses ----- */
+    
+    /**
+     * default constructor
+     */
+    public CompoundTerm() {}
+    
+    /**
+     * constructor called from subclasses constructors to clone the fields
+     */
+    protected CompoundTerm(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        name = n;
+        components = cs;
+        openVariables = open;
+        closedVariables = closed;
+        complexity = i;
+    }
+    
+    /**
+     * constructor called from subclasses constructors to initialize the fields
+     */
+    protected CompoundTerm(String n, ArrayList<Term> arg) {
+        components = arg;
+        calcComplexity();
+        markVariables();    // set in components, not in this
+        name = makeName();
+    }
+    
+    /**
+     * the complexity of the term is the sum of those of the components plus 1
+     */
+    private void calcComplexity() {
+        Term t;
+        complexity = 1;
+        for (int i = 0; i < components.size(); i++) {
+            t = components.get(i);
+            complexity += t.getComplexity();
+        }
+    }
+    
+    /**
+     * check CompoundTerm operator symbol
+     * @return if the given String is an operator symbol
+     * @param s The String to be checked
+     */
+    public static boolean isOperator(String s, Memory memory) {
+        if (s.length() == 1)
+            return (s.equals(Symbols.INTERSECTION_EXT_OPERATOR) ||
+                    s.equals(Symbols.INTERSECTION_INT_OPERATOR) ||
+                    s.equals(Symbols.DIFFERENCE_EXT_OPERATOR) ||
+                    s.equals(Symbols.DIFFERENCE_INT_OPERATOR) ||
+                    s.equals(Symbols.PRODUCT_OPERATOR) ||
+                    s.equals(Symbols.IMAGE_EXT_OPERATOR) ||
+                    s.equals(Symbols.IMAGE_INT_OPERATOR));
+        if (s.length() == 2)
+            return (s.equals(Symbols.NEGATION_OPERATOR) ||
+                    s.equals(Symbols.DISJUNCTION_OPERATOR) ||
+                    s.equals(Symbols.CONJUNCTION_OPERATOR) ||
+                    s.equals(Symbols.SEQUENCE_OPERATOR) ||
+                    s.equals(Symbols.PARALLEL_OPERATOR) ||
+                    s.equals(Symbols.PAST_OPERATOR) ||
+                    s.equals(Symbols.PRESENT_OPERATOR) ||
+                    s.equals(Symbols.FUTURE_OPERATOR));
+        return isBuiltInOperator(s, memory); // s.length() > 2
+    }
+        
+    public static Term make(String op, ArrayList arg, Memory memory) {
+        if (op.length() == 1) {
+            if (op.equals(Symbols.INTERSECTION_EXT_OPERATOR))
+                return IntersectionExt.make(arg, memory);
+            if (op.equals(Symbols.INTERSECTION_INT_OPERATOR))
+                return IntersectionInt.make(arg, memory);
+            if (op.equals(Symbols.DIFFERENCE_EXT_OPERATOR))
+                return DifferenceExt.make(arg, memory);
+            if (op.equals(Symbols.DIFFERENCE_INT_OPERATOR))
+                return DifferenceInt.make(arg, memory);
+            if (op.equals(Symbols.PRODUCT_OPERATOR))
+                return Product.make(arg, memory);
+            if (op.equals(Symbols.IMAGE_EXT_OPERATOR))
+                return ImageExt.make(arg, memory);
+            if (op.equals(Symbols.IMAGE_INT_OPERATOR))
+                return ImageInt.make(arg, memory);
+        }
+        if (op.length() == 2) {
+            if (op.equals(Symbols.NEGATION_OPERATOR))
+                return Negation.make(arg, memory);
+            if (op.equals(Symbols.DISJUNCTION_OPERATOR))
+                return Disjunction.make(arg, memory);
+            if (op.equals(Symbols.CONJUNCTION_OPERATOR))
+                return Conjunction.make(arg, memory);
+            if (op.equals(Symbols.SEQUENCE_OPERATOR))
+                return ConjunctionSequence.make(arg, memory);
+            if (op.equals(Symbols.PARALLEL_OPERATOR))
+                return ConjunctionSequence.make(arg, memory);
+            if (op.equals(Symbols.FUTURE_OPERATOR))
+                return TenseFuture.make(arg, memory);
+            if (op.equals(Symbols.PRESENT_OPERATOR))
+                return TensePresent.make(arg, memory);
+            if (op.equals(Symbols.PAST_OPERATOR))
+                return TensePast.make(arg, memory);
+        }
+        if (isBuiltInOperator(op, memory)) {
+            // t = Operator.make(op, arg);
+            Term sub = Product.make(arg, memory);
+            Term pre = memory.nameToOperator(op);
+            return Inheritance.make(sub, pre, memory);
+        }
+        return null;
+    }
+
+    /**
+     * check built-in operator name
+     * @return if the given String is an operator name
+     * @param s The String to be checked
+     */
+    private static boolean isBuiltInOperator(String s, Memory memory) {
+        return (s.charAt(0) == Symbols.OPERATOR_TAG) && (memory.nameToOperator(s) != null);
+    }
+    
+    public static Term make(CompoundTerm compound, ArrayList<Term> components, Memory memory) {
+        if (compound instanceof SetExt)
+            return SetExt.make(components, memory);
+        if (compound instanceof SetInt)
+            return SetInt.make(components, memory);
+        if (compound instanceof IntersectionExt)
+            return IntersectionExt.make(components, memory);
+        if (compound instanceof IntersectionInt)
+            return IntersectionInt.make(components, memory);
+        if (compound instanceof DifferenceExt)
+            return DifferenceExt.make(components, memory);
+        if (compound instanceof DifferenceInt)
+            return DifferenceInt.make(components, memory);
+        if (compound instanceof Product)
+            return Product.make(components, memory);
+        if (compound instanceof ImageExt)
+            return ImageExt.make(components, ((ImageExt) compound).getRelationIndex(), memory);
+        if (compound instanceof ImageInt)
+            return ImageInt.make(components, ((ImageInt) compound).getRelationIndex(), memory);
+        if (compound instanceof Disjunction)
+            return Disjunction.make(components, memory);
+        if (compound instanceof ConjunctionSequence)
+            return ConjunctionSequence.make(components, memory);
+        if (compound instanceof ConjunctionParallel)
+            return ConjunctionParallel.make(components, memory);
+        if (compound instanceof Conjunction)
+            return Conjunction.make(components, memory);
+        return null;
+    }
+    
+    /* ----- utilities for name ----- */
+    
+    /**
+     * default method to make the name of the current term from existing fields
+     * @return the name of the term
+     */
+    protected String makeName() {
+        return makeCompoundName(operator(), components);
+    }
+    
+    /**
+     * default method to make the name of a compound term from given fields
+     * @param op the term operator
+     * @param arg the list of components
+     * @return the name of the term
+     */
+    protected static String makeCompoundName(String op, ArrayList<Term> arg) {
+        StringBuffer name = new StringBuffer();
+        name.append(Symbols.COMPOUND_TERM_OPENER);      // also show closed variables???
+        name.append(op);
+        for (int i = 0; i < arg.size(); i++) {
+            name.append(Symbols.ARGUMENT_SEPARATOR);
+            name.append(arg.get(i).getName());
+        }
+        name.append(Symbols.COMPOUND_TERM_CLOSER);
+        return name.toString();
+    }
+    
+    /**
+     * make the name of an ExtensionSet or IntensionSet
+     * @param opener the set opener
+     * @param closer the set closer
+     * @param arg the list of components
+     * @return the name of the term
+     */
+    protected static String makeSetName(char opener, ArrayList<Term> arg, char closer) {
+        StringBuffer name = new StringBuffer();
+        name.append(opener);
+        name.append(arg.get(0).toString());
+        for (int i = 1; i < arg.size(); i++) {
+            name.append(Symbols.ARGUMENT_SEPARATOR);
+            name.append(arg.get(i).getName());
+        }
+        name.append(closer);
+        return name.toString();
+    }
+    
+    /**
+     * default method to make the name of an image term from given fields
+     * @param op the term operator
+     * @param arg the list of components
+     * @param relationIndex the location of the place holder
+     * @return the name of the term
+     */
+    protected static String makeImageName(String op, ArrayList<Term> arg, int relationIndex) {
+        StringBuffer name = new StringBuffer();
+        name.append(Symbols.COMPOUND_TERM_OPENER);
+        name.append(op);
+        name.append(Symbols.ARGUMENT_SEPARATOR);
+        name.append(arg.get(relationIndex).getName());
+        for (int i = 0; i < arg.size(); i++) {
+            name.append(Symbols.ARGUMENT_SEPARATOR);
+            if (i == relationIndex)
+                name.append(Symbols.IMAGE_PLACE_HOLDER);
+            else
+                name.append(arg.get(i).getName());
+        }
+        name.append(Symbols.COMPOUND_TERM_CLOSER);
+        return name.toString();
+    }
+    
+    /**
+     * skip all variable names to produce stable sorting order among components, not for display
+     * @return the constant part of the term name
+     */
+    public String getConstantName() {
+        StringBuffer s = new StringBuffer();
+        s.append(Symbols.COMPOUND_TERM_OPENER);
+        s.append(operator());
+        s.append(Symbols.ARGUMENT_SEPARATOR);
+        for (int i = 0; i < components.size(); i++) {
+            s.append(components.get(i).getConstantName());
+            s.append(Symbols.ARGUMENT_SEPARATOR);
+        }
+        s.append(Symbols.COMPOUND_TERM_CLOSER);
+        return s.toString();
+    }
+    
+    /* ----- utilities for other fields ----- */
+    
+    /**
+     * report the term's syntactic complexity
+     * @return the comlexity value
+     */
+    public int getComplexity() {
+        return complexity;
+    }
+    
+    /**
+     * check if the term contains free variable
+     * @return if the term is a constant
+     */
+    public boolean isConstant() {
+        return (openVariables == null);
+    }
+    
+    /**
+     * check if the order of the components matters
+     * <p>
+     * commutative CompoundTerms: Sets, Intersections;
+     * communative Statements: Similarity, Equivalence;
+     * communative CompoundStatements: Disjunction, Conjunction
+     * @return if the term is a communitive
+     */
+    public boolean isCommutative() {
+        return false;
+    }
+        
+    /**
+     * build a component list from two terms
+     * @param t1 the first component
+     * @param t2 the second component
+     * @return the component list
+     */
+    protected static ArrayList<Term> argumentsToList(Term t1, Term t2) {
+        ArrayList<Term> list = new ArrayList<Term>(2);
+        list.add(t1);
+        list.add(t2);
+        return list;
+    }
+    
+    /* ----- extend Collection methods to component list ----- */
+    
+    /**
+     * get the number of components
+     * @return the size of the component list
+     */
+    public int size() {
+        return components.size();
+    }
+    
+    /**
+     * get a component by index
+     * @param i index of the component
+     * @return the component
+     */
+    public Term componentAt(int i) {
+        return components.get(i);
+    }
+    
+    public ArrayList<Term> getComponents() {
+        return components;
+    }
+    
+    public ArrayList<Term> cloneComponents() {
+        return (ArrayList<Term>) cloneList(components);
+    }
+    
+    /**
+     * deep clone an array list
+     * @return an identical and separate copy of the list
+     */
+    public static ArrayList cloneList(ArrayList original) {
+        if (original == null)
+            return null;
+        ArrayList arr = new ArrayList(original.size());
+        for (int i = 0; i < original.size(); i++)
+            arr.add(((Term) original.get(i)).clone());
+        return arr;
+    }
+    
+    public boolean containComponent(Term t) {
+        return components.contains(t);
+    }
+    
+    public boolean containAllComponents(Term t) {
+        if (getClass() == t.getClass())
+            return components.containsAll(((CompoundTerm) t).getComponents());
+        else
+            return components.contains(t);
+    }
+    
+    /* ----- clone/modify methods ----- */
+    
+    public static Term reduceComponents(CompoundTerm t1, Term t2, Memory memory) {
+        boolean done;
+        ArrayList<Term> list = t1.cloneComponents();
+        if (t1.getClass() == t2.getClass())
+            done = list.removeAll(((CompoundTerm) t2).getComponents());
+        else
+            done = list.remove(t2);
+        return (done ? make(t1, list, memory) : null);
+    }
+
+    public static Term replaceComponent(CompoundTerm compound, int index, Term t, Memory memory) {
+        ArrayList<Term> list = compound.cloneComponents();
+        if (t == null)
+            list.remove(index);
+        else if (compound.getClass() != t.getClass())
+            list.set(index, t);
+        else {
+            ArrayList<Term> list2 = ((CompoundTerm)t).cloneComponents();
+            for (int i = 0; i < list2.size(); i++)
+                list.add(index + i, list2.get(i));
+        }
+        if (compound.isCommutative())
+            Collections.sort(list);
+        return make(compound, list, memory);
+    }
+
+    public static Term replaceComponent(CompoundTerm compound, Term oldComponent, Term newComponent, Memory memory) {
+        ArrayList<Term> list = compound.cloneComponents();
+        int index = list.indexOf(oldComponent);
+        list.remove(index);
+        if (compound.getClass() != newComponent.getClass())
+            list.add(index, newComponent);
+        else {
+            ArrayList<Term> list2 = ((CompoundTerm)newComponent).cloneComponents();
+            for (int i = 0; i < list2.size(); i++)
+                list.add(index + i, list2.get(i));
+        }
+        if (compound.isCommutative())
+            Collections.sort(list);
+        return make(compound, list, memory);
+    }
+   
+    /* ----- variable-related utilities ----- */
+    
+    /**
+     * get the OpenVariables list
+     * @return the open variables list
+     */
+    public ArrayList<Variable> getOpenVariables() {
+        return openVariables;
+    }
+    
+    /**
+     * register open and closed variables in a CompoundTerm
+     * <p>
+     * an open variable only appears in one components, while a closed variable appears in multiple components
+     */
+    private void markVariables() {  // not recursive
+        openVariables = new ArrayList<Variable>();
+        ArrayList<Variable> closedVariables = new ArrayList<Variable>();  // local variable
+        ArrayList<Variable> list;
+        for (Term term : components) {
+            if ((term instanceof Variable) && (((Variable) term).getType() != Variable.VarType.ANONYMOUS)) {
+                openVariables.add((Variable) term);
+            } else if (term instanceof CompoundTerm) {
+                list = ((CompoundTerm) term).getOpenVariables();
+                if (list != null) {
+                    for (Variable var : list) {
+                        if (var.getType() == Variable.VarType.QUERY)
+                            openVariables.add(var);
+                        else {
+                            int i = openVariables.indexOf(var);
+                            if (i >= 0) {           // assume a (independent/dependent) variable appears exactly twice
+                                var.setScope(this);
+                                openVariables.get(i).setScope(this);
+                                openVariables.remove(i);
+                                closedVariables.add(var);
+                            } else
+                                openVariables.add(var);
+                        }
+                    }
+                }
+            }
+        }
+        if (openVariables.size() == 0) // {
+            openVariables = null;
+    }
+    
+    // only called from Sentence
+    public void renameVariables() {
+        renameVariables(new HashMap<String, String>());
+    }
+    
+    /**
+     * Recursively rename variables by their appearing order in the CompoundTerm
+     * <p>
+     * Since each occurance of a variable is processed exactly ones, there will be no confusion between new names and old names.
+     * @param varMap the mapping built so far
+     */
+    protected void renameVariables(HashMap<String, String> varMap) {
+        String oldName, newName;
+        for (Term t : components) {
+            if ((t instanceof Variable) && (((Variable) t).getType() != Variable.VarType.ANONYMOUS)) {
+                oldName = ((Variable) t).getSimpleName();
+                newName = varMap.get(oldName);
+                if (newName == null) {
+                    newName = makeVarName(varMap.size(), (Variable) t);
+                    varMap.put(oldName, newName);
+                }
+                ((Variable) t).setName(newName);
+//            } else if ((t instanceof CompoundTerm) && !(t.isConstant())) {
+            } else if (t instanceof CompoundTerm) {
+                ((CompoundTerm) t).renameVariables(varMap);
+            }
+        }
+        name = makeName();     // type-specific
+    }
+    
+    /**
+     * sequentially generate new variable names
+     * @param size the current size of the variable list
+     * @param v the variable to be renamed
+     * @return a new variable name
+     */
+    private String makeVarName(int size, Variable v) {
+        StringBuffer s = new StringBuffer();
+        Variable.VarType type = v.getType();
+        if (type == Variable.VarType.QUERY)
+            s.append(Symbols.QUERY_VARIABLE_TAG);
+        else
+            s.append(Symbols.VARIABLE_TAG);
+        s.append(size + 1);
+        return s.toString();
+    }
+    
+    public void substituteComponent(HashMap<String,Term> subs, boolean first) {
+        Term t1, t2;
+        String varName;
+        for (int i = 0; i < size(); i++) {
+            t1 = componentAt(i);
+            if (t1 instanceof Variable) {                  // simple Variable
+                varName = ((Variable) t1).getVarName(first);  // name of the variable used in the mapping
+                t2 = subs.get(varName);                       // new Term if exist
+                if (t2 != null) {
+                    components.set(i, t2);
+                }
+            } else if (t1 instanceof CompoundTerm) {              // compound
+                ((CompoundTerm) t1).substituteComponent(subs, first);   // apply substitute to a clone
+            }
+        }
+        markVariables();        // variable status may be changed, so need to re-do this
+        name = makeName();
+    }
+    
+    /* ----- link CompoundTerm and its components ----- */
+    
+    /**
+     * build CompositionalLinks to constant components and subcomponents
+     * <p>
+     * The compound type determines the link type; the component type determines whether to build the link.
+     */
+    public ArrayList<TermLink> prepareComponentLinks(Memory memory) {
+        ArrayList<TermLink> componentLinks = new ArrayList<TermLink>();
+        short type = (this instanceof Statement) ? TermLink.COMPOUND_STATEMENT : TermLink.COMPOUND;   // default
+        prepareComponentLinks(componentLinks, type, this, memory);
+        return componentLinks;
+    }
+    
+    protected void prepareComponentLinks(ArrayList<TermLink> componentLinks, short type, CompoundTerm term, Memory memory) {
+        Term t1, t2, t3;
+        for (int i = 0; i < term.size(); i++) {     // first level components
+            t1 = term.componentAt(i);
+            if (t1.isConstant())                                            // first level
+                componentLinks.add(new TermLink(t1, type, i, memory));
+            if ((this instanceof Implication) && (i == 0) && (t1 instanceof Conjunction)) {
+                ((CompoundTerm) t1).prepareComponentLinks(componentLinks, TermLink.COMPOUND_CONDITION, (CompoundTerm) t1, memory);
+            } else if (t1 instanceof CompoundTerm) {
+                for (int j = 0; j < ((CompoundTerm) t1).size(); j++) {
+                    t2 = ((CompoundTerm) t1).componentAt(j);
+                    if (t2.isConstant()) {                                  // second level
+                        if ((t1 instanceof Product) || (t1 instanceof ImageExt) || (t1 instanceof ImageInt))
+                            componentLinks.add(new TermLink(t2, TermLink.TRANSFORM, i, j, memory));
+                        else
+                            componentLinks.add(new TermLink(t2, type, i, j, memory));
+                    }
+                    if ((t2 instanceof Product) || (t2 instanceof ImageExt) || (t2 instanceof ImageInt)) {
+                        for (int k = 0; k < ((CompoundTerm) t2).size(); k++) {
+                            t3 = ((CompoundTerm) t2).componentAt(k);
+                            if (t3.isConstant()) {                           // third level
+                                componentLinks.add(new TermLink(t3, TermLink.TRANSFORM, i, j, k, memory));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+    
+    /* ---------- temporal order among components ---------- */
+    
+    public enum TemporalOrder { BEFORE, WHEN, AFTER, NONE, UNSURE }
+    
+    public static TemporalOrder temporalInference(TemporalOrder t1, TemporalOrder t2) {
+        if ((t1 == TemporalOrder.UNSURE) || (t2 == TemporalOrder.UNSURE))
+            return TemporalOrder.UNSURE;
+        if (t1 == TemporalOrder.NONE)
+            return t2;
+        if (t2 == TemporalOrder.NONE)
+            return t1;
+        if (t1 == TemporalOrder.WHEN)
+            return t2;
+        if (t2 == TemporalOrder.WHEN)
+            return t1;
+        if (t1 == t2)
+            return t1;
+        return TemporalOrder.UNSURE;
+    }
+
+    public static TemporalOrder temporalReverse(TemporalOrder t1) {
+        if (t1 == TemporalOrder.BEFORE)
+            return TemporalOrder.AFTER;
+        if (t1 == TemporalOrder.AFTER)
+            return TemporalOrder.BEFORE;
+        return t1;
+    } 
+    
+    public static TemporalOrder temporalInferenceWithFigure(TemporalOrder order1, TemporalOrder order2, int figure) {
+        switch (figure) {
+        case 11:
+            return temporalInference(temporalReverse(order1), order2);
+        case 12:
+            return temporalInference(temporalReverse(order1), temporalReverse(order2));
+        case 21:
+            return temporalInference(order1, order2);
+        case 22:
+            return temporalInference(order1, temporalReverse(order2));
+        default:
+            return TemporalOrder.UNSURE;
+        }
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Conjunction.java b/open-nars/com/googlecode/opennars/language/Conjunction.java
new file mode 100644
index 0000000..398cf54
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Conjunction.java
@@ -0,0 +1,133 @@
+/*
+ * Conjunction.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.inference.*;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * Conjunction of statements
+ */
+public class Conjunction extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    protected Conjunction(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    protected Conjunction(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Conjunction
+     */
+    public Object clone() {
+        return new Conjunction(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param term1 The first compoment
+     * @param term2 The second compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term term1, Term term2, Memory memory) {
+        TreeSet set;
+        if (term1 instanceof Conjunction) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            if (term2 instanceof Conjunction)
+                set.addAll(((CompoundTerm) term2).cloneComponents());   // (&,(&,P,Q),(&,R,S)) = (&,P,Q,R,S)
+            else
+                set.add((Term) term2.clone());                          // (&,(&,P,Q),R) = (&,P,Q,R)
+        } else if (term2 instanceof Conjunction) {
+            set = new TreeSet(((CompoundTerm) term2).cloneComponents()); 
+            set.add((Term) term1.clone());                              // (&,R,(&,P,Q)) = (&,P,Q,R)
+        } else {
+            set = new TreeSet();
+            set.add(term1);         // valid solution???
+            set.add(term2);
+//            set.add((Term) term1.clone());
+//            set.add((Term) term2.clone());
+        }
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new compound from a list of components. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList the list of arguments
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>(argList); // sort/merge arguments
+        return make(set, memory);
+    }
+
+    /**
+     * Try to make a new compound from a set of components. Called by the public make methods.
+     * @param set a set of Term as compoments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(TreeSet<Term> set, Memory memory) {
+        if (set.isEmpty())
+            return null;                         // special case: no component
+        if (set.size() == 1)
+            return set.first();                         // special case: single component
+        ArrayList<Term> argument = new ArrayList<Term>(set);
+        String name = makeCompoundName(Symbols.CONJUNCTION_OPERATOR, argument);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new Conjunction(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.CONJUNCTION_OPERATOR;
+    }
+    
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return true;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/ConjunctionParallel.java b/open-nars/com/googlecode/opennars/language/ConjunctionParallel.java
new file mode 100644
index 0000000..1af0468
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/ConjunctionParallel.java
@@ -0,0 +1,127 @@
+/*
+ * ConjunctionParallel.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.inference.*;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * A parallel conjunction of Statements.
+ */
+public class ConjunctionParallel extends Conjunction {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    protected ConjunctionParallel(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    protected ConjunctionParallel(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Conjunction
+     */
+    public Object clone() {
+        return new ConjunctionParallel(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param term1 The first compoment
+     * @param term2 The second compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term term1, Term term2, Memory memory) {
+        TreeSet set;
+        if (term1 instanceof ConjunctionParallel) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            if (term2 instanceof ConjunctionParallel)
+                set.addAll(((CompoundTerm) term2).cloneComponents());   // (&,(&,P,Q),(&,R,S)) = (&,P,Q,R,S)
+            else
+                set.add((Term) term2.clone());                          // (&,(&,P,Q),R) = (&,P,Q,R)
+        } else if (term2 instanceof ConjunctionParallel) {
+            set = new TreeSet(((CompoundTerm) term2).cloneComponents()); 
+            set.add((Term) term1.clone());                              // (&,R,(&,P,Q)) = (&,P,Q,R)
+        } else {
+            set = new TreeSet();
+            set.add(term1);         // valid solution???
+            set.add(term2);
+        }
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new compound from a list of components. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList the list of arguments
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>(argList); // sort/merge arguments
+        return make(set, memory);
+    }
+
+    /**
+     * Try to make a new compound from a set of components. Called by the public make methods.
+     * @param set a set of Term as compoments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(TreeSet<Term> set, Memory memory) {
+        if (set.isEmpty())
+            return null;                         // special case: no component
+        if (set.size() == 1)
+            return set.first();                         // special case: single component
+        ArrayList<Term> argument = new ArrayList<Term>(set);
+        String name = makeCompoundName(Symbols.CONJUNCTION_OPERATOR, argument);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new ConjunctionParallel(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.PARALLEL_OPERATOR;
+    }
+
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.WHEN;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/ConjunctionSequence.java b/open-nars/com/googlecode/opennars/language/ConjunctionSequence.java
new file mode 100644
index 0000000..7b971e4
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/ConjunctionSequence.java
@@ -0,0 +1,97 @@
+/*
+ * ConjunctionSequence.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.inference.*;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * A sequential conjunction of Statements.
+ */
+public class ConjunctionSequence extends Conjunction {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private ConjunctionSequence(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private ConjunctionSequence(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Conjunction
+     */
+    public Object clone() {
+        return new ConjunctionSequence(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new compound from a list of components. Called by StringParser.
+     * @param argument the list of arguments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(ArrayList<Term> argument, Memory memory) {
+        if (argument.size() == 1)
+            return argument.get(0);
+        String name = makeCompoundName(Symbols.PRODUCT_OPERATOR, argument);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new ConjunctionSequence(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.SEQUENCE_OPERATOR;
+    }
+    
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return false;
+    }
+
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.AFTER;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/DifferenceExt.java b/open-nars/com/googlecode/opennars/language/DifferenceExt.java
new file mode 100644
index 0000000..59fecd6
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/DifferenceExt.java
@@ -0,0 +1,105 @@
+/*
+ * DifferenceExt.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A compound term whose extension is the difference of the extensions of its components
+ */
+public class DifferenceExt extends CompoundTerm {
+
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private DifferenceExt(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private DifferenceExt(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a DifferenceExt
+     */
+    public Object clone() {
+        return new DifferenceExt(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new DifferenceExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList The list of components
+     */     
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        if (argList.size() == 1)    // special case from CompoundTerm.reduceComponent
+            return argList.get(0);
+        if (argList.size() != 2)
+            return null;
+        String name = makeCompoundName(Symbols.DIFFERENCE_EXT_OPERATOR, argList);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new DifferenceExt(name, argList);
+    }
+
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param t1 The first compoment
+     * @param t2 The second compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term t1, Term t2, Memory memory) {
+        if (t1.equals(t2))
+            return null;
+        if ((t1 instanceof SetExt) && (t2 instanceof SetExt)) {
+            TreeSet set = new TreeSet(((CompoundTerm) t1).cloneComponents());
+            set.removeAll(((CompoundTerm) t2).cloneComponents());           // set difference
+            return SetExt.make(set, memory);
+        }
+        ArrayList<Term> list = argumentsToList(t1, t2);
+        return make(list, memory);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.DIFFERENCE_EXT_OPERATOR;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/DifferenceInt.java b/open-nars/com/googlecode/opennars/language/DifferenceInt.java
new file mode 100644
index 0000000..acace50
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/DifferenceInt.java
@@ -0,0 +1,107 @@
+/*
+ * DifferenceInt.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A compound term whose extension is the difference of the intensions of its components
+ */
+public class DifferenceInt extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private DifferenceInt(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private DifferenceInt(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a DifferenceInt
+     */
+    public Object clone() {
+        return new DifferenceInt(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new DifferenceExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList The list of components
+     */     
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        if (argList.size() == 1)    // special case from CompoundTerm.reduceComponent
+            return argList.get(0);
+        if (argList.size() != 2)
+            return null;
+        String name = makeCompoundName(Symbols.DIFFERENCE_INT_OPERATOR, argList);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new DifferenceInt(name, argList);
+    }
+
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param t1 The first compoment
+     * @param t2 The second compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term t1, Term t2, Memory memory) {
+        if (t1.equals(t2))
+            return null;
+        if ((t1 instanceof SetInt) && (t2 instanceof SetInt)) {
+            TreeSet set = new TreeSet(((CompoundTerm) t1).cloneComponents());
+            set.removeAll(((CompoundTerm) t2).cloneComponents());           // set difference
+            return SetInt.make(set, memory);
+        }
+        ArrayList<Term> list = argumentsToList(t1, t2);
+        return make(list, memory);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.DIFFERENCE_INT_OPERATOR;
+    }
+}
+
+
diff --git a/open-nars/com/googlecode/opennars/language/Disjunction.java b/open-nars/com/googlecode/opennars/language/Disjunction.java
new file mode 100644
index 0000000..387f977
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Disjunction.java
@@ -0,0 +1,129 @@
+/*
+ * Disjunction.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.inference.*;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/** 
+ * A disjunction of Statements.
+ */
+public class Disjunction extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private Disjunction(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private Disjunction(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Disjunction
+     */
+    public Object clone() {
+        return new Disjunction(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+
+    /**
+     * Try to make a new Disjunction from two components. Called by the inference rules.
+     * @param term1 The first compoment
+     * @param term2 The first compoment
+     * @return A Disjunction generated or a Term it reduced to
+     */
+    public static Term make(Term term1, Term term2, Memory memory) {
+        TreeSet set;
+        if (term1 instanceof Disjunction) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            if (term2 instanceof Disjunction)
+                set.addAll(((CompoundTerm) term2).cloneComponents());   // (&,(&,P,Q),(&,R,S)) = (&,P,Q,R,S)
+            else
+                set.add((Term) term2.clone());                          // (&,(&,P,Q),R) = (&,P,Q,R)
+        } else if (term2 instanceof Disjunction) {
+            set = new TreeSet(((CompoundTerm) term2).cloneComponents()); 
+            set.add((Term) term1.clone());                              // (&,R,(&,P,Q)) = (&,P,Q,R)
+        } else {
+            set = new TreeSet();
+            set.add((Term) term1.clone());
+            set.add((Term) term2.clone());
+        }
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new IntersectionExt. Called by StringParser.
+     * @param argList a list of Term as compoments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>(argList); // sort/merge arguments
+        return make(set, memory);
+    }
+
+    /**
+     * Try to make a new Disjunction from a set of components. Called by the public make methods.
+     * @param set a set of Term as compoments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(TreeSet<Term> set, Memory memory) {
+        if (set.size() == 1)
+            return set.first();                         // special case: single component
+        ArrayList<Term> argument = new ArrayList<Term>(set);
+        String name = makeCompoundName(Symbols.DISJUNCTION_OPERATOR, argument);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new Disjunction(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.DISJUNCTION_OPERATOR;
+    }
+
+    /**
+     * Conjunction is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return true;
+    }    
+}
diff --git a/open-nars/com/googlecode/opennars/language/Equivalence.java b/open-nars/com/googlecode/opennars/language/Equivalence.java
new file mode 100644
index 0000000..e63106b
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Equivalence.java
@@ -0,0 +1,99 @@
+/*
+ * Equivalence.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A Statement about an Equivalence relation.
+ */
+public class Equivalence extends Statement {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    protected Equivalence(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    protected Equivalence(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Similarity
+     */
+    public Object clone() {
+        return new Equivalence(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or null
+     */
+    public static Equivalence make(Term subject, Term predicate, Memory memory) {
+        if (invalidStatement(subject, predicate))
+            return null;
+        if (subject.compareTo(predicate) > 0)
+            return make(predicate, subject, memory);
+        String name = makeStatementName(subject, Symbols.EQUIVALENCE_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (Equivalence) t;
+        ArrayList<Term> argument = argumentsToList(subject, predicate);
+        return new Equivalence(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.EQUIVALENCE_RELATION;
+    }
+    
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return true;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/EquivalenceAfter.java b/open-nars/com/googlecode/opennars/language/EquivalenceAfter.java
new file mode 100644
index 0000000..c9d008d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/EquivalenceAfter.java
@@ -0,0 +1,100 @@
+/*
+ * EquivalenceAfter.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * Temporal Implication relation, predicate after subject.
+ */
+public class EquivalenceAfter extends Equivalence {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    public EquivalenceAfter(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private EquivalenceAfter(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Similarity
+     */
+    public Object clone() {
+        return new EquivalenceAfter(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or null
+     */
+    public static EquivalenceAfter make(Term subject, Term predicate, Memory memory) {
+        if (invalidStatement(subject, predicate))
+            return null;
+        String name = makeStatementName(subject, Symbols.EQUIVALENCE_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (EquivalenceAfter) t;
+        ArrayList<Term> argument = argumentsToList(subject, predicate);
+        return new EquivalenceAfter(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.EQUIVALENCE_AFTER_RELATION;
+    }
+    
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return false;
+    }
+
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.AFTER;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/EquivalenceWhen.java b/open-nars/com/googlecode/opennars/language/EquivalenceWhen.java
new file mode 100644
index 0000000..a6853db
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/EquivalenceWhen.java
@@ -0,0 +1,95 @@
+/*
+ * EquivalenceWhen.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * Temporal Equivalence relation, concurrent.
+ *
+ */
+public class EquivalenceWhen extends Equivalence {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    public EquivalenceWhen(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private EquivalenceWhen(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Similarity
+     */
+    public Object clone() {
+        return new EquivalenceWhen(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or null
+     */
+    public static EquivalenceWhen make(Term subject, Term predicate, Memory memory) {
+        if (invalidStatement(subject, predicate))
+            return null;
+        if (subject.compareTo(predicate) > 0)
+            return make(predicate, subject, memory);
+        String name = makeStatementName(subject, Symbols.EQUIVALENCE_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (EquivalenceWhen) t;
+        ArrayList<Term> argument = argumentsToList(subject, predicate);
+        return new EquivalenceWhen(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.EQUIVALENCE_WHEN_RELATION;
+    }
+
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.WHEN;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/ImageExt.java b/open-nars/com/googlecode/opennars/language/ImageExt.java
new file mode 100644
index 0000000..5cd342c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/ImageExt.java
@@ -0,0 +1,172 @@
+/*
+ * ImageExt.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * An extension image.
+ * <p>
+ * B --> (/,P,A,_)) iff (*,A,B) --> P
+ * <p>
+ * Internally, it is actually (/,A,P)_1, with an index.
+ */
+public class ImageExt extends CompoundTerm {
+
+    /**
+     * The index of relation in the component list.
+     */
+    private short relationIndex;
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     * @param index The index of relation in the component list
+     */
+    private ImageExt(String n, ArrayList<Term> arg, short index) {
+        super(n, arg);
+        relationIndex = index;
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param complexity syntactic complexity of the compound
+     * @param n The name of the term
+     * @param index The index of relation in the component list
+     */
+    private ImageExt(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short complexity, short index) {
+        super(n, cs, open, closed, complexity);
+        relationIndex = index;
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into an ImageExt
+     */
+    public Object clone() {
+        return new ImageExt(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity, relationIndex);
+    }
+
+     /**
+     * Try to make a new ImageExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList The list of components
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        if (argList.size() < 3)
+            return null;
+        Term t;
+        Term relation = argList.get(0);
+        ArrayList<Term> argument = new ArrayList<Term>();
+        int index = 0;
+        for (int j = 1; j < argList.size(); j++) {
+            if (argList.get(j).getName().charAt(0) == Symbols.IMAGE_PLACE_HOLDER) {
+                index = j-1;
+                argument.add(relation);
+            } else
+                argument.add(argList.get(j));
+        }
+        return make(argument, (short) index, memory);
+    }
+
+    /**
+     * Try to make an Image from a Product and a relation. Called by the inference rules.
+     * @param product The product
+     * @param relation The relation
+     * @param index The index of the place-holder
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Product product, Term relation, short index, Memory memory) {
+        if (relation instanceof Product) {
+            Product p2 = (Product) relation;
+            if ((product.size() == 2) && (p2.size() == 2)) {
+                if ((index == 0) && product.componentAt(1).equals(p2.componentAt(1))) // (/,_,(*,a,b),b) is reduced to a
+                    return p2.componentAt(0);  
+                if ((index == 1) && product.componentAt(0).equals(p2.componentAt(0))) // (/,(*,a,b),a,_) is reduced to b
+                    return p2.componentAt(1);  
+            }
+        }    
+        ArrayList<Term> argument = product.cloneComponents();
+        argument.set(index, relation);
+        return make(argument, index, memory);
+    }
+        
+    /**
+     * Try to make an Image from an existing Image and a component. Called by the inference rules.
+     * @param oldImage The existing Image
+     * @param component The component to be added into the component list
+     * @param index The index of the place-holder in the new Image
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(ImageExt oldImage, Term component, short index, Memory memory) {
+        ArrayList<Term> argList = oldImage.cloneComponents();
+        int oldIndex = oldImage.getRelationIndex();
+        Term relation = argList.get(oldIndex);
+        argList.set(oldIndex, component);
+        argList.set(index, relation);
+        return make(argList, index, memory);
+    }
+    
+    /**
+     * Try to make a new compound from a set of components. Called by the public make methods.
+     * @param argument The argument list
+     * @return the Term generated from the arguments
+     */
+    public static Term make(ArrayList<Term> argument, short index, Memory memory) {
+        String name = makeImageName(Symbols.IMAGE_EXT_OPERATOR, argument, index);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new ImageExt(name, argument, index);
+    }
+    
+    /**
+     * get the index of the relation in the component list
+     * @return the index of relation
+     */
+    public short getRelationIndex() {
+        return relationIndex;
+    }
+    
+    /**
+     * override the default in making the name of the current term from existing fields
+     * @return the name of the term
+     */
+    public String makeName() {
+        return makeImageName(Symbols.IMAGE_EXT_OPERATOR, components, relationIndex);
+    }
+
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.IMAGE_EXT_OPERATOR;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/ImageInt.java b/open-nars/com/googlecode/opennars/language/ImageInt.java
new file mode 100644
index 0000000..3e40977
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/ImageInt.java
@@ -0,0 +1,172 @@
+/*
+ * ImageInt.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * An intension image.
+ * <p>
+ * (\,P,A,_)) --> B iff P --> (*,A,B)
+ * <p>
+ * Internally, it is actually (\,A,P)_1, with an index.
+ */
+public class ImageInt extends CompoundTerm {
+
+    /**
+     * The index of relation in the component list.
+     */
+    private short relationIndex;
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     * @param index The index of relation in the component list
+     */
+    private ImageInt(String n, ArrayList<Term> arg, short index) {
+        super(n, arg);
+        relationIndex = index;
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param complexity syntactic complexity of the compound
+     * @param n The name of the term
+     * @param index The index of relation in the component list
+     */
+    private ImageInt(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short complexity, short index) {
+        super(n, cs, open, closed, complexity);
+        relationIndex = index;
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into an ImageInt
+     */
+    public Object clone() {
+        return new ImageInt(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity, relationIndex);
+    }
+
+    /**
+     * Try to make a new ImageExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList The list of components
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        if (argList.size() < 3)
+            return null;
+        Term t;
+        Term relation = argList.get(0);
+        ArrayList<Term> argument = new ArrayList<Term>();
+        int index = 0;
+        for (int j = 1; j < argList.size(); j++) {
+            if (argList.get(j).getName().charAt(0) == Symbols.IMAGE_PLACE_HOLDER) {
+                index = j-1;
+                argument.add(relation);
+            } else
+                argument.add(argList.get(j));
+        }
+        return make(argument, (short) index, memory);
+    }
+
+    /**
+     * Try to make an Image from a Product and a relation. Called by the inference rules.
+     * @param product The product
+     * @param relation The relation
+     * @param index The index of the place-holder
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Product product, Term relation, short index, Memory memory) {
+        if (relation instanceof Product) {
+            Product p2 = (Product) relation;
+            if ((product.size() == 2) && (p2.size() == 2)) {
+                if ((index == 0) && product.componentAt(1).equals(p2.componentAt(1))) // (\,_,(*,a,b),b) is reduced to a
+                    return p2.componentAt(0);  
+                if ((index == 1) && product.componentAt(0).equals(p2.componentAt(0))) // (\,(*,a,b),a,_) is reduced to b
+                    return p2.componentAt(1);  
+            }
+        }    
+        ArrayList<Term> argument = product.cloneComponents();
+        argument.set(index, relation);
+        return make(argument, index, memory);
+    }
+        
+    /**
+     * Try to make an Image from an existing Image and a component. Called by the inference rules.
+     * @param oldImage The existing Image
+     * @param component The component to be added into the component list
+     * @param index The index of the place-holder in the new Image
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(ImageInt oldImage, Term component, short index, Memory memory) {
+        ArrayList<Term> argList = oldImage.cloneComponents();
+        int oldIndex = oldImage.getRelationIndex();
+        Term relation = argList.get(oldIndex);
+        argList.set(oldIndex, component);
+        argList.set(index, relation);
+        return make(argList, index, memory);
+    }
+    
+    /**
+     * Try to make a new compound from a set of components. Called by the public make methods.
+     * @param argument The argument list
+     * @return the Term generated from the arguments
+     */
+    public static Term make(ArrayList<Term> argument, short index, Memory memory) {
+        String name = makeImageName(Symbols.IMAGE_INT_OPERATOR, argument, index);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new ImageInt(name, argument, index);
+    }
+    
+    /**
+     * get the index of the relation in the component list
+     * @return the index of relation
+     */
+    public short getRelationIndex() {
+        return relationIndex;
+    }
+    
+    /**
+     * override the default in making the name of the current term from existing fields
+     * @return the name of the term
+     */
+    public String makeName() {
+        return makeImageName(Symbols.IMAGE_INT_OPERATOR, components, relationIndex);
+    }
+
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.IMAGE_INT_OPERATOR;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Implication.java b/open-nars/com/googlecode/opennars/language/Implication.java
new file mode 100644
index 0000000..0e69a32
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Implication.java
@@ -0,0 +1,93 @@
+/*
+ * Implication.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A Statement about an Inheritance relation.
+ */
+public class Implication extends Statement {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    protected Implication(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    protected Implication(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new Implication(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Implication make(Term subject, Term predicate, Memory memory) {  // to be extended to check if subject is Conjunction
+        if (invalidStatement(subject, predicate))
+            return null;
+        String name = makeStatementName(subject, Symbols.IMPLICATION_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (Implication) t;
+        if (predicate instanceof Implication) {
+            Term oldCondition = ((Implication) predicate).getSubject();
+            Term newCondition = Conjunction.make(subject, oldCondition, memory);
+            return make(newCondition, ((Implication) predicate).getPredicate(), memory);
+        } else {
+            ArrayList<Term> argument = argumentsToList(subject, predicate);
+            return new Implication(name, argument);
+        }
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.IMPLICATION_RELATION;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/ImplicationAfter.java b/open-nars/com/googlecode/opennars/language/ImplicationAfter.java
new file mode 100644
index 0000000..d3cde18
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/ImplicationAfter.java
@@ -0,0 +1,99 @@
+/*
+ * ImplicationAfter.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * Temporal Implication relation, predicate after subject.
+ */
+public class ImplicationAfter extends Implication {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private ImplicationAfter(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private ImplicationAfter(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new ImplicationAfter(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static ImplicationAfter make(Term subject, Term predicate, Memory memory) {  // to be extended to check if subject is Conjunction
+        if (invalidStatement(subject, predicate))
+            return null;
+        String name = makeStatementName(subject, Symbols.IMPLICATION_AFTER_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (ImplicationAfter) t;
+        if (predicate instanceof ImplicationAfter) {
+            Term oldCondition = ((ImplicationAfter) predicate).getSubject();
+            Term newCondition = ConjunctionSequence.make(subject, oldCondition, memory);
+            return make(newCondition, ((ImplicationAfter) predicate).getPredicate(), memory);
+        } else {
+            ArrayList<Term> argument = argumentsToList(subject, predicate);
+            return new ImplicationAfter(name, argument);
+        }
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.IMPLICATION_AFTER_RELATION;
+    }
+
+    // overwrite default
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.AFTER;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/ImplicationBefore.java b/open-nars/com/googlecode/opennars/language/ImplicationBefore.java
new file mode 100644
index 0000000..d93d182
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/ImplicationBefore.java
@@ -0,0 +1,99 @@
+/*
+ * ImplicationBefore.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * Temporal Implication relation, predicate before subject.
+ */
+public class ImplicationBefore extends Implication {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private ImplicationBefore(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private ImplicationBefore(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new ImplicationBefore(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static ImplicationBefore make(Term subject, Term predicate, Memory memory) {  // to be extended to check if subject is Conjunction
+        if (invalidStatement(subject, predicate))
+            return null;
+        String name = makeStatementName(subject, Symbols.IMPLICATION_BEFORE_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (ImplicationBefore) t;
+        if (predicate instanceof ImplicationBefore) {
+            Term oldCondition = ((ImplicationBefore) predicate).getSubject();
+            Term newCondition = ConjunctionSequence.make(oldCondition, subject, memory);
+            return make(newCondition, ((ImplicationBefore) predicate).getPredicate(), memory);
+        } else {
+            ArrayList<Term> argument = argumentsToList(subject, predicate);
+            return new ImplicationBefore(name, argument);
+        }
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.IMPLICATION_BEFORE_RELATION;
+    }
+
+    // overwrite default
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.BEFORE;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/ImplicationWhen.java b/open-nars/com/googlecode/opennars/language/ImplicationWhen.java
new file mode 100644
index 0000000..2ebffa4
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/ImplicationWhen.java
@@ -0,0 +1,99 @@
+/*
+ * ImplicationWhen.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * Temporal Implication relation, concurrent.
+ */
+
+public class ImplicationWhen extends Implication {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    protected ImplicationWhen(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    protected ImplicationWhen(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new ImplicationWhen(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static ImplicationWhen make(Term subject, Term predicate, Memory memory) {  // to be extended to check if subject is Conjunction
+        if (invalidStatement(subject, predicate))
+            return null;
+        String name = makeStatementName(subject, Symbols.IMPLICATION_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (ImplicationWhen) t;
+        if (predicate instanceof ImplicationWhen) {
+            Term oldCondition = ((ImplicationWhen) predicate).getSubject();
+            Term newCondition = ConjunctionParallel.make(subject, oldCondition, memory);
+            return make(newCondition, ((ImplicationWhen) predicate).getPredicate(), memory);
+        } else {
+            ArrayList<Term> argument = argumentsToList(subject, predicate);
+            return new ImplicationWhen(name, argument);
+        }
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.IMPLICATION_WHEN_RELATION;
+    }
+
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.WHEN;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Inheritance.java b/open-nars/com/googlecode/opennars/language/Inheritance.java
new file mode 100644
index 0000000..93a1d2e
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Inheritance.java
@@ -0,0 +1,90 @@
+/*
+ * Inheritance.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A Statement about an Inheritance relation.
+ */
+public class Inheritance extends Statement {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private Inheritance(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private Inheritance(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new Inheritance(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or null
+     */
+    public static Inheritance make(Term subject, Term predicate, Memory memory) {
+        if (invalidStatement(subject, predicate))
+            return null;
+        String name = makeStatementName(subject, Symbols.INHERITANCE_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (Inheritance) t;
+        ArrayList<Term> argument = argumentsToList(subject, predicate);
+        return new Inheritance(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.INHERITANCE_RELATION;
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/language/Instance.java b/open-nars/com/googlecode/opennars/language/Instance.java
new file mode 100644
index 0000000..99b7183
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Instance.java
@@ -0,0 +1,43 @@
+/*
+ * Instance.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * A Statement about an Instance relation, which is used only in Narsese for I/O, 
+ * and translated into Inheritance for internal use.
+ */
+public abstract class Instance extends Statement {
+    
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * <p>
+     *  A {-- B becomes {A} --> B
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or null
+     */
+    public static Statement make(Term subject, Term predicate, Memory memory) {
+        return Inheritance.make(SetExt.make(subject, memory), predicate, memory);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/InstanceProperty.java b/open-nars/com/googlecode/opennars/language/InstanceProperty.java
new file mode 100644
index 0000000..fc871b5
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/InstanceProperty.java
@@ -0,0 +1,43 @@
+/*
+ * InstanceProperty.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * A Statement about an InstanceProperty relation, which is used only in Narsese for I/O, 
+ * and translated into Inheritance for internal use.
+ */
+public abstract class InstanceProperty extends Statement {
+    
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * <p>
+     *  A {-] B becomes {A} --> [B]
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or null
+     */
+    public static Statement make(Term subject, Term predicate, Memory memory) {
+        return Inheritance.make(SetExt.make(subject, memory), SetInt.make(predicate, memory), memory);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/IntersectionExt.java b/open-nars/com/googlecode/opennars/language/IntersectionExt.java
new file mode 100644
index 0000000..30c3d8b
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/IntersectionExt.java
@@ -0,0 +1,139 @@
+/*
+ * IntersectionExt.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A compound term whose extension is the intersection of the extensions of its components
+ */
+public class IntersectionExt extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private IntersectionExt(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private IntersectionExt(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a IntersectionExt
+     */
+    public Object clone() {
+        return new IntersectionExt(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param term1 The first compoment
+     * @param term2 The first compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term term1, Term term2, Memory memory) {
+        TreeSet set;
+        if ((term1 instanceof SetInt) && (term2 instanceof SetInt)) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            set.addAll(((CompoundTerm) term2).cloneComponents());           // set union
+            return SetInt.make(set, memory);
+        }
+        if ((term1 instanceof SetExt) && (term2 instanceof SetExt)) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            set.retainAll(((CompoundTerm) term2).cloneComponents());        // set intersection
+            return SetExt.make(set, memory);
+        }
+        if (term1 instanceof IntersectionExt) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            if (term2 instanceof IntersectionExt)
+                set.addAll(((CompoundTerm) term2).cloneComponents());   // (&,(&,P,Q),(&,R,S)) = (&,P,Q,R,S)
+            else
+                set.add((Term) term2.clone());                          // (&,(&,P,Q),R) = (&,P,Q,R)
+        } else if (term2 instanceof IntersectionExt) {
+            set = new TreeSet(((CompoundTerm) term2).cloneComponents());
+            set.add((Term) term1.clone());                              // (&,R,(&,P,Q)) = (&,P,Q,R)
+        } else {
+            set = new TreeSet();
+            set.add((Term) term1.clone());
+            set.add((Term) term2.clone());
+        }
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new IntersectionExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList The list of components
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>(argList); // sort/merge arguments
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new compound from a set of components. Called by the public make methods.
+     * @param set a set of Term as compoments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(TreeSet<Term> set, Memory memory) {
+        if (set.size() == 1)
+            return set.first();                         // special case: single component
+        ArrayList<Term> argument = new ArrayList<Term>(set);
+        String name = makeCompoundName(Symbols.INTERSECTION_EXT_OPERATOR, argument);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new IntersectionExt(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.INTERSECTION_EXT_OPERATOR;
+    }
+    
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return true;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/IntersectionInt.java b/open-nars/com/googlecode/opennars/language/IntersectionInt.java
new file mode 100644
index 0000000..bc13e5d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/IntersectionInt.java
@@ -0,0 +1,139 @@
+/*
+ * IntersectionInt.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A compound term whose intension is the intersection of the extensions of its components
+ */
+public class IntersectionInt extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private IntersectionInt(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private IntersectionInt(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Conjunction
+     */
+    public Object clone() {
+        return new IntersectionInt(name, (ArrayList<Term>) cloneList(components), 
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param term1 The first compoment
+     * @param term2 The first compoment
+     * @return A compound generated or a term it reduced to
+     */    
+    public static Term make(Term term1, Term term2, Memory memory) {
+        TreeSet set;
+        if ((term1 instanceof SetExt) && (term2 instanceof SetExt)) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            set.addAll(((CompoundTerm) term2).cloneComponents());           // set union
+            return SetExt.make(set, memory);
+        }
+        if ((term1 instanceof SetInt) && (term2 instanceof SetInt)) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            set.retainAll(((CompoundTerm) term2).cloneComponents());        // set intersection
+            return SetInt.make(set, memory);
+        }
+        if (term1 instanceof IntersectionInt) {
+            set = new TreeSet(((CompoundTerm) term1).cloneComponents());
+            if (term2 instanceof IntersectionInt)
+                set.addAll(((CompoundTerm) term2).cloneComponents());   // (|,(|,P,Q),(|,R,S)) = (|,P,Q,R,S)
+            else
+                set.add((Term) term2.clone());                          // (|,(|,P,Q),R) = (|,P,Q,R)
+        } else if (term2 instanceof IntersectionInt) {
+            set = new TreeSet(((CompoundTerm) term2).cloneComponents());
+            set.add((Term) term1.clone());                              // (|,R,(|,P,Q)) = (|,P,Q,R)
+        } else {
+            set = new TreeSet();
+            set.add((Term) term1.clone());
+            set.add((Term) term2.clone());
+        }
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new IntersectionExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList The list of components
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>(argList); // sort/merge arguments
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new compound from a set of components. Called by the public make methods.
+     * @param set a set of Term as compoments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(TreeSet<Term> set, Memory memory) {
+        if (set.size() == 1)
+            return set.first();                         // special case: single component
+        ArrayList<Term> argument = new ArrayList<Term>(set);
+        String name = makeCompoundName(Symbols.INTERSECTION_INT_OPERATOR, argument);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new IntersectionInt(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.INTERSECTION_INT_OPERATOR;
+    }
+
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return true;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Negation.java b/open-nars/com/googlecode/opennars/language/Negation.java
new file mode 100644
index 0000000..81e9ffb
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Negation.java
@@ -0,0 +1,97 @@
+/*
+ * Negation.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A negation of a Statement.
+ */
+public class Negation extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private Negation(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private Negation(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new Negation(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a Negation of one component. Called by the inference rules.
+     * @param t The compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term t, Memory memory) {
+        if (t instanceof Negation)
+            return (Term) ((CompoundTerm) t).cloneComponents().get(0);         // (--,(--,P)) = P
+        ArrayList<Term> argument = new ArrayList<Term>();
+        argument.add(t);
+        return make(argument, memory);
+    }
+    
+    /**
+     * Try to make a new SetExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argument The list of components
+     */
+    public static Term make(ArrayList<Term> argument, Memory memory) {
+        if (argument.size() != 1)
+            return null;
+        String name = makeCompoundName(Symbols.NEGATION_OPERATOR, argument);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new Negation(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.NEGATION_OPERATOR;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Product.java b/open-nars/com/googlecode/opennars/language/Product.java
new file mode 100644
index 0000000..dcd51a5
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Product.java
@@ -0,0 +1,99 @@
+/*
+ * Product.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A Product is a sequence of terms.
+ */
+public class Product extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private Product(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param complexity syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private Product(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short complexity) {
+        super(n, cs, open, closed, complexity);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into an ImageExt
+     */
+    public Object clone() {
+        return new Product(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+
+     /**
+     * Try to make a new compound. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argument The list of components
+     */
+    public static Term make(ArrayList<Term> argument, Memory memory) {
+        if (argument.size() < 2)
+            return null;
+        String name = makeCompoundName(Symbols.PRODUCT_OPERATOR, argument);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new Product(name, argument);
+    }
+        
+    /**
+     * Try to make a Product from an ImageExt/ImageInt and a component. Called by the inference rules.
+     * @param image The existing Image
+     * @param component The component to be added into the component list
+     * @param index The index of the place-holder in the new Image -- optional parameter
+     * @return A compound generated or a term it reduced to
+     */
+    // for both 
+    public static Term make(CompoundTerm image, Term component, int index, Memory memory) {
+        ArrayList<Term> argument = image.cloneComponents();
+        argument.set(index, component);
+        return make(argument, memory);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.PRODUCT_OPERATOR;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Property.java b/open-nars/com/googlecode/opennars/language/Property.java
new file mode 100644
index 0000000..d5997c8
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Property.java
@@ -0,0 +1,43 @@
+/*
+ * Property.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * A Statement about a Property relation, which is used only in Narsese for I/O, 
+ * and translated into Inheritance for internal use.
+ */
+public abstract class Property extends Statement {
+    
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * <p>
+     *  A --] B becomes A --> [B]
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or null
+     */
+    public static Statement make(Term subject, Term predicate, Memory memory) {
+        return Inheritance.make(subject, SetInt.make(predicate, memory), memory);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/SetExt.java b/open-nars/com/googlecode/opennars/language/SetExt.java
new file mode 100644
index 0000000..2c42c68
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/SetExt.java
@@ -0,0 +1,124 @@
+/*
+ * SetExt.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * An extensionally defined set, which contains one or more instances defining the Term.
+ */
+public class SetExt extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private SetExt(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private SetExt(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new SetExt(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new set from one component. Called by the inference rules.
+     * @param t The compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term t, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>();
+        set.add(t);
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new SetExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList The list of components
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>(argList); // sort/merge arguments
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new compound from a set of components. Called by the public make methods.
+     * @param set a set of Term as compoments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(TreeSet<Term> set, Memory memory) {
+        if (set.isEmpty())
+            return null;
+        ArrayList<Term> argument = new ArrayList<Term>(set);
+        String name = makeSetName(Symbols.SET_EXT_OPENER, argument, Symbols.SET_EXT_CLOSER);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new SetExt(name, argument);
+    }
+
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return "" + Symbols.SET_EXT_OPENER;
+    }
+    
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return true;
+    }
+
+    /**
+     * Make a String representation of the set, override the default.
+     * @return true for communitative
+     */
+    public String makeName() {
+        return makeSetName(Symbols.SET_EXT_OPENER, components, Symbols.SET_EXT_CLOSER);
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/language/SetInt.java b/open-nars/com/googlecode/opennars/language/SetInt.java
new file mode 100644
index 0000000..c7d3554
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/SetInt.java
@@ -0,0 +1,124 @@
+/*
+ * SetInt.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * An intensionally defined set, which contains one or more instances defining the Term.
+ */
+public class SetInt extends CompoundTerm {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private SetInt(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private SetInt(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetInt
+     */
+    public Object clone() {
+        return new SetInt(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new set from one component. Called by the inference rules.
+     * @param t The compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term t, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>();
+        set.add(t);
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new SetExt. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argList The list of components
+     */
+    public static Term make(ArrayList<Term> argList, Memory memory) {
+        TreeSet<Term> set = new TreeSet<Term>(argList); // sort/merge arguments
+        return make(set, memory);
+    }
+    
+    /**
+     * Try to make a new compound from a set of components. Called by the public make methods.
+     * @param set a set of Term as compoments
+     * @return the Term generated from the arguments
+     */
+    public static Term make(TreeSet<Term> set, Memory memory) {
+        if (set.isEmpty())
+            return null;
+        ArrayList<Term> argument = new ArrayList<Term>(set);
+        String name = makeSetName(Symbols.SET_INT_OPENER, argument, Symbols.SET_INT_CLOSER);
+        Term t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new SetInt(name, argument);
+    }
+
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return "" + Symbols.SET_INT_OPENER;
+    }
+    
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return true;
+    }
+
+    /**
+     * Make a String representation of the set, override the default.
+     * @return true for communitative
+     */
+    public String makeName() {
+        return makeSetName(Symbols.SET_INT_OPENER, components, Symbols.SET_INT_CLOSER);
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/language/Similarity.java b/open-nars/com/googlecode/opennars/language/Similarity.java
new file mode 100644
index 0000000..8c0f9a9
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Similarity.java
@@ -0,0 +1,99 @@
+/*
+ * Similarity.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.TermLink;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A Statement about a Similarity relation.
+ */
+public class Similarity extends Statement {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private Similarity(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private Similarity(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a Similarity
+     */
+    public Object clone() {
+        return new Similarity(name, (ArrayList<Term>) cloneList(components), 
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+     
+    /**
+     * Try to make a new compound from two components. Called by the inference rules.
+     * @param subject The first compoment
+     * @param predicate The second compoment
+     * @return A compound generated or null
+     */
+    public static Similarity make(Term subject, Term predicate, Memory memory) {
+        if (invalidStatement(subject, predicate))
+            return null;
+        if (subject.compareTo(predicate) > 0)
+            return make(predicate, subject, memory);
+        String name = makeStatementName(subject, Symbols.SIMILARITY_RELATION, predicate);
+        Term t = memory.nameToListedTerm(name);
+        if (t != null)
+            return (Similarity) t;
+        ArrayList<Term> argument = argumentsToList(subject, predicate);
+        return new Similarity(name, argument);
+    }
+    
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.SIMILARITY_RELATION;
+    }
+    
+    /**
+     * Check if the compound is communitative.
+     * @return true for communitative
+     */
+    public boolean isCommutative() {
+        return true;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Statement.java b/open-nars/com/googlecode/opennars/language/Statement.java
new file mode 100644
index 0000000..9709b6f
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Statement.java
@@ -0,0 +1,281 @@
+/*
+ * Statement.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * A statement is a compound term, consisting of a subject, a predicate,
+ * and a relation symbol in between. It can be of either first-order or higher-order.
+ */
+public abstract class Statement extends CompoundTerm {
+    
+    /**
+     * default constructor
+     */
+    protected Statement() {}
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    protected Statement(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    protected Statement(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * Make a Statement from String, called by StringParser
+     * @param relation The relation String
+     * @param subject The first component
+     * @param predicate The second component
+     * @return The Statement built
+     */
+    public static Statement make(String relation, Term subject, Term predicate, Memory memory) {
+        if (invalidStatement(subject, predicate))
+            return null;
+        if (relation.equals(Symbols.INHERITANCE_RELATION))
+            return Inheritance.make(subject, predicate, memory);
+        if (relation.equals(Symbols.SIMILARITY_RELATION))
+            return Similarity.make(subject, predicate, memory);
+        if (relation.equals(Symbols.INSTANCE_RELATION))
+            return Instance.make(subject, predicate, memory);
+        if (relation.equals(Symbols.PROPERTY_RELATION))
+            return Property.make(subject, predicate, memory);
+        if (relation.equals(Symbols.INSTANCE_PROPERTY_RELATION))
+            return InstanceProperty.make(subject, predicate, memory);
+        if (relation.equals(Symbols.IMPLICATION_RELATION))
+            return Implication.make(subject, predicate, memory);
+        if (relation.equals(Symbols.EQUIVALENCE_RELATION))
+            return Equivalence.make(subject, predicate, memory);
+        if (relation.equals(Symbols.IMPLICATION_AFTER_RELATION))
+            return ImplicationAfter.make(subject, predicate, memory);
+        if (relation.equals(Symbols.IMPLICATION_WHEN_RELATION))
+            return ImplicationWhen.make(subject, predicate, memory);
+        if (relation.equals(Symbols.IMPLICATION_BEFORE_RELATION))
+            return ImplicationBefore.make(subject, predicate, memory);
+        if (relation.equals(Symbols.EQUIVALENCE_AFTER_RELATION))
+            return EquivalenceAfter.make(subject, predicate, memory);
+        if (relation.equals(Symbols.EQUIVALENCE_WHEN_RELATION))
+            return EquivalenceWhen.make(subject, predicate, memory);
+        return null;
+    }
+    
+    /**
+     * Make a Statement from given components, called by the rules
+     * @return The Statement built
+     * @param sub The first component
+     * @param pred The second component
+     * @param statement A sample statement providing the class type
+     */
+    public static Statement make(Statement statement, Term sub, Term pred, Memory memory) {
+        if (statement instanceof Inheritance)
+            return Inheritance.make(sub, pred, memory);
+        if (statement instanceof Similarity)
+            return Similarity.make(sub, pred, memory);
+        if (statement instanceof ImplicationBefore)
+            return ImplicationBefore.make(sub, pred, memory);
+        if (statement instanceof ImplicationWhen)
+            return ImplicationWhen.make(sub, pred, memory);
+        if (statement instanceof ImplicationAfter)
+            return ImplicationAfter.make(sub, pred, memory);
+        if (statement instanceof Implication)
+            return Implication.make(sub, pred, memory);
+        if (statement instanceof EquivalenceWhen)
+            return EquivalenceWhen.make(sub, pred, memory);
+        if (statement instanceof EquivalenceAfter)
+            return EquivalenceAfter.make(sub, pred, memory);
+        if (statement instanceof Equivalence)
+            return Equivalence.make(sub, pred, memory);
+        return null;
+    }
+    
+    /**
+     * Make a Statement from given components and temporal information, called by the rules
+     * @param statement A sample statement providing the class type
+     * @param sub The first component
+     * @param pred The second component
+     * @param order The temporal order of the statement
+     * @return The Statement built
+     */
+    public static Statement make(Statement statement, Term sub, Term pred, CompoundTerm.TemporalOrder order, Memory memory) {
+        if (order == CompoundTerm.TemporalOrder.UNSURE)
+            return null;
+        if (order == CompoundTerm.TemporalOrder.NONE)
+            return make(statement, sub, pred, memory);
+        if (order == CompoundTerm.TemporalOrder.AFTER) {
+            if (statement instanceof Implication)
+                return ImplicationAfter.make(sub, pred, memory);
+            if (statement instanceof Equivalence)
+                return EquivalenceAfter.make(sub, pred, memory);
+            return null;
+        }
+        if (order == CompoundTerm.TemporalOrder.WHEN) {
+            if (statement instanceof Implication)
+                return ImplicationWhen.make(sub, pred, memory);
+            if (statement instanceof Equivalence)
+                return EquivalenceWhen.make(sub, pred, memory);
+            return null;
+        }
+        if (order == CompoundTerm.TemporalOrder.BEFORE) {
+            if (statement instanceof Implication)
+                return ImplicationBefore.make(sub, pred, memory);
+            if (statement instanceof Equivalence)
+                return EquivalenceAfter.make(pred, sub, memory);
+            return null;
+        }
+        return null;
+    }
+    
+    /**
+     * Make a symmetric Statement from given components and temporal information, called by the rules
+     * @param statement A sample asymmetric statement providing the class type
+     * @param sub The first component
+     * @param pred The second component
+     * @param order The temporal order of the statement
+     * @return The Statement built
+     */
+    public static Statement makeSym(Statement statement, Term sub, Term pred, CompoundTerm.TemporalOrder order, Memory memory) {
+        if (order == CompoundTerm.TemporalOrder.UNSURE)
+            return null;
+        if (order == CompoundTerm.TemporalOrder.NONE) {
+            if (statement instanceof Inheritance)
+                return Similarity.make(sub, pred, memory);
+            if (statement instanceof Implication)
+                return Equivalence.make(sub, pred, memory);
+            return null;
+        }
+        if (order == CompoundTerm.TemporalOrder.AFTER) {
+            if (statement instanceof Implication)
+                return EquivalenceAfter.make(sub, pred, memory);
+            return null;
+        }
+        if (order == CompoundTerm.TemporalOrder.WHEN) {
+            if (statement instanceof Implication)
+                return EquivalenceWhen.make(sub, pred, memory);
+            return null;
+        }
+        if (order == CompoundTerm.TemporalOrder.BEFORE) {
+            if (statement instanceof Implication)
+                return EquivalenceAfter.make(pred, sub, memory);
+            return null;
+        }
+        return null;
+    }
+    
+    /**
+     * check Statement relation symbol
+     * @return if the given String is a relation symbol
+     * @param s0 The String to be checked
+     */
+    public static boolean isRelation(String s0) {
+        String s = s0.trim();
+        if (s.length() != 3)
+            return false;
+        return (s.equals(Symbols.INHERITANCE_RELATION) ||
+                s.equals(Symbols.SIMILARITY_RELATION) ||
+                s.equals(Symbols.INSTANCE_RELATION) ||
+                s.equals(Symbols.PROPERTY_RELATION) ||
+                s.equals(Symbols.INSTANCE_PROPERTY_RELATION) ||
+                s.equals(Symbols.IMPLICATION_RELATION) ||
+                s.equals(Symbols.EQUIVALENCE_RELATION) ||
+                s.equals(Symbols.IMPLICATION_AFTER_RELATION) ||
+                s.equals(Symbols.IMPLICATION_WHEN_RELATION) ||
+                s.equals(Symbols.IMPLICATION_BEFORE_RELATION) ||
+                s.equals(Symbols.EQUIVALENCE_WHEN_RELATION) ||
+                s.equals(Symbols.EQUIVALENCE_AFTER_RELATION) );
+    }
+    
+    /**
+     * override the default in making the name of the current term from existing fields
+     * @return the name of the term
+     */
+    protected String makeName() {
+        return makeStatementName(getSubject(), operator(), getPredicate());
+    }
+    
+    /**
+     * default method to make the name of an image term from given fields
+     * @param subject the first component
+     * @param predicate the second component
+     * @param relation the relation operator
+     * @return the name of the term
+     */
+    protected static String makeStatementName(Term subject, String relation, Term predicate) {
+        StringBuffer name = new StringBuffer();
+        name.append(Symbols.STATEMENT_OPENER);
+        name.append(subject.getName());
+        name.append(' ' + relation + ' ');
+        name.append(predicate.getName());
+        name.append(Symbols.STATEMENT_CLOSER);
+        return name.toString();
+    }
+    
+    /**
+     * check the validity of a potential Statement.
+     * <p>
+     * Minimum requirement: the two terms cannot be the same. To be strengthened.
+     * @param subject the first component
+     * @param predicate the second component
+     * @return Whether the Statement is invalid
+     */
+    public static boolean invalidStatement(Term subject, Term predicate) {
+        if (subject.equals(predicate))
+            return true;
+        if ((subject instanceof CompoundTerm) && ((CompoundTerm) subject).containComponent(predicate))
+            return true;
+        if ((predicate instanceof CompoundTerm) && ((CompoundTerm) predicate).containComponent(subject))
+            return true;
+        return false;
+    }
+    
+    /**
+     * Return the first component of the statement
+     * @return The first component
+     */
+    public Term getSubject() {
+        return components.get(0);
+    }
+        
+    /**
+     * Return the second component of the statement
+     * @return The second component
+     */
+    public Term getPredicate() {
+        return components.get(1);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Tense.java b/open-nars/com/googlecode/opennars/language/Tense.java
new file mode 100644
index 0000000..63da189
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Tense.java
@@ -0,0 +1,53 @@
+/*
+ * Tense.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+
+/**
+ * Term with temporal relation with "now"
+ */
+public abstract class Tense extends CompoundTerm {
+    
+    protected Tense(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+
+    protected Tense(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+
+    public static Term make(Term content, CompoundTerm.TemporalOrder order, Memory memory) {
+        switch (order) {
+            case AFTER:
+                return TenseFuture.make(content, memory);
+            case WHEN:
+                return TensePresent.make(content, memory);
+            case BEFORE:
+                return TensePast.make(content, memory);
+            default:
+                return content;
+        }
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/TenseFuture.java b/open-nars/com/googlecode/opennars/language/TenseFuture.java
new file mode 100644
index 0000000..f8ac936
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/TenseFuture.java
@@ -0,0 +1,106 @@
+/*
+ * TenseFuture.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * Future tense of a Statement.
+ */
+public class TenseFuture extends Tense {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private TenseFuture(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private TenseFuture(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new TenseFuture(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new compound. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argument The list of components
+     */
+    public static Term make(ArrayList<Term> argument, Memory memory) {
+        if (argument.size() != 1) 
+            return null;
+        Term t = argument.get(0);
+        if (t instanceof TenseFuture)
+            return t;         
+        if (t instanceof TensePast)
+            return null;         
+        if (t instanceof TensePresent)
+            t = ((CompoundTerm) t).componentAt(0);         
+        String name = makeCompoundName(Symbols.FUTURE_OPERATOR, argument);
+        t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new TenseFuture(name, argument);
+    }
+    
+    /**
+     * Try to make a compound of one component. Called by the inference rules.
+     * @param t The compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term t, Memory memory) {
+        ArrayList<Term> argument = new ArrayList<Term>();
+        argument.add(t);
+        return make(argument, memory);
+    }
+
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.FUTURE_OPERATOR;
+    }
+
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.AFTER;
+    }
+}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/language/TensePast.java b/open-nars/com/googlecode/opennars/language/TensePast.java
new file mode 100644
index 0000000..48c6cd1
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/TensePast.java
@@ -0,0 +1,106 @@
+/*
+ * TensePast.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * Past tense of a Statement.
+ */
+public class TensePast extends Tense {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private TensePast(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private TensePast(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new TensePast(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new compound. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argument The list of components
+     */
+    public static Term make(ArrayList<Term> argument, Memory memory) {
+        if (argument.size() != 1) 
+            return null;
+        Term t = argument.get(0);
+        if (t instanceof TensePast)
+            return t;         
+        if (t instanceof TenseFuture)
+            return null;         
+        if (t instanceof TensePresent)
+            t = ((CompoundTerm) t).componentAt(0);         
+        String name = makeCompoundName(Symbols.PAST_OPERATOR, argument);
+        t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new TensePast(name, argument);
+    }
+    
+    /**
+     * Try to make a compound of one component. Called by the inference rules.
+     * @param t The compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term t, Memory memory) {
+        ArrayList<Term> argument = new ArrayList<Term>();
+        argument.add(t);
+        return make(argument, memory);
+    }
+
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.PAST_OPERATOR;
+    }
+
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.BEFORE;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/TensePresent.java b/open-nars/com/googlecode/opennars/language/TensePresent.java
new file mode 100644
index 0000000..038f926
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/TensePresent.java
@@ -0,0 +1,102 @@
+/*
+ * TensePresent.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.*;
+
+/**
+ * Present tense of a Statement.
+ */
+public class TensePresent extends Tense {
+    
+    /**
+     * constructor with partial values, called by make
+     * @param n The name of the term
+     * @param arg The component list of the term
+     */
+    private TensePresent(String n, ArrayList<Term> arg) {
+        super(n, arg);
+    }
+    
+    /**
+     * constructor with full values, called by clone
+     * @param cs component list
+     * @param open open variable list
+     * @param closed closed variable list
+     * @param i syntactic complexity of the compound
+     * @param n The name of the term
+     */
+    private TensePresent(String n, ArrayList<Term> cs, ArrayList<Variable> open, ArrayList<Variable> closed, short i) {
+        super(n, cs, open, closed, i);
+    }
+    
+    /**
+     * override the cloning methed in Object
+     * @return A new object, to be casted into a SetExt
+     */
+    public Object clone() {
+        return new TensePresent(name, (ArrayList<Term>) cloneList(components),
+                (ArrayList<Variable>) cloneList(openVariables), (ArrayList<Variable>) cloneList(closedVariables), complexity);
+    }
+    
+    /**
+     * Try to make a new compound. Called by StringParser.
+     * @return the Term generated from the arguments
+     * @param argument The list of components
+     */
+    public static Term make(ArrayList<Term> argument, Memory memory) {
+        if (argument.size() != 1) 
+            return null;
+        Term t = argument.get(0);
+        if ((t instanceof TensePresent) || (t instanceof TensePast) || (t instanceof TenseFuture))
+            return t;         
+        String name = makeCompoundName(Symbols.PRESENT_OPERATOR, argument);
+        t = memory.nameToListedTerm(name);
+        return (t != null) ? t : new TensePresent(name, argument);
+    }
+    
+    /**
+     * Try to make a compound of one component. Called by the inference rules.
+     * @param t The compoment
+     * @return A compound generated or a term it reduced to
+     */
+    public static Term make(Term t, Memory memory) {
+        ArrayList<Term> argument = new ArrayList<Term>();
+        argument.add(t);
+        return make(argument, memory);
+    }
+
+    /**
+     * get the operator of the term.
+     * @return the operator of the term
+     */
+    public String operator() {
+        return Symbols.PRESENT_OPERATOR;
+    }
+
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.WHEN;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Term.java b/open-nars/com/googlecode/opennars/language/Term.java
new file mode 100644
index 0000000..41413fe
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Term.java
@@ -0,0 +1,129 @@
+/*
+ * Term.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.inference.SyllogisticRules;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * Term is the basic component of Narsese, and the object of processing in NARS.
+ * <p>
+ * A Term may or may not have an associated Concept containing relations with other Terms. It
+ * is not linked in the Term, because a Concept may be forgot, while the Term exists.
+ */
+public class Term implements Cloneable, Comparable<Term> {
+    /**
+     * A Term is identified uniquely by its name, a sequence of characters in a given alphabet.
+     */
+    protected String name;              // name of the term, an ASCII string (can be changed to Unicode)
+    
+    /**
+     * Default constructor
+     */
+    protected Term() {}
+    
+    /**
+     * Constructor with a given name
+     * @param name A String as the name of the Term
+     */
+    public Term(String name) {
+        this.name = name;
+    }
+    
+    /**
+     * The same as getName, used in display.
+     * @return The name of the term as a String
+     */
+    public final String toString() {
+        return name;
+    }
+    
+    /**
+     * Reporting the name of the current Term.
+     * @return The name of the term as a String
+     */
+    public String getName() {
+        return name;
+    }
+    
+    /**
+     * Default, to be overrided in variable Terms.
+     * @return The name of the term as a String
+     */
+    public String getConstantName() {
+        return name;
+    }
+    
+    /**
+     * Make a new Term with the same name.
+     * @return The new Term
+     */
+    public Object clone() {
+        return new Term(name);
+    }
+    
+    /**
+     * Equal terms have identical name, though not necessarily the same reference.
+     * @return Whether the two Terms are equal
+     * @param that The Term to be compared with the current Term
+     */
+    public boolean equals(Object that) {
+        return (that instanceof Term) && getName().equals(((Term) that).getName());
+    }
+    
+    /**
+     * The default complexity, for constant automic Term, is 1.
+     * @return The conplexity of the term, an integer
+     */
+    public int getComplexity() {
+        return 1;
+    }
+        
+    /**
+     * Check the relative order of two Terms.
+     * @param that The Term to be compared with the current Term
+     * @return The same as compareTo as defined on Strings when the constant parts are compared
+     */
+    public final int compareTo(Term that) {
+        int i = this.getConstantName().compareTo(that.getConstantName());       // based on the constant part first
+        return (i != 0) ? i : this.getName().compareTo(that.getName());
+    }
+    
+    /**
+     * Check whether the current Term can name a Concept.
+     * @return a Term is constant by default
+     */
+    public boolean isConstant() {
+        return true;
+    }
+    
+    public CompoundTerm.TemporalOrder getTemporalOrder() {
+        return CompoundTerm.TemporalOrder.NONE;
+    }
+    
+    public final boolean containQueryVariable() {                           // to be revised
+        return (name.indexOf(Symbols.QUERY_VARIABLE_TAG) >= 0);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/Variable.java b/open-nars/com/googlecode/opennars/language/Variable.java
new file mode 100644
index 0000000..35f2eb2
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Variable.java
@@ -0,0 +1,234 @@
+/*
+ * Variable.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.language;
+
+import java.util.*;
+
+import com.googlecode.opennars.parser.Symbols;
+
+/**
+ * A variable term.
+ */
+public class Variable extends Term {
+    public enum VarType { INDEPENDENT, DEPENDENT, ANONYMOUS, QUERY }
+    
+    private CompoundTerm scope;
+    private VarType type;
+    
+    public Variable() {
+        super();
+    }
+    
+    public Variable(String s) {
+        name = s;
+        scope = null;
+        char prefix = s.charAt(0);
+        if (prefix == Symbols.QUERY_VARIABLE_TAG)
+            type = VarType.QUERY;
+        else if (s.length() == 1)
+            type = VarType.ANONYMOUS;
+        else if (s.charAt(s.length()-1) == Symbols.COMPOUND_TERM_CLOSER) {
+            type = VarType.DEPENDENT;
+            int i = s.indexOf(Symbols.COMPOUND_TERM_OPENER);
+            name = s.substring(0, i);       // ignore the dependency list
+        } else
+            type = VarType.INDEPENDENT;
+    }
+
+    private Variable(String n, CompoundTerm s, VarType t) {
+        name = n;
+        scope = s;
+        type = t;
+    }
+    
+    /**
+     * Make a new Variable with the same name and type.
+     * @return The new Variable
+     */
+    public Object clone() {
+        return new Variable(name, scope, type);
+    }
+
+    // overwrite default, to be omitted in sorting
+    public String getConstantName() {
+        return ("" + Symbols.VARIABLE_TAG);
+    }
+    
+    /**
+     * Rename a variable temporally to distinguish it from variables in other Terms
+     * @param first Whether it is the first term
+     * @return The new name
+     */
+    public String getVarName(boolean first) {
+        if (first)
+            return Symbols.VARIABLE_TAG + "1" + name;
+        else
+            return Symbols.VARIABLE_TAG + "2" + name;
+    }
+    
+    public void setName(String n) {
+        name = n;
+    }
+    
+    public CompoundTerm getScope() {
+        return scope;
+    }
+    
+    public void setScope(CompoundTerm s) {
+        scope = s;
+    }
+    
+    public VarType getType() {
+        return type;
+    }
+    
+    public void setType(VarType t) {
+        type = t;
+    }
+
+    public boolean equals(Object that) {
+        return (that instanceof Variable) && name.equals(((Variable) that).getSimpleName());
+    }
+
+    public String getSimpleName() {
+        return name;
+    }
+
+    public String getName() {
+        if (type != VarType.DEPENDENT)
+            return name;
+        else {
+            StringBuffer buffer = new StringBuffer(name + "(");
+            if (scope != null) {
+                ArrayList<Variable> dependency = scope.getOpenVariables();
+                if (dependency != null) {
+                    for (Variable v : dependency)
+                        if (v.getType() == VarType.INDEPENDENT)
+                            buffer.append(v.toString());
+                }
+            }
+            buffer.append(")");
+            return buffer.toString();
+        }
+    }
+    
+    public boolean isConstant() {
+        return false;                // overridding default
+    }
+    
+    // move to RuleTable? the last two arguments must be clones
+    /**
+     * To unify two Terms, then apply the substitution to the two compounds
+     * @param type The type of Variable to be unified
+     * @param t1 The first Term to be unified
+     * @param t2 The second Term to be unified
+     * @param compound1 The first compound to be substituted
+     * @param compound2 The second compound to be substituted
+     * @return Whether a unification has been succeeded
+     */
+    public static boolean unify(VarType type, Term t1, Term t2, Term compound1, Term compound2) {
+        if (t1.isConstant() && t1.equals(t2))       // to constant Terms are unified if equals
+            return true;
+        if (!(compound1 instanceof CompoundTerm) || !(compound2 instanceof CompoundTerm))
+            return false;
+        HashMap<String,Term> substitute = findSubstitute(type, t1, t2, new HashMap<String,Term>()); // find substitution
+        if (substitute == null) // not unifiable
+            return false;
+        if (!substitute.isEmpty()) {
+            ((CompoundTerm) compound1).substituteComponent(substitute, true);   // apply the substitution to the first compound
+            ((CompoundTerm) compound2).substituteComponent(substitute, false);  // apply the substitution to the second compound
+        }
+        return true;
+    }
+
+
+    public static HashMap<String,Term> findSubstitute(VarType type, Term term1, Term term2) {
+        return findSubstitute(type, term1, term2, new HashMap<String,Term>());
+    }
+    
+    /**
+     * To find a substitution that can unify two Terms without changing them
+     * @param type The type of Variable to be substituted
+     * @param term1 The first Term to be unified
+     * @param term2 The second Term to be unified
+     * @param subs The substitution formed so far
+     * @return The substitution that unifies the two Terms
+     */
+    private static HashMap<String,Term> findSubstitute(VarType type, Term term1, Term term2, HashMap<String,Term> subs) {
+        Term oldValue, t1, t2;
+        if (term1.equals(term2))    // for constant, also shortcut for variable and compound
+            return subs;
+        if ((term1 instanceof Variable) && (((Variable) term1).getType() == type))  // the first Term is a unifiable Variable
+            return findSubstituteVar(type, (Variable) term1, term2, subs, true);
+        if ((term2 instanceof Variable) && (((Variable) term2).getType() == type))  // the second Term is a unifiable Variable
+            return findSubstituteVar(type, (Variable) term2, term1, subs, false);
+        if (term1 instanceof CompoundTerm) {
+            if (!term1.getClass().equals(term2.getClass()))   // two compounds must be of the same type to be unified
+                return null;
+            if (!(((CompoundTerm) term1).size() == ((CompoundTerm) term2).size())) // two compounds must be of the same size, too
+                return null;
+            for (int i = 0; i < ((CompoundTerm) term1).size(); i++) {   // recursively unify components
+                t1 = ((CompoundTerm) term1).componentAt(i);
+                t2 = ((CompoundTerm) term2).componentAt(i);
+                HashMap<String,Term> newSubs = findSubstitute(type, t1, t2, subs);
+                if (newSubs == null)            // fails in one component means no substitution
+                    return null;
+                subs.putAll(newSubs);       // put new mappings into the table
+            }
+            return subs;     // solve: <x,x,2> and <y,3,y>
+        }
+        return null;
+    }
+    
+    /**
+     * To find a substitution that can unify a Vriable and a Term
+     * @param type The type of Variable to be substituted
+     * @param var The Variable to be unified
+     * @param term The Term to be unified
+     * @param subs The substitution formed so far
+     * @param first If it is the first Term in unify
+     * @return The substitution that unifies the two Terms, as "name-term" pairs
+     */
+    private static HashMap<String,Term> findSubstituteVar(VarType type, Variable var, Term term, HashMap<String,Term> subs, boolean first) {
+        String name1 = var.getVarName(first);    // make a prefixed name for the avriable
+        Term oldTerm = subs.get(name1);          // check if a mapping for that name exist
+        if (oldTerm != null) {                  // processed variable
+            if (first)
+                return findSubstitute(type, oldTerm, term, subs);
+            else
+                return findSubstitute(type, term, oldTerm, subs);
+        } else {                                // novel variable
+            if (term instanceof Variable) {     // the other is also a variable
+                String name2 = ((Variable) term).getVarName(!first);
+                oldTerm = subs.get(name2);       
+                if (oldTerm != null) {          // if the other has a substitute
+                    if (first)
+                        return findSubstitute(type, var, oldTerm, subs);
+                    else
+                        return findSubstitute(type, oldTerm, var, subs);
+                }
+            }
+            subs.put(name1, term);  // check dependency for dependent variable!!!
+            return subs;
+        }
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/language/package.html b/open-nars/com/googlecode/opennars/language/package.html
new file mode 100644
index 0000000..4fb4628
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/package.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<body bgcolor="white">
+
+Terms in Narsese, a formal language
+
+<h2>Package Specification</h2>
+
+NARS 4.3 implements the following formal language, Narsese.
+<pre>
+           &lt;sentence&gt; ::= &lt;judgment&gt;
+                        | &lt;question&gt;
+                        | &lt;goal&gt;
+           &lt;judgment&gt; ::= &lt;statement&gt; &lt;truth-value&gt;
+           &lt;question&gt; ::= &lt;statement&gt;
+               &lt;goal&gt; ::= &lt;statement&gt; &lt;desire-value&gt;
+          &lt;statement&gt; ::= &lt;&lt;term&gt; &lt;relation&gt; &lt;term&gt;&gt;
+                        | &lt;compound-statement&gt;
+                        | &lt;term&gt;
+               &lt;term&gt; ::= &lt;word&gt;
+                        | &lt;variable&gt;
+                        | &lt;compound-term&gt;
+                        | &lt;statement&gt;
+           &lt;relation&gt; ::= -->
+                        | <->
+                        | {--
+                        | --]
+                        | {-]
+                        | ==>
+                        | <=>
+                        | =/>
+                        | =\>
+                        | &lt;/>
+ &lt;compound-statement&gt; ::= (-- &lt;statement&gt;)
+                        | (|| &lt;statement&gt; &lt;statement&gt;<sup>+</sup>)
+                        | (&& &lt;statement&gt; &lt;statement&gt;<sup>+</sup>)
+                        | (&/ &lt;statement&gt; &lt;statement&gt;<sup>+</sup>)
+                        | (/> &lt;statement&gt;)
+                        | (\> &lt;statement&gt;)
+      &lt;compound-term&gt; ::= {&lt;term&gt;<sup>+</sup>}
+                        | [&lt;term&gt;<sup>+</sup>]
+                        | (& &lt;term&gt; &lt;term&gt;<sup>+</sup>)
+                        | (| &lt;term&gt; &lt;term&gt;<sup>+</sup>)
+                        | (- &lt;term&gt; &lt;term&gt;)
+                        | (~ &lt;term&gt; &lt;term&gt;)
+                        | (* &lt;term&gt; &lt;term&gt;<sup>+</sup>)
+                        | (/ &lt;term&gt;<sup>+</sup> _ &lt;term&gt;<sup>*</sup>)
+                        | (\ &lt;term&gt;<sup>+</sup> _ &lt;term&gt;<sup>*</sup>)
+           &lt;variable&gt; ::= &lt;dependent-var&gt;
+                        | &lt;independent-var&gt;
+                        | &lt;query-var&gt;
+      &lt;dependent-var&gt; ::= #&lt;word&gt;(&lt;independent-var&gt;<sup>*</sup>)
+    &lt;independent-var&gt; ::= #&lt;word&gt;
+          &lt;query-var&gt; ::= ?&lt;word&gt;
+               &lt;word&gt; : string in an alphabet
+        &lt;truth-value&gt; : a pair of real numbers in [0, 1] x (0, 1)
+       &lt;desire-value&gt; : a pair of real numbers in [0, 1] x (0, 1)
+</pre>
+
+Major methods in the term classes:
+<ul>
+<li>constructors</li>
+<li>get and set</li>
+<li>clone, compare, and unify</li>
+<li>create and access corresponding concept</li>
+<li>structural operation in compound</li>
+<li>class-specific inference</li>
+</ul>
+
+</body>
+</html>
diff --git a/open-nars/com/googlecode/opennars/main/Memory.java b/open-nars/com/googlecode/opennars/main/Memory.java
new file mode 100644
index 0000000..5c73d4d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/main/Memory.java
@@ -0,0 +1,462 @@
+/*
+ * Memory.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.main;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.inference.*;
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.operation.Operator;
+import com.googlecode.opennars.parser.*;
+import com.googlecode.opennars.parser.narsese.NarseseParser;
+import com.googlecode.opennars.storage.*;
+
+/**
+ * The memory of the system.
+ */
+public class Memory extends Observable {
+	
+	private Parameters parameters;
+	private RuleTables ruletables;
+	public BudgetFunctions budgetfunctions;
+    
+    /* ---------- all members have limited space ---------- */
+    
+    /**
+     * Concept bag. Containing all Concepts of the system.
+     */
+    private ConceptBag concepts;
+    
+    /**
+     * Operators (built-in terms) table. Accessed by name.
+     */
+    private HashMap<String, Operator> operators;
+    
+    // There is no global Term table, which may ask for unlimited space.
+    
+    /**
+     * List of inference newTasks, to be processed in the next working cycle.
+     */
+    private ArrayList<Task> newTasks;
+    
+    /**
+     * New tasks to be processed in the near future.
+     */
+    private TaskBag taskBuffer;
+    
+    /* ---------- global variables used to reduce method arguments ---------- */
+    
+    /**
+     * Shortcut to the selected Term.
+     */
+    public Term currentTerm;
+    
+    /**
+     * Shortcut to the selected TaskLink.
+     */
+    public TaskLink currentTaskLink;
+    
+    /**
+     * Shortcut to the selected Task.
+     */
+    public Task currentTask;
+    
+    /**
+     * Shortcut to the selected TermLink.
+     */
+    public TermLink currentBeliefLink;
+    
+    /**
+     * Shortcut to the selected belief (Sentence).
+     */
+    public Judgement currentBelief;
+    
+    public Base currentBase;
+    
+    /* ---------- initialization ---------- */
+    
+    /**
+     * Initialize a new memory by creating all members.
+     * <p>
+     * Called in Center.reset only
+     */
+    public Memory() {
+        init();
+        ruletables = new RuleTables(this);
+        budgetfunctions = new BudgetFunctions(this);
+    }
+    
+    public void reset() {
+    	init();
+    }
+    
+    private void init() {
+    	concepts = new ConceptBag();         // initially empty
+        newTasks = new ArrayList<Task>();     // initially empty
+        taskBuffer = new TaskBag();       // initially empty
+        operators = Operator.setOperators(); // with operators created
+        parameters = new Parameters();
+    }
+    
+    /* ---------- access utilities ---------- */
+    
+    /**
+     * Get a Term for a given name of a Concept or Operator, called in StringParser and the make methods of compound terms.
+     * @param name the name of a concept or operator
+     * @return a Term or null (if no Concept/Operator has this name)
+     */
+    public Term nameToListedTerm(String name) {
+        Concept concept = concepts.get(name);
+        if (concept != null)
+            return concept.getTerm();           // Concept associated Term
+        return operators.get(name);
+    }
+    
+    /**
+     * Check if a string is an operator name, called in StringParser only.
+     * @param name the name of a possible operator
+     * @return the corresponding operator or null
+     */
+    public Operator nameToOperator(String name) {
+        return operators.get(name);
+    }
+    
+    /**
+     * Add a new operator with the given name
+     * @param op the operator
+     * @param name the operator's name. Should begin with ^.
+     */
+    public void addOperatorWithName(Operator op, String name) {
+    	operators.put(name, op);
+    }
+    
+    /**
+     * Remove the operator with the given name
+     * @param name the operator's name
+     */
+    public void removeOperatorWithName(String name) {
+    	operators.remove(operators.get(name));
+    }
+    
+    /**
+     * Return the parameters of this reasoner
+     * @return the parameters
+     */
+    public Parameters getParameters() {
+    	return parameters;
+    }
+
+    /**
+     * Return an ArrayList of the Concepts this reasoner knows about
+     * @return the concepts
+     */
+    public ArrayList<Concept> getAllConcepts() {
+    	return this.concepts.getAllContents();
+    }
+    
+    public HashMap<String,Concept> getConceptMap() {
+    	return this.concepts.getNameTable();
+    }
+    
+    public Task getCurrentTask() {
+    	return this.currentTask;
+    }
+    
+    /**
+     * Return an ArrayList of the Tasks this reasoner is working on
+     * @return the tasks
+     */
+    public ArrayList<Task> getAllTasks() {
+    	return this.taskBuffer.getAllContents();
+    }
+
+	/**
+	 * @return the ruletables
+	 */
+	public RuleTables getRuletables() {
+		return ruletables;
+	}
+
+	/**
+     * Get an existing Concept for a given name, called from Term and ConceptWindow.
+     * @param name the name of a concept
+     * @return a Concept or null
+     */
+    public Concept nameToConcept(String name) {
+        return concepts.get(name);
+    }
+    
+    /**
+     * Get an existing Concept for a given Term.
+     * @param term The Term naming a concept
+     * @return a Concept or null
+     */
+    public Concept termToConcept(Term term) {
+        return nameToConcept(term.getName());
+    }
+    
+    /**
+     * Get the Concept associated to a Term, or creat it.
+     * @param term indicating the concept
+     * @return an existing Concept, or a new one
+     */
+    public Concept getConcept(Term term) {
+        String n = term.getName();
+        Concept concept = concepts.get(n);
+        if (concept == null)
+            concept = new Concept(term, this);        // the only place to make a new Concept
+        return concept;
+    }
+    
+    /**
+     * Adjust the activation level of a Concept or Operator, called in Concept only.
+     * @param c the concept to be adusted
+     * @param b the new BudgetValue
+     */
+    public void activateConcept(Concept c, BudgetValue b) {
+        BudgetValue budget;
+        if (concepts.contains(c)) {     // listed Concept
+            concepts.pickOut(c.getKey());
+            this.budgetfunctions.activate(c, b);
+            concepts.putBack(c);
+        } else {                        // new Concept
+            this.budgetfunctions.activate(c, b);
+            concepts.putIn(c);
+        }
+    }
+    
+    /* ---------- new task entries ---------- */
+    
+    // There are three types of new tasks: (1) input, (2) derived, (3) activated
+    // They are all added into the newTasks list, to be processed in the next cycle.
+    // Some of them are reported and/or logged.
+    
+    /**
+     * Input task comes from the InputWindow.
+     * @param str the input line
+     */
+    public void inputStringWithParser(String str, Parser parser) throws InvalidInputException {
+        Task task = parser.parseTask(str, this);       // the only place to call StringParser
+        if (task != null) {
+            if (task.aboveThreshold()) {                       // set a threshold?
+                report(task.getSentence(), true);             // report input
+                newTasks.add(task);       // wait to be processed in the next cycle
+            }
+        }
+    }
+    
+    /**
+     * Input task from some source
+     * @param task the task to add
+     */
+    public void inputTask(Task task) {
+    	if (task != null) {
+            if (task.aboveThreshold()) {                       // set a threshold?
+                report(task.getSentence(), true);             // report input
+                newTasks.add(task);       // wait to be processed in the next cycle
+            }
+        }
+    }
+    
+    /**
+     * Derived task comes from the inference rules.
+     * @param task the derived task
+     */
+    private void derivedTask(Task task) {
+        if (task.aboveThreshold()) {
+            float budget = task.getBudget().singleValue();
+            float minSilent = parameters.SILENT_LEVEL / 100.0f;
+            if (budget > minSilent)
+                report(task.getSentence(), false);        // report significient derived Tasks
+            newTasks.add(task);
+        }
+    }
+    
+    /**
+     * Reporting executed task, called from Concept.directOperation.
+     * @param task the executed task
+     */
+    public void executedTask(Task task) {   // called by the inference rules
+        float budget = task.getBudget().singleValue();
+        float minSilent = parameters.SILENT_LEVEL / 100.0f;
+        if (budget > minSilent)
+            report(task.getSentence(), false);
+    }
+    
+    /**
+     * Activated task comes from MatchingRules.
+     * @param budget The budget value of the new Task
+     * @param sentence The content of the new Task
+     * @param isInput Whether the question is input
+     */
+    public void activatedTask(BudgetValue budget, Sentence sentence, boolean isInput) {
+        Task task = new Task(sentence, budget, this);
+        newTasks.add(task);
+    }
+    
+    /* --------------- new task building --------------- */
+    
+    /**
+     * Shared final operations by all double-premise rules, called from the rules except StructuralRules
+     * @param budget The budget value of the new task
+     * @param content The content of the new task
+     * @param truth The truth value of the new task
+     */
+    public void doublePremiseTask(BudgetValue budget, Term content, TruthValue truth) {
+        Sentence newSentence = Sentence.make(currentTask.getSentence(), content, truth, this.currentBase, this);
+        Task newTask = new Task(newSentence, budget, this);
+        derivedTask(newTask);
+    }
+    
+    /**
+     * Shared final operations by all single-premise rules, called in StructuralRules
+     * @param budget The budget value of the new task
+     * @param content The content of the new task
+     * @param truth The truth value of the new task
+     */
+    public void singlePremiseTask(BudgetValue budget, Term content, TruthValue truth) {
+        Sentence sentence = currentTask.getSentence();
+        Sentence newSentence = Sentence.make(sentence, content, truth, sentence.getBase(), this);
+        Task newTask = new Task(newSentence, budget, this);
+        newTask.setStructual();
+        derivedTask(newTask);
+    }
+
+    /**
+     * Shared final operations by all single-premise rules, called in MatchingRules
+     * @param budget The budget value of the new task
+     * @param truth The truth value of the new task
+     */
+    public void singlePremiseTask(TruthValue truth, BudgetValue budget) {
+        Term content = this.currentTask.getContent();
+        Base base = this.currentBelief.getBase();
+        Sentence newJudgment = Sentence.make(content, Symbols.JUDGMENT_MARK, truth, base, this);
+        Task newTask = new Task(newJudgment, budget, this);
+        newTask.setStructual();
+        derivedTask(newTask);
+    }
+    
+    /* ---------- system working cycle ---------- */
+    
+    /**
+     * An atomic working cycle of the system. Called from Center only.
+     */
+    public void cycle() {
+        processTask();      // tune relative frequency?
+        processConcept();   // use this order to check the new result
+    }
+    
+    /**
+     * Process the newTasks accumulated in the previous cycle, accept input ones
+     * and those that corresponding to existing concepts, plus one from the buffer.
+     */
+    private void processTask() {
+        Task task;
+        int counter = newTasks.size();              // don't include new tasks produced in the current cycle
+        while (counter-- > 0) {                     // process the newTasks of the previous cycle
+            task = (Task) newTasks.remove(0);
+            if (task.getSentence().isInput() || (termToConcept(task.getContent()) != null))  // new input or existing concept
+                immediateProcess(task);                   // immediate process
+            else
+                taskBuffer.putIn(task);             // postponed process
+        }
+        task = (Task) taskBuffer.takeOut();         // select a task from taskBuffer
+        if (task != null)
+            immediateProcess(task);                       // immediate process
+    }
+    
+    /**
+     * Select a concept to fire.
+     */
+    private void processConcept() {
+        Concept currentConcept = (Concept) concepts.takeOut();
+        if (currentConcept != null) {
+            currentTerm = currentConcept.getTerm();
+            concepts.putBack(currentConcept);   // current Concept remains in the bag all the time
+            currentConcept.fire();              // a working cycle
+        }
+    }
+    
+    /* ---------- task / belief insertion ---------- */
+    
+    /**
+     * Imediate processing of a new task
+     * @param task the task to be accepted
+     */
+    private void immediateProcess(Task task) {
+        Term content = task.getContent();
+        if (content.isConstant()) {                        // does not creat concept for Query?
+            Concept c = getConcept(content);
+            c.directProcess(task);
+        }
+        if (task.aboveThreshold())
+            continuedProcess(task, content);
+    }
+
+    /**
+     * Link to a new task from all relevant concepts for distributed processing.
+     * @param task The task to be linked
+     * @param content The content of the task
+     */
+    private void continuedProcess(Task task, Term content) {
+        TaskLink tLink;
+        Concept c1 = null;                      // local Concept
+        BudgetValue budget = task.getBudget();
+        if (content.isConstant()) {
+            c1 = getConcept(content);
+            tLink = new TaskLink(task, null, budget, this);   // link type SELF
+            c1.insertTaskLink(tLink);
+        }
+        if (content instanceof CompoundTerm) {
+            Term component;                     // component term
+            Concept c2;                         // component concept
+            TermLink cLink1, cLink2;     // a pair of compound/component links
+            ArrayList<TermLink> cLinks;  // link list
+            cLinks = (c1 != null) ? c1.getTermLinks() : ((CompoundTerm) content).prepareComponentLinks(this);  // use saved
+            short[] indices;
+            BudgetValue subBudget = this.budgetfunctions.distributeAmongLinks(budget, cLinks.size());
+            if (!subBudget.aboveThreshold())
+                return;
+            for (TermLink cLink0 : cLinks) {
+                component = cLink0.getTarget();
+                c2 = getConcept(component);
+                if (!(task.isStructual() && (cLink0.getType() == TermLink.TRANSFORM))) {
+                    tLink = new TaskLink(task, cLink0, subBudget, this);
+                    c2.insertTaskLink(tLink);               // component link to task
+                }
+            }
+        }
+    }
+    
+    /* ---------- report ---------- */
+    
+    /**
+     * Display selected task.
+     * @param sentence the sentence to be displayed
+     * @param input whether the task is input
+     */
+    public void report(Sentence sentence, boolean input) {
+    	this.setChanged();
+        notifyObservers(sentence);
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/main/Parameters.java b/open-nars/com/googlecode/opennars/main/Parameters.java
new file mode 100644
index 0000000..2657b70
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/main/Parameters.java
@@ -0,0 +1,103 @@
+/*
+ * Parameters.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.main;
+
+/**
+ * Collected system parameters. To be modified before compiling.
+ */
+public class Parameters {
+    
+    /* ---------- initial values of run-time adjustable parameters ---------- */
+
+    /** Concept decay rate, in [1, 99]. */
+    public static final int CONCEPT_DEFAULT_FORGETTING_CYCLE = 3;
+    /** TaskLink decay rate, in [1, 99]. */
+    public static final int TASK_DEFAULT_FORGETTING_CYCLE = 10;
+    /** CompositionLink decay rate, in [1, 99]. */
+    public static final int BELIEF_DEFAULT_FORGETTING_CYCLE = 50;
+       
+    /** Silent threshold for task reporting, in [0, 100]. */
+    public int SILENT_LEVEL = 100;
+
+    /* ---------- parameters fixed after compiling --- logical ---------- */
+
+    /** Horizon, the amount of evidence coming in the near future. */
+    public static final int NEAR_FUTURE = 1;    // or 2, can be float
+    
+    /** Default confidence of input judgment. */
+    public float DEFAULT_JUDGMENT_CONFIDENCE = (float) 0.9;  // ?
+
+    /* Default priority and durability of input judgment */
+    public  final float DEFAULT_JUDGMENT_PRIORITY = (float) 0.8;
+    public  final float DEFAULT_JUDGMENT_DURABILITY = (float) 0.8;
+    public  final float DEFAULT_GOAL_PRIORITY = (float) 0.9;
+    public  final float DEFAULT_GOAL_DURABILITY = (float) 0.7;
+    public  final float DEFAULT_QUESTION_PRIORITY = (float) 0.9;
+    public  final float DEFAULT_QUESTION_DURABILITY = (float) 0.7;
+    
+//    public  final float TASK_FOR_NEW_CONCEPT_DISCOUNT = (float) 0.2;  // ?
+    
+    // belief component priority rate
+    public  final float DEFAULT_COMPONENT_PRIORITY_RATE = (float) 0.7;
+    
+    /**
+     * Level granularity in Bag, two digits
+     */
+    public static final int BAG_LEVEL = 100;
+    /**
+     * Level separation in Bag, one digit, both for display (run-time adjustable) and management (fixed)
+     */
+    public static final int BAG_THRESHOLD = 10;         
+
+    /* ---------- parameters fixed after compiling --- time management ---------- */
+    
+    // time distribution
+    public static final int COLD_TASK_DELAY_STEPS = 10;                 // ?
+
+    // decay rate, within 100
+    public static final int NEW_TASK_DEFAULT_FORGETTING_CYCLE = 1;        // ?
+
+    // quality updating rate
+    public static final float DEFAULT_QUALITY_UPDATE_RATE = (float) 0.01; // percent of updating
+    
+    // maximum bLinks tried for each tLink (to avoid repeated inference)
+    public static final int MAX_TAKE_OUT_K_LINK = 10;
+    
+    // maximum belief tried for each task (to avoid overlapping evidence)
+    public static final int MAX_TAKE_OUT_BELIEF = 5;
+    
+    /* ---------- parameters fixed after compiling --- space management ---------- */
+
+    // bag size
+    public static final int CONCEPT_BAG_SIZE = 1000;         // vocabulary?
+    public static final int TASK_BUFFER_SIZE = 20;          // "7+-2"?
+    public static final int TASK_BAG_SIZE = 20;              // ?
+    public static final int BELIEF_BAG_SIZE = 100;        // ?
+    
+    // other storage size
+    public static final int MAXMUM_LABEL_RECORD_LENGTH = 16;    // should be pow(2,n)
+    public static final int TASK_INFERENCE_RECORD_LENGTH = 20;  // ?
+    public static final int MAXMUM_BELIEF_LENGTH = 8;      // duplicate links
+    public static final int MAXMUM_GOALS_LENGTH = 5;       // duplicate links
+    
+    public static final float LOAD_FACTOR = 0.5f;   // bag hashtable parameter
+}
diff --git a/open-nars/com/googlecode/opennars/main/Reasoner.java b/open-nars/com/googlecode/opennars/main/Reasoner.java
new file mode 100644
index 0000000..3bc63dd
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/main/Reasoner.java
@@ -0,0 +1,241 @@
+/**
+ * 
+ */
+package com.googlecode.opennars.main;
+
+import java.util.ArrayList;
+import java.util.Observable;
+import java.util.Observer;
+
+import com.googlecode.opennars.entity.BudgetValue;
+import com.googlecode.opennars.entity.Concept;
+import com.googlecode.opennars.entity.Sentence;
+import com.googlecode.opennars.entity.Task;
+import com.googlecode.opennars.operation.Operator;
+import com.googlecode.opennars.parser.InvalidInputException;
+import com.googlecode.opennars.parser.Parser;
+import com.googlecode.opennars.parser.narsese.NarseseParser;
+
+/**
+ * The Reasoner class implements a threaded NARS reasoner.
+ * @author jgeldart
+ *
+ */
+public class Reasoner extends Observable implements Observer, Runnable {
+	
+	private Thread thread;
+	private Memory memory;
+	private Parser parser;
+	private ArrayList<Task> inputQueue;
+	
+	/**
+	 * Create a new reasoner using default settings
+	 */
+	public Reasoner() {
+		parser = new NarseseParser();
+		memory = new Memory();
+		memory.addObserver(this);
+		inputQueue = new ArrayList<Task>();
+	}
+	
+	/**
+	 * Creates a new reasoner with the given string parser
+	 * @param parser
+	 */
+	public Reasoner(Parser parser) {
+		super();
+		this.parser = parser;
+	}
+	
+	/**
+	 * Start the reasoner thread
+	 */
+	public void start() {
+		if(thread == null) {
+			thread = new Thread(this);
+			thread.start();
+		}
+	}
+	
+	/**
+	 * Stop the reasoner thread
+	 */
+	public void stop() {
+		thread = null;
+	}
+	
+	/**
+	 * Perform a single reasoning step
+	 */
+	public void step() {
+		try {
+			Task task = this.getTask();
+			if(task != null)
+				memory.inputTask(task);
+			memory.cycle();
+		} catch (Exception e) {
+			if(e instanceof InvalidInputException) {
+				this.hasChanged();
+				this.notifyObservers(e);
+			}
+			else {
+				//System.err.println(e.toString());
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	/**
+	 * Reset the reasoner back to 'factory defaults'
+	 */
+	public void reset() {
+		memory.reset();
+	}
+	
+	/* ----- communicating ----- */
+	
+	/**
+	 * Tell the reasoner a sentence string which is parsed using the chosen parser
+	 * @param sent the sentence
+	 */
+	public synchronized void tellSentenceString(String sent) {
+		try {
+			Task task = parser.parseTask(sent, memory);
+			inputQueue.add(task);
+		}
+		catch (InvalidInputException e) {
+			this.setChanged();
+			this.notifyObservers(e);
+		}
+	}
+	
+	/**
+	 * Tell the reasoner a sentence with the given budget for working with it
+	 * @param sent the sentence
+	 * @param budget the budget
+	 */
+	public synchronized void tellSentence(Sentence sent, BudgetValue budget) {
+		Task task = new Task(sent, budget, memory);
+		inputQueue.add(task);
+	}
+	
+	/**
+	 * Tell the reasoner a sentence with the given priority, durability and quality needed
+	 * to allocate resources to the task
+	 * @param sent the sentence
+	 * @param priority the priority
+	 * @param durability the durability
+	 * @param quality the quality
+	 */
+	public synchronized void tellSentence(Sentence sent, float priority, float durability, float quality) {
+		Task task = new Task(sent, new BudgetValue(priority, durability, quality, memory), memory);
+		inputQueue.add(task);
+	}
+
+	private synchronized Task getTask() {
+		try {
+			return inputQueue.remove(0);
+		}
+		catch (IndexOutOfBoundsException e) {
+			return null;
+		}
+	}
+	
+	/* ----- setters and getters ----- */
+	
+	/**
+	 * Get the memory
+	 */
+	public Memory getMemory() {
+		return memory;
+	}
+	
+	/**
+	 * Returns the parser used to parse sentence strings
+	 * @return the parser
+	 */
+	public Parser getParser() {
+		return parser;
+	}
+	
+	/**
+	 * Set the parser used to parse sentence strings
+	 * @param parser the parser
+	 */
+	public void setParser(Parser parser) {
+		this.parser = parser;
+	}
+	
+	/**
+	 * Get the reasoner's parameters
+	 * @return the parameters
+	 */
+	public Parameters getParameters() {
+		return memory.getParameters();
+	}
+	
+	/**
+	 * Get all the concepts this reasoner currently knows about
+	 * @return the concepts
+	 */
+	public ArrayList<Concept> getConcepts() {
+		return memory.getAllConcepts();
+	}
+	
+	/**
+	 * Get all the tasks this reasoner currently knows about
+	 * @return the tasks
+	 */
+	public ArrayList<Task> getTasks() {
+		return memory.getAllTasks();
+	}
+	
+	/**
+	 * Get the current reasoning task
+	 * @return the task
+	 */
+	public Task getCurrentTask() {
+		return memory.getCurrentTask();
+	}
+	
+	/**
+	 * Fetch the operator with the given name
+	 * @param name the operator's name
+	 * @return the operator
+	 */
+	public Operator getOperatorWithName(String name) {
+		return memory.nameToOperator(name);
+	}
+	
+	/**
+	 * Add the operator with the given name
+	 * @param op the operator
+	 * @param name the name
+	 */
+	public void addOperatorWithName(Operator op, String name) {
+		memory.addOperatorWithName(op, name);
+	}
+	
+	/* ------ internals ------ */
+
+	/* (non-Javadoc)
+	 * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
+	 */
+	public void update(Observable o, Object arg) {
+		this.setChanged();
+		this.notifyObservers(arg);
+	}
+
+	public void run() {
+		Thread thisThread = Thread.currentThread();
+		while(thread == thisThread) {
+			try {
+				Thread.sleep(10);
+			} catch (InterruptedException e) {
+				
+			}
+			step();
+		}
+	}
+	
+}
diff --git a/open-nars/com/googlecode/opennars/main/package.html b/open-nars/com/googlecode/opennars/main/package.html
new file mode 100644
index 0000000..e2da9b9
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/main/package.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<body bgcolor="white">
+
+Top-level classes of the system
+
+<h2>Package Specification</h2>
+
+This package contains the top classes of the system.
+<p>
+<tt>NARS</tt> defines the application and applet. When NARS runs as an applet, it is for demonstration only, and certain functionalities are blocked.
+<p>
+<tt>Parameters</tt> collects all system parameters, which can be edited before compiling.
+<p>
+<tt>Memory</tt> maintains the work space of the system, including
+<ul>
+<li>a bag of concept,</li>
+<li>a look-up table of all built-in operators,</li>
+<li>a queue for new results to be processed in each cycle,</li>
+<li>a task buffer for new results to be processed in the future.</li>
+</ul>
+Each of the above occupies constant space.
+<p>
+Memory and all of its variables are static, so each is unique, and can be referred by name anywhere in the system.
+
+</body>
+</html>
diff --git a/open-nars/com/googlecode/opennars/operation/GoTo.java b/open-nars/com/googlecode/opennars/operation/GoTo.java
new file mode 100644
index 0000000..d222204
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/operation/GoTo.java
@@ -0,0 +1,41 @@
+/*
+ * GoTo.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.operation;
+
+import java.io.*;
+
+import com.googlecode.opennars.entity.Task;
+
+/**
+ * A class used in testing only.
+ */
+public class GoTo extends Operator {
+    public GoTo(String name) {
+        super(name);
+    }
+    
+    public Object execute(Task task) {
+        System.out.println("EXECUTE in " + name + " " + task);
+        return null;
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/operation/Open.java b/open-nars/com/googlecode/opennars/operation/Open.java
new file mode 100644
index 0000000..b6f7bbb
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/operation/Open.java
@@ -0,0 +1,42 @@
+/*
+ * Open.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.operation;
+
+import java.io.*;
+
+import com.googlecode.opennars.entity.Task;
+
+/**
+ * A class used in testing only.
+ */
+public class Open extends Operator {
+    public Open(String name) {
+        super(name);
+    }
+
+    public Object execute(Task task) {
+        System.out.println("EXECUTE in " + name + " " + task);
+        return null;
+    }
+}
+
+
diff --git a/open-nars/com/googlecode/opennars/operation/Operator.java b/open-nars/com/googlecode/opennars/operation/Operator.java
new file mode 100644
index 0000000..0a394b3
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/operation/Operator.java
@@ -0,0 +1,53 @@
+/*
+ * Operator.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.operation;
+
+import java.util.*;
+import java.io.*;
+
+import com.googlecode.opennars.entity.Task;
+import com.googlecode.opennars.language.Term;
+
+/**
+ * An individual operator that can be execute by the system.
+ * The only file to modify when adding a new operator into NARS
+ */
+public abstract class Operator extends Term {
+    public Operator(String name) {
+        super(name);
+    }
+    
+    // required method for every operation
+    public abstract Object execute(Task task);
+
+    // register the operators in the memory
+    // the only method to modify when adding a new operator into NARS
+    // an operator should contain at least two characters after "^""
+    public static HashMap<String, Operator> setOperators() {
+        HashMap<String, Operator> table = new HashMap<String, Operator>();
+        table.put("^go-to", new GoTo("^go-to"));
+        table.put("^pick", new Pick("^pick"));
+        table.put("^open", new Open("^open"));
+        return table;
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/operation/Pick.java b/open-nars/com/googlecode/opennars/operation/Pick.java
new file mode 100644
index 0000000..fc2c6ea
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/operation/Pick.java
@@ -0,0 +1,40 @@
+/*
+ * Pick.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.operation;
+
+import java.io.*;
+
+import com.googlecode.opennars.entity.Task;
+
+/**
+ * A class used in testing only.
+ */
+public class Pick extends Operator {
+    public Pick(String name) {
+        super(name);
+    }
+
+    public Object execute(Task task) {
+        System.out.println("EXECUTE in " + name + " " + task);
+        return null;
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/operation/package.html b/open-nars/com/googlecode/opennars/operation/package.html
new file mode 100644
index 0000000..903b312
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/operation/package.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<body bgcolor="white">
+
+Built-in operators
+
+<h2>Package Specification</h2>
+
+The built-in operator classes are all subclasses of <tt>Operator</tt>, which extends <tt>Term</tt>.
+<p>
+Each built-in operator must implement a method <tt>execute</tt>, which takes a Task as argument.
+<p>
+All built-in operators are registered in class <tt>Operator</tt>.
+
+</body>
+</html>
diff --git a/open-nars/com/googlecode/opennars/overview.html b/open-nars/com/googlecode/opennars/overview.html
new file mode 100644
index 0000000..8dbb004
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/overview.html
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>NARS</head>
+    <body bgcolor="white">
+
+        NARS overview
+
+        <h2>Package Specification</h2>
+
+        The code for distribution is in <tt>NARS.jar</tt>, which works both as an application (full mode) and an applet 
+        (demo mode, with simplified display).
+
+    </body>
+</html>
diff --git a/open-nars/com/googlecode/opennars/parser/InvalidInputException.java b/open-nars/com/googlecode/opennars/parser/InvalidInputException.java
new file mode 100644
index 0000000..6b3aa5f
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/InvalidInputException.java
@@ -0,0 +1,31 @@
+package com.googlecode.opennars.parser;
+
+/**
+ * An input exception from a NARS parser.
+ * @author jgeldart
+ *
+ */
+public class InvalidInputException extends Exception {
+
+	/**
+	 * Autogenerated serial code
+	 */
+	private static final long serialVersionUID = 325617403436238787L;
+
+	public InvalidInputException() {
+		super("Unknown input error");
+	}
+
+	public InvalidInputException(String message) {
+		super(message);
+	}
+
+	public InvalidInputException(Throwable cause) {
+		super(cause);
+	}
+
+	public InvalidInputException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/Parser.java b/open-nars/com/googlecode/opennars/parser/Parser.java
new file mode 100644
index 0000000..2589a36
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/Parser.java
@@ -0,0 +1,17 @@
+package com.googlecode.opennars.parser;
+
+import com.googlecode.opennars.entity.Task;
+import com.googlecode.opennars.main.Memory;
+
+public abstract class Parser extends Symbols {
+
+	/**
+	 * The only public (static) method of the class, called from Memory.inputTask.
+	 * @param buffer the single-line input String
+	 * @param memory the memory object doing the parsing
+	 * @return an input Task, or null if the input line cannot be parsed into a Task
+	 * @throws InvalidInputException 
+	 */
+	public abstract Task parseTask(String input, Memory memory) throws InvalidInputException;
+	
+}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/parser/loan/loan.g b/open-nars/com/googlecode/opennars/parser/loan/loan.g
new file mode 100644
index 0000000..e76fa96
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/loan.g
@@ -0,0 +1,474 @@
+grammar loan;
+
+options {
+	output = AST;
+}
+
+// $<Parser
+
+document 
+	:	base_rule? (at_rule | sentence)* EOF;
+	
+base_rule 
+	:	AT_BASE^ IRI_REF DOT!
+	;
+
+at_rule :	AT_IMPORT^ IRI_REF DOT!
+	|	AT_PREFIX^ PNAME_NS IRI_REF DOT!
+	|	AT_DELAY^ LPAREN! INTEGER RPAREN! DOT!
+	;
+
+sentence 
+	:	statement (judgement^|question^|goal^)
+	;
+	
+judgement 
+	:	DOT^ truthvalue?
+	;
+	
+goal	:	EXCLAMATION^ truthvalue?
+	;
+	
+question 
+	:	QUESTION^
+	;
+	
+truthvalue 
+	:	PERCENT! (DECIMAL | INTEGER) (SEMICOLON DECIMAL)? PERCENT!;
+
+statement 
+	:	unary_statement ((CONJ^ | SEMICOLON^ | COMMA^ | DISJ^) unary_statement)*
+	;
+	
+unary_statement 
+	:	NOT simple_statement
+	|	PAST simple_statement
+	|	PRESENT simple_statement
+	|	FUTURE simple_statement
+	|	simple_statement
+	;
+	
+simple_statement 
+	:	term ((INHERITANCE^ | SIMILARITY^ | INSTANCE^ | PROPERTY^ | INSTANCE_PROPERTY^ | IMPLICATION^ | IMPLICATION_PRED^ | IMPLICATION_RETRO^ | IMPLICATION_CONC^ | EQUIVALENCE^ | EQUIVALENCE_PRED^ | EQUIVALENCE_CONC^) term)?
+	;
+	
+	
+term 	:	difference ((AMPERSAND^ | BAR^) difference)*
+	;
+
+ext_set :	OPEN_BRACE^ (term (COMMA! term)*)? CLOSE_BRACE!
+	;
+	
+int_set :	LBRACKET^ (term (COMMA! term)*)? RBRACKET!
+	;
+	
+difference 
+	:	product ((MINUS^ | TILDE^) product)*
+	;
+	
+product :	atomic_term (STAR^ atomic_term)*
+	;
+
+atomic_term 
+	:	ext_set
+	|	int_set
+	|	LPAREN! statement RPAREN!
+	|	variable
+	|	iriRef
+	|	literal
+	;
+	
+variable 
+	:	query_variable
+	|	statement_variable
+	;
+	
+query_variable 
+	:	QUERY_VAR
+	;
+	
+statement_variable 
+	:	STM_VAR
+	;
+	
+	
+	
+literal
+	:	numericLiteral
+	|	booleanLiteral
+	|	string
+	;
+	
+numericLiteral
+    : numericLiteralUnsigned | numericLiteralPositive | numericLiteralNegative
+    ;
+
+numericLiteralUnsigned
+    : INTEGER
+    | DECIMAL
+    | DOUBLE
+    ;
+
+numericLiteralPositive
+    : INTEGER_POSITIVE
+    | DECIMAL_POSITIVE
+    | DOUBLE_POSITIVE
+    ;
+
+numericLiteralNegative
+    : INTEGER_NEGATIVE
+    | DECIMAL_NEGATIVE
+    | DOUBLE_NEGATIVE
+    ;
+
+booleanLiteral
+    : TRUE
+    | FALSE
+    ;
+
+string
+    : STRING_LITERAL1
+    | STRING_LITERAL2
+    | STRING_LITERAL_LONG1
+    | STRING_LITERAL_LONG2
+    ;
+
+iriRef
+    : IRI_REF
+    | prefixedName
+    ;
+
+prefixedName
+    : PNAME_LN
+    | PNAME_NS
+    ;
+
+
+// $>
+
+// $<Lexer
+
+WS
+    : (' '| '\t'| EOL)+ { $channel=HIDDEN; }
+    ;
+
+AT_IMPORT 
+	:	'@import'
+	;
+	
+AT_PREFIX 
+	:	'@prefix'
+	;
+	
+AT_BASE :	'@base'
+	;
+	
+AT_DELAY 
+	:	'@delay'
+	;
+
+protected    
+INHERITANCE 
+	:	'-->';
+
+protected	
+SIMILARITY
+	:	'<->';
+	
+protected
+INSTANCE 
+	:	'}->'
+	;
+	
+protected
+PROPERTY
+	:	'--['
+	;
+	
+protected
+INSTANCE_PROPERTY 
+	:	'}-['
+	;
+	
+protected
+IMPLICATION 
+	:	'==>'
+	;
+	
+protected
+IMPLICATION_PRED 
+	:	'=/>'
+	;
+	
+protected
+IMPLICATION_RETRO 
+	:	'=\\>'
+	;
+	
+protected
+IMPLICATION_CONC
+	:	'=|>'
+	;
+	
+protected
+EQUIVALENCE 
+	:	'<=>'
+	;
+	
+protected
+EQUIVALENCE_PRED 
+	:	'</>'
+	;
+	
+protected
+EQUIVALENCE_CONC 
+	:	'<|>'
+	;
+	
+NOT	:	'!!'
+	;
+	
+PAST	:	'\\>'
+	;
+	
+PRESENT	:	'|>'
+	;
+	
+FUTURE 	:	'/>'
+	;
+	
+CONJ	:	'&&'
+	;
+
+DISJ	:	'||'
+	;
+
+OPEN_BRACE
+	:	'{'
+	;
+
+CLOSE_BRACE
+	:	'}'
+	;
+	
+LPAREN	:	'('
+	;
+	
+RPAREN	:	')'
+	;
+	
+LBRACKET 
+	:	'['
+	;
+
+RBRACKET 
+	:	']'
+	;
+	
+
+
+PNAME_NS
+    : p=PN_PREFIX? ':'
+    ;
+
+PNAME_LN
+    : PNAME_NS PN_LOCAL
+    ;
+
+TRUE
+    : ('T'|'t')('R'|'r')('U'|'u')('E'|'e')
+    ;
+
+FALSE
+    : ('F'|'f')('A'|'a')('L'|'l')('S'|'s')('E'|'e')
+    ;
+
+IRI_REF
+    : LANGLE ( options {greedy=false;} : ~(LANGLE | RANGLE | '"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\' | '`' | ('\u0000'..'\u0020')) )* RANGLE { setText($text.substring(1, $text.length() - 1)); }
+    ;
+
+LANGTAG
+    : '@' PN_CHARS_BASE+ (MINUS (PN_CHARS_BASE DIGIT)+)*
+    ;
+    
+QUERY_VAR 
+	:	'?' PN_LOCAL
+	;
+	
+STM_VAR :	'#' PN_LOCAL ('(' (PN_LOCAL (',' PN_LOCAL)*)? ')')?
+	;
+
+INTEGER
+    : DIGIT+
+    ;
+
+DECIMAL
+    : DIGIT+ DOT DIGIT*
+    | DOT DIGIT+
+    ;
+
+DOUBLE
+    : DIGIT+ DOT DIGIT* EXPONENT
+    | DOT DIGIT+ EXPONENT
+    | DIGIT+ EXPONENT
+    ;
+
+INTEGER_POSITIVE
+    : PLUS INTEGER
+    ;
+
+DECIMAL_POSITIVE
+    : PLUS DECIMAL
+    ;
+
+DOUBLE_POSITIVE
+    : PLUS DOUBLE
+    ;
+
+INTEGER_NEGATIVE
+    : MINUS INTEGER
+    ;
+
+DECIMAL_NEGATIVE
+    : MINUS DECIMAL
+    ;
+
+DOUBLE_NEGATIVE
+    : MINUS DOUBLE
+    ;
+
+fragment
+EXPONENT
+    : ('e'|'E') (PLUS|MINUS)? DIGIT+
+    ;
+
+STRING_LITERAL1
+    : '\'' ( options {greedy=false;} : ~('\u0027' | '\u005C' | '\u000A' | '\u000D') | ECHAR )* '\''
+    ;
+
+STRING_LITERAL2
+    : '"'  ( options {greedy=false;} : ~('\u0022' | '\u005C' | '\u000A' | '\u000D') | ECHAR )* '"'
+    ;
+
+STRING_LITERAL_LONG1
+    :   '\'\'\'' ( options {greedy=false;} : ( '\'' | '\'\'' )? ( ~('\''|'\\') | ECHAR ) )* '\'\'\''
+    ;
+
+STRING_LITERAL_LONG2
+    :   '"""' ( options {greedy=false;} : ( '"' | '""' )? ( ~('"'|'\\') | ECHAR ) )* '"""'
+    ;
+
+fragment
+ECHAR
+    : '\\' ('t' | 'b' | 'n' | 'r' | 'f' | '\\' | '"' | '\'')
+    ;
+
+fragment
+PN_CHARS_U
+    : PN_CHARS_BASE | '_'
+    ;
+
+fragment
+VARNAME
+    : ( PN_CHARS_U | DIGIT ) ( PN_CHARS_U | DIGIT | '\u00B7' | '\u0300'..'\u036F' | '\u203F'..'\u2040' )*
+    ;
+
+fragment
+PN_CHARS
+    : PN_CHARS_U
+    | MINUS
+    | DIGIT
+    | '\u00B7' 
+    | '\u0300'..'\u036F'
+    | '\u203F'..'\u2040'
+    ;
+
+fragment
+PN_PREFIX
+    : PN_CHARS_BASE ((PN_CHARS|DOT)* PN_CHARS)?
+    ;
+
+fragment
+PN_LOCAL
+    : ( PN_CHARS_U | DIGIT ) ((PN_CHARS)* PN_CHARS)?
+    ;
+
+fragment
+PN_CHARS_BASE
+    : 'A'..'Z'
+    | 'a'..'z'
+    | '\u00C0'..'\u00D6'
+    | '\u00D8'..'\u00F6'
+    | '\u00F8'..'\u02FF'
+    | '\u0370'..'\u037D'
+    | '\u037F'..'\u1FFF'
+    | '\u200C'..'\u200D'
+    | '\u2070'..'\u218F'
+    | '\u2C00'..'\u2FEF'
+    | '\u3001'..'\uD7FF'
+    | '\uF900'..'\uFDCF'
+    | '\uFDF0'..'\uFFFD'
+    ;
+
+fragment
+DIGIT
+    : '0'..'9'
+    ;
+
+COMMENT 
+    : '//' ( options{greedy=false;} : .)* EOL { $channel=HIDDEN; }
+    ;
+
+fragment
+EOL
+    : '\n' | '\r'
+    ;
+
+REFERENCE
+    : '^^';
+ 
+EXCLAMATION
+	:	'!';
+	
+QUESTION 
+	:	'?';
+ 
+DOT	:	'.'
+	;
+	
+COMMA	:	','
+	;
+	
+//COLON	:	':'
+//	;
+	
+SEMICOLON
+	:	';'
+	;
+	
+AMPERSAND
+	:	'&';
+	
+BAR	:	'|'
+	;
+	
+LANGLE	:	'<'
+	;
+	
+RANGLE 	:	'>'
+	;
+	
+PERCENT	:	'%'
+	;
+	
+PLUS	:	'+'
+	;
+	
+MINUS	:	'-'
+	;
+	
+STAR	:	'*'
+	;
+	
+TILDE 	:	'~'
+	;
diff --git a/open-nars/com/googlecode/opennars/parser/loan/loan.tokens b/open-nars/com/googlecode/opennars/parser/loan/loan.tokens
new file mode 100644
index 0000000..61763b1
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/loan.tokens
@@ -0,0 +1,76 @@
+COMMA=20
+PN_CHARS_U=75
+MINUS=44
+PERCENT=16
+AT_PREFIX=8
+OPEN_BRACE=40
+DOUBLE=49
+AT_BASE=4
+EQUIVALENCE=35
+FALSE=57
+PN_CHARS_BASE=69
+EQUIVALENCE_CONC=37
+QUERY_VAR=47
+AT_DELAY=10
+LBRACKET=42
+INHERITANCE=26
+INSTANCE=28
+TILDE=45
+DECIMAL=17
+QUESTION=15
+CONJ=19
+DISJ=21
+IMPLICATION=31
+DOT=6
+STM_VAR=48
+RANGLE=68
+INTEGER=12
+IMPLICATION_RETRO=33
+FUTURE=25
+RBRACKET=43
+RPAREN=13
+PN_PREFIX=65
+EQUIVALENCE_PRED=36
+LANGLE=67
+LPAREN=11
+INSTANCE_PROPERTY=30
+ECHAR=74
+PLUS=73
+DIGIT=70
+AMPERSAND=38
+INTEGER_NEGATIVE=53
+PNAME_NS=9
+PAST=23
+SIMILARITY=27
+PROPERTY=29
+DECIMAL_POSITIVE=51
+STRING_LITERAL_LONG1=60
+IMPLICATION_PRED=32
+WS=64
+PNAME_LN=62
+LANGTAG=71
+EXCLAMATION=14
+PN_LOCAL=66
+VARNAME=76
+CLOSE_BRACE=41
+COMMENT=78
+PN_CHARS=77
+PRESENT=24
+AT_IMPORT=7
+STRING_LITERAL_LONG2=61
+DOUBLE_NEGATIVE=55
+EXPONENT=72
+SEMICOLON=18
+BAR=39
+DECIMAL_NEGATIVE=54
+IRI_REF=5
+DOUBLE_POSITIVE=52
+REFERENCE=79
+EOL=63
+INTEGER_POSITIVE=50
+STAR=46
+NOT=22
+STRING_LITERAL2=59
+TRUE=56
+STRING_LITERAL1=58
+IMPLICATION_CONC=34
diff --git a/open-nars/com/googlecode/opennars/parser/loan/loanLexer.java b/open-nars/com/googlecode/opennars/parser/loan/loanLexer.java
new file mode 100644
index 0000000..865e1e2
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/loanLexer.java
@@ -0,0 +1,3574 @@
+package com.googlecode.opennars.parser.loan;
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+public class loanLexer extends Lexer {
+    public static final int COMMA=20;
+    public static final int PN_CHARS_U=75;
+    public static final int MINUS=44;
+    public static final int AT_PREFIX=8;
+    public static final int PERCENT=16;
+    public static final int OPEN_BRACE=40;
+    public static final int DOUBLE=49;
+    public static final int EQUIVALENCE=35;
+    public static final int AT_BASE=4;
+    public static final int FALSE=57;
+    public static final int EQUIVALENCE_CONC=37;
+    public static final int PN_CHARS_BASE=69;
+    public static final int QUERY_VAR=47;
+    public static final int AT_DELAY=10;
+    public static final int LBRACKET=42;
+    public static final int INHERITANCE=26;
+    public static final int INSTANCE=28;
+    public static final int TILDE=45;
+    public static final int DECIMAL=17;
+    public static final int QUESTION=15;
+    public static final int CONJ=19;
+    public static final int DISJ=21;
+    public static final int IMPLICATION=31;
+    public static final int DOT=6;
+    public static final int STM_VAR=48;
+    public static final int RANGLE=68;
+    public static final int INTEGER=12;
+    public static final int IMPLICATION_RETRO=33;
+    public static final int FUTURE=25;
+    public static final int RBRACKET=43;
+    public static final int RPAREN=13;
+    public static final int PN_PREFIX=65;
+    public static final int EQUIVALENCE_PRED=36;
+    public static final int LANGLE=67;
+    public static final int LPAREN=11;
+    public static final int INSTANCE_PROPERTY=30;
+    public static final int ECHAR=74;
+    public static final int PLUS=73;
+    public static final int DIGIT=70;
+    public static final int AMPERSAND=38;
+    public static final int PAST=23;
+    public static final int PNAME_NS=9;
+    public static final int INTEGER_NEGATIVE=53;
+    public static final int SIMILARITY=27;
+    public static final int PROPERTY=29;
+    public static final int DECIMAL_POSITIVE=51;
+    public static final int STRING_LITERAL_LONG1=60;
+    public static final int IMPLICATION_PRED=32;
+    public static final int WS=64;
+    public static final int PNAME_LN=62;
+    public static final int EXCLAMATION=14;
+    public static final int LANGTAG=71;
+    public static final int PN_LOCAL=66;
+    public static final int CLOSE_BRACE=41;
+    public static final int VARNAME=76;
+    public static final int COMMENT=78;
+    public static final int PN_CHARS=77;
+    public static final int PRESENT=24;
+    public static final int AT_IMPORT=7;
+    public static final int DOUBLE_NEGATIVE=55;
+    public static final int STRING_LITERAL_LONG2=61;
+    public static final int SEMICOLON=18;
+    public static final int EXPONENT=72;
+    public static final int BAR=39;
+    public static final int DECIMAL_NEGATIVE=54;
+    public static final int IRI_REF=5;
+    public static final int EOF=-1;
+    public static final int DOUBLE_POSITIVE=52;
+    public static final int EOL=63;
+    public static final int REFERENCE=79;
+    public static final int Tokens=80;
+    public static final int INTEGER_POSITIVE=50;
+    public static final int STAR=46;
+    public static final int NOT=22;
+    public static final int TRUE=56;
+    public static final int STRING_LITERAL2=59;
+    public static final int STRING_LITERAL1=58;
+    public static final int IMPLICATION_CONC=34;
+    public loanLexer() {;} 
+    public loanLexer(CharStream input) {
+        super(input);
+    }
+    public String getGrammarFileName() { return "/Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g"; }
+
+    // $ANTLR start WS
+    public final void mWS() throws RecognitionException {
+        try {
+            int _type = WS;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:152:5: ( ( ' ' | '\\t' | EOL )+ )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:152:7: ( ' ' | '\\t' | EOL )+
+            {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:152:7: ( ' ' | '\\t' | EOL )+
+            int cnt1=0;
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( ((LA1_0>='\t' && LA1_0<='\n')||LA1_0=='\r'||LA1_0==' ') ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt1 >= 1 ) break loop1;
+                        EarlyExitException eee =
+                            new EarlyExitException(1, input);
+                        throw eee;
+                }
+                cnt1++;
+            } while (true);
+
+             channel=HIDDEN; 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end WS
+
+    // $ANTLR start AT_IMPORT
+    public final void mAT_IMPORT() throws RecognitionException {
+        try {
+            int _type = AT_IMPORT;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:156:2: ( '@import' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:156:4: '@import'
+            {
+            match("@import"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end AT_IMPORT
+
+    // $ANTLR start AT_PREFIX
+    public final void mAT_PREFIX() throws RecognitionException {
+        try {
+            int _type = AT_PREFIX;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:160:2: ( '@prefix' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:160:4: '@prefix'
+            {
+            match("@prefix"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end AT_PREFIX
+
+    // $ANTLR start AT_BASE
+    public final void mAT_BASE() throws RecognitionException {
+        try {
+            int _type = AT_BASE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:163:9: ( '@base' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:163:11: '@base'
+            {
+            match("@base"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end AT_BASE
+
+    // $ANTLR start AT_DELAY
+    public final void mAT_DELAY() throws RecognitionException {
+        try {
+            int _type = AT_DELAY;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:167:2: ( '@delay' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:167:4: '@delay'
+            {
+            match("@delay"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end AT_DELAY
+
+    // $ANTLR start INHERITANCE
+    public final void mINHERITANCE() throws RecognitionException {
+        try {
+            int _type = INHERITANCE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:172:2: ( '-->' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:172:4: '-->'
+            {
+            match("-->"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end INHERITANCE
+
+    // $ANTLR start SIMILARITY
+    public final void mSIMILARITY() throws RecognitionException {
+        try {
+            int _type = SIMILARITY;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:176:2: ( '<->' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:176:4: '<->'
+            {
+            match("<->"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end SIMILARITY
+
+    // $ANTLR start INSTANCE
+    public final void mINSTANCE() throws RecognitionException {
+        try {
+            int _type = INSTANCE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:180:2: ( '}->' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:180:4: '}->'
+            {
+            match("}->"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end INSTANCE
+
+    // $ANTLR start PROPERTY
+    public final void mPROPERTY() throws RecognitionException {
+        try {
+            int _type = PROPERTY;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:185:2: ( '--[' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:185:4: '--['
+            {
+            match("--["); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PROPERTY
+
+    // $ANTLR start INSTANCE_PROPERTY
+    public final void mINSTANCE_PROPERTY() throws RecognitionException {
+        try {
+            int _type = INSTANCE_PROPERTY;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:190:2: ( '}-[' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:190:4: '}-['
+            {
+            match("}-["); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end INSTANCE_PROPERTY
+
+    // $ANTLR start IMPLICATION
+    public final void mIMPLICATION() throws RecognitionException {
+        try {
+            int _type = IMPLICATION;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:195:2: ( '==>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:195:4: '==>'
+            {
+            match("==>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end IMPLICATION
+
+    // $ANTLR start IMPLICATION_PRED
+    public final void mIMPLICATION_PRED() throws RecognitionException {
+        try {
+            int _type = IMPLICATION_PRED;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:200:2: ( '=/>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:200:4: '=/>'
+            {
+            match("=/>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end IMPLICATION_PRED
+
+    // $ANTLR start IMPLICATION_RETRO
+    public final void mIMPLICATION_RETRO() throws RecognitionException {
+        try {
+            int _type = IMPLICATION_RETRO;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:205:2: ( '=\\\\>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:205:4: '=\\\\>'
+            {
+            match("=\\>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end IMPLICATION_RETRO
+
+    // $ANTLR start IMPLICATION_CONC
+    public final void mIMPLICATION_CONC() throws RecognitionException {
+        try {
+            int _type = IMPLICATION_CONC;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:210:2: ( '=|>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:210:4: '=|>'
+            {
+            match("=|>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end IMPLICATION_CONC
+
+    // $ANTLR start EQUIVALENCE
+    public final void mEQUIVALENCE() throws RecognitionException {
+        try {
+            int _type = EQUIVALENCE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:215:2: ( '<=>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:215:4: '<=>'
+            {
+            match("<=>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EQUIVALENCE
+
+    // $ANTLR start EQUIVALENCE_PRED
+    public final void mEQUIVALENCE_PRED() throws RecognitionException {
+        try {
+            int _type = EQUIVALENCE_PRED;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:220:2: ( '</>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:220:4: '</>'
+            {
+            match("</>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EQUIVALENCE_PRED
+
+    // $ANTLR start EQUIVALENCE_CONC
+    public final void mEQUIVALENCE_CONC() throws RecognitionException {
+        try {
+            int _type = EQUIVALENCE_CONC;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:225:2: ( '<|>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:225:4: '<|>'
+            {
+            match("<|>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EQUIVALENCE_CONC
+
+    // $ANTLR start NOT
+    public final void mNOT() throws RecognitionException {
+        try {
+            int _type = NOT;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:228:5: ( '!!' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:228:7: '!!'
+            {
+            match("!!"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end NOT
+
+    // $ANTLR start PAST
+    public final void mPAST() throws RecognitionException {
+        try {
+            int _type = PAST;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:231:6: ( '\\\\>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:231:8: '\\\\>'
+            {
+            match("\\>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PAST
+
+    // $ANTLR start PRESENT
+    public final void mPRESENT() throws RecognitionException {
+        try {
+            int _type = PRESENT;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:234:9: ( '|>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:234:11: '|>'
+            {
+            match("|>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PRESENT
+
+    // $ANTLR start FUTURE
+    public final void mFUTURE() throws RecognitionException {
+        try {
+            int _type = FUTURE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:237:9: ( '/>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:237:11: '/>'
+            {
+            match("/>"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end FUTURE
+
+    // $ANTLR start CONJ
+    public final void mCONJ() throws RecognitionException {
+        try {
+            int _type = CONJ;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:240:6: ( '&&' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:240:8: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end CONJ
+
+    // $ANTLR start DISJ
+    public final void mDISJ() throws RecognitionException {
+        try {
+            int _type = DISJ;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:243:6: ( '||' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:243:8: '||'
+            {
+            match("||"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DISJ
+
+    // $ANTLR start OPEN_BRACE
+    public final void mOPEN_BRACE() throws RecognitionException {
+        try {
+            int _type = OPEN_BRACE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:247:2: ( '{' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:247:4: '{'
+            {
+            match('{'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end OPEN_BRACE
+
+    // $ANTLR start CLOSE_BRACE
+    public final void mCLOSE_BRACE() throws RecognitionException {
+        try {
+            int _type = CLOSE_BRACE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:251:2: ( '}' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:251:4: '}'
+            {
+            match('}'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end CLOSE_BRACE
+
+    // $ANTLR start LPAREN
+    public final void mLPAREN() throws RecognitionException {
+        try {
+            int _type = LPAREN;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:254:8: ( '(' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:254:10: '('
+            {
+            match('('); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LPAREN
+
+    // $ANTLR start RPAREN
+    public final void mRPAREN() throws RecognitionException {
+        try {
+            int _type = RPAREN;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:257:8: ( ')' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:257:10: ')'
+            {
+            match(')'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RPAREN
+
+    // $ANTLR start LBRACKET
+    public final void mLBRACKET() throws RecognitionException {
+        try {
+            int _type = LBRACKET;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:261:2: ( '[' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:261:4: '['
+            {
+            match('['); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LBRACKET
+
+    // $ANTLR start RBRACKET
+    public final void mRBRACKET() throws RecognitionException {
+        try {
+            int _type = RBRACKET;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:265:2: ( ']' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:265:4: ']'
+            {
+            match(']'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RBRACKET
+
+    // $ANTLR start PNAME_NS
+    public final void mPNAME_NS() throws RecognitionException {
+        try {
+            int _type = PNAME_NS;
+            Token p=null;
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:271:5: ( (p= PN_PREFIX )? ':' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:271:7: (p= PN_PREFIX )? ':'
+            {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:271:8: (p= PN_PREFIX )?
+            int alt2=2;
+            int LA2_0 = input.LA(1);
+
+            if ( ((LA2_0>='A' && LA2_0<='Z')||(LA2_0>='a' && LA2_0<='z')||(LA2_0>='\u00C0' && LA2_0<='\u00D6')||(LA2_0>='\u00D8' && LA2_0<='\u00F6')||(LA2_0>='\u00F8' && LA2_0<='\u02FF')||(LA2_0>='\u0370' && LA2_0<='\u037D')||(LA2_0>='\u037F' && LA2_0<='\u1FFF')||(LA2_0>='\u200C' && LA2_0<='\u200D')||(LA2_0>='\u2070' && LA2_0<='\u218F')||(LA2_0>='\u2C00' && LA2_0<='\u2FEF')||(LA2_0>='\u3001' && LA2_0<='\uD7FF')||(LA2_0>='\uF900' && LA2_0<='\uFDCF')||(LA2_0>='\uFDF0' && LA2_0<='\uFFFD')) ) {
+                alt2=1;
+            }
+            switch (alt2) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:271:8: p= PN_PREFIX
+                    {
+                    int pStart439 = getCharIndex();
+                    mPN_PREFIX(); 
+                    p = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, pStart439, getCharIndex()-1);
+
+                    }
+                    break;
+
+            }
+
+            match(':'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PNAME_NS
+
+    // $ANTLR start PNAME_LN
+    public final void mPNAME_LN() throws RecognitionException {
+        try {
+            int _type = PNAME_LN;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:275:5: ( PNAME_NS PN_LOCAL )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:275:7: PNAME_NS PN_LOCAL
+            {
+            mPNAME_NS(); 
+            mPN_LOCAL(); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PNAME_LN
+
+    // $ANTLR start TRUE
+    public final void mTRUE() throws RecognitionException {
+        try {
+            int _type = TRUE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:279:5: ( ( 'T' | 't' ) ( 'R' | 'r' ) ( 'U' | 'u' ) ( 'E' | 'e' ) )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:279:7: ( 'T' | 't' ) ( 'R' | 'r' ) ( 'U' | 'u' ) ( 'E' | 'e' )
+            {
+            if ( input.LA(1)=='T'||input.LA(1)=='t' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            if ( input.LA(1)=='R'||input.LA(1)=='r' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            if ( input.LA(1)=='U'||input.LA(1)=='u' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end TRUE
+
+    // $ANTLR start FALSE
+    public final void mFALSE() throws RecognitionException {
+        try {
+            int _type = FALSE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:283:5: ( ( 'F' | 'f' ) ( 'A' | 'a' ) ( 'L' | 'l' ) ( 'S' | 's' ) ( 'E' | 'e' ) )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:283:7: ( 'F' | 'f' ) ( 'A' | 'a' ) ( 'L' | 'l' ) ( 'S' | 's' ) ( 'E' | 'e' )
+            {
+            if ( input.LA(1)=='F'||input.LA(1)=='f' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            if ( input.LA(1)=='A'||input.LA(1)=='a' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            if ( input.LA(1)=='S'||input.LA(1)=='s' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end FALSE
+
+    // $ANTLR start IRI_REF
+    public final void mIRI_REF() throws RecognitionException {
+        try {
+            int _type = IRI_REF;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:287:5: ( LANGLE ( options {greedy=false; } : ~ ( LANGLE | RANGLE | '\"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\\\' | '`' | ( '\\u0000' .. '\\u0020' ) ) )* RANGLE )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:287:7: LANGLE ( options {greedy=false; } : ~ ( LANGLE | RANGLE | '\"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\\\' | '`' | ( '\\u0000' .. '\\u0020' ) ) )* RANGLE
+            {
+            mLANGLE(); 
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:287:14: ( options {greedy=false; } : ~ ( LANGLE | RANGLE | '\"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\\\' | '`' | ( '\\u0000' .. '\\u0020' ) ) )*
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( (LA3_0=='>') ) {
+                    alt3=2;
+                }
+                else if ( (LA3_0=='!'||(LA3_0>='#' && LA3_0<=';')||LA3_0=='='||(LA3_0>='?' && LA3_0<='[')||LA3_0==']'||LA3_0=='_'||(LA3_0>='a' && LA3_0<='z')||(LA3_0>='~' && LA3_0<='\uFFFE')) ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:287:42: ~ ( LANGLE | RANGLE | '\"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\\\' | '`' | ( '\\u0000' .. '\\u0020' ) )
+            	    {
+            	    if ( input.LA(1)=='!'||(input.LA(1)>='#' && input.LA(1)<=';')||input.LA(1)=='='||(input.LA(1)>='?' && input.LA(1)<='[')||input.LA(1)==']'||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='~' && input.LA(1)<='\uFFFE') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop3;
+                }
+            } while (true);
+
+            mRANGLE(); 
+             setText(getText().substring(1, getText().length() - 1)); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end IRI_REF
+
+    // $ANTLR start LANGTAG
+    public final void mLANGTAG() throws RecognitionException {
+        try {
+            int _type = LANGTAG;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:5: ( '@' ( PN_CHARS_BASE )+ ( MINUS ( PN_CHARS_BASE DIGIT )+ )* )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:7: '@' ( PN_CHARS_BASE )+ ( MINUS ( PN_CHARS_BASE DIGIT )+ )*
+            {
+            match('@'); 
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:11: ( PN_CHARS_BASE )+
+            int cnt4=0;
+            loop4:
+            do {
+                int alt4=2;
+                int LA4_0 = input.LA(1);
+
+                if ( ((LA4_0>='A' && LA4_0<='Z')||(LA4_0>='a' && LA4_0<='z')||(LA4_0>='\u00C0' && LA4_0<='\u00D6')||(LA4_0>='\u00D8' && LA4_0<='\u00F6')||(LA4_0>='\u00F8' && LA4_0<='\u02FF')||(LA4_0>='\u0370' && LA4_0<='\u037D')||(LA4_0>='\u037F' && LA4_0<='\u1FFF')||(LA4_0>='\u200C' && LA4_0<='\u200D')||(LA4_0>='\u2070' && LA4_0<='\u218F')||(LA4_0>='\u2C00' && LA4_0<='\u2FEF')||(LA4_0>='\u3001' && LA4_0<='\uD7FF')||(LA4_0>='\uF900' && LA4_0<='\uFDCF')||(LA4_0>='\uFDF0' && LA4_0<='\uFFFD')) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:11: PN_CHARS_BASE
+            	    {
+            	    mPN_CHARS_BASE(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt4 >= 1 ) break loop4;
+                        EarlyExitException eee =
+                            new EarlyExitException(4, input);
+                        throw eee;
+                }
+                cnt4++;
+            } while (true);
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:26: ( MINUS ( PN_CHARS_BASE DIGIT )+ )*
+            loop6:
+            do {
+                int alt6=2;
+                int LA6_0 = input.LA(1);
+
+                if ( (LA6_0=='-') ) {
+                    alt6=1;
+                }
+
+
+                switch (alt6) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:27: MINUS ( PN_CHARS_BASE DIGIT )+
+            	    {
+            	    mMINUS(); 
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:33: ( PN_CHARS_BASE DIGIT )+
+            	    int cnt5=0;
+            	    loop5:
+            	    do {
+            	        int alt5=2;
+            	        int LA5_0 = input.LA(1);
+
+            	        if ( ((LA5_0>='A' && LA5_0<='Z')||(LA5_0>='a' && LA5_0<='z')||(LA5_0>='\u00C0' && LA5_0<='\u00D6')||(LA5_0>='\u00D8' && LA5_0<='\u00F6')||(LA5_0>='\u00F8' && LA5_0<='\u02FF')||(LA5_0>='\u0370' && LA5_0<='\u037D')||(LA5_0>='\u037F' && LA5_0<='\u1FFF')||(LA5_0>='\u200C' && LA5_0<='\u200D')||(LA5_0>='\u2070' && LA5_0<='\u218F')||(LA5_0>='\u2C00' && LA5_0<='\u2FEF')||(LA5_0>='\u3001' && LA5_0<='\uD7FF')||(LA5_0>='\uF900' && LA5_0<='\uFDCF')||(LA5_0>='\uFDF0' && LA5_0<='\uFFFD')) ) {
+            	            alt5=1;
+            	        }
+
+
+            	        switch (alt5) {
+            	    	case 1 :
+            	    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:34: PN_CHARS_BASE DIGIT
+            	    	    {
+            	    	    mPN_CHARS_BASE(); 
+            	    	    mDIGIT(); 
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    if ( cnt5 >= 1 ) break loop5;
+            	                EarlyExitException eee =
+            	                    new EarlyExitException(5, input);
+            	                throw eee;
+            	        }
+            	        cnt5++;
+            	    } while (true);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop6;
+                }
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LANGTAG
+
+    // $ANTLR start QUERY_VAR
+    public final void mQUERY_VAR() throws RecognitionException {
+        try {
+            int _type = QUERY_VAR;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:295:2: ( '?' PN_LOCAL )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:295:4: '?' PN_LOCAL
+            {
+            match('?'); 
+            mPN_LOCAL(); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end QUERY_VAR
+
+    // $ANTLR start STM_VAR
+    public final void mSTM_VAR() throws RecognitionException {
+        try {
+            int _type = STM_VAR;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:9: ( '#' PN_LOCAL ( '(' ( PN_LOCAL ( ',' PN_LOCAL )* )? ')' )? )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:11: '#' PN_LOCAL ( '(' ( PN_LOCAL ( ',' PN_LOCAL )* )? ')' )?
+            {
+            match('#'); 
+            mPN_LOCAL(); 
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:24: ( '(' ( PN_LOCAL ( ',' PN_LOCAL )* )? ')' )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0=='(') ) {
+                alt9=1;
+            }
+            switch (alt9) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:25: '(' ( PN_LOCAL ( ',' PN_LOCAL )* )? ')'
+                    {
+                    match('('); 
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:29: ( PN_LOCAL ( ',' PN_LOCAL )* )?
+                    int alt8=2;
+                    int LA8_0 = input.LA(1);
+
+                    if ( ((LA8_0>='0' && LA8_0<='9')||(LA8_0>='A' && LA8_0<='Z')||LA8_0=='_'||(LA8_0>='a' && LA8_0<='z')||(LA8_0>='\u00C0' && LA8_0<='\u00D6')||(LA8_0>='\u00D8' && LA8_0<='\u00F6')||(LA8_0>='\u00F8' && LA8_0<='\u02FF')||(LA8_0>='\u0370' && LA8_0<='\u037D')||(LA8_0>='\u037F' && LA8_0<='\u1FFF')||(LA8_0>='\u200C' && LA8_0<='\u200D')||(LA8_0>='\u2070' && LA8_0<='\u218F')||(LA8_0>='\u2C00' && LA8_0<='\u2FEF')||(LA8_0>='\u3001' && LA8_0<='\uD7FF')||(LA8_0>='\uF900' && LA8_0<='\uFDCF')||(LA8_0>='\uFDF0' && LA8_0<='\uFFFD')) ) {
+                        alt8=1;
+                    }
+                    switch (alt8) {
+                        case 1 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:30: PN_LOCAL ( ',' PN_LOCAL )*
+                            {
+                            mPN_LOCAL(); 
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:39: ( ',' PN_LOCAL )*
+                            loop7:
+                            do {
+                                int alt7=2;
+                                int LA7_0 = input.LA(1);
+
+                                if ( (LA7_0==',') ) {
+                                    alt7=1;
+                                }
+
+
+                                switch (alt7) {
+                            	case 1 :
+                            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:40: ',' PN_LOCAL
+                            	    {
+                            	    match(','); 
+                            	    mPN_LOCAL(); 
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop7;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    match(')'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end STM_VAR
+
+    // $ANTLR start INTEGER
+    public final void mINTEGER() throws RecognitionException {
+        try {
+            int _type = INTEGER;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:302:5: ( ( DIGIT )+ )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:302:7: ( DIGIT )+
+            {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:302:7: ( DIGIT )+
+            int cnt10=0;
+            loop10:
+            do {
+                int alt10=2;
+                int LA10_0 = input.LA(1);
+
+                if ( ((LA10_0>='0' && LA10_0<='9')) ) {
+                    alt10=1;
+                }
+
+
+                switch (alt10) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:302:7: DIGIT
+            	    {
+            	    mDIGIT(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt10 >= 1 ) break loop10;
+                        EarlyExitException eee =
+                            new EarlyExitException(10, input);
+                        throw eee;
+                }
+                cnt10++;
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end INTEGER
+
+    // $ANTLR start DECIMAL
+    public final void mDECIMAL() throws RecognitionException {
+        try {
+            int _type = DECIMAL;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:5: ( ( DIGIT )+ DOT ( DIGIT )* | DOT ( DIGIT )+ )
+            int alt14=2;
+            int LA14_0 = input.LA(1);
+
+            if ( ((LA14_0>='0' && LA14_0<='9')) ) {
+                alt14=1;
+            }
+            else if ( (LA14_0=='.') ) {
+                alt14=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("305:1: DECIMAL : ( ( DIGIT )+ DOT ( DIGIT )* | DOT ( DIGIT )+ );", 14, 0, input);
+
+                throw nvae;
+            }
+            switch (alt14) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:7: ( DIGIT )+ DOT ( DIGIT )*
+                    {
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:7: ( DIGIT )+
+                    int cnt11=0;
+                    loop11:
+                    do {
+                        int alt11=2;
+                        int LA11_0 = input.LA(1);
+
+                        if ( ((LA11_0>='0' && LA11_0<='9')) ) {
+                            alt11=1;
+                        }
+
+
+                        switch (alt11) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:7: DIGIT
+                    	    {
+                    	    mDIGIT(); 
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt11 >= 1 ) break loop11;
+                                EarlyExitException eee =
+                                    new EarlyExitException(11, input);
+                                throw eee;
+                        }
+                        cnt11++;
+                    } while (true);
+
+                    mDOT(); 
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:18: ( DIGIT )*
+                    loop12:
+                    do {
+                        int alt12=2;
+                        int LA12_0 = input.LA(1);
+
+                        if ( ((LA12_0>='0' && LA12_0<='9')) ) {
+                            alt12=1;
+                        }
+
+
+                        switch (alt12) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:18: DIGIT
+                    	    {
+                    	    mDIGIT(); 
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop12;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:307:7: DOT ( DIGIT )+
+                    {
+                    mDOT(); 
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:307:11: ( DIGIT )+
+                    int cnt13=0;
+                    loop13:
+                    do {
+                        int alt13=2;
+                        int LA13_0 = input.LA(1);
+
+                        if ( ((LA13_0>='0' && LA13_0<='9')) ) {
+                            alt13=1;
+                        }
+
+
+                        switch (alt13) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:307:11: DIGIT
+                    	    {
+                    	    mDIGIT(); 
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt13 >= 1 ) break loop13;
+                                EarlyExitException eee =
+                                    new EarlyExitException(13, input);
+                                throw eee;
+                        }
+                        cnt13++;
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DECIMAL
+
+    // $ANTLR start DOUBLE
+    public final void mDOUBLE() throws RecognitionException {
+        try {
+            int _type = DOUBLE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:5: ( ( DIGIT )+ DOT ( DIGIT )* EXPONENT | DOT ( DIGIT )+ EXPONENT | ( DIGIT )+ EXPONENT )
+            int alt19=3;
+            alt19 = dfa19.predict(input);
+            switch (alt19) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:7: ( DIGIT )+ DOT ( DIGIT )* EXPONENT
+                    {
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:7: ( DIGIT )+
+                    int cnt15=0;
+                    loop15:
+                    do {
+                        int alt15=2;
+                        int LA15_0 = input.LA(1);
+
+                        if ( ((LA15_0>='0' && LA15_0<='9')) ) {
+                            alt15=1;
+                        }
+
+
+                        switch (alt15) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:7: DIGIT
+                    	    {
+                    	    mDIGIT(); 
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt15 >= 1 ) break loop15;
+                                EarlyExitException eee =
+                                    new EarlyExitException(15, input);
+                                throw eee;
+                        }
+                        cnt15++;
+                    } while (true);
+
+                    mDOT(); 
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:18: ( DIGIT )*
+                    loop16:
+                    do {
+                        int alt16=2;
+                        int LA16_0 = input.LA(1);
+
+                        if ( ((LA16_0>='0' && LA16_0<='9')) ) {
+                            alt16=1;
+                        }
+
+
+                        switch (alt16) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:18: DIGIT
+                    	    {
+                    	    mDIGIT(); 
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop16;
+                        }
+                    } while (true);
+
+                    mEXPONENT(); 
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:312:7: DOT ( DIGIT )+ EXPONENT
+                    {
+                    mDOT(); 
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:312:11: ( DIGIT )+
+                    int cnt17=0;
+                    loop17:
+                    do {
+                        int alt17=2;
+                        int LA17_0 = input.LA(1);
+
+                        if ( ((LA17_0>='0' && LA17_0<='9')) ) {
+                            alt17=1;
+                        }
+
+
+                        switch (alt17) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:312:11: DIGIT
+                    	    {
+                    	    mDIGIT(); 
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt17 >= 1 ) break loop17;
+                                EarlyExitException eee =
+                                    new EarlyExitException(17, input);
+                                throw eee;
+                        }
+                        cnt17++;
+                    } while (true);
+
+                    mEXPONENT(); 
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:313:7: ( DIGIT )+ EXPONENT
+                    {
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:313:7: ( DIGIT )+
+                    int cnt18=0;
+                    loop18:
+                    do {
+                        int alt18=2;
+                        int LA18_0 = input.LA(1);
+
+                        if ( ((LA18_0>='0' && LA18_0<='9')) ) {
+                            alt18=1;
+                        }
+
+
+                        switch (alt18) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:313:7: DIGIT
+                    	    {
+                    	    mDIGIT(); 
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt18 >= 1 ) break loop18;
+                                EarlyExitException eee =
+                                    new EarlyExitException(18, input);
+                                throw eee;
+                        }
+                        cnt18++;
+                    } while (true);
+
+                    mEXPONENT(); 
+
+                    }
+                    break;
+
+            }
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DOUBLE
+
+    // $ANTLR start INTEGER_POSITIVE
+    public final void mINTEGER_POSITIVE() throws RecognitionException {
+        try {
+            int _type = INTEGER_POSITIVE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:317:5: ( PLUS INTEGER )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:317:7: PLUS INTEGER
+            {
+            mPLUS(); 
+            mINTEGER(); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end INTEGER_POSITIVE
+
+    // $ANTLR start DECIMAL_POSITIVE
+    public final void mDECIMAL_POSITIVE() throws RecognitionException {
+        try {
+            int _type = DECIMAL_POSITIVE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:321:5: ( PLUS DECIMAL )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:321:7: PLUS DECIMAL
+            {
+            mPLUS(); 
+            mDECIMAL(); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DECIMAL_POSITIVE
+
+    // $ANTLR start DOUBLE_POSITIVE
+    public final void mDOUBLE_POSITIVE() throws RecognitionException {
+        try {
+            int _type = DOUBLE_POSITIVE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:325:5: ( PLUS DOUBLE )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:325:7: PLUS DOUBLE
+            {
+            mPLUS(); 
+            mDOUBLE(); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DOUBLE_POSITIVE
+
+    // $ANTLR start INTEGER_NEGATIVE
+    public final void mINTEGER_NEGATIVE() throws RecognitionException {
+        try {
+            int _type = INTEGER_NEGATIVE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:329:5: ( MINUS INTEGER )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:329:7: MINUS INTEGER
+            {
+            mMINUS(); 
+            mINTEGER(); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end INTEGER_NEGATIVE
+
+    // $ANTLR start DECIMAL_NEGATIVE
+    public final void mDECIMAL_NEGATIVE() throws RecognitionException {
+        try {
+            int _type = DECIMAL_NEGATIVE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:333:5: ( MINUS DECIMAL )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:333:7: MINUS DECIMAL
+            {
+            mMINUS(); 
+            mDECIMAL(); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DECIMAL_NEGATIVE
+
+    // $ANTLR start DOUBLE_NEGATIVE
+    public final void mDOUBLE_NEGATIVE() throws RecognitionException {
+        try {
+            int _type = DOUBLE_NEGATIVE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:337:5: ( MINUS DOUBLE )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:337:7: MINUS DOUBLE
+            {
+            mMINUS(); 
+            mDOUBLE(); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DOUBLE_NEGATIVE
+
+    // $ANTLR start EXPONENT
+    public final void mEXPONENT() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:5: ( ( 'e' | 'E' ) ( PLUS | MINUS )? ( DIGIT )+ )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:7: ( 'e' | 'E' ) ( PLUS | MINUS )? ( DIGIT )+
+            {
+            if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:17: ( PLUS | MINUS )?
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+
+            if ( (LA20_0=='+'||LA20_0=='-') ) {
+                alt20=1;
+            }
+            switch (alt20) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+                    {
+                    if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse =
+                            new MismatchedSetException(null,input);
+                        recover(mse);    throw mse;
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:31: ( DIGIT )+
+            int cnt21=0;
+            loop21:
+            do {
+                int alt21=2;
+                int LA21_0 = input.LA(1);
+
+                if ( ((LA21_0>='0' && LA21_0<='9')) ) {
+                    alt21=1;
+                }
+
+
+                switch (alt21) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:31: DIGIT
+            	    {
+            	    mDIGIT(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt21 >= 1 ) break loop21;
+                        EarlyExitException eee =
+                            new EarlyExitException(21, input);
+                        throw eee;
+                }
+                cnt21++;
+            } while (true);
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EXPONENT
+
+    // $ANTLR start STRING_LITERAL1
+    public final void mSTRING_LITERAL1() throws RecognitionException {
+        try {
+            int _type = STRING_LITERAL1;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:5: ( '\\'' ( options {greedy=false; } : ~ ( '\\u0027' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )* '\\'' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:7: '\\'' ( options {greedy=false; } : ~ ( '\\u0027' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )* '\\''
+            {
+            match('\''); 
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:12: ( options {greedy=false; } : ~ ( '\\u0027' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )*
+            loop22:
+            do {
+                int alt22=3;
+                int LA22_0 = input.LA(1);
+
+                if ( (LA22_0=='\'') ) {
+                    alt22=3;
+                }
+                else if ( ((LA22_0>='\u0000' && LA22_0<='\t')||(LA22_0>='\u000B' && LA22_0<='\f')||(LA22_0>='\u000E' && LA22_0<='&')||(LA22_0>='(' && LA22_0<='[')||(LA22_0>=']' && LA22_0<='\uFFFE')) ) {
+                    alt22=1;
+                }
+                else if ( (LA22_0=='\\') ) {
+                    alt22=2;
+                }
+
+
+                switch (alt22) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:40: ~ ( '\\u0027' | '\\u005C' | '\\u000A' | '\\u000D' )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:87: ECHAR
+            	    {
+            	    mECHAR(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop22;
+                }
+            } while (true);
+
+            match('\''); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end STRING_LITERAL1
+
+    // $ANTLR start STRING_LITERAL2
+    public final void mSTRING_LITERAL2() throws RecognitionException {
+        try {
+            int _type = STRING_LITERAL2;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:5: ( '\"' ( options {greedy=false; } : ~ ( '\\u0022' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )* '\"' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:7: '\"' ( options {greedy=false; } : ~ ( '\\u0022' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )* '\"'
+            {
+            match('\"'); 
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:12: ( options {greedy=false; } : ~ ( '\\u0022' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )*
+            loop23:
+            do {
+                int alt23=3;
+                int LA23_0 = input.LA(1);
+
+                if ( (LA23_0=='\"') ) {
+                    alt23=3;
+                }
+                else if ( ((LA23_0>='\u0000' && LA23_0<='\t')||(LA23_0>='\u000B' && LA23_0<='\f')||(LA23_0>='\u000E' && LA23_0<='!')||(LA23_0>='#' && LA23_0<='[')||(LA23_0>=']' && LA23_0<='\uFFFE')) ) {
+                    alt23=1;
+                }
+                else if ( (LA23_0=='\\') ) {
+                    alt23=2;
+                }
+
+
+                switch (alt23) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:40: ~ ( '\\u0022' | '\\u005C' | '\\u000A' | '\\u000D' )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:87: ECHAR
+            	    {
+            	    mECHAR(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop23;
+                }
+            } while (true);
+
+            match('\"'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end STRING_LITERAL2
+
+    // $ANTLR start STRING_LITERAL_LONG1
+    public final void mSTRING_LITERAL_LONG1() throws RecognitionException {
+        try {
+            int _type = STRING_LITERAL_LONG1;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:5: ( '\\'\\'\\'' ( options {greedy=false; } : ( '\\'' | '\\'\\'' )? (~ ( '\\'' | '\\\\' ) | ECHAR ) )* '\\'\\'\\'' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:9: '\\'\\'\\'' ( options {greedy=false; } : ( '\\'' | '\\'\\'' )? (~ ( '\\'' | '\\\\' ) | ECHAR ) )* '\\'\\'\\''
+            {
+            match("\'\'\'"); 
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:18: ( options {greedy=false; } : ( '\\'' | '\\'\\'' )? (~ ( '\\'' | '\\\\' ) | ECHAR ) )*
+            loop26:
+            do {
+                int alt26=2;
+                int LA26_0 = input.LA(1);
+
+                if ( (LA26_0=='\'') ) {
+                    int LA26_1 = input.LA(2);
+
+                    if ( (LA26_1=='\'') ) {
+                        int LA26_3 = input.LA(3);
+
+                        if ( (LA26_3=='\'') ) {
+                            alt26=2;
+                        }
+                        else if ( ((LA26_3>='\u0000' && LA26_3<='&')||(LA26_3>='(' && LA26_3<='\uFFFE')) ) {
+                            alt26=1;
+                        }
+
+
+                    }
+                    else if ( ((LA26_1>='\u0000' && LA26_1<='&')||(LA26_1>='(' && LA26_1<='\uFFFE')) ) {
+                        alt26=1;
+                    }
+
+
+                }
+                else if ( ((LA26_0>='\u0000' && LA26_0<='&')||(LA26_0>='(' && LA26_0<='\uFFFE')) ) {
+                    alt26=1;
+                }
+
+
+                switch (alt26) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:46: ( '\\'' | '\\'\\'' )? (~ ( '\\'' | '\\\\' ) | ECHAR )
+            	    {
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:46: ( '\\'' | '\\'\\'' )?
+            	    int alt24=3;
+            	    int LA24_0 = input.LA(1);
+
+            	    if ( (LA24_0=='\'') ) {
+            	        int LA24_1 = input.LA(2);
+
+            	        if ( (LA24_1=='\'') ) {
+            	            alt24=2;
+            	        }
+            	        else if ( ((LA24_1>='\u0000' && LA24_1<='&')||(LA24_1>='(' && LA24_1<='\uFFFE')) ) {
+            	            alt24=1;
+            	        }
+            	    }
+            	    switch (alt24) {
+            	        case 1 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:48: '\\''
+            	            {
+            	            match('\''); 
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:55: '\\'\\''
+            	            {
+            	            match("\'\'"); 
+
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:65: (~ ( '\\'' | '\\\\' ) | ECHAR )
+            	    int alt25=2;
+            	    int LA25_0 = input.LA(1);
+
+            	    if ( ((LA25_0>='\u0000' && LA25_0<='&')||(LA25_0>='(' && LA25_0<='[')||(LA25_0>=']' && LA25_0<='\uFFFE')) ) {
+            	        alt25=1;
+            	    }
+            	    else if ( (LA25_0=='\\') ) {
+            	        alt25=2;
+            	    }
+            	    else {
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("354:65: (~ ( '\\'' | '\\\\' ) | ECHAR )", 25, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt25) {
+            	        case 1 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:67: ~ ( '\\'' | '\\\\' )
+            	            {
+            	            if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
+            	                input.consume();
+
+            	            }
+            	            else {
+            	                MismatchedSetException mse =
+            	                    new MismatchedSetException(null,input);
+            	                recover(mse);    throw mse;
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:82: ECHAR
+            	            {
+            	            mECHAR(); 
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop26;
+                }
+            } while (true);
+
+            match("\'\'\'"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end STRING_LITERAL_LONG1
+
+    // $ANTLR start STRING_LITERAL_LONG2
+    public final void mSTRING_LITERAL_LONG2() throws RecognitionException {
+        try {
+            int _type = STRING_LITERAL_LONG2;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:5: ( '\"\"\"' ( options {greedy=false; } : ( '\"' | '\"\"' )? (~ ( '\"' | '\\\\' ) | ECHAR ) )* '\"\"\"' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:9: '\"\"\"' ( options {greedy=false; } : ( '\"' | '\"\"' )? (~ ( '\"' | '\\\\' ) | ECHAR ) )* '\"\"\"'
+            {
+            match("\"\"\""); 
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:15: ( options {greedy=false; } : ( '\"' | '\"\"' )? (~ ( '\"' | '\\\\' ) | ECHAR ) )*
+            loop29:
+            do {
+                int alt29=2;
+                int LA29_0 = input.LA(1);
+
+                if ( (LA29_0=='\"') ) {
+                    int LA29_1 = input.LA(2);
+
+                    if ( (LA29_1=='\"') ) {
+                        int LA29_3 = input.LA(3);
+
+                        if ( (LA29_3=='\"') ) {
+                            alt29=2;
+                        }
+                        else if ( ((LA29_3>='\u0000' && LA29_3<='!')||(LA29_3>='#' && LA29_3<='\uFFFE')) ) {
+                            alt29=1;
+                        }
+
+
+                    }
+                    else if ( ((LA29_1>='\u0000' && LA29_1<='!')||(LA29_1>='#' && LA29_1<='\uFFFE')) ) {
+                        alt29=1;
+                    }
+
+
+                }
+                else if ( ((LA29_0>='\u0000' && LA29_0<='!')||(LA29_0>='#' && LA29_0<='\uFFFE')) ) {
+                    alt29=1;
+                }
+
+
+                switch (alt29) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:43: ( '\"' | '\"\"' )? (~ ( '\"' | '\\\\' ) | ECHAR )
+            	    {
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:43: ( '\"' | '\"\"' )?
+            	    int alt27=3;
+            	    int LA27_0 = input.LA(1);
+
+            	    if ( (LA27_0=='\"') ) {
+            	        int LA27_1 = input.LA(2);
+
+            	        if ( (LA27_1=='\"') ) {
+            	            alt27=2;
+            	        }
+            	        else if ( ((LA27_1>='\u0000' && LA27_1<='!')||(LA27_1>='#' && LA27_1<='\uFFFE')) ) {
+            	            alt27=1;
+            	        }
+            	    }
+            	    switch (alt27) {
+            	        case 1 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:45: '\"'
+            	            {
+            	            match('\"'); 
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:51: '\"\"'
+            	            {
+            	            match("\"\""); 
+
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:59: (~ ( '\"' | '\\\\' ) | ECHAR )
+            	    int alt28=2;
+            	    int LA28_0 = input.LA(1);
+
+            	    if ( ((LA28_0>='\u0000' && LA28_0<='!')||(LA28_0>='#' && LA28_0<='[')||(LA28_0>=']' && LA28_0<='\uFFFE')) ) {
+            	        alt28=1;
+            	    }
+            	    else if ( (LA28_0=='\\') ) {
+            	        alt28=2;
+            	    }
+            	    else {
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("358:59: (~ ( '\"' | '\\\\' ) | ECHAR )", 28, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt28) {
+            	        case 1 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:61: ~ ( '\"' | '\\\\' )
+            	            {
+            	            if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
+            	                input.consume();
+
+            	            }
+            	            else {
+            	                MismatchedSetException mse =
+            	                    new MismatchedSetException(null,input);
+            	                recover(mse);    throw mse;
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:75: ECHAR
+            	            {
+            	            mECHAR(); 
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop29;
+                }
+            } while (true);
+
+            match("\"\"\""); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end STRING_LITERAL_LONG2
+
+    // $ANTLR start ECHAR
+    public final void mECHAR() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:363:5: ( '\\\\' ( 't' | 'b' | 'n' | 'r' | 'f' | '\\\\' | '\"' | '\\'' ) )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:363:7: '\\\\' ( 't' | 'b' | 'n' | 'r' | 'f' | '\\\\' | '\"' | '\\'' )
+            {
+            match('\\'); 
+            if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||input.LA(1)=='t' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end ECHAR
+
+    // $ANTLR start PN_CHARS_U
+    public final void mPN_CHARS_U() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:368:5: ( PN_CHARS_BASE | '_' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u02FF')||(input.LA(1)>='\u0370' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PN_CHARS_U
+
+    // $ANTLR start VARNAME
+    public final void mVARNAME() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:373:5: ( ( PN_CHARS_U | DIGIT ) ( PN_CHARS_U | DIGIT | '\\u00B7' | '\\u0300' .. '\\u036F' | '\\u203F' .. '\\u2040' )* )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:373:7: ( PN_CHARS_U | DIGIT ) ( PN_CHARS_U | DIGIT | '\\u00B7' | '\\u0300' .. '\\u036F' | '\\u203F' .. '\\u2040' )*
+            {
+            if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u02FF')||(input.LA(1)>='\u0370' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:373:30: ( PN_CHARS_U | DIGIT | '\\u00B7' | '\\u0300' .. '\\u036F' | '\\u203F' .. '\\u2040' )*
+            loop30:
+            do {
+                int alt30=2;
+                int LA30_0 = input.LA(1);
+
+                if ( ((LA30_0>='0' && LA30_0<='9')||(LA30_0>='A' && LA30_0<='Z')||LA30_0=='_'||(LA30_0>='a' && LA30_0<='z')||LA30_0=='\u00B7'||(LA30_0>='\u00C0' && LA30_0<='\u00D6')||(LA30_0>='\u00D8' && LA30_0<='\u00F6')||(LA30_0>='\u00F8' && LA30_0<='\u037D')||(LA30_0>='\u037F' && LA30_0<='\u1FFF')||(LA30_0>='\u200C' && LA30_0<='\u200D')||(LA30_0>='\u203F' && LA30_0<='\u2040')||(LA30_0>='\u2070' && LA30_0<='\u218F')||(LA30_0>='\u2C00' && LA30_0<='\u2FEF')||(LA30_0>='\u3001' && LA30_0<='\uD7FF')||(LA30_0>='\uF900' && LA30_0<='\uFDCF')||(LA30_0>='\uFDF0' && LA30_0<='\uFFFD')) ) {
+                    alt30=1;
+                }
+
+
+                switch (alt30) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||input.LA(1)=='\u00B7'||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u203F' && input.LA(1)<='\u2040')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop30;
+                }
+            } while (true);
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end VARNAME
+
+    // $ANTLR start PN_CHARS
+    public final void mPN_CHARS() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:378:5: ( PN_CHARS_U | MINUS | DIGIT | '\\u00B7' | '\\u0300' .. '\\u036F' | '\\u203F' .. '\\u2040' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            if ( input.LA(1)=='-'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||input.LA(1)=='\u00B7'||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u203F' && input.LA(1)<='\u2040')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PN_CHARS
+
+    // $ANTLR start PN_PREFIX
+    public final void mPN_PREFIX() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:5: ( PN_CHARS_BASE ( ( PN_CHARS | DOT )* PN_CHARS )? )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:7: PN_CHARS_BASE ( ( PN_CHARS | DOT )* PN_CHARS )?
+            {
+            mPN_CHARS_BASE(); 
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:21: ( ( PN_CHARS | DOT )* PN_CHARS )?
+            int alt32=2;
+            int LA32_0 = input.LA(1);
+
+            if ( ((LA32_0>='-' && LA32_0<='.')||(LA32_0>='0' && LA32_0<='9')||(LA32_0>='A' && LA32_0<='Z')||LA32_0=='_'||(LA32_0>='a' && LA32_0<='z')||LA32_0=='\u00B7'||(LA32_0>='\u00C0' && LA32_0<='\u00D6')||(LA32_0>='\u00D8' && LA32_0<='\u00F6')||(LA32_0>='\u00F8' && LA32_0<='\u037D')||(LA32_0>='\u037F' && LA32_0<='\u1FFF')||(LA32_0>='\u200C' && LA32_0<='\u200D')||(LA32_0>='\u203F' && LA32_0<='\u2040')||(LA32_0>='\u2070' && LA32_0<='\u218F')||(LA32_0>='\u2C00' && LA32_0<='\u2FEF')||(LA32_0>='\u3001' && LA32_0<='\uD7FF')||(LA32_0>='\uF900' && LA32_0<='\uFDCF')||(LA32_0>='\uFDF0' && LA32_0<='\uFFFD')) ) {
+                alt32=1;
+            }
+            switch (alt32) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:22: ( PN_CHARS | DOT )* PN_CHARS
+                    {
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:22: ( PN_CHARS | DOT )*
+                    loop31:
+                    do {
+                        int alt31=2;
+                        int LA31_0 = input.LA(1);
+
+                        if ( (LA31_0=='-'||(LA31_0>='0' && LA31_0<='9')||(LA31_0>='A' && LA31_0<='Z')||LA31_0=='_'||(LA31_0>='a' && LA31_0<='z')||LA31_0=='\u00B7'||(LA31_0>='\u00C0' && LA31_0<='\u00D6')||(LA31_0>='\u00D8' && LA31_0<='\u00F6')||(LA31_0>='\u00F8' && LA31_0<='\u037D')||(LA31_0>='\u037F' && LA31_0<='\u1FFF')||(LA31_0>='\u200C' && LA31_0<='\u200D')||(LA31_0>='\u203F' && LA31_0<='\u2040')||(LA31_0>='\u2070' && LA31_0<='\u218F')||(LA31_0>='\u2C00' && LA31_0<='\u2FEF')||(LA31_0>='\u3001' && LA31_0<='\uD7FF')||(LA31_0>='\uF900' && LA31_0<='\uFDCF')||(LA31_0>='\uFDF0' && LA31_0<='\uFFFD')) ) {
+                            int LA31_1 = input.LA(2);
+
+                            if ( ((LA31_1>='-' && LA31_1<='.')||(LA31_1>='0' && LA31_1<='9')||(LA31_1>='A' && LA31_1<='Z')||LA31_1=='_'||(LA31_1>='a' && LA31_1<='z')||LA31_1=='\u00B7'||(LA31_1>='\u00C0' && LA31_1<='\u00D6')||(LA31_1>='\u00D8' && LA31_1<='\u00F6')||(LA31_1>='\u00F8' && LA31_1<='\u037D')||(LA31_1>='\u037F' && LA31_1<='\u1FFF')||(LA31_1>='\u200C' && LA31_1<='\u200D')||(LA31_1>='\u203F' && LA31_1<='\u2040')||(LA31_1>='\u2070' && LA31_1<='\u218F')||(LA31_1>='\u2C00' && LA31_1<='\u2FEF')||(LA31_1>='\u3001' && LA31_1<='\uD7FF')||(LA31_1>='\uF900' && LA31_1<='\uFDCF')||(LA31_1>='\uFDF0' && LA31_1<='\uFFFD')) ) {
+                                alt31=1;
+                            }
+
+
+                        }
+                        else if ( (LA31_0=='.') ) {
+                            alt31=1;
+                        }
+
+
+                        switch (alt31) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+                    	    {
+                    	    if ( (input.LA(1)>='-' && input.LA(1)<='.')||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||input.LA(1)=='\u00B7'||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u203F' && input.LA(1)<='\u2040')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse =
+                    	            new MismatchedSetException(null,input);
+                    	        recover(mse);    throw mse;
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop31;
+                        }
+                    } while (true);
+
+                    mPN_CHARS(); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PN_PREFIX
+
+    // $ANTLR start PN_LOCAL
+    public final void mPN_LOCAL() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:5: ( ( PN_CHARS_U | DIGIT ) ( ( PN_CHARS )* PN_CHARS )? )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:7: ( PN_CHARS_U | DIGIT ) ( ( PN_CHARS )* PN_CHARS )?
+            {
+            if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u02FF')||(input.LA(1)>='\u0370' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:30: ( ( PN_CHARS )* PN_CHARS )?
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( (LA34_0=='-'||(LA34_0>='0' && LA34_0<='9')||(LA34_0>='A' && LA34_0<='Z')||LA34_0=='_'||(LA34_0>='a' && LA34_0<='z')||LA34_0=='\u00B7'||(LA34_0>='\u00C0' && LA34_0<='\u00D6')||(LA34_0>='\u00D8' && LA34_0<='\u00F6')||(LA34_0>='\u00F8' && LA34_0<='\u037D')||(LA34_0>='\u037F' && LA34_0<='\u1FFF')||(LA34_0>='\u200C' && LA34_0<='\u200D')||(LA34_0>='\u203F' && LA34_0<='\u2040')||(LA34_0>='\u2070' && LA34_0<='\u218F')||(LA34_0>='\u2C00' && LA34_0<='\u2FEF')||(LA34_0>='\u3001' && LA34_0<='\uD7FF')||(LA34_0>='\uF900' && LA34_0<='\uFDCF')||(LA34_0>='\uFDF0' && LA34_0<='\uFFFD')) ) {
+                alt34=1;
+            }
+            switch (alt34) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:31: ( PN_CHARS )* PN_CHARS
+                    {
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:31: ( PN_CHARS )*
+                    loop33:
+                    do {
+                        int alt33=2;
+                        int LA33_0 = input.LA(1);
+
+                        if ( (LA33_0=='-'||(LA33_0>='0' && LA33_0<='9')||(LA33_0>='A' && LA33_0<='Z')||LA33_0=='_'||(LA33_0>='a' && LA33_0<='z')||LA33_0=='\u00B7'||(LA33_0>='\u00C0' && LA33_0<='\u00D6')||(LA33_0>='\u00D8' && LA33_0<='\u00F6')||(LA33_0>='\u00F8' && LA33_0<='\u037D')||(LA33_0>='\u037F' && LA33_0<='\u1FFF')||(LA33_0>='\u200C' && LA33_0<='\u200D')||(LA33_0>='\u203F' && LA33_0<='\u2040')||(LA33_0>='\u2070' && LA33_0<='\u218F')||(LA33_0>='\u2C00' && LA33_0<='\u2FEF')||(LA33_0>='\u3001' && LA33_0<='\uD7FF')||(LA33_0>='\uF900' && LA33_0<='\uFDCF')||(LA33_0>='\uFDF0' && LA33_0<='\uFFFD')) ) {
+                            int LA33_1 = input.LA(2);
+
+                            if ( (LA33_1=='-'||(LA33_1>='0' && LA33_1<='9')||(LA33_1>='A' && LA33_1<='Z')||LA33_1=='_'||(LA33_1>='a' && LA33_1<='z')||LA33_1=='\u00B7'||(LA33_1>='\u00C0' && LA33_1<='\u00D6')||(LA33_1>='\u00D8' && LA33_1<='\u00F6')||(LA33_1>='\u00F8' && LA33_1<='\u037D')||(LA33_1>='\u037F' && LA33_1<='\u1FFF')||(LA33_1>='\u200C' && LA33_1<='\u200D')||(LA33_1>='\u203F' && LA33_1<='\u2040')||(LA33_1>='\u2070' && LA33_1<='\u218F')||(LA33_1>='\u2C00' && LA33_1<='\u2FEF')||(LA33_1>='\u3001' && LA33_1<='\uD7FF')||(LA33_1>='\uF900' && LA33_1<='\uFDCF')||(LA33_1>='\uFDF0' && LA33_1<='\uFFFD')) ) {
+                                alt33=1;
+                            }
+
+
+                        }
+
+
+                        switch (alt33) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:32: PN_CHARS
+                    	    {
+                    	    mPN_CHARS(); 
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop33;
+                        }
+                    } while (true);
+
+                    mPN_CHARS(); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PN_LOCAL
+
+    // $ANTLR start PN_CHARS_BASE
+    public final void mPN_CHARS_BASE() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:398:5: ( 'A' .. 'Z' | 'a' .. 'z' | '\\u00C0' .. '\\u00D6' | '\\u00D8' .. '\\u00F6' | '\\u00F8' .. '\\u02FF' | '\\u0370' .. '\\u037D' | '\\u037F' .. '\\u1FFF' | '\\u200C' .. '\\u200D' | '\\u2070' .. '\\u218F' | '\\u2C00' .. '\\u2FEF' | '\\u3001' .. '\\uD7FF' | '\\uF900' .. '\\uFDCF' | '\\uFDF0' .. '\\uFFFD' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u02FF')||(input.LA(1)>='\u0370' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PN_CHARS_BASE
+
+    // $ANTLR start DIGIT
+    public final void mDIGIT() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:415:5: ( '0' .. '9' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:415:7: '0' .. '9'
+            {
+            matchRange('0','9'); 
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DIGIT
+
+    // $ANTLR start COMMENT
+    public final void mCOMMENT() throws RecognitionException {
+        try {
+            int _type = COMMENT;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:419:5: ( '//' ( options {greedy=false; } : . )* EOL )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:419:7: '//' ( options {greedy=false; } : . )* EOL
+            {
+            match("//"); 
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:419:12: ( options {greedy=false; } : . )*
+            loop35:
+            do {
+                int alt35=2;
+                int LA35_0 = input.LA(1);
+
+                if ( (LA35_0=='\n'||LA35_0=='\r') ) {
+                    alt35=2;
+                }
+                else if ( ((LA35_0>='\u0000' && LA35_0<='\t')||(LA35_0>='\u000B' && LA35_0<='\f')||(LA35_0>='\u000E' && LA35_0<='\uFFFE')) ) {
+                    alt35=1;
+                }
+
+
+                switch (alt35) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:419:39: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop35;
+                }
+            } while (true);
+
+            mEOL(); 
+             channel=HIDDEN; 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end COMMENT
+
+    // $ANTLR start EOL
+    public final void mEOL() throws RecognitionException {
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:424:5: ( '\\n' | '\\r' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            if ( input.LA(1)=='\n'||input.LA(1)=='\r' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EOL
+
+    // $ANTLR start REFERENCE
+    public final void mREFERENCE() throws RecognitionException {
+        try {
+            int _type = REFERENCE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:428:5: ( '^^' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:428:7: '^^'
+            {
+            match("^^"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end REFERENCE
+
+    // $ANTLR start EXCLAMATION
+    public final void mEXCLAMATION() throws RecognitionException {
+        try {
+            int _type = EXCLAMATION;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:431:2: ( '!' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:431:4: '!'
+            {
+            match('!'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EXCLAMATION
+
+    // $ANTLR start QUESTION
+    public final void mQUESTION() throws RecognitionException {
+        try {
+            int _type = QUESTION;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:434:2: ( '?' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:434:4: '?'
+            {
+            match('?'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end QUESTION
+
+    // $ANTLR start DOT
+    public final void mDOT() throws RecognitionException {
+        try {
+            int _type = DOT;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:436:5: ( '.' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:436:7: '.'
+            {
+            match('.'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DOT
+
+    // $ANTLR start COMMA
+    public final void mCOMMA() throws RecognitionException {
+        try {
+            int _type = COMMA;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:439:7: ( ',' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:439:9: ','
+            {
+            match(','); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end COMMA
+
+    // $ANTLR start SEMICOLON
+    public final void mSEMICOLON() throws RecognitionException {
+        try {
+            int _type = SEMICOLON;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:446:2: ( ';' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:446:4: ';'
+            {
+            match(';'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end SEMICOLON
+
+    // $ANTLR start AMPERSAND
+    public final void mAMPERSAND() throws RecognitionException {
+        try {
+            int _type = AMPERSAND;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:450:2: ( '&' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:450:4: '&'
+            {
+            match('&'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end AMPERSAND
+
+    // $ANTLR start BAR
+    public final void mBAR() throws RecognitionException {
+        try {
+            int _type = BAR;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:452:5: ( '|' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:452:7: '|'
+            {
+            match('|'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end BAR
+
+    // $ANTLR start LANGLE
+    public final void mLANGLE() throws RecognitionException {
+        try {
+            int _type = LANGLE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:455:8: ( '<' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:455:10: '<'
+            {
+            match('<'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LANGLE
+
+    // $ANTLR start RANGLE
+    public final void mRANGLE() throws RecognitionException {
+        try {
+            int _type = RANGLE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:458:9: ( '>' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:458:11: '>'
+            {
+            match('>'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RANGLE
+
+    // $ANTLR start PERCENT
+    public final void mPERCENT() throws RecognitionException {
+        try {
+            int _type = PERCENT;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:461:9: ( '%' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:461:11: '%'
+            {
+            match('%'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PERCENT
+
+    // $ANTLR start PLUS
+    public final void mPLUS() throws RecognitionException {
+        try {
+            int _type = PLUS;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:464:6: ( '+' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:464:8: '+'
+            {
+            match('+'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end PLUS
+
+    // $ANTLR start MINUS
+    public final void mMINUS() throws RecognitionException {
+        try {
+            int _type = MINUS;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:467:7: ( '-' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:467:9: '-'
+            {
+            match('-'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end MINUS
+
+    // $ANTLR start STAR
+    public final void mSTAR() throws RecognitionException {
+        try {
+            int _type = STAR;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:470:6: ( '*' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:470:8: '*'
+            {
+            match('*'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end STAR
+
+    // $ANTLR start TILDE
+    public final void mTILDE() throws RecognitionException {
+        try {
+            int _type = TILDE;
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:473:8: ( '~' )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:473:10: '~'
+            {
+            match('~'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end TILDE
+
+    public void mTokens() throws RecognitionException {
+        // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:8: ( WS | AT_IMPORT | AT_PREFIX | AT_BASE | AT_DELAY | INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC | NOT | PAST | PRESENT | FUTURE | CONJ | DISJ | OPEN_BRACE | CLOSE_BRACE | LPAREN | RPAREN | LBRACKET | RBRACKET | PNAME_NS | PNAME_LN | TRUE | FALSE | IRI_REF | LANGTAG | QUERY_VAR | STM_VAR | INTEGER | DECIMAL | DOUBLE | INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE | INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE | STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 | COMMENT | REFERENCE | EXCLAMATION | QUESTION | DOT | COMMA | SEMICOLON | AMPERSAND | BAR | LANGLE | RANGLE | PERCENT | PLUS | MINUS | STAR | TILDE )
+        int alt36=66;
+        alt36 = dfa36.predict(input);
+        switch (alt36) {
+            case 1 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:10: WS
+                {
+                mWS(); 
+
+                }
+                break;
+            case 2 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:13: AT_IMPORT
+                {
+                mAT_IMPORT(); 
+
+                }
+                break;
+            case 3 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:23: AT_PREFIX
+                {
+                mAT_PREFIX(); 
+
+                }
+                break;
+            case 4 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:33: AT_BASE
+                {
+                mAT_BASE(); 
+
+                }
+                break;
+            case 5 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:41: AT_DELAY
+                {
+                mAT_DELAY(); 
+
+                }
+                break;
+            case 6 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:50: INHERITANCE
+                {
+                mINHERITANCE(); 
+
+                }
+                break;
+            case 7 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:62: SIMILARITY
+                {
+                mSIMILARITY(); 
+
+                }
+                break;
+            case 8 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:73: INSTANCE
+                {
+                mINSTANCE(); 
+
+                }
+                break;
+            case 9 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:82: PROPERTY
+                {
+                mPROPERTY(); 
+
+                }
+                break;
+            case 10 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:91: INSTANCE_PROPERTY
+                {
+                mINSTANCE_PROPERTY(); 
+
+                }
+                break;
+            case 11 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:109: IMPLICATION
+                {
+                mIMPLICATION(); 
+
+                }
+                break;
+            case 12 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:121: IMPLICATION_PRED
+                {
+                mIMPLICATION_PRED(); 
+
+                }
+                break;
+            case 13 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:138: IMPLICATION_RETRO
+                {
+                mIMPLICATION_RETRO(); 
+
+                }
+                break;
+            case 14 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:156: IMPLICATION_CONC
+                {
+                mIMPLICATION_CONC(); 
+
+                }
+                break;
+            case 15 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:173: EQUIVALENCE
+                {
+                mEQUIVALENCE(); 
+
+                }
+                break;
+            case 16 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:185: EQUIVALENCE_PRED
+                {
+                mEQUIVALENCE_PRED(); 
+
+                }
+                break;
+            case 17 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:202: EQUIVALENCE_CONC
+                {
+                mEQUIVALENCE_CONC(); 
+
+                }
+                break;
+            case 18 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:219: NOT
+                {
+                mNOT(); 
+
+                }
+                break;
+            case 19 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:223: PAST
+                {
+                mPAST(); 
+
+                }
+                break;
+            case 20 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:228: PRESENT
+                {
+                mPRESENT(); 
+
+                }
+                break;
+            case 21 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:236: FUTURE
+                {
+                mFUTURE(); 
+
+                }
+                break;
+            case 22 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:243: CONJ
+                {
+                mCONJ(); 
+
+                }
+                break;
+            case 23 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:248: DISJ
+                {
+                mDISJ(); 
+
+                }
+                break;
+            case 24 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:253: OPEN_BRACE
+                {
+                mOPEN_BRACE(); 
+
+                }
+                break;
+            case 25 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:264: CLOSE_BRACE
+                {
+                mCLOSE_BRACE(); 
+
+                }
+                break;
+            case 26 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:276: LPAREN
+                {
+                mLPAREN(); 
+
+                }
+                break;
+            case 27 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:283: RPAREN
+                {
+                mRPAREN(); 
+
+                }
+                break;
+            case 28 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:290: LBRACKET
+                {
+                mLBRACKET(); 
+
+                }
+                break;
+            case 29 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:299: RBRACKET
+                {
+                mRBRACKET(); 
+
+                }
+                break;
+            case 30 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:308: PNAME_NS
+                {
+                mPNAME_NS(); 
+
+                }
+                break;
+            case 31 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:317: PNAME_LN
+                {
+                mPNAME_LN(); 
+
+                }
+                break;
+            case 32 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:326: TRUE
+                {
+                mTRUE(); 
+
+                }
+                break;
+            case 33 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:331: FALSE
+                {
+                mFALSE(); 
+
+                }
+                break;
+            case 34 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:337: IRI_REF
+                {
+                mIRI_REF(); 
+
+                }
+                break;
+            case 35 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:345: LANGTAG
+                {
+                mLANGTAG(); 
+
+                }
+                break;
+            case 36 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:353: QUERY_VAR
+                {
+                mQUERY_VAR(); 
+
+                }
+                break;
+            case 37 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:363: STM_VAR
+                {
+                mSTM_VAR(); 
+
+                }
+                break;
+            case 38 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:371: INTEGER
+                {
+                mINTEGER(); 
+
+                }
+                break;
+            case 39 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:379: DECIMAL
+                {
+                mDECIMAL(); 
+
+                }
+                break;
+            case 40 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:387: DOUBLE
+                {
+                mDOUBLE(); 
+
+                }
+                break;
+            case 41 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:394: INTEGER_POSITIVE
+                {
+                mINTEGER_POSITIVE(); 
+
+                }
+                break;
+            case 42 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:411: DECIMAL_POSITIVE
+                {
+                mDECIMAL_POSITIVE(); 
+
+                }
+                break;
+            case 43 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:428: DOUBLE_POSITIVE
+                {
+                mDOUBLE_POSITIVE(); 
+
+                }
+                break;
+            case 44 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:444: INTEGER_NEGATIVE
+                {
+                mINTEGER_NEGATIVE(); 
+
+                }
+                break;
+            case 45 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:461: DECIMAL_NEGATIVE
+                {
+                mDECIMAL_NEGATIVE(); 
+
+                }
+                break;
+            case 46 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:478: DOUBLE_NEGATIVE
+                {
+                mDOUBLE_NEGATIVE(); 
+
+                }
+                break;
+            case 47 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:494: STRING_LITERAL1
+                {
+                mSTRING_LITERAL1(); 
+
+                }
+                break;
+            case 48 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:510: STRING_LITERAL2
+                {
+                mSTRING_LITERAL2(); 
+
+                }
+                break;
+            case 49 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:526: STRING_LITERAL_LONG1
+                {
+                mSTRING_LITERAL_LONG1(); 
+
+                }
+                break;
+            case 50 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:547: STRING_LITERAL_LONG2
+                {
+                mSTRING_LITERAL_LONG2(); 
+
+                }
+                break;
+            case 51 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:568: COMMENT
+                {
+                mCOMMENT(); 
+
+                }
+                break;
+            case 52 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:576: REFERENCE
+                {
+                mREFERENCE(); 
+
+                }
+                break;
+            case 53 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:586: EXCLAMATION
+                {
+                mEXCLAMATION(); 
+
+                }
+                break;
+            case 54 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:598: QUESTION
+                {
+                mQUESTION(); 
+
+                }
+                break;
+            case 55 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:607: DOT
+                {
+                mDOT(); 
+
+                }
+                break;
+            case 56 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:611: COMMA
+                {
+                mCOMMA(); 
+
+                }
+                break;
+            case 57 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:617: SEMICOLON
+                {
+                mSEMICOLON(); 
+
+                }
+                break;
+            case 58 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:627: AMPERSAND
+                {
+                mAMPERSAND(); 
+
+                }
+                break;
+            case 59 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:637: BAR
+                {
+                mBAR(); 
+
+                }
+                break;
+            case 60 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:641: LANGLE
+                {
+                mLANGLE(); 
+
+                }
+                break;
+            case 61 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:648: RANGLE
+                {
+                mRANGLE(); 
+
+                }
+                break;
+            case 62 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:655: PERCENT
+                {
+                mPERCENT(); 
+
+                }
+                break;
+            case 63 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:663: PLUS
+                {
+                mPLUS(); 
+
+                }
+                break;
+            case 64 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:668: MINUS
+                {
+                mMINUS(); 
+
+                }
+                break;
+            case 65 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:674: STAR
+                {
+                mSTAR(); 
+
+                }
+                break;
+            case 66 :
+                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:679: TILDE
+                {
+                mTILDE(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA19 dfa19 = new DFA19(this);
+    protected DFA36 dfa36 = new DFA36(this);
+    static final String DFA19_eotS =
+        "\5\uffff";
+    static final String DFA19_eofS =
+        "\5\uffff";
+    static final String DFA19_minS =
+        "\2\56\3\uffff";
+    static final String DFA19_maxS =
+        "\1\71\1\145\3\uffff";
+    static final String DFA19_acceptS =
+        "\2\uffff\1\2\1\1\1\3";
+    static final String DFA19_specialS =
+        "\5\uffff}>";
+    static final String[] DFA19_transitionS = {
+            "\1\2\1\uffff\12\1",
+            "\1\3\1\uffff\12\1\13\uffff\1\4\37\uffff\1\4",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA19_eot = DFA.unpackEncodedString(DFA19_eotS);
+    static final short[] DFA19_eof = DFA.unpackEncodedString(DFA19_eofS);
+    static final char[] DFA19_min = DFA.unpackEncodedStringToUnsignedChars(DFA19_minS);
+    static final char[] DFA19_max = DFA.unpackEncodedStringToUnsignedChars(DFA19_maxS);
+    static final short[] DFA19_accept = DFA.unpackEncodedString(DFA19_acceptS);
+    static final short[] DFA19_special = DFA.unpackEncodedString(DFA19_specialS);
+    static final short[][] DFA19_transition;
+
+    static {
+        int numStates = DFA19_transitionS.length;
+        DFA19_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA19_transition[i] = DFA.unpackEncodedString(DFA19_transitionS[i]);
+        }
+    }
+
+    class DFA19 extends DFA {
+
+        public DFA19(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 19;
+            this.eot = DFA19_eot;
+            this.eof = DFA19_eof;
+            this.min = DFA19_min;
+            this.max = DFA19_max;
+            this.accept = DFA19_accept;
+            this.special = DFA19_special;
+            this.transition = DFA19_transition;
+        }
+        public String getDescription() {
+            return "310:1: DOUBLE : ( ( DIGIT )+ DOT ( DIGIT )* EXPONENT | DOT ( DIGIT )+ EXPONENT | ( DIGIT )+ EXPONENT );";
+        }
+    }
+    static final String DFA36_eotS =
+        "\3\uffff\1\51\1\60\1\63\1\uffff\1\71\1\uffff\1\74\1\uffff\1\100"+
+        "\6\uffff\1\104\2\uffff\1\107\1\uffff\1\111\1\114\1\116\11\uffff"+
+        "\4\47\3\uffff\1\133\37\uffff\1\146\2\uffff\1\146\1\uffff\1\150\1"+
+        "\uffff\1\122\1\uffff\1\124\1\uffff\4\47\3\uffff\1\162\1\uffff\1"+
+        "\162\10\uffff\1\146\1\uffff\1\171\1\uffff\1\171\2\uffff\4\47\1\uffff"+
+        "\1\162\3\uffff\1\177\2\uffff\1\171\3\47\1\u0084\1\uffff\1\u0085"+
+        "\2\47\1\u0088\2\uffff\1\u0089\1\u008a\3\uffff";
+    static final String DFA36_eofS =
+        "\u008b\uffff";
+    static final String DFA36_minS =
+        "\1\11\1\uffff\1\101\1\55\1\41\1\55\1\57\1\41\1\uffff\1\76\1\57\1"+
+        "\46\5\uffff\1\55\1\60\2\55\1\60\1\uffff\1\56\1\60\1\56\2\0\7\uffff"+
+        "\1\155\1\162\1\145\1\141\1\uffff\1\76\1\uffff\1\56\1\60\2\41\1\uffff"+
+        "\1\41\2\uffff\1\76\16\uffff\3\55\2\uffff\1\55\3\uffff\1\60\2\uffff"+
+        "\1\60\1\uffff\1\56\1\60\1\47\1\uffff\1\42\1\uffff\1\160\1\145\1"+
+        "\154\1\163\3\uffff\1\60\1\uffff\1\60\5\uffff\2\55\1\uffff\1\60\1"+
+        "\uffff\1\60\1\uffff\1\60\2\uffff\1\157\1\146\1\141\1\145\1\uffff"+
+        "\1\60\3\uffff\2\55\1\uffff\1\60\1\162\1\151\1\171\1\55\1\uffff\1"+
+        "\55\1\164\1\170\1\55\2\uffff\2\55\3\uffff";
+    static final String DFA36_maxS =
+        "\1\ufffd\1\uffff\1\ufffd\1\71\1\ufffe\1\55\1\174\1\41\1\uffff\1"+
+        "\174\1\76\1\46\5\uffff\5\ufffd\1\uffff\1\145\2\71\2\ufffe\7\uffff"+
+        "\1\155\1\162\1\145\1\141\1\uffff\1\133\1\uffff\1\145\1\71\2\ufffe"+
+        "\1\uffff\1\ufffe\2\uffff\1\133\16\uffff\3\ufffd\2\uffff\1\ufffd"+
+        "\3\uffff\1\145\2\uffff\1\145\1\uffff\1\145\1\71\1\47\1\uffff\1\42"+
+        "\1\uffff\1\160\1\145\1\154\1\163\3\uffff\1\145\1\uffff\1\145\5\uffff"+
+        "\2\ufffd\1\uffff\1\145\1\uffff\1\145\1\uffff\1\145\2\uffff\1\157"+
+        "\1\146\1\141\1\145\1\uffff\1\145\3\uffff\2\ufffd\1\uffff\1\145\1"+
+        "\162\1\151\1\171\1\ufffd\1\uffff\1\ufffd\1\164\1\170\1\ufffd\2\uffff"+
+        "\2\ufffd\3\uffff";
+    static final String DFA36_acceptS =
+        "\1\uffff\1\1\6\uffff\1\23\3\uffff\1\30\1\32\1\33\1\34\1\35\5\uffff"+
+        "\1\45\5\uffff\1\64\1\70\1\71\1\75\1\76\1\101\1\102\4\uffff\1\43"+
+        "\1\uffff\1\100\4\uffff\1\21\1\uffff\1\74\1\42\1\uffff\1\31\1\14"+
+        "\1\13\1\15\1\16\1\22\1\65\1\24\1\27\1\73\1\25\1\63\1\26\1\72\3\uffff"+
+        "\1\36\1\37\1\uffff\1\66\1\44\1\46\1\uffff\1\50\1\67\1\uffff\1\77"+
+        "\3\uffff\1\57\1\uffff\1\60\4\uffff\1\11\1\6\1\54\1\uffff\1\56\1"+
+        "\uffff\1\17\1\7\1\20\1\12\1\10\2\uffff\1\47\1\uffff\1\51\1\uffff"+
+        "\1\53\1\uffff\1\61\1\62\4\uffff\1\55\1\uffff\1\17\1\7\1\20\2\uffff"+
+        "\1\52\5\uffff\1\40\4\uffff\1\4\1\41\2\uffff\1\5\1\2\1\3";
+    static final String DFA36_specialS =
+        "\u008b\uffff}>";
+    static final String[] DFA36_transitionS = {
+            "\2\1\2\uffff\1\1\22\uffff\1\1\1\7\1\33\1\26\1\uffff\1\40\1\13"+
+            "\1\32\1\15\1\16\1\41\1\31\1\35\1\3\1\30\1\12\12\27\1\22\1\36"+
+            "\1\4\1\6\1\37\1\25\1\2\5\24\1\23\15\24\1\21\6\24\1\17\1\10\1"+
+            "\20\1\34\2\uffff\5\24\1\23\15\24\1\21\6\24\1\14\1\11\1\5\1\42"+
+            "\101\uffff\27\24\1\uffff\37\24\1\uffff\u0208\24\160\uffff\16"+
+            "\24\1\uffff\u1c81\24\14\uffff\2\24\142\uffff\u0120\24\u0a70"+
+            "\uffff\u03f0\24\21\uffff\ua7ff\24\u2100\uffff\u04d0\24\40\uffff"+
+            "\u020e\24",
+            "",
+            "\32\47\6\uffff\1\47\1\46\1\47\1\45\4\47\1\43\6\47\1\44\12\47"+
+            "\105\uffff\27\47\1\uffff\37\47\1\uffff\u0208\47\160\uffff\16"+
+            "\47\1\uffff\u1c81\47\14\uffff\2\47\142\uffff\u0120\47\u0a70"+
+            "\uffff\u03f0\47\21\uffff\ua7ff\47\u2100\uffff\u04d0\47\40\uffff"+
+            "\u020e\47",
+            "\1\50\1\53\1\uffff\12\52",
+            "\1\61\1\uffff\12\61\1\55\1\61\1\57\14\61\1\uffff\1\54\36\61"+
+            "\1\uffff\1\61\1\uffff\1\61\1\uffff\32\61\1\uffff\1\56\1\uffff"+
+            "\uff81\61",
+            "\1\62",
+            "\1\64\15\uffff\1\65\36\uffff\1\66\37\uffff\1\67",
+            "\1\70",
+            "",
+            "\1\72\75\uffff\1\73",
+            "\1\76\16\uffff\1\75",
+            "\1\77",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\21\102\1\101\10\102"+
+            "\4\uffff\1\102\1\uffff\21\102\1\101\10\102\74\uffff\1\102\10"+
+            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
+            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
+            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
+            "\uffff\u020e\102",
+            "\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105\105\uffff"+
+            "\27\105\1\uffff\37\105\1\uffff\u0208\105\160\uffff\16\105\1"+
+            "\uffff\u1c81\105\14\uffff\2\105\142\uffff\u0120\105\u0a70\uffff"+
+            "\u03f0\105\21\uffff\ua7ff\105\u2100\uffff\u04d0\105\40\uffff"+
+            "\u020e\105",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\1\106\31\102\4\uffff"+
+            "\1\102\1\uffff\1\106\31\102\74\uffff\1\102\10\uffff\27\102\1"+
+            "\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2"+
+            "\102\61\uffff\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102"+
+            "\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\32\102\4\uffff\1\102"+
+            "\1\uffff\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102"+
+            "\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff"+
+            "\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff"+
+            "\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
+            "\12\110\7\uffff\32\110\4\uffff\1\110\1\uffff\32\110\105\uffff"+
+            "\27\110\1\uffff\37\110\1\uffff\u0208\110\160\uffff\16\110\1"+
+            "\uffff\u1c81\110\14\uffff\2\110\142\uffff\u0120\110\u0a70\uffff"+
+            "\u03f0\110\21\uffff\ua7ff\110\u2100\uffff\u04d0\110\40\uffff"+
+            "\u020e\110",
+            "",
+            "\1\112\1\uffff\12\27\13\uffff\1\113\37\uffff\1\113",
+            "\12\115",
+            "\1\120\1\uffff\12\117",
+            "\12\122\1\uffff\2\122\1\uffff\31\122\1\121\uffd7\122",
+            "\12\124\1\uffff\2\124\1\uffff\24\124\1\123\uffdc\124",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\125",
+            "\1\126",
+            "\1\127",
+            "\1\130",
+            "",
+            "\1\132\34\uffff\1\131",
+            "",
+            "\1\134\1\uffff\12\52\13\uffff\1\135\37\uffff\1\135",
+            "\12\136",
+            "\1\61\1\uffff\31\61\1\uffff\1\61\1\137\35\61\1\uffff\1\61\1"+
+            "\uffff\1\61\1\uffff\32\61\3\uffff\uff81\61",
+            "\1\61\1\uffff\31\61\1\uffff\1\61\1\140\35\61\1\uffff\1\61\1"+
+            "\uffff\1\61\1\uffff\32\61\3\uffff\uff81\61",
+            "",
+            "\1\61\1\uffff\31\61\1\uffff\1\61\1\141\35\61\1\uffff\1\61\1"+
+            "\uffff\1\61\1\uffff\32\61\3\uffff\uff81\61",
+            "",
+            "",
+            "\1\143\34\uffff\1\142",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\24\102\1\144\5\102"+
+            "\4\uffff\1\102\1\uffff\24\102\1\144\5\102\74\uffff\1\102\10"+
+            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
+            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
+            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
+            "\uffff\u020e\102",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\32\102\4\uffff\1\102"+
+            "\1\uffff\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102"+
+            "\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff"+
+            "\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff"+
+            "\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
+            "\1\102\1\103\1\uffff\12\102\7\uffff\32\102\4\uffff\1\102\1\uffff"+
+            "\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102\1\uffff"+
+            "\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff\2\102\57"+
+            "\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff\102\u2100"+
+            "\uffff\u04d0\102\40\uffff\u020e\102",
+            "",
+            "",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\13\102\1\145\16\102"+
+            "\4\uffff\1\102\1\uffff\13\102\1\145\16\102\74\uffff\1\102\10"+
+            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
+            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
+            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
+            "\uffff\u020e\102",
+            "",
+            "",
+            "",
+            "\12\147\13\uffff\1\113\37\uffff\1\113",
+            "",
+            "",
+            "\12\115\13\uffff\1\113\37\uffff\1\113",
+            "",
+            "\1\151\1\uffff\12\117\13\uffff\1\152\37\uffff\1\152",
+            "\12\153",
+            "\1\154",
+            "",
+            "\1\155",
+            "",
+            "\1\156",
+            "\1\157",
+            "\1\160",
+            "\1\161",
+            "",
+            "",
+            "",
+            "\12\163\13\uffff\1\135\37\uffff\1\135",
+            "",
+            "\12\136\13\uffff\1\135\37\uffff\1\135",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\4\102\1\167\25\102"+
+            "\4\uffff\1\102\1\uffff\4\102\1\167\25\102\74\uffff\1\102\10"+
+            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
+            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
+            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
+            "\uffff\u020e\102",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\22\102\1\170\7\102"+
+            "\4\uffff\1\102\1\uffff\22\102\1\170\7\102\74\uffff\1\102\10"+
+            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
+            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
+            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
+            "\uffff\u020e\102",
+            "",
+            "\12\147\13\uffff\1\113\37\uffff\1\113",
+            "",
+            "\12\172\13\uffff\1\152\37\uffff\1\152",
+            "",
+            "\12\153\13\uffff\1\152\37\uffff\1\152",
+            "",
+            "",
+            "\1\173",
+            "\1\174",
+            "\1\175",
+            "\1\176",
+            "",
+            "\12\163\13\uffff\1\135\37\uffff\1\135",
+            "",
+            "",
+            "",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\32\102\4\uffff\1\102"+
+            "\1\uffff\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102"+
+            "\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff"+
+            "\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff"+
+            "\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\4\102\1\u0080\25\102"+
+            "\4\uffff\1\102\1\uffff\4\102\1\u0080\25\102\74\uffff\1\102\10"+
+            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
+            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
+            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
+            "\uffff\u020e\102",
+            "",
+            "\12\172\13\uffff\1\152\37\uffff\1\152",
+            "\1\u0081",
+            "\1\u0082",
+            "\1\u0083",
+            "\1\47\23\uffff\32\47\6\uffff\32\47\105\uffff\27\47\1\uffff\37"+
+            "\47\1\uffff\u0208\47\160\uffff\16\47\1\uffff\u1c81\47\14\uffff"+
+            "\2\47\142\uffff\u0120\47\u0a70\uffff\u03f0\47\21\uffff\ua7ff"+
+            "\47\u2100\uffff\u04d0\47\40\uffff\u020e\47",
+            "",
+            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\32\102\4\uffff\1\102"+
+            "\1\uffff\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102"+
+            "\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff"+
+            "\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff"+
+            "\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
+            "\1\u0086",
+            "\1\u0087",
+            "\1\47\23\uffff\32\47\6\uffff\32\47\105\uffff\27\47\1\uffff\37"+
+            "\47\1\uffff\u0208\47\160\uffff\16\47\1\uffff\u1c81\47\14\uffff"+
+            "\2\47\142\uffff\u0120\47\u0a70\uffff\u03f0\47\21\uffff\ua7ff"+
+            "\47\u2100\uffff\u04d0\47\40\uffff\u020e\47",
+            "",
+            "",
+            "\1\47\23\uffff\32\47\6\uffff\32\47\105\uffff\27\47\1\uffff\37"+
+            "\47\1\uffff\u0208\47\160\uffff\16\47\1\uffff\u1c81\47\14\uffff"+
+            "\2\47\142\uffff\u0120\47\u0a70\uffff\u03f0\47\21\uffff\ua7ff"+
+            "\47\u2100\uffff\u04d0\47\40\uffff\u020e\47",
+            "\1\47\23\uffff\32\47\6\uffff\32\47\105\uffff\27\47\1\uffff\37"+
+            "\47\1\uffff\u0208\47\160\uffff\16\47\1\uffff\u1c81\47\14\uffff"+
+            "\2\47\142\uffff\u0120\47\u0a70\uffff\u03f0\47\21\uffff\ua7ff"+
+            "\47\u2100\uffff\u04d0\47\40\uffff\u020e\47",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA36_eot = DFA.unpackEncodedString(DFA36_eotS);
+    static final short[] DFA36_eof = DFA.unpackEncodedString(DFA36_eofS);
+    static final char[] DFA36_min = DFA.unpackEncodedStringToUnsignedChars(DFA36_minS);
+    static final char[] DFA36_max = DFA.unpackEncodedStringToUnsignedChars(DFA36_maxS);
+    static final short[] DFA36_accept = DFA.unpackEncodedString(DFA36_acceptS);
+    static final short[] DFA36_special = DFA.unpackEncodedString(DFA36_specialS);
+    static final short[][] DFA36_transition;
+
+    static {
+        int numStates = DFA36_transitionS.length;
+        DFA36_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA36_transition[i] = DFA.unpackEncodedString(DFA36_transitionS[i]);
+        }
+    }
+
+    class DFA36 extends DFA {
+
+        public DFA36(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 36;
+            this.eot = DFA36_eot;
+            this.eof = DFA36_eof;
+            this.min = DFA36_min;
+            this.max = DFA36_max;
+            this.accept = DFA36_accept;
+            this.special = DFA36_special;
+            this.transition = DFA36_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( WS | AT_IMPORT | AT_PREFIX | AT_BASE | AT_DELAY | INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC | NOT | PAST | PRESENT | FUTURE | CONJ | DISJ | OPEN_BRACE | CLOSE_BRACE | LPAREN | RPAREN | LBRACKET | RBRACKET | PNAME_NS | PNAME_LN | TRUE | FALSE | IRI_REF | LANGTAG | QUERY_VAR | STM_VAR | INTEGER | DECIMAL | DOUBLE | INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE | INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE | STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 | COMMENT | REFERENCE | EXCLAMATION | QUESTION | DOT | COMMA | SEMICOLON | AMPERSAND | BAR | LANGLE | RANGLE | PERCENT | PLUS | MINUS | STAR | TILDE );";
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/parser/loan/loanParser.java b/open-nars/com/googlecode/opennars/parser/loan/loanParser.java
new file mode 100644
index 0000000..b70c733
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/loanParser.java
@@ -0,0 +1,3160 @@
+package com.googlecode.opennars.parser.loan;
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+
+import org.antlr.runtime.tree.*;
+
+public class loanParser extends Parser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "AT_BASE", "IRI_REF", "DOT", "AT_IMPORT", "AT_PREFIX", "PNAME_NS", "AT_DELAY", "LPAREN", "INTEGER", "RPAREN", "EXCLAMATION", "QUESTION", "PERCENT", "DECIMAL", "SEMICOLON", "CONJ", "COMMA", "DISJ", "NOT", "PAST", "PRESENT", "FUTURE", "INHERITANCE", "SIMILARITY", "INSTANCE", "PROPERTY", "INSTANCE_PROPERTY", "IMPLICATION", "IMPLICATION_PRED", "IMPLICATION_RETRO", "IMPLICATION_CONC", "EQUIVALENCE", "EQUIVALENCE_PRED", "EQUIVALENCE_CONC", "AMPERSAND", "BAR", "OPEN_BRACE", "CLOSE_BRACE", "LBRACKET", "RBRACKET", "MINUS", "TILDE", "STAR", "QUERY_VAR", "STM_VAR", "DOUBLE", "INTEGER_POSITIVE", "DECIMAL_POSITIVE", "DOUBLE_POSITIVE", "INTEGER_NEGATIVE", "DECIMAL_NEGATIVE", "DOUBLE_NEGATIVE", "TRUE", "FALSE", "STRING_LITERAL1", "STRING_LITERAL2", "STRING_LITERAL_LONG1", "STRING_LITERAL_LONG2", "PNAME_LN", "EOL", "WS", "PN_PREFIX", "PN_LOCAL", "LANGLE", "RANGLE", "PN_CHARS_BASE", "DIGIT", "LANGTAG", "EXPONENT", "PLUS", "ECHAR", "PN_CHARS_U", "VARNAME", "PN_CHARS", "COMMENT", "REFERENCE"
+    };
+    public static final int COMMA=20;
+    public static final int PN_CHARS_U=75;
+    public static final int MINUS=44;
+    public static final int PERCENT=16;
+    public static final int AT_PREFIX=8;
+    public static final int OPEN_BRACE=40;
+    public static final int DOUBLE=49;
+    public static final int AT_BASE=4;
+    public static final int EQUIVALENCE=35;
+    public static final int FALSE=57;
+    public static final int PN_CHARS_BASE=69;
+    public static final int EQUIVALENCE_CONC=37;
+    public static final int QUERY_VAR=47;
+    public static final int AT_DELAY=10;
+    public static final int LBRACKET=42;
+    public static final int INHERITANCE=26;
+    public static final int INSTANCE=28;
+    public static final int TILDE=45;
+    public static final int DECIMAL=17;
+    public static final int QUESTION=15;
+    public static final int CONJ=19;
+    public static final int DISJ=21;
+    public static final int IMPLICATION=31;
+    public static final int DOT=6;
+    public static final int STM_VAR=48;
+    public static final int RANGLE=68;
+    public static final int INTEGER=12;
+    public static final int IMPLICATION_RETRO=33;
+    public static final int FUTURE=25;
+    public static final int RBRACKET=43;
+    public static final int RPAREN=13;
+    public static final int PN_PREFIX=65;
+    public static final int EQUIVALENCE_PRED=36;
+    public static final int LANGLE=67;
+    public static final int LPAREN=11;
+    public static final int INSTANCE_PROPERTY=30;
+    public static final int ECHAR=74;
+    public static final int PLUS=73;
+    public static final int DIGIT=70;
+    public static final int AMPERSAND=38;
+    public static final int INTEGER_NEGATIVE=53;
+    public static final int PNAME_NS=9;
+    public static final int PAST=23;
+    public static final int SIMILARITY=27;
+    public static final int PROPERTY=29;
+    public static final int DECIMAL_POSITIVE=51;
+    public static final int STRING_LITERAL_LONG1=60;
+    public static final int IMPLICATION_PRED=32;
+    public static final int WS=64;
+    public static final int PNAME_LN=62;
+    public static final int LANGTAG=71;
+    public static final int EXCLAMATION=14;
+    public static final int PN_LOCAL=66;
+    public static final int VARNAME=76;
+    public static final int CLOSE_BRACE=41;
+    public static final int COMMENT=78;
+    public static final int PN_CHARS=77;
+    public static final int PRESENT=24;
+    public static final int AT_IMPORT=7;
+    public static final int STRING_LITERAL_LONG2=61;
+    public static final int DOUBLE_NEGATIVE=55;
+    public static final int EXPONENT=72;
+    public static final int SEMICOLON=18;
+    public static final int BAR=39;
+    public static final int DECIMAL_NEGATIVE=54;
+    public static final int EOF=-1;
+    public static final int IRI_REF=5;
+    public static final int DOUBLE_POSITIVE=52;
+    public static final int REFERENCE=79;
+    public static final int EOL=63;
+    public static final int INTEGER_POSITIVE=50;
+    public static final int STAR=46;
+    public static final int NOT=22;
+    public static final int STRING_LITERAL2=59;
+    public static final int TRUE=56;
+    public static final int STRING_LITERAL1=58;
+    public static final int IMPLICATION_CONC=34;
+
+        public loanParser(TokenStream input) {
+            super(input);
+        }
+        
+    protected TreeAdaptor adaptor = new CommonTreeAdaptor();
+
+    public void setTreeAdaptor(TreeAdaptor adaptor) {
+        this.adaptor = adaptor;
+    }
+    public TreeAdaptor getTreeAdaptor() {
+        return adaptor;
+    }
+
+    public String[] getTokenNames() { return tokenNames; }
+    public String getGrammarFileName() { return "/Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g"; }
+
+
+    public static class document_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start document
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:9:1: document : ( base_rule )? ( at_rule | sentence )* EOF ;
+    public final document_return document() throws RecognitionException {
+        document_return retval = new document_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token EOF4=null;
+        base_rule_return base_rule1 = null;
+
+        at_rule_return at_rule2 = null;
+
+        sentence_return sentence3 = null;
+
+
+        Object EOF4_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:2: ( ( base_rule )? ( at_rule | sentence )* EOF )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:4: ( base_rule )? ( at_rule | sentence )* EOF
+            {
+            root_0 = (Object)adaptor.nil();
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:4: ( base_rule )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0==AT_BASE) ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:4: base_rule
+                    {
+                    pushFollow(FOLLOW_base_rule_in_document27);
+                    base_rule1=base_rule();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, base_rule1.getTree());
+
+                    }
+                    break;
+
+            }
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:15: ( at_rule | sentence )*
+            loop2:
+            do {
+                int alt2=3;
+                int LA2_0 = input.LA(1);
+
+                if ( ((LA2_0>=AT_IMPORT && LA2_0<=AT_PREFIX)||LA2_0==AT_DELAY) ) {
+                    alt2=1;
+                }
+                else if ( (LA2_0==IRI_REF||LA2_0==PNAME_NS||(LA2_0>=LPAREN && LA2_0<=INTEGER)||LA2_0==DECIMAL||(LA2_0>=NOT && LA2_0<=FUTURE)||LA2_0==OPEN_BRACE||LA2_0==LBRACKET||(LA2_0>=QUERY_VAR && LA2_0<=PNAME_LN)) ) {
+                    alt2=2;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:16: at_rule
+            	    {
+            	    pushFollow(FOLLOW_at_rule_in_document31);
+            	    at_rule2=at_rule();
+            	    _fsp--;
+
+            	    adaptor.addChild(root_0, at_rule2.getTree());
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:26: sentence
+            	    {
+            	    pushFollow(FOLLOW_sentence_in_document35);
+            	    sentence3=sentence();
+            	    _fsp--;
+
+            	    adaptor.addChild(root_0, sentence3.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+            EOF4=(Token)input.LT(1);
+            match(input,EOF,FOLLOW_EOF_in_document39); 
+            EOF4_tree = (Object)adaptor.create(EOF4);
+            adaptor.addChild(root_0, EOF4_tree);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end document
+
+    public static class base_rule_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start base_rule
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:12:1: base_rule : AT_BASE IRI_REF DOT ;
+    public final base_rule_return base_rule() throws RecognitionException {
+        base_rule_return retval = new base_rule_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token AT_BASE5=null;
+        Token IRI_REF6=null;
+        Token DOT7=null;
+
+        Object AT_BASE5_tree=null;
+        Object IRI_REF6_tree=null;
+        Object DOT7_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:13:2: ( AT_BASE IRI_REF DOT )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:13:4: AT_BASE IRI_REF DOT
+            {
+            root_0 = (Object)adaptor.nil();
+
+            AT_BASE5=(Token)input.LT(1);
+            match(input,AT_BASE,FOLLOW_AT_BASE_in_base_rule50); 
+            AT_BASE5_tree = (Object)adaptor.create(AT_BASE5);
+            root_0 = (Object)adaptor.becomeRoot(AT_BASE5_tree, root_0);
+
+            IRI_REF6=(Token)input.LT(1);
+            match(input,IRI_REF,FOLLOW_IRI_REF_in_base_rule53); 
+            IRI_REF6_tree = (Object)adaptor.create(IRI_REF6);
+            adaptor.addChild(root_0, IRI_REF6_tree);
+
+            DOT7=(Token)input.LT(1);
+            match(input,DOT,FOLLOW_DOT_in_base_rule55); 
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end base_rule
+
+    public static class at_rule_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start at_rule
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:16:1: at_rule : ( AT_IMPORT IRI_REF DOT | AT_PREFIX PNAME_NS IRI_REF DOT | AT_DELAY LPAREN INTEGER RPAREN DOT );
+    public final at_rule_return at_rule() throws RecognitionException {
+        at_rule_return retval = new at_rule_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token AT_IMPORT8=null;
+        Token IRI_REF9=null;
+        Token DOT10=null;
+        Token AT_PREFIX11=null;
+        Token PNAME_NS12=null;
+        Token IRI_REF13=null;
+        Token DOT14=null;
+        Token AT_DELAY15=null;
+        Token LPAREN16=null;
+        Token INTEGER17=null;
+        Token RPAREN18=null;
+        Token DOT19=null;
+
+        Object AT_IMPORT8_tree=null;
+        Object IRI_REF9_tree=null;
+        Object DOT10_tree=null;
+        Object AT_PREFIX11_tree=null;
+        Object PNAME_NS12_tree=null;
+        Object IRI_REF13_tree=null;
+        Object DOT14_tree=null;
+        Object AT_DELAY15_tree=null;
+        Object LPAREN16_tree=null;
+        Object INTEGER17_tree=null;
+        Object RPAREN18_tree=null;
+        Object DOT19_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:16:9: ( AT_IMPORT IRI_REF DOT | AT_PREFIX PNAME_NS IRI_REF DOT | AT_DELAY LPAREN INTEGER RPAREN DOT )
+            int alt3=3;
+            switch ( input.LA(1) ) {
+            case AT_IMPORT:
+                {
+                alt3=1;
+                }
+                break;
+            case AT_PREFIX:
+                {
+                alt3=2;
+                }
+                break;
+            case AT_DELAY:
+                {
+                alt3=3;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("16:1: at_rule : ( AT_IMPORT IRI_REF DOT | AT_PREFIX PNAME_NS IRI_REF DOT | AT_DELAY LPAREN INTEGER RPAREN DOT );", 3, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt3) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:16:11: AT_IMPORT IRI_REF DOT
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    AT_IMPORT8=(Token)input.LT(1);
+                    match(input,AT_IMPORT,FOLLOW_AT_IMPORT_in_at_rule66); 
+                    AT_IMPORT8_tree = (Object)adaptor.create(AT_IMPORT8);
+                    root_0 = (Object)adaptor.becomeRoot(AT_IMPORT8_tree, root_0);
+
+                    IRI_REF9=(Token)input.LT(1);
+                    match(input,IRI_REF,FOLLOW_IRI_REF_in_at_rule69); 
+                    IRI_REF9_tree = (Object)adaptor.create(IRI_REF9);
+                    adaptor.addChild(root_0, IRI_REF9_tree);
+
+                    DOT10=(Token)input.LT(1);
+                    match(input,DOT,FOLLOW_DOT_in_at_rule71); 
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:17:4: AT_PREFIX PNAME_NS IRI_REF DOT
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    AT_PREFIX11=(Token)input.LT(1);
+                    match(input,AT_PREFIX,FOLLOW_AT_PREFIX_in_at_rule77); 
+                    AT_PREFIX11_tree = (Object)adaptor.create(AT_PREFIX11);
+                    root_0 = (Object)adaptor.becomeRoot(AT_PREFIX11_tree, root_0);
+
+                    PNAME_NS12=(Token)input.LT(1);
+                    match(input,PNAME_NS,FOLLOW_PNAME_NS_in_at_rule80); 
+                    PNAME_NS12_tree = (Object)adaptor.create(PNAME_NS12);
+                    adaptor.addChild(root_0, PNAME_NS12_tree);
+
+                    IRI_REF13=(Token)input.LT(1);
+                    match(input,IRI_REF,FOLLOW_IRI_REF_in_at_rule82); 
+                    IRI_REF13_tree = (Object)adaptor.create(IRI_REF13);
+                    adaptor.addChild(root_0, IRI_REF13_tree);
+
+                    DOT14=(Token)input.LT(1);
+                    match(input,DOT,FOLLOW_DOT_in_at_rule84); 
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:18:4: AT_DELAY LPAREN INTEGER RPAREN DOT
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    AT_DELAY15=(Token)input.LT(1);
+                    match(input,AT_DELAY,FOLLOW_AT_DELAY_in_at_rule90); 
+                    AT_DELAY15_tree = (Object)adaptor.create(AT_DELAY15);
+                    root_0 = (Object)adaptor.becomeRoot(AT_DELAY15_tree, root_0);
+
+                    LPAREN16=(Token)input.LT(1);
+                    match(input,LPAREN,FOLLOW_LPAREN_in_at_rule93); 
+                    INTEGER17=(Token)input.LT(1);
+                    match(input,INTEGER,FOLLOW_INTEGER_in_at_rule96); 
+                    INTEGER17_tree = (Object)adaptor.create(INTEGER17);
+                    adaptor.addChild(root_0, INTEGER17_tree);
+
+                    RPAREN18=(Token)input.LT(1);
+                    match(input,RPAREN,FOLLOW_RPAREN_in_at_rule98); 
+                    DOT19=(Token)input.LT(1);
+                    match(input,DOT,FOLLOW_DOT_in_at_rule101); 
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end at_rule
+
+    public static class sentence_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start sentence
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:21:1: sentence : statement ( judgement | question | goal ) ;
+    public final sentence_return sentence() throws RecognitionException {
+        sentence_return retval = new sentence_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        statement_return statement20 = null;
+
+        judgement_return judgement21 = null;
+
+        question_return question22 = null;
+
+        goal_return goal23 = null;
+
+
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:2: ( statement ( judgement | question | goal ) )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:4: statement ( judgement | question | goal )
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_statement_in_sentence114);
+            statement20=statement();
+            _fsp--;
+
+            adaptor.addChild(root_0, statement20.getTree());
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:14: ( judgement | question | goal )
+            int alt4=3;
+            switch ( input.LA(1) ) {
+            case DOT:
+                {
+                alt4=1;
+                }
+                break;
+            case QUESTION:
+                {
+                alt4=2;
+                }
+                break;
+            case EXCLAMATION:
+                {
+                alt4=3;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("22:14: ( judgement | question | goal )", 4, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt4) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:15: judgement
+                    {
+                    pushFollow(FOLLOW_judgement_in_sentence117);
+                    judgement21=judgement();
+                    _fsp--;
+
+                    root_0 = (Object)adaptor.becomeRoot(judgement21.getTree(), root_0);
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:26: question
+                    {
+                    pushFollow(FOLLOW_question_in_sentence120);
+                    question22=question();
+                    _fsp--;
+
+                    root_0 = (Object)adaptor.becomeRoot(question22.getTree(), root_0);
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:36: goal
+                    {
+                    pushFollow(FOLLOW_goal_in_sentence123);
+                    goal23=goal();
+                    _fsp--;
+
+                    root_0 = (Object)adaptor.becomeRoot(goal23.getTree(), root_0);
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end sentence
+
+    public static class judgement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start judgement
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:25:1: judgement : DOT ( truthvalue )? ;
+    public final judgement_return judgement() throws RecognitionException {
+        judgement_return retval = new judgement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token DOT24=null;
+        truthvalue_return truthvalue25 = null;
+
+
+        Object DOT24_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:26:2: ( DOT ( truthvalue )? )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:26:4: DOT ( truthvalue )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            DOT24=(Token)input.LT(1);
+            match(input,DOT,FOLLOW_DOT_in_judgement138); 
+            DOT24_tree = (Object)adaptor.create(DOT24);
+            root_0 = (Object)adaptor.becomeRoot(DOT24_tree, root_0);
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:26:9: ( truthvalue )?
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==PERCENT) ) {
+                alt5=1;
+            }
+            switch (alt5) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:26:9: truthvalue
+                    {
+                    pushFollow(FOLLOW_truthvalue_in_judgement141);
+                    truthvalue25=truthvalue();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, truthvalue25.getTree());
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end judgement
+
+    public static class goal_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start goal
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:1: goal : EXCLAMATION ( truthvalue )? ;
+    public final goal_return goal() throws RecognitionException {
+        goal_return retval = new goal_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token EXCLAMATION26=null;
+        truthvalue_return truthvalue27 = null;
+
+
+        Object EXCLAMATION26_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:6: ( EXCLAMATION ( truthvalue )? )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:8: EXCLAMATION ( truthvalue )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            EXCLAMATION26=(Token)input.LT(1);
+            match(input,EXCLAMATION,FOLLOW_EXCLAMATION_in_goal153); 
+            EXCLAMATION26_tree = (Object)adaptor.create(EXCLAMATION26);
+            root_0 = (Object)adaptor.becomeRoot(EXCLAMATION26_tree, root_0);
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:21: ( truthvalue )?
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==PERCENT) ) {
+                alt6=1;
+            }
+            switch (alt6) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:21: truthvalue
+                    {
+                    pushFollow(FOLLOW_truthvalue_in_goal156);
+                    truthvalue27=truthvalue();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, truthvalue27.getTree());
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end goal
+
+    public static class question_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start question
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:32:1: question : QUESTION ;
+    public final question_return question() throws RecognitionException {
+        question_return retval = new question_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token QUESTION28=null;
+
+        Object QUESTION28_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:33:2: ( QUESTION )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:33:4: QUESTION
+            {
+            root_0 = (Object)adaptor.nil();
+
+            QUESTION28=(Token)input.LT(1);
+            match(input,QUESTION,FOLLOW_QUESTION_in_question170); 
+            QUESTION28_tree = (Object)adaptor.create(QUESTION28);
+            root_0 = (Object)adaptor.becomeRoot(QUESTION28_tree, root_0);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end question
+
+    public static class truthvalue_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start truthvalue
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:36:1: truthvalue : PERCENT ( DECIMAL | INTEGER ) ( SEMICOLON DECIMAL )? PERCENT ;
+    public final truthvalue_return truthvalue() throws RecognitionException {
+        truthvalue_return retval = new truthvalue_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token PERCENT29=null;
+        Token set30=null;
+        Token SEMICOLON31=null;
+        Token DECIMAL32=null;
+        Token PERCENT33=null;
+
+        Object PERCENT29_tree=null;
+        Object set30_tree=null;
+        Object SEMICOLON31_tree=null;
+        Object DECIMAL32_tree=null;
+        Object PERCENT33_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:37:2: ( PERCENT ( DECIMAL | INTEGER ) ( SEMICOLON DECIMAL )? PERCENT )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:37:4: PERCENT ( DECIMAL | INTEGER ) ( SEMICOLON DECIMAL )? PERCENT
+            {
+            root_0 = (Object)adaptor.nil();
+
+            PERCENT29=(Token)input.LT(1);
+            match(input,PERCENT,FOLLOW_PERCENT_in_truthvalue184); 
+            set30=(Token)input.LT(1);
+            if ( input.LA(1)==INTEGER||input.LA(1)==DECIMAL ) {
+                input.consume();
+                adaptor.addChild(root_0, adaptor.create(set30));
+                errorRecovery=false;
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_truthvalue187);    throw mse;
+            }
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:37:33: ( SEMICOLON DECIMAL )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==SEMICOLON) ) {
+                alt7=1;
+            }
+            switch (alt7) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:37:34: SEMICOLON DECIMAL
+                    {
+                    SEMICOLON31=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_truthvalue196); 
+                    SEMICOLON31_tree = (Object)adaptor.create(SEMICOLON31);
+                    adaptor.addChild(root_0, SEMICOLON31_tree);
+
+                    DECIMAL32=(Token)input.LT(1);
+                    match(input,DECIMAL,FOLLOW_DECIMAL_in_truthvalue198); 
+                    DECIMAL32_tree = (Object)adaptor.create(DECIMAL32);
+                    adaptor.addChild(root_0, DECIMAL32_tree);
+
+
+                    }
+                    break;
+
+            }
+
+            PERCENT33=(Token)input.LT(1);
+            match(input,PERCENT,FOLLOW_PERCENT_in_truthvalue202); 
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end truthvalue
+
+    public static class statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start statement
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:39:1: statement : unary_statement ( ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement )* ;
+    public final statement_return statement() throws RecognitionException {
+        statement_return retval = new statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token CONJ35=null;
+        Token SEMICOLON36=null;
+        Token COMMA37=null;
+        Token DISJ38=null;
+        unary_statement_return unary_statement34 = null;
+
+        unary_statement_return unary_statement39 = null;
+
+
+        Object CONJ35_tree=null;
+        Object SEMICOLON36_tree=null;
+        Object COMMA37_tree=null;
+        Object DISJ38_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:2: ( unary_statement ( ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement )* )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:4: unary_statement ( ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_unary_statement_in_statement213);
+            unary_statement34=unary_statement();
+            _fsp--;
+
+            adaptor.addChild(root_0, unary_statement34.getTree());
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:20: ( ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement )*
+            loop9:
+            do {
+                int alt9=2;
+                int LA9_0 = input.LA(1);
+
+                if ( ((LA9_0>=SEMICOLON && LA9_0<=DISJ)) ) {
+                    alt9=1;
+                }
+
+
+                switch (alt9) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:21: ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement
+            	    {
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:21: ( CONJ | SEMICOLON | COMMA | DISJ )
+            	    int alt8=4;
+            	    switch ( input.LA(1) ) {
+            	    case CONJ:
+            	        {
+            	        alt8=1;
+            	        }
+            	        break;
+            	    case SEMICOLON:
+            	        {
+            	        alt8=2;
+            	        }
+            	        break;
+            	    case COMMA:
+            	        {
+            	        alt8=3;
+            	        }
+            	        break;
+            	    case DISJ:
+            	        {
+            	        alt8=4;
+            	        }
+            	        break;
+            	    default:
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("40:21: ( CONJ | SEMICOLON | COMMA | DISJ )", 8, 0, input);
+
+            	        throw nvae;
+            	    }
+
+            	    switch (alt8) {
+            	        case 1 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:22: CONJ
+            	            {
+            	            CONJ35=(Token)input.LT(1);
+            	            match(input,CONJ,FOLLOW_CONJ_in_statement217); 
+            	            CONJ35_tree = (Object)adaptor.create(CONJ35);
+            	            root_0 = (Object)adaptor.becomeRoot(CONJ35_tree, root_0);
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:30: SEMICOLON
+            	            {
+            	            SEMICOLON36=(Token)input.LT(1);
+            	            match(input,SEMICOLON,FOLLOW_SEMICOLON_in_statement222); 
+            	            SEMICOLON36_tree = (Object)adaptor.create(SEMICOLON36);
+            	            root_0 = (Object)adaptor.becomeRoot(SEMICOLON36_tree, root_0);
+
+
+            	            }
+            	            break;
+            	        case 3 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:43: COMMA
+            	            {
+            	            COMMA37=(Token)input.LT(1);
+            	            match(input,COMMA,FOLLOW_COMMA_in_statement227); 
+            	            COMMA37_tree = (Object)adaptor.create(COMMA37);
+            	            root_0 = (Object)adaptor.becomeRoot(COMMA37_tree, root_0);
+
+
+            	            }
+            	            break;
+            	        case 4 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:52: DISJ
+            	            {
+            	            DISJ38=(Token)input.LT(1);
+            	            match(input,DISJ,FOLLOW_DISJ_in_statement232); 
+            	            DISJ38_tree = (Object)adaptor.create(DISJ38);
+            	            root_0 = (Object)adaptor.becomeRoot(DISJ38_tree, root_0);
+
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    pushFollow(FOLLOW_unary_statement_in_statement236);
+            	    unary_statement39=unary_statement();
+            	    _fsp--;
+
+            	    adaptor.addChild(root_0, unary_statement39.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop9;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end statement
+
+    public static class unary_statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start unary_statement
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:43:1: unary_statement : ( NOT simple_statement | PAST simple_statement | PRESENT simple_statement | FUTURE simple_statement | simple_statement );
+    public final unary_statement_return unary_statement() throws RecognitionException {
+        unary_statement_return retval = new unary_statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token NOT40=null;
+        Token PAST42=null;
+        Token PRESENT44=null;
+        Token FUTURE46=null;
+        simple_statement_return simple_statement41 = null;
+
+        simple_statement_return simple_statement43 = null;
+
+        simple_statement_return simple_statement45 = null;
+
+        simple_statement_return simple_statement47 = null;
+
+        simple_statement_return simple_statement48 = null;
+
+
+        Object NOT40_tree=null;
+        Object PAST42_tree=null;
+        Object PRESENT44_tree=null;
+        Object FUTURE46_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:44:2: ( NOT simple_statement | PAST simple_statement | PRESENT simple_statement | FUTURE simple_statement | simple_statement )
+            int alt10=5;
+            switch ( input.LA(1) ) {
+            case NOT:
+                {
+                alt10=1;
+                }
+                break;
+            case PAST:
+                {
+                alt10=2;
+                }
+                break;
+            case PRESENT:
+                {
+                alt10=3;
+                }
+                break;
+            case FUTURE:
+                {
+                alt10=4;
+                }
+                break;
+            case IRI_REF:
+            case PNAME_NS:
+            case LPAREN:
+            case INTEGER:
+            case DECIMAL:
+            case OPEN_BRACE:
+            case LBRACKET:
+            case QUERY_VAR:
+            case STM_VAR:
+            case DOUBLE:
+            case INTEGER_POSITIVE:
+            case DECIMAL_POSITIVE:
+            case DOUBLE_POSITIVE:
+            case INTEGER_NEGATIVE:
+            case DECIMAL_NEGATIVE:
+            case DOUBLE_NEGATIVE:
+            case TRUE:
+            case FALSE:
+            case STRING_LITERAL1:
+            case STRING_LITERAL2:
+            case STRING_LITERAL_LONG1:
+            case STRING_LITERAL_LONG2:
+            case PNAME_LN:
+                {
+                alt10=5;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("43:1: unary_statement : ( NOT simple_statement | PAST simple_statement | PRESENT simple_statement | FUTURE simple_statement | simple_statement );", 10, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt10) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:44:4: NOT simple_statement
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    NOT40=(Token)input.LT(1);
+                    match(input,NOT,FOLLOW_NOT_in_unary_statement251); 
+                    NOT40_tree = (Object)adaptor.create(NOT40);
+                    adaptor.addChild(root_0, NOT40_tree);
+
+                    pushFollow(FOLLOW_simple_statement_in_unary_statement253);
+                    simple_statement41=simple_statement();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, simple_statement41.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:45:4: PAST simple_statement
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    PAST42=(Token)input.LT(1);
+                    match(input,PAST,FOLLOW_PAST_in_unary_statement258); 
+                    PAST42_tree = (Object)adaptor.create(PAST42);
+                    adaptor.addChild(root_0, PAST42_tree);
+
+                    pushFollow(FOLLOW_simple_statement_in_unary_statement260);
+                    simple_statement43=simple_statement();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, simple_statement43.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:46:4: PRESENT simple_statement
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    PRESENT44=(Token)input.LT(1);
+                    match(input,PRESENT,FOLLOW_PRESENT_in_unary_statement265); 
+                    PRESENT44_tree = (Object)adaptor.create(PRESENT44);
+                    adaptor.addChild(root_0, PRESENT44_tree);
+
+                    pushFollow(FOLLOW_simple_statement_in_unary_statement267);
+                    simple_statement45=simple_statement();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, simple_statement45.getTree());
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:47:4: FUTURE simple_statement
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    FUTURE46=(Token)input.LT(1);
+                    match(input,FUTURE,FOLLOW_FUTURE_in_unary_statement272); 
+                    FUTURE46_tree = (Object)adaptor.create(FUTURE46);
+                    adaptor.addChild(root_0, FUTURE46_tree);
+
+                    pushFollow(FOLLOW_simple_statement_in_unary_statement274);
+                    simple_statement47=simple_statement();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, simple_statement47.getTree());
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:48:4: simple_statement
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_simple_statement_in_unary_statement279);
+                    simple_statement48=simple_statement();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, simple_statement48.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end unary_statement
+
+    public static class simple_statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start simple_statement
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:51:1: simple_statement : term ( ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term )? ;
+    public final simple_statement_return simple_statement() throws RecognitionException {
+        simple_statement_return retval = new simple_statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token INHERITANCE50=null;
+        Token SIMILARITY51=null;
+        Token INSTANCE52=null;
+        Token PROPERTY53=null;
+        Token INSTANCE_PROPERTY54=null;
+        Token IMPLICATION55=null;
+        Token IMPLICATION_PRED56=null;
+        Token IMPLICATION_RETRO57=null;
+        Token IMPLICATION_CONC58=null;
+        Token EQUIVALENCE59=null;
+        Token EQUIVALENCE_PRED60=null;
+        Token EQUIVALENCE_CONC61=null;
+        term_return term49 = null;
+
+        term_return term62 = null;
+
+
+        Object INHERITANCE50_tree=null;
+        Object SIMILARITY51_tree=null;
+        Object INSTANCE52_tree=null;
+        Object PROPERTY53_tree=null;
+        Object INSTANCE_PROPERTY54_tree=null;
+        Object IMPLICATION55_tree=null;
+        Object IMPLICATION_PRED56_tree=null;
+        Object IMPLICATION_RETRO57_tree=null;
+        Object IMPLICATION_CONC58_tree=null;
+        Object EQUIVALENCE59_tree=null;
+        Object EQUIVALENCE_PRED60_tree=null;
+        Object EQUIVALENCE_CONC61_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:2: ( term ( ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term )? )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:4: term ( ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_term_in_simple_statement292);
+            term49=term();
+            _fsp--;
+
+            adaptor.addChild(root_0, term49.getTree());
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:9: ( ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term )?
+            int alt12=2;
+            int LA12_0 = input.LA(1);
+
+            if ( ((LA12_0>=INHERITANCE && LA12_0<=EQUIVALENCE_CONC)) ) {
+                alt12=1;
+            }
+            switch (alt12) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:10: ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term
+                    {
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:10: ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC )
+                    int alt11=12;
+                    switch ( input.LA(1) ) {
+                    case INHERITANCE:
+                        {
+                        alt11=1;
+                        }
+                        break;
+                    case SIMILARITY:
+                        {
+                        alt11=2;
+                        }
+                        break;
+                    case INSTANCE:
+                        {
+                        alt11=3;
+                        }
+                        break;
+                    case PROPERTY:
+                        {
+                        alt11=4;
+                        }
+                        break;
+                    case INSTANCE_PROPERTY:
+                        {
+                        alt11=5;
+                        }
+                        break;
+                    case IMPLICATION:
+                        {
+                        alt11=6;
+                        }
+                        break;
+                    case IMPLICATION_PRED:
+                        {
+                        alt11=7;
+                        }
+                        break;
+                    case IMPLICATION_RETRO:
+                        {
+                        alt11=8;
+                        }
+                        break;
+                    case IMPLICATION_CONC:
+                        {
+                        alt11=9;
+                        }
+                        break;
+                    case EQUIVALENCE:
+                        {
+                        alt11=10;
+                        }
+                        break;
+                    case EQUIVALENCE_PRED:
+                        {
+                        alt11=11;
+                        }
+                        break;
+                    case EQUIVALENCE_CONC:
+                        {
+                        alt11=12;
+                        }
+                        break;
+                    default:
+                        NoViableAltException nvae =
+                            new NoViableAltException("52:10: ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC )", 11, 0, input);
+
+                        throw nvae;
+                    }
+
+                    switch (alt11) {
+                        case 1 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:11: INHERITANCE
+                            {
+                            INHERITANCE50=(Token)input.LT(1);
+                            match(input,INHERITANCE,FOLLOW_INHERITANCE_in_simple_statement296); 
+                            INHERITANCE50_tree = (Object)adaptor.create(INHERITANCE50);
+                            root_0 = (Object)adaptor.becomeRoot(INHERITANCE50_tree, root_0);
+
+
+                            }
+                            break;
+                        case 2 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:26: SIMILARITY
+                            {
+                            SIMILARITY51=(Token)input.LT(1);
+                            match(input,SIMILARITY,FOLLOW_SIMILARITY_in_simple_statement301); 
+                            SIMILARITY51_tree = (Object)adaptor.create(SIMILARITY51);
+                            root_0 = (Object)adaptor.becomeRoot(SIMILARITY51_tree, root_0);
+
+
+                            }
+                            break;
+                        case 3 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:40: INSTANCE
+                            {
+                            INSTANCE52=(Token)input.LT(1);
+                            match(input,INSTANCE,FOLLOW_INSTANCE_in_simple_statement306); 
+                            INSTANCE52_tree = (Object)adaptor.create(INSTANCE52);
+                            root_0 = (Object)adaptor.becomeRoot(INSTANCE52_tree, root_0);
+
+
+                            }
+                            break;
+                        case 4 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:52: PROPERTY
+                            {
+                            PROPERTY53=(Token)input.LT(1);
+                            match(input,PROPERTY,FOLLOW_PROPERTY_in_simple_statement311); 
+                            PROPERTY53_tree = (Object)adaptor.create(PROPERTY53);
+                            root_0 = (Object)adaptor.becomeRoot(PROPERTY53_tree, root_0);
+
+
+                            }
+                            break;
+                        case 5 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:64: INSTANCE_PROPERTY
+                            {
+                            INSTANCE_PROPERTY54=(Token)input.LT(1);
+                            match(input,INSTANCE_PROPERTY,FOLLOW_INSTANCE_PROPERTY_in_simple_statement316); 
+                            INSTANCE_PROPERTY54_tree = (Object)adaptor.create(INSTANCE_PROPERTY54);
+                            root_0 = (Object)adaptor.becomeRoot(INSTANCE_PROPERTY54_tree, root_0);
+
+
+                            }
+                            break;
+                        case 6 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:85: IMPLICATION
+                            {
+                            IMPLICATION55=(Token)input.LT(1);
+                            match(input,IMPLICATION,FOLLOW_IMPLICATION_in_simple_statement321); 
+                            IMPLICATION55_tree = (Object)adaptor.create(IMPLICATION55);
+                            root_0 = (Object)adaptor.becomeRoot(IMPLICATION55_tree, root_0);
+
+
+                            }
+                            break;
+                        case 7 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:100: IMPLICATION_PRED
+                            {
+                            IMPLICATION_PRED56=(Token)input.LT(1);
+                            match(input,IMPLICATION_PRED,FOLLOW_IMPLICATION_PRED_in_simple_statement326); 
+                            IMPLICATION_PRED56_tree = (Object)adaptor.create(IMPLICATION_PRED56);
+                            root_0 = (Object)adaptor.becomeRoot(IMPLICATION_PRED56_tree, root_0);
+
+
+                            }
+                            break;
+                        case 8 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:120: IMPLICATION_RETRO
+                            {
+                            IMPLICATION_RETRO57=(Token)input.LT(1);
+                            match(input,IMPLICATION_RETRO,FOLLOW_IMPLICATION_RETRO_in_simple_statement331); 
+                            IMPLICATION_RETRO57_tree = (Object)adaptor.create(IMPLICATION_RETRO57);
+                            root_0 = (Object)adaptor.becomeRoot(IMPLICATION_RETRO57_tree, root_0);
+
+
+                            }
+                            break;
+                        case 9 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:141: IMPLICATION_CONC
+                            {
+                            IMPLICATION_CONC58=(Token)input.LT(1);
+                            match(input,IMPLICATION_CONC,FOLLOW_IMPLICATION_CONC_in_simple_statement336); 
+                            IMPLICATION_CONC58_tree = (Object)adaptor.create(IMPLICATION_CONC58);
+                            root_0 = (Object)adaptor.becomeRoot(IMPLICATION_CONC58_tree, root_0);
+
+
+                            }
+                            break;
+                        case 10 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:161: EQUIVALENCE
+                            {
+                            EQUIVALENCE59=(Token)input.LT(1);
+                            match(input,EQUIVALENCE,FOLLOW_EQUIVALENCE_in_simple_statement341); 
+                            EQUIVALENCE59_tree = (Object)adaptor.create(EQUIVALENCE59);
+                            root_0 = (Object)adaptor.becomeRoot(EQUIVALENCE59_tree, root_0);
+
+
+                            }
+                            break;
+                        case 11 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:176: EQUIVALENCE_PRED
+                            {
+                            EQUIVALENCE_PRED60=(Token)input.LT(1);
+                            match(input,EQUIVALENCE_PRED,FOLLOW_EQUIVALENCE_PRED_in_simple_statement346); 
+                            EQUIVALENCE_PRED60_tree = (Object)adaptor.create(EQUIVALENCE_PRED60);
+                            root_0 = (Object)adaptor.becomeRoot(EQUIVALENCE_PRED60_tree, root_0);
+
+
+                            }
+                            break;
+                        case 12 :
+                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:196: EQUIVALENCE_CONC
+                            {
+                            EQUIVALENCE_CONC61=(Token)input.LT(1);
+                            match(input,EQUIVALENCE_CONC,FOLLOW_EQUIVALENCE_CONC_in_simple_statement351); 
+                            EQUIVALENCE_CONC61_tree = (Object)adaptor.create(EQUIVALENCE_CONC61);
+                            root_0 = (Object)adaptor.becomeRoot(EQUIVALENCE_CONC61_tree, root_0);
+
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_term_in_simple_statement355);
+                    term62=term();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, term62.getTree());
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end simple_statement
+
+    public static class term_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start term
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:1: term : difference ( ( AMPERSAND | BAR ) difference )* ;
+    public final term_return term() throws RecognitionException {
+        term_return retval = new term_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token AMPERSAND64=null;
+        Token BAR65=null;
+        difference_return difference63 = null;
+
+        difference_return difference66 = null;
+
+
+        Object AMPERSAND64_tree=null;
+        Object BAR65_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:7: ( difference ( ( AMPERSAND | BAR ) difference )* )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:9: difference ( ( AMPERSAND | BAR ) difference )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_difference_in_term371);
+            difference63=difference();
+            _fsp--;
+
+            adaptor.addChild(root_0, difference63.getTree());
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:20: ( ( AMPERSAND | BAR ) difference )*
+            loop14:
+            do {
+                int alt14=2;
+                int LA14_0 = input.LA(1);
+
+                if ( ((LA14_0>=AMPERSAND && LA14_0<=BAR)) ) {
+                    alt14=1;
+                }
+
+
+                switch (alt14) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:21: ( AMPERSAND | BAR ) difference
+            	    {
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:21: ( AMPERSAND | BAR )
+            	    int alt13=2;
+            	    int LA13_0 = input.LA(1);
+
+            	    if ( (LA13_0==AMPERSAND) ) {
+            	        alt13=1;
+            	    }
+            	    else if ( (LA13_0==BAR) ) {
+            	        alt13=2;
+            	    }
+            	    else {
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("56:21: ( AMPERSAND | BAR )", 13, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt13) {
+            	        case 1 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:22: AMPERSAND
+            	            {
+            	            AMPERSAND64=(Token)input.LT(1);
+            	            match(input,AMPERSAND,FOLLOW_AMPERSAND_in_term375); 
+            	            AMPERSAND64_tree = (Object)adaptor.create(AMPERSAND64);
+            	            root_0 = (Object)adaptor.becomeRoot(AMPERSAND64_tree, root_0);
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:35: BAR
+            	            {
+            	            BAR65=(Token)input.LT(1);
+            	            match(input,BAR,FOLLOW_BAR_in_term380); 
+            	            BAR65_tree = (Object)adaptor.create(BAR65);
+            	            root_0 = (Object)adaptor.becomeRoot(BAR65_tree, root_0);
+
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    pushFollow(FOLLOW_difference_in_term384);
+            	    difference66=difference();
+            	    _fsp--;
+
+            	    adaptor.addChild(root_0, difference66.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop14;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end term
+
+    public static class ext_set_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start ext_set
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:1: ext_set : OPEN_BRACE ( term ( COMMA term )* )? CLOSE_BRACE ;
+    public final ext_set_return ext_set() throws RecognitionException {
+        ext_set_return retval = new ext_set_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token OPEN_BRACE67=null;
+        Token COMMA69=null;
+        Token CLOSE_BRACE71=null;
+        term_return term68 = null;
+
+        term_return term70 = null;
+
+
+        Object OPEN_BRACE67_tree=null;
+        Object COMMA69_tree=null;
+        Object CLOSE_BRACE71_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:9: ( OPEN_BRACE ( term ( COMMA term )* )? CLOSE_BRACE )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:11: OPEN_BRACE ( term ( COMMA term )* )? CLOSE_BRACE
+            {
+            root_0 = (Object)adaptor.nil();
+
+            OPEN_BRACE67=(Token)input.LT(1);
+            match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_ext_set396); 
+            OPEN_BRACE67_tree = (Object)adaptor.create(OPEN_BRACE67);
+            root_0 = (Object)adaptor.becomeRoot(OPEN_BRACE67_tree, root_0);
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:23: ( term ( COMMA term )* )?
+            int alt16=2;
+            int LA16_0 = input.LA(1);
+
+            if ( (LA16_0==IRI_REF||LA16_0==PNAME_NS||(LA16_0>=LPAREN && LA16_0<=INTEGER)||LA16_0==DECIMAL||LA16_0==OPEN_BRACE||LA16_0==LBRACKET||(LA16_0>=QUERY_VAR && LA16_0<=PNAME_LN)) ) {
+                alt16=1;
+            }
+            switch (alt16) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:24: term ( COMMA term )*
+                    {
+                    pushFollow(FOLLOW_term_in_ext_set400);
+                    term68=term();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, term68.getTree());
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:29: ( COMMA term )*
+                    loop15:
+                    do {
+                        int alt15=2;
+                        int LA15_0 = input.LA(1);
+
+                        if ( (LA15_0==COMMA) ) {
+                            alt15=1;
+                        }
+
+
+                        switch (alt15) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:30: COMMA term
+                    	    {
+                    	    COMMA69=(Token)input.LT(1);
+                    	    match(input,COMMA,FOLLOW_COMMA_in_ext_set403); 
+                    	    pushFollow(FOLLOW_term_in_ext_set406);
+                    	    term70=term();
+                    	    _fsp--;
+
+                    	    adaptor.addChild(root_0, term70.getTree());
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop15;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            CLOSE_BRACE71=(Token)input.LT(1);
+            match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_ext_set412); 
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end ext_set
+
+    public static class int_set_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start int_set
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:1: int_set : LBRACKET ( term ( COMMA term )* )? RBRACKET ;
+    public final int_set_return int_set() throws RecognitionException {
+        int_set_return retval = new int_set_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LBRACKET72=null;
+        Token COMMA74=null;
+        Token RBRACKET76=null;
+        term_return term73 = null;
+
+        term_return term75 = null;
+
+
+        Object LBRACKET72_tree=null;
+        Object COMMA74_tree=null;
+        Object RBRACKET76_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:9: ( LBRACKET ( term ( COMMA term )* )? RBRACKET )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:11: LBRACKET ( term ( COMMA term )* )? RBRACKET
+            {
+            root_0 = (Object)adaptor.nil();
+
+            LBRACKET72=(Token)input.LT(1);
+            match(input,LBRACKET,FOLLOW_LBRACKET_in_int_set424); 
+            LBRACKET72_tree = (Object)adaptor.create(LBRACKET72);
+            root_0 = (Object)adaptor.becomeRoot(LBRACKET72_tree, root_0);
+
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:21: ( term ( COMMA term )* )?
+            int alt18=2;
+            int LA18_0 = input.LA(1);
+
+            if ( (LA18_0==IRI_REF||LA18_0==PNAME_NS||(LA18_0>=LPAREN && LA18_0<=INTEGER)||LA18_0==DECIMAL||LA18_0==OPEN_BRACE||LA18_0==LBRACKET||(LA18_0>=QUERY_VAR && LA18_0<=PNAME_LN)) ) {
+                alt18=1;
+            }
+            switch (alt18) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:22: term ( COMMA term )*
+                    {
+                    pushFollow(FOLLOW_term_in_int_set428);
+                    term73=term();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, term73.getTree());
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:27: ( COMMA term )*
+                    loop17:
+                    do {
+                        int alt17=2;
+                        int LA17_0 = input.LA(1);
+
+                        if ( (LA17_0==COMMA) ) {
+                            alt17=1;
+                        }
+
+
+                        switch (alt17) {
+                    	case 1 :
+                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:28: COMMA term
+                    	    {
+                    	    COMMA74=(Token)input.LT(1);
+                    	    match(input,COMMA,FOLLOW_COMMA_in_int_set431); 
+                    	    pushFollow(FOLLOW_term_in_int_set434);
+                    	    term75=term();
+                    	    _fsp--;
+
+                    	    adaptor.addChild(root_0, term75.getTree());
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop17;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            RBRACKET76=(Token)input.LT(1);
+            match(input,RBRACKET,FOLLOW_RBRACKET_in_int_set440); 
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end int_set
+
+    public static class difference_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start difference
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:65:1: difference : product ( ( MINUS | TILDE ) product )* ;
+    public final difference_return difference() throws RecognitionException {
+        difference_return retval = new difference_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token MINUS78=null;
+        Token TILDE79=null;
+        product_return product77 = null;
+
+        product_return product80 = null;
+
+
+        Object MINUS78_tree=null;
+        Object TILDE79_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:2: ( product ( ( MINUS | TILDE ) product )* )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:4: product ( ( MINUS | TILDE ) product )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_product_in_difference454);
+            product77=product();
+            _fsp--;
+
+            adaptor.addChild(root_0, product77.getTree());
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:12: ( ( MINUS | TILDE ) product )*
+            loop20:
+            do {
+                int alt20=2;
+                int LA20_0 = input.LA(1);
+
+                if ( ((LA20_0>=MINUS && LA20_0<=TILDE)) ) {
+                    alt20=1;
+                }
+
+
+                switch (alt20) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:13: ( MINUS | TILDE ) product
+            	    {
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:13: ( MINUS | TILDE )
+            	    int alt19=2;
+            	    int LA19_0 = input.LA(1);
+
+            	    if ( (LA19_0==MINUS) ) {
+            	        alt19=1;
+            	    }
+            	    else if ( (LA19_0==TILDE) ) {
+            	        alt19=2;
+            	    }
+            	    else {
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("66:13: ( MINUS | TILDE )", 19, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt19) {
+            	        case 1 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:14: MINUS
+            	            {
+            	            MINUS78=(Token)input.LT(1);
+            	            match(input,MINUS,FOLLOW_MINUS_in_difference458); 
+            	            MINUS78_tree = (Object)adaptor.create(MINUS78);
+            	            root_0 = (Object)adaptor.becomeRoot(MINUS78_tree, root_0);
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:23: TILDE
+            	            {
+            	            TILDE79=(Token)input.LT(1);
+            	            match(input,TILDE,FOLLOW_TILDE_in_difference463); 
+            	            TILDE79_tree = (Object)adaptor.create(TILDE79);
+            	            root_0 = (Object)adaptor.becomeRoot(TILDE79_tree, root_0);
+
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    pushFollow(FOLLOW_product_in_difference467);
+            	    product80=product();
+            	    _fsp--;
+
+            	    adaptor.addChild(root_0, product80.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop20;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end difference
+
+    public static class product_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start product
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:1: product : atomic_term ( STAR atomic_term )* ;
+    public final product_return product() throws RecognitionException {
+        product_return retval = new product_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token STAR82=null;
+        atomic_term_return atomic_term81 = null;
+
+        atomic_term_return atomic_term83 = null;
+
+
+        Object STAR82_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:9: ( atomic_term ( STAR atomic_term )* )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:11: atomic_term ( STAR atomic_term )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_atomic_term_in_product480);
+            atomic_term81=atomic_term();
+            _fsp--;
+
+            adaptor.addChild(root_0, atomic_term81.getTree());
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:23: ( STAR atomic_term )*
+            loop21:
+            do {
+                int alt21=2;
+                int LA21_0 = input.LA(1);
+
+                if ( (LA21_0==STAR) ) {
+                    alt21=1;
+                }
+
+
+                switch (alt21) {
+            	case 1 :
+            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:24: STAR atomic_term
+            	    {
+            	    STAR82=(Token)input.LT(1);
+            	    match(input,STAR,FOLLOW_STAR_in_product483); 
+            	    STAR82_tree = (Object)adaptor.create(STAR82);
+            	    root_0 = (Object)adaptor.becomeRoot(STAR82_tree, root_0);
+
+            	    pushFollow(FOLLOW_atomic_term_in_product486);
+            	    atomic_term83=atomic_term();
+            	    _fsp--;
+
+            	    adaptor.addChild(root_0, atomic_term83.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop21;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end product
+
+    public static class atomic_term_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start atomic_term
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:72:1: atomic_term : ( ext_set | int_set | LPAREN statement RPAREN | variable | iriRef | literal );
+    public final atomic_term_return atomic_term() throws RecognitionException {
+        atomic_term_return retval = new atomic_term_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LPAREN86=null;
+        Token RPAREN88=null;
+        ext_set_return ext_set84 = null;
+
+        int_set_return int_set85 = null;
+
+        statement_return statement87 = null;
+
+        variable_return variable89 = null;
+
+        iriRef_return iriRef90 = null;
+
+        literal_return literal91 = null;
+
+
+        Object LPAREN86_tree=null;
+        Object RPAREN88_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:73:2: ( ext_set | int_set | LPAREN statement RPAREN | variable | iriRef | literal )
+            int alt22=6;
+            switch ( input.LA(1) ) {
+            case OPEN_BRACE:
+                {
+                alt22=1;
+                }
+                break;
+            case LBRACKET:
+                {
+                alt22=2;
+                }
+                break;
+            case LPAREN:
+                {
+                alt22=3;
+                }
+                break;
+            case QUERY_VAR:
+            case STM_VAR:
+                {
+                alt22=4;
+                }
+                break;
+            case IRI_REF:
+            case PNAME_NS:
+            case PNAME_LN:
+                {
+                alt22=5;
+                }
+                break;
+            case INTEGER:
+            case DECIMAL:
+            case DOUBLE:
+            case INTEGER_POSITIVE:
+            case DECIMAL_POSITIVE:
+            case DOUBLE_POSITIVE:
+            case INTEGER_NEGATIVE:
+            case DECIMAL_NEGATIVE:
+            case DOUBLE_NEGATIVE:
+            case TRUE:
+            case FALSE:
+            case STRING_LITERAL1:
+            case STRING_LITERAL2:
+            case STRING_LITERAL_LONG1:
+            case STRING_LITERAL_LONG2:
+                {
+                alt22=6;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("72:1: atomic_term : ( ext_set | int_set | LPAREN statement RPAREN | variable | iriRef | literal );", 22, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt22) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:73:4: ext_set
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_ext_set_in_atomic_term500);
+                    ext_set84=ext_set();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, ext_set84.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:74:4: int_set
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_int_set_in_atomic_term505);
+                    int_set85=int_set();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, int_set85.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:75:4: LPAREN statement RPAREN
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    LPAREN86=(Token)input.LT(1);
+                    match(input,LPAREN,FOLLOW_LPAREN_in_atomic_term510); 
+                    pushFollow(FOLLOW_statement_in_atomic_term513);
+                    statement87=statement();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, statement87.getTree());
+                    RPAREN88=(Token)input.LT(1);
+                    match(input,RPAREN,FOLLOW_RPAREN_in_atomic_term515); 
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:76:4: variable
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_variable_in_atomic_term521);
+                    variable89=variable();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, variable89.getTree());
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:77:4: iriRef
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_iriRef_in_atomic_term526);
+                    iriRef90=iriRef();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, iriRef90.getTree());
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:78:4: literal
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_literal_in_atomic_term531);
+                    literal91=literal();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, literal91.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end atomic_term
+
+    public static class variable_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start variable
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:81:1: variable : ( query_variable | statement_variable );
+    public final variable_return variable() throws RecognitionException {
+        variable_return retval = new variable_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        query_variable_return query_variable92 = null;
+
+        statement_variable_return statement_variable93 = null;
+
+
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:82:2: ( query_variable | statement_variable )
+            int alt23=2;
+            int LA23_0 = input.LA(1);
+
+            if ( (LA23_0==QUERY_VAR) ) {
+                alt23=1;
+            }
+            else if ( (LA23_0==STM_VAR) ) {
+                alt23=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("81:1: variable : ( query_variable | statement_variable );", 23, 0, input);
+
+                throw nvae;
+            }
+            switch (alt23) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:82:4: query_variable
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_query_variable_in_variable544);
+                    query_variable92=query_variable();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, query_variable92.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:83:4: statement_variable
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_statement_variable_in_variable549);
+                    statement_variable93=statement_variable();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, statement_variable93.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end variable
+
+    public static class query_variable_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start query_variable
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:86:1: query_variable : QUERY_VAR ;
+    public final query_variable_return query_variable() throws RecognitionException {
+        query_variable_return retval = new query_variable_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token QUERY_VAR94=null;
+
+        Object QUERY_VAR94_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:87:2: ( QUERY_VAR )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:87:4: QUERY_VAR
+            {
+            root_0 = (Object)adaptor.nil();
+
+            QUERY_VAR94=(Token)input.LT(1);
+            match(input,QUERY_VAR,FOLLOW_QUERY_VAR_in_query_variable562); 
+            QUERY_VAR94_tree = (Object)adaptor.create(QUERY_VAR94);
+            adaptor.addChild(root_0, QUERY_VAR94_tree);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end query_variable
+
+    public static class statement_variable_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start statement_variable
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:90:1: statement_variable : STM_VAR ;
+    public final statement_variable_return statement_variable() throws RecognitionException {
+        statement_variable_return retval = new statement_variable_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token STM_VAR95=null;
+
+        Object STM_VAR95_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:91:2: ( STM_VAR )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:91:4: STM_VAR
+            {
+            root_0 = (Object)adaptor.nil();
+
+            STM_VAR95=(Token)input.LT(1);
+            match(input,STM_VAR,FOLLOW_STM_VAR_in_statement_variable575); 
+            STM_VAR95_tree = (Object)adaptor.create(STM_VAR95);
+            adaptor.addChild(root_0, STM_VAR95_tree);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end statement_variable
+
+    public static class literal_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start literal
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:96:1: literal : ( numericLiteral | booleanLiteral | string );
+    public final literal_return literal() throws RecognitionException {
+        literal_return retval = new literal_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        numericLiteral_return numericLiteral96 = null;
+
+        booleanLiteral_return booleanLiteral97 = null;
+
+        string_return string98 = null;
+
+
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:97:2: ( numericLiteral | booleanLiteral | string )
+            int alt24=3;
+            switch ( input.LA(1) ) {
+            case INTEGER:
+            case DECIMAL:
+            case DOUBLE:
+            case INTEGER_POSITIVE:
+            case DECIMAL_POSITIVE:
+            case DOUBLE_POSITIVE:
+            case INTEGER_NEGATIVE:
+            case DECIMAL_NEGATIVE:
+            case DOUBLE_NEGATIVE:
+                {
+                alt24=1;
+                }
+                break;
+            case TRUE:
+            case FALSE:
+                {
+                alt24=2;
+                }
+                break;
+            case STRING_LITERAL1:
+            case STRING_LITERAL2:
+            case STRING_LITERAL_LONG1:
+            case STRING_LITERAL_LONG2:
+                {
+                alt24=3;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("96:1: literal : ( numericLiteral | booleanLiteral | string );", 24, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt24) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:97:4: numericLiteral
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_numericLiteral_in_literal591);
+                    numericLiteral96=numericLiteral();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, numericLiteral96.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:98:4: booleanLiteral
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_booleanLiteral_in_literal596);
+                    booleanLiteral97=booleanLiteral();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, booleanLiteral97.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:99:4: string
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_string_in_literal601);
+                    string98=string();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, string98.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end literal
+
+    public static class numericLiteral_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start numericLiteral
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:102:1: numericLiteral : ( numericLiteralUnsigned | numericLiteralPositive | numericLiteralNegative );
+    public final numericLiteral_return numericLiteral() throws RecognitionException {
+        numericLiteral_return retval = new numericLiteral_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        numericLiteralUnsigned_return numericLiteralUnsigned99 = null;
+
+        numericLiteralPositive_return numericLiteralPositive100 = null;
+
+        numericLiteralNegative_return numericLiteralNegative101 = null;
+
+
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:103:5: ( numericLiteralUnsigned | numericLiteralPositive | numericLiteralNegative )
+            int alt25=3;
+            switch ( input.LA(1) ) {
+            case INTEGER:
+            case DECIMAL:
+            case DOUBLE:
+                {
+                alt25=1;
+                }
+                break;
+            case INTEGER_POSITIVE:
+            case DECIMAL_POSITIVE:
+            case DOUBLE_POSITIVE:
+                {
+                alt25=2;
+                }
+                break;
+            case INTEGER_NEGATIVE:
+            case DECIMAL_NEGATIVE:
+            case DOUBLE_NEGATIVE:
+                {
+                alt25=3;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("102:1: numericLiteral : ( numericLiteralUnsigned | numericLiteralPositive | numericLiteralNegative );", 25, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt25) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:103:7: numericLiteralUnsigned
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_numericLiteralUnsigned_in_numericLiteral616);
+                    numericLiteralUnsigned99=numericLiteralUnsigned();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, numericLiteralUnsigned99.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:103:32: numericLiteralPositive
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_numericLiteralPositive_in_numericLiteral620);
+                    numericLiteralPositive100=numericLiteralPositive();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, numericLiteralPositive100.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:103:57: numericLiteralNegative
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_numericLiteralNegative_in_numericLiteral624);
+                    numericLiteralNegative101=numericLiteralNegative();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, numericLiteralNegative101.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end numericLiteral
+
+    public static class numericLiteralUnsigned_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start numericLiteralUnsigned
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:106:1: numericLiteralUnsigned : ( INTEGER | DECIMAL | DOUBLE );
+    public final numericLiteralUnsigned_return numericLiteralUnsigned() throws RecognitionException {
+        numericLiteralUnsigned_return retval = new numericLiteralUnsigned_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token set102=null;
+
+        Object set102_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:107:5: ( INTEGER | DECIMAL | DOUBLE )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            root_0 = (Object)adaptor.nil();
+
+            set102=(Token)input.LT(1);
+            if ( input.LA(1)==INTEGER||input.LA(1)==DECIMAL||input.LA(1)==DOUBLE ) {
+                input.consume();
+                adaptor.addChild(root_0, adaptor.create(set102));
+                errorRecovery=false;
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_numericLiteralUnsigned0);    throw mse;
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end numericLiteralUnsigned
+
+    public static class numericLiteralPositive_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start numericLiteralPositive
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:112:1: numericLiteralPositive : ( INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE );
+    public final numericLiteralPositive_return numericLiteralPositive() throws RecognitionException {
+        numericLiteralPositive_return retval = new numericLiteralPositive_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token set103=null;
+
+        Object set103_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:113:5: ( INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            root_0 = (Object)adaptor.nil();
+
+            set103=(Token)input.LT(1);
+            if ( (input.LA(1)>=INTEGER_POSITIVE && input.LA(1)<=DOUBLE_POSITIVE) ) {
+                input.consume();
+                adaptor.addChild(root_0, adaptor.create(set103));
+                errorRecovery=false;
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_numericLiteralPositive0);    throw mse;
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end numericLiteralPositive
+
+    public static class numericLiteralNegative_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start numericLiteralNegative
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:118:1: numericLiteralNegative : ( INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE );
+    public final numericLiteralNegative_return numericLiteralNegative() throws RecognitionException {
+        numericLiteralNegative_return retval = new numericLiteralNegative_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token set104=null;
+
+        Object set104_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:119:5: ( INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            root_0 = (Object)adaptor.nil();
+
+            set104=(Token)input.LT(1);
+            if ( (input.LA(1)>=INTEGER_NEGATIVE && input.LA(1)<=DOUBLE_NEGATIVE) ) {
+                input.consume();
+                adaptor.addChild(root_0, adaptor.create(set104));
+                errorRecovery=false;
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_numericLiteralNegative0);    throw mse;
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end numericLiteralNegative
+
+    public static class booleanLiteral_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start booleanLiteral
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:124:1: booleanLiteral : ( TRUE | FALSE );
+    public final booleanLiteral_return booleanLiteral() throws RecognitionException {
+        booleanLiteral_return retval = new booleanLiteral_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token set105=null;
+
+        Object set105_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:125:5: ( TRUE | FALSE )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            root_0 = (Object)adaptor.nil();
+
+            set105=(Token)input.LT(1);
+            if ( (input.LA(1)>=TRUE && input.LA(1)<=FALSE) ) {
+                input.consume();
+                adaptor.addChild(root_0, adaptor.create(set105));
+                errorRecovery=false;
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_booleanLiteral0);    throw mse;
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end booleanLiteral
+
+    public static class string_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start string
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:129:1: string : ( STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 );
+    public final string_return string() throws RecognitionException {
+        string_return retval = new string_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token set106=null;
+
+        Object set106_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:130:5: ( STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            root_0 = (Object)adaptor.nil();
+
+            set106=(Token)input.LT(1);
+            if ( (input.LA(1)>=STRING_LITERAL1 && input.LA(1)<=STRING_LITERAL_LONG2) ) {
+                input.consume();
+                adaptor.addChild(root_0, adaptor.create(set106));
+                errorRecovery=false;
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_string0);    throw mse;
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end string
+
+    public static class iriRef_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start iriRef
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:136:1: iriRef : ( IRI_REF | prefixedName );
+    public final iriRef_return iriRef() throws RecognitionException {
+        iriRef_return retval = new iriRef_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token IRI_REF107=null;
+        prefixedName_return prefixedName108 = null;
+
+
+        Object IRI_REF107_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:137:5: ( IRI_REF | prefixedName )
+            int alt26=2;
+            int LA26_0 = input.LA(1);
+
+            if ( (LA26_0==IRI_REF) ) {
+                alt26=1;
+            }
+            else if ( (LA26_0==PNAME_NS||LA26_0==PNAME_LN) ) {
+                alt26=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("136:1: iriRef : ( IRI_REF | prefixedName );", 26, 0, input);
+
+                throw nvae;
+            }
+            switch (alt26) {
+                case 1 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:137:7: IRI_REF
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    IRI_REF107=(Token)input.LT(1);
+                    match(input,IRI_REF,FOLLOW_IRI_REF_in_iriRef806); 
+                    IRI_REF107_tree = (Object)adaptor.create(IRI_REF107);
+                    adaptor.addChild(root_0, IRI_REF107_tree);
+
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:138:7: prefixedName
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_prefixedName_in_iriRef814);
+                    prefixedName108=prefixedName();
+                    _fsp--;
+
+                    adaptor.addChild(root_0, prefixedName108.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end iriRef
+
+    public static class prefixedName_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start prefixedName
+    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:141:1: prefixedName : ( PNAME_LN | PNAME_NS );
+    public final prefixedName_return prefixedName() throws RecognitionException {
+        prefixedName_return retval = new prefixedName_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token set109=null;
+
+        Object set109_tree=null;
+
+        try {
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:142:5: ( PNAME_LN | PNAME_NS )
+            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
+            {
+            root_0 = (Object)adaptor.nil();
+
+            set109=(Token)input.LT(1);
+            if ( input.LA(1)==PNAME_NS||input.LA(1)==PNAME_LN ) {
+                input.consume();
+                adaptor.addChild(root_0, adaptor.create(set109));
+                errorRecovery=false;
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_prefixedName0);    throw mse;
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end prefixedName
+
+
+ 
+
+    public static final BitSet FOLLOW_base_rule_in_document27 = new BitSet(new long[]{0x7FFF850003C21FA0L});
+    public static final BitSet FOLLOW_at_rule_in_document31 = new BitSet(new long[]{0x7FFF850003C21FA0L});
+    public static final BitSet FOLLOW_sentence_in_document35 = new BitSet(new long[]{0x7FFF850003C21FA0L});
+    public static final BitSet FOLLOW_EOF_in_document39 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_AT_BASE_in_base_rule50 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_IRI_REF_in_base_rule53 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_DOT_in_base_rule55 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_AT_IMPORT_in_at_rule66 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_IRI_REF_in_at_rule69 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_DOT_in_at_rule71 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_AT_PREFIX_in_at_rule77 = new BitSet(new long[]{0x0000000000000200L});
+    public static final BitSet FOLLOW_PNAME_NS_in_at_rule80 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_IRI_REF_in_at_rule82 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_DOT_in_at_rule84 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_AT_DELAY_in_at_rule90 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_LPAREN_in_at_rule93 = new BitSet(new long[]{0x0000000000001000L});
+    public static final BitSet FOLLOW_INTEGER_in_at_rule96 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RPAREN_in_at_rule98 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_DOT_in_at_rule101 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_statement_in_sentence114 = new BitSet(new long[]{0x000000000000C040L});
+    public static final BitSet FOLLOW_judgement_in_sentence117 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_question_in_sentence120 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_goal_in_sentence123 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOT_in_judgement138 = new BitSet(new long[]{0x0000000000010002L});
+    public static final BitSet FOLLOW_truthvalue_in_judgement141 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_EXCLAMATION_in_goal153 = new BitSet(new long[]{0x0000000000010002L});
+    public static final BitSet FOLLOW_truthvalue_in_goal156 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_QUESTION_in_question170 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_PERCENT_in_truthvalue184 = new BitSet(new long[]{0x0000000000021000L});
+    public static final BitSet FOLLOW_set_in_truthvalue187 = new BitSet(new long[]{0x0000000000050000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_truthvalue196 = new BitSet(new long[]{0x0000000000020000L});
+    public static final BitSet FOLLOW_DECIMAL_in_truthvalue198 = new BitSet(new long[]{0x0000000000010000L});
+    public static final BitSet FOLLOW_PERCENT_in_truthvalue202 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_unary_statement_in_statement213 = new BitSet(new long[]{0x00000000003C0002L});
+    public static final BitSet FOLLOW_CONJ_in_statement217 = new BitSet(new long[]{0x7FFF850003C21A20L});
+    public static final BitSet FOLLOW_SEMICOLON_in_statement222 = new BitSet(new long[]{0x7FFF850003C21A20L});
+    public static final BitSet FOLLOW_COMMA_in_statement227 = new BitSet(new long[]{0x7FFF850003C21A20L});
+    public static final BitSet FOLLOW_DISJ_in_statement232 = new BitSet(new long[]{0x7FFF850003C21A20L});
+    public static final BitSet FOLLOW_unary_statement_in_statement236 = new BitSet(new long[]{0x00000000003C0002L});
+    public static final BitSet FOLLOW_NOT_in_unary_statement251 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_simple_statement_in_unary_statement253 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_PAST_in_unary_statement258 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_simple_statement_in_unary_statement260 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_PRESENT_in_unary_statement265 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_simple_statement_in_unary_statement267 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FUTURE_in_unary_statement272 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_simple_statement_in_unary_statement274 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_simple_statement_in_unary_statement279 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_term_in_simple_statement292 = new BitSet(new long[]{0x0000003FFC000002L});
+    public static final BitSet FOLLOW_INHERITANCE_in_simple_statement296 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_SIMILARITY_in_simple_statement301 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_INSTANCE_in_simple_statement306 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_PROPERTY_in_simple_statement311 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_INSTANCE_PROPERTY_in_simple_statement316 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_IMPLICATION_in_simple_statement321 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_IMPLICATION_PRED_in_simple_statement326 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_IMPLICATION_RETRO_in_simple_statement331 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_IMPLICATION_CONC_in_simple_statement336 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_EQUIVALENCE_in_simple_statement341 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_EQUIVALENCE_PRED_in_simple_statement346 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_EQUIVALENCE_CONC_in_simple_statement351 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_term_in_simple_statement355 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_difference_in_term371 = new BitSet(new long[]{0x000000C000000002L});
+    public static final BitSet FOLLOW_AMPERSAND_in_term375 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_BAR_in_term380 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_difference_in_term384 = new BitSet(new long[]{0x000000C000000002L});
+    public static final BitSet FOLLOW_OPEN_BRACE_in_ext_set396 = new BitSet(new long[]{0x7FFF870000021A20L});
+    public static final BitSet FOLLOW_term_in_ext_set400 = new BitSet(new long[]{0x0000020000100000L});
+    public static final BitSet FOLLOW_COMMA_in_ext_set403 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_term_in_ext_set406 = new BitSet(new long[]{0x0000020000100000L});
+    public static final BitSet FOLLOW_CLOSE_BRACE_in_ext_set412 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LBRACKET_in_int_set424 = new BitSet(new long[]{0x7FFF8D0000021A20L});
+    public static final BitSet FOLLOW_term_in_int_set428 = new BitSet(new long[]{0x0000080000100000L});
+    public static final BitSet FOLLOW_COMMA_in_int_set431 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_term_in_int_set434 = new BitSet(new long[]{0x0000080000100000L});
+    public static final BitSet FOLLOW_RBRACKET_in_int_set440 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_product_in_difference454 = new BitSet(new long[]{0x0000300000000002L});
+    public static final BitSet FOLLOW_MINUS_in_difference458 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_TILDE_in_difference463 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_product_in_difference467 = new BitSet(new long[]{0x0000300000000002L});
+    public static final BitSet FOLLOW_atomic_term_in_product480 = new BitSet(new long[]{0x0000400000000002L});
+    public static final BitSet FOLLOW_STAR_in_product483 = new BitSet(new long[]{0x7FFF850000021A20L});
+    public static final BitSet FOLLOW_atomic_term_in_product486 = new BitSet(new long[]{0x0000400000000002L});
+    public static final BitSet FOLLOW_ext_set_in_atomic_term500 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_int_set_in_atomic_term505 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LPAREN_in_atomic_term510 = new BitSet(new long[]{0x7FFF850003C21A20L});
+    public static final BitSet FOLLOW_statement_in_atomic_term513 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RPAREN_in_atomic_term515 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_variable_in_atomic_term521 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_iriRef_in_atomic_term526 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_literal_in_atomic_term531 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_query_variable_in_variable544 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_statement_variable_in_variable549 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_QUERY_VAR_in_query_variable562 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STM_VAR_in_statement_variable575 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_numericLiteral_in_literal591 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_booleanLiteral_in_literal596 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_string_in_literal601 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_numericLiteralUnsigned_in_numericLiteral616 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_numericLiteralPositive_in_numericLiteral620 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_numericLiteralNegative_in_numericLiteral624 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_set_in_numericLiteralUnsigned0 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_set_in_numericLiteralPositive0 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_set_in_numericLiteralNegative0 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_set_in_booleanLiteral0 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_set_in_string0 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_IRI_REF_in_iriRef806 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_prefixedName_in_iriRef814 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_set_in_prefixedName0 = new BitSet(new long[]{0x0000000000000002L});
+
+}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/parser/narsese/NarseseParser.java b/open-nars/com/googlecode/opennars/parser/narsese/NarseseParser.java
new file mode 100644
index 0000000..20c9f1f
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/narsese/NarseseParser.java
@@ -0,0 +1,385 @@
+/*
+ * StringParser.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.parser.narsese;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.language.*;
+import com.googlecode.opennars.main.*;
+import com.googlecode.opennars.parser.InvalidInputException;
+import com.googlecode.opennars.parser.Parser;
+
+
+/**
+ * Parse input String into Task.
+ */
+public class NarseseParser extends Parser {
+        
+    /**
+     * return the prefex of a task string that contains a BudgetValue
+     * @return a String containing a BudgetValue
+     * @param s the input in a StringBuffer
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException if the input cannot be parsed into a BudgetValue
+     */
+    static String getBudgetString(StringBuffer s) throws InvalidInputException {
+        if (s.charAt(0) != BUDGET_VALUE_MARK) // use default
+            return null;  // null values
+        int i = s.indexOf(BUDGET_VALUE_MARK + "", 1);    // looking for the end
+        if (i < 0) // no matching closer
+            throw new InvalidInputException("missing budget closer");
+        String budgetString = s.substring(1, i).trim();
+        if (budgetString.length() == 0) // empty usage
+            throw new InvalidInputException("empty budget");
+        s.delete(0, i+1);                 // remaining input to be processed outside
+        return budgetString;
+    }
+    
+    /**
+     * return the postfex of a task string that contains a TruthValue
+     * @return a String containing a TruthValue
+     * @param s the input in a StringBuffer
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException if the input cannot be parsed into a TruthValue
+     */
+    static String getTruthString(StringBuffer s) throws InvalidInputException {
+        int last = s.length()-1;
+        if (s.charAt(last) != TRUTH_VALUE_MARK)     // use default
+            return null;
+        int first = s.indexOf(TRUTH_VALUE_MARK + "");    // looking for the beginning
+        if (first == last) // no matching closer
+            throw new InvalidInputException("missing truth mark");
+        String truthString = s.substring(first+1, last).trim();
+        if (truthString.length() == 0) // empty usage
+            throw new InvalidInputException("empty truth");
+        s.delete(first, last+1);                 // remaining input to be processed outside
+        return truthString;
+    }
+    
+    /**
+     * parse the input String into a TruthValue (or DesireValue)
+     * @param s input String
+     * @param type Task type
+     * @param memory the memory object being inserted into
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException If the String cannot be parsed into a TruthValue
+     * @return the input TruthValue
+     */
+    static TruthValue parseTruth(String s, char type, Memory memory) throws InvalidInputException {
+        if (type == QUESTION_MARK)
+            return null;
+        float frequency = 1.0f;
+        float confidence = memory.getParameters().DEFAULT_JUDGMENT_CONFIDENCE;
+        if (s != null) {
+            int i = s.indexOf(VALUE_SEPARATOR);
+            if (i < 0)
+                frequency = Float.parseFloat(s);
+            else {
+                frequency = Float.parseFloat(s.substring(0,i));
+                confidence = Float.parseFloat(s.substring(i+1));
+            }
+        }
+        return new TruthValue(frequency, confidence);
+    }
+    
+    /**
+     * parse the input String into a BudgetValue
+     * @param s input String
+     * @param punctuation Task punctuation
+     * @param truth the TruthValue of the task
+     * @param memory the memory object being inserted into
+     * 
+     * @return the input BudgetValue
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException If the String cannot be parsed into a BudgetValue
+     */
+    static BudgetValue parseBudget(String s, char punctuation, TruthValue truth, Memory memory) throws InvalidInputException {
+        float priority, durability;
+        switch (punctuation) {
+            case JUDGMENT_MARK:
+                priority = memory.getParameters().DEFAULT_JUDGMENT_PRIORITY;
+                durability = memory.getParameters().DEFAULT_JUDGMENT_DURABILITY;
+                break;
+            case GOAL_MARK:
+                priority = memory.getParameters().DEFAULT_GOAL_PRIORITY;
+                durability = memory.getParameters().DEFAULT_GOAL_DURABILITY;
+                break;
+            case QUESTION_MARK:
+                priority = memory.getParameters().DEFAULT_QUESTION_PRIORITY;
+                durability = memory.getParameters().DEFAULT_QUESTION_DURABILITY;
+                break;
+            default:
+                throw new InvalidInputException("unknown punctuation");
+        }
+        if (s != null) { // overrite default
+            int i = s.indexOf(VALUE_SEPARATOR);
+            if (i < 0) {        // default durability
+                priority = Float.parseFloat(s);
+            } else {
+                priority = Float.parseFloat(s.substring(0, i));
+                durability = Float.parseFloat(s.substring(i+1));
+            }
+        }
+        float quality = (punctuation == QUESTION_MARK) ? 1 : memory.budgetfunctions.truthToQuality(truth);
+        return new BudgetValue(priority, durability, quality, memory);
+    }
+    
+    /* ---------- parse String into term ---------- */
+    
+    /**
+     * Top-level method that parse a Term in general, which may recursively call itself.
+     * <p>
+     * There are 5 valid cases:
+     * 1. (Op, A1, ..., An) is a common CompoundTerm (including CompoundStatement);
+     * 2. {A1, ..., An} is an SetExt;
+     * 3. [A1, ..., An] is an SetInt;
+     * 4. <T1 Re T2> is a Statement (including higher-order Statement);
+     * 5. otherwise it is a simple term.
+     * @param s0 the String to be parsed
+     * @param memory the memory object being inserted into
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException the String cannot be parsed into a Term
+     * @return the Term generated from the String
+     */
+    static Term parseTerm(String s0, Memory memory) throws InvalidInputException {
+        String s = s0.trim();
+        if (s.length() == 0)
+            throw new InvalidInputException("missing content");
+        Term t = memory.nameToListedTerm(s);    // existing constant or operator
+        if (t != null)
+            return t;                           // existing Term
+        int index = s.length()-1;
+        char first = s.charAt(0);
+        char last = s.charAt(index);
+        switch (first) {
+            case COMPOUND_TERM_OPENER:
+                if (last == COMPOUND_TERM_CLOSER)
+                    return parseCompoundTerm(s.substring(1, index), memory);
+                else
+                    throw new InvalidInputException("missing CompoundTerm closer");
+            case SET_EXT_OPENER:
+                if (last == SET_EXT_CLOSER)
+                    return SetExt.make(parseArguments(s.substring(1, index) + ARGUMENT_SEPARATOR, memory), memory);
+                else
+                    throw new InvalidInputException("missing ExtensionSet closer");
+            case SET_INT_OPENER:
+                if (last == SET_INT_CLOSER)
+                    return SetInt.make(parseArguments(s.substring(1, index) + ARGUMENT_SEPARATOR, memory), memory);
+                else
+                    throw new InvalidInputException("missing IntensionSet closer");
+            case STATEMENT_OPENER:
+                if (last == STATEMENT_CLOSER)
+                    return parseStatement(s.substring(1, index), memory);
+                else
+                    throw new InvalidInputException("missing Statement closer");
+            default:
+                return parseSimpleTerm(s);
+        }
+    }
+    
+    /**
+     * Parse a Term that has no internal structure.
+     * <p>
+     * The Term can be a constant or a variable.
+     * @param s0 the String to be parsed
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException the String cannot be parsed into a Term
+     * @return the Term generated from the String
+     */
+    private static Term parseSimpleTerm(String s0) throws InvalidInputException {
+        String s = s0.trim();
+        if (s.length() == 0)
+            throw new InvalidInputException("missing term");
+        if (s.contains(" "))                // invalid characters in a name
+            throw new InvalidInputException("invalid term");
+        Term term;
+        char prefix = s.charAt(0);
+        if ((prefix == VARIABLE_TAG) || (prefix == QUERY_VARIABLE_TAG)) {
+            term = new Variable(s);         // the only place to directly call this constructor
+        } else
+            term = new Term(s);             // the only place to directly call this constructor
+        return term;
+    }
+    
+    /**
+     * Parse a String to create a Statement.
+     * @return the Statement generated from the String
+     * @param s0 The input String to be parsed
+     * @param memory the memory object being inserted into
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException the String cannot be parsed into a Term
+     */
+    private static Statement parseStatement(String s0, Memory memory) throws InvalidInputException {
+        String s = s0.trim();
+        int i = topRelation(s);
+        if (i < 0)
+            throw new InvalidInputException("invalid statement");
+        String relation = s.substring(i, i+3);
+        Term subject = parseTerm(s.substring(0, i), memory);
+        Term predicate = parseTerm(s.substring(i+3), memory);
+        Statement t = Statement.make(relation, subject, predicate, memory);
+        if (t == null)
+            throw new InvalidInputException("invalid statement");
+        return t;
+    }
+    
+    /**
+     * Parse a String to create a CompoundTerm.
+     * @return the Term generated from the String
+     * @param s0 The String to be parsed
+     * @param memory the memory object being inserted into
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException the String cannot be parsed into a Term
+     */
+    private static Term parseCompoundTerm(String s0, Memory memory) throws InvalidInputException {
+        String s = s0.trim();
+        int firstSeparator = s.indexOf(ARGUMENT_SEPARATOR);
+        String op = s.substring(0, firstSeparator).trim();
+        if (!CompoundTerm.isOperator(op, memory))
+            throw new InvalidInputException("unknown operator: " + op);
+        ArrayList<Term> arg = parseArguments(s.substring(firstSeparator+1) + ARGUMENT_SEPARATOR, memory);
+        Term t = CompoundTerm.make(op, arg, memory);
+        if (t == null)
+            throw new InvalidInputException("invalid compound term");
+        return t;
+    }
+    
+    /**
+     * Parse a String into the argument list of a CompoundTerm.
+     * @return the arguments in an ArrayList
+     * @param s0 The String to be parsed
+     * @param memory the memory object being inserted into
+     * @throws com.googlecode.opennars.parser.NarseseParser.InvalidInputException the String cannot be parsed into an argument list
+     */
+    private static ArrayList<Term> parseArguments(String s0, Memory memory) throws InvalidInputException {
+        String s = s0.trim();
+        ArrayList<Term> list = new ArrayList<Term>();
+        int start = 0;
+        int end = 0;
+        Term t;
+        while (end < s.length()-1) {
+            end = nextSeparator(s, start);
+            t = parseTerm(s.substring(start, end), memory);     // recursive call
+            list.add(t);
+            start = end+1;
+        }
+        if (list.isEmpty())
+            throw new InvalidInputException("null argument");
+        return list;
+    }
+    
+    /* ---------- locate top-level substring ---------- */
+    
+    /**
+     * Locate the first top-level separator in a CompoundTerm
+     * @return the index of the next seperator in a String
+     * @param s The String to be parsed
+     * @param first The starting index
+     */
+    private static int nextSeparator(String s, int first) {
+        int levelCounter = 0;
+        int i = first;
+        while (i < s.length()-1) {
+            if (isOpener(s, i))
+                levelCounter++;
+            else if (isCloser(s, i))
+                levelCounter--;
+            else if (s.charAt(i) == ARGUMENT_SEPARATOR)
+                if (levelCounter == 0)
+                    break;
+            i++;
+        }
+        return i;
+    }
+    
+    /**
+     * locate the top-level relation in a statement
+     * @return the index of the top-level relation
+     * @param s The String to be parsed
+     */
+    private static int topRelation(String s) {      // need efficiency improvement
+        int levelCounter = 0;
+        int i = 0;
+        while (i < s.length()-3) {    // don't need to check the last 3 characters
+            if ((levelCounter == 0) && (Statement.isRelation(s.substring(i, i+3))))
+                return i;
+            if (isOpener(s, i))
+                levelCounter++;
+            else if (isCloser(s, i))
+                levelCounter--;
+            i++;
+        }
+        return -1;
+    }
+        
+    /* ---------- recognize symbols ---------- */
+        
+    /**
+     * check CompoundTerm opener symbol
+     * @return if the given String is an opener symbol
+     * @param s The String to be checked
+     * @param i The starting index
+     */
+    private static boolean isOpener(String s, int i) {
+        char c = s.charAt(i);
+        boolean b = (c == COMPOUND_TERM_OPENER) ||
+                (c == SET_EXT_OPENER) ||
+                (c == SET_INT_OPENER) ||
+                (c == STATEMENT_OPENER);
+        if (!b)
+            return false;
+        if (i+3 <= s.length() && Statement.isRelation(s.substring(i, i+3)))
+            return false;
+        return true;
+    }
+    
+    /**
+     * check CompoundTerm closer symbol
+     * @return if the given String is a closer symbol
+     * @param s The String to be checked
+     * @param i The starting index
+     */
+    private static boolean isCloser(String s, int i) {
+        char c = s.charAt(i);
+        boolean b = (c == COMPOUND_TERM_CLOSER) ||
+                (c == SET_EXT_CLOSER) ||
+                (c == SET_INT_CLOSER) ||
+                (c == STATEMENT_CLOSER);
+        if (!b)
+            return false;
+        if (i >= 2 && Statement.isRelation(s.substring(i-2, i+1)))
+            return false;
+        return true;
+    }
+
+	public Task parseTask(String input, Memory memory) throws InvalidInputException {
+		StringBuffer buffer = new StringBuffer(input);
+        String budgetString = getBudgetString(buffer);
+        String truthString = getTruthString(buffer);
+        String str = buffer.toString().trim();
+        int last = str.length() - 1;
+        char punc = str.charAt(last);
+        TruthValue truth = parseTruth(truthString, punc, memory);
+        BudgetValue budget = parseBudget(budgetString, punc, truth, memory);
+        Term content = parseTerm(str.substring(0,last), memory);
+        Base base = (punc == QUESTION_MARK) ? null : new Base();
+        Sentence sentence = Sentence.make(content, punc, truth, base, memory);
+        if (sentence == null)
+            throw new InvalidInputException("invalid sentence");
+        sentence.setInput();
+        Task task = new Task(sentence, budget, memory);
+        return task;
+	}
+}
diff --git a/open-nars/com/googlecode/opennars/storage/Bag.java b/open-nars/com/googlecode/opennars/storage/Bag.java
new file mode 100644
index 0000000..97c5a6c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/storage/Bag.java
@@ -0,0 +1,213 @@
+/*
+ * Bag.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.storage;
+
+import java.util.*;
+
+import com.googlecode.opennars.entity.Item;
+import com.googlecode.opennars.inference.BudgetFunctions;
+import com.googlecode.opennars.main.Parameters;
+
+
+/**
+ * A Bag is a storage with a constant capacity and maintains an internal priority
+ * distribution for retrieval.
+ * 
+ * Each entity in a bag must extend Item, which is a UsageValue with a key.
+ *
+ * A name table is used to merge duplicate items.
+ *
+ * The bag space is divided by a threshold, above which is mainly time management,
+ *   and below, space mamagement.
+ *   Differences: (1) level selection vs. item selection, (2) decay rate
+ */
+public abstract class Bag<Type extends Item> {
+    
+    protected static final int TOTAL_LEVEL = Parameters.BAG_LEVEL;          // priority levels
+    protected static final int THRESHOLD = Parameters.BAG_THRESHOLD;        // firing threshold
+    protected static final float RELATIVE_THRESHOLD = (float) THRESHOLD / (float) TOTAL_LEVEL;
+    protected static final float LOAD_FACTOR = Parameters.LOAD_FACTOR;       // hashtable parameter
+    protected static final Distributor DISTRIBUTOR = new Distributor(TOTAL_LEVEL); // only one instance
+
+    protected HashMap<String, Type> nameTable;    // from key to item
+    protected ArrayList<Type> itemTable[];        // array of lists of items, for items on different level
+       
+    protected int capacity;         // defined in different bags
+    protected int mass;             // current sum of occupied level
+    protected int levelIndex;       // index to get next level, kept in individual objects
+    protected int currentLevel;     // current take out level
+    protected int currentCounter;   // maximum number of items to be taken out at current level
+    
+    
+    // ---------- constructor ---------- //
+    
+    // called from subclasses
+    protected Bag() {
+        capacity = capacity();
+        levelIndex = capacity % TOTAL_LEVEL; // so that different bags start at different point
+        currentLevel = TOTAL_LEVEL - 1;
+        itemTable = new ArrayList[TOTAL_LEVEL];
+        nameTable = new HashMap<String, Type>((int) (capacity / LOAD_FACTOR), LOAD_FACTOR);
+    }
+    
+    // --- property methods --- //
+    
+    protected abstract int capacity();
+    
+    // the number of times for a decay factor to be fully applied
+    // it can be changed in run time by the user, so not a constant
+    protected abstract int forgetRate();
+    
+    // --- Bag property --- //
+    
+    public ArrayList<Type> getAllContents() {
+    	return (ArrayList<Type>) this.nameTable.values();
+    }
+    
+    // get the average priority of the bag --- can be removed???
+    public float averagePriority() {
+        if (nameTable.size() == 0)
+            return 0.01f;
+        float f = (float) mass / (nameTable.size() * TOTAL_LEVEL);
+        if (f > 1)
+            return 1.0f;
+        return f;
+    }
+    
+    // check if an item is in the bag
+    public boolean contains(Type it) {
+        return nameTable.containsValue(it);
+    }
+
+    public Type get(String key) {
+        return nameTable.get(key);
+    }
+    
+    // ---------- put/remove methods ---------- //
+    
+    // put a new Item into the Bag
+    public void putIn(Type newItem) {
+        String newKey = newItem.getKey();
+        Type oldItem = nameTable.put(newKey, newItem);
+        if (oldItem != null) {                  // merge duplications
+            outOfBase(oldItem);
+            newItem.merge(oldItem);
+        }
+        Type overflowItem = intoBase(newItem);  // put the (new or merged) item into itemTable
+        if (overflowItem != null) {             // remove overflow
+            String overflowKey = overflowItem.getKey();
+            nameTable.remove(overflowKey);
+        }
+    }
+    
+    // put an item back into the itemTable (it is already in the table)
+    public void putBack(Type oldItem) {
+        BudgetFunctions.forget(oldItem.getBudget(), forgetRate(), RELATIVE_THRESHOLD);
+        putIn(oldItem);
+    }
+    
+    // choose an item according to priority distribution
+    // and take it out of the itemTable
+    public Type takeOut() {     // default behavior: the Item will be putBack
+        if (mass == 0)                              // empty bag
+            return null;
+        if (emptyLevel(currentLevel) || (currentCounter == 0)) { // done with the current level
+            currentLevel = DISTRIBUTOR.pick(levelIndex);
+            levelIndex = DISTRIBUTOR.next(levelIndex);
+            while (emptyLevel(currentLevel)) {          // look for a non-empty level
+                currentLevel = DISTRIBUTOR.pick(levelIndex);
+                levelIndex = DISTRIBUTOR.next(levelIndex);
+            }
+            if (currentLevel < THRESHOLD)
+                currentCounter = 1;                             // for dormant levels, take one item
+            else
+                currentCounter = itemTable[currentLevel].size();     // for active levels, take all current items
+        }
+        Type selected = takeOutFirst(currentLevel); // take out the first item in the level
+        currentCounter--;
+        nameTable.remove(selected.getKey());    // 01-07-04
+        return selected;
+    }
+    
+    // pick an item by key, then remove it from the bag
+    public Type pickOut(String key) {
+        Type picked = nameTable.get(key);
+        if (picked != null) {
+            outOfBase(picked);
+            nameTable.remove(key);    // 01-07-04
+        }
+        return picked;
+    }
+    
+    // ---------- private methods ---------- //
+    
+    // check whether a level is empty
+    private boolean emptyLevel(int n) {
+        if (itemTable[n] == null)
+            return true;
+        else
+            return itemTable[n].isEmpty();
+    }
+    
+    // decide the in level according to priority
+    private int getLevel(Type item) {
+        float fl = item.getPriority() * TOTAL_LEVEL;
+        int level = (int) Math.ceil(fl) - 1;
+        return (level < 0) ? 0 : level;     // cannot be -1
+    }
+    
+    // insert an item into the itemTable, and return the overflow
+    private Type intoBase(Type newItem) {
+        Type oldItem = null;
+        int inLevel = getLevel(newItem);
+        if (nameTable.size() > capacity) {      // the bag is full
+            int outLevel = 0;
+            while (emptyLevel(outLevel))
+                outLevel++;
+            if (outLevel > inLevel) {           // ignore the item and exit
+                return newItem;
+            } else {                            // remove an old item in the lowest non-empty level
+                oldItem = takeOutFirst(outLevel);
+            }
+        }
+        if (itemTable[inLevel] == null)
+            itemTable[inLevel] = new ArrayList();               // first time insert
+        itemTable[inLevel].add(newItem);          // FIFO
+        mass += (inLevel + 1);                          // increase total mass
+        return oldItem;
+    }
+    
+    // take out the first or last Type in a level from the itemTable
+    private Type takeOutFirst(int level) {
+        Type selected = itemTable[level].get(0);
+        itemTable[level].remove(0);         // take the item out
+        mass -= (level + 1);                    // decrease total mass
+        return selected;
+    }
+    
+    // remove an item from itemTable, then adjust mass
+    protected void outOfBase(Type oldItem) {
+        int level = getLevel(oldItem);
+        itemTable[level].remove(oldItem);
+        mass -= (level + 1);                    // decrease total mass
+    }
+}
diff --git a/open-nars/com/googlecode/opennars/storage/ConceptBag.java b/open-nars/com/googlecode/opennars/storage/ConceptBag.java
new file mode 100644
index 0000000..57698ef
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/storage/ConceptBag.java
@@ -0,0 +1,46 @@
+/*
+ * ConceptBag.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.storage;
+
+import java.util.HashMap;
+
+import com.googlecode.opennars.entity.Concept;
+import com.googlecode.opennars.main.Parameters;
+
+/**
+ * Contains Concepts.
+ */
+public class ConceptBag extends Bag<Concept> {
+    
+    protected int capacity() {
+        return Parameters.CONCEPT_BAG_SIZE;
+    }
+    
+    // this is for active concept only
+    protected int forgetRate() {
+        return Parameters.CONCEPT_DEFAULT_FORGETTING_CYCLE;
+    }
+
+	public HashMap<String, Concept> getNameTable() {
+		return this.nameTable;
+	}
+}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/storage/Distributor.java b/open-nars/com/googlecode/opennars/storage/Distributor.java
new file mode 100644
index 0000000..c6af103
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/storage/Distributor.java
@@ -0,0 +1,76 @@
+/*
+ * Distributor.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.storage;
+
+/**
+ * A pseudo-random number generator, used in Bag.
+ */
+class Distributor {
+    /**
+     * Random sequence of valid numbers
+     */
+    private int order[];
+    /**
+     * Capacity of the array
+     */
+    private int capacity;
+    
+    /**
+     * For any number N < range, there is N+1 copies of it in the array.
+     * 
+     * @param range Range of valid numbers
+     */
+    public Distributor(int range) {
+        int index, rank, time;
+        capacity = (range * (range + 1)) / 2;
+        order = new int[capacity];
+        for (index = 0; index < capacity; index++)
+            order[index] = -1;
+        for (rank = range; rank > 0; rank--)
+            for (time = 0; time < rank; time++) {
+                index = (((int) (capacity / rank)) + index) % capacity;
+                while (order[index] >= 0)
+                    index = (index + 1) % capacity;
+                order[index] = rank - 1;
+            }
+    }
+    
+    /**
+     * Get the next number according to the given index
+     * 
+     * @param index The current index
+     * @return the random value
+     */
+    public int pick(int index)	{
+        return order[index];
+    }
+    
+    /**
+     * Advance the index
+     * 
+     * @param index The current index
+     * @return the next index
+     */
+    public int next(int index) {
+        return (index + 1) % capacity;
+    }
+}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/storage/TaskBag.java b/open-nars/com/googlecode/opennars/storage/TaskBag.java
new file mode 100644
index 0000000..c4b5f4d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/storage/TaskBag.java
@@ -0,0 +1,42 @@
+/*
+ * TaskBag.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.storage;
+
+import com.googlecode.opennars.entity.Task;
+import com.googlecode.opennars.main.*;
+
+/**
+ * New tasks that contain new Term.
+ */
+public class TaskBag extends Bag<Task> {
+    public static final int defaultForgetRate = Parameters.NEW_TASK_DEFAULT_FORGETTING_CYCLE;
+    
+    protected int capacity() {
+        return Parameters.TASK_BUFFER_SIZE;
+    }
+    
+    protected int forgetRate() {
+        return Parameters.TASK_DEFAULT_FORGETTING_CYCLE;
+    }
+
+}
+
diff --git a/open-nars/com/googlecode/opennars/storage/TaskLinkBag.java b/open-nars/com/googlecode/opennars/storage/TaskLinkBag.java
new file mode 100644
index 0000000..051dc27
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/storage/TaskLinkBag.java
@@ -0,0 +1,40 @@
+/*
+ * TaskLinkBag.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.storage;
+
+import com.googlecode.opennars.entity.TaskLink;
+import com.googlecode.opennars.main.Parameters;
+
+/**
+ * TaskLinkBag contains links to tasks.
+ */
+public class TaskLinkBag extends Bag<TaskLink> {
+
+    protected int capacity() {
+        return Parameters.TASK_BAG_SIZE;
+    }
+    
+    protected int forgetRate() {
+        return Parameters.TASK_DEFAULT_FORGETTING_CYCLE;
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/storage/TermLinkBag.java b/open-nars/com/googlecode/opennars/storage/TermLinkBag.java
new file mode 100644
index 0000000..743a44d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/storage/TermLinkBag.java
@@ -0,0 +1,56 @@
+/*
+ * TermLinkBag.java
+ *
+ * Copyright (C) 2008  Pei Wang
+ *
+ * This file is part of Open-NARS.
+ *
+ * Open-NARS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Open-NARS 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.googlecode.opennars.storage;
+
+import com.googlecode.opennars.entity.*;
+import com.googlecode.opennars.main.Parameters;
+
+/**
+ * Contains CompositionLinks to relevant Terms.
+ */
+public class TermLinkBag extends Bag<TermLink> {
+
+    private static final int maxTakeOut = Parameters.MAX_TAKE_OUT_K_LINK;
+    
+    protected int capacity() {
+        return Parameters.BELIEF_BAG_SIZE;
+    }
+    
+    protected int forgetRate() {
+        return Parameters.BELIEF_DEFAULT_FORGETTING_CYCLE;
+    }
+    
+    // replace defualt to prevent repeated inference
+    public TermLink takeOut(TaskLink tLink) {
+        for (int i = 0; i < maxTakeOut; i++) {
+            TermLink bLink = takeOut();
+            if (bLink == null)
+                return null;
+            if (tLink.novel(bLink)) {
+                return bLink;
+            }
+            putBack(bLink);
+        }
+        return null;
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/storage/package.html b/open-nars/com/googlecode/opennars/storage/package.html
new file mode 100644
index 0000000..7e26793
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/storage/package.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<body bgcolor="white">
+
+Storage management
+
+<h2>Package Specification</h2>
+
+All items (Concept within Memory, TaskLinks and CompositionLinks within Concept) are put into Bags, which supports priority-based resources allocation.  Also, bag supports access by key (String).
+<p>
+A bag supports three major operations:
+<ul>
+<li>To take out an item by key.</li>
+<li>To take out an item probabilistically according to priority.</li>
+<li>To put an item into the bag.</li>
+</ul>
+All the operations take constant time to finish.
+<p>
+The "take out by priority" operation takes an item out probablistically, with the 
+probability proportional to the priority value.
+<p>
+The probability distribution is generated from a deterministic table.
+<p>
+All classes in package <tt>nars.storage</tt> extend <tt>Bag</tt>.
+<p>
+In NARS, the memory consists of a bag of concepts.  Each concept uniquely corresponds to a term, which uniquely corresponds to a String served as its name.  It is necessary to separate a term and the corresponding concept, because a concept may be deleted due to space competition, and a term is removed only when no other term is linked to it.  In the system, there may be multiple terms refer to the same concept, though the concept just refer to one of them.  NARS does not follow a "one term, one concept" policy and use a hash table in memory to maps names into terms, because the system needs to remove a concept without removing the term that naming it. 
+<p>
+Variable terms correspond to no concept, and their meaning is local to the "smallest" term that contains all occurences of the variable.
+<p>
+From name to term, call Term.nameToTerm(String).  From name to concept, call Concept.nameToConcept(String).   Both use the name as key to get the concept from the concept hashtable in memory. 
+<p>
+The main memory also contains buffers for new tasks. One buffer contains tasks to be processed immediately (to be finished in constant time), and the other, a bag, for the tasks to be processed later.
+
+</body>
+</html>
diff --git a/open-nars/lib/antlr-runtime-3.0.1.jar b/open-nars/lib/antlr-runtime-3.0.1.jar
new file mode 100644
index 0000000000000000000000000000000000000000..b2efb5b6669945c818a71989c49943b18ffcef49
GIT binary patch
literal 105209
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
Q{NlI|yn}QGW+_nr1G7d+vj6}9

literal 0
HcmV?d00001

diff --git a/open-nars/lib/stringtemplate-3.0.jar b/open-nars/lib/stringtemplate-3.0.jar
new file mode 100644
index 0000000000000000000000000000000000000000..5efcffce509c7ce466fd6f5c0e5a56ed2ce75e21
GIT binary patch
literal 161716
zcmbTdV~{36xGvbXZQI?`wr$(CJ#E{zZQC}#=Cs|@wsy|Bckl9?h~28l9~G4uneUsK
z^&l!0WkA8ufS~@}%9a#tK>w!;8VC$XPE1vZUP@k^@p}pg2oy+B1`_H&YJmLDYKs45
zW3+!Y{#Ro;A$cirF%?w?Iq?U%nQ2)WdWJ=K8G4$znfYdArj=iN$IcAWa&%I1i*8k5
z&>3ggqqv$hmYf)9M<q0zr>7VxX(brvRGuf~msa=Ach127IS%EZLJjeMz5GY{KgOZ>
ze+z=?-&+S~3q~V*S6gRB7guL1dka@HJ4ah1S2IQ-*MHB(Zmwp^X7;9L&SuUGCbmW{
zE@rXJFhhc9qNn2-qO`Q}MAnIXf;70aLQIr^k@=*Czf<pr`*gek;V7tfqUBg&Mg$L@
zyMKY4WtB^)S%fM2QWiKxH0eBQ`>f4ce_0!}>dG{}SMhfTG133VwBBV;gMNs8{JjcI
z2*BrZoPZ2zcpjv>9)WQ4N**e2ULCrKCz|ogM+G4sB8q}09T6Goc!8RP{g1@cvn@a*
z{|jg0zYUo2zYW;U)j{fCsP?WJ&Q`Afd%VBZK2%iAu>9uqH;$p84&X<0sOg5XD6&AL
zqrylM5<IDo8+<~Fr~i6C2c)mqj%6*Khrbt=)!cCp%PJL9R~&QdncJ4pWmjfeU-+L1
zROG!}85wC@LGC)tfAprG{_Z>dc>T_2{0m$$T1j+bl1*4E)X_j60Aq`}Oi`vM8=i4G
zdWE!1T}DgDXjq<M&)oe9z#k#FN{z=1rW%nkeg?<x5{MwMysy@f6_r(uVZepFU!ctV
zQeM41EFcX3jG(?9e<Ecjt)r!~=c|CX+Rwnaf%VWXL%z`&w<9H3Jye$#Qu6j$U@_iT
zCpDWa!-#*Rl(p}AZli+Y&i_!60*Ar>J5rD;#fq|Tzue%O9J$O|y}Tq_{UunvqrFiq
z82e~rE<s|ZDNa&HL{!ifTd`ViICoV03@UH^uvk(#py4nAU#%o0WoDmWl?%g*i>ky<
zmBMcq4BFeZQTjA?rliuf%Dp(GvO%&RIytE7AI;a4Hm0QgMn#XJl^{#j3}T_GE+<x?
z*EmU0Mrt%N8Q$&8D=@9MRIZZ@!`*=;OVTT0S~MPje3Bh6{#a5{`iW)e#M7suU|nWT
zKC!e!jZ)5_W?Sx_t?jJb#aJ7}DhD@J9Y2D%8Jrs_^sC5$J!EC6Oo%p-faEts>ypT*
zb3$Yi^cQPpnY*lLi7|7Y;vHF9g=UmAx*Akv#TW}Z+r1VoMU1q-0S$^|6=#e%I)!LL
z=j)eYuMk`%XHZI1F^U)5xSFkaF(G5MX1tm)dxa&&G7)fgqnK~CR2EeoI~#v%6e?$>
zF);>pg>=SmBYOMM8OJGmvvbhN4D<8-?Z9Tk))#^mQq$U##&fGZy}47*$RsD?_7)3-
zwAZE^!q!5uVy-Mn4_%GXk0UAUaW67{6+%h4jZLdcZ&sG<F%xQ%!=2?LUy{fpX7EDl
zsdm}@ruz779P{anIb>@6{Ov6Y33l9Z$_ZUX@VA&7CRC}N7J&7n>V@CRC~4)MN|hln
zNCqk7$jd6JaFd4hq&_vJPifIrYEjcV&bYy4jgb$%VeheLlskC;+|aB94gjwUocxho
zx7%Tm4@RMa%9Dc=#$kdD#y}D~RNx3(Oh3X0_zwJ7!>>Y{-F~QeJMcpI#Z6tgA;}$F
zb@TeFD{S5!)VvV+7%+gH74gnxY)c$vry0s#BgSL4IXF}PmOIuOQ300Ds5)kj>K5GA
zj;imvs1m*^?^}vm50iDF%X(hJH!-g7y|#x<X~R{n(J_}s_tqV3#XEe4kJfRE4pVPN
z^Lo|syTzt)ZjzvgV|GXGm6xw&*C)LJpx^uD5nOvet#{pqpLb@525qprV9%rLc^r0h
z&$z%J*aqUash_6`){K1IdBHo(fAE)50iyWg7gicK>QQ;MxE7no71lbi_bU{qRPUqD
zQNs4q-?00c?es=Tzw|$Yu0HQ=Sszeot1*Qg<=-(f*xxVhO^J93QtI3>=e}hpq+&+e
zDSJjs-XTi9ejT)5bton2mkb`k-A?*!u=-=q7hWb*l@BT2Q9+oKF|`aZv`jIXqKPm3
zFw-I?8H>wA($gmX-e0A8%qde9z{E_BV{)qN)0B#}<W_qwCqq&&w`kJ0FeeABi@nlS
za|vVXRE_J{FBET_(;Rnrp&lqacNn46>7s+ppIaG&`iaOSPV;z^$Rk@?T9=KJlQ2%k
zMjb>gws6fjryG-eq+FCPd20MKRSUek8cxkYOumCV1B1bJu%7Mj{JY53`~zG{F&&Ki
zu3?LXbmBVASk3j<Smx_qJ8mQ#f4qcURy1@@X`fQP>tXgw`<Q3Wt+2+7!#|B?-Uu)L
zWQcwt%oOxWzG}Sc|CWW}->3a0yy_?2>L+epcQ<Ens`r!A$kBkyQF+abH)J<;%z$`i
zL$JWX8{u$A@E|bcp|x^rkS+2TI(%EM^B$g$<d3mL9}AHGY^&MlLSB(<Sq9k|xvxne
zA>a@g{EL+Q0Tui!!R2$N4v}-5apcYhp^P4(tTqAku>07Gim^M$*h;e{AZ7#qC$H&H
z_Cxt|&g2_ZOxNN-f#qer1i{Ofdfee%SjSPYpyP^t%E55=36H+6#BTp$Xzk}ekvF0a
z2$&862q+r%|2OiAIM~@a*h@G&xH-x?82!WE|AD-@sxm65LP*~f&{~=pL$s1eN8|}1
z5@_h;L@>xqD8Rr<4C?fgK+%)-+dEX=&sXuc2k6x`q9rZ7R;dEg*HTa@Ab7IYK4m`d
zm*?N!=6+w__wWNuc~iGVG7*1iSPRQ>(idq(^F#cg{jgC$gu!T;iN=JmMX)eP$PQuZ
zrmzOtu-BbLhAL!<?WZcn>7h+fhT#4}%dKBYg)#fjFtrO;*;CFYm}O`6nLVg-S8npQ
zBxz_Mu3|5<&SaQx=$@W<8paNyGo$1TqAt7kB}myhx~T0)CYkLLZYdd56_!*v;EQAb
z{Mc<vk;=ou1(%1wqse9=XU*B#J10}7b!HKf1@kuJo?7Yra+L{M(1?k_K5fpDY~(U7
zQ4Zs`z{zx-L5eU!mK6HM0JT_U2+~e2OVbhD4O7N6tLWkE6Xmj`Dk%~YLDdnC4S}J|
z6wL+wf-ZU|ILK>^LO`QAP!vKA9^XJ`BsNH6JQ`s3MCBR7hWrFAaw|(S9c6r*f8JBF
zxkX+VJ6c;DEwQ4Mj+$kqbPZngt1S&K@)@bHwG_j-wS{A(c9}3DY5TzR{=GQRL{DcM
zu<sN|PPnMemV4rTu)UV%By%RcMa5n)Y4Ddrf2nHKE}6=-BGN)O`O;m9Q4FId<WYGS
zS)~1~4qvJ&P0e&%<G{~W%1~a9NSu0&rTzZYeyZrGBg+^n$0x4Xo7)6aSLTw+QDQV2
zY?J}5pO<pTQ$C|YMNE>pk%9$ptHN;%OZ>CE%*onW;-%(}@N5A?Qv{QbOFtqXRaTcK
ziN3^bSjc|>A8#V?cL_GLjPjh0jbh+tkN;(%KjMBatMp*tARZniFuh~)$&gq}A_I_t
zRI;V-b<YmQC)g>!F5JzX?#$M+(*A%)2POhh?WrPHikMoktZ_geUDa^iykb)Yw8krq
zZylZWuzmgqWzQfTuhvRxhJV2~(9@+*K2LNQ9?r`yHy~W#2C%CXMXD(2J`gP5f=XJf
zI!o5O?{X#v_uIAj;|>mZ1bGDZ-bbw7gNIl*q+iqkau)yW^FN8-5y6cg3Mdc|`oBH*
zUo&0$|Bm>{|G&^aH>C~fVL>#$W%5R=F3Xw^btPMEOa20q2r4k?-xX&rn+R@Xxhbwi
zekqJWRIhuGuSy4UwLyUh+nGLyr`vY?{ksA{tV(PJM$F-KX>gjF?23a?accNBaGQ+@
z!nsVEt<Sk0H(Vr+_QHjpfTntE7K_1vUn!fy_wuY4cehiQZy~0H#wa3Y6c2n{u3a=}
z&VVL8h{Mmu`EhA5=OUBb1AC;<-+si#jjPbQTzkr2s@7xJvS*r1je&CbIu!SSwMG+T
zOdmK2Ax>A`%Fl&NSs5yRoR7SNxgSxuXWbL45)|D_5B-<>daW>5B<e6{XKc99pNX7B
zD~n??X`N@TR%e+Fo3?10-=SfzB?AYI=W|Le3Qke_wY#36J{0lK;_b|0h>~uSk^~f^
z%zyIkV4pBcaOx$K&GJy1a7x>ih!{mY6Kh!Mb-yA0gP!{~Q*Fus0|62J6G#8`EHV6d
zv!rO`YWe^8CYEZPd*H6(_s%D=-Fu?&xC<k3ipvKjnr&FCNCxGE(6OzIs^e`9PLzf=
zvbLp8{4!>p0%;MH+FDqOwJ)J>DUI%4Um)Rl&B^l%a(Qp`S3Lhs8p}@m2zbhQ$UE)*
z<9y@b<?vYl)ANG}RP3oS>NMlAhn1HiLK6Xwo<FQ|fBXQ`hcvQGgT_k=sfQ2^vjoFJ
z<8IW43Xz6JSA90tgQp%eG4+-t{WL9fbktKdpz6dy2mVHsmnzeS2P4EOgoduGggmxN
zR43)LetfHoG*9a(G)mM*70yWQsWh74%N3T6)>A_g#z^ZaMjna_(}yym!E?v9eMR)F
z5&YT}<*>(w{%52e%~xm81I<@sAb)ZbJn-+N%sV=tzH3wGt7+R_3^W+rR@>3;qSUm0
z++|sE^C9^7T-J14W7hn69CE&!!6{Asp|X%QZkf@t@QX6LMUKwmwbL&<Gb*YDmFMK;
z+2g3DM^_RX^IR1WL<#p3>oaH+E(<fbz`DsAE3)Y7=rF!=#*>bFPt)r8-0t%UE$<WN
zEt(VX`=4;L^%20r^9cA{n`5UPX*XFo^fL1mIp6PaD7$&f)r=YQIcXO?qP3-(?v&O8
zi)a~{FgsIoIKD&mXl_4xyQAD1v!;`02Hd%jOh)dNUyrLz2?L3eYW?=@a~Bx+IDboP
zCE8UFb|)08wXf(~P<Gd&V5$puu8{*RtEDSyRWm!KFKX0Umct%}v6j1<55^pqk~}3!
z)54ZL^+Z5SaOC&Meo^pPtyJtO-SWZz8AoKz86pKK)V@?#Hqm3BxpHAKBq6r@QXG!I
z4GYtGW$tdmrj}Z#%W1Ux>Z<Vs7g)Si>7jPiXcp#j!`U602Y3{NTWAf>GuQ4nd*+PE
z(&|!`X$(y#scDiR+GLEv(Hirxkq7<^4O6K2^x=pH@>%Wp4nR)}*S#h(oUq0mF0z!>
z4EP~Rt<lc2-~@)dt8Sw#ZqbEt|6!ZP@ryLDdS&w)t{4YrMQopGUddT(2;+#T@++>>
zXOks97xR$`mW1tpa^9(0C>^)~L+}B?oE2uyZ?_$v@O0C~><@%~h{~Hbp8}R@20XE5
zhV-JygrI-whdm<Vd`Ad0TH}C{zWmheGiE3?)a~Q<Fd%iBC}vyt6hh21>a#2%==ktZ
z-(9_uG!<UZzH`rCs0GSDf40~i!*6vmFnOLPS2TW*68;%aO$9%1u@PgG)oNqT`=t)Q
zOx<CKakjx)$CWyIqEa@K>gUd}+qSa$E3?d`jD*e(;?Z}P=@+3-iT$}k7c_U;`T>Ux
zrNyyfjS5ftGHfWme$-aaEmmh_t)jc%C8p<GXJP){M9DOfd`pbiK!>>8Nu@`$zZLc7
zyS3HtzXBbo13wR089I%%)%V4tPy2^E!t83Q%V;l(tN77w(;(9NeaEs6{ddnsizm}d
z-tYH#Ji7xx{rK_02Ku*yjEs1GKp)4spl{=sp(d0s3Wspx&A!=!xP*IxuAn3|yCT_m
zzKaAue-^(9Ko*VqdPRT(UGQ#%0!$*ryB7lquEzZMUkVUky37Uim_IN!-+*8}Sa1)w
zC{k7&6&Bh9<BlYuFX&?&FFq+-LImD9T7F0DEXrL;+ZndA4x}dhuy<`T^*=B6+hoKE
z9%9)Ku?osUA`cReIAsWR<{v?Nm5L=4g(YyvfM0$bku_$KNO|nIwp(<B<mKrjkYCXo
z84MBL`$qsfw4XBkWsSPRyv*+4LBEF`dK_g(lCCSvXXQ=xp`}Sdc#}E9)$#!KN5RDE
zRgvs+$y7k2886=Eo2%fLHHR*9j8Uef_6SRgza<lh#aomih*$I69xs_zrCBsm8VY=}
z4gkp!x&X;H>YE<&H|zM!Ngq`OJ^!XTKa%7-{@|VZf=?N)M3(Xd1y!**s~)RAHH>9Y
z*~Fx6#vdlr$|H)Hq-c}+EAMg*^3E*M*PPNN*@;Ge>XpntX&?&=Hlu(dEe+z3Ts!oZ
zbYq%N7rVtt*72J1*?+^1&>rZPQnQDhIB`>NB>l?4JYj3M7l=aAj<h?H@PQ-OA|Y~3
z4o3-+9Z@PA2p?1P#}d_su$S5z7~eD(SfLnpeh<j?#5&PSGFfO$tZSkdoj=+B1N#1c
zx;{|)Y&msdd~}6ETxD2Pmct36p&w&F0i|NQLOh!otz>r;<VRHG*GY%9^UjGpL9ZtU
zDV5>@?|uqC!5$rLfgX-6Lv%GBBh!i5VsPr=!1ae<?YOGPlh^YktZruQ6rpuRXP<c}
z=J^r1hEbjL?l>eT#q<g2RpPSa6?@$4E0^1=p6?XwKya&V>aF4xC{-g$9DBZKeFKEO
zA)!BJ`~k(syV}VCo3!qcK5pJC<9~pu)^uX}-9NemhV<WoDaU^YrYisG^{M_(ua8W~
z!ou0i;-BmHKa@tS@|OITAQB&LI41%FbO;YUnzRe)&;dL(6f`k$!qPJ^*u^1)`q%_u
z&3o7Z7zJ7_@g4Z9qN-UcMEC%bfY*iBXYOj|>htU612MoZ#krxu(wI6N4TIjav1T!f
zov`)I)OdCTLWCj7h^*vZbVkv3_m<~xOX?}lIB(zgSTTf%`8+Id>%5_A)hXQh@U1k{
zQMNu&U%P{jaNb>-0y3#JZJ2Xu{>W+IWe&|bxV;J0eX$!UgPI5>i>}b8GDtr+gW*I~
z!#`1?QyCXsk-pqO&p4V`UQPWxY;nMT--)u7<uE)38Ft>tV0Xl1RUE*`Zr)&Jg5g5Z
z$8r_2<mOr6dp^?ZYn?FfmF@R1;8yAg&8#T`;D-hwM*K}M?mZB?*oWm#dpJumLu*A+
z3T8#p_&LYWAd+po2(d_e8Hpr~T2`2tThz}DCoEX_45#iRbaDDC24N|lPcE-UpJ6Z0
z74Z?BiBB<2$|@nhhL5;c?Z)`PSapT?Pw50)6zC%N=u_k>s#~I$XR4{U+b4;P0$YJU
zMSZcB+|3Z4nM!X4W&RLI>Du~|x>2gD%n$H?EQ)>h>xYJa42%087yhpq7T^DeMWLel
zzbs%`D;L-Qxil07WI&nmes|j3TzP4?GLUdXuOaZ|=te2R2p4v2@8>Nml32+n<t)S>
zt2#O^RuW2o9$ytPn0qqb9DjW$Je^+R1`s2lwj_81A{S$w29RP)(*9-@uIB4+Bg<7m
z4ld+M(c52&QOgd>h{*$9=B4ykPxQAX9iE&mO7bv`?@BsQhb6veR9cX|&PL9db=A!C
zoUT(QZBgB`9iN+@=@`f2a+=(YDQb)1zd6rUZHy?QbZF`1UJjc!rBY*K_or_b-UJ{I
zP>8>R1%NXQvY05`q`8UWAjWAMFuRy-z2x9}I5y@ee1xxdo()6yJRXBL$>culu23nD
z!T_TLaee<O@-wUsEI|GxJMmxnuao`XijM#54*Va<ZRLgbL=#)9uj=yQPDX%E2E&44
z3M4WzM*-6vF-&ljND3eW0p<!bb(YMC{Dq2yq=$avv$`7af{y4e76%pq;~DUBec^r8
zwOe;t*Zp2!cWM9q(&bY(7hv@A^VX;8rq=8Ibg{})EuR1J(l-uVpecIgNd2)k_B}rK
zZ4Wuu*Bos4r(6j8BOKovfcW^NkoqP0)PJS<nce5zuqOy!9Hc_LWQdu5CQ~L{I3yk_
zErx^cE;_IbJ&nj-S6MTM5bOov_FPPoY}izBrVtt&WlQ5+F;Qv^G>auU5M1H7`D%zu
zXbj2mA$07e`B1nbAbUJqx!*L5_00ElwDk(bBWoy7GOWv=<PB4SB_<hPT)!C7xiB^k
zFk<-#^xi(d1$_Y+k-t>+OpHZWy42tk9E~qea9YPnP~1U>9D$|&#CTI|zDBb1N2YO2
zB9z~w&`_8NNh%zZ+I^bx<cRN>^{kAQEB=m(RcIX+HrZfFRZw|zO`TVKlf}(93payU
zZMO48VE62tQXsE7QC2cKOr@!B3eKM|Hs(h!Uz`9*)lktZzF$`BOHgENx*MgbS9?RT
zrf(IY{m5%`4x37^^yPA^lN4dEA=7`Y=!}Zu#;tE3ruf@_2Z3W%^2NR=`3v1bxiKpW
z14mCpY+x)HY_;mXxdNe*HzsL}lzrDcy!uY|Rl9F)Y+n7%n@4w?1Mn)&vpq0hXq+6I
zUw!|e`t6dMui(kpa0hEe>zUJjJIn5uh;M(2S^bGp#i;gXw$dMnldj?<#@(M}V0Ngn
zweRN_8*3nA;hr1&BYeER^$PC}7<Q1g$oXN({WIcFR+Rfbw(*LQv|rnDM6bGSeb~Mq
z;l$9c;slBAv59=akmU?<eQl51AKrCS8v94aAoTo`e>ZXL<`l8wQ;5eu!l5`1R`r`U
z^=EUA@Pq;Pk9|1iE9nZr=#c07mL-n`r8OGqO5Lk`s#~=$yi2^wml1zCmgZ0Sy?v@c
z)%`fsm6P$5Un-&En^3Ai;XS3=H`?UaGL1mV{V<Jx*gzin`9|seX~kmU{i)hFh+D7Z
z&?N~TW96q=YJbtahT1m{v1hK}pMnFq)F1I<hmF@Q(IJQBH=fUQ8vpbZO^uotMT6H^
zRid9=jklYMhZmY3!DD~Lw{V&t$z#ImPt=R=l&JYL*1CqfdAm>8)StyUmbY~GwfLV%
z`Ri)eZ;NkCn!d6VgUVN2=6l>!f0^c=@Qj$W3o}*Yqe~CfGuMJnZAqN=gnx5|*b?qv
z^(m3mX$1DbnEI1F;B5<XWebOYZaBCEjtSBoYKq!KgZAFC&*V`lOdi1sk-5rdmMB@_
zrKU4tu!tAOv@it<>~HBE&4~9Lj$M+<#vb+=+ZT}^XtzHDzIyyng~drT_gMQBYj+2Z
zGp>I4D0pZJfxR3Y=s1EILHF3&@}_1a@d#@^HwH~RMSH4|qQF>hG%y98WsX6ZrNw1;
z5`+EALXkt^Oy72<z<#j6Uu(6eYIDk~T%*3CPD@EmohvzTa|tg(72-0Hr7c8Ae&Wv_
z;v1;j_d6iX5mXDJ(k}5Nt+7RfOcmyJZLee|!e7n?_OGpX13l7RI2NFo@A#Lal;|o7
z+~Mxjlilim3N!kk;-TiYv5cjy<{uB&u*oo-X0FVWdadL7`j>Tya#H5ZK1Gu)9Dkyq
znyA-#ad!)f1dVf>Q7>&Y3SISBxQ~s*bh796H=J6VLsrq`4J5eQyVex3L}o_{Cz6Iu
z1A%c&dzOC^&{D)&<N?S071!5}KJkq8i^|E~o_0z^PK64v21uFMc?@7&>RA)Oh1AAI
zdr9Tv=4GJez(M`>=&kMo3u81;PiV(^fcVcFxuTuREL3DtHJTIIZc{e^Q(y}izmO>a
zAluO0LS85t3Ii%v*jmBW4<#U`yj_?AbSt#}NQbb7W1jIv%wxe&=4-X)lSx-|0L<?T
zTjEyAfuI=|pcy48dWbS_gY>xp0z$p6awFtRRqK!>a^I3J_`yXcL-AEc1E@<uCx(L{
z{q=d8JOzt{mBQ3DjTeDbcq(z$EPCs;vfN2Ddc4-Y)!Lt3Wuafx7WAU(dE0oFak4^*
z)K_+7P<tI{U%k&V0n4!QayiP3?YI47NsgOJp~NFad2#QL{Kfg(7J@^0fflH2cn>&O
zo-pyF&qsS#nZ2{?idT8z${5<HaOF7j(B(NN*B=CtkG2NCzhtAYMS6!@r)$>g1^!N1
z|KRPT1;h!%;?bvM1}rh9Q4++;NN}VZ(bh>xY&<C`A{((Q)9s8OiE?CI(KMqV4h6J?
z7Q3k8vBFQ@{T6ttkWw3N+&GL=dW?MZ<35LG?==7{C8Cov+SfG?^>&pEISZ%f8B#T@
zW&nz`q{OoarGA%jZfq_qi>8C`l=L;vU+|gkj4@+H9DgPdUh~+~Qa4P%y{&_-znkct
zflG!R%q~iBxIU=op4Ug8l^{w2S2o|2@E1zPy8iX&<X~$v`>_BhA0mDW94Pb}8%3d~
zmqFk!UBHHZHA-^2kFD1FJ&vKqOM3I3$y$N4i1fLwN|F3pv_5&K5dxJ{Ed!Sk>^#82
zTk&seTgzw(SN;Aidy`pVd?`H3YUG<wtt*PExW&xbIM3TX_Xmd=gk@2(iu*>><2@M-
zK^Oi0LtVlm6_RA|+&m}4UQ$#~6cJuQs`EJinc$4kJa0$(go1RCMfpB4aY99UxB*{p
zEAfbRHb-2nyc$%oVj;Zr$?ZvyG^YpU?ObbZCD7Noey(STj0FW1Mwl1s6puK2!U`Hf
zqqtpiXu@#Ke`3s(H^uvD6LgF}3_8EFjID{^YbK)8CC2HpWm|QpBlK!WpC-;HFKG%5
zPv%NgHanktH3=piN!0$pi@bzMD<!Ys14irvOIEIAETTGIR+ce`n~y7&TD=*n2fL9F
z)>_q1fJ+z7XYEZG7|eW+zYCHmuBQ0Y#F@3OBBJ!?`9!cM&}srjbw_eSqn+Ex?7<#r
zG)=jyt4$G0B<qI-FzOao8r4!w+Tjk567U*EX88;!Kw(U5K!(M_M4Sm-?DE(`$DI^C
zo;ziQw#N2$sjku5+A_kfv36!Nmg+Nkmhv-2q#RINAL?nNi1W1K@QU1yTbeCj#+$}!
zQJ}@r7YkTZ3P<Ks$_8YzsOTDty22(sI7MO8>tQGE!TnUVjZp!AkqUj<R!6slema?_
zm7AUr=^Bmo;B4>1`O`vM6xe@VCDgY@9vMzHn(CUe`|MA&b-CyTH|uPXunkJLM9+2!
z)r=<=cYha;F>BRIN|Qx`SIvQZsW2=1LlpZB(M#N5uOwe;&%o{K<J-cnzEM|5R3*3T
z%Kl<Yoa-~+Yci~aDWYowzc69IStUbIMqdfM{e&ZG0?k?gjN-sHsmIP5Q7&r;n*7?J
zd-UxSWNPq}YoM=b+^|g=%i74qp`|QP+0czuYtX`}HdVvP9zU@m38r5FSgER_O2TIs
zHfpztnz-2(j$tSvn_7DGj3;3)<}|aqgLf;N^b_IC7d)k*uuWUNEkoDF*De91wH?6g
z=-wOMaH1R7V{0ugv0@^A74(#X4^LziQ8-!!JcX3Cvaz0Vu(|aK5@9)=YedyiRWit#
zM$yIUjWCQ2JF`LR&L%eWmkOEqQ`qMXvljukcUj)6Wt}nN;dF--)DgQgQ0UuH=KUn?
zgwU*9j)|DmH?6ZK(mS&z(n9R{$wp=Q+I-b5juu-z0cNwJ88jDxV*ipRv$X}<t&9kc
z%=yWU_FnPJ!J){<uKr5tMMYL<j4S8FR=8VqSYmy~OqxgikQBd(?(m!B*GCPG)Dd#e
zr3j1Yp(>71ffxOZ{Z1HbYtm7quC0>(@+ia@MNSJ9?t6kr^=S4<D7MKOHdWKBEi|ka
zK(l%d*BeZ*sU`T;iF5113L54we^|GMZYv2U_I;@N*HXi;k`|$1Ev94aDHXhtEL`5$
za!DLcQVy;d9)lGU$-||08Z$S+@$-Gvr3CEQrDK33KQ~g9ayt`8214TlbQbq9dpLGi
zZbF?|7?o6N21b!-lq$&@CHgP~RG{ZITo4lQT`{=mqy}ESb&+M>_DWxsf)CX-#EDW~
zH4=J7%s#qOKG&h=Y<2Zp+c85BqHI)rk*B~lT#p)w*a0w{MI~y6X%eDia$Uk5&#e2>
z(HFXl<0I)AXC7+2p!V%%8BZOs7?Qr0B~Nj}r+w?jB9;y4#PJF5t&Sv7s)=kIiuBtu
zPGDP;v}Wy!w=QX<09g<1@8Ht3-Nv*z@MLDNR?G@Mp~f*`XVynW9f7Vu9<wjwcoSYV
zCHX9?mFu;4O&|5XD3S@G@Ebcjxh&^GCHLSjH6~8VkIdpsjL~=Z{edP)bZ4nUhN^=t
zu#xcq|HPtOPv&L9it!HFpT)s6b1MmACdR65#N3#Mi+WF(IiEBP{jm*BlY)!-;HK^i
zPR5dbwX%Qea$6CFX1=x<=UzQ}HBBLQYNBe5q|V|DZF!n_CJ}#sG%V=Ltaxd~LcvE<
z!Hzk1S(8DXN_c@_3OgDc3y5P>iZ1^EDJFeyEa*y#Nx;ZfaXoMn@cWYmK$DY2U1nnz
znQ4jC%F2*iGmWFVN#-RVpU+wtj)nvT<M`yn%ngu|b>m!`$6H@PKeM8H*8~_$YoeF2
z{#J-&edhHUq;MQf*Q}OPwJcI5g0Q&vO6{0&tsF5!ePCtIm;YUWF0N1;p_DTqZ?YG8
zDKhbAA?PpE&g!ONZoH=YA*_-j;prZTQf(xTlXpF5!DhU!mSp0vj%jvy2MqH!qS(ZI
zND+2wwf%3sXn!~y8=lRlg9GCh(%p`0xO4`wrXERL+R^^xCs(_wG4~<^^k_giAbhhj
zEy+MvIvIJC<!YoKuAcUJ2$!LB!GgIcD`>hw_>+k41JG$%Ag!B0*5Sy82~K5a<j;2}
z%phu<z)-MPu8t}*vIJ&h5TYr~gv+)IEOU;|9%!n41sD5U_HKz%l+5FNd$jdeQjohG
z9qP25F?cZLMK&%qv?DoT9J!dIT?-_Wl^Z=g$D8(7DY&=Vo*OzV2U?v?T|8?n^+L6B
zG0iQ;-qlGMNcwktLDuJNtXv{9xVWD6n$rNpqm$8NQz`gjeUMr5HTd_txPOOf@lOsi
z`1gThMV(<twPjQ^PNJg8Ak;@$keqw$@4@ekmSO8I^XZjS42KadeXw28#96xugIsrS
zUBnB<j>Y2yg~J6qDhQ*AlS8&=_K(`JK2!f9NT*>vu=N^fh)0X`??}F`sKZ89lc^2$
z8_MLyB$ydq^+@jQiuI6u)gGY&L008O(Y&5a)p7&SQcMOHn)j<|z%h;vt>S`uaaPo7
zk(h}=;=K7gaQz@3oeNtyvtcG<Lpo!#3elGpW4gt*ur&#lqSE}5DAcgfGtw5u6AzRo
zKjUCTY(}hc#=>EdkHXG0*pouc%EWX5MYHiHUav$vV_t*x_FabyTxks1Mx3<vIb!&t
zveC=AnoIQweN|DpUW-3+|I?_(U29Uo`8u|Q+y}}7+{`!F$z@syZ<e*Oa2=KcK^o64
zm0%UFDsQLv&&Feb6r%9)82ErToYvD>JB4M)#^XULBuxrSxwJI7ND^8}T}>(Ytg&$u
zFCRdd0-mcH)oSv|qy$Q~Tj_Avu6oGap0}WZ_o+2t=|DnfC*?i1z#~3y)xxkw6B`bj
zA=Ta%^s&i)qCUitN<ZqShTT9$(_i~a#yQ^_bK@!HOajqcUq|$hTAsh0%N0RoR*dt~
z?}4SC4~dI2wa=j+jVmf9k)(DETe;0lVQryxO44|`Q)q|jPUv+z?-Fxq{9f;ie*GdJ
z(yp`|#SYd{cnb%PET%|5F&9;!_tqGHz0WcySEH)avXpT7`U)~>@p!4nfT1Y;zyv=c
zYcg}lA`V5%<QPdkNKW$A8I!K^wfyO7o2mt`%oQsB2j-AC(e@*GRWncnJz0@qli1Ve
z?G(_l=}xEG^%nzwS^gm!(bJ$G9GR#;_*B(jmu?yvpAX=N<$^R)bqWH1fu)9z|JnW+
z&wu~@9ROUp<bOp3{z&uI4$5qFX7Rly+0R3kmwTJf>qKeseA$Q!pE59kJWoNv@^Egx
zh!zialeQoy&|IW0LqvTUrMHHQS)7K1Dza8mJ6iv&)SwN2bO-w=6iR)*2+rr79b<aN
zfq!J#Be0)MM}U|sc;TbwGZAlF{cwq3p`4E=ByGV`;`pwVrcuPf8k`hDK3Gn^vp@P#
zn?k9(WkFuqe%Bla;X2ZRI>Smj%fG#FG(>78ck!JGJQF3%pG>l@FlY#5_b$SM+`*S>
z+9mB@P}n}JHCyOt>aF4;(_8t_H4;t4)x2cl199bs&Ui^8iahT6b;rND;~(=wEs`5L
zHY`h%KT<%)5U<4H7Gr;Hxei^qz7liF@Ix{M;&-1;&a4#ROBIX*<QSNoJ3#?#LU}IG
zOh5Q+>h4^l7j;byeXY{K$5yBpc5QX{mH<JsBeLHv+WzRxhdT~@<?3JGK0S-GY}s4K
zv`?dzsy}b?@bu2wCRkrB_lkphb8cIx&&YB)`p&sv*SD)*RZqF7*Q3w)>+<-7n^xAB
zR?e5d4d#;78)`tiG}~-j0d#*v-9)*Xy08^x`|%{;dKEx3va>8;2T8Rwm0MugEB7Pj
z0(-4b_#0o<6I4Tc804hJ*YKTAYcEEEZto@l?8aDu3BnKbc{zmZFGEA;hP~oWT+5E3
z$4%hlPJxmF1o~ISL<z}sFX;OXM7YjX*nikz9GE_kS7Cv7=rRR_eh`kMn72p<VX~ft
z5Ch>%VEjVFZv^7Z(CyjKhnfhord~|gnY^jsM(j4L)V6HYc+kS-_>~W?gGAG50BuD8
z_wOOClaOQ~h<ExIqV1&R9r$1ye32f#gmq|<ojiFgjPX6eg8;h$)Ga6kcLX@oY*$%g
z)MZoMKqfO(ih1Ir*zg3;<OH~Z<AB_FNrr*L9wZikSj3evz7jz6NQ@N)zjP}&1<o1s
zI&9ww?#mL{o!tJ2M$$rqv<%ATm&LAilH%pl709~1qf%}^?tP{E9<yR@ETvE@K4RQO
zpeK@QJOG}wVs7-I(EG?9OUiA~o~pom#U2Zt(uCLY)$5mi5q=W@18bx$D0&AZ^h%vG
zZwDe7aP2ARF@WbzIb-25Xzb20r(5lkFPZB=pbA{=c(@s^Xx?xUa!A8Xgf9TORGzKL
zx!KIuc44S^`#`+%X-74_MI3$|!i!dcT!TtH7iUBmWh@;;Ls}N|>Ke+u!Eaj|9~k#b
z=mYhP`1f^;Jk|E!U3;UqLqn4f;$-}hU3e<cu}27AnoWtwEf+$(b$Ao&?m@jRZ~{mI
z-^6azs7B|Q(IV8in;@r;9RgL9_)es_c>j^6?s6gX@PznzVPqcy@NaO=$leg7(~-3t
z^Lu-&qB9RHu61}+$4ON8OWCW_4OoH0h6$R^dXlgD!iHX8k&SH5rpVmvAe~Hg``*~v
z2f)1C0&)iveeD7}OYOxILDDz>b58uy4z61o`V%CeE5S}alzTer-9+>Y`dPPxHX6Nk
zC+gkBRu2V~ZxC!&iu*8f>)f+u{FBmjS;KS2e{fgE#GO2nvpcoJA)&*e@s!2g3+4bq
zJMsfTN236yT##=e>ODW=UE->fhWr9qeT5Iu#m#nsjIp8{FhhRTNpT{o{BS;Er>U@+
zHbYq#6k9Gtp)kH{v*FgOj@N`sp`|f1g5KP4ipkv9CFjYbbT;(BIca?E$v!t3$eI`3
zyI#)gn;r`7i_~Us$WitWmr_f3MdK&Vesh7NIwMNNDowguYlnn(CqTbVgd_rdTxR4j
z4zQNtJvn5>M|rs>18^_n!d&$u_^zRwW87Bx6uZDnBx+)A1BQA#^qHUSBbgf(wsXUd
z;3a1BlS<ykv=1F??*Pr{*UkLVx#1YVcJRKZd|>SJM!K`fp<x#(wFyELGt6r3su7C~
z42yD}h{9Stj}HU^EWA}#_yyiC1CP=!=h%2vQI<iw;tw1T$m%48JK3$E=7eFg<2iha
z`rWAJ9*V9kAN&hZ2m_Vm%8)tgu1F_s!<x49^oia3E868fm^4_fLS~UiDLKxRs`M<k
z+~lI$z{5~guqUaK&^z+lcHboRadrVJ_q(v5jiNQI{h(I>q5#g|wIVX$d<dHSI2LwP
zJYS5XJ1(ZAbP?uyK@n|el{YJ<WX6y;U*whB(T1G$A(%cm^}Az71_R)9M?&4%%RLBv
z#1}^a+e7$<_<U%EdkoLW`aljZq}@Y{!EjzM|9zYNn@`&>Ci~d)0OX)Y7oV>Emdzdp
z%?0SyH4$D&mRE}3yLKl%#=OE&sCf4ApI9p^Fb;0Ds;WEC<vOSOP+xE6zyDsJY(sNm
zk|JZBJySuu*qD{4zzmWz1sGJ3b_|O$K_e%C9e47v(*|jeQkM@ogTw7>TxkAfZA>9S
zz+HQ@kIzDpshzDX5q5*`cx}b{upM0(LOTDRfJGlCybKGa!iuiiCO``tB}a+sP%n{L
z#=y!vE3jFl_L<;ejP$X%IfOX7o-B|lF0dF8>NdiTqi0MU6(!fW<M+eNxtdiQO9$kz
z>&da?wq@i2a@keU@RFjPQ+uiS9D&ri?Q-|FY8vA5D0jkQDDmD|Cx+~HLxQ}1nclf$
zO|=VB_k*9@>J&!)L9n>vF(mCrojdgyH2bvgNc;oYe*3Y%4(N{-fQr8lPvHBfAZ4FJ
z?mCu{ZaBh<6tKN%D;0git7q`DvL7M}a}_m6yuzeu8@uyxnpl<2Ap|bUiiIwM#5b)d
zSzCv_R5{Ws<XchaN~RjSP_;J;nLGbns>V)~V7}tuZ!c5c#^q@^i3{czp4B)AT*&7r
zZ(Bk#<pX^~;Vj}?qIe8B;ei6}f+xQbu;zH)_TaL8Drrs;id_5QX}|hGJ%Ba@5{AIO
zp*nK;qtqQL461*#ZjT}kf_^ex?adG9f74liJlvA_1MBbC7mW487(8&?0{u06$t)re
zdLy&T4L+F)lv?a%%5x6hGZF;d!YTfyE6E{|keGlX9A3;7ea1X@-;4&?q(F)7Az;7%
zQ+)jnC4Z1#nBg1O{YE--Vn8Aa+5M+v4@5WL)vu6JdJs(+xx~<z1l$Jx``qc0n=VRO
z<uD}z&mmDoT5jG$avsr=!)H&G)!qd>d>On;%)5jA9GhTzm1;&{>tGZ-?a@25k$>{0
z5=!>@M8$c$+wgby-#dt<8TcYJsjUeA(+Fxnra#nQZ0XjzNsmFfN4}MnF1aHG%e79_
zV_h#;G{hYcd$fD7S7Pp-7Ug^=q&b`Lmf0XTL9W4k7S*ahFqGItPfiJolbjGwLxn_f
zJ-S|I)cY4&n?AS#e}GThNq=$g2laS1v;sLNU}_m+ei7@KiquU2mrsNi8Ux89ff{9D
zh0Nf`NHD?8VGJ7;Qw8)I!|~GaIwBb%M3Z=`p$+pKc)kk81jmnpJ=2cJ1QLp&^qV7Q
zkKf@tXN(-;#6X(1>6MF<bNCTg3rAwdQRArXW)u@fh&oWX7X^xq<6O=QHRRA|93^-X
zlIQ}wawHI`!@DcT0-LQ4j3ix9SH$Eit3V-0G}++^A!6^9@j5!Hs2DI{i7~a5;FBtZ
zW(~lyG~vERu_w~Zm^A6am5kA2klmQnSB9a75KD`&PokR*11*Eij6qo=V;jVCK#iOj
zYA`Ve%p0-mP|^$1?BgMfY+1TUjfZs5G?D^v7ypo>9~m>&qVw#rM42*hkYr9jN}jMh
zYVqvBT=XxU^$XwhgW#{LrRooJbR$>b*42^s=sCh8==lKERns_s7NOSNgyC98ckPMm
zvGeSw<16aycXXl%P^v4%38zDAs$t*{rQo4An8Cs^ud219UzcSSS*v#yd-srAOUb^3
zmA5`2uh5~h56<sXBv+OjyF(q|G(_46p`Y1^@}xxT6e?{;&UC@9MRpq{0}uo-Uk2Zb
zKr`J1bSVe|Y(|3}ivbWGQ3i!Qd~p595!rl0?in$75w>LW--;aD$}+g)#}1>h9)otN
zJB~iJ>pS2cd(SslA>BQ3-8}mQr0PBGqGR`cD5I5lAoZxZW{|;jPY8~#!(XlT<xAj*
ziW7i-T!NA^mA^sZ6(-t|cw6uFaH#IpjZXJ9Iy^)_XFx}koSw{u4q<lQzqvlSBc-~P
zmbw)0o`)nG5y@+Ddk&bf7zx6qj0L2(fK9iBH0kn!Anr(5qb&?uJuw&tZ>C2d97{cc
z|6-<0+{7H~L~6yf%^Lsc53kjwaJ@TLSAN2`xnF7!sW14_Qk9<S*(yY3hxn4Ntp}Iy
zU?mzUTx5gYL8hc34ifW=n=8uqaXdW*u$?032h;Tp<o%}hIBrOKx3G0<mQX2l*Hrp}
zSMm?$iyvL894;FML{v1lV`b%Jrp%d+@iJSL7NZi>4Zu5CC`PtjAwyg%h7s~$jasXL
z1vWK309}#L?|^qBKJ{FV<;|gNP!s<3%3Q!a2MrUrI`dj_?v1Qzma6bi3Xqiw8cYHK
zPlE4Bf}xbLVv>;#x26V7lm0SHO@WS8MzBrDiP(2)`?I~G`Vhnzk0;)+6b-Q~xjGqb
zYG|NQ>fv*5B{eLRsJmb=HI7cLz=t%fo{+%9%{z8N7fuvAwl<iOc};M1uqzL+;DVV1
zJx{{)$&+-Vz7!(9Zj;A~1|x{)Q)numfsSs>H!c<CV?!_XB3Q2F=JQ%S>x|0yIWv!&
zdo1Q0Gct88fhLlo1RAUExJD&b$O3zN<<q8Fob=w*EuD;+pfCzc*sl{~PE;?7^BAtv
z?(+OyGnEqm;aa%ZF2k`gLaY0JC$^?0<Frb>ppXR<T*87yEEh~-1(8EFD_S9P<yeKA
zgh$IrlXyXM<wemdece8^PV{*Wc%bu{3(1e0p+Lrt3;C;%<RN|b;?uL{IGd1EN|kL9
zAfk;hT!PMd|Id9A^(>=yLB%G2|3EzFDE)}_{Q<(O5dAy3dp&9FnXrjQ$cvm_j+~Mw
z<+rB{S|Sz8q-Y&Rykw0<(^^E36FL(`bQCR-kX5^u>mXQJ2)meWjEa$g8nvjw?*-LV
zA<UA0umJ4Evv*!`CxE7a#J%5;ihN2!Iv0$04nk(xEWa>K@eL_EmuI$jQ-3Jo&QIzX
zcsvo-6e5-vYaTO?ZU6cP2-*$473L}NK^%b1y)`byq;wmSnIz-)0Yix|#*^;?lj=cp
zE~Ooy)`M0lsWvQgWmA=2A0j#TwoLVdwz^8q7&w-&yV}cj>`RSqFPhm6+xurE%ii)n
zNI{8YJ<u~qb)lM+uA6+yyAoI@Jt$UEwmu~M6*=HhTp$<-_D9n26X}nk@O3LIiFY>v
zqB&b)E*?7ULnQajK1HI*eUsY3=QD`rbh6)uEBHt&kx-;^FZ$X5*Fw3dYJr3>^kxy=
z43Fl6DJ~gz8gnR0kI0~QnGht~l55j&9iG<gS3a+!;U2Lslf6`nvo8pE{9@yc6C)VE
z6n_d+>XlN1)DbD@ADkTnil#C&H{pwGuOO$8UTMVKH81eNy2lQSH$wT1Eng-&IXc|n
zgV$dwl}&!)M5APi23<HbYL8iV(GE*qHGUT-G}Y}bCgt3?c&A@;_{De2Q+)Hn-OGoG
zoYZ;Em(3f8SP||xORqFK!pgjuXH!0+!_hvSYh9<u(LsJb=lXjmv(pNitc=-$JF#$d
zZN28wrg!a+twi?k=<z$q+zfyJ8z*1Ozsh_e&;f^}_-R?Wx6JbIBY3kF7q2gw73kyR
zc2hTdqP%aE3+4Qgl;3E1ugjhX;RB(SqgdzIoci7v@V71%r1K(~k0dEFjDsNOW)-RW
zfvHQ?ij=(&*(K}yEa&hY+TN)4DZ4@0rS1Ff=j{!0-jME6H^S|Y1iZw(i1X6@!Rw`e
zhIy7CZ!;euU#lOHKSka%0w1B9rSe(2AF*Ae^P54=|1s$Ai7_dICaEP2+onegcDZ+0
z+Vnp2)g^-slyip~rS~v!Bz}^w++5nPU_G+0WIgJyiMsUfQTs%1zz$18xGC=6`&vNi
z3wW7#4o>PC)%*@~n!j~Rtl^m9u7wiPG%?wOQai0PcSRFKrZWUw(#N197b>qaMojw0
zFxm$2uVY))pY{z0IqwU(e#fB%cPe(Psz>oir%P-T|9T#p7ty$M3^_m7MZI!fBr-1~
z%O+Ik<G}<<MBsK_w6UpSr%?|;_es=gHbOT_<d3e$3>U%jb%xflSiGX}ikOzAfrHw?
zvy_LTGdbYcYr!B7G58n<i-a-6*9$o&2~#Ar2W`@e5d+SS`Hz(bHs-N+h}G39j)c5S
z6zQr6pMhd1`yniXj`wbK8TsP+kigh-r~GSEarxE(&=GgT<ddf+{9Xd?AT`G@)SK+>
zRJBnR9#Fol!qUw+n1xD;-N`Sb&}`pl(IW|`REZ3mWpDkNE#^~?&q~mL2T>q^efH-;
z9EpmXici6hJ`C_|EYEB%q3a}^*@-UMg$3U5Cek<trS3ZwDO9kUSx$6O4!=O6JrXCk
zz8TzdR1NQR?n{ZL(~ahDRJ@B5!#I{=-~O2bd<4USIz5TL<j(grM+a<7s(ly|{D%Gk
zXTK5}{o(@W9VJ5`^n#A*W&3~|x1p?9$X5x=X8ww6ade~W5SIF}<C^VUU3X}8dHisC
zm)Jru$ZS0MFzX<tKKA2)$jeXMwO7C;uKAl-n|%{ckfA2VTUf>T;;yexn~>;ImwCc#
zkT1gLGmL!~n!YzHI(}OqyJhLi#4*TwxhDRNpHYLx?c{LQ%~-fZAj8eY>57qm?Y93$
zCg$pl$2?y*=E&?L+TcFN6u94^GI|j#^kv)({V*(wq3-_#N|{C+@_i%LBykA-bz~qU
z_{|n_6mHb}38hPR6R>rZdz;V$>ps=JFXe^EOL-HlaU`)%pJ^PZU@Xlt^Jx`*fRTHf
zOAecqzh)%B*4Ym$Mu~6ZuyP@#5{A%;+td?x<Mt!Y^JX)HqAgo+Na*D5kBnPI)5P*I
zDvD5Ud<0ZKH$l84O$NBVR9IfnZQ)>LX&<4WsOqd*HurqULnx=$VC(V9`Zdc5SO1G1
zdfXh{%0F`9b78kRZQ)apcwGOL5~W<(@RoGB99Q*Obs1Ax%h+QR+GPGzzkEk{HG8*Y
zc_n}Q$l{JQU&P>n7jA%C!4FyPN`^_u58I?zW5K=$#^re3F!Pg}b=qM-`%R8h;~QR=
z@&{w{*kcdjP0v%)5Ak{OW*GJUW{=IbpWYveaDs5q;(q+L^%ENPzFan0z=Z4m)V4)-
z{w@Dp0JdQHdx=vBaPf+%J=&x#`|_=4Mj=g}v_%bn9zsyQf*reZW{Czf_*k4NVsNqu
z$VpmWlhR`2cx~p36kyE!Bv$lMVn>zFUf!K7iOc(AA~R=B^|AVDHf>&Ymzp+v^@wf(
zK${Td!UGbX1eL>v>6~JkPzf8BBqyYxAvMfmL8(en+Ea-OW}C7ERCMf<jDoIH>04?<
zAx&dm#hXujFu|~XEnSd$=u^tnFO4Q}85>(p7$^t8{GouT_={F}Cdr3J?n_>^r4oWn
zx%|kWK;Yb1Y!Q!aH`L>qk(rGV%k0x;7?Wu(SxPOkw<IPhks%MY3|+_<g%ms&mlqs@
zD)tCB^cFn$<}c3mQ%oFxf}A62KvrZ9we`?R(0p;mCR~sF{>a%oZ`fgvHTBi0Je14-
z_VTGq{hSa$#|?$pHvA<22E;3Qzc|SvZM#!rV8=0CGduKa_QLq9I|KB*nK+bgOR=|?
zE*z^nrO#PTdjm)o9w12K0*PyilV*D&iazuu@oSKZV>{Q@G4f;u;pxiRdgWIM*>I-O
zl0T(60zRM0p}r|0S}{;+P?2mP+%Xzfi7a@$G6W^fvSAntK1~XCgJdQ+ZOX<%Q4S2U
z83T+GxNe>5P^>iicGXPqN9wX+cN5UF(GRd0F>f(lP<ra<ZJRQz0gcR_jv4i5Mb4n@
zlyh2TjiHw`DUXnq@vjtf^}?LVs?=56$fcnm=>R*$Alv4psXFC3W1Uo_OVyz(C-R{@
z<xN2Il=gF$GyA_2S^gD<XTm>x>Q~wmo`tvGJtx=0(_^$lK+Egtk^~Nqd{KU|1NSxa
z%2RI@!kB{o$HG`OwqYR0#z!OMP<Luq(0jDH;K6h!(fJ}P)fkjstHV$M_Nnlr+$V~N
z62U?^pBRvbLWNXpL&8l@UFN^@J#ZJSiY3g3|GAG8=h76|(q*vN7otWvIPaAr+p|rD
zWPWD3ww{pNQUeuMmlZZfkt7tG&UR#Jb=`X;<w?<DH2tEjhEwLG4JD0<8#Mt(@brr{
z{~KrLz+KtjZRyyyZL^Y`sAAi$*tRRSZJ$^b+qRulTuCanJMVk@j=rPE=>NF4zropS
zt$p@y@A<4b<-d*pinMxr8YmanAfK07i`%df@w66X3xJ?TC(v6STOBtms^|6Nz@L2&
zbmBRn*XYGLly0=r5Gr@#lvSz;(HeJUF?fb#P^<}48%LbY--H1@q|&V2M8Kv$cWC+r
z8RAU;SJf`a?$FIcxD6cgRvu%rLsRh3?%VgautR!6n`kF!{7M_+!|~cx%W=16$+bRp
zI^Kjp!BQA74{G{G2vF%#Bx@*8hZNfAlr0-sTWsfr!`1J6k_u{b@m-S>eK9u@pwp6k
zv*`kHoWkBoT>$S`<~;!4G+_%NHeRsF!I`~t{ZE56=!zQ}>2u?<j#tC<8;W12B!HjP
z`La9+&dKKAOFm12uhrr9rxaIrx4~_^#kgR+d=uKgZ`az#<py}}EkE6?GDm;uH1<>{
zQsBKL_2|>3JJ9%ou~TOI9jn1PEWJ0c6dp*s24V>2WSIWoFRl+<f6cw}r*>6ojH!R3
zryBC3W`F*Bt&sZUs4a{h1O(RLp9o*Te;=n7b8@nG`WHuSYWJTDy}q&aNT5O}p`W|l
z@<ns>N}JyRoJ*8&g$8M3Z4>KB^_v~E|1#2Ok)#>qNb<RTe?E5W(FGm+6Y?iC9EK5#
zHiQM2GDN`Iv~g;2T*|It4O{E7xaw~C%BGVvI0Z`wKe#V0ovTpIGcg&v&9MK<RrB`a
zN8^5*z3feq@dVl{x1qK)u+dd~@tU@yrRu{3_FduGNyp)I9YPq~4-d2;0;J3x{ycLr
z&O3G*{9lN9(l1t$s;?`C{zvMW<G){%f3NdVu>R-Lft~`o(AUOgE#nznNMt@#wPqv9
z$#8IR7@k2mUXr-n`jbF)QhRHTtyw9Ge`;A7-_@TW!AJ))9TlmUUMgPa%eKet4j%7M
z{p=iY3!{y&uv0KQ!=(}1s%Om+!nEyshnWFiWMl~G8FIokY_R9y2k3x)p&KPwh9>gr
z?btAW)AnE3=(KdkXykPZ7R2M^xWmfG{jr=0M2#OJ?Rm0Je{mQ~j|gRo)=29BVMl;B
zdA4u9_jFF|%hVw?c(F#7OV&xz5^@sobs#$;jJ+Z@ULF|vv5{fbAaU0e-@&uMrUns&
z%WZA?Ig;vCG8|&9-ZMZT0=cy5olzz@)XKk`K15u4g;m%?KGc-I%(pGXDp%5Yh?U=l
z{Eq*a|Ng>KPb%I2SgaFC!(#)hdfa<wfACB5v(lg`y~mQ{B=vnpkNkDIe|Qsg`qYQ5
zxvXHY1ck;~<i_WOz5ze_o5unMhP$7zkC++qj55^6o+o<L!m{rHo6|i+TWRU&<wroz
z#1lpct|KI5?hf}kuascA3bss{tk@~W*fmpL{vS~@S-}DSB+p@s49D2NF;)E`A>QL@
z|C)*j$sGO0uZcMN$JI`@|KU{pZy;V9)<<=z?X%mNI%Dhrt)Bv-AMpJrO9lnluMppq
z?^qN<Ff`n<c8LilRMWEG8>_V|U3aX-Y)YaIEt|v`K&5rgD?^r>-IR26d|hpuCK_s^
zw5^vOKQFo(%w~(<Q+DE<FZqvocb*>(Wr_SR&vwWP@myQ7E_UOSm>q7IxM(ljl7{&q
zIYI`QVq35OrtAuH`34lp$F`Nn7yTkgD^LjCV*8u0ONRR}?of}AHhP7MD^QW}SpR<W
zz>3S{dTnagoh`^jtTB28``oF#T|-w~dqsVCZiQ{Ie_(z1bY{}3ABu0%s+4Mv)|+*B
zi}l>OG}MB5bN)t4y|W9%i^aMreU{f+J3i=uu<1c?=Y3|k%N$U8eyZx+BDaS&dC~<H
z5WL)DZas1QD6HC|A4oIdrg8qH9Pnk^ygXp$eFo*KZf4=9u{UtM);RPWm8)!(01_we
z)*&FnQyMs5qhde8cNZ}UP$3YwU$2<Xz;Z!8;|IQEF@2;)5huvSjbGW~er!zb?2ec`
z)nqB$&?=2Qin{K&-|T~3fv<gvc)lid^6wrHcRW!ueU!_-PYx--ot9?5HD>j1?jPiJ
zl&AUc9+>OC$zXp<=jUR!=O*p?n>;lk%uMvd-#io|FppjRn(QL8?@8Egxp}UL`ua(i
z2ltOmA3;%{G%}y`17~c{)YPAOSv7~mfae*z_S{dh0fU@3F6^G&JubbsRG8gMu$N|<
z3u3m;eW2Ex0`9i!wKtQWfj+SdtrKl1cZw68TrN`Dco2hXw+heJcnMtg__=b3d`ZVi
zJ{}c`m>s7sCU_U#t}2mdDz{oWp9EF~oAd7u_$MdM@e=V4wKlwcVAi6hg=9?9`+km9
zU{-8j#iD4p%BmNN{rH)3lCG5#=~gAMRW;;y7Tmtd!a?iFZy~kzMTE4QvDjQ;wUReB
zRbI6inI$9T9MS>Vw9G^02E9|+=gfU&XHrDYnewBK6WUldp8f!$ps@u9p&#z~&AccV
zRkjflBD>QevXG8Nr7gTDTt>13j6b_Q$~u}^XQR|46!Nj*b0HLi91~FW)(FE5okZ~f
z&Tv<U=i(CiwY=Mz;M=${qI;FX`K6M7EMu}UWA5(v2!6LvoensXucN}?9ToE~uUL!9
zkpMG8B^w*Qp~SjNSQ}HF!zS9OqfuvG<qr}{lMKuaSw?dP8#z|R$=!5~|A7gKd3dR7
zbCoN@FWjq^rSxSbU!S*z5FsQj@^$8b@JYAja(kduu)c_Td>G0Q4<WBK>82zKAJ*AR
z(2pu($Y{oK`bCX0vNzq`T0aNVg0DmlSJyAk(@BbEktQ-tfY!3i^ux_Hh>M&7=LiXF
z;M9Tx&9?3lRAQ}S$vV~E%3`bDYk&ACh8OQtM_YrddV92(i?iiIbD^``aw#@d9f%vm
z55g@W5ffX6dd7C&!8@x*Y{wdy;K2KI<P{F{fNHR23gM1>UMXC!m#zn$<N6()z5{G-
zY4=AlAxs7q<WM4=gF}d?gV<3YrctDCfP9gW8WMeQdCOnKk&b8&n$bp|y0X+T-i{c|
zIgs#)VGXNYly~)DGE7+bF#`;^usxY{pazmlYXCd@bU;>hbR)hIJ<A}lJ2ywXk+V+a
zufs>aB7%cx9}nAzdPd%ttCb3jv`w#Kv0IU$cKYNpa{BuUgPemJ!eB~Nd^IuBL+ygY
zy+7RZELduJy*#=3Z-(;h1oA}y=$6Uw{e1MjiHZ9#8py!aaw3+jxjIq~w*m~icpPdh
zbrFZk)+`F8dnQhptC_N^_+h@WG}|cn(6Few<H)>#bdVDG&y0=q3Ml_!;i&!>2L>V-
z=$IoUV60F>*2GMhL!I}%m{1WHQDktz$50!AC(J0G{Mpr*s33-mQAs6g;g<=9IWSmd
zkuc)#>6zSEI|mJ^ud&%5^LaY4XD_ZqbvU;LOUqz`nm=cMzGvDfh!&8d@RGl$bIwW5
zz&)9fY@2RKeI0=YZc<YbCv;W{$v}(~--pa0IO?Zv3Um$GOE+TVZucN6Ahdx;eTTuM
zb(&Uqv=t~-H~~a5lCllTj*PaPLQY3jjGCf&IuIF_EflHN&1G9vS@U<cayA?Q!<O=s
z91%Ig2ibSU;JU}1>q-CHzm8Zt_vtW@BG)z_VuCTC<z(yCloKdWX=~2fs}?^tF`6CC
zv@NB8%Bk*QVBsVs1*!=f>zI*ipj_r5b)4+T8Lz@<5sHG8b0os|P=%}m;v9x8sEDqA
z<w74{L@QucNhir20TLwNua6@RHJwzKW#VauwZ)Z9wOK60kY(?Oa=>S&h<yY`nUW=>
zl&5}5V*D&g;h9KR$|>Eb<2$TeUi=OI6A`&2Ap4L94_?94tqNO8)G*>VMJC8(q`li#
zQl`bWX8>w+miJIDG{Ima2lPUzxe*AML%clzZqjo6M8sCxTKh*vds~qa3az}PLY?g+
zv>Ty8V!8l*7jza^<NB~&|3NyK6rkC<>d8IPy>RkmYG`|wuC;)ON7h5K@^1Na!>2e>
z5XdKz9WnOUC&Z!!Nx8+vzdnX3YTB-+dG6XahaQ;+#C2D-!<5~AkW_&XlSP}>)klv2
z7CvzIB|dSWmIScb;tO}<W>UlZ8nYwE-I-;dM@pd8lJ_apASBqk0%cVMi>;(M(3u*S
z-BwQRBJRY3LS2#B0AXa-CLJ}WIA_}oswiifk_N5(<vbK&7?LW35P^?c-;E&JwMRn$
z?@3yvJqymV&ZM<?D*BumHx*KM2b^u|-Z>j<D0~zHqO0QLEXz<vdf}h|evzKV6Ad;#
znVFM2>z5FD=6M-Fmu&5yJN%bw`P#87|2yg&{j}ZMJFcAVe6C$oCt@Yz)%!RV#`z_q
zn%NUZp&Mres|f9ih1=em)bc~XyGX0n)9$8EFJh2C4HA_PuPf287+}U+?ii9!sq_=H
z$SOp;+!?;*^iJZ%0LZ!<zS3!b<Cdi~kp=TpyhEjW-ZM%&rYt>i=f;AgPD43QrFw2j
z%c@$Qd6qfj=uPIM_SS)E`I%sQlEXJ1$AxI7$dzcwlr7!f*hP(5^dM^`n6q7b#Mz}O
zm%rWWCyZ*5)x286dVXbtXF<)k3M}9ltxnbD#Ww)>)<jW`uX1@Yu8mgnh~|6Pv>i@`
zm0H&K<`#OCTj9u~wNwUdFA+lw<^nhSz%W4VG;e(v^><W0$l?AZp>OXQAN`_rWg*)?
zAe7r^E)a)0+W}$l2}SBq{R{j0#myLGRkm13Oo4HDoUGtY8YD<70sYu#R#EXwRNfMS
zWbk_2P3{16g)sTuAG$*eF1h2F@=a<Q8;fo200mq33c_}PL0^fxQ$S6imA5byxEFIy
zsdEVd{MpS7g<cc97UfuKA&*@2ey=1q+9OoQmt~z;tcOw#HpdcNq$LgbE>1fehW4lu
ztSFk#{0ln7{el}~zBnnGIt9qLkb<ObNe;V4YOfTILaL<=02*7T5C=y9$>e;NgLQ$8
z@+?^=eI5RMWkxQkTw7V}37;~8QkbM#+N!o>a7S?3sSni5;u54!ZjD=nUAx%3U(K=_
zvRheQ?{gazD3{d(7_S>kIU%o0?u79Vl!q};+6|#G3wypjvHZr!3zrUM)TPQwc*9kP
zXjWnj8Z<-Ta)okLt1`dj6{7M%7MXZ<tfP|fO2!&4=1gJtRgHs*0?u<$6&K!G#LW&p
zA(-Mu0+bKjRy7?{^D3}X;CdX>s-@<kEXt)xLyv+oACVV{b{z#d%G=n2%!tstYwXpB
zA#K^yTbLEy`v#AALBP448U@)+NEdXY$#@$EW7V`+i?lOFKjn&#kKX^}E>;$M%teky
z*_hH)Pp^te2sBX-nRiLT<zDH&9vRKzBGSKtu{a%DOiuS{6p?HH4%5YePZ@auX2ce+
zpjgKB1^j)!oM~a{@N^$gyMK=|{yWMc2fr27EM195W^eUCRpZYo`l&PwY0@m9Rz<I*
zQX!IFH-@FOX4e+*9_uGa0$K!cuCR7>&C!OxGzk8badGWx?b24I4`8EV*vzlQUy^HY
z*V+mU39<Xr4i*{BC@bDIl=Pm2+H1G8WV;96QmJ5SL8XMpW0F>Lp_sS4lw(C4TRHfN
zD=TlWw`FumR(#n(VP++h+B(GW$i9R?nWHu-TB1aZw9(S290TAbQ>sKv^Bxl?#|k1h
zMQg#<YL@UjXWhduL_LUo(ubj2#f}k9s4gHXVqM%KjLew221Fml$>3^0x>2VVap7}A
zLU7Ymw!D&Dv45uMKZ#5{E!S9>#J%MjVzr262o41dfA{uYHWdvVu0}DvS^1T&do4{#
zv_TN*4w~QzN`!nauPf3z3${^P;^d5yx(Kd~){+d96vVs{qDq}u=a`^tHy$F&zo*g?
zK*-%evfRRMrlYN8>g#(!$2YqHKf@MBI5-uXVpVT%WRA2q7X;x>8O_VQY70?lh6UR=
z5htFHBEye63{`Ke_AAm>|H1ue26DN|x3*)RPC_<H{;uy3+}~I7<2N_kaiD8l>s)w7
z%;1eCS;P!?7tSv`+P(}$<M%hEWDmI?Gwd>O9tm%Dnt6&!(;HPU$&O}(39lpdg_@~y
zn8V6qZTD)#4K>$QXS8R8h*D?U`U9s*S%#H!xssC~*QP!%sz_M`P`3&_I4&WH&?GQ6
zO%7&+D(Y)L)*P%&(op4f&jUX?<)dsq!#sRahj@$%q7YFHeW&Y4PHh@*Y=yCACw>)t
zL~>k7Jh8#o=hQDaU~3J-RQdL`ZemQ<Y^Lt}(Q=}50@{UaY}cuN6MqJP%$l#RCe07t
zMY9Xg$fqK7*6~vBB2xL&lW#d?y1w%8HFFV&A|Qy2o*((9xc8Q9{yeMJ66x^??88xt
zCQll)1u+>fm3ERPAH5&f;F`4csO60NzJSMR?|b8p>#ai(RGb2F)FOkI_Fb}dVuKtl
zo_j7n%Kz-~90%?uc~zN;B#H_3NAIG9*08U97eBK<JF5d$auKYxaBHHV11oVx0%JL2
zoA1{H@}aoB3sgfQb@Kj>cM<vhUEo~4v5uWzI=WidQ`?|OiX)`^yXfITybgFL&w+No
z&&Rl*fXvLU<-^6%W33$btzDl__m6=tN#=~1v=hwR=dVZDv(M7@W9EB|)1=Qw-{x_u
z49M-P>kE1=q|;WwF}J1c)N{}L&g3!v9o1M*%jB(|lVDKuy{+>!<s-hO!DX>;^}vSU
ziC*;OuC>5n0@ahR+Q&e$e`Kh4_Q>ec1Ir<CvCkwyNnn^H-rl3!DaLT#tmaGk4_18B
zz8ek)?yJAIgp@6p5SYz`l<zQzGF@2DPcVpS1)8C#Y#u)AsB{Shi|*;-L<MYl=8LF!
z=k(mdhXOO{#vBjfC~m>SuW!GuapZc(4Kp<ldFAzEzP(liaER%nr~L3iE3V4lb-{`O
zZ9um~SDSt22ntjc>Eg(G_<2%0tLzo6zTgge&D}Js(g-P=4PDYAl8s8kkK_syWz(Pu
zTGih<p)r&#LNk+uUXeyfXB%dAd3C&c&F0o=bTRvvP$nNiE8}k^KsHGfJBd+Gmd%wF
zR(Masa$Kombokyp{lY+27YTobOs9T(;rC4*)B=9|Y8Dlc4_~DuMk*}g%F?Y%E`)_=
zEhVpc!tk;}V5-Kw{*2!_ZDIS~Iy*V+_~J8|lm`MPl%w;7B3YU7$6>5r=4s_=sb#lc
zW^Umn0bYd0$}D39yajy62_I82$k}3_*y7Z{i7*pTfJkVP>APlUu8@%qgh03WKnNKh
z5+QJ0M2ap_^nx!kn=jLaC}_*>cavLOi~F(R#?vAes^B$5Vn=lFiF|0C*yb~k-jp_g
zT7^gf^o=Dx6WmYq+Z#u(0@p73Q!QAA5sCF6d)xwon4){pCk5uy8_K1K+Q=w%p6RcP
z7JdzNr1{YSRmcqpWK$wR;!>*^<>RGZzHncT=y#65%JOJy3yeIWeGe*6Pb{@-o6IR^
zOVF93C0*#uP?1S2Ir{GjS1h1q{G~rQsmq|CROyEUapOHh3#ZB(_>8JLAqw@SiS*_7
zJwqaxq2t)m`KG0BxOF`E7LFXv0C5e_L;KoStw?+|&~b>r>tXr61&tv7zP7nqg(Kn$
z7-7t}gz$Ds?+v#>Uxk`Y%wAT`Mr;SqFKMeT;nsN-vgjeaB5#`v%`+S5P?#l<^sp0I
zDyZVuJJ>_v`NEBN)bkrQI}!Q{@{TzBNbgVmG7XMt+zIv;KiC5HxEtpsLOSu$)<sG>
z(<Y`6MjPRhqtQlK>g5|<FYZ|RyoA1GrDgOQ+y1utDeZ$twQaDX8q-==2iUl;0s3@9
zQ5!^6?<X$WH#F#Bay|1$y;xog&_N|q_D=)?gJ5)*bvTX2=dG$3WJLHtmGYjDlzpgC
z{6ocWK{H1Uis8D`%&yYrHM1yIPL~sWAR$N#9jK6OFmm#W;rt!t1Q`wXh%dQ`&1?RY
zrW{4ms;gvDTc~ZoY9mfnf%2H&FK8?9LsiwDm%2(=zLTfh_2wG-ZB!j|sO1&%vZy#=
z7n6%`t}4i}@k|3;iuvAvizv+uObVHPoRbE&86QIHc78-aGwc3_f@vk!#NqW~kLls(
z_(}1oXn+J>MlP1@`bbR*NDfIO-fB0*D{nH@G(1XX#A`VSPg{CipL^^A#s^^Os>PDZ
z9~$%v89Y)kxq74-j8kF$jAuHc{v-VXyEUpXU;T#Ro9Qp~`mEKSmse{12Id=NP%QCG
z=@sf9w0P&e{Dho6Qfscc^|YY5)oD}t3Xk9qrqCEb?uJ>fI@l3MfV|7&MI0kw236rC
zA|PQ=>#FDZ>gNPNN)*xIa3lVOW#XBwJ;$s=IV+-dbVtQ^!055Iaj@^+``W<~w^KyP
zJw_@Bx$5@nsR(CrdSxRlj*(Gohfi8E#^dUV@_5ut^{1H+Ikwf!*)x~+c?x>RznTyE
z=CYL0_4)9brM|-=k-4D!n@p57zYZhg{lYhagG#hkXO+M!Ql$8C>QX1=2&Xx2N`E(I
ze;EVO+a(8WVC0D|XJB(>VsUiG_veG)XiuagxVjq>uE>tu6$-<@7<yjO&5sL6_0E&I
z25B0(?r@af1tDK7&5szWLeFj#6zis_-x`T2i<ova7?a&N##bW_gH+Xy8D_$CGT5Ol
zb#v&)tVfTQj28SyHF6y2XUW)FNeF*v6n&x$b|*KhfK0k5A=8C2>5vdwut>&Gmr%va
zcv`k*iWV)JWR?LHLn`vEI8%<wPE<?jEE8_#ln+a()Z~uK@YaD=q-6lOvJ4E>hBBEP
zDSj(~`-(OUwc9^<P4P7<GJhtlXeV9ZG*(lOTLxUp<(kTy?V>grvec~WoUNRW(Repg
z)Hq*EC1w(@U&qc@hGpum%^|IqAZjwpzuV>;p4!l<F#=)b8yxwKvVMQFGh*#^z@KDR
zPBW(+QdZ>gLMj^5faLvK=ByfJg`#S{ct|=bTi$%1m{)-9ugo0o@q<0i3bs(lvl)g?
zGTavuGpLu5q%P)W@mu)2ZumQ2W^pt5&H2yOnNsbhD6{e$7a&~!H^gv3h->$GrzJ5R
zRj%}m>6CBmLg8W%Dibl(Wi8ckp)40PdaEAsR2-CJQBo`e!kLFZI)v3u3d-bGaYl1g
znPH*=%eD@b9J!^5Vb;OrCPy=dMoj6?(SE)-nO{3<Y3b_0eK3mzmP^we?KdZ`kVvMf
zWk{I{A|{pnjo6SXtd(+Fv!mZOUR6P?H&A7Cl@mNqK~Xc6_&l}Q>46${U^MaN_xXex
zeHG6H+7;5dvRBmUkR0n+rnDp8y(%4Q-7Ri}vW-oaU}s^0ZRODm!33Nn-n=Dv_!RRA
zZhTyXO8BOVmw7vEf@bCmm={*p&oO}@n8eh8RQW6#FiHxjr-jAII8K@#dTL?*Y|o2a
z)F_t~veb=o$&RmCLX!eM+JMAPG&Ef^_T~iumICv@%i-Uig4KNZP`PU*wd}t|UV;x*
z6=SQfXB4$cf2%D^%;CT4{i`P!s%=iav~F10B!6>4O%bLbr+t(Hi&ry#MFMfPS<zT^
zXF0ARNZs-R`Mk(}pwScfk~@@PP9~{iZr7ZVW49-TfobL#ts>BdY$_zEch3FYa~(Vu
zx)GYqIm3$x%^#HMiY%q_%Tu71M59w$W$Dskbkk&6PBljiH_QZn-!<GpKd}z-n<2UA
z^GbFj`d{!E5}{5j9Mx_*k!SnB<emZYozRUL1-BEf4K`bDp_OJe!jiM!?<+C{9eq_#
zc6{OTz0S@_syg#ay9tp{E#D^-4ftEM*?JJ!M)n`VWZ}exhPh0+r(ab;g!%9mXr|<h
zIiO>fZY%;*6;wE>pBurnYcT`cA;;kMc{&;e@);Awk15Xa>1X!uXvIMtx;o?d<=t1`
z;mclKlA_(o=5vd+q=X-(R)3uhbuef@PP}emfwxc=o=auE7kCR8uQ)yc6<COUddM*o
zW#yZ8Re_i)AxEGZlpHGbB|PhrRx9EvlJup%nmrOCZ~FlKbaK2{KN6MOOziw9kL#Zn
z+z&7@(~+T>$f=r;Pn3V&okVAT**xL(u7LUBz6=HwC!69He1p%Y_b_Ez%$pLAc`BA7
z?}*gcxOxo`tFmR6G5lOhY7{1lwV&s=T{i@fVDsiRFu5V6WAj2Q^80s}<AE4hEL2=w
z4@sQp7Z>+a<sHk+Zk~Ur6zAm!8MS>bSx^;$Y0FNqAu8yIOY0!*>qNM@axyNTT4uOm
zF|I7nYuoa3S|Bz`S%Vc=KUL{QZ>3GG^8B!2|GnbWh1fHEQAQn<_bT5<drqHg>>~Iu
zVNw`3eLCNCJ6djAny~)NAq5X|47i)Znikj?z}DfO5+AC1pUf@G>-HHPv<{1c#v_eF
zt1O*EM>)Zq;-CdI$rG%IiD`#NHrdgwka6gB#8))ZOwI2#Dkc$Z^~QXI#ReuQCI<yW
zAC}Mv^=mlAU;O~UCXGR&3BaP&K*6s33_knbk4UmBPT-Fo+XFem<=Ei+hM-e1FsT9s
zGpjtDQ*8Y@%VsO7eOO!!Dkz(>_S>CY+7Ift`Ry>lZ?(1G&>$Z?KU*9s5d{L0VRJ7<
z!XB1vKA#F<JH|qDY+F<)!(dA!QN@XaT_ua|yg}LdtRI!S-2`L4KQYA%YBr!w{zAS@
zhY5uZ+`o$-um41O5QK;jK!CNAQkPdreAmUyO5jQAC|Y%y+?-8i0B1~?K|dCR6&V(x
zFsPmrs^FFlL%+V>y@T4d9u1Qh9VIUZpM<E)`B~Egdgd2w#W84czQLj4jnHOase7`T
zYbLd0+Z6IHyGF(j2{v<h>m=4QZxfpP)BFSHY9k5lYg3WeYAc5j9DF2hRw*L@&@FIv
zA^VE^#}BRi)Do}uo#4ss>e+3lZ3#;;=dXZe=Bv`^?x5pKXkmv%g&=9Zy*3ztRBB%*
zH9vNN9M@bc(;MmJ%2PYPD}9-n4La0suPBKBS}ps@JNs!Q8r_{r<~BKke9o6whuELZ
zFvyLog9xW2%XbM_$XY%^)mBm^ApOZWb;kN4-?q=qKOFqPrxE*Z*Pps<m)gNKGgjmR
zckj6E_(HTG&@R2*Jrm9rx59H6?qpslU*Vk6fuwTVbt%XgbKyf<!7oVTe!qbHdLj|g
zFrMQyik{dB>XLOlQocWYQ3UHZqj0dqyy0in?dfN>g`<1K?Dn{j<gsx+Q)bPjOdEXt
zl?UM;RM083-^hj9zau>S$y>d!EiU~GeLlNgptmk~f_ARgF6<pwv$S2x`@>*_P<F?K
z#%r=*4jl=af8SwVCRW&KEDvkLD$f+ZW&|3UKlnw~I>?Dog7y+sg$L>OF@<AjHgr(I
zWHX^E{~?__eEIl|AK{ucrHlv|aYD?FyL$z}9}-bY3`}?k`7^MXeYnr<#$j7f-iS!C
zBjLQ;Gm(!ql%uJ#S%Q_mJ$9EYw)y#Q!JhsC--4GA1Y}<1pCE?+fhXL*1$!yGuW$@A
zLu1qbqTE~mOSw;~m0MX7U$9cEc$Yk*V$_2uKt?r)lqM~U|NTlKzhKMNVCZIaGV===
z)8}dq+CSOD3_T)*gz0b2tLyX@zq9|x%L8FAXr=()Vp?6G8u8<G?+6}I`&B~N2vM$w
z2c4oP?%8TL8cpa_99T)wT@sq+#h`XqR`kpGor$0!uqs+A<~#l0?6Da(>0%;rJ!>O=
zo6nS!oXop^()HM>j(G6~ksq$0ldex&E=EwNa(~Ti<l*@_@u=r3TBvfO<C@ftM3EK)
z2B0+qFAd3ishat0pe^!`45@pWav@>rDIL-?4Jn%BWRnkl+=j8=qq?tkLBRUzm&XYx
z*(Ow}6tn#AUOzJMGy||dr9RhBmLk|IB|U=5y~hs1BUO~?*fFW(i;#nL5@~p>;1{ur
z%m1v3MSQ6A&;pq4_|8*<ZgY3-VXH#mp}DW4P6my@F>4~er|_yA$OPbS6}C(#73Ocg
zz+FSO@inIKtrd60@HQ-qU^qFv!-aHNV?6rz?v(n+%oBJZQ?5gmo})BQaGRLoHsMMI
zQ9$M{(I*p*5u6-9V<mXsUCcA1bmeNa_B$xtbNx%d$C(0uZvWEnpZ-z5m;WE?_y1=|
z{?lYq)YQz<&eFxw-tIrN{hWje`L7_E(9Z&xa5crwpOJHekm@4nweT?!*SYyjBuuM_
zEQ?kd-xm5ForGj{pFjkXuN$p&J+xYR%%@Gec|Nn#R!Yr5)EG<>gbi^-(xWF;O@IqD
zK-Q7?<W6cFDyx>a+zq0%SiP0;lxZfB=CewoN2FwQw&ZQzm-YL<ne>;U$I)S2*nIiJ
z(Zm)jX`9AB<U$v7>Gi%yI*o2){~->I8p~{v9+CZnG76^Gu2e<D?Hih;>Q~<-ENVLp
zhOP#@LTnG+D3!y<Am{Rs)0^fpapZKIq0R`@bgKE$bR6+-F>C`FwFFr*=d`@hq%Yt`
zpF_GIvcwT~#W92PdGE;_GbI?Ov-^fLe^zb`UTU>l3afFWr72v_44i)?xTO_V<NZir
z0@O=t|CO@&i)%?to>lY*2bN+itxAGr0*Az~8tI3oH8@2zTL|*?*HEnCbPAoH1#eOe
zV!^G7qw+%FmTH5cFG707&f&1rkly~=h<kv|+2JcA2*mUsyUqLm+wK2oZMEjBx5^>m
zXZE*qDFx&ZC~3r%Kp4wJWg(hXGUWovCfHRh>p9S{JC0zW6rWUUE02;=3y=LDsyf8u
zPSveV2vWWBK=}|k2Ytm1d9FPEnOy!?Q~&<<8E+@FO#N0D0lv;l@9jtLS0DS!tnSYp
z;}Ouwk)5dcu)1iw5NFXoX;ITb3=9%F`3sC7($H2C$#7Cy;|?%PUX#D7ih+7Ytun*z
z=TEuZJvzgWn6ko)vEGB78?oL)K6yA7*cjd>eEC1{h#2;+6j}X#5|2M61j309jSLJu
zu@cb^7kS7c#7%ez+gxHUD$ser3DOQLTsPu8M9jRyA^kSryF2c`@(uLJ(>%u<_am(;
zO$_n?!t@L_xV=gDIeX{}(dyUji}8B>^^jV9`1RX!HCAJAr1tzNCRzh?5kBrsKCnpb
zGB%_sxLf)XK}<M8k%LUgHd@rh*i<uW<h~U`NAzr2YQ0fzqed;PNwTh;(lD5;4*)9$
z8<pp>zW^~NN~3$eV8q85L2cYVha>ezyc8=xno>@QT(epX&9DeyH$Hl$L&kozX(5_a
z&p<A=Hc;RpT&jg;#iS+~WGEU#6&1%uRcocG*VA3@sv_ciyM81m7sFVM_z`Lb8!`d$
zaEM0LK93_jcWS10Mxt?8?b17L5yo^CLe?(0)+NTJ-Na~k!GT0hoMkCIc405IjKj|$
zOM`eCkxGi%v8={(l%6siHc{#NP7IYg$U$C%oTxreI<G!cCt2o(I5RI~IR@i)LTKIi
zq@IwEA3PZWaSlJUAH>0)rlFgg;hMrDy$73MYuUG@O;)FNi9?}t6tKfkE>$z05GfsN
z4l^$PlRTPfR&0{8RU*Xtg5xj3A6BIWsw93?xg<qaxlzqUG&u1_(fO~SB4dQ<>|MQL
zJ5iGd(||fPt7j&|q<J(sJWyX($>fD9_>*+z!SbsCYQyXFD%E<dY9kma8e&Rn)heN)
z$SjA3NUA5*#@%n2=bF^Jr%EYs(Nc_M8s=)8C%mpAWn?>n6Tfw+Z#GPP<c3H$hwlhT
zGi^F15)*19T_jA}BIQ;mP4G|u;wR?h6l%%G;wn8<T)-&-Hfv$v@>I*XqgN;omNF~J
z>0E5oQNM=;bMC0a!Qix1YR2H35~w8z+e5{kJbDexx<zO!U3=e+aRUp9?MFRSh8(jM
zud%jMSqy2IF#UUZ>9&Ww+2kv@Lj=d4k|G}+wTEzh^7m$*6o)0~1cs^UruS4Zb701w
zWb<Ejhj}pl`>-*x;epM<!)bIMk&JZRXt0IBY@>94fPfHzxXkI5e&9s+QO%0(dknn>
z<z;jIvuyyx!EfCT(<~xM7N;6uW8<<#8c_j)-kH36-;Y=beFJR<pac%!Qu5qrRsCzH
zJT$&^Nk802clv%BE|${rXdX3KSF@@~tfS*jj}c&++z$1qV0UQ6ZuysVZwamNOm3Rg
zzVTsfAE$f5u3ata^*#r-;m`(U2KSb{<<ZP`92w5knRzdRp^ZNY1C3(*L0=w;r9{}V
zLH90JNt<6R^+2DYQSl5%I=5aiKPv2EUal;L0&npMTJWj{pH+cr&aE)lJ)$@ohEbD{
zv%Sfo3su(bEJ4)AqIE$*tb|=e4D7f}qd8d2*b`Il4rsGwCF&k7k)vf8)G^H@{Rb%G
zxj$d9#<dQRmedr>u(WR5nCwh{f?L?#H$L%YoL#a?=j2^#x&bR`c4%!{UMrJLA2NWT
zf4(gR`8Ma=_A6pyGTSpRgT0nxT5J#NkS`!6Oao&?=SgksmT!80Gj|}qxFvoi>P-Y?
zt30E~h-mqmdY&z*ddMhCqS<G9$S%$u19-+$%aWnZ2$VCacYJ8|HgtY0%J0Gsks$3T
zDXQxz|DcK7)Mr&K$#3PS#mK`3;Jd|E(&i)VvxW#-n;Fr8YM@-GLHwoCg*|huEU^KY
zOK}hTLOiVeGJ>0uBbL~{#yYWCr)OYt@wOOMBxsp!nNr=zy<gkMiUs<Wo#*OD-`*D$
zZ*4?ff6%$Zp?lSh9y>g>WqTy{az977q0Oc8P?ajmyBx;Sb9<;b09is77Da%1hY;#k
zmhLKoFs0$C01Im#j@)heS@$1M-6FI2QVkib+rqJkd{R0s*$-F_xpQ%r=R}ux`m(i6
zbFjY_+#uMqn*}B(B{n>hDa}Y+!|9y?fty`H^9#Rni=g3n-0zD5k7jOQd3@6u3y?LW
zuQcurV}swzj`!#y(jGUXD+DGd_8%M9!OZ(mTagg5Z^MV8G3byHvL7<f1X^!rm)WmE
zTabw&1byHs@*aK4j?e(JQ>_w%GnO7G##Gy5!E7-6QYtOv!8yg->8zUC3M@khFOOmf
z0*;_T4WSpr+*w-Q*6=wYw5m(v&zx@cTzLtu<J7DhZ`_mu@&%J`k_GEhIT|t^P$A8D
z-Wl&8RyjdcWsFW(T5gkA^b;sU2X1t<4BVVoh`8SI24*{gzaQIkAZZyUTdki*FV=sK
z5nL8@xGm^C&g(tS={+`xK3u(l9$f}S{}tJbLwkFKX?Rj17&P{PRrn3_uxHCR2EDA}
zqkF!ebqYc(3Vp30{Dhrb0@ckWK~rTNinR<+z{yS;hPlis0)J)-JfYu&H94s@xf_i5
z`ygp1cfi&uP1(bV3t$KZ!4-XADqs|&R-&Uq-fEyB=1+IViDEa^7_c%Hq&06UsT=f0
zV~eso@q|>F<Pe0&Q0QPI81fO&#V*9=<Q9kHhyM_(Kp$$FLfbrW{L1^YB~m&(>Q|x%
zZZ_U}Ry#0XnH8R6W2mhaH+XK!<EtT|&9OU#Vkz)k?z)J0B!LP{BYA*n#5+?BGzZ7+
zdvy*x+%aYKdN)2`Y^aoKjrSjY&U&&Pcco4VAj3NeV$>GN|GD;>L@3o~uLQ?R>9Go=
z4>7fE{xZyyJw2OmoA7GxRgFwZ=?F3XwsEUiK`;?gOs7PDXzOjGJkz^Y0h=Nmo2Ga9
z(o9s~7E=BVdPB~}vDeawSHy;xB}I^;Ic^nPz>Gnl&q&}jZBNDMEn4c0hy94a`V-zQ
zn0XDdyMOB`^W+_I;e|N4KE*sE8ZBbLyMp*$)OFx29tlxO%Q47qKRb+x!@<pgGv-r6
zNwI6p=9Bne=Wy_sB3f2h5D??9bjbg=r!@Ef@MQL11Efmgc##6XfAQv^ka-c*b<5&t
zI=t{P34>tFb$ik*XTr-v16m#+$fmmLg@}lbkr|U`ujaY6ui(81;KcmIzQP(Ne_PeH
z63|nVt|sjmP-Lluiq+_nhBziw(OAku;A)zSpDD3rZ>@|BN>b}d4mjh@qK6X)Zo*;~
zb#pW)VK;g{pZXEHuuVfEpXo56_-k;HVgMQq%84xYWVdS+(SFAlNajS=ao-&jGdIXu
zEkM6D+ur@oLMkxs47$MoSBdBo(XG3_3b6cjfc<}$i2c7`qW>E7=&H0K55|g-J#Grw
zHYO(Ki%n!A*h_81u@(%23LXb!LS)d|kZUR1ISL~FEm3Yxua9CgFAK=vF_)h?+qi}Q
zi4;r7K}f*Ht?|Bb?dsm!%NM%WmRP?#AMMeKQtl2wIJ7{W;p0J_cR;5Zo3*$<dJE_v
zO;d5Va3Lu*KSvdzRi2Bi+qSBuPs8k(&!gp64B$X0UrzH6VH)he1EU@88=S<M|1!KV
zC35{SD9CCN`8JfqTu34G_jmZNNswJbgB5)oXIv=RUM7ACZ3?A7>T`j%g@G;<X^4g2
zy8WOp#?7FN_Lfuydo~@v>j{_0`LMcaDxG^$M8OSug+CXz!29<p<p8Iyk4IH4ZLDUC
zxJ5$RVp#UObz!VFj%thz5JM!-C|(*(2B!MpUqf(iV_KBv$^~W_FT}ul;F^x<pNoxc
z=zkCLnC420*jI;i|M3-r^`E+AV`yjYYH0oyLaL%F=HcM<pI;h6;uT~DSa8DpwT{=9
zPMa%Ku6K}#+F|MU#L~l^X^_70+t3g-;I_xsFj`jlF)|}zyn*=9url()@TL!B9Y}d>
z6JI{gj9~wyvI4lMa-`EOb5xxv))f?mSA@zT>d-Z-{YAr=*4@E8hKN+_p&oS)q!w2^
zZ4>B-F()4mb2*SIL=H@kTWiYFjehvyagTR%lq{eEKEYBP{<1IC3o8$HvAT#&)I#2;
zw}Wbf<)zB9QPhpD61EnUjLgnt`m6potBk5Q)Po~QAABh(=p1b92bWm@QXDMFt*dX|
zb*x0umr#*H0VIT9X|T88IHBIISUNA^Rx%0D9)n0`!Gid5EnDfBOO6q<PFTc7wQ?E;
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
VemJy|y4WPHd^g8!JB1)|{{XI(Ccyvz

literal 0
HcmV?d00001

-- 
GitLab