reasoner4j-user Mailing List for rule engine in java
Status: Pre-Alpha
Brought to you by:
luc_peuvrier
You can subscribe to this list here.
| 2010 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(43) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2011 |
Jan
(6) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2012 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <luc...@us...> - 2012-03-11 09:50:42
|
Revision: 58
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=58&view=rev
Author: luc_peuvrier
Date: 2012-03-11 09:50:34 +0000 (Sun, 11 Mar 2012)
Log Message:
-----------
WIP
Modified Paths:
--------------
trunk/reasoner4j/doc/todo.txt
trunk/reasoner4j/pom.xml
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultRuleDefinitionProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IRuleDefinitionProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListRuleDefinition.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AffectConclusion.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
Added Paths:
-----------
trunk/reasoner4j/doc/compute.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListFactMaskDefinition.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountAssertion.java
Removed Paths:
-------------
trunk/reasoner4j/doc/last_of_list.txt
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java
Copied: trunk/reasoner4j/doc/compute.txt (from rev 55, trunk/reasoner4j/doc/last_of_list.txt)
===================================================================
--- trunk/reasoner4j/doc/compute.txt (rev 0)
+++ trunk/reasoner4j/doc/compute.txt 2012-03-11 09:50:34 UTC (rev 58)
@@ -0,0 +1,125 @@
+case of count assertion
+-----------------------
+
+compute koCount according to previous koCount value
+
+?X state ko
+?X koCount ?C, if not exist for a ?X then create fact (?X koCount 0)
+ (?X koCount 0) do not trigger other rules
+ not listening: do not react (?X koCount ?C) assertion
+?C increment ?NC (buitin: ?NC is value of ?C incremented by 1)
+=>
+?X koCount ?NC, replace object: for any ?OC retract (?X koCount ?OC)
+ before assert (?X koCount ?NC)
+
+--------------------------------------------------------------------------------
+
+case of last of list fact
+-------------------------
+
+ compute last of list according to list state:
+ ---------------------------------------------
+
+?LL containsLastOfList ?L
+?LL listRest ?LR
+?LR logNotEquals nil
+=>
+?LR containsLastOfList ?L
+
+?LL containsLastOfList ?L
+?LL listRest ?LR
+?LR logEquals nil
+?LL listFirst ?E
+=>
+?LR lastOfList ?E (replace object)
+
+ change list state according to last of list assertion:
+ ------------------------------------------------------
+
+?L lastOfList ?E, do not do retraction conclude.
+?LL containsLastOfList ?L
+?LL listRest ?LR
+?LR logEquals nil
+nil blankNode ?NLR
+=>
+?LL listRest ?NLR (replace object)
+?NLR listFirst ?E
+?NLR listRest nil
+
+if (?L lastOfList ?E) retracted
+?LE listFirst ?E
+?LE listRest nil
+?LP listRest ?LE
+=>
+(?LE listFirst ?E) retraction
+(?LE listRest nil) retraction
+(?LP listRest nil) assertion, replace object
+
+ list change notification
+ ------------------------
+
+ if (?L listFirst ?E) asserted
+ =>
+ (?L listChange nil) notification
+
+ if (?L listRest ?LR) asserted
+ =>
+ (?L listChange nil) notification
+
+ if (?L listChange nil) notification
+ if (?LP listRest ?L) asserted
+ =>
+ (?LP listChange nil) notification
+
+
+--------------------------------------------------------------------------------
+
+case of expression compute, sum of element of a list.
+-----------------------------------------------------
+
+ creating new list
+ -----------------
+
+ ?X value ?V
+ result valueList ?L if not exist for a ?L then create fact (result valueList nil)
+ (result valueList nil) do not trigger other rules
+ not listening: do not react (result valueList ?L) assertion
+ ?LV listFirst ?V asserted, always true
+ ?LV listRest nil asserted, always true
+ ?LL listFirst ?L asserted, always true
+ ?LL listRest ?LL2 asserted, always true
+ ?LL2 listFirst ?LV asserted, always true
+ ?LL2 listRest nil asserted, always true
+ ?LL listAppend ?LR builtin
+ =>
+ result valueList ?LR replace object
+
+ (?X value ?V) retracted
+ result valueList ?L default ?L=nil
+ ?LV listFirst ?V asserted
+ ?LV listRest nil asserted
+ ?LL listFirst ?L asserted
+ ?LL listRest ?LL2 asserted
+ ?LL2 listFirst ?LV asserted
+ ?LL2 listRest nil asserted
+ ?LL listRemove ?LR
+ =>
+ result valueList ?LR replace object
+
+ result list ?L
+ ?L listChange nil
+ ?L mathSum ?S
+ =>
+ result sum ?S
+
+ list change notification
+ ------------------------
+
+ result list ?L
+ ?L listChange nil
+ ?L mathSum ?S
+ =>
+ result sum ?S
+
+
+
\ No newline at end of file
Deleted: trunk/reasoner4j/doc/last_of_list.txt
===================================================================
--- trunk/reasoner4j/doc/last_of_list.txt 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/doc/last_of_list.txt 2012-03-11 09:50:34 UTC (rev 58)
@@ -1,25 +0,0 @@
-?LL containsLastOfList ?L
-?LL listRest ?LR
-?LR logNotEquals nil
-=>
-?LR containsLastOfList ?L
-
-?LL containsLastOfList ?L
-?LL listRest ?LR
-?LR logEquals nil
-?LL listFirst ?E
-=>
-?LR lastOfList ?E (replace object)
-
-?L lastOfList ?E
-?L lastOfList ?CE (not listening, default nil object)
-?E logNotSameAs ?CE
-?LL containsLastOfList ?L
-?LL listRest ?LR
-?LR logEquals nil
-nil blankNode ?NLR
-=>
-?LL listRest ?NLR (replace object)
-?NLR listFirst ?E
-?NLR listRest nil
-
Modified: trunk/reasoner4j/doc/todo.txt
===================================================================
--- trunk/reasoner4j/doc/todo.txt 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/doc/todo.txt 2012-03-11 09:50:34 UTC (rev 58)
@@ -46,6 +46,18 @@
- sort premise to better rete
- reuse common premise and merge table (take care with rule removing)
+presentation:
+-------------
+
+Bonjour
+
+J'ai pens\xE9 \xE0 vous en lisant cette pr\xE9s. de Jos , le cr\xE9ateur d' Euler:
+http://www.agfa.com/w3c/Talks/2011/01swig/
+
+--
+Jean-Marc Vanel
+
+
------------------------------------------------------------------------------------------------------------
-------------
Modified: trunk/reasoner4j/pom.xml
===================================================================
--- trunk/reasoner4j/pom.xml 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/pom.xml 2012-03-11 09:50:34 UTC (rev 58)
@@ -51,7 +51,7 @@
<connection>
scm:svn:http://reasoner4j.svn.sourceforge.net/svnroot/reasoner4j/trunk
</connection>
- <url>http://eulergui.svn.sourceforge.net/viewvc/eulergui/</url>
+ <url>http://reasoner4j.svn.sourceforge.net/viewvc/reasoner4j/</url>
</scm>
<issueManagement>
@@ -126,7 +126,7 @@
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
- <version>1.2.15</version>
+ <version>1.2.16</version>
<!-- scope "compile" by default -->
<exclusions>
<exclusion>
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -57,6 +57,8 @@
public static final String LIST_REST_PREDICATE_IDENTIFIER = "listRest";
+ public static final String CONTAINS_LAST_OF_LIST_PREDICATE = "containsLastOfList";
+
public static final String LAST_OF_LIST_PREDICATE_IDENTIFIER = "lastOfList";
private TermIdentifierConstant() {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultRuleDefinitionProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultRuleDefinitionProvider.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultRuleDefinitionProvider.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -25,7 +25,9 @@
import java.util.LinkedList;
import java.util.List;
+import net.sf.reasoner4j.builtin.ruledef.ListFactMaskDefinition;
import net.sf.reasoner4j.builtin.ruledef.ListRuleDefinition;
+import net.sf.reasoner4j.fact.FactMask;
import net.sf.reasoner4j.rule.Rule;
/**
@@ -39,6 +41,8 @@
private List<Rule<T>> ruleList;
+ List<FactMask<T>> factMaskList;
+
@Override
public List<Rule<T>> getRules(
final IBuitinTermProvider<T> buitinTermProvider) {
@@ -48,4 +52,15 @@
}
return ruleList;
}
+
+ @Override
+ public List<FactMask<T>> getFactMask(
+ final IBuitinTermProvider<T> buitinTermProvider) {
+ if (factMaskList == null) {
+ factMaskList = new LinkedList<FactMask<T>>();
+ factMaskList.addAll(new ListFactMaskDefinition<T>(
+ buitinTermProvider));
+ }
+ return factMaskList;
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IRuleDefinitionProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IRuleDefinitionProvider.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IRuleDefinitionProvider.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -24,6 +24,7 @@
import java.util.List;
+import net.sf.reasoner4j.fact.FactMask;
import net.sf.reasoner4j.rule.Rule;
/**
@@ -34,5 +35,7 @@
*/
public interface IRuleDefinitionProvider<T> {
+ List<FactMask<T>> getFactMask(IBuitinTermProvider<T> buitinTermProvider);
+
List<Rule<T>> getRules(IBuitinTermProvider<T> buitinTermProvider);
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListFactMaskDefinition.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListFactMaskDefinition.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListFactMaskDefinition.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2011 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.ruledef;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.reasoner4j.builtin.TermIdentifierConstant;
+import net.sf.reasoner4j.builtin.provider.IBuitinTermProvider;
+import net.sf.reasoner4j.fact.FactMask;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ */
+public class ListFactMaskDefinition<T> extends AbstractList<FactMask<T>> {
+
+ private final List<FactMask<T>> factMaksList = new ArrayList<FactMask<T>>();
+
+ public ListFactMaskDefinition(
+ final IBuitinTermProvider<T> buitinTermProvider) {
+ final T containsLastOfListTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.CONTAINS_LAST_OF_LIST_PREDICATE);
+ final T listRestTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.LIST_REST_PREDICATE_IDENTIFIER);
+ final T listFirstTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.LIST_FIRST_PREDICATE_IDENTIFIER);
+ final T lastOfListTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.LAST_OF_LIST_PREDICATE_IDENTIFIER);
+ factMaksList.add(new FactMask<T>(
+ /* subject */null, false,
+ /* predicate */containsLastOfListTerm, true,
+ /* object */null, true));
+ factMaksList.add(new FactMask<T>(
+ /* subject */null, true,
+ /* predicate */listRestTerm, true,
+ /* object */null, false));
+ factMaksList.add(new FactMask<T>(
+ /* subject */null, true,
+ /* predicate */listFirstTerm, true,
+ /* object */null, false));
+ factMaksList.add(new FactMask<T>(
+ /* subject */null, true,
+ /* predicate */lastOfListTerm, true,
+ /* object */null, false));
+ }
+
+ @Override
+ public FactMask<T> get(final int index) {
+ return factMaksList.get(index);
+ }
+
+ @Override
+ public int size() {
+ return factMaksList.size();
+ }
+
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListRuleDefinition.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListRuleDefinition.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListRuleDefinition.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -43,14 +43,12 @@
*/
public class ListRuleDefinition<T> extends AbstractList<Rule<T>> {
- private static final String CONTAINS_LAST_OF_LIST = "containsLastOfList";
-
private final List<Rule<T>> ruleList = new ArrayList<Rule<T>>();
public ListRuleDefinition(final IBuitinTermProvider<T> buitinTermProvider) {
super();
final T containsLastOfListTerm = buitinTermProvider
- .getTerm(CONTAINS_LAST_OF_LIST);
+ .getTerm(TermIdentifierConstant.CONTAINS_LAST_OF_LIST_PREDICATE);
final T listRestTerm = buitinTermProvider
.getTerm(TermIdentifierConstant.LIST_REST_PREDICATE_IDENTIFIER);
final T listFirstTerm = buitinTermProvider
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -53,7 +53,7 @@
*/
void addRule(Rule<T> rule);
- void addRule(IRuleDefinitionProvider<T> ruleDefinitionProvider);
+ void addRuleDefinition(IRuleDefinitionProvider<T> ruleDefinitionProvider);
void removeRule(Rule<T> rule);
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -159,10 +159,15 @@
}
@Override
- public void addRule(final IRuleDefinitionProvider<T> ruleDefinitionProvider) {
+ public void addRuleDefinition(
+ final IRuleDefinitionProvider<T> ruleDefinitionProvider) {
for (Rule<T> rule : ruleDefinitionProvider.getRules(buitinTermProvider)) {
addRule(rule);
}
+ for (FactMask<T> factMask : ruleDefinitionProvider
+ .getFactMask(buitinTermProvider)) {
+ addFactMask(factMask);
+ }
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -34,6 +34,7 @@
*
* @param <T>
*/
+// FIXMELUC AffectConclusion not needed
public class AffectConclusionNotifier<T> extends
AbstractReplaceConclusionNotifier<T> {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AffectConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AffectConclusion.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AffectConclusion.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -28,6 +28,7 @@
*
* @param <T>
*/
+// FIXMELUC AffectConclusion not needed
public class AffectConclusion<T> extends AbstractReplaceConclusion<T> {
public AffectConclusion(final String subjectVariableName, final T subject,
Copied: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountAssertion.java (from rev 55, trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java)
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountAssertion.java (rev 0)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountAssertion.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -0,0 +1,117 @@
+package net.sf.reasoner4j;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
+import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
+import net.sf.reasoner4j.kb.IKnowledgeBase;
+import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
+import net.sf.reasoner4j.motor.IMotor;
+import net.sf.reasoner4j.motor.MotorFactory;
+import net.sf.reasoner4j.rule.AffectConclusion;
+import net.sf.reasoner4j.rule.IPremise;
+import net.sf.reasoner4j.rule.Premise;
+import net.sf.reasoner4j.rule.PremiseAndDefault;
+import net.sf.reasoner4j.rule.ReplaceConclusion;
+import net.sf.reasoner4j.rule.Rule;
+
+import org.apache.log4j.Logger;
+
+public class TestCountAssertion extends AbstractTestCase {
+
+ private static final Logger LOGGER = Logger
+ .getLogger(TestCountAssertion.class);
+
+ public void testCountAssertion() {
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
+ motor.addBuiltin(new IncrementBuiltin());
+ // first rule
+ Rule<String> rule = new Rule<String>();
+ // ?X state ko
+ IPremise<String> premise = new Premise<String>(
+ /* subject */"?X", null,
+ /* predicate */null, "state",
+ /* object */null, "ko");
+ rule.addPremise(premise);
+ // ?X koCount ?C
+ premise = new PremiseAndDefault<String>(
+ /* subject */"?X", null, null,
+ /* predicate */null, "koCount", null,
+ /* object */"?C", null, "0",
+ /* not listening */false);
+ rule.addPremise(premise);
+ // ?C increment ?NC
+ premise = new Premise<String>(
+ /* subject */"?C", null,
+ /* predicate */null, "increment",
+ /* object */"?NC", null);
+ rule.addPremise(premise);
+
+ // ?X koCount ?NC
+ // AffectConclusion do not retract conclusion
+ // AffectConclusion<String> conclusion = new AffectConclusion<String>(
+ ReplaceConclusion<String> conclusion = new ReplaceConclusion<String>(
+ /* subject */"?X", null, false,
+ /* predicate */null, "koCount", false,
+ /* object */"?NC", null, true);
+ rule.addConclusion(conclusion);
+ motor.addRule(rule);
+
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("first ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "1"));
+
+ motor.retractFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("ko retract", kb);
+
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("second ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "2"));
+ assertNull(kb.get("myCar", "koCount", "1"));
+
+ motor.retractFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("ko retract", kb);
+
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("third ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "3"));
+ assertNull(kb.get("myCar", "koCount", "2"));
+ }
+
+ private void logKoCount(final String title, final IKnowledgeBase<String> kb) {
+ if (LOGGER.isDebugEnabled()) {
+ final Iterator<IFact<String>> iterator = kb.view("myCar",
+ "koCount", null).iterator();
+ final StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append(title);
+ stringBuilder.append('\n');
+ while (iterator.hasNext()) {
+ stringBuilder.append(iterator.next());
+ stringBuilder.append('\n');
+ }
+ LOGGER.debug(stringBuilder.toString());
+ }
+ }
+
+ private class IncrementBuiltin extends AbstractBuiltin<String> {
+ public IncrementBuiltin() {
+ super(null, "increment", null);
+ }
+
+ @Override
+ public List<IFact<String>> compute(final int ruleIdentifier,
+ final String subject, final String predicate,
+ final String object) {
+ List<IFact<String>> result = new ArrayList<IFact<String>>(1);
+ result.add(new Fact<String>(subject, predicate, Integer
+ .toString(Integer.parseInt(subject) + 1)));
+ return result;
+ }
+ }
+}
Deleted: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -1,112 +0,0 @@
-package net.sf.reasoner4j;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
-import net.sf.reasoner4j.fact.Fact;
-import net.sf.reasoner4j.fact.IFact;
-import net.sf.reasoner4j.kb.IKnowledgeBase;
-import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
-import net.sf.reasoner4j.motor.IMotor;
-import net.sf.reasoner4j.motor.MotorFactory;
-import net.sf.reasoner4j.rule.AffectConclusion;
-import net.sf.reasoner4j.rule.IPremise;
-import net.sf.reasoner4j.rule.Premise;
-import net.sf.reasoner4j.rule.PremiseAndDefault;
-import net.sf.reasoner4j.rule.Rule;
-
-import org.apache.log4j.Logger;
-
-public class TestCountRetract extends AbstractTestCase {
-
- private static final Logger LOGGER = Logger
- .getLogger(TestCountRetract.class);
-
- public void testCountRetract() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
- motor.addBuiltin(new IncrementBuiltin());
- // first rule
- Rule<String> rule = new Rule<String>();
- IPremise<String> premise = new Premise<String>(
- /* subject */"?X", null,
- /* predicate */null, "state",
- /* object */null, "ko");
- rule.addPremise(premise);
- premise = new PremiseAndDefault<String>(
- /* subject */"?X", null, null,
- /* predicate */null, "koCount", null,
- /* object */"?C", null, "0",
- /* not listening */false);
- rule.addPremise(premise);
- premise = new Premise<String>(
- /* subject */"?C", null,
- /* predicate */null, "increment",
- /* object */"?NC", null);
- rule.addPremise(premise);
-
- // AffectConclusion do not retract conclusion
- AffectConclusion<String> conclusion = new AffectConclusion<String>(
- // ReplaceConclusion<String> conclusion = new ReplaceConclusion<String>(
- /* subject */"?X", null, false,
- /* predicate */null, "koCount", false,
- /* object */"?NC", null, true);
- rule.addConclusion(conclusion);
- motor.addRule(rule);
-
- motor.assertFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("first ko assert", kb);
- assertNotNull(kb.get("myCar", "koCount", "1"));
-
- motor.retractFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("ko retract", kb);
-
- motor.assertFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("second ko assert", kb);
- assertNotNull(kb.get("myCar", "koCount", "2"));
- assertNull(kb.get("myCar", "koCount", "1"));
-
- motor.retractFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("ko retract", kb);
-
- motor.assertFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("third ko assert", kb);
- assertNotNull(kb.get("myCar", "koCount", "3"));
- assertNull(kb.get("myCar", "koCount", "2"));
- }
-
- private void logKoCount(final String title, final IKnowledgeBase<String> kb) {
- if (LOGGER.isDebugEnabled()) {
- final Iterator<IFact<String>> iterator = kb.view("myCar",
- "koCount", null).iterator();
- final StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append(title);
- stringBuilder.append('\n');
- while (iterator.hasNext()) {
- stringBuilder.append(iterator.next());
- stringBuilder.append('\n');
- }
- LOGGER.debug(stringBuilder.toString());
- }
- }
-
- private class IncrementBuiltin extends AbstractBuiltin<String> {
- public IncrementBuiltin() {
- super(null, "increment", null);
- }
-
- @Override
- public List<IFact<String>> compute(final int ruleIdentifier,
- final String subject, final String predicate,
- final String object) {
- List<IFact<String>> result = new ArrayList<IFact<String>>(1);
- result.add(new Fact<String>(subject, predicate, Integer
- .toString(Integer.parseInt(subject) + 1)));
- return result;
- }
- }
-}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2011-01-07 17:34:38 UTC (rev 57)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2012-03-11 09:50:34 UTC (rev 58)
@@ -168,10 +168,6 @@
assertEquals(expected, sum);
}
- /**
- * DISABLED TEST<br>
- * can not works, not possible to retract list append do by append builtin
- */
public void testListAppendAndPropertySum() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
@@ -259,7 +255,7 @@
rule = new Rule<String>();
- // ?X value ?V
+ // (?X value ?V) retracted
premise = new PremiseRetract<String>(
/* subject */"?X", null,
/* predicate */null, "value",
@@ -308,7 +304,7 @@
/* predicate */null, "listRest",
/* object */null, "nil");
rule.addPremise(premise);
- // ?LL listAppend ?LR
+ // ?LL listRemove ?LR
premise = new Premise<String>(
/* subject */"?LL", null,
/* predicate */null, "listRemove",
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2011-01-07 17:34:46
|
Revision: 57
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=57&view=rev
Author: luc_peuvrier
Date: 2011-01-07 17:34:38 +0000 (Fri, 07 Jan 2011)
Log Message:
-----------
added auto retract to have single fact for subject and/or predicate and/or object
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java
Added Paths:
-----------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/FactMask.java
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -143,7 +143,7 @@
}
@Override
- public void conclusionViewRetraction(final CauseIdentifiedFact<T> fact) {
+ public void conclusionViewRetraction(final IFact<T> fact) {
throw new ReasonerException("unsupported by builtin");
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -41,7 +41,7 @@
private Exception closeTrace;
- protected boolean pattern;
+ protected FactMask<T> factMask;
public AbstractFactSet() {
super();
@@ -114,6 +114,6 @@
@Override
public boolean isRemovable() {
assertOpen();
- return !hasListener() && isEmpty() && !pattern;
+ return !hasListener() && isEmpty() && factMask == null;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -385,55 +385,57 @@
}
@Override
- public void addFactPattern(final IFact<T> fact) {
+ public void addFactMask(final FactMask<T> factMask) {
assertOpen();
- final T subject = fact.getSubject();
- final T predicate = fact.getPredicate();
- final T object = fact.getObject();
+ final T subject = factMask.getSubject();
+ final T predicate = factMask.getPredicate();
+ final T object = factMask.getObject();
boolean added = false;
if (subject != null) {
final PredicateObjectOfSubject<T> predicateObjectOfSubject =
/**/predicateObjectOfSubjectGetOrCreate(subject);
- predicateObjectOfSubject.addFactPattern(fact);
+ predicateObjectOfSubject.addFactMask(factMask);
added = true;
}
if (predicate != null) {
final SubjectObjectOfPredicate<T> subjectObjectOfPredicate =
/**/subjectObjectOfPredicateGetOrCreate(predicate);
- subjectObjectOfPredicate.addFactPattern(fact);
+ subjectObjectOfPredicate.addFactMask(factMask);
added = true;
}
- if (object == null) {
+ if (object != null) {
final SubjectPredicateOfObject<T> subjectPredicateOfObject =
/**/subjectPredicateOfObjectGetOrCreate(object);
- subjectPredicateOfObject.addFactPattern(fact);
+ subjectPredicateOfObject.addFactMask(factMask);
added = true;
}
if (!added) {
- throw new ReasonerException("can not fact pattern " + fact);
+ throw new ReasonerException("can not fact pattern " + factMask);
}
}
@Override
- public boolean match(IFact<T> fact) {
- boolean match;
+ public IFact<T> match(IFact<T> fact) {
+ IFact<T> pattern = null;
IFactSet<T> factSet;
assertOpen();
final T subject = fact.getSubject();
factSet = predicateObjectBySubjectMap.get(subject);
- if (factSet != null && factSet.match(fact)) {
- match = true;
- } else {
+ if (factSet != null) {
+ pattern = factSet.match(fact);
+ }
+ if (pattern == null) {
final T predicate = fact.getPredicate();
factSet = subjectObjectByPredicateMap.get(predicate);
- if (factSet != null && factSet.match(fact)) {
- match = true;
- } else {
+ if (factSet != null) {
+ pattern = factSet.match(fact);
+ }
+ if (pattern == null) {
final T object = fact.getObject();
factSet = subjectPredicateByObjectMap.get(object);
- match = factSet != null && factSet.match(fact);
+ pattern = factSet == null ? null : factSet.match(fact);
}
}
- return match;
+ return pattern;
}
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/FactMask.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/FactMask.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/FactMask.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2011 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.fact;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class FactMask<T> extends Fact<T> {
+
+ private final boolean subjectIsKey;
+
+ private final boolean predicateIsKey;
+
+ private final boolean objectIsKey;
+
+ public FactMask(final T subject, final boolean subjectIsKey,
+ final T predicate, final boolean predicateIsKey, final T object,
+ final boolean objectIsKey) {
+ super(subject, predicate, object);
+ this.subjectIsKey = subjectIsKey;
+ this.predicateIsKey = predicateIsKey;
+ this.objectIsKey = objectIsKey;
+ }
+
+ public IFact<T> viewFact(final IFact<T> fact) {
+ return new Fact<T>(subjectIsKey ? fact.getSubject() : null,
+ predicateIsKey ? fact.getPredicate() : null,
+ objectIsKey ? fact.getObject() : null);
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -72,7 +72,7 @@
*/
boolean isRemovable();
- void addFactPattern(IFact<T> fact);
+ void addFactMask(FactMask<T> factMask);
- boolean match(IFact<T> fact);
+ IFact<T> match(IFact<T> fact);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -176,7 +176,7 @@
}
@Override
- public void addFactPattern(final IFact<T> fact) {
+ public void addFactMask(final FactMask<T> fact) {
assert subject.equals(fact.getSubject())
&& predicate.equals(fact.getPredicate());
assertOpen();
@@ -184,22 +184,22 @@
throw new ReasonerException("can not add pattern " + fact + " to "
+ toString());
}
- pattern = true;
+ factMask = fact;
}
@Override
- public boolean match(final IFact<T> fact) {
+ public IFact<T> match(final IFact<T> fact) {
assert subject.equals(fact.getSubject())
&& predicate.equals(fact.getPredicate());
assertOpen();
- boolean match;
- if (pattern) {
- match = true;
- } else {
+ IFact<T> viewFact;
+ if (factMask == null) {
final T object = fact.getObject();
final IFactSet<T> factSet = factByObjectMap.get(object);
- match = factSet != null && factSet.match(fact);
+ viewFact = factSet == null ? null : factSet.match(fact);
+ } else {
+ viewFact = factMask.viewFact(fact);
}
- return match;
+ return viewFact;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -225,7 +225,7 @@
}
@Override
- public void addFactPattern(final IFact<T> fact) {
+ public void addFactMask(final FactMask<T> fact) {
assert subject.equals(fact.getSubject());
assertOpen();
boolean added = false;
@@ -233,40 +233,41 @@
if (predicate != null) {
final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
/**/objectOfSubjectPredicateGetOrCreate(predicate);
- objectOfSubjectPredicate.addFactPattern(fact);
+ objectOfSubjectPredicate.addFactMask(fact);
added = true;
}
final T object = fact.getObject();
if (object != null) {
final PredicateOfSubjectObject<T> predicateOfSubjectObject =
/**/predicateOfSubjectObjectGetOrCreate(object);
- predicateOfSubjectObject.addFactPattern(fact);
+ predicateOfSubjectObject.addFactMask(fact);
added = true;
}
if (!added) {
- pattern = true;
+ factMask = fact;
}
}
@Override
- public boolean match(final IFact<T> fact) {
+ public IFact<T> match(final IFact<T> fact) {
assert subject.equals(fact.getSubject());
assertOpen();
- boolean match;
- if (pattern) {
- match = true;
- } else {
+ IFact<T> patternFact = null;
+ if (factMask == null) {
IFactSet<T> factSet;
final T predicate = fact.getPredicate();
factSet = objectOfSubjectPredicateByPredicateMap.get(predicate);
- if (factSet != null && factSet.match(fact)) {
- match = true;
- } else {
+ if (factSet != null) {
+ patternFact = factSet.match(fact);
+ }
+ if (patternFact != null) {
final T object = fact.getObject();
factSet = predicateOfSubjectObjectByObjectMap.get(object);
- match = factSet != null && factSet.match(fact);
+ patternFact = factSet == null ? null : factSet.match(fact);
}
+ } else {
+ patternFact = factMask.viewFact(fact);
}
- return match;
+ return patternFact;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -175,7 +175,7 @@
}
@Override
- public void addFactPattern(final IFact<T> fact) {
+ public void addFactMask(final FactMask<T> fact) {
assert subject.equals(fact.getSubject())
&& object.equals(fact.getObject());
assertOpen();
@@ -183,22 +183,22 @@
throw new ReasonerException("can not add pattern " + fact + " to "
+ toString());
}
- pattern = true;
+ factMask = fact;
}
@Override
- public boolean match(final IFact<T> fact) {
+ public IFact<T> match(final IFact<T> fact) {
assert subject.equals(fact.getSubject())
&& object.equals(fact.getObject());
assertOpen();
- boolean match;
- if (pattern) {
- match = true;
- } else {
+ IFact<T> patternFact = null;
+ if (factMask == null) {
final T predicate = fact.getPredicate();
final IFactSet<T> factSet = factByPredicate.get(predicate);
- match = factSet != null && factSet.match(fact);
+ patternFact = factSet == null ? null : factSet.match(fact);
+ } else {
+ patternFact = factMask.viewFact(fact);
}
- return match;
+ return patternFact;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -223,21 +223,21 @@
}
@Override
- public void addFactPattern(final IFact<T> fact) {
+ public void addFactMask(final FactMask<T> fact) {
assert subject.equals(fact.getSubject())
&& predicate.equals(fact.getPredicate())
&& object.equals(fact.getObject());
assertOpen();
- pattern = true;
+ factMask = fact;
}
@Override
- public boolean match(final IFact<T> fact) {
+ public IFact<T> match(final IFact<T> fact) {
assert subject.equals(fact.getSubject())
&& predicate.equals(fact.getPredicate())
&& object.equals(fact.getObject());
assertOpen();
- return pattern;
+ return factMask == null ? null : factMask.viewFact(fact);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -225,7 +225,7 @@
}
@Override
- public void addFactPattern(final IFact<T> fact) {
+ public void addFactMask(final FactMask<T> fact) {
assert predicate.equals(fact.getPredicate());
assertOpen();
boolean added = false;
@@ -233,40 +233,41 @@
if (subject != null) {
final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
/**/objectOfSubjectPredicateGetOrCreate(subject);
- objectOfSubjectPredicate.addFactPattern(fact);
+ objectOfSubjectPredicate.addFactMask(fact);
added = true;
}
final T object = fact.getObject();
if (object != null) {
final SubjectOfPredicateObject<T> subjectOfPredicateObject =
/**/subjectOfPredicateObjectGetOrCreate(object);
- subjectOfPredicateObject.addFactPattern(fact);
+ subjectOfPredicateObject.addFactMask(fact);
added = true;
}
if (!added) {
- pattern = true;
+ factMask = fact;
}
}
@Override
- public boolean match(final IFact<T> fact) {
+ public IFact<T> match(final IFact<T> fact) {
assert predicate.equals(fact.getPredicate());
assertOpen();
- boolean match;
- if (pattern) {
- match = true;
- } else {
+ IFact<T> patternFact = null;
+ if (factMask == null) {
IFactSet<T> factSet;
final T subject = fact.getSubject();
factSet = objectOfSubjectPredicateBySubjectMap.get(subject);
- if (factSet != null && factSet.match(fact)) {
- match = true;
- } else {
+ if (factSet != null) {
+ patternFact = factSet.match(fact);
+ }
+ if (patternFact == null) {
final T object = fact.getObject();
factSet = subjectOfPredicateObjectByObjectMap.get(object);
- match = factSet != null && factSet.match(fact);
+ patternFact = factSet == null ? null : factSet.match(fact);
}
+ } else {
+ patternFact = factMask.viewFact(fact);
}
- return match;
+ return patternFact;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -175,7 +175,7 @@
}
@Override
- public void addFactPattern(final IFact<T> fact) {
+ public void addFactMask(final FactMask<T> fact) {
assert predicate.equals(fact.getPredicate())
&& object.equals(fact.getObject());
assertOpen();
@@ -183,22 +183,22 @@
throw new ReasonerException("can not add pattern " + fact + " to "
+ toString());
}
- pattern = true;
+ factMask = fact;
}
@Override
- public boolean match(final IFact<T> fact) {
+ public IFact<T> match(final IFact<T> fact) {
assert predicate.equals(fact.getPredicate())
&& object.equals(fact.getObject());
assertOpen();
- boolean match;
- if (pattern) {
- match = true;
- } else {
+ IFact<T> patternFact = null;
+ if (factMask == null) {
final T subject = fact.getSubject();
final IFactSet<T> factSet = factBySubject.get(subject);
- match = factSet != null && factSet.match(fact);
+ patternFact = factSet == null ? null : factSet.match(fact);
+ } else {
+ patternFact = factMask.viewFact(fact);
}
- return match;
+ return patternFact;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -225,48 +225,49 @@
}
@Override
- public void addFactPattern(final IFact<T> fact) {
- assert object.equals(fact.getObject());
+ public void addFactMask(final FactMask<T> factMask) {
+ assert object.equals(factMask.getObject());
assertOpen();
boolean added = false;
- final T subject = fact.getSubject();
+ final T subject = factMask.getSubject();
if (subject != null) {
final PredicateOfSubjectObject<T> predicateOfSubjectObject =
/**/predicateOfSubjectObjectGetOrCreate(subject);
- predicateOfSubjectObject.addFactPattern(fact);
+ predicateOfSubjectObject.addFactMask(factMask);
added = true;
}
- final T predicate = fact.getPredicate();
+ final T predicate = factMask.getPredicate();
if (predicate != null) {
final SubjectOfPredicateObject<T> subjectOfPredicateObject =
/**/subjectOfPredicateObjectGetOrCreate(predicate);
- subjectOfPredicateObject.addFactPattern(fact);
+ subjectOfPredicateObject.addFactMask(factMask);
added = true;
}
if (!added) {
- pattern = true;
+ this.factMask = factMask;
}
}
@Override
- public boolean match(final IFact<T> fact) {
+ public IFact<T> match(final IFact<T> fact) {
assert object.equals(fact.getObject());
assertOpen();
- boolean match;
- if (pattern) {
- match = true;
- } else {
+ IFact<T> patternFact = null;
+ if (factMask == null) {
IFactSet<T> factSet;
final T subject = fact.getSubject();
factSet = predicateOfSubjectObjectBySubjectMap.get(subject);
- if (factSet != null && factSet.match(fact)) {
- match = true;
- } else {
+ if (factSet != null) {
+ patternFact = factSet.match(fact);
+ }
+ if (patternFact == null) {
final T predicate = fact.getPredicate();
factSet = subjectOfPredicateObjectByPredicateMap.get(predicate);
- match = factSet != null && factSet.match(fact);
+ patternFact = factSet == null ? null : factSet.match(fact);
}
+ } else {
+ patternFact = factMask.viewFact(fact);
}
- return match;
+ return patternFact;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -30,6 +30,7 @@
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.fact.IFactSetListener;
+import net.sf.reasoner4j.fact.FactMask;
import net.sf.reasoner4j.motor.Motor;
import net.sf.reasoner4j.rete.entity.ReteRule;
@@ -126,4 +127,12 @@
public Iterator<IFact<T>> iterator() {
return factSet.iterator();
}
+
+ public void addFactMask(final FactMask<T> factMask) {
+ factSet.addFactMask(factMask);
+ }
+
+ public IFact<T> match(final IFact<T> fact) {
+ return factSet.match(fact);
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -26,6 +26,7 @@
import net.sf.reasoner4j.builtin.provider.IBuiltinProvider;
import net.sf.reasoner4j.builtin.provider.IRuleDefinitionProvider;
import net.sf.reasoner4j.fact.IFact;
+import net.sf.reasoner4j.fact.FactMask;
import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.rule.Rule;
@@ -41,6 +42,8 @@
void addBuiltin(IBuiltin<T> builtin);
+ void addFactMask(FactMask<T> fact);
+
/**
* add a rule<br>
* rete builder will create rete according to premise add order<br>
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -44,6 +44,7 @@
import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSet;
+import net.sf.reasoner4j.fact.FactMask;
import net.sf.reasoner4j.kb.AllKnowledgeBase;
import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.rete.entity.IConclusionListener;
@@ -145,6 +146,11 @@
}
@Override
+ public void addFactMask(final FactMask<T> factMask) {
+ allKnowledgeBase.addFactMask(factMask);
+ }
+
+ @Override
public void addRule(final Rule<T> rule) {
final ReteRule<T> reteRule = reteBuilder.addRule(rule);
allKnowledgeBase.addReteRule(reteRule);
@@ -171,7 +177,7 @@
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("assert " + fact);
}
- allKnowledgeBase.assertFactInFactSet(new CauseIdentifiedFact<T>(fact,
+ assertedStack.push(new CauseIdentifiedFact<T>(fact,
ReteRule.ADDED_FACT_RULE_IDENTIFIER));
updateKnowledgeBaseWithConclusion();
}
@@ -181,7 +187,7 @@
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("retract " + fact);
}
- allKnowledgeBase.retractFactInFactSet(new CauseIdentifiedFact<T>(fact,
+ retractedStack.push(new CauseIdentifiedFact<T>(fact,
ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
updateKnowledgeBaseWithConclusion();
}
@@ -191,7 +197,7 @@
final Set<IFact<T>> assertedSet = new HashSet<IFact<T>>();
final Set<IFact<T>> retractedSet = new HashSet<IFact<T>>();
- CauseIdentifiedFact<T> asserted = assertedStack.poll();
+ CauseIdentifiedFact<T> asserted = assertedStackPoll();
CauseIdentifiedFact<T> retracted = retractedStack.poll();
while (asserted != null || retracted != null) {
if (retracted != null) {
@@ -217,8 +223,12 @@
retractedSet.add(retracted.getFact());
allKnowledgeBase.retractFactInFactSet(retracted);
+ if (asserted == null) {
+ asserted = assertedStackPoll();
+ }
retracted = retractedStack.poll();
} else if (asserted != null) {
+
if (retractedStack.contains(asserted)
|| asserted.equals(retracted)) {
throw new ReasonerException("asserted " + asserted
@@ -241,11 +251,25 @@
assertedSet.add(asserted.getFact());
allKnowledgeBase.assertFactInFactSet(asserted);
- asserted = assertedStack.poll();
+ asserted = assertedStackPoll();
+ if (retracted == null) {
+ retracted = retractedStack.poll();
+ }
}
}
}
+ private CauseIdentifiedFact<T> assertedStackPoll() {
+ CauseIdentifiedFact<T> asserted = assertedStack.poll();
+ if (asserted != null) {
+ final IFact<T> pattern = allKnowledgeBase.match(asserted);
+ if (pattern != null) {
+ conclusionViewRetraction(pattern);
+ }
+ }
+ return asserted;
+ }
+
@Override
public void conclusionAssertion(final CauseIdentifiedFact<T> fact) {
assertedStack.push(fact);
@@ -257,7 +281,7 @@
}
@Override
- public void conclusionViewRetraction(final CauseIdentifiedFact<T> fact) {
+ public void conclusionViewRetraction(final IFact<T> fact) {
final IKnowledgeBase<T> view = allKnowledgeBase.view(fact.getSubject(),
fact.getPredicate(), fact.getObject());
final Iterator<IFact<T>> iterator = view.iterator();
@@ -265,7 +289,7 @@
// conclusionRetraction(new CauseIdentifiedFact<T>(iterator.next(),
// fact.getRuleIdentifier()));
retractedStack.push(new CauseIdentifiedFact<T>(iterator.next(),
- fact.getRuleIdentifier()));
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -25,6 +25,7 @@
import java.util.List;
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.rule.AbstractReplaceConclusion;
@@ -47,8 +48,7 @@
this.replaceConclusion = replaceConclusion;
}
- protected CauseIdentifiedFact<T> toRetract(
- final CauseIdentifiedFact<T> createFact) {
+ protected IFact<T> toRetract(final CauseIdentifiedFact<T> createFact) {
final T subjectOfToRetract;
if (replaceConclusion.isSubjectReplacement()) {
subjectOfToRetract = null;
@@ -67,15 +67,13 @@
} else {
objectOfToRetract = createFact.getObject();
}
- final CauseIdentifiedFact<T> toRetract = new CauseIdentifiedFact<T>(
- subjectOfToRetract, predicateOfToRetract, objectOfToRetract,
- ReteRule.ANY_CAUSE_RULE_IDENTIFIER);
- return toRetract;
+ return new Fact<T>(subjectOfToRetract, predicateOfToRetract,
+ objectOfToRetract);
}
protected void addedImpl(final List<T> value, final IFact<T> cause) {
final CauseIdentifiedFact<T> createFact = createFact(value);
- final CauseIdentifiedFact<T> toRetract = toRetract(createFact);
+ final IFact<T> toRetract = toRetract(createFact);
if (logger.isDebugEnabled()) {
logger.debug("retraction of " + toRetract + " to "
+ listener.getClass().getName() + "\n cause by " + cause);
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -23,6 +23,7 @@
package net.sf.reasoner4j.rete.entity;
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.IFact;
/**
*
@@ -36,5 +37,5 @@
void conclusionRetraction(CauseIdentifiedFact<T> fact);
- void conclusionViewRetraction(CauseIdentifiedFact<T> fact);
+ void conclusionViewRetraction(IFact<T> fact);
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -23,17 +23,21 @@
package net.sf.reasoner4j;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.FactMask;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
import net.sf.reasoner4j.motor.IMotor;
import net.sf.reasoner4j.motor.MotorFactory;
import net.sf.reasoner4j.rule.AssertConclusion;
+import net.sf.reasoner4j.rule.IConclusion;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
+import net.sf.reasoner4j.rule.ReplaceConclusion;
import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
@@ -212,7 +216,7 @@
assertNull(kb.get("myCar", "state", "ko"));
}
- public void testRetract() {
+ public void testRetractVersus() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
final IKnowledgeBase<String> kb = kbFactory.create();
@@ -246,4 +250,67 @@
assertNull(kb.get("food", "available", "gateau"));
}
+ public void testReplaceVersusReplaceConclusion() {
+ testReplace(false);
+ }
+
+ public void testReplaceVersusFactMask() {
+ testReplace(true);
+ }
+
+ private void testReplace(final boolean useMask) {
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this);
+ if (useMask) {
+ motor.addFactMask(new FactMask<String>("food",
+ true/* subjectIsKey */, "lastEaten",
+ true/* predicateIsKey */, null/* object */, false/* objectIsKey */));
+ }
+ Rule<String> rule = new Rule<String>();
+ final IPremise<String> premise = new Premise<String>(
+ /* subject */"?X", null,
+ /* predicate */null, "eats",
+ /* object */"?F", null);
+ rule.addPremise(premise);
+ IConclusion<String> conclusion;
+ if (useMask) {
+ conclusion = new AssertConclusion<String>(
+ /* subject */null, "food",
+ /* predicate */null, "lastEaten",
+ /* object */"?F", null);
+ } else {
+ conclusion = new ReplaceConclusion<String>(
+ /* subject */null, "food", false,
+ /* predicate */null, "lastEaten", false,
+ /* object */"?F", null, true);
+ }
+ rule.addConclusion(conclusion);
+ motor.addRule(rule);
+
+ motor.assertFact(new Fact<String>("food", "available", "saucisson"));
+ motor.assertFact(new Fact<String>("food", "available", "patates"));
+ motor.assertFact(new Fact<String>("food", "available", "gateau"));
+
+ assertNotNull(kb.get("food", "available", "saucisson"));
+ assertNotNull(kb.get("food", "available", "patates"));
+ assertNotNull(kb.get("food", "available", "gateau"));
+
+ Iterator<IFact<String>> iterator = kb.view("food", "lastEaten", null)
+ .iterator();
+ assertFalse(iterator.hasNext());
+
+ motor.assertFact(new Fact<String>("theCat", "eats", "saucisson"));
+ iterator = kb.view("food", "lastEaten", null).iterator();
+ assertTrue(iterator.hasNext());
+ assertEquals("saucisson", iterator.next().getObject());
+ assertFalse(iterator.hasNext());
+
+ motor.assertFact(new Fact<String>("theDog", "eats", "gateau"));
+ iterator = kb.view("food", "lastEaten", null).iterator();
+ assertTrue(iterator.hasNext());
+ assertEquals("gateau", iterator.next().getObject());
+ assertFalse(iterator.hasNext());
+ }
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -60,7 +60,7 @@
private static final Logger LOGGER = Logger
.getLogger(TestExpressionCompute.class);
- public void testListInListAndPropertySum() {
+ public void _testListInListAndPropertySum() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
final IKnowledgeBase<String> kb = kbFactory.create();
@@ -125,13 +125,16 @@
motor.assertFact(new Fact<String>("truc", "value", "5"));
assertList(builtinSupport, new String[] { "5" });
- // assertSum(builtinSupport, "5");
+ // FIXMELUC _sum is not updated when list change
+ // assertSum(builtinSupport, "5.0");
motor.assertFact(new Fact<String>("truc", "value", "7"));
assertList(builtinSupport, new String[] { "7", "5" });
- // assertSum(builtinSupport, "12");
+ // FIXMELUC _sum is not updated when list change
+ // assertSum(builtinSupport, "12.0");
motor.retractFact(new Fact<String>("truc", "value", "5"));
- // assertSum(builtinSupport, "7");
assertList(builtinSupport, new String[] { "7" });
+ // FIXMELUC _sum is not updated when list change
+ // assertSum(builtinSupport, "7.0");
}
private void assertList(final BuiltinSupport<String> builtinSupport,
@@ -158,7 +161,6 @@
}
}
- @SuppressWarnings("unused")
private void assertSum(final BuiltinSupport<String> builtinSupport,
final String expected) {
final String sum = builtinSupport.getObject("result", "sum", false);
@@ -360,6 +362,7 @@
}
assertValueList(builtinSupport, new String[] { "5" });
logSum(builtinSupport, "(5)");
+ assertSum(builtinSupport, "5.0");
// second assert
motor.assertFact(new Fact<String>("truc2", "value", "7"));
@@ -368,6 +371,7 @@
}
assertValueList(builtinSupport, new String[] { "7", "5" });
logSum(builtinSupport, "(7,5)");
+ assertSum(builtinSupport, "12.0");
// third assert
motor.assertFact(new Fact<String>("truc3", "value", "8"));
@@ -376,11 +380,13 @@
}
assertValueList(builtinSupport, new String[] { "8", "7", "5" });
logSum(builtinSupport, "(8,7,5)");
+ assertSum(builtinSupport, "20.0");
// retract second assertion
motor.retractFact(new Fact<String>("truc2", "value", "7"));
logSum(builtinSupport, "(8,5)");
assertValueList(builtinSupport, new String[] { "8", "5" });
+ assertSum(builtinSupport, "13.0");
}
private void assertValueList(final BuiltinSupport<String> builtinSupport,
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java 2011-01-07 05:51:01 UTC (rev 56)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java 2011-01-07 17:34:38 UTC (rev 57)
@@ -98,7 +98,7 @@
}
@Override
- public void conclusionViewRetraction(final CauseIdentifiedFact<String> fact) {
+ public void conclusionViewRetraction(final IFact<String> fact) {
// // FIXMELUC test with replacement conclusion
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2011-01-07 05:51:07
|
Revision: 56
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=56&view=rev
Author: luc_peuvrier
Date: 2011-01-07 05:51:01 +0000 (Fri, 07 Jan 2011)
Log Message:
-----------
fact pattern feature added
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
trunk/reasoner4j/src/test/resources/log4j.properties
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -41,6 +41,8 @@
private Exception closeTrace;
+ protected boolean pattern;
+
public AbstractFactSet() {
super();
open = true;
@@ -112,6 +114,6 @@
@Override
public boolean isRemovable() {
assertOpen();
- return !hasListener() && isEmpty();
+ return !hasListener() && isEmpty() && !pattern;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -143,4 +143,11 @@
assertOpen();
return parentFactSet.removeFact(causeIdentifiedFact, doFire);
}
+
+ @Override
+ public String toString() {
+ return getClass().getName() + " [subject=" + getSubject()
+ + ", predicate=" + getPredicate() + ", object=" + getObject()
+ + "]";
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -383,4 +383,57 @@
}
return singleFactSet;
}
+
+ @Override
+ public void addFactPattern(final IFact<T> fact) {
+ assertOpen();
+ final T subject = fact.getSubject();
+ final T predicate = fact.getPredicate();
+ final T object = fact.getObject();
+ boolean added = false;
+ if (subject != null) {
+ final PredicateObjectOfSubject<T> predicateObjectOfSubject =
+ /**/predicateObjectOfSubjectGetOrCreate(subject);
+ predicateObjectOfSubject.addFactPattern(fact);
+ added = true;
+ }
+ if (predicate != null) {
+ final SubjectObjectOfPredicate<T> subjectObjectOfPredicate =
+ /**/subjectObjectOfPredicateGetOrCreate(predicate);
+ subjectObjectOfPredicate.addFactPattern(fact);
+ added = true;
+ }
+ if (object == null) {
+ final SubjectPredicateOfObject<T> subjectPredicateOfObject =
+ /**/subjectPredicateOfObjectGetOrCreate(object);
+ subjectPredicateOfObject.addFactPattern(fact);
+ added = true;
+ }
+ if (!added) {
+ throw new ReasonerException("can not fact pattern " + fact);
+ }
+ }
+
+ @Override
+ public boolean match(IFact<T> fact) {
+ boolean match;
+ IFactSet<T> factSet;
+ assertOpen();
+ final T subject = fact.getSubject();
+ factSet = predicateObjectBySubjectMap.get(subject);
+ if (factSet != null && factSet.match(fact)) {
+ match = true;
+ } else {
+ final T predicate = fact.getPredicate();
+ factSet = subjectObjectByPredicateMap.get(predicate);
+ if (factSet != null && factSet.match(fact)) {
+ match = true;
+ } else {
+ final T object = fact.getObject();
+ factSet = subjectPredicateByObjectMap.get(object);
+ match = factSet != null && factSet.match(fact);
+ }
+ }
+ return match;
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -29,7 +29,7 @@
* @author luc peuvrier
*
*/
-public class CauseIdentifiedFact<T> {
+public class CauseIdentifiedFact<T> implements IFact<T> {
private final static Logger LOGGER = Logger
.getLogger(CauseIdentifiedFact.class);
@@ -62,14 +62,17 @@
return fact;
}
+ @Override
public T getSubject() {
return fact.getSubject();
}
+ @Override
public T getPredicate() {
return fact.getPredicate();
}
+ @Override
public T getObject() {
return fact.getObject();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -71,4 +71,8 @@
* @return true if removable
*/
boolean isRemovable();
+
+ void addFactPattern(IFact<T> fact);
+
+ boolean match(IFact<T> fact);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -26,6 +26,8 @@
import java.util.Iterator;
import java.util.Map;
+import net.sf.reasoner4j.ReasonerException;
+
/**
*
* @author luc peuvrier
@@ -172,4 +174,32 @@
assertOpen();
return new FactIterator<T>(factByObjectMap);
}
+
+ @Override
+ public void addFactPattern(final IFact<T> fact) {
+ assert subject.equals(fact.getSubject())
+ && predicate.equals(fact.getPredicate());
+ assertOpen();
+ if (fact.getObject() != null) {
+ throw new ReasonerException("can not add pattern " + fact + " to "
+ + toString());
+ }
+ pattern = true;
+ }
+
+ @Override
+ public boolean match(final IFact<T> fact) {
+ assert subject.equals(fact.getSubject())
+ && predicate.equals(fact.getPredicate());
+ assertOpen();
+ boolean match;
+ if (pattern) {
+ match = true;
+ } else {
+ final T object = fact.getObject();
+ final IFactSet<T> factSet = factByObjectMap.get(object);
+ match = factSet != null && factSet.match(fact);
+ }
+ return match;
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -223,4 +223,50 @@
assertOpen();
return new FactIterator<T>(objectOfSubjectPredicateByPredicateMap);
}
+
+ @Override
+ public void addFactPattern(final IFact<T> fact) {
+ assert subject.equals(fact.getSubject());
+ assertOpen();
+ boolean added = false;
+ final T predicate = fact.getPredicate();
+ if (predicate != null) {
+ final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
+ /**/objectOfSubjectPredicateGetOrCreate(predicate);
+ objectOfSubjectPredicate.addFactPattern(fact);
+ added = true;
+ }
+ final T object = fact.getObject();
+ if (object != null) {
+ final PredicateOfSubjectObject<T> predicateOfSubjectObject =
+ /**/predicateOfSubjectObjectGetOrCreate(object);
+ predicateOfSubjectObject.addFactPattern(fact);
+ added = true;
+ }
+ if (!added) {
+ pattern = true;
+ }
+ }
+
+ @Override
+ public boolean match(final IFact<T> fact) {
+ assert subject.equals(fact.getSubject());
+ assertOpen();
+ boolean match;
+ if (pattern) {
+ match = true;
+ } else {
+ IFactSet<T> factSet;
+ final T predicate = fact.getPredicate();
+ factSet = objectOfSubjectPredicateByPredicateMap.get(predicate);
+ if (factSet != null && factSet.match(fact)) {
+ match = true;
+ } else {
+ final T object = fact.getObject();
+ factSet = predicateOfSubjectObjectByObjectMap.get(object);
+ match = factSet != null && factSet.match(fact);
+ }
+ }
+ return match;
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -26,6 +26,8 @@
import java.util.Iterator;
import java.util.Map;
+import net.sf.reasoner4j.ReasonerException;
+
/**
*
* @author luc peuvrier
@@ -171,4 +173,32 @@
assertOpen();
return new FactIterator<T>(factByPredicate);
}
+
+ @Override
+ public void addFactPattern(final IFact<T> fact) {
+ assert subject.equals(fact.getSubject())
+ && object.equals(fact.getObject());
+ assertOpen();
+ if (fact.getObject() != null) {
+ throw new ReasonerException("can not add pattern " + fact + " to "
+ + toString());
+ }
+ pattern = true;
+ }
+
+ @Override
+ public boolean match(final IFact<T> fact) {
+ assert subject.equals(fact.getSubject())
+ && object.equals(fact.getObject());
+ assertOpen();
+ boolean match;
+ if (pattern) {
+ match = true;
+ } else {
+ final T predicate = fact.getPredicate();
+ final IFactSet<T> factSet = factByPredicate.get(predicate);
+ match = factSet != null && factSet.match(fact);
+ }
+ return match;
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -223,6 +223,24 @@
}
@Override
+ public void addFactPattern(final IFact<T> fact) {
+ assert subject.equals(fact.getSubject())
+ && predicate.equals(fact.getPredicate())
+ && object.equals(fact.getObject());
+ assertOpen();
+ pattern = true;
+ }
+
+ @Override
+ public boolean match(final IFact<T> fact) {
+ assert subject.equals(fact.getSubject())
+ && predicate.equals(fact.getPredicate())
+ && object.equals(fact.getObject());
+ assertOpen();
+ return pattern;
+ }
+
+ @Override
public String toString() {
return "SingleFactSet [subject=" + subject + ", predicate=" + predicate
+ ", object=" + object + ", ruleIdentifierSet="
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -45,7 +45,7 @@
/**/new HashMap<T/* S */, IFactSet<T>>();
// o -> s(p,o) SubjectOfPredicateObject
- private final Map<T/* O */, SubjectOfPredicateObject<T>> subjectOfPredicateObjectByPredicateMap =
+ private final Map<T/* O */, SubjectOfPredicateObject<T>> subjectOfPredicateObjectByObjectMap =
/**/new HashMap<T/* O */, SubjectOfPredicateObject<T>>();
public SubjectObjectOfPredicate(final ISubFactSet<T> parentFactSet,
@@ -89,11 +89,11 @@
private SubjectOfPredicateObject<T> subjectOfPredicateObjectGetOrCreate(
final T object) {
SubjectOfPredicateObject<T> subjectOfPredicateObject =
- /**/subjectOfPredicateObjectByPredicateMap.get(object);
+ /**/subjectOfPredicateObjectByObjectMap.get(object);
if (subjectOfPredicateObject == null) {
subjectOfPredicateObject = new SubjectOfPredicateObject<T>(
parentFactSet, predicate, object);
- subjectOfPredicateObjectByPredicateMap.put(object,
+ subjectOfPredicateObjectByObjectMap.put(object,
subjectOfPredicateObject);
}
return subjectOfPredicateObject;
@@ -138,12 +138,12 @@
}
final T object = singleFactSet.getObject();
SubjectOfPredicateObject<T> subjectOfPredicateObject =
- /**/subjectOfPredicateObjectByPredicateMap.get(object);
+ /**/subjectOfPredicateObjectByObjectMap.get(object);
if (subjectOfPredicateObject != null) {
removed = subjectOfPredicateObject.removeFact(singleFactSet, fact,
doFire);
if (subjectOfPredicateObject.isRemovable()) {
- subjectOfPredicateObjectByPredicateMap.remove(object).close();
+ subjectOfPredicateObjectByObjectMap.remove(object).close();
}
}
if (removed && doFire) {
@@ -156,7 +156,7 @@
public boolean isEmpty() {
assertOpen();
return objectOfSubjectPredicateBySubjectMap.isEmpty()
- && subjectOfPredicateObjectByPredicateMap.isEmpty();
+ && subjectOfPredicateObjectByObjectMap.isEmpty();
}
@Override
@@ -168,7 +168,7 @@
}
final T object = subFactSet.getObject();
if (object != null) {
- subjectOfPredicateObjectByPredicateMap.remove(object).close();
+ subjectOfPredicateObjectByObjectMap.remove(object).close();
}
if (isRemovable()) {
fireRemovable();
@@ -223,4 +223,50 @@
assertOpen();
return new FactIterator<T>(objectOfSubjectPredicateBySubjectMap);
}
+
+ @Override
+ public void addFactPattern(final IFact<T> fact) {
+ assert predicate.equals(fact.getPredicate());
+ assertOpen();
+ boolean added = false;
+ final T subject = fact.getSubject();
+ if (subject != null) {
+ final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
+ /**/objectOfSubjectPredicateGetOrCreate(subject);
+ objectOfSubjectPredicate.addFactPattern(fact);
+ added = true;
+ }
+ final T object = fact.getObject();
+ if (object != null) {
+ final SubjectOfPredicateObject<T> subjectOfPredicateObject =
+ /**/subjectOfPredicateObjectGetOrCreate(object);
+ subjectOfPredicateObject.addFactPattern(fact);
+ added = true;
+ }
+ if (!added) {
+ pattern = true;
+ }
+ }
+
+ @Override
+ public boolean match(final IFact<T> fact) {
+ assert predicate.equals(fact.getPredicate());
+ assertOpen();
+ boolean match;
+ if (pattern) {
+ match = true;
+ } else {
+ IFactSet<T> factSet;
+ final T subject = fact.getSubject();
+ factSet = objectOfSubjectPredicateBySubjectMap.get(subject);
+ if (factSet != null && factSet.match(fact)) {
+ match = true;
+ } else {
+ final T object = fact.getObject();
+ factSet = subjectOfPredicateObjectByObjectMap.get(object);
+ match = factSet != null && factSet.match(fact);
+ }
+ }
+ return match;
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -26,6 +26,8 @@
import java.util.Iterator;
import java.util.Map;
+import net.sf.reasoner4j.ReasonerException;
+
/**
*
* @author luc peuvrier
@@ -171,4 +173,32 @@
assertOpen();
return new FactIterator<T>(factBySubject);
}
+
+ @Override
+ public void addFactPattern(final IFact<T> fact) {
+ assert predicate.equals(fact.getPredicate())
+ && object.equals(fact.getObject());
+ assertOpen();
+ if (fact.getObject() != null) {
+ throw new ReasonerException("can not add pattern " + fact + " to "
+ + toString());
+ }
+ pattern = true;
+ }
+
+ @Override
+ public boolean match(final IFact<T> fact) {
+ assert predicate.equals(fact.getPredicate())
+ && object.equals(fact.getObject());
+ assertOpen();
+ boolean match;
+ if (pattern) {
+ match = true;
+ } else {
+ final T subject = fact.getSubject();
+ final IFactSet<T> factSet = factBySubject.get(subject);
+ match = factSet != null && factSet.match(fact);
+ }
+ return match;
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2011-01-07 05:51:01 UTC (rev 56)
@@ -223,4 +223,50 @@
assertOpen();
return new FactIterator<T>(predicateOfSubjectObjectBySubjectMap);
}
+
+ @Override
+ public void addFactPattern(final IFact<T> fact) {
+ assert object.equals(fact.getObject());
+ assertOpen();
+ boolean added = false;
+ final T subject = fact.getSubject();
+ if (subject != null) {
+ final PredicateOfSubjectObject<T> predicateOfSubjectObject =
+ /**/predicateOfSubjectObjectGetOrCreate(subject);
+ predicateOfSubjectObject.addFactPattern(fact);
+ added = true;
+ }
+ final T predicate = fact.getPredicate();
+ if (predicate != null) {
+ final SubjectOfPredicateObject<T> subjectOfPredicateObject =
+ /**/subjectOfPredicateObjectGetOrCreate(predicate);
+ subjectOfPredicateObject.addFactPattern(fact);
+ added = true;
+ }
+ if (!added) {
+ pattern = true;
+ }
+ }
+
+ @Override
+ public boolean match(final IFact<T> fact) {
+ assert object.equals(fact.getObject());
+ assertOpen();
+ boolean match;
+ if (pattern) {
+ match = true;
+ } else {
+ IFactSet<T> factSet;
+ final T subject = fact.getSubject();
+ factSet = predicateOfSubjectObjectBySubjectMap.get(subject);
+ if (factSet != null && factSet.match(fact)) {
+ match = true;
+ } else {
+ final T predicate = fact.getPredicate();
+ factSet = subjectOfPredicateObjectByPredicateMap.get(predicate);
+ match = factSet != null && factSet.match(fact);
+ }
+ }
+ return match;
+ }
}
Modified: trunk/reasoner4j/src/test/resources/log4j.properties
===================================================================
--- trunk/reasoner4j/src/test/resources/log4j.properties 2011-01-07 04:28:39 UTC (rev 55)
+++ trunk/reasoner4j/src/test/resources/log4j.properties 2011-01-07 05:51:01 UTC (rev 56)
@@ -23,7 +23,7 @@
#log4j.logger.net.sf.reasoner4j.TestExistential=debug
#log4j.logger.net.sf.reasoner4j.TestBasicInference=debug
#log4j.logger.net.sf.reasoner4j.TestBuiltin=debug
-log4j.logger.net.sf.reasoner4j.TestExpressionCompute=debug
+#log4j.logger.net.sf.reasoner4j.TestExpressionCompute=debug
#log4j.logger.net.sf.reasoner4j.motor.Motor=debug
#log4j.logger.net.sf.reasoner4j.rete.entity.AffectConclusionNotifier=debug
@@ -32,4 +32,4 @@
#log4j.logger.net.sf.reasoner4j.rete.entity.RetractConclusionNotifier=debug
#log4j.logger.net.sf.reasoner4j.fact.AllFactSet=debug
-log4j.logger.net.sf.reasoner4j.fact.CauseIdentifiedFact=debug
+#log4j.logger.net.sf.reasoner4j.fact.CauseIdentifiedFact=debug
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2011-01-07 04:28:46
|
Revision: 55
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=55&view=rev
Author: luc_peuvrier
Date: 2011-01-07 04:28:39 +0000 (Fri, 07 Jan 2011)
Log Message:
-----------
added missing assertion fact set is opened
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -39,6 +39,8 @@
private boolean open;
+ private Exception closeTrace;
+
public AbstractFactSet() {
super();
open = true;
@@ -70,16 +72,18 @@
protected void assertOpen() {
if (!open) {
- throw new ReasonerException("fact set closed");
+ throw new ReasonerException("fact set closed", closeTrace);
}
}
@Override
public void close() {
if (open) {
+ assert isRemovable();
open = false;
+ closeTrace = new Exception("close trace");
} else {
- throw new ReasonerException("fact set closed");
+ throw new ReasonerException("fact set closed", closeTrace);
}
}
@@ -95,16 +99,19 @@
@Override
public boolean contains(final IFact<T> fact) {
+ assertOpen();
return get(fact.getSubject(), fact.getPredicate(), fact.getObject()) != null;
}
@Override
public boolean contains(T subject, T predicate, T object) {
+ assertOpen();
return get(subject, predicate, object) != null;
}
@Override
public boolean isRemovable() {
+ assertOpen();
return !hasListener() && isEmpty();
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -44,17 +44,20 @@
@Override
public SingleFactSet<T> getOrCreateSingleFactSet(final T subject,
final T predicate, final T object) {
+ assertOpen();
return parentFactSet.getOrCreateSingleFactSet(subject, predicate,
object);
}
@Override
public void assertFact(final CauseIdentifiedFact<T> fact) {
+ assertOpen();
parentFactSet.assertFact(fact);
}
@Override
public void retractFact(final CauseIdentifiedFact<T> fact) {
+ assertOpen();
parentFactSet.retractFact(fact);
}
@@ -66,24 +69,28 @@
@Override
public T getSubject() {
+ assertOpen();
// by default no subject defined
return null;
}
@Override
public T getPredicate() {
+ assertOpen();
// by default no predicate defined
return null;
}
@Override
public T getObject() {
+ assertOpen();
// by default no object defined
return null;
}
@Override
public void fireAsserted(final CauseIdentifiedFact<T> fact) {
+ assertOpen();
try {
if (!listenerSet.isEmpty()) {
for (IFactSetListener<T> listener : listenerSet) {
@@ -99,6 +106,7 @@
public void fireRetracted(final CauseIdentifiedFact<T> fact) {
try {
if (!listenerSet.isEmpty()) {
+ assertOpen();
for (IFactSetListener<T> listener : listenerSet) {
listener.retracted(fact.getFact());
}
@@ -111,24 +119,28 @@
@Override
public void fireAsserted(ISubFactSet<T> subFactSet,
CauseIdentifiedFact<T> fact) {
+ assertOpen();
parentFactSet.fireAsserted(subFactSet, fact);
}
@Override
public void fireRetracted(ISubFactSet<T> subFactSet,
CauseIdentifiedFact<T> fact) {
+ assertOpen();
parentFactSet.fireRetracted(subFactSet, fact);
}
@Override
public boolean addFact(final CauseIdentifiedFact<T> fact,
final boolean doFire) {
+ assertOpen();
return parentFactSet.addFact(fact, doFire);
}
@Override
public boolean removeFact(CauseIdentifiedFact<T> causeIdentifiedFact,
boolean doFire) {
+ assertOpen();
return parentFactSet.removeFact(causeIdentifiedFact, doFire);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -99,12 +99,14 @@
@Override
public void fireAsserted(final ISubFactSet<T> subFactSet,
CauseIdentifiedFact<T> fact) {
+ assertOpen();
toAssertSubFactSetList.add(new ToFireFact<T>(subFactSet, fact));
}
@Override
public boolean addFact(final CauseIdentifiedFact<T> fact,
final boolean doFire) {
+ assertOpen();
SingleFactSet<T> singleFactSet = getOrCreateSingleFactSet(fact
.getFact());
final boolean added;
@@ -185,12 +187,14 @@
@Override
public void fireRetracted(final ISubFactSet<T> subFactSet,
final CauseIdentifiedFact<T> fact) {
+ assertOpen();
toRetractSubFactSetList.add(new ToFireFact<T>(subFactSet, fact));
}
@Override
public boolean removeFact(final CauseIdentifiedFact<T> causeIdentifiedFact,
final boolean doFire) {
+ assertOpen();
final IFact<T> fact = causeIdentifiedFact.getFact();
final SingleFactSet<T> singleFactSet = singleFacSetMap.get(fact);
boolean removed = false;
@@ -198,10 +202,6 @@
// throw new ReasonerException("no single fact set for " + fact);
// FIXMELUC _for TestExpressionCompute
} else if (singleFactSet.removeFact(causeIdentifiedFact, doFire)) {
- if (singleFactSet.isRemovable()) {
- singleFacSetMap.remove(fact);
- singleFactSet.close();
- }
final T subject = causeIdentifiedFact.getSubject();
final T predicate = causeIdentifiedFact.getPredicate();
final T object = causeIdentifiedFact.getObject();
@@ -232,6 +232,10 @@
subjectPredicateByObjectMap.remove(object).close();
}
}
+ if (singleFactSet.isRemovable()) {
+ singleFacSetMap.remove(fact);
+ singleFactSet.close();
+ }
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("removed=" + removed + " " + fact + " doFire="
@@ -242,6 +246,7 @@
@Override
public boolean isEmpty() {
+ assertOpen();
return predicateObjectBySubjectMap.isEmpty()
&& subjectObjectByPredicateMap.isEmpty()
&& subjectPredicateByObjectMap.isEmpty();
@@ -254,6 +259,7 @@
@Override
public void fireRemovable(final ISubFactSet<T> subFactSet) {
+ assertOpen();
final T subject = subFactSet.getSubject();
if (subject != null) {
predicateObjectBySubjectMap.remove(subject).close();
@@ -269,21 +275,6 @@
}
@Override
- public T getSubject() {
- return null;
- }
-
- @Override
- public T getPredicate() {
- return null;
- }
-
- @Override
- public T getObject() {
- return null;
- }
-
- @Override
public IFact<T> get(final T subject, final T predicate, final T object) {
assertOpen();
final PredicateObjectOfSubject<T> predicateObjectOfSubject =
@@ -332,14 +323,8 @@
/**/predicateObjectOfSubjectGetOrCreate(subject);
subFactSet = x.view(subject, predicate, object);
} else { // S P O
- final SingleFactSet<T> singleFactSet = singleFacSetMap
- .get(new Fact<T>(subject, predicate, object));
- if (singleFactSet == null) {
- subFactSet = new SingleFactSet<T>(this, subject,
- predicate, object);
- } else {
- subFactSet = singleFactSet;
- }
+ subFactSet = getOrCreateSingleFactSet(subject, predicate,
+ object);
}
}
}
@@ -370,12 +355,14 @@
@Override
public Iterator<IFact<T>> iterator() {
+ assertOpen();
return new FactIterator<T>(predicateObjectBySubjectMap);
}
@Override
public SingleFactSet<T> getOrCreateSingleFactSet(final T subject,
final T predicate, final T object) {
+ assertOpen();
final IFact<T> fact = new Fact<T>(subject, predicate, object);
SingleFactSet<T> singleFactSet = singleFacSetMap.get(fact);
if (singleFactSet == null) {
@@ -387,6 +374,7 @@
}
public SingleFactSet<T> getOrCreateSingleFactSet(final IFact<T> fact) {
+ assertOpen();
SingleFactSet<T> singleFactSet = singleFacSetMap.get(fact);
if (singleFactSet == null) {
singleFactSet = new SingleFactSet<T>(this, fact.getSubject(),
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -53,11 +53,13 @@
@Override
public T getSubject() {
+ assertOpen();
return subject;
}
@Override
public T getPredicate() {
+ assertOpen();
return predicate;
}
@@ -73,6 +75,7 @@
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject())
&& predicate.equals(singleFactSet.getPredicate());
+ assertOpen();
final T object = singleFactSet.getObject();
final boolean added;
final SingleFactSet<T> existingSingleFactSet = (SingleFactSet<T>) factByObjectMap
@@ -102,6 +105,7 @@
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject())
&& predicate.equals(singleFactSet.getPredicate());
+ assertOpen();
final T object = singleFactSet.getObject();
final SingleFactSet<T> x = (SingleFactSet<T>) factByObjectMap
.remove(object);
@@ -119,11 +123,13 @@
@Override
public boolean isEmpty() {
+ assertOpen();
return factByObjectMap.isEmpty();
}
@Override
public void fireRemovable(final ISubFactSet<T> subFactSet) {
+ assertOpen();
final T object = subFactSet.getObject();
if (object != null) {
factByObjectMap.remove(object).close();
@@ -163,6 +169,7 @@
@Override
public Iterator<IFact<T>> iterator() {
+ assertOpen();
return new FactIterator<T>(factByObjectMap);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -56,6 +56,7 @@
@Override
public T getSubject() {
+ assertOpen();
return subject;
}
@@ -69,6 +70,7 @@
public boolean addFact(final SingleFactSet<T> singleFactSet,
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject());
+ assertOpen();
final T predicate = singleFactSet.getPredicate();
final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
/**/objectOfSubjectPredicateGetOrCreate(predicate);
@@ -121,6 +123,7 @@
public boolean removeFact(final SingleFactSet<T> singleFactSet,
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert singleFactSet.getSubject().equals(subject);
+ assertOpen();
final T predicate = singleFactSet.getPredicate();
boolean removed = false;
ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
@@ -152,12 +155,14 @@
@Override
public boolean isEmpty() {
+ assertOpen();
return objectOfSubjectPredicateByPredicateMap.isEmpty()
&& predicateOfSubjectObjectByObjectMap.isEmpty();
}
@Override
public void fireRemovable(final ISubFactSet<T> subFactSet) {
+ assertOpen();
final T predicate = subFactSet.getPredicate();
if (predicate != null) {
objectOfSubjectPredicateByPredicateMap.remove(predicate).close();
@@ -215,6 +220,7 @@
@Override
public Iterator<IFact<T>> iterator() {
+ assertOpen();
return new FactIterator<T>(objectOfSubjectPredicateByPredicateMap);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -53,11 +53,13 @@
@Override
public T getSubject() {
+ assertOpen();
return subject;
}
@Override
public T getObject() {
+ assertOpen();
return object;
}
@@ -73,6 +75,7 @@
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject())
&& object.equals(singleFactSet.getObject());
+ assertOpen();
final T predicate = singleFactSet.getPredicate();
final boolean added;
final SingleFactSet<T> existingSingleFactSet = (SingleFactSet<T>) factByPredicate
@@ -101,6 +104,7 @@
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject())
&& object.equals(singleFactSet.getObject());
+ assertOpen();
final T predicate = singleFactSet.getPredicate();
final SingleFactSet<T> x = (SingleFactSet<T>) factByPredicate
.remove(predicate);
@@ -118,11 +122,13 @@
@Override
public boolean isEmpty() {
+ assertOpen();
return factByPredicate.isEmpty();
}
@Override
public void fireRemovable(final ISubFactSet<T> subFactSet) {
+ assertOpen();
final T predicate = subFactSet.getPredicate();
if (predicate != null) {
factByPredicate.remove(predicate).close();
@@ -162,6 +168,7 @@
@Override
public Iterator<IFact<T>> iterator() {
+ assertOpen();
return new FactIterator<T>(factByPredicate);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -58,16 +58,19 @@
@Override
public T getSubject() {
+ assertOpen();
return subject;
}
@Override
public T getPredicate() {
+ assertOpen();
return predicate;
}
@Override
public T getObject() {
+ assertOpen();
return object;
}
@@ -85,6 +88,7 @@
assert subject.equals(fact.getSubject())
&& predicate.equals(fact.getPredicate())
&& object.equals(fact.getObject());
+ assertOpen();
addRuleIdentifier(fact.getRuleIdentifier());
final boolean added;
if (this.fact == null) {
@@ -120,6 +124,7 @@
assert subject.equals(causeIdentifiedFact.getSubject())
&& predicate.equals(causeIdentifiedFact.getPredicate())
&& object.equals(causeIdentifiedFact.getObject());
+ assertOpen();
final boolean removed;
if (this.fact == null) {
removed = false;
@@ -159,6 +164,7 @@
@Override
public boolean isEmpty() {
+ assertOpen();
return fact == null;
}
@@ -212,6 +218,7 @@
@Override
public Iterator<IFact<T>> iterator() {
+ assertOpen();
return new SelectionIterator();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -56,6 +56,7 @@
@Override
public T getPredicate() {
+ assertOpen();
return predicate;
}
@@ -69,6 +70,7 @@
public boolean addFact(final SingleFactSet<T> singleFactSet,
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert predicate.equals(singleFactSet.getPredicate());
+ assertOpen();
final T subject = singleFactSet.getSubject();
final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
/**/objectOfSubjectPredicateGetOrCreate(subject);
@@ -121,6 +123,7 @@
public boolean removeFact(final SingleFactSet<T> singleFactSet,
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert singleFactSet.getPredicate().equals(predicate);
+ assertOpen();
boolean removed = false;
final T subject = singleFactSet.getSubject();
final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
@@ -151,12 +154,14 @@
@Override
public boolean isEmpty() {
+ assertOpen();
return objectOfSubjectPredicateBySubjectMap.isEmpty()
&& subjectOfPredicateObjectByPredicateMap.isEmpty();
}
@Override
public void fireRemovable(final ISubFactSet<T> subFactSet) {
+ assertOpen();
final T subject = subFactSet.getSubject();
if (subject != null) {
objectOfSubjectPredicateBySubjectMap.remove(subject).close();
@@ -215,6 +220,7 @@
@Override
public Iterator<IFact<T>> iterator() {
+ assertOpen();
return new FactIterator<T>(objectOfSubjectPredicateBySubjectMap);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -53,11 +53,13 @@
@Override
public T getPredicate() {
+ assertOpen();
return predicate;
}
@Override
public T getObject() {
+ assertOpen();
return object;
}
@@ -73,6 +75,7 @@
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert predicate.equals(singleFactSet.getPredicate())
&& object.equals(singleFactSet.getObject());
+ assertOpen();
final T subject = singleFactSet.getSubject();
final boolean added;
final SingleFactSet<T> existingSingleFactSet = (SingleFactSet<T>) factBySubject
@@ -101,6 +104,7 @@
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert predicate.equals(singleFactSet.getPredicate())
&& object.equals(singleFactSet.getObject());
+ assertOpen();
final T subject = singleFactSet.getSubject();
final SingleFactSet<T> x = (SingleFactSet<T>) factBySubject
.remove(subject);
@@ -118,11 +122,13 @@
@Override
public boolean isEmpty() {
+ assertOpen();
return factBySubject.isEmpty();
}
@Override
public void fireRemovable(final ISubFactSet<T> subFactSet) {
+ assertOpen();
final T subject = subFactSet.getSubject();
if (subject != null) {
factBySubject.remove(subject).close();
@@ -162,6 +168,7 @@
@Override
public Iterator<IFact<T>> iterator() {
+ assertOpen();
return new FactIterator<T>(factBySubject);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2011-01-07 03:48:34 UTC (rev 54)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2011-01-07 04:28:39 UTC (rev 55)
@@ -56,6 +56,7 @@
@Override
public T getObject() {
+ assertOpen();
return object;
}
@@ -69,6 +70,7 @@
public boolean addFact(final SingleFactSet<T> singleFactSet,
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert object.equals(singleFactSet.getObject());
+ assertOpen();
final T subject = singleFactSet.getSubject();
final PredicateOfSubjectObject<T> predicateOfSubjectObject =
/**/predicateOfSubjectObjectGetOrCreate(subject);
@@ -121,6 +123,7 @@
public boolean removeFact(final SingleFactSet<T> singleFactSet,
final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert singleFactSet.getObject().equals(object);
+ assertOpen();
boolean removed = false;
final T subject = singleFactSet.getSubject();
PredicateOfSubjectObject<T> objectOfSubjectPredicate =
@@ -152,12 +155,14 @@
@Override
public boolean isEmpty() {
+ assertOpen();
return predicateOfSubjectObjectBySubjectMap.isEmpty()
&& subjectOfPredicateObjectByPredicateMap.isEmpty();
}
@Override
public void fireRemovable(final ISubFactSet<T> subFactSet) {
+ assertOpen();
final T subject = subFactSet.getSubject();
if (subject != null) {
predicateOfSubjectObjectBySubjectMap.remove(subject).close();
@@ -215,6 +220,7 @@
@Override
public Iterator<IFact<T>> iterator() {
+ assertOpen();
return new FactIterator<T>(predicateOfSubjectObjectBySubjectMap);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2011-01-07 03:48:41
|
Revision: 54
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=54&view=rev
Author: luc_peuvrier
Date: 2011-01-07 03:48:34 +0000 (Fri, 07 Jan 2011)
Log Message:
-----------
isRemovable added in IFactSet
Modified Paths:
--------------
trunk/reasoner4j/doc/todo.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
Added Paths:
-----------
trunk/reasoner4j/doc/last_of_list.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/LogEqualsToBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/LogNotEqualsToBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultRuleDefinitionProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IRuleDefinitionProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListRuleDefinition.java
Added: trunk/reasoner4j/doc/last_of_list.txt
===================================================================
--- trunk/reasoner4j/doc/last_of_list.txt (rev 0)
+++ trunk/reasoner4j/doc/last_of_list.txt 2011-01-07 03:48:34 UTC (rev 54)
@@ -0,0 +1,25 @@
+?LL containsLastOfList ?L
+?LL listRest ?LR
+?LR logNotEquals nil
+=>
+?LR containsLastOfList ?L
+
+?LL containsLastOfList ?L
+?LL listRest ?LR
+?LR logEquals nil
+?LL listFirst ?E
+=>
+?LR lastOfList ?E (replace object)
+
+?L lastOfList ?E
+?L lastOfList ?CE (not listening, default nil object)
+?E logNotSameAs ?CE
+?LL containsLastOfList ?L
+?LL listRest ?LR
+?LR logEquals nil
+nil blankNode ?NLR
+=>
+?LL listRest ?NLR (replace object)
+?NLR listFirst ?E
+?NLR listRest nil
+
Modified: trunk/reasoner4j/doc/todo.txt
===================================================================
--- trunk/reasoner4j/doc/todo.txt 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/doc/todo.txt 2011-01-07 03:48:34 UTC (rev 54)
@@ -18,12 +18,6 @@
motor#addBuitinProvider
motor#defaultBuitinProvider(boolean enabled); //disabled by default
-to test
--------
-
-builtin mathSum
-builtin listAppend
-
inList builtin
--------------
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -29,6 +29,8 @@
*/
public final class TermIdentifierConstant {
+ public static final String NIL_IDENTIFIER = "nil";
+
public static final String EMPTY_TERM = "";
public static final String BLANK_NODE_PREDICATE_IDENTIFIER = "blankNode";
@@ -37,8 +39,10 @@
public static final String MATH_PRODUCT_PREDICATE_IDENTIFIER = "mathProduct";
- public static final String NIL_IDENTIFIER = "nil";
+ public static final String LOG_EQUALS_TO = "logEqualsTo";
+ public static final String LOG_NOT_EQUALS_TO = "logNotEqualsTo";
+
// FIXMELUC ListBuiltin no more needed
@Deprecated
public static final String LIST_PREDICATE_IDENTIFIER = "list";
@@ -53,6 +57,8 @@
public static final String LIST_REST_PREDICATE_IDENTIFIER = "listRest";
+ public static final String LAST_OF_LIST_PREDICATE_IDENTIFIER = "lastOfList";
+
private TermIdentifierConstant() {
super();
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/LogEqualsToBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/LogEqualsToBuiltin.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/LogEqualsToBuiltin.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.impl.log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.reasoner4j.ReasonerException;
+import net.sf.reasoner4j.builtin.TermIdentifierConstant;
+import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
+import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
+
+/**
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class LogEqualsToBuiltin<T> extends AbstractBuiltin<T> {
+
+ public LogEqualsToBuiltin() {
+ super(null, TermIdentifierConstant.LOG_EQUALS_TO, null);
+ }
+
+ @Override
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
+ final T predicate, final T object) {
+ if (subject == null) {
+ throw new ReasonerException("subject must be defined");
+ }
+ if (object == null) {
+ throw new ReasonerException("object must be defined");
+ }
+ final List<IFact<T>> resultFactList = new ArrayList<IFact<T>>(1);
+ final IFact<T> resultFact;
+ if (subject.equals(object)) {
+ resultFact = new Fact<T>(subject, predicate, object);
+ } else {
+ resultFact = null;
+ }
+ if (resultFact != null) {
+ resultFactList.add(resultFact);
+ }
+ return resultFactList;
+ }
+}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/LogNotEqualsToBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/LogNotEqualsToBuiltin.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/log/LogNotEqualsToBuiltin.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.impl.log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.reasoner4j.ReasonerException;
+import net.sf.reasoner4j.builtin.TermIdentifierConstant;
+import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
+import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
+
+/**
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class LogNotEqualsToBuiltin<T> extends AbstractBuiltin<T> {
+
+ public LogNotEqualsToBuiltin() {
+ super(null, TermIdentifierConstant.LOG_EQUALS_TO, null);
+ }
+
+ @Override
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
+ final T predicate, final T object) {
+ if (subject == null) {
+ throw new ReasonerException("subject must be defined");
+ }
+ if (object == null) {
+ throw new ReasonerException("object must be defined");
+ }
+ final List<IFact<T>> resultFactList = new ArrayList<IFact<T>>(1);
+ final IFact<T> resultFact;
+ if (subject.equals(object)) {
+ resultFact = null;
+ } else {
+ resultFact = new Fact<T>(subject, predicate, object);
+ }
+ if (resultFact != null) {
+ resultFactList.add(resultFact);
+ }
+ return resultFactList;
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -30,6 +30,8 @@
import net.sf.reasoner4j.builtin.impl.list.InListBuiltin;
import net.sf.reasoner4j.builtin.impl.list.ListAppendBuiltin;
import net.sf.reasoner4j.builtin.impl.list.ListRemoveBuiltin;
+import net.sf.reasoner4j.builtin.impl.log.LogEqualsToBuiltin;
+import net.sf.reasoner4j.builtin.impl.log.LogNotEqualsToBuiltin;
import net.sf.reasoner4j.builtin.impl.math.MathProductBuiltin;
import net.sf.reasoner4j.builtin.impl.math.MathSumBuiltin;
@@ -48,6 +50,8 @@
builtinList.add(new BlankNodeBuiltin<T>());
builtinList.add(new MathProductBuiltin<T>(builtinComputer));
builtinList.add(new MathSumBuiltin<T>(builtinComputer));
+ builtinList.add(new LogEqualsToBuiltin<T>());
+ builtinList.add(new LogNotEqualsToBuiltin<T>());
// FIXMELUC ListBuiltin no more needed
// builtinList.add(new ListBuiltin<T>());
builtinList.add(new InListBuiltin<T>());
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultRuleDefinitionProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultRuleDefinitionProvider.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultRuleDefinitionProvider.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2011 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.provider;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import net.sf.reasoner4j.builtin.ruledef.ListRuleDefinition;
+import net.sf.reasoner4j.rule.Rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class DefaultRuleDefinitionProvider<T> implements
+ IRuleDefinitionProvider<T> {
+
+ private List<Rule<T>> ruleList;
+
+ @Override
+ public List<Rule<T>> getRules(
+ final IBuitinTermProvider<T> buitinTermProvider) {
+ if (ruleList == null) {
+ ruleList = new LinkedList<Rule<T>>();
+ ruleList.addAll(new ListRuleDefinition<T>(buitinTermProvider));
+ }
+ return ruleList;
+ }
+}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IRuleDefinitionProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IRuleDefinitionProvider.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IRuleDefinitionProvider.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2011 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.provider;
+
+import java.util.List;
+
+import net.sf.reasoner4j.rule.Rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public interface IRuleDefinitionProvider<T> {
+
+ List<Rule<T>> getRules(IBuitinTermProvider<T> buitinTermProvider);
+}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListRuleDefinition.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListRuleDefinition.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/ruledef/ListRuleDefinition.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2011 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.ruledef;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.reasoner4j.builtin.TermIdentifierConstant;
+import net.sf.reasoner4j.builtin.provider.IBuitinTermProvider;
+import net.sf.reasoner4j.rule.AssertConclusion;
+import net.sf.reasoner4j.rule.IConclusion;
+import net.sf.reasoner4j.rule.IPremise;
+import net.sf.reasoner4j.rule.Premise;
+import net.sf.reasoner4j.rule.ReplaceConclusion;
+import net.sf.reasoner4j.rule.Rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class ListRuleDefinition<T> extends AbstractList<Rule<T>> {
+
+ private static final String CONTAINS_LAST_OF_LIST = "containsLastOfList";
+
+ private final List<Rule<T>> ruleList = new ArrayList<Rule<T>>();
+
+ public ListRuleDefinition(final IBuitinTermProvider<T> buitinTermProvider) {
+ super();
+ final T containsLastOfListTerm = buitinTermProvider
+ .getTerm(CONTAINS_LAST_OF_LIST);
+ final T listRestTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.LIST_REST_PREDICATE_IDENTIFIER);
+ final T listFirstTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.LIST_FIRST_PREDICATE_IDENTIFIER);
+ final T lastOfListTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.LAST_OF_LIST_PREDICATE_IDENTIFIER);
+ final T logEqualsToTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.LOG_EQUALS_TO);
+ final T logNotEqualsToTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.LOG_NOT_EQUALS_TO);
+ final T nilTerm = buitinTermProvider
+ .getTerm(TermIdentifierConstant.NIL_IDENTIFIER);
+
+ Rule<T> rule;
+ IPremise<T> premise;
+ IConclusion<T> conclusion;
+
+ // ?LL containsLastOfList ?L
+ // ?LL listRest ?LR
+ // ?LR logNotEquals nil
+ // =>
+ // ?LR containsLastOfList ?L
+
+ rule = new Rule<T>();
+
+ premise = new Premise<T>(
+ /* subject */"?LL", null,
+ /* predicate */null, containsLastOfListTerm,
+ /* object */"?L", null);
+ rule.addPremise(premise);
+
+ premise = new Premise<T>(
+ /* subject */"?LL", null,
+ /* predicate */null, listRestTerm,
+ /* object */"?LR", null);
+ rule.addPremise(premise);
+
+ premise = new Premise<T>(
+ /* subject */"?LL", null,
+ /* predicate */null, logNotEqualsToTerm,
+ /* object */null, nilTerm);
+ rule.addPremise(premise);
+
+ conclusion = new AssertConclusion<T>(
+ /* subject */"?LR", null,
+ /* predicate */null, containsLastOfListTerm,
+ /* object */"?L", null);
+ rule.addConclusion(conclusion);
+ ruleList.add(rule);
+
+ // ?LL containsLastOfList ?L
+ // ?LL listRest ?LR
+ // ?LR logEquals nil
+ // ?LL listFirst ?E
+ // =>
+ // ?LR lastOfList ?E (replace object)
+
+ rule = new Rule<T>();
+
+ premise = new Premise<T>(
+ /* subject */"?LL", null,
+ /* predicate */null, containsLastOfListTerm,
+ /* object */"?L", null);
+ rule.addPremise(premise);
+
+ premise = new Premise<T>(
+ /* subject */"?LL", null,
+ /* predicate */null, listRestTerm,
+ /* object */"?LR", null);
+ rule.addPremise(premise);
+
+ premise = new Premise<T>(
+ /* subject */"?LL", null,
+ /* predicate */null, logEqualsToTerm,
+ /* object */null, nilTerm);
+ rule.addPremise(premise);
+
+ premise = new Premise<T>(
+ /* subject */"?LL", null,
+ /* predicate */null, listFirstTerm,
+ /* object */"?E", null);
+ rule.addPremise(premise);
+
+ conclusion = new ReplaceConclusion<T>(
+ /* subject */"?LR", null, false,
+ /* predicate */null, lastOfListTerm, false,
+ /* object */"?E", null, true);
+ rule.addConclusion(conclusion);
+ ruleList.add(rule);
+
+ // ?L lastOfList ?E
+ // ?L lastOfList ?CE (not listening, default nil object)
+ // ?E logNotSameAs ?CE
+ // ?LL containsLastOfList ?L
+ // ?LL listRest ?LR
+ // ?LR logEquals nil
+ // nil blankNode ?NLR
+ // =>
+ // ?LL listRest ?NLR (replace object)
+ // ?NLR listFirst ?E
+ // ?NLR listRest nil
+
+ }
+
+ @Override
+ public Rule<T> get(final int index) {
+ return ruleList.get(index);
+ }
+
+ @Override
+ public int size() {
+ return ruleList.size();
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -52,8 +52,8 @@
@Override
public void removeListener(final IFactSetListener<T> listener) {
listenerSet.remove(listener);
- if (!hasListener() && isEmpty()) {
- fireNoListenerAndEmpty();
+ if (isRemovable()) {
+ fireRemovable();
}
}
@@ -61,7 +61,7 @@
* call when remove last listener of empty fact set, or remove last fact of
* fact set and has no listener
*/
- protected abstract void fireNoListenerAndEmpty();
+ protected abstract void fireRemovable();
@Override
public boolean hasListener() {
@@ -102,4 +102,9 @@
public boolean contains(T subject, T predicate, T object) {
return get(subject, predicate, object) != null;
}
+
+ @Override
+ public boolean isRemovable() {
+ return !hasListener() && isEmpty();
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -59,9 +59,9 @@
}
@Override
- protected void fireNoListenerAndEmpty() {
- // notify this is empty and has not listener, parent must clean itself
- parentFactSet.fireNoListenerAndEmpty(this);
+ protected void fireRemovable() {
+ // notify this is removable, parent must clean itself
+ parentFactSet.fireRemovable(this);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -198,7 +198,7 @@
// throw new ReasonerException("no single fact set for " + fact);
// FIXMELUC _for TestExpressionCompute
} else if (singleFactSet.removeFact(causeIdentifiedFact, doFire)) {
- if (!singleFactSet.hasListener() && singleFactSet.isEmpty()) {
+ if (singleFactSet.isRemovable()) {
singleFacSetMap.remove(fact);
singleFactSet.close();
}
@@ -210,8 +210,7 @@
if (predicateObjectOfSubject != null) {
removed = predicateObjectOfSubject.removeFact(singleFactSet,
causeIdentifiedFact, doFire);
- if (predicateObjectOfSubject.isEmpty()
- && !predicateObjectOfSubject.hasListener()) {
+ if (predicateObjectOfSubject.isRemovable()) {
predicateObjectBySubjectMap.remove(subject).close();
}
}
@@ -219,8 +218,7 @@
if (subjectObjectOfPredicate != null) {
removed = subjectObjectOfPredicate.removeFact(singleFactSet,
causeIdentifiedFact, doFire);
- if (subjectObjectOfPredicate.isEmpty()
- && !subjectObjectOfPredicate.hasListener()) {
+ if (subjectObjectOfPredicate.isRemovable()) {
subjectObjectByPredicateMap.remove(predicate).close();
}
}
@@ -230,7 +228,7 @@
&& !subjectPredicateOfObject.hasListener()) {
removed = subjectPredicateOfObject.removeFact(singleFactSet,
causeIdentifiedFact, doFire);
- if (subjectPredicateOfObject.isEmpty()) {
+ if (subjectPredicateOfObject.isRemovable()) {
subjectPredicateByObjectMap.remove(object).close();
}
}
@@ -250,12 +248,12 @@
}
@Override
- protected void fireNoListenerAndEmpty() {
+ protected void fireRemovable() {
// nothing to do, no parent sub fact set to clean
}
@Override
- public void fireNoListenerAndEmpty(final ISubFactSet<T> subFactSet) {
+ public void fireRemovable(final ISubFactSet<T> subFactSet) {
final T subject = subFactSet.getSubject();
if (subject != null) {
predicateObjectBySubjectMap.remove(subject).close();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -65,4 +65,10 @@
boolean removeFact(CauseIdentifiedFact<T> causeIdentifiedFact,
boolean doFire);
+ /**
+ * removable is has no listener and is empty
+ *
+ * @return true if removable
+ */
+ boolean isRemovable();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -32,7 +32,7 @@
SingleFactSet<T> getOrCreateSingleFactSet(T subject, T predicate, T object);
- void fireNoListenerAndEmpty(ISubFactSet<T> subFactSet);
+ void fireRemovable(ISubFactSet<T> subFactSet);
/**
*
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -123,12 +123,12 @@
}
@Override
- public void fireNoListenerAndEmpty(final ISubFactSet<T> subFactSet) {
+ public void fireRemovable(final ISubFactSet<T> subFactSet) {
final T object = subFactSet.getObject();
if (object != null) {
factByObjectMap.remove(object).close();
- if (isEmpty() && !hasListener()) {
- fireNoListenerAndEmpty();
+ if (isRemovable()) {
+ fireRemovable();
}
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -129,8 +129,7 @@
if (objectOfSubjectPredicate != null) {
removed = objectOfSubjectPredicate.removeFact(singleFactSet, fact,
doFire);
- if (objectOfSubjectPredicate.isEmpty()
- && !objectOfSubjectPredicate.hasListener()) {
+ if (objectOfSubjectPredicate.isRemovable()) {
objectOfSubjectPredicateByPredicateMap.remove(predicate)
.close();
}
@@ -141,8 +140,7 @@
if (predicateOfSubjectObject != null) {
removed = predicateOfSubjectObject.removeFact(singleFactSet, fact,
doFire);
- if (predicateOfSubjectObject.isEmpty()
- && !predicateOfSubjectObject.hasListener()) {
+ if (predicateOfSubjectObject.isRemovable()) {
predicateOfSubjectObjectByObjectMap.remove(object).close();
}
}
@@ -159,7 +157,7 @@
}
@Override
- public void fireNoListenerAndEmpty(final ISubFactSet<T> subFactSet) {
+ public void fireRemovable(final ISubFactSet<T> subFactSet) {
final T predicate = subFactSet.getPredicate();
if (predicate != null) {
objectOfSubjectPredicateByPredicateMap.remove(predicate).close();
@@ -168,8 +166,8 @@
if (object != null) {
predicateOfSubjectObjectByObjectMap.remove(object).close();
}
- if (isEmpty() && !hasListener()) {
- fireNoListenerAndEmpty();
+ if (isRemovable()) {
+ fireRemovable();
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -122,12 +122,12 @@
}
@Override
- public void fireNoListenerAndEmpty(final ISubFactSet<T> subFactSet) {
+ public void fireRemovable(final ISubFactSet<T> subFactSet) {
final T predicate = subFactSet.getPredicate();
if (predicate != null) {
factByPredicate.remove(predicate).close();
- if (isEmpty() && !hasListener()) {
- fireNoListenerAndEmpty();
+ if (isRemovable()) {
+ fireRemovable();
}
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -163,7 +163,7 @@
}
@Override
- public void fireNoListenerAndEmpty(final ISubFactSet<T> subFactSet) {
+ public void fireRemovable(final ISubFactSet<T> subFactSet) {
// this has not sub fact set
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -129,8 +129,7 @@
if (objectOfSubjectPredicate != null) {
removed = objectOfSubjectPredicate.removeFact(singleFactSet, fact,
doFire);
- if (objectOfSubjectPredicate.isEmpty()
- && !objectOfSubjectPredicate.hasListener()) {
+ if (objectOfSubjectPredicate.isRemovable()) {
objectOfSubjectPredicateBySubjectMap.remove(subject).close();
}
}
@@ -140,8 +139,7 @@
if (subjectOfPredicateObject != null) {
removed = subjectOfPredicateObject.removeFact(singleFactSet, fact,
doFire);
- if (subjectOfPredicateObject.isEmpty()
- && !subjectOfPredicateObject.hasListener()) {
+ if (subjectOfPredicateObject.isRemovable()) {
subjectOfPredicateObjectByPredicateMap.remove(object).close();
}
}
@@ -158,7 +156,7 @@
}
@Override
- public void fireNoListenerAndEmpty(final ISubFactSet<T> subFactSet) {
+ public void fireRemovable(final ISubFactSet<T> subFactSet) {
final T subject = subFactSet.getSubject();
if (subject != null) {
objectOfSubjectPredicateBySubjectMap.remove(subject).close();
@@ -167,8 +165,8 @@
if (object != null) {
subjectOfPredicateObjectByPredicateMap.remove(object).close();
}
- if (isEmpty() && !hasListener()) {
- fireNoListenerAndEmpty();
+ if (isRemovable()) {
+ fireRemovable();
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -122,12 +122,12 @@
}
@Override
- public void fireNoListenerAndEmpty(final ISubFactSet<T> subFactSet) {
+ public void fireRemovable(final ISubFactSet<T> subFactSet) {
final T subject = subFactSet.getSubject();
if (subject != null) {
factBySubject.remove(subject).close();
- if (isEmpty() && !hasListener()) {
- fireNoListenerAndEmpty();
+ if (isRemovable()) {
+ fireRemovable();
}
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -129,8 +129,7 @@
if (objectOfSubjectPredicate != null) {
removed = objectOfSubjectPredicate.removeFact(singleFactSet, fact,
doFire);
- if (objectOfSubjectPredicate.isEmpty()
- && !objectOfSubjectPredicate.hasListener()) {
+ if (objectOfSubjectPredicate.isRemovable()) {
predicateOfSubjectObjectBySubjectMap.remove(subject).close();
}
}
@@ -140,8 +139,7 @@
if (subjectOfPredicateObject != null) {
removed = subjectOfPredicateObject.removeFact(singleFactSet, fact,
doFire);
- if (subjectOfPredicateObject.isEmpty()
- && !objectOfSubjectPredicate.hasListener()) {
+ if (subjectOfPredicateObject.isRemovable()) {
subjectOfPredicateObjectByPredicateMap.remove(predicate)
.close();
}
@@ -159,7 +157,7 @@
}
@Override
- public void fireNoListenerAndEmpty(final ISubFactSet<T> subFactSet) {
+ public void fireRemovable(final ISubFactSet<T> subFactSet) {
final T subject = subFactSet.getSubject();
if (subject != null) {
predicateOfSubjectObjectBySubjectMap.remove(subject).close();
@@ -168,8 +166,8 @@
if (predicate != null) {
subjectOfPredicateObjectByPredicateMap.remove(predicate).close();
}
- if (isEmpty() && !hasListener()) {
- fireNoListenerAndEmpty();
+ if (isRemovable()) {
+ fireRemovable();
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -24,6 +24,7 @@
import net.sf.reasoner4j.builtin.IBuiltin;
import net.sf.reasoner4j.builtin.provider.IBuiltinProvider;
+import net.sf.reasoner4j.builtin.provider.IRuleDefinitionProvider;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.rule.Rule;
@@ -49,6 +50,8 @@
*/
void addRule(Rule<T> rule);
+ void addRule(IRuleDefinitionProvider<T> ruleDefinitionProvider);
+
void removeRule(Rule<T> rule);
void assertFact(IFact<T> fact);
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2011-01-05 03:18:32 UTC (rev 53)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2011-01-07 03:48:34 UTC (rev 54)
@@ -39,6 +39,7 @@
import net.sf.reasoner4j.builtin.impl.BuiltinSupport;
import net.sf.reasoner4j.builtin.provider.IBuiltinProvider;
import net.sf.reasoner4j.builtin.provider.IBuitinTermProvider;
+import net.sf.reasoner4j.builtin.provider.IRuleDefinitionProvider;
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
@@ -152,6 +153,13 @@
}
@Override
+ public void addRule(final IRuleDefinitionProvider<T> ruleDefinitionProvider) {
+ for (Rule<T> rule : ruleDefinitionProvider.getRules(buitinTermProvider)) {
+ addRule(rule);
+ }
+ }
+
+ @Override
public void removeRule(final Rule<T> rule) {
// TODO
// TODO retract fact conclusion of removed rule
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2011-01-05 03:18:40
|
Revision: 53
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=53&view=rev
Author: luc_peuvrier
Date: 2011-01-05 03:18:32 +0000 (Wed, 05 Jan 2011)
Log Message:
-----------
compute feature ok
Modified Paths:
--------------
trunk/reasoner4j/doc/class_comment_header.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/Fact.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseType.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
Added Paths:
-----------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListRemoveBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseRetractTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseRetract.java
Modified: trunk/reasoner4j/doc/class_comment_header.txt
===================================================================
--- trunk/reasoner4j/doc/class_comment_header.txt 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/doc/class_comment_header.txt 2011-01-05 03:18:32 UTC (rev 53)
@@ -1,5 +1,5 @@
/*
- * Copyright 2010 Luc Peuvrier
+ * Copyright 2011 Luc Peuvrier
*
* This file is a part of reasoner4j.
*
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -47,6 +47,8 @@
public static final String LIST_APPEND_PREDICATE_IDENTIFIER = "listAppend";
+ public static final String LIST_REMOVE_PREDICATE_IDENTIFIER = "listRemove";
+
public static final String LIST_FIRST_PREDICATE_IDENTIFIER = "listFirst";
public static final String LIST_REST_PREDICATE_IDENTIFIER = "listRest";
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -28,6 +28,7 @@
import java.util.Map;
import java.util.TreeMap;
+import net.sf.reasoner4j.Fortest;
import net.sf.reasoner4j.ReasonerException;
import net.sf.reasoner4j.builtin.TermIdentifierConstant;
import net.sf.reasoner4j.builtin.provider.IBuitinTermProvider;
@@ -35,6 +36,7 @@
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.kb.AllKnowledgeBase;
+import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.motor.IBlankNodeProvider;
import net.sf.reasoner4j.rete.entity.ReteRule;
@@ -144,8 +146,19 @@
if (iterator.hasNext()) {
fact = iterator.next();
if (iterator.hasNext()) {
+ List<IFact<T>> factList = new LinkedList<IFact<T>>();
+ IFact<T> foundFact = fact;
+ do {
+ factList.add(foundFact);
+ if (iterator.hasNext()) {
+ foundFact = iterator.next();
+ } else {
+ foundFact = null;
+ }
+ } while (foundFact != null);
throw new ReasonerException("too much oject for \"" + subject
- + "\" subject and \"" + predicate + "\" predicate");
+ + "\" subject and \"" + predicate + "\" predicate\n"
+ + factList.toString());
}
} else {
if (mustFound) {
@@ -299,4 +312,10 @@
currentList = getObject(currentList, listRestPredicate, true);
}
}
+
+ @Fortest
+ public IKnowledgeBase<T> view(final T subject, final T predicate,
+ final T object) {
+ return knowledgeBase.view(subject, predicate, object);
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -79,14 +79,14 @@
@Override
public void removed(final int ruleIdentifier, final T subject,
final T predicate, final T object) {
- // FIXME __for test
- System.err.println(subject + " " + predicate + " " + object);
- final List<T> listOfList = getList(subject);
- for (T term : listOfList) {
- System.err.println("param list " + term + " : " + getList(term));
- }
- System.err.println("result list " + getList(object));
- // FIXMELUC list can be used elsewhere
+ // // FIXME __for test
+ // System.err.println(subject + " " + predicate + " " + object);
+ // final List<T> listOfList = getList(subject);
+ // for (T term : listOfList) {
+ // System.err.println("param list " + term + " : " + getList(term));
+ // }
+ // System.err.println("result list " + getList(object));
+ // FIXMELUC ___list can be used elsewhere
// removeList(ruleIdentifier, object);
}
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListRemoveBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListRemoveBuiltin.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListRemoveBuiltin.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.impl.list;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sf.reasoner4j.ReasonerException;
+import net.sf.reasoner4j.builtin.TermIdentifierConstant;
+import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
+import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
+
+/**
+ * If the subject is a list of lists and the removal of second list from first
+ * list is the object, then this is true. eg ( (1 2) (1 2 3 4) ) list:remove (3
+ * 4). The object can be calculated as a function of the subject.
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class ListRemoveBuiltin<T> extends AbstractBuiltin<T> {
+
+ public ListRemoveBuiltin() {
+ super(null, TermIdentifierConstant.LIST_REMOVE_PREDICATE_IDENTIFIER,
+ null);
+ }
+
+ @Override
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
+ final T predicate, final T object) {
+ assert getBuiltinPredicate().equals(predicate);
+ final List<T> listOfList = getList(subject);
+ final Iterator<T> iterator = listOfList.iterator();
+ if (!iterator.hasNext()) {
+ throw new ReasonerException("list of list must have two elements");
+ }
+ final List<T> resultValue = getList(iterator.next());
+ if (!iterator.hasNext()) {
+ throw new ReasonerException("list of list must have two elements");
+ }
+ final List<T> toRemoveList = getList(iterator.next());
+ if (iterator.hasNext()) {
+ throw new ReasonerException("list of list must have two elements");
+ }
+ resultValue.removeAll(toRemoveList);
+
+ final List<IFact<T>> resultFactList = new ArrayList<IFact<T>>(1);
+ final IFact<T> resultFact;
+ if (object == null) {
+ resultFact = new Fact<T>(subject, predicate, createList(
+ ruleIdentifier, resultValue));
+ } else {
+ final List<T> existing = getList(object);
+ if (resultValue.equals(existing)) {
+ resultFact = new Fact<T>(subject, predicate, object);
+ } else {
+ // do not match
+ resultFact = null;
+ }
+ }
+ if (resultFact != null) {
+ resultFactList.add(resultFact);
+ }
+ return resultFactList;
+ }
+
+ @Override
+ public void removed(final int ruleIdentifier, final T subject,
+ final T predicate, final T object) {
+ // // FIXME __for test
+ // System.err.println(subject + " " + predicate + " " + object);
+ // final List<T> listOfList = getList(subject);
+ // for (T term : listOfList) {
+ // System.err.println("param list " + term + " : " + getList(term));
+ // }
+ // System.err.println("result list " + getList(object));
+ // FIXMELUC _____list can be used elsewhere
+ // removeList(ruleIdentifier, object);
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -29,6 +29,7 @@
import net.sf.reasoner4j.builtin.impl.BlankNodeBuiltin;
import net.sf.reasoner4j.builtin.impl.list.InListBuiltin;
import net.sf.reasoner4j.builtin.impl.list.ListAppendBuiltin;
+import net.sf.reasoner4j.builtin.impl.list.ListRemoveBuiltin;
import net.sf.reasoner4j.builtin.impl.math.MathProductBuiltin;
import net.sf.reasoner4j.builtin.impl.math.MathSumBuiltin;
@@ -51,6 +52,7 @@
// builtinList.add(new ListBuiltin<T>());
builtinList.add(new InListBuiltin<T>());
builtinList.add(new ListAppendBuiltin<T>());
+ builtinList.add(new ListRemoveBuiltin<T>());
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/Fact.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/Fact.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/Fact.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -30,11 +30,11 @@
*/
public class Fact<T> implements IFact<T> {
- private final T subject;
+ protected final T subject;
- private final T predicate;
+ protected final T predicate;
- private final T object;
+ protected final T object;
public Fact(final T subject, final T predicate, final T object) {
super();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -69,7 +69,7 @@
}
final CauseIdentifiedFact<T> toRetract = new CauseIdentifiedFact<T>(
subjectOfToRetract, predicateOfToRetract, objectOfToRetract,
- ruleIdentifier);
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER);
return toRetract;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -68,34 +68,16 @@
* compute (subject,predicate,object) parameter
*/
final IFact<T> fact = premise.createFact(value);
- T subject = fact.getSubject();
- if (subject == null) {
- subject = premise.getSubject();
- }
- T predicate = fact.getPredicate();
- if (predicate == null) {
- predicate = premise.getPredicate();
- }
- T object = fact.getObject();
- if (object == null) {
- object = premise.getObject();
- }
+ final T subject = fact.getSubject();
+ final T predicate = fact.getPredicate();
+ final T object = fact.getObject();
final List<IFact<T>> resultFactList = buitin.compute(ruleIdentifier,
subject, predicate, object);
final List<List<T>> resultList = new ArrayList<List<T>>(
resultFactList.size());
for (IFact<T> resultFact : resultFactList) {
final List<T> resultValue;
- resultValue = new ArrayList<T>(3);
- if (premise.getSubject() == null) {
- resultValue.add(resultFact.getSubject());
- }
- if (premise.getPredicate() == null) {
- resultValue.add(resultFact.getPredicate());
- }
- if (premise.getObject() == null) {
- resultValue.add(resultFact.getObject());
- }
+ resultValue = premise.createVariableValueSet(resultFact);
resultList.add(resultValue);
}
return resultList.iterator();
@@ -107,18 +89,9 @@
* compute (subject,predicate,object) parameter
*/
final IFact<T> fact = premise.createFact(value);
- T subject = fact.getSubject();
- if (subject == null) {
- subject = premise.getSubject();
- }
- T predicate = fact.getPredicate();
- if (predicate == null) {
- predicate = premise.getPredicate();
- }
- T object = fact.getObject();
- if (object == null) {
- object = premise.getObject();
- }
+ final T subject = fact.getSubject();
+ final T predicate = fact.getPredicate();
+ final T object = fact.getObject();
buitin.removed(ruleIdentifier, subject, predicate, object);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -25,6 +25,8 @@
import java.util.Iterator;
import java.util.List;
+import net.sf.reasoner4j.Fortest;
+
/**
*
* @author luc peuvrier
@@ -48,5 +50,6 @@
Iterator<List<T>> iterator();
+ @Fortest
void accept(ITableVisitor<T> visitor);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -176,10 +176,11 @@
}
final List<T> firstSourceValue = firstSourceTableMapping
.fromDestToSource(thisValueToRemove);
- firstSourceTable.removed(firstSourceValue);
remove(firstSourceIndexedTable, firstSourceValue,
thisValueToRemove);
fireRemoved(thisValueToRemove, cause, conclude);
+ // FIXMELUC must be done after fire to listener of this
+ firstSourceTable.removed(firstSourceValue);
}
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseRetractTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseRetractTable.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseRetractTable.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2011 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rete.entity;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import net.sf.reasoner4j.fact.IFact;
+import net.sf.reasoner4j.fact.IFactSet;
+import net.sf.reasoner4j.rule.IPremise;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class PremiseRetractTable<T> extends PremiseTable<T> {
+
+ private final Set<List<T>> localTable = new HashSet<List<T>>();
+
+ public PremiseRetractTable(final IPremise<T> premise,
+ final IFactSet<T> factSet, final boolean listening) {
+ super(premise, factSet, listening);
+ }
+
+ @Override
+ public void asserted(IFact<T> fact) {
+ final List<T> value = premise.createVariableValueSet(fact);
+ if (localTable.remove(value)) {
+ fireRemoved(value, fact, listening);
+ }
+ }
+
+ @Override
+ public void retracted(IFact<T> fact) {
+ final List<T> value = premise.createVariableValueSet(fact);
+ if (localTable.add(value)) {
+ if (listening) {
+ fireAdded(value, fact, true/* conclude */);
+ }
+ }
+ }
+
+ @Override
+ public Iterator<List<T>> select(final List<T> value) {
+ List<List<T>> result = new ArrayList<List<T>>(1);
+ if (localTable.contains(value)) {
+ result.add(value);
+ }
+ return result.iterator();
+ }
+
+ @Override
+ public Iterator<List<T>> iterator() {
+ return localTable.iterator();
+ }
+
+ @Override
+ public void removed(List<T> value) {
+ localTable.remove(value);
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -43,7 +43,7 @@
protected final IFactSet<T> factSet;
- private final boolean listening;
+ protected final boolean listening;
public PremiseTable(final IPremise<T> premise, final IFactSet<T> factSet,
final boolean listening) {
@@ -99,26 +99,9 @@
@Override
public Iterator<List<T>> select(final List<T> value) {
- final Iterator<T> iterator = value.iterator();
- final T subject;
- if (premise.getSubjectVariableName() == null) {
- subject = premise.getSubject();
- } else {
- subject = iterator.next();
- }
- final T predicate;
- if (premise.getPredicateVariableName() == null) {
- predicate = premise.getPredicate();
- } else {
- predicate = iterator.next();
- }
- final T object;
- if (premise.getObjectVariableName() == null) {
- object = premise.getObject();
- } else {
- object = iterator.next();
- }
- final IFactSet<T> view = selectionView(subject, predicate, object);
+ final IFact<T> fact = premise.createFact(value);
+ final IFactSet<T> view = selectionView(fact.getSubject(),
+ fact.getPredicate(), fact.getObject());
return new SelectionIterator(view);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -22,12 +22,13 @@
*/
package net.sf.reasoner4j.rete.service;
+import net.sf.reasoner4j.ReasonerException;
import net.sf.reasoner4j.fact.IFactSet;
+import net.sf.reasoner4j.rete.entity.PremiseRetractTable;
import net.sf.reasoner4j.rete.entity.PremiseTable;
import net.sf.reasoner4j.rete.entity.PremiseTableAndDefault;
import net.sf.reasoner4j.rete.entity.VariableKeyValueMapping;
import net.sf.reasoner4j.rule.AbstractPremiseAndDefault;
-import net.sf.reasoner4j.rule.EnumPremiseType;
import net.sf.reasoner4j.rule.IPremise;
/**
@@ -51,13 +52,23 @@
final IFactSet<T> view = factSet.view(premise.getSubject(),
premise.getPredicate(), premise.getObject());
final PremiseTable<T> premiseTable;
- if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
+ switch (premise.getType()) {
+ case DEFAULT:
premiseTable = new PremiseTableAndDefault<T>(ruleIdentifier,
(AbstractPremiseAndDefault<T>) premise, view,
premise.isListening());
- } else {
+ break;
+ case RETRACT:
+ premiseTable = new PremiseRetractTable<T>(premise, view,
+ premise.isListening());
+ break;
+ case STANDARD:
premiseTable = new PremiseTable<T>(premise, view,
premise.isListening());
+ break;
+ default:
+ throw new ReasonerException("can not build table for premise type "
+ + premise.getType());
}
return premiseTable;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -131,6 +131,12 @@
premise, mapping, motor.getAllFactSet());
reteRule.add(premiseTable);
break;
+ case RETRACT:
+ assertNotBuitlin(builtin, premise);
+ premiseTable = premiseTableFactory.create(reteRule.getIdentifier(),
+ premise, mapping, motor.getAllFactSet());
+ reteRule.add(premiseTable);
+ break;
case STANDARD:
if (builtin == null) {
final PremiseTable<T> factPremiseTable = premiseTableFactory
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -89,19 +89,19 @@
final Iterator<T> iterator = value.iterator();
final T subject;
if (subjectVariableName == null) {
- subject = null;
+ subject = this.subject;
} else {
subject = iterator.next();
}
final T predicate;
if (predicateVariableName == null) {
- predicate = null;
+ predicate = this.predicate;
} else {
predicate = iterator.next();
}
final T object;
if (objectVariableName == null) {
- object = null;
+ object = this.object;
} else {
object = iterator.next();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseType.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseType.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseType.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -35,5 +35,9 @@
/**
*
*/
- DEFAULT;
+ DEFAULT,
+ /**
+ *
+ */
+ RETRACT;
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseRetract.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseRetract.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseRetract.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class PremiseRetract<T> extends AbstractPremise<T> {
+
+ public PremiseRetract(final String subjectVariableName, final T subject,
+ final String predicateVariableName, final T predicate,
+ final String objectVariableName, final T object) {
+ super(EnumPremiseType.RETRACT, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object,
+ true);
+ }
+
+ public PremiseRetract(final String subjectVariableName, final T subject,
+ final String predicateVariableName, final T predicate,
+ final String objectVariableName, final T object,
+ final boolean listening) {
+ super(EnumPremiseType.RETRACT, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object,
+ listening);
+ }
+
+ @Override
+ public String toString() {
+ return "Premise [" + super.toString() + "]";
+ }
+}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2011-01-04 05:00:55 UTC (rev 52)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2011-01-05 03:18:32 UTC (rev 53)
@@ -23,12 +23,15 @@
package net.sf.reasoner4j;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import net.sf.reasoner4j.builtin.impl.BuiltinSupport;
import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.kb.AllKnowledgeBase;
import net.sf.reasoner4j.kb.IKnowledgeBase;
+import net.sf.reasoner4j.kb.IKnowledgeBaseListener;
import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
import net.sf.reasoner4j.motor.IMotor;
import net.sf.reasoner4j.motor.Motor;
@@ -40,6 +43,7 @@
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
import net.sf.reasoner4j.rule.PremiseAndDefault;
+import net.sf.reasoner4j.rule.PremiseRetract;
import net.sf.reasoner4j.rule.ReplaceConclusion;
import net.sf.reasoner4j.rule.Rule;
@@ -50,7 +54,8 @@
* @author luc peuvrier
*
*/
-public class TestExpressionCompute extends AbstractTestCase {
+public class TestExpressionCompute extends AbstractTestCase implements
+ IKnowledgeBaseListener<String> {
private static final Logger LOGGER = Logger
.getLogger(TestExpressionCompute.class);
@@ -173,7 +178,12 @@
motor.addBuiltin(defaultBuiltinProvider);
final BuiltinSupport<String> builtinSupport = ((Motor<String>) motor)
.getBuiltinSupport();
+ kb.addListener(this);
+ /*
+ * add to list rule
+ */
+
Rule<String> rule = new Rule<String>();
// ?X value ?V
IPremise<String> premise = new Premise<String>(
@@ -182,8 +192,6 @@
/* object */"?V", null);
rule.addPremise(premise);
// result valueList ?L
- // premise = new PremiseAndDefaultNotListening<String>(
- // FIXMELUC not conclude and not listening
premise = new PremiseAndDefault<String>(
/* subject */null, "result", null,
/* predicate */null, "valueList", null,
@@ -242,9 +250,85 @@
rule.addConclusion(conclusion);
motor.addRule(rule);
+
+ /*
+ * remove from list rule
+ */
+
+ rule = new Rule<String>();
+
+ // ?X value ?V
+ premise = new PremiseRetract<String>(
+ /* subject */"?X", null,
+ /* predicate */null, "value",
+ /* object */"?V", null);
+ rule.addPremise(premise);
+ // result valueList ?L
+ premise = new PremiseAndDefault<String>(
+ /* subject */null, "result", null,
+ /* predicate */null, "valueList", null,
+ /* object */"?L", null, "nil",
+ /* not listening */false);
+ rule.addPremise(premise);
+ // ?LV listFirst ?V
+ premise = new AssertedPremise<String>(
+ /* subject */"?LV", null,
+ /* predicate */null, "listFirst",
+ /* object */"?V", null);
+ rule.addPremise(premise);
+ // ?LV listRest nil
+ premise = new AssertedPremise<String>(
+ /* subject */"?LV", null,
+ /* predicate */null, "listRest",
+ /* object */null, "nil");
+ rule.addPremise(premise);
+ // ?LL listFirst ?L
+ premise = new AssertedPremise<String>(
+ /* subject */"?LL", null,
+ /* predicate */null, "listFirst",
+ /* object */"?L", null);
+ rule.addPremise(premise);
+ // ?LL listRest ?LL2
+ premise = new AssertedPremise<String>(
+ /* subject */"?LL", null,
+ /* predicate */null, "listRest",
+ /* object */"?LL2", null);
+ rule.addPremise(premise);
+ // ?LL2 listFirst ?LV
+ premise = new AssertedPremise<String>(
+ /* subject */"?LL2", null,
+ /* predicate */null, "listFirst",
+ /* object */"?LV", null);
+ rule.addPremise(premise);
+ // ?LL2 listRest nil
+ premise = new AssertedPremise<String>(
+ /* subject */"?LL2", null,
+ /* predicate */null, "listRest",
+ /* object */null, "nil");
+ rule.addPremise(premise);
+ // ?LL listAppend ?LR
+ premise = new Premise<String>(
+ /* subject */"?LL", null,
+ /* predicate */null, "listRemove",
+ /* object */"?LR", null);
+ rule.addPremise(premise);
+
+ // result valueList ?LR
+ // IConclusion<String> conclusion = new AffectConclusion<String>(
+ conclusion = new ReplaceConclusion<String>(
+ /* subject */null, "result", false,
+ /* predicate */null, "valueList", false,
+ /* object */"?LR", null, true);
+ rule.addConclusion(conclusion);
+
+ motor.addRule(rule);
final ReteRule<String> reteRule = ((AllKnowledgeBase<String>) kb)
.getReteRule(rule);
+ /*
+ * sum computation rule
+ */
+
rule = new Rule<String>();
// result list ?L
premise = new Premise<String>(
@@ -270,7 +354,7 @@
final ReteRuleToString<String> reteRuleToString = new ReteRuleToString<String>();
// first assert
- motor.assertFact(new Fact<String>("truc", "value", "5"));
+ motor.assertFact(new Fact<String>("truc1", "value", "5"));
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reteRuleToString.toString(reteRule));
}
@@ -278,18 +362,15 @@
logSum(builtinSupport, "(5)");
// second assert
- motor.assertFact(new Fact<String>("truc", "value", "7"));
+ motor.assertFact(new Fact<String>("truc2", "value", "7"));
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reteRuleToString.toString(reteRule));
}
assertValueList(builtinSupport, new String[] { "7", "5" });
logSum(builtinSupport, "(7,5)");
- // motor.retractFact(new Fact<String>("truc", "value", "5"));
- // logSum(builtinSupport, "(7)");
- // assertValueList(builtinSupport, new String[] { "7" });
// third assert
- motor.assertFact(new Fact<String>("truc", "value", "8"));
+ motor.assertFact(new Fact<String>("truc3", "value", "8"));
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reteRuleToString.toString(reteRule));
}
@@ -297,7 +378,7 @@
logSum(builtinSupport, "(8,7,5)");
// retract second assertion
- motor.retractFact(new Fact<String>("truc", "value", "7"));
+ motor.retractFact(new Fact<String>("truc2", "value", "7"));
logSum(builtinSupport, "(8,5)");
assertValueList(builtinSupport, new String[] { "8", "5" });
}
@@ -333,13 +414,36 @@
final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(message);
stringBuilder.append(' ');
- final String sum = builtinSupport.getObject("result", "sum", false);
- if (sum == null) {
- stringBuilder.append("no object O for (\"result\",\"sum\",O)");
- } else {
- stringBuilder.append(sum);
+ try {
+ final String sum = builtinSupport.getObject("result", "sum",
+ false);
+ if (sum == null) {
+ stringBuilder
+ .append("no object O for (\"result\",\"sum\",O)");
+ } else {
+ stringBuilder.append(sum);
+ }
+ } catch (ReasonerException exception) {
+ final IKnowledgeBase<String> view = builtinSupport.view(
+ "result", "valueList", null);
+ final Iterator<IFact<String>> iterator = view.iterator();
+ while (iterator.hasNext()) {
+ stringBuilder.append('\n');
+ stringBuilder.append(iterator.next());
+ }
+ throw new ReasonerException(stringBuilder.toString(), exception);
}
LOGGER.debug(stringBuilder.toString());
}
}
+
+ @Override
+ public void asserted(final IFact<String> fact) {
+ LOGGER.debug("kb assert of " + fact);
+ }
+
+ @Override
+ public void retracted(final IFact<String> fact) {
+ LOGGER.debug("kb retract of " + fact);
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2011-01-04 05:01:03
|
Revision: 52
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=52&view=rev
Author: luc_peuvrier
Date: 2011-01-04 05:00:55 +0000 (Tue, 04 Jan 2011)
Log Message:
-----------
new "not listening" premise implementation
Modified Paths:
--------------
trunk/reasoner4j/doc/builtin.txt
trunk/reasoner4j/doc/todo.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
Added Paths:
-----------
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java
Removed Paths:
-------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseMode.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java
Modified: trunk/reasoner4j/doc/builtin.txt
===================================================================
--- trunk/reasoner4j/doc/builtin.txt 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/doc/builtin.txt 2011-01-04 05:00:55 UTC (rev 52)
@@ -80,3 +80,30 @@
?CNP number ?NUMBER.
}.
+
+?X value ?V
+result valueList ?L : always true, existing ?L else ?L is nil by default, do not implies conclusion
+?LV listFirst ?V : always true
+?LV listRest nil : always true
+?LL listFirst ?L : always true
+?LL listRest ?LL2 : always true
+?LL2 listFirst ?LV : always true
+?LL2 listRest nil : always true
+?LL listAppend ?LR # list append builtin
+=>
+result valueList ?LR : replace all previous ( result valueList *)
+
+retracted ?X value ?V
+result valueList ?L : always true, existing ?L else ?L is nil by default, do not implies conclusion
+?LV listFirst ?V : always true
+?LV listRest nil : always true
+?LV listRemove ?LR # list append builtin
+=>
+result valueList ?LR : replace all previous ( result valueList *)
+
+
+result list ?L
+?L mathSum ?S # sum buitin
+=>
+result sum ?S
+
Modified: trunk/reasoner4j/doc/todo.txt
===================================================================
--- trunk/reasoner4j/doc/todo.txt 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/doc/todo.txt 2011-01-04 05:00:55 UTC (rev 52)
@@ -1,3 +1,16 @@
+findall:
+--------
+
+premise :
+- not listening: not listening assertion, but listening retraction but not conclude
+
+retracted premise
+
+example euleurgui:
+------------------
+
+example/domotic.n3p
+
IBuitinTermProvider chain
-------------------------
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -83,9 +83,9 @@
System.err.println(subject + " " + predicate + " " + object);
final List<T> listOfList = getList(subject);
for (T term : listOfList) {
- System.err.println("in " + getList(term));
+ System.err.println("param list " + term + " : " + getList(term));
}
- System.err.println("in " + getList(object));
+ System.err.println("result list " + getList(object));
// FIXMELUC list can be used elsewhere
// removeList(ruleIdentifier, object);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -84,10 +84,14 @@
@Override
public void fireAsserted(final CauseIdentifiedFact<T> fact) {
- if (!listenerSet.isEmpty()) {
- for (IFactSetListener<T> listener : listenerSet) {
- listener.asserted(fact.getFact());
+ try {
+ if (!listenerSet.isEmpty()) {
+ for (IFactSetListener<T> listener : listenerSet) {
+ listener.asserted(fact.getFact());
+ }
}
+ } catch (Exception exception) {
+ throw new ReasonerException("for " + fact, exception);
}
}
@@ -100,7 +104,6 @@
}
}
} catch (Exception exception) {
- // FIXMELUC for test
throw new ReasonerException("for " + fact, exception);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -29,7 +29,6 @@
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.fact.IFactSetListener;
-import net.sf.reasoner4j.rule.EnumPremiseMode;
import net.sf.reasoner4j.rule.EnumPremiseType;
import net.sf.reasoner4j.rule.IPremise;
@@ -44,13 +43,13 @@
protected final IFactSet<T> factSet;
- private final EnumPremiseMode mode;
+ private final boolean listening;
public PremiseTable(final IPremise<T> premise, final IFactSet<T> factSet,
- final EnumPremiseMode mode) {
+ final boolean listening) {
super(premise);
this.factSet = factSet;
- this.mode = mode;
+ this.listening = listening;
factSet.addListener(this);
}
@@ -61,18 +60,16 @@
@Override
public void asserted(final IFact<T> fact) {
- if (!EnumPremiseMode.DO_NOT_LISTENING.equals(mode)) {
+ if (listening) {
final List<T> value = premise.createVariableValueSet(fact);
- fireAdded(value, fact,
- true ^ EnumPremiseMode.DO_NOT_CONCLUDE.equals(mode));
+ fireAdded(value, fact, true/* conclude */);
}
}
@Override
public void retracted(final IFact<T> fact) {
final List<T> value = premise.createVariableValueSet(fact);
- fireRemoved(value, fact,
- true ^ EnumPremiseMode.DO_NOT_CONCLUDE.equals(mode));
+ fireRemoved(value, fact, listening);
}
private class SelectionIterator implements Iterator<List<T>> {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -24,9 +24,7 @@
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
import net.sf.reasoner4j.fact.IFactSet;
-import net.sf.reasoner4j.fact.SingleFactSet;
import net.sf.reasoner4j.rule.AbstractPremiseAndDefault;
-import net.sf.reasoner4j.rule.EnumPremiseMode;
/**
*
@@ -46,8 +44,8 @@
public PremiseTableAndDefault(final int ruleIdentifier,
final AbstractPremiseAndDefault<T> premise,
- final IFactSet<T> factSet, final EnumPremiseMode mode) {
- super(premise, factSet, mode);
+ final IFactSet<T> factSet, final boolean listening) {
+ super(premise, factSet, listening);
this.ruleIdentifier = ruleIdentifier;
defaultSubject = premise.getDefaultSubject();
defaultPredicate = premise.getDefaultPredicate();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -54,9 +54,10 @@
if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
premiseTable = new PremiseTableAndDefault<T>(ruleIdentifier,
(AbstractPremiseAndDefault<T>) premise, view,
- premise.getMode());
+ premise.isListening());
} else {
- premiseTable = new PremiseTable<T>(premise, view, premise.getMode());
+ premiseTable = new PremiseTable<T>(premise, view,
+ premise.isListening());
}
return premiseTable;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -40,17 +40,17 @@
private final EnumPremiseType type;
- private final EnumPremiseMode mode;
+ private final boolean listening;
public AbstractPremise(final EnumPremiseType type,
final String subjectVariableName, final T subject,
final String predicateVariableName, final T predicate,
final String objectVariableName, final T object,
- final EnumPremiseMode mode) {
+ final boolean listening) {
super(subjectVariableName, subject, predicateVariableName, predicate,
objectVariableName, object);
this.type = type;
- this.mode = mode;
+ this.listening = listening;
}
@Override
@@ -59,8 +59,8 @@
}
@Override
- public EnumPremiseMode getMode() {
- return mode;
+ public boolean isListening() {
+ return listening;
}
@Override
@@ -110,16 +110,16 @@
@Override
public String toString() {
- return "AbstractPremise [type=" + type + ", mode=" + mode + ", "
- + super.toString() + "]";
+ return "AbstractPremise [type=" + type + ", listening=" + listening
+ + ", " + super.toString() + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
+ result = prime * result + (listening ? 1231 : 1237);
result = prime * result + ((type == null) ? 0 : type.hashCode());
- result = prime * result + ((mode == null) ? 0 : mode.hashCode());
return result;
}
@@ -130,11 +130,13 @@
return true;
if (!super.equals(obj))
return false;
- AbstractPremise<T> other = (AbstractPremise<T>) obj;
- if (type != other.getType())
+ if (getClass() != obj.getClass())
return false;
- if (mode != other.getMode())
+ final AbstractPremise<T> other = (AbstractPremise<T>) obj;
+ if (listening != other.listening)
return false;
+ if (type != other.type)
+ return false;
return true;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -39,10 +39,10 @@
final T subject, final T defaultSubject,
final String predicateVariableName, final T predicate,
final T defaultPredicate, final String objectVariableName,
- final T object, final T defaultObject, final EnumPremiseMode mode) {
+ final T object, final T defaultObject, final boolean listening) {
super(EnumPremiseType.DEFAULT, subjectVariableName, subject,
predicateVariableName, predicate, objectVariableName, object,
- mode);
+ listening);
this.defaultSubject = defaultSubject;
this.defaultPredicate = defaultPredicate;
this.defaultObject = defaultObject;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -35,7 +35,7 @@
final String objectVariableName, final T object) {
super(EnumPremiseType.ASSERTED, subjectVariableName, subject,
predicateVariableName, predicate, objectVariableName, object,
- EnumPremiseMode.STANDARD);
+ false);
}
@Override
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseMode.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseMode.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseMode.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -1,39 +0,0 @@
-package net.sf.reasoner4j.rule;
-
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-public enum EnumPremiseMode {
-
- /**
- *
- */
- STANDARD,
- /**
- *
- */
- DO_NOT_CONCLUDE,
- /**
- *
- */
- DO_NOT_LISTENING;
-}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -36,7 +36,7 @@
EnumPremiseType getType();
- EnumPremiseMode getMode();
+ boolean isListening();
String getSubjectVariableName();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -30,14 +30,23 @@
*/
public class Premise<T> extends AbstractPremise<T> {
- public Premise(String subjectVariableName, T subject,
- String predicateVariableName, T predicate,
- String objectVariableName, T object) {
+ public Premise(final String subjectVariableName, final T subject,
+ final String predicateVariableName, final T predicate,
+ final String objectVariableName, final T object) {
super(EnumPremiseType.STANDARD, subjectVariableName, subject,
predicateVariableName, predicate, objectVariableName, object,
- EnumPremiseMode.STANDARD);
+ true);
}
+ public Premise(final String subjectVariableName, final T subject,
+ final String predicateVariableName, final T predicate,
+ final String objectVariableName, final T object,
+ final boolean listening) {
+ super(EnumPremiseType.STANDARD, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object,
+ listening);
+ }
+
@Override
public String toString() {
return "Premise [" + super.toString() + "]";
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -37,10 +37,19 @@
final T defaultObject) {
super(subjectVariableName, subject, defaultSubject,
predicateVariableName, predicate, defaultPredicate,
- objectVariableName, object, defaultObject,
- EnumPremiseMode.STANDARD);
+ objectVariableName, object, defaultObject, true);
}
+ public PremiseAndDefault(final String subjectVariableName, final T subject,
+ final T defaultSubject, final String predicateVariableName,
+ final T predicate, final T defaultPredicate,
+ final String objectVariableName, final T object,
+ final T defaultObject, final boolean listening) {
+ super(subjectVariableName, subject, defaultSubject,
+ predicateVariableName, predicate, defaultPredicate,
+ objectVariableName, object, defaultObject, listening);
+ }
+
@Override
public String toString() {
return "PremiseAndDefault [" + super.toString() + "]";
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -1,49 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rule;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseAndDefaultNotConclude<T> extends
- AbstractPremiseAndDefault<T> {
-
- public PremiseAndDefaultNotConclude(final String subjectVariableName,
- final T subject, final T defaultSubject,
- final String predicateVariableName, final T predicate,
- final T defaultPredicate, final String objectVariableName,
- final T object, final T defaultObject) {
- super(subjectVariableName, subject, defaultSubject,
- predicateVariableName, predicate, defaultPredicate,
- objectVariableName, object, defaultObject,
- EnumPremiseMode.DO_NOT_CONCLUDE);
- }
-
- @Override
- public String toString() {
- return "PremiseAndDefaultNotListening [" + super.toString() + "]";
- }
-}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -1,49 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rule;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseAndDefaultNotListening<T> extends
- AbstractPremiseAndDefault<T> {
-
- public PremiseAndDefaultNotListening(final String subjectVariableName,
- final T subject, final T defaultSubject,
- final String predicateVariableName, final T predicate,
- final T defaultPredicate, final String objectVariableName,
- final T object, final T defaultObject) {
- super(subjectVariableName, subject, defaultSubject,
- predicateVariableName, predicate, defaultPredicate,
- objectVariableName, object, defaultObject,
- EnumPremiseMode.DO_NOT_LISTENING);
- }
-
- @Override
- public String toString() {
- return "PremiseAndDefaultNotListening [" + super.toString() + "]";
- }
-}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -1,45 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rule;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseNotConclude<T> extends AbstractPremise<T> {
-
- public PremiseNotConclude(String subjectVariableName, T subject,
- String predicateVariableName, T predicate,
- String objectVariableName, T object) {
- super(EnumPremiseType.STANDARD, subjectVariableName, subject,
- predicateVariableName, predicate, objectVariableName, object,
- EnumPremiseMode.DO_NOT_CONCLUDE);
- }
-
- @Override
- public String toString() {
- return "PremiseNotListening [" + super.toString() + "]";
- }
-}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -1,45 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rule;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseNotListening<T> extends AbstractPremise<T> {
-
- public PremiseNotListening(String subjectVariableName, T subject,
- String predicateVariableName, T predicate,
- String objectVariableName, T object) {
- super(EnumPremiseType.STANDARD, subjectVariableName, subject,
- predicateVariableName, predicate, objectVariableName, object,
- EnumPremiseMode.DO_NOT_LISTENING);
- }
-
- @Override
- public String toString() {
- return "PremiseNotListening [" + super.toString() + "]";
- }
-}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -23,26 +23,20 @@
package net.sf.reasoner4j;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
-import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
import net.sf.reasoner4j.motor.IMotor;
import net.sf.reasoner4j.motor.MotorFactory;
-import net.sf.reasoner4j.rule.AffectConclusion;
import net.sf.reasoner4j.rule.AssertConclusion;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
-import net.sf.reasoner4j.rule.PremiseAndDefaultNotConclude;
import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
-import org.apache.log4j.Logger;
-
/**
*
* @author luc peuvrier
@@ -50,9 +44,6 @@
*/
public class TestBasicInference extends AbstractTestCase {
- private static final Logger LOGGER = Logger
- .getLogger(TestBasicInference.class);
-
/**
* test one conclusion for one premise<br>
* ( ?A "x" ?B ) imply ( ?A "has" "x" )
@@ -255,88 +246,4 @@
assertNull(kb.get("food", "available", "gateau"));
}
- private class IncrementBuiltin extends AbstractBuiltin<String> {
- public IncrementBuiltin() {
- super(null, "increment", null);
- }
-
- @Override
- public List<IFact<String>> compute(final int ruleIdentifier,
- final String subject, final String predicate,
- final String object) {
- List<IFact<String>> result = new ArrayList<IFact<String>>(1);
- result.add(new Fact<String>(subject, predicate, Integer
- .toString(Integer.parseInt(subject) + 1)));
- return result;
- }
- }
-
- public void testCountRetract() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
- motor.addBuiltin(new IncrementBuiltin());
- // first rule
- Rule<String> rule = new Rule<String>();
- IPremise<String> premise = new Premise<String>(
- /* subject */"?X", null,
- /* predicate */null, "state",
- /* object */null, "ko");
- rule.addPremise(premise);
- premise = new PremiseAndDefaultNotConclude<String>(
- /* subject */"?X", null, null,
- /* predicate */null, "koCount", null,
- /* object */"?C", null, "0");
- rule.addPremise(premise);
- premise = new Premise<String>(
- /* subject */"?C", null,
- /* predicate */null, "increment",
- /* object */"?NC", null);
- rule.addPremise(premise);
-
- // AffectConclusion do not retract conclusion
- AffectConclusion<String> conclusion = new AffectConclusion<String>(
- // ReplaceConclusion<String> conclusion = new ReplaceConclusion<String>(
- /* subject */"?X", null, false,
- /* predicate */null, "koCount", false,
- /* object */"?NC", null, true);
- rule.addConclusion(conclusion);
- motor.addRule(rule);
-
- motor.assertFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("first ko assert", kb);
- assertNotNull(kb.get("myCar", "koCount", "1"));
-
- motor.retractFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("ko retract", kb);
-
- motor.assertFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("second ko assert", kb);
- assertNotNull(kb.get("myCar", "koCount", "2"));
- assertNull(kb.get("myCar", "koCount", "1"));
-
- motor.retractFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("ko retract", kb);
-
- motor.assertFact(new Fact<String>("myCar", "state", "ko"));
- logKoCount("third ko assert", kb);
- assertNotNull(kb.get("myCar", "koCount", "3"));
- assertNull(kb.get("myCar", "koCount", "2"));
- }
-
- private void logKoCount(final String title, final IKnowledgeBase<String> kb) {
- if (LOGGER.isDebugEnabled()) {
- final Iterator<IFact<String>> iterator = kb.view("myCar",
- "koCount", null).iterator();
- final StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append(title);
- stringBuilder.append('\n');
- while (iterator.hasNext()) {
- stringBuilder.append(iterator.next());
- stringBuilder.append('\n');
- }
- LOGGER.debug(stringBuilder.toString());
- }
- }
}
Added: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java (rev 0)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestCountRetract.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -0,0 +1,112 @@
+package net.sf.reasoner4j;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
+import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
+import net.sf.reasoner4j.kb.IKnowledgeBase;
+import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
+import net.sf.reasoner4j.motor.IMotor;
+import net.sf.reasoner4j.motor.MotorFactory;
+import net.sf.reasoner4j.rule.AffectConclusion;
+import net.sf.reasoner4j.rule.IPremise;
+import net.sf.reasoner4j.rule.Premise;
+import net.sf.reasoner4j.rule.PremiseAndDefault;
+import net.sf.reasoner4j.rule.Rule;
+
+import org.apache.log4j.Logger;
+
+public class TestCountRetract extends AbstractTestCase {
+
+ private static final Logger LOGGER = Logger
+ .getLogger(TestCountRetract.class);
+
+ public void testCountRetract() {
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
+ motor.addBuiltin(new IncrementBuiltin());
+ // first rule
+ Rule<String> rule = new Rule<String>();
+ IPremise<String> premise = new Premise<String>(
+ /* subject */"?X", null,
+ /* predicate */null, "state",
+ /* object */null, "ko");
+ rule.addPremise(premise);
+ premise = new PremiseAndDefault<String>(
+ /* subject */"?X", null, null,
+ /* predicate */null, "koCount", null,
+ /* object */"?C", null, "0",
+ /* not listening */false);
+ rule.addPremise(premise);
+ premise = new Premise<String>(
+ /* subject */"?C", null,
+ /* predicate */null, "increment",
+ /* object */"?NC", null);
+ rule.addPremise(premise);
+
+ // AffectConclusion do not retract conclusion
+ AffectConclusion<String> conclusion = new AffectConclusion<String>(
+ // ReplaceConclusion<String> conclusion = new ReplaceConclusion<String>(
+ /* subject */"?X", null, false,
+ /* predicate */null, "koCount", false,
+ /* object */"?NC", null, true);
+ rule.addConclusion(conclusion);
+ motor.addRule(rule);
+
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("first ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "1"));
+
+ motor.retractFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("ko retract", kb);
+
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("second ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "2"));
+ assertNull(kb.get("myCar", "koCount", "1"));
+
+ motor.retractFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("ko retract", kb);
+
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("third ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "3"));
+ assertNull(kb.get("myCar", "koCount", "2"));
+ }
+
+ private void logKoCount(final String title, final IKnowledgeBase<String> kb) {
+ if (LOGGER.isDebugEnabled()) {
+ final Iterator<IFact<String>> iterator = kb.view("myCar",
+ "koCount", null).iterator();
+ final StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append(title);
+ stringBuilder.append('\n');
+ while (iterator.hasNext()) {
+ stringBuilder.append(iterator.next());
+ stringBuilder.append('\n');
+ }
+ LOGGER.debug(stringBuilder.toString());
+ }
+ }
+
+ private class IncrementBuiltin extends AbstractBuiltin<String> {
+ public IncrementBuiltin() {
+ super(null, "increment", null);
+ }
+
+ @Override
+ public List<IFact<String>> compute(final int ruleIdentifier,
+ final String subject, final String predicate,
+ final String object) {
+ List<IFact<String>> result = new ArrayList<IFact<String>>(1);
+ result.add(new Fact<String>(subject, predicate, Integer
+ .toString(Integer.parseInt(subject) + 1)));
+ return result;
+ }
+ }
+}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -34,14 +34,12 @@
import net.sf.reasoner4j.motor.Motor;
import net.sf.reasoner4j.motor.MotorFactory;
import net.sf.reasoner4j.rete.entity.ReteRule;
-import net.sf.reasoner4j.rule.AffectConclusion;
import net.sf.reasoner4j.rule.AssertConclusion;
import net.sf.reasoner4j.rule.AssertedPremise;
import net.sf.reasoner4j.rule.IConclusion;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
-import net.sf.reasoner4j.rule.PremiseAndDefaultNotConclude;
-import net.sf.reasoner4j.rule.PremiseAndDefaultNotListening;
+import net.sf.reasoner4j.rule.PremiseAndDefault;
import net.sf.reasoner4j.rule.ReplaceConclusion;
import net.sf.reasoner4j.rule.Rule;
@@ -167,7 +165,7 @@
* DISABLED TEST<br>
* can not works, not possible to retract list append do by append builtin
*/
- public void _testListAppendAndPropertySum() {
+ public void testListAppendAndPropertySum() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
final IKnowledgeBase<String> kb = kbFactory.create();
@@ -183,49 +181,52 @@
/* predicate */null, "value",
/* object */"?V", null);
rule.addPremise(premise);
- // result list ?L
+ // result valueList ?L
// premise = new PremiseAndDefaultNotListening<String>(
- premise = new PremiseAndDefaultNotConclude<String>(
+ // FIXMELUC not conclude and not listening
+ premise = new PremiseAndDefault<String>(
/* subject */null, "result", null,
/* predicate */null, "valueList", null,
- /* object */"?L", null, "nil");
+ /* object */"?L", null, "nil",
+ /* not listening */false);
rule.addPremise(premise);
- //
+ // ?LV listFirst ?V
premise = new AssertedPremise<String>(
/* subject */"?LV", null,
/* predicate */null, "listFirst",
/* object */"?V", null);
rule.addPremise(premise);
- //
+ // ?LV listRest nil
premise = new AssertedPremise<String>(
/* subject */"?LV", null,
/* predicate */null, "listRest",
/* object */null, "nil");
rule.addPremise(premise);
- //
+ // ?LL listFirst ?L
premise = new AssertedPremise<String>(
/* subject */"?LL", null,
/* predicate */null, "listFirst",
/* object */"?L", null);
rule.addPremise(premise);
- //
+ // ?LL listRest ?LL2
premise = new AssertedPremise<String>(
/* subject */"?LL", null,
/* predicate */null, "listRest",
/* object */"?LL2", null);
rule.addPremise(premise);
- //
+ // ?LL2 listFirst ?LV
premise = new AssertedPremise<String>(
/* subject */"?LL2", null,
/* predicate */null, "listFirst",
/* object */"?LV", null);
rule.addPremise(premise);
- //
+ // ?LL2 listRest nil
premise = new AssertedPremise<String>(
/* subject */"?LL2", null,
/* predicate */null, "listRest",
/* object */null, "nil");
rule.addPremise(premise);
+ // ?LL listAppend ?LR
premise = new Premise<String>(
/* subject */"?LL", null,
/* predicate */null, "listAppend",
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-31 04:08:06 UTC (rev 51)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2011-01-04 05:00:55 UTC (rev 52)
@@ -52,8 +52,6 @@
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
import net.sf.reasoner4j.rule.PremiseAndDefault;
-import net.sf.reasoner4j.rule.PremiseAndDefaultNotConclude;
-import net.sf.reasoner4j.rule.PremiseNotConclude;
import net.sf.reasoner4j.rule.ReplaceConclusion;
import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
@@ -112,12 +110,8 @@
currentRule = new Rule<String>();
} else if ("Premise".equals(definition[0])) {
addPremise(currentRule, definition);
- } else if ("PremiseNotConclude".equals(definition[0])) {
- addPremiseNotConclude(currentRule, definition);
} else if ("PremiseAndDefault".equals(definition[0])) {
addPremiseAndDefault(currentRule, definition);
- } else if ("PremiseAndDefaultNotConclude".equals(definition[0])) {
- addPremiseAndDefaultNotConclude(currentRule, definition);
} else if ("AssertedPremise".equals(definition[0])) {
addAssertedPremise(currentRule, definition);
} else if ("Conclusion".equals(definition[0])) {
@@ -221,16 +215,6 @@
currentRule.addPremise(premise);
}
- private void addPremiseNotConclude(final Rule<String> currentRule,
- final String[] definition) {
- final String[] params = getParams(definition);
- final IPremise<String> premise = new PremiseNotConclude<String>(
- /* subject */params[0], params[1],
- /* predicate */params[2], params[3],
- /* object */params[4], params[5]);
- currentRule.addPremise(premise);
- }
-
private void addPremiseAndDefault(final Rule<String> currentRule,
final String[] definition) {
final String[] params = getParams(definition);
@@ -241,16 +225,6 @@
currentRule.addPremise(premise);
}
- private void addPremiseAndDefaultNotConclude(
- final Rule<String> currentRule, final String[] definition) {
- final String[] params = getParams(definition);
- final IPremise<String> premise = new PremiseAndDefaultNotConclude<String>(
- /* subject */params[0], params[1], params[6],
- /* predicate */params[2], params[3], params[7],
- /* object */params[4], params[5], params[8]);
- currentRule.addPremise(premise);
- }
-
private void addAssertedPremise(final Rule<String> currentRule,
final String[] definition) {
final String[] params = getParams(definition);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-31 04:08:12
|
Revision: 51
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=51&view=rev
Author: luc_peuvrier
Date: 2010-12-31 04:08:06 +0000 (Fri, 31 Dec 2010)
Log Message:
-----------
compute implementation pending
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-31 04:08:06 UTC (rev 51)
@@ -81,6 +81,11 @@
final T predicate, final T object) {
// FIXME __for test
System.err.println(subject + " " + predicate + " " + object);
+ final List<T> listOfList = getList(subject);
+ for (T term : listOfList) {
+ System.err.println("in " + getList(term));
+ }
+ System.err.println("in " + getList(object));
// FIXMELUC list can be used elsewhere
// removeList(ruleIdentifier, object);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-30 11:57:47 UTC (rev 50)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-31 04:08:06 UTC (rev 51)
@@ -193,11 +193,11 @@
final boolean doFire) {
final IFact<T> fact = causeIdentifiedFact.getFact();
final SingleFactSet<T> singleFactSet = singleFacSetMap.get(fact);
+ boolean removed = false;
if (singleFactSet == null) {
- throw new ReasonerException("no single fact set for " + fact);
- }
- boolean removed = false;
- if (singleFactSet.removeFact(causeIdentifiedFact, doFire)) {
+ // throw new ReasonerException("no single fact set for " + fact);
+ // FIXMELUC _for TestExpressionCompute
+ } else if (singleFactSet.removeFact(causeIdentifiedFact, doFire)) {
if (!singleFactSet.hasListener() && singleFactSet.isEmpty()) {
singleFacSetMap.remove(fact);
singleFactSet.close();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-30 11:57:47 UTC (rev 50)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-31 04:08:06 UTC (rev 51)
@@ -165,20 +165,22 @@
final Set<List<T>> toRemoveSet = secondSourceIndexedTable
.remove(secondSourceValue);
if (toRemoveSet == null) {
- throw new ReasonerException("no elements for "
- + secondSourceValue.toString() + " in " + table);
- }
- for (List<T> thisValueToRemove : toRemoveSet) {
- if (!remove(thisValueToRemove)) {
- throw new ReasonerException("must remove "
- + thisValueToRemove.toString());
+ // throw new ReasonerException("no elements for "
+ // + secondSourceValue.toString() + " in " + table);
+ } else
+ // FIXMELUC case of TestExpressionCompute
+ for (List<T> thisValueToRemove : toRemoveSet) {
+ if (!remove(thisValueToRemove)) {
+ throw new ReasonerException("must remove "
+ + thisValueToRemove.toString());
+ }
+ final List<T> firstSourceValue = firstSourceTableMapping
+ .fromDestToSource(thisValueToRemove);
+ firstSourceTable.removed(firstSourceValue);
+ remove(firstSourceIndexedTable, firstSourceValue,
+ thisValueToRemove);
+ fireRemoved(thisValueToRemove, cause, conclude);
}
- final List<T> firstSourceValue = firstSourceTableMapping
- .fromDestToSource(thisValueToRemove);
- firstSourceTable.removed(firstSourceValue);
- remove(firstSourceIndexedTable, firstSourceValue, thisValueToRemove);
- fireRemoved(thisValueToRemove, cause, conclude);
- }
}
private boolean add(final List<T> value) {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-30 11:57:47 UTC (rev 50)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-31 04:08:06 UTC (rev 51)
@@ -36,15 +36,19 @@
*/
public class PremiseTableAndDefault<T> extends PremiseTable<T> {
+ private final int ruleIdentifier;
+
private final T defaultSubject;
private final T defaultPredicate;
private final T defaultObject;
- public PremiseTableAndDefault(final AbstractPremiseAndDefault<T> premise,
+ public PremiseTableAndDefault(final int ruleIdentifier,
+ final AbstractPremiseAndDefault<T> premise,
final IFactSet<T> factSet, final EnumPremiseMode mode) {
super(premise, factSet, mode);
+ this.ruleIdentifier = ruleIdentifier;
defaultSubject = premise.getDefaultSubject();
defaultPredicate = premise.getDefaultPredicate();
defaultObject = premise.getDefaultObject();
@@ -60,11 +64,11 @@
: predicate;
final T dobject = object == null ? defaultObject : object;
// FIXMELUC is it better a local minimum implementation of fact set
- view = new SingleFactSet<T>(null, dsubject, dpredicate, dobject);
- view.addFact(new CauseIdentifiedFact<T>(dsubject, dpredicate,
- dobject, 0/*
- * 0 as dummy value , fact not in knowledge base
- */), false);
+ // view = new SingleFactSet<T>(null, dsubject, dpredicate, dobject);
+ // view.addFact(new CauseIdentifiedFact<T>(dsubject, dpredicate,
+ // dobject, 0), false);
+ factSet.addFact(new CauseIdentifiedFact<T>(dsubject, dpredicate,
+ dobject, ruleIdentifier), false);
}
return view;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-30 11:57:47 UTC (rev 50)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-31 04:08:06 UTC (rev 51)
@@ -39,19 +39,20 @@
public class PremiseTableFactory<T> {
/**
- *
+ * @param ruleIdentifier
* @param premise
* @param mapping
* @param factSet
* @return
*/
- public PremiseTable<T> create(final IPremise<T> premise,
+ public PremiseTable<T> create(final int ruleIdentifier,
+ final IPremise<T> premise,
final VariableKeyValueMapping<T> mapping, final IFactSet<T> factSet) {
final IFactSet<T> view = factSet.view(premise.getSubject(),
premise.getPredicate(), premise.getObject());
final PremiseTable<T> premiseTable;
if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
- premiseTable = new PremiseTableAndDefault<T>(
+ premiseTable = new PremiseTableAndDefault<T>(ruleIdentifier,
(AbstractPremiseAndDefault<T>) premise, view,
premise.getMode());
} else {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-30 11:57:47 UTC (rev 50)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-31 04:08:06 UTC (rev 51)
@@ -127,14 +127,15 @@
break;
case DEFAULT:
assertNotBuitlin(builtin, premise);
- premiseTable = premiseTableFactory.create(premise, mapping,
- motor.getAllFactSet());
+ premiseTable = premiseTableFactory.create(reteRule.getIdentifier(),
+ premise, mapping, motor.getAllFactSet());
reteRule.add(premiseTable);
break;
case STANDARD:
if (builtin == null) {
final PremiseTable<T> factPremiseTable = premiseTableFactory
- .create(premise, mapping, motor.getAllFactSet());
+ .create(reteRule.getIdentifier(), premise, mapping,
+ motor.getAllFactSet());
reteRule.add(factPremiseTable);
premiseTable = factPremiseTable;
} else {
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2010-12-30 11:57:47 UTC (rev 50)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2010-12-31 04:08:06 UTC (rev 51)
@@ -91,8 +91,6 @@
rule.addConclusion(conclusion);
motor.addRule(rule);
- final ReteRule<String> reteRule = ((AllKnowledgeBase<String>) kb)
- .getReteRule(rule);
/*
* second rule for the sum
@@ -166,9 +164,10 @@
}
/**
+ * DISABLED TEST<br>
* can not works, not possible to retract list append do by append builtin
*/
- public void testListAppendAndPropertySum() {
+ public void _testListAppendAndPropertySum() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
final IKnowledgeBase<String> kb = kbFactory.create();
@@ -242,6 +241,8 @@
rule.addConclusion(conclusion);
motor.addRule(rule);
+ final ReteRule<String> reteRule = ((AllKnowledgeBase<String>) kb)
+ .getReteRule(rule);
rule = new Rule<String>();
// result list ?L
@@ -266,18 +267,35 @@
motor.addRule(rule);
+ final ReteRuleToString<String> reteRuleToString = new ReteRuleToString<String>();
+ // first assert
motor.assertFact(new Fact<String>("truc", "value", "5"));
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug(reteRuleToString.toString(reteRule));
+ }
assertValueList(builtinSupport, new String[] { "5" });
logSum(builtinSupport, "(5)");
+
+ // second assert
motor.assertFact(new Fact<String>("truc", "value", "7"));
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug(reteRuleToString.toString(reteRule));
+ }
assertValueList(builtinSupport, new String[] { "7", "5" });
logSum(builtinSupport, "(7,5)");
// motor.retractFact(new Fact<String>("truc", "value", "5"));
// logSum(builtinSupport, "(7)");
// assertValueList(builtinSupport, new String[] { "7" });
+
+ // third assert
motor.assertFact(new Fact<String>("truc", "value", "8"));
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug(reteRuleToString.toString(reteRule));
+ }
assertValueList(builtinSupport, new String[] { "8", "7", "5" });
logSum(builtinSupport, "(8,7,5)");
+
+ // retract second assertion
motor.retractFact(new Fact<String>("truc", "value", "7"));
logSum(builtinSupport, "(8,5)");
assertValueList(builtinSupport, new String[] { "8", "5" });
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java 2010-12-30 11:57:47 UTC (rev 50)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java 2010-12-31 04:08:06 UTC (rev 51)
@@ -73,7 +73,7 @@
final IFactSet<String> factSet = new AllFactSet<String>();
final VariableKeyValueMapping<String> mapping = new VariableKeyValueMapping<String>(
/**/new boolean[] { true/* X is key */, false /* Y is indexed value */});
- final PremiseTable<String> premiseTable = premiseTableFactory.create(
+ final PremiseTable<String> premiseTable = premiseTableFactory.create(0,
premise, mapping, factSet);
premiseTable.addListener(this);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-30 11:57:56
|
Revision: 50
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=50&view=rev
Author: luc_peuvrier
Date: 2010-12-30 11:57:47 +0000 (Thu, 30 Dec 2010)
Log Message:
-----------
clean up to go back to rev 45
Revision Links:
--------------
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=45&view=rev
Modified Paths:
--------------
trunk/reasoner4j/doc/builtin.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IBuiltinProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AllKnowledgeBase.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/IKnowledgeBase.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/KnowledgeBaseView.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/MainKnowledgeBaseFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/MotorFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/AbstractTestCase.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExistential.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTest.java
trunk/reasoner4j/src/test/resources/log4j.properties
Modified: trunk/reasoner4j/doc/builtin.txt
===================================================================
--- trunk/reasoner4j/doc/builtin.txt 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/doc/builtin.txt 2010-12-30 11:57:47 UTC (rev 50)
@@ -80,32 +80,3 @@
?CNP number ?NUMBER.
}.
- ------------------
-{
- ?CT a ConsumerType.
-} => {
- ?CNP consummerType ?CT.
-}.
-
-{
- ?CNP consummerType ?CTOFCNP.
- ?CTOFCNP value ?VOFCNP.
- ?CN consumerType ?CT.
- ?CT value ?V
- ?V mathNotLessThan ?VOFCNP .
- ?CNP list ?LIST. <--- default empty list if fact does not exist
- ?CN number ?N.
-} => {
- ?N inList ?LIST
-}.
-
-
-{
- ?CNP list ?LIST.
- ?LIST mathSum ?NUMBER.
-} => {
- #?CNP number ?NUMBER. <----- replacement of ?NUMBER
- ?CNP number ?NUMBER
-}
-
-
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -33,9 +33,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public interface IBuiltin<T, L> extends IConclusionListener<T> {
+public interface IBuiltin<T> extends IConclusionListener<T> {
/**
* in builtin fact parameter and result term are null
@@ -44,7 +43,7 @@
*/
IFact<T> getBuiltinFact();
- void initialize(BuiltinSupport<T, L> builtinSupport);
+ void initialize(BuiltinSupport<T> builtinSupport);
/**
* @param ruleIdentifier
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -35,9 +35,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public abstract class AbstractBuiltin<T, L> implements IBuiltin<T, L> {
+public abstract class AbstractBuiltin<T> implements IBuiltin<T> {
private final String subjectIdentifier;
@@ -45,7 +44,7 @@
private final String objectIdentifier;
- private BuiltinSupport<T, L> builtinSupport;
+ private BuiltinSupport<T> builtinSupport;
/** builtin fact, parameter and result term are null */
private IFact<T> builtinFact;
@@ -59,7 +58,7 @@
}
@Override
- public void initialize(final BuiltinSupport<T, L> builtinSupport) {
+ public void initialize(final BuiltinSupport<T> builtinSupport) {
this.builtinSupport = builtinSupport;
builtinFact = new Fact<T>(getTerm(subjectIdentifier),
getTerm(predicateIdentifier), getTerm(objectIdentifier));
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -35,9 +35,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class BlankNodeBuiltin<T, L> extends AbstractBuiltin<T, L> {
+public class BlankNodeBuiltin<T> extends AbstractBuiltin<T> {
public BlankNodeBuiltin() {
super(TermIdentifierConstant.EMPTY_TERM,
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -43,13 +43,12 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class BuiltinSupport<T, L> {
+public class BuiltinSupport<T> {
private final IBuitinTermProvider<T> buitinTermProvider;
- private final AllKnowledgeBase<T, L> knowledgeBase;
+ private final AllKnowledgeBase<T> knowledgeBase;
private final IBlankNodeProvider<T> blankNodeProvider;
@@ -64,7 +63,7 @@
private final IFactSet<T> allFactSet;
public BuiltinSupport(final IBuitinTermProvider<T> buitinTermProvider,
- final AllKnowledgeBase<T, L> knowledgeBase,
+ final AllKnowledgeBase<T> knowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
super();
this.buitinTermProvider = buitinTermProvider;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -36,9 +36,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class InListBuiltin<T, L> extends AbstractBuiltin<T, L> {
+public class InListBuiltin<T> extends AbstractBuiltin<T> {
public InListBuiltin() {
super(null, TermIdentifierConstant.IN_LIST_PREDICATE_IDENTIFIER, null);
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -39,9 +39,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class ListAppendBuiltin<T, L> extends AbstractBuiltin<T, L> {
+public class ListAppendBuiltin<T> extends AbstractBuiltin<T> {
public ListAppendBuiltin() {
super(null, TermIdentifierConstant.LIST_APPEND_PREDICATE_IDENTIFIER,
@@ -80,6 +79,8 @@
@Override
public void removed(final int ruleIdentifier, final T subject,
final T predicate, final T object) {
+ // FIXME __for test
+ System.err.println(subject + " " + predicate + " " + object);
// FIXMELUC list can be used elsewhere
// removeList(ruleIdentifier, object);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -40,7 +40,7 @@
*/
// FIXMELUC ListBuiltin no more needed
@Deprecated
-public class ListBuiltin<T, L> extends AbstractBuiltin<T, L> {
+public class ListBuiltin<T> extends AbstractBuiltin<T> {
@SuppressWarnings("unchecked")
private final List<T> emptyList = Collections.EMPTY_LIST;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -41,9 +41,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class MathProductBuiltin<T, L> extends AbstractBuiltin<T, L> {
+public class MathProductBuiltin<T> extends AbstractBuiltin<T> {
private final IBuiltinComputer<T> builtinComputer;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -41,9 +41,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class MathSumBuiltin<T, L> extends AbstractBuiltin<T, L> {
+public class MathSumBuiltin<T> extends AbstractBuiltin<T> {
private final IBuiltinComputer<T> builtinComputer;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -37,25 +37,24 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class DefaultBuiltinProvider<T, L> implements IBuiltinProvider<T, L> {
+public class DefaultBuiltinProvider<T> implements IBuiltinProvider<T> {
- private final List<IBuiltin<T, L>> builtinList = new LinkedList<IBuiltin<T, L>>();
+ private final List<IBuiltin<T>> builtinList = new LinkedList<IBuiltin<T>>();
public DefaultBuiltinProvider(final IBuiltinComputer<T> builtinComputer) {
super();
- builtinList.add(new BlankNodeBuiltin<T, L>());
- builtinList.add(new MathProductBuiltin<T, L>(builtinComputer));
- builtinList.add(new MathSumBuiltin<T, L>(builtinComputer));
+ builtinList.add(new BlankNodeBuiltin<T>());
+ builtinList.add(new MathProductBuiltin<T>(builtinComputer));
+ builtinList.add(new MathSumBuiltin<T>(builtinComputer));
// FIXMELUC ListBuiltin no more needed
// builtinList.add(new ListBuiltin<T>());
- builtinList.add(new InListBuiltin<T, L>());
- builtinList.add(new ListAppendBuiltin<T, L>());
+ builtinList.add(new InListBuiltin<T>());
+ builtinList.add(new ListAppendBuiltin<T>());
}
@Override
- public List<IBuiltin<T, L>> getBuiltinList() {
+ public List<IBuiltin<T>> getBuiltinList() {
return builtinList;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IBuiltinProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IBuiltinProvider.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IBuiltinProvider.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -31,10 +31,9 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public interface IBuiltinProvider<T, L> {
+public interface IBuiltinProvider<T> {
- List<IBuiltin<T, L>> getBuiltinList();
+ List<IBuiltin<T>> getBuiltinList();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -83,4 +83,32 @@
return "CauseIdentifiedFact [fact=" + fact + ", ruleIdentifier="
+ ruleIdentifier + "]";
}
+
+ // FIXMELUC hashcode/equals no rule id see motor
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((fact == null) ? 0 : fact.hashCode());
+ return result;
+ }
+
+ // FIXMELUC hashcode/equals no rule id see motor
+ @SuppressWarnings("unchecked")
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CauseIdentifiedFact<T> other = (CauseIdentifiedFact<T>) obj;
+ if (fact == null) {
+ if (other.fact != null)
+ return false;
+ } else if (!fact.equals(other.fact))
+ return false;
+ return true;
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -38,17 +38,15 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public abstract class AbstractKnowledgeBase<T, L> implements
- IKnowledgeBase<T, L> {
+public abstract class AbstractKnowledgeBase<T> implements IKnowledgeBase<T> {
private final Map<IKnowledgeBaseListener<T>, IFactSetListener<T>> listenerMap =
/**/new HashMap<IKnowledgeBaseListener<T>, IFactSetListener<T>>();
protected final IFactSet<T> factSet;
- private Motor<T, L> motor;
+ private Motor<T> motor;
public AbstractKnowledgeBase(final IFactSet<T> factSet) {
super();
@@ -59,11 +57,11 @@
return factSet;
}
- public Motor<T, L> getMotor() {
+ public Motor<T> getMotor() {
return motor;
}
- public void setMotor(final Motor<T, L> motor) {
+ public void setMotor(final Motor<T> motor) {
this.motor = motor;
}
@@ -108,15 +106,15 @@
}
@Override
- public IKnowledgeBase<T, L> view(final T subject, final T predicate,
+ public IKnowledgeBase<T> view(final T subject, final T predicate,
final T object) {
- final IKnowledgeBase<T, L> view;
+ final IKnowledgeBase<T> view;
final IFactSet<T> factSetView = factSet
.view(subject, predicate, object);
if (factSetView == null) {
view = null;
} else {
- final KnowledgeBaseView<T, L> knowledgeBaseView = new KnowledgeBaseView<T, L>(
+ final KnowledgeBaseView<T> knowledgeBaseView = new KnowledgeBaseView<T>(
this, factSetView);
knowledgeBaseView.setMotor(motor);
view = knowledgeBaseView;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AllKnowledgeBase.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AllKnowledgeBase.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AllKnowledgeBase.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -36,47 +36,32 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class AllKnowledgeBase<T, L> extends AbstractKnowledgeBase<T, L>
- implements IBlankNodeIdentifierProvider {
+public class AllKnowledgeBase<T> extends AbstractKnowledgeBase<T> implements
+ IBlankNodeIdentifierProvider {
- private final Map<T, L> literalMap = new HashMap<T, L>();
+ private final Map<Rule<T>, ReteRule<T>> reteRuleMap =
+ /**/new HashMap<Rule<T>, ReteRule<T>>();
- private final Map<Rule<T>, ReteRule<T, L>> reteRuleMap =
- /**/new HashMap<Rule<T>, ReteRule<T, L>>();
-
private int nextBlankNodeIdentifier;
AllKnowledgeBase() {
super(new AllFactSet<T>());
}
- public L getLiteral(final T term) {
- return literalMap.get(term);
- }
-
- public L setLiteral(final T term, final L literal) {
- return literalMap.put(term, literal);
- }
-
- public L removeLiteral(final T term) {
- return literalMap.remove(term);
- }
-
- public void addReteRule(final ReteRule<T, L> reteRule) {
+ public void addReteRule(final ReteRule<T> reteRule) {
reteRuleMap.put(reteRule.getRule(), reteRule);
}
public void removeReteRule(final Rule<T> rule) {
- final ReteRule<T, L> reteRule = reteRuleMap.get(rule);
+ final ReteRule<T> reteRule = reteRuleMap.get(rule);
if (reteRule != null) {
reteRule.dispose();
}
}
@Fortest
- public ReteRule<T, L> getReteRule(final Rule<T> rule) {
+ public ReteRule<T> getReteRule(final Rule<T> rule) {
return reteRuleMap.get(rule);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/IKnowledgeBase.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/IKnowledgeBase.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/IKnowledgeBase.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -31,9 +31,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public interface IKnowledgeBase<T, L> {
+public interface IKnowledgeBase<T> {
void addListener(IKnowledgeBaseListener<T> listener);
@@ -45,7 +44,7 @@
IFact<T> get(T subject, T predicate, T object);
- IKnowledgeBase<T, L> view(T subject, T predicate, T object);
+ IKnowledgeBase<T> view(T subject, T predicate, T object);
Iterator<IFact<T>> iterator();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/KnowledgeBaseView.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/KnowledgeBaseView.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/KnowledgeBaseView.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -29,13 +29,12 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class KnowledgeBaseView<T, L> extends AbstractKnowledgeBase<T, L> {
+public class KnowledgeBaseView<T> extends AbstractKnowledgeBase<T> {
- private final IKnowledgeBase<T, L> parentKnowledgeBase;
+ private final IKnowledgeBase<T> parentKnowledgeBase;
- KnowledgeBaseView(final IKnowledgeBase<T, L> parentKnowledgeBase,
+ KnowledgeBaseView(final IKnowledgeBase<T> parentKnowledgeBase,
final IFactSet<T> factSet) {
super(factSet);
this.parentKnowledgeBase = parentKnowledgeBase;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/MainKnowledgeBaseFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/MainKnowledgeBaseFactory.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/MainKnowledgeBaseFactory.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -27,11 +27,10 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public final class MainKnowledgeBaseFactory<T, L> {
+public final class MainKnowledgeBaseFactory<T> {
- public IKnowledgeBase<T, L> create() {
- return new AllKnowledgeBase<T, L>();
+ public IKnowledgeBase<T> create() {
+ return new AllKnowledgeBase<T>();
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -33,13 +33,12 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public interface IMotor<T, L> {
+public interface IMotor<T> {
- void addBuiltin(IBuiltinProvider<T, L> builtinProvider);
+ void addBuiltin(IBuiltinProvider<T> builtinProvider);
- void addBuiltin(IBuiltin<T, L> builtin);
+ void addBuiltin(IBuiltin<T> builtin);
/**
* add a rule<br>
@@ -56,6 +55,6 @@
void retractFact(IFact<T> fact);
- IKnowledgeBase<T, L> getKnowledgeBase();
+ IKnowledgeBase<T> getKnowledgeBase();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -24,10 +24,12 @@
import java.util.Deque;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.log4j.Logger;
@@ -53,41 +55,40 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class Motor<T, L> implements IConclusionListener<T>, IMotor<T, L> {
+public class Motor<T> implements IConclusionListener<T>, IMotor<T> {
private final static Logger LOGGER = Logger.getLogger(Motor.class);
- private final AllKnowledgeBase<T, L> allKnowledgeBase;
+ private final AllKnowledgeBase<T> allKnowledgeBase;
- private final ReteBuilder<T, L> reteBuilder = new ReteBuilder<T, L>(this);
+ private final ReteBuilder<T> reteBuilder = new ReteBuilder<T>(this);
private final Deque<CauseIdentifiedFact<T>> assertedStack = new LinkedList<CauseIdentifiedFact<T>>();
private final Deque<CauseIdentifiedFact<T>> retractedStack = new LinkedList<CauseIdentifiedFact<T>>();
- private final Map<IFact<T>, IBuiltin<T, L>> builtinMap = new HashMap<IFact<T>, IBuiltin<T, L>>();
+ private final Map<IFact<T>, IBuiltin<T>> builtinMap = new HashMap<IFact<T>, IBuiltin<T>>();
private final IBlankNodeProvider<T> blankNodeProvider;
private final IBuitinTermProvider<T> buitinTermProvider;
- private BuiltinSupport<T, L> builtinSupport;
+ private BuiltinSupport<T> builtinSupport;
- Motor(final IKnowledgeBase<T, L> allKnowledgeBase,
+ Motor(final IKnowledgeBase<T> allKnowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
this(allKnowledgeBase, blankNodeProvider, null);
}
- Motor(final IKnowledgeBase<T, L> allKnowledgeBase,
+ Motor(final IKnowledgeBase<T> allKnowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider,
final IBuitinTermProvider<T> buitinTermProvider) {
super();
if (!AllKnowledgeBase.class.equals(allKnowledgeBase.getClass())) {
throw new ReasonerException("bad knowledge base argument type");
}
- this.allKnowledgeBase = (AllKnowledgeBase<T, L>) allKnowledgeBase;
+ this.allKnowledgeBase = (AllKnowledgeBase<T>) allKnowledgeBase;
this.allKnowledgeBase.setMotor(this);
this.blankNodeProvider = blankNodeProvider;
this.buitinTermProvider = buitinTermProvider;
@@ -102,18 +103,17 @@
}
@Override
- public void addBuiltin(final IBuiltinProvider<T, L> builtinProvider) {
- final List<IBuiltin<T, L>> buitinList = builtinProvider
- .getBuiltinList();
- for (IBuiltin<T, L> builtin : buitinList) {
+ public void addBuiltin(final IBuiltinProvider<T> builtinProvider) {
+ final List<IBuiltin<T>> buitinList = builtinProvider.getBuiltinList();
+ for (IBuiltin<T> builtin : buitinList) {
addBuiltin(builtin);
}
}
@Override
- public void addBuiltin(final IBuiltin<T, L> builtin) {
+ public void addBuiltin(final IBuiltin<T> builtin) {
if (builtinSupport == null) { // lazy initialization
- builtinSupport = new BuiltinSupport<T, L>(buitinTermProvider,
+ builtinSupport = new BuiltinSupport<T>(buitinTermProvider,
allKnowledgeBase, blankNodeProvider);
}
builtin.initialize(builtinSupport);
@@ -121,20 +121,21 @@
}
@Fortest
- public BuiltinSupport<T, L> getBuiltinSupport() {
+ public BuiltinSupport<T> getBuiltinSupport() {
if (builtinSupport == null) { // lazy initialization
- builtinSupport = new BuiltinSupport<T, L>(buitinTermProvider,
+ builtinSupport = new BuiltinSupport<T>(buitinTermProvider,
allKnowledgeBase, blankNodeProvider);
}
return builtinSupport;
}
- public IBuiltin<T, L> builtin(final IFact<T> fact) {
+ public IBuiltin<T> builtin(final IFact<T> fact) {
T subject = fact.getSubject();
T predicate = fact.getPredicate();
// T object=fact.getObject();
// FIXMELUC builtin always based on predicate ?
- IBuiltin<T, L> builtin;
+ // FIXMELUC why not a builtin premise to avoid this ?
+ IBuiltin<T> builtin;
builtin = builtinMap.get(new Fact<T>(null, predicate, null));
if (builtin == null) {
builtin = builtinMap.get(new Fact<T>(subject, predicate, null));
@@ -144,7 +145,7 @@
@Override
public void addRule(final Rule<T> rule) {
- final ReteRule<T, L> reteRule = reteBuilder.addRule(rule);
+ final ReteRule<T> reteRule = reteBuilder.addRule(rule);
allKnowledgeBase.addReteRule(reteRule);
// TODO create fact conclusion of new added rule according to existing
// fact
@@ -178,26 +179,63 @@
}
public void updateKnowledgeBaseWithConclusion() {
- // FIXMELUC _multiple occurrence of same fact
+ // FIXMELUC _multiple occurrence of same fact, do assert ?
+ final Set<IFact<T>> assertedSet = new HashSet<IFact<T>>();
+ final Set<IFact<T>> retractedSet = new HashSet<IFact<T>>();
+
CauseIdentifiedFact<T> asserted = assertedStack.poll();
CauseIdentifiedFact<T> retracted = retractedStack.poll();
- do {
+ while (asserted != null || retracted != null) {
if (retracted != null) {
- if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("conclusion retraction " + retracted,
+ if (assertedStack.contains(retracted)
+ || retracted.equals(asserted)) {
+ throw new ReasonerException("retracted " + retracted
+ + " is in asserted stack",
retracted.getCreationTraceForDebug());
}
+ if (assertedSet.contains(retracted.getFact())) {
+ throw new ReasonerException("retracted " + retracted
+ + " has been asserted",
+ retracted.getCreationTraceForDebug());
+ }
+ if (retractedSet.contains(retracted.getFact())) {
+ throw new ReasonerException("retracted " + retracted
+ + " has been retracted",
+ retracted.getCreationTraceForDebug());
+ }
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("conclusion retraction " + retracted);
+ }
+ retractedSet.add(retracted.getFact());
+
allKnowledgeBase.retractFactInFactSet(retracted);
retracted = retractedStack.poll();
} else if (asserted != null) {
- if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("conclusion assertion " + asserted,
+ if (retractedStack.contains(asserted)
+ || asserted.equals(retracted)) {
+ throw new ReasonerException("asserted " + asserted
+ + " is in retracted stack",
asserted.getCreationTraceForDebug());
}
+ if (assertedSet.contains(asserted.getFact())) {
+ throw new ReasonerException("asserted " + asserted
+ + " has been asserted",
+ asserted.getCreationTraceForDebug());
+ }
+ if (retractedSet.contains(asserted.getFact())) {
+ throw new ReasonerException("asserted " + asserted
+ + " has been retracted",
+ asserted.getCreationTraceForDebug());
+ }
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("conclusion assertion " + asserted);
+ }
+ assertedSet.add(asserted.getFact());
+
allKnowledgeBase.assertFactInFactSet(asserted);
asserted = assertedStack.poll();
}
- } while (asserted != null || retracted != null);
+ }
}
@Override
@@ -212,8 +250,8 @@
@Override
public void conclusionViewRetraction(final CauseIdentifiedFact<T> fact) {
- final IKnowledgeBase<T, L> view = allKnowledgeBase.view(
- fact.getSubject(), fact.getPredicate(), fact.getObject());
+ final IKnowledgeBase<T> view = allKnowledgeBase.view(fact.getSubject(),
+ fact.getPredicate(), fact.getObject());
final Iterator<IFact<T>> iterator = view.iterator();
while (iterator.hasNext()) {
// conclusionRetraction(new CauseIdentifiedFact<T>(iterator.next(),
@@ -228,7 +266,7 @@
}
@Override
- public AllKnowledgeBase<T, L> getKnowledgeBase() {
+ public AllKnowledgeBase<T> getKnowledgeBase() {
return allKnowledgeBase;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/MotorFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/MotorFactory.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/MotorFactory.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -30,19 +30,18 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public final class MotorFactory<T, L> {
+public final class MotorFactory<T> {
- public IMotor<T, L> create(final IKnowledgeBase<T, L> allKnowledgeBase,
+ public IMotor<T> create(final IKnowledgeBase<T> allKnowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
- return new Motor<T, L>(allKnowledgeBase, blankNodeProvider);
+ return new Motor<T>(allKnowledgeBase, blankNodeProvider);
}
- public IMotor<T, L> create(final IKnowledgeBase<T, L> allKnowledgeBase,
+ public IMotor<T> create(final IKnowledgeBase<T> allKnowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider,
final IBuitinTermProvider<T> buitinTermProvider) {
- return new Motor<T, L>(allKnowledgeBase, blankNodeProvider,
+ return new Motor<T>(allKnowledgeBase, blankNodeProvider,
buitinTermProvider);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -30,8 +30,8 @@
*
* @param <T>
*/
-public abstract class AbstractPremiseTable<T, L> extends AbstractTable<T>
- implements IPremiseTable<T, L> {
+public abstract class AbstractPremiseTable<T> extends AbstractTable<T>
+ implements IPremiseTable<T> {
protected final IPremise<T> premise;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -41,13 +41,12 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class AssertedPremiseTable<T, L> implements IPremiseTable<T, L> {
+public class AssertedPremiseTable<T> implements IPremiseTable<T> {
private final int ruleIdentifier;
- private final AllKnowledgeBase<T, L> knowledgeBase;
+ private final AllKnowledgeBase<T> knowledgeBase;
private final IBlankNodeProvider<T> blankNodeProvider;
@@ -59,7 +58,7 @@
public AssertedPremiseTable(final int ruleIdentifier,
final IPremise<T> premise,
final VariableKeyValueMapping<T> mapping,
- final AllKnowledgeBase<T, L> knowledgeBase,
+ final AllKnowledgeBase<T> knowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
super();
this.ruleIdentifier = ruleIdentifier;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -37,16 +37,15 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class BuiltinPremiseTable<T, L> extends AbstractPremiseTable<T, L> {
+public class BuiltinPremiseTable<T> extends AbstractPremiseTable<T> {
private final int ruleIdentifier;
- private final IBuiltin<T, L> buitin;
+ private final IBuiltin<T> buitin;
public BuiltinPremiseTable(final IPremise<T> premise,
- final int ruleIdentifier, final IBuiltin<T, L> buitin,
+ final int ruleIdentifier, final IBuiltin<T> buitin,
final VariableKeyValueMapping<T> mapping) {
super(premise);
this.ruleIdentifier = ruleIdentifier;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IPremiseTable.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IPremiseTable.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -31,7 +31,7 @@
*
* @param <T>
*/
-public interface IPremiseTable<T, L> extends ITable<T> {
+public interface IPremiseTable<T> extends ITable<T> {
void dispose();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -38,9 +38,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class PremiseTable<T, L> extends AbstractPremiseTable<T, L> implements
+public class PremiseTable<T> extends AbstractPremiseTable<T> implements
IFactSetListener<T> {
protected final IFactSet<T> factSet;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -33,9 +33,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class PremiseTableAndDefault<T, L> extends PremiseTable<T, L> {
+public class PremiseTableAndDefault<T> extends PremiseTable<T> {
private final T defaultSubject;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -33,9 +33,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class ReteRule<T, L> {
+public class ReteRule<T> {
private static final int INITIAL_RULE_IDENTIFIER = 0;
@@ -49,7 +48,7 @@
private final Rule<T> rule;
- private final List<IPremiseTable<T, L>> premiseTableList = new LinkedList<IPremiseTable<T, L>>();
+ private final List<IPremiseTable<T>> premiseTableList = new LinkedList<IPremiseTable<T>>();
private ITable<T> rootTable;
@@ -71,12 +70,12 @@
this.rootTable = rootTable;
}
- public boolean add(final IPremiseTable<T, L> premiseTable) {
+ public boolean add(final IPremiseTable<T> premiseTable) {
return premiseTableList.add(premiseTable);
}
public void dispose() {
- for (IPremiseTable<T, L> premiseTable : premiseTableList) {
+ for (IPremiseTable<T> premiseTable : premiseTableList) {
premiseTable.dispose();
}
premiseTableList.clear();
@@ -88,7 +87,7 @@
}
@Fortest
- public List<IPremiseTable<T, L>> getPremiseTableList() {
+ public List<IPremiseTable<T>> getPremiseTableList() {
return premiseTableList;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -35,9 +35,8 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class PremiseTableFactory<T, L> {
+public class PremiseTableFactory<T> {
/**
*
@@ -46,18 +45,17 @@
* @param factSet
* @return
*/
- public PremiseTable<T, L> create(final IPremise<T> premise,
+ public PremiseTable<T> create(final IPremise<T> premise,
final VariableKeyValueMapping<T> mapping, final IFactSet<T> factSet) {
final IFactSet<T> view = factSet.view(premise.getSubject(),
premise.getPredicate(), premise.getObject());
- final PremiseTable<T, L> premiseTable;
+ final PremiseTable<T> premiseTable;
if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
- premiseTable = new PremiseTableAndDefault<T, L>(
+ premiseTable = new PremiseTableAndDefault<T>(
(AbstractPremiseAndDefault<T>) premise, view,
premise.getMode());
} else {
- premiseTable = new PremiseTable<T, L>(premise, view,
- premise.getMode());
+ premiseTable = new PremiseTable<T>(premise, view, premise.getMode());
}
return premiseTable;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -62,27 +62,26 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
-public class ReteBuilder<T, L> implements IReteNodeVisitor<T> {
+public class ReteBuilder<T> implements IReteNodeVisitor<T> {
- private final PremiseTableFactory<T, L> premiseTableFactory = new PremiseTableFactory<T, L>();
+ private final PremiseTableFactory<T> premiseTableFactory = new PremiseTableFactory<T>();
private final MergeTableFactory<T> mergeTableFactory = new MergeTableFactory<T>();
private Deque<ITable<T>> stack;
- private final Motor<T, L> motor;
+ private final Motor<T> motor;
- private ReteRule<T, L> reteRule;
+ private ReteRule<T> reteRule;
- public ReteBuilder(final Motor<T, L> motor) {
+ public ReteBuilder(final Motor<T> motor) {
super();
this.motor = motor;
}
- public ReteRule<T, L> addRule(final Rule<T> rule) {
- reteRule = new ReteRule<T, L>(rule);
+ public ReteRule<T> addRule(final Rule<T> rule) {
+ reteRule = new ReteRule<T>(rule);
IReteTableNode<T> previousNode = null;
final Iterator<IPremise<T>> premiseIterator = rule.premiseIterator();
while (premiseIterator.hasNext()) {
@@ -106,7 +105,7 @@
stack = new LinkedList<ITable<T>>();
rootNode.accept(this);
stack = null;// NOPMD free memory
- final ReteRule<T, L> result = reteRule;
+ final ReteRule<T> result = reteRule;
reteRule = null;// NOPMD release/free memory
return result;
}
@@ -115,13 +114,13 @@
public void visit(final PremiseReteNode<T> premiseReteNode) {
final IPremise<T> premise = premiseReteNode.getPremise();
final VariableKeyValueMapping<T> mapping = premiseReteNode.getMapping();
- final IPremiseTable<T, L> premiseTable;
- final IBuiltin<T, L> builtin = buitin(premise);
+ final IPremiseTable<T> premiseTable;
+ final IBuiltin<T> builtin = buitin(premise);
switch (premise.getType()) {
case ASSERTED:
assertNotBuitlin(builtin, premise);
// FIXMELUC use of premiseTableFactory
- premiseTable = new AssertedPremiseTable<T, L>(
+ premiseTable = new AssertedPremiseTable<T>(
reteRule.getIdentifier(), premise, mapping,
motor.getKnowledgeBase(), motor.getBlankNodeProvider());
reteRule.add(premiseTable);
@@ -134,13 +133,13 @@
break;
case STANDARD:
if (builtin == null) {
- final PremiseTable<T, L> factPremiseTable = premiseTableFactory
+ final PremiseTable<T> factPremiseTable = premiseTableFactory
.create(premise, mapping, motor.getAllFactSet());
reteRule.add(factPremiseTable);
premiseTable = factPremiseTable;
} else {
// FIXMELUC use of premiseTableFactory
- premiseTable = new BuiltinPremiseTable<T, L>(premise,
+ premiseTable = new BuiltinPremiseTable<T>(premise,
reteRule.getIdentifier(), builtin, mapping);
}
break;
@@ -150,26 +149,26 @@
stack.push(premiseTable);
}
- private IBuiltin<T, L> buitin(final IPremise<T> premise) {
+ private IBuiltin<T> buitin(final IPremise<T> premise) {
final IFact<T> fact = new Fact<T>(premise.getSubject(),
premise.getPredicate(), premise.getObject());
return motor.builtin(fact);
}
- private IBuiltin<T, L> buitin(final IConclusion<T> conclusion) {
+ private IBuiltin<T> buitin(final IConclusion<T> conclusion) {
final IFact<T> fact = new Fact<T>(conclusion.getSubject(),
conclusion.getPredicate(), conclusion.getObject());
return motor.builtin(fact);
}
- private void assertNotBuitlin(final IBuiltin<T, L> builtin,
+ private void assertNotBuitlin(final IBuiltin<T> builtin,
final IPremise<T> premise) {
if (builtin != null) {
throw new ReasonerException("can not be a buitlin : " + premise);
}
}
- private void assertNotBuitlin(final IBuiltin<T, L> builtin,
+ private void assertNotBuitlin(final IBuiltin<T> builtin,
final IConclusion<T> conclusion) {
if (builtin != null) {
throw new ReasonerException("can not be a buitlin : " + conclusion);
@@ -195,7 +194,7 @@
final ITable<T> table = stack.peek();
final IConclusion<T> conclusion = conclusionReteNode.getConclusion();
final int[] mapping = conclusionReteNode.getMapping();
- final IBuiltin<T, L> builtin = buitin(conclusion);
+ final IBuiltin<T> builtin = buitin(conclusion);
@SuppressWarnings("unused")
final IConclusionNotifier<T> conclusionNotifier;
switch (conclusion.getType()) {
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/AbstractTestCase.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/AbstractTestCase.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/AbstractTestCase.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -36,9 +36,8 @@
public abstract class AbstractTestCase extends TestCase implements
IBlankNodeProvider<String>, IBuitinTermProvider<String> {
- protected final DefaultBuiltinProvider<String, String> defaultBuiltinProvider =
- /**/new DefaultBuiltinProvider<String, String>(
- new BuiltinComputerForTests());
+ protected final DefaultBuiltinProvider<String> defaultBuiltinProvider =
+ /**/new DefaultBuiltinProvider<String>(new BuiltinComputerForTests());
@Override
public String getBlankNode(final int blankNodeIdentifier) {
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -34,16 +34,15 @@
* @author luc peuvrier
*
* @param <T>
- * @param <L>
*/
@Fortest
-public class ReteRuleToString<T, L> implements ITableVisitor<T> {
+public class ReteRuleToString<T> implements ITableVisitor<T> {
private StringBuilder stringBuilder;
private int tableNumber;
- public String toString(final ReteRule<T, L> reteRule) {
+ public String toString(final ReteRule<T> reteRule) {
String result = null;
try {
stringBuilder = new StringBuilder();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -58,10 +58,10 @@
* ( ?A "x" ?B ) imply ( ?A "has" "x" )
*/
public void testSinglePremise() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
- final IKnowledgeBase<String, String> kb = kbFactory.create();
- final IMotor<String, String> motor = motorFactory.create(kb, this);
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this);
final Rule<String> rule = new Rule<String>();
final IPremise<String> premise = new Premise<String>(
/* subject */"?A", null,
@@ -94,8 +94,8 @@
* imply (?X "a" "herbivore")
*/
public void testMultiplePremise() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
final Rule<String> rule = new Rule<String>();
IPremise<String> premise = new Premise<String>(
/* subject */"?X", null,
@@ -146,10 +146,8 @@
final IFact<String> secondFact = list2
.remove(secondPremiseIndex);
final IFact<String> thirdFact = list2.get(0);
- final IKnowledgeBase<String, String> kb = kbFactory
- .create();
- final IMotor<String, String> motor = motorFactory.create(
- kb, this);
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this);
motor.addRule(rule);
motor.assertFact(firstFact);
assertFalse(kb.contains(expectedConclusion));
@@ -178,10 +176,10 @@
}
public void testSameConclusion() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
- final IKnowledgeBase<String, String> kb = kbFactory.create();
- final IMotor<String, String> motor = motorFactory.create(kb, this);
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this);
// first rule
Rule<String> rule = new Rule<String>();
IPremise<String> premise = new Premise<String>(
@@ -224,10 +222,10 @@
}
public void testRetract() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
- final IKnowledgeBase<String, String> kb = kbFactory.create();
- final IMotor<String, String> motor = motorFactory.create(kb, this);
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this);
Rule<String> rule = new Rule<String>();
final IPremise<String> premise = new Premise<String>(
/* subject */"?X", null,
@@ -257,7 +255,7 @@
assertNull(kb.get("food", "available", "gateau"));
}
- private class IncrementBuiltin extends AbstractBuiltin<String, String> {
+ private class IncrementBuiltin extends AbstractBuiltin<String> {
public IncrementBuiltin() {
super(null, "increment", null);
}
@@ -274,11 +272,10 @@
}
public void testCountRetract() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
- final IKnowledgeBase<String, String> kb = kbFactory.create();
- final IMotor<String, String> motor = motorFactory
- .create(kb, this, this);
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
motor.addBuiltin(new IncrementBuiltin());
// first rule
Rule<String> rule = new Rule<String>();
@@ -328,8 +325,7 @@
assertNull(kb.get("myCar", "koCount", "2"));
}
- private void logKoCount(final String title,
- final IKnowledgeBase<String, String> kb) {
+ private void logKoCount(final String title, final IKnowledgeBase<String> kb) {
if (LOGGER.isDebugEnabled()) {
final Iterator<IFact<String>> iterator = kb.view("myCar",
"koCount", null).iterator();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -51,11 +51,10 @@
private static final Logger LOGGER = Logger.getLogger(TestBuiltin.class);
public void testPropertySetToProductResult() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
- final IKnowledgeBase<String, String> kb = kbFactory.create();
- final IMotor<String, String> motor = motorFactory
- .create(kb, this, this);
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
motor.addBuiltin(defaultBuiltinProvider);
Rule<String> rule = new Rule<String>();
@@ -139,40 +138,44 @@
// :hasXAcceleration 20.0 ;
// :hasElapsedTime 0.3 .
- IFact<String> fact;
- fact = new Fact<String>(":creamTart", ":hasElapsedTime", "0.3");
- motor.assertFact(fact);
- fact = new Fact<String>(":creamTart", ":hasXAcceleration", "20.0");
- motor.assertFact(fact);
+ motor.assertFact(
+ /**/new Fact<String>(":creamTart", ":hasElapsedTime", "0.3"));
+ motor.assertFact(
+ /**/new Fact<String>(":creamTart", ":hasXAcceleration", "20.0"));
- final IFactSet<String> allFactSet = ((Motor<String, String>) motor)
+ // assert result accessing to internal fact set
+ final IFactSet<String> allFactSet = ((Motor<String>) motor)
.getAllFactSet();
final IFactSet<String> view = allFactSet.view(":creamTart", ":hasX",
null);
assertNotNull(view);
-
- // assert result accessing to internal fact set
Iterator<IFact<String>> iterator = view.iterator();
assertTrue(iterator.hasNext());
assertEquals("0.8999999999999999", iterator.next().getObject());
assertFalse(iterator.hasNext());
// assert result accessing knowledge base view
- IKnowledgeBase<String, String> kbView = kb.view(":creamTart", ":hasX",
- null);
+ IKnowledgeBase<String> kbView = kb.view(":creamTart", ":hasX", null);
assertNotNull(kbView);
iterator = kbView.iterator();
assertTrue(iterator.hasNext());
assertEquals("0.8999999999999999", iterator.next().getObject());
assertFalse(iterator.hasNext());
+
+ // retract test
+ motor.retractFact(
+ /**/new Fact<String>(":creamTart", ":hasElapsedTime", "0.3"));
+ kbView = kb.view(":creamTart", ":hasX", null);
+ assertNotNull(kbView);
+ iterator = kbView.iterator();
+ assertFalse(iterator.hasNext());
}
public void testPropertyIsProductResultOfAnOtherProperty() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
- final IKnowledgeBase<String, String> kb = kbFactory.create();
- final IMotor<String, String> motor = motorFactory
- .create(kb, this, this);
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
motor.addBuiltin(defaultBuiltinProvider);
Rule<String> rule = new Rule<String>();
@@ -225,14 +228,13 @@
fact = new Fact<String>("truc", "factor", "6");
motor.assertFact(fact);
- final IFactSet<String> allFactSet = ((Motor<String, String>) motor)
+ final IFactSet<String> allFactSet = ((Motor<String>) motor)
.getAllFactSet();
final IFactSet<String> view = allFactSet.view(null, "xxx", null);
assertNotNull(view);
assertFalse(view.iterator().hasNext());
- final IKnowledgeBase<String, String> kbView = kb
- .view(null, "xxx", null);
+ final IKnowledgeBase<String> kbView = kb.view(null, "xxx", null);
assertNotNull(kbView);
assertFalse(kbView.iterator().hasNext());
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExistential.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExistential.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExistential.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -47,12 +47,11 @@
* ( ?T "a" "t" ) => ( ?CT "a" "ct" )
*/
public void test() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
- final IKnowledgeBase<String, String> kb = kbFactory.create();
- final IMotor<String, String> motor = motorFactory
- .create(kb, this, this);
- motor.addBuiltin(new BlankNodeBuiltin<String, String>());
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
+ motor.addBuiltin(new BlankNodeBuiltin<String>());
final Rule<String> rule = new Rule<String>();
IPremise<String> premise = new Premise<String>(
/* subject */"?T", null,
@@ -83,7 +82,7 @@
LOGGER.debug(stringBuilder.toString());
}
- final IKnowledgeBase<String, String> view = kb.view(null, "a", "ct");
+ final IKnowledgeBase<String> view = kb.view(null, "a", "ct");
final Iterator<IFact<String>> iterator = view.iterator();
assertTrue(iterator.hasNext());
final IFact<String> created = iterator.next();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2010-12-29 10:11:09 UTC (rev 49)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2010-12-30 11:57:47 UTC (rev 50)
@@ -27,18 +27,22 @@
import net.sf.reasoner4j.builtin.impl.BuiltinSupport;
import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.kb.AllKnowledgeBase;
import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
import net.sf.reasoner4j.motor.IMotor;
import net.sf.reasoner4j.motor.Motor;
import net.sf.reasoner4j.motor.MotorFactory;
+import net.sf.reasoner4j.rete.entity.ReteRule;
import net.sf.reasoner4j.rule.AffectConclusion;
import net.sf.reasoner4j.rule.AssertConclusion;
import net.sf.reasoner4j.rule.AssertedPremise;
import net.sf.reasoner4j.rule.IConclusion;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
+import net.sf.reasoner4j.rule.PremiseAndDefaultNotConclude;
import net.sf.reasoner4j.rule.PremiseAndDefaultNotListening;
+import net.sf.reasoner4j.rule.ReplaceConclusion;
import net.sf.reasoner4j.rule.Rule;
import org.apache.log4j.Logger;
@@ -54,13 +58,12 @@
.getLogger(TestExpressionCompute.class);
public void testListInListAndPropertySum() {
- final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
- final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
- final IKnowledgeBase<String, String> kb = kbFactory.create();
- final IMotor<String, String> motor = motorFactory
- .create(kb, this, this);
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
motor.addBuiltin(defaultBuiltinProvider);
- final BuiltinSupport<String, String> builtinSupport = ((Motor<String, String>) motor)
+ final BuiltinSupport<String> builtinSupport = ((Motor<String>) motor)
.getBuiltinSupport();
/*
@@ -88,6 +91,8 @@
rule.addConclusion(conclusion);
motor.addRule(rule);
+ final ReteRule<String>...
[truncated message content] |
|
From: <luc...@us...> - 2010-12-29 10:11:15
|
Revision: 49
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=49&view=rev
Author: luc_peuvrier
Date: 2010-12-29 10:11:09 +0000 (Wed, 29 Dec 2010)
Log Message:
-----------
new trunk from rev 45
Revision Links:
--------------
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=45&view=rev
Added Paths:
-----------
trunk/reasoner4j/
Removed Paths:
-------------
trunktmp/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-29 10:10:05
|
Revision: 48
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=48&view=rev
Author: luc_peuvrier
Date: 2010-12-29 10:09:59 +0000 (Wed, 29 Dec 2010)
Log Message:
-----------
rev 46 removal
Revision Links:
--------------
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=46&view=rev
Removed Paths:
-------------
trunk/reasoner4j/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-29 10:07:01
|
Revision: 47
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=47&view=rev
Author: luc_peuvrier
Date: 2010-12-29 10:06:55 +0000 (Wed, 29 Dec 2010)
Log Message:
-----------
tag rev 45
Revision Links:
--------------
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=45&view=rev
Added Paths:
-----------
trunktmp/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-29 06:06:41
|
Revision: 46
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=46&view=rev
Author: luc_peuvrier
Date: 2010-12-29 06:06:33 +0000 (Wed, 29 Dec 2010)
Log Message:
-----------
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IBuiltinProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AllKnowledgeBase.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/IKnowledgeBase.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/KnowledgeBaseView.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/MainKnowledgeBaseFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/MotorFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/AbstractTestCase.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExistential.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTest.java
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -33,8 +33,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public interface IBuiltin<T> extends IConclusionListener<T> {
+public interface IBuiltin<T, L> extends IConclusionListener<T> {
/**
* in builtin fact parameter and result term are null
@@ -43,7 +44,7 @@
*/
IFact<T> getBuiltinFact();
- void initialize(BuiltinSupport<T> builtinSupport);
+ void initialize(BuiltinSupport<T, L> builtinSupport);
/**
* @param ruleIdentifier
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -35,8 +35,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public abstract class AbstractBuiltin<T> implements IBuiltin<T> {
+public abstract class AbstractBuiltin<T, L> implements IBuiltin<T, L> {
private final String subjectIdentifier;
@@ -44,7 +45,7 @@
private final String objectIdentifier;
- private BuiltinSupport<T> builtinSupport;
+ private BuiltinSupport<T, L> builtinSupport;
/** builtin fact, parameter and result term are null */
private IFact<T> builtinFact;
@@ -58,7 +59,7 @@
}
@Override
- public void initialize(final BuiltinSupport<T> builtinSupport) {
+ public void initialize(final BuiltinSupport<T, L> builtinSupport) {
this.builtinSupport = builtinSupport;
builtinFact = new Fact<T>(getTerm(subjectIdentifier),
getTerm(predicateIdentifier), getTerm(objectIdentifier));
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -35,8 +35,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class BlankNodeBuiltin<T> extends AbstractBuiltin<T> {
+public class BlankNodeBuiltin<T, L> extends AbstractBuiltin<T, L> {
public BlankNodeBuiltin() {
super(TermIdentifierConstant.EMPTY_TERM,
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -43,12 +43,13 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class BuiltinSupport<T> {
+public class BuiltinSupport<T, L> {
private final IBuitinTermProvider<T> buitinTermProvider;
- private final AllKnowledgeBase<T> knowledgeBase;
+ private final AllKnowledgeBase<T, L> knowledgeBase;
private final IBlankNodeProvider<T> blankNodeProvider;
@@ -63,7 +64,7 @@
private final IFactSet<T> allFactSet;
public BuiltinSupport(final IBuitinTermProvider<T> buitinTermProvider,
- final AllKnowledgeBase<T> knowledgeBase,
+ final AllKnowledgeBase<T, L> knowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
super();
this.buitinTermProvider = buitinTermProvider;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -36,8 +36,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class InListBuiltin<T> extends AbstractBuiltin<T> {
+public class InListBuiltin<T, L> extends AbstractBuiltin<T, L> {
public InListBuiltin() {
super(null, TermIdentifierConstant.IN_LIST_PREDICATE_IDENTIFIER, null);
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -39,8 +39,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class ListAppendBuiltin<T> extends AbstractBuiltin<T> {
+public class ListAppendBuiltin<T, L> extends AbstractBuiltin<T, L> {
public ListAppendBuiltin() {
super(null, TermIdentifierConstant.LIST_APPEND_PREDICATE_IDENTIFIER,
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -40,7 +40,7 @@
*/
// FIXMELUC ListBuiltin no more needed
@Deprecated
-public class ListBuiltin<T> extends AbstractBuiltin<T> {
+public class ListBuiltin<T, L> extends AbstractBuiltin<T, L> {
@SuppressWarnings("unchecked")
private final List<T> emptyList = Collections.EMPTY_LIST;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -41,8 +41,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class MathProductBuiltin<T> extends AbstractBuiltin<T> {
+public class MathProductBuiltin<T, L> extends AbstractBuiltin<T, L> {
private final IBuiltinComputer<T> builtinComputer;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -41,8 +41,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class MathSumBuiltin<T> extends AbstractBuiltin<T> {
+public class MathSumBuiltin<T, L> extends AbstractBuiltin<T, L> {
private final IBuiltinComputer<T> builtinComputer;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -37,24 +37,25 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class DefaultBuiltinProvider<T> implements IBuiltinProvider<T> {
+public class DefaultBuiltinProvider<T, L> implements IBuiltinProvider<T, L> {
- private final List<IBuiltin<T>> builtinList = new LinkedList<IBuiltin<T>>();
+ private final List<IBuiltin<T, L>> builtinList = new LinkedList<IBuiltin<T, L>>();
public DefaultBuiltinProvider(final IBuiltinComputer<T> builtinComputer) {
super();
- builtinList.add(new BlankNodeBuiltin<T>());
- builtinList.add(new MathProductBuiltin<T>(builtinComputer));
- builtinList.add(new MathSumBuiltin<T>(builtinComputer));
+ builtinList.add(new BlankNodeBuiltin<T, L>());
+ builtinList.add(new MathProductBuiltin<T, L>(builtinComputer));
+ builtinList.add(new MathSumBuiltin<T, L>(builtinComputer));
// FIXMELUC ListBuiltin no more needed
// builtinList.add(new ListBuiltin<T>());
- builtinList.add(new InListBuiltin<T>());
- builtinList.add(new ListAppendBuiltin<T>());
+ builtinList.add(new InListBuiltin<T, L>());
+ builtinList.add(new ListAppendBuiltin<T, L>());
}
@Override
- public List<IBuiltin<T>> getBuiltinList() {
+ public List<IBuiltin<T, L>> getBuiltinList() {
return builtinList;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IBuiltinProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IBuiltinProvider.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/IBuiltinProvider.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -31,9 +31,10 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public interface IBuiltinProvider<T> {
+public interface IBuiltinProvider<T, L> {
- List<IBuiltin<T>> getBuiltinList();
+ List<IBuiltin<T, L>> getBuiltinList();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -37,15 +37,18 @@
*
* @author luc peuvrier
*
+ * @param <T>
+ * @param <L>
*/
-public abstract class AbstractKnowledgeBase<T> implements IKnowledgeBase<T> {
+public abstract class AbstractKnowledgeBase<T, L> implements
+ IKnowledgeBase<T, L> {
private final Map<IKnowledgeBaseListener<T>, IFactSetListener<T>> listenerMap =
/**/new HashMap<IKnowledgeBaseListener<T>, IFactSetListener<T>>();
protected final IFactSet<T> factSet;
- private Motor<T> motor;
+ private Motor<T, L> motor;
public AbstractKnowledgeBase(final IFactSet<T> factSet) {
super();
@@ -56,11 +59,11 @@
return factSet;
}
- public Motor<T> getMotor() {
+ public Motor<T, L> getMotor() {
return motor;
}
- public void setMotor(final Motor<T> motor) {
+ public void setMotor(final Motor<T, L> motor) {
this.motor = motor;
}
@@ -105,15 +108,15 @@
}
@Override
- public IKnowledgeBase<T> view(final T subject, final T predicate,
+ public IKnowledgeBase<T, L> view(final T subject, final T predicate,
final T object) {
- final IKnowledgeBase<T> view;
+ final IKnowledgeBase<T, L> view;
final IFactSet<T> factSetView = factSet
.view(subject, predicate, object);
if (factSetView == null) {
view = null;
} else {
- final KnowledgeBaseView<T> knowledgeBaseView = new KnowledgeBaseView<T>(
+ final KnowledgeBaseView<T, L> knowledgeBaseView = new KnowledgeBaseView<T, L>(
this, factSetView);
knowledgeBaseView.setMotor(motor);
view = knowledgeBaseView;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AllKnowledgeBase.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AllKnowledgeBase.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AllKnowledgeBase.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -36,32 +36,47 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class AllKnowledgeBase<T> extends AbstractKnowledgeBase<T> implements
- IBlankNodeIdentifierProvider {
+public class AllKnowledgeBase<T, L> extends AbstractKnowledgeBase<T, L>
+ implements IBlankNodeIdentifierProvider {
- private final Map<Rule<T>, ReteRule<T>> reteRuleMap =
- /**/new HashMap<Rule<T>, ReteRule<T>>();
+ private final Map<T, L> literalMap = new HashMap<T, L>();
+ private final Map<Rule<T>, ReteRule<T, L>> reteRuleMap =
+ /**/new HashMap<Rule<T>, ReteRule<T, L>>();
+
private int nextBlankNodeIdentifier;
AllKnowledgeBase() {
super(new AllFactSet<T>());
}
- public void addReteRule(final ReteRule<T> reteRule) {
+ public L getLiteral(final T term) {
+ return literalMap.get(term);
+ }
+
+ public L setLiteral(final T term, final L literal) {
+ return literalMap.put(term, literal);
+ }
+
+ public L removeLiteral(final T term) {
+ return literalMap.remove(term);
+ }
+
+ public void addReteRule(final ReteRule<T, L> reteRule) {
reteRuleMap.put(reteRule.getRule(), reteRule);
}
public void removeReteRule(final Rule<T> rule) {
- final ReteRule<T> reteRule = reteRuleMap.get(rule);
+ final ReteRule<T, L> reteRule = reteRuleMap.get(rule);
if (reteRule != null) {
reteRule.dispose();
}
}
@Fortest
- public ReteRule<T> getReteRule(final Rule<T> rule) {
+ public ReteRule<T, L> getReteRule(final Rule<T> rule) {
return reteRuleMap.get(rule);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/IKnowledgeBase.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/IKnowledgeBase.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/IKnowledgeBase.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -31,8 +31,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public interface IKnowledgeBase<T> {
+public interface IKnowledgeBase<T, L> {
void addListener(IKnowledgeBaseListener<T> listener);
@@ -44,7 +45,7 @@
IFact<T> get(T subject, T predicate, T object);
- IKnowledgeBase<T> view(T subject, T predicate, T object);
+ IKnowledgeBase<T, L> view(T subject, T predicate, T object);
Iterator<IFact<T>> iterator();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/KnowledgeBaseView.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/KnowledgeBaseView.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/KnowledgeBaseView.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -29,12 +29,13 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class KnowledgeBaseView<T> extends AbstractKnowledgeBase<T> {
+public class KnowledgeBaseView<T, L> extends AbstractKnowledgeBase<T, L> {
- private final IKnowledgeBase<T> parentKnowledgeBase;
+ private final IKnowledgeBase<T, L> parentKnowledgeBase;
- KnowledgeBaseView(final IKnowledgeBase<T> parentKnowledgeBase,
+ KnowledgeBaseView(final IKnowledgeBase<T, L> parentKnowledgeBase,
final IFactSet<T> factSet) {
super(factSet);
this.parentKnowledgeBase = parentKnowledgeBase;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/MainKnowledgeBaseFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/MainKnowledgeBaseFactory.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/MainKnowledgeBaseFactory.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -27,10 +27,11 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public final class MainKnowledgeBaseFactory<T> {
+public final class MainKnowledgeBaseFactory<T, L> {
- public IKnowledgeBase<T> create() {
- return new AllKnowledgeBase<T>();
+ public IKnowledgeBase<T, L> create() {
+ return new AllKnowledgeBase<T, L>();
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/IMotor.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -33,12 +33,13 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public interface IMotor<T> {
+public interface IMotor<T, L> {
- void addBuiltin(IBuiltinProvider<T> builtinProvider);
+ void addBuiltin(IBuiltinProvider<T, L> builtinProvider);
- void addBuiltin(IBuiltin<T> builtin);
+ void addBuiltin(IBuiltin<T, L> builtin);
/**
* add a rule<br>
@@ -55,6 +56,6 @@
void retractFact(IFact<T> fact);
- IKnowledgeBase<T> getKnowledgeBase();
+ IKnowledgeBase<T, L> getKnowledgeBase();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -53,40 +53,41 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class Motor<T> implements IConclusionListener<T>, IMotor<T> {
+public class Motor<T, L> implements IConclusionListener<T>, IMotor<T, L> {
private final static Logger LOGGER = Logger.getLogger(Motor.class);
- private final AllKnowledgeBase<T> allKnowledgeBase;
+ private final AllKnowledgeBase<T, L> allKnowledgeBase;
- private final ReteBuilder<T> reteBuilder = new ReteBuilder<T>(this);
+ private final ReteBuilder<T, L> reteBuilder = new ReteBuilder<T, L>(this);
private final Deque<CauseIdentifiedFact<T>> assertedStack = new LinkedList<CauseIdentifiedFact<T>>();
private final Deque<CauseIdentifiedFact<T>> retractedStack = new LinkedList<CauseIdentifiedFact<T>>();
- private final Map<IFact<T>, IBuiltin<T>> builtinMap = new HashMap<IFact<T>, IBuiltin<T>>();
+ private final Map<IFact<T>, IBuiltin<T, L>> builtinMap = new HashMap<IFact<T>, IBuiltin<T, L>>();
private final IBlankNodeProvider<T> blankNodeProvider;
private final IBuitinTermProvider<T> buitinTermProvider;
- private BuiltinSupport<T> builtinSupport;
+ private BuiltinSupport<T, L> builtinSupport;
- Motor(final IKnowledgeBase<T> allKnowledgeBase,
+ Motor(final IKnowledgeBase<T, L> allKnowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
this(allKnowledgeBase, blankNodeProvider, null);
}
- Motor(final IKnowledgeBase<T> allKnowledgeBase,
+ Motor(final IKnowledgeBase<T, L> allKnowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider,
final IBuitinTermProvider<T> buitinTermProvider) {
super();
if (!AllKnowledgeBase.class.equals(allKnowledgeBase.getClass())) {
throw new ReasonerException("bad knowledge base argument type");
}
- this.allKnowledgeBase = (AllKnowledgeBase<T>) allKnowledgeBase;
+ this.allKnowledgeBase = (AllKnowledgeBase<T, L>) allKnowledgeBase;
this.allKnowledgeBase.setMotor(this);
this.blankNodeProvider = blankNodeProvider;
this.buitinTermProvider = buitinTermProvider;
@@ -101,17 +102,18 @@
}
@Override
- public void addBuiltin(final IBuiltinProvider<T> builtinProvider) {
- final List<IBuiltin<T>> buitinList = builtinProvider.getBuiltinList();
- for (IBuiltin<T> builtin : buitinList) {
+ public void addBuiltin(final IBuiltinProvider<T, L> builtinProvider) {
+ final List<IBuiltin<T, L>> buitinList = builtinProvider
+ .getBuiltinList();
+ for (IBuiltin<T, L> builtin : buitinList) {
addBuiltin(builtin);
}
}
@Override
- public void addBuiltin(final IBuiltin<T> builtin) {
+ public void addBuiltin(final IBuiltin<T, L> builtin) {
if (builtinSupport == null) { // lazy initialization
- builtinSupport = new BuiltinSupport<T>(buitinTermProvider,
+ builtinSupport = new BuiltinSupport<T, L>(buitinTermProvider,
allKnowledgeBase, blankNodeProvider);
}
builtin.initialize(builtinSupport);
@@ -119,20 +121,20 @@
}
@Fortest
- public BuiltinSupport<T> getBuiltinSupport() {
+ public BuiltinSupport<T, L> getBuiltinSupport() {
if (builtinSupport == null) { // lazy initialization
- builtinSupport = new BuiltinSupport<T>(buitinTermProvider,
+ builtinSupport = new BuiltinSupport<T, L>(buitinTermProvider,
allKnowledgeBase, blankNodeProvider);
}
return builtinSupport;
}
- public IBuiltin<T> builtin(final IFact<T> fact) {
+ public IBuiltin<T, L> builtin(final IFact<T> fact) {
T subject = fact.getSubject();
T predicate = fact.getPredicate();
// T object=fact.getObject();
// FIXMELUC builtin always based on predicate ?
- IBuiltin<T> builtin;
+ IBuiltin<T, L> builtin;
builtin = builtinMap.get(new Fact<T>(null, predicate, null));
if (builtin == null) {
builtin = builtinMap.get(new Fact<T>(subject, predicate, null));
@@ -142,7 +144,7 @@
@Override
public void addRule(final Rule<T> rule) {
- final ReteRule<T> reteRule = reteBuilder.addRule(rule);
+ final ReteRule<T, L> reteRule = reteBuilder.addRule(rule);
allKnowledgeBase.addReteRule(reteRule);
// TODO create fact conclusion of new added rule according to existing
// fact
@@ -210,8 +212,8 @@
@Override
public void conclusionViewRetraction(final CauseIdentifiedFact<T> fact) {
- final IKnowledgeBase<T> view = allKnowledgeBase.view(fact.getSubject(),
- fact.getPredicate(), fact.getObject());
+ final IKnowledgeBase<T, L> view = allKnowledgeBase.view(
+ fact.getSubject(), fact.getPredicate(), fact.getObject());
final Iterator<IFact<T>> iterator = view.iterator();
while (iterator.hasNext()) {
// conclusionRetraction(new CauseIdentifiedFact<T>(iterator.next(),
@@ -226,7 +228,7 @@
}
@Override
- public AllKnowledgeBase<T> getKnowledgeBase() {
+ public AllKnowledgeBase<T, L> getKnowledgeBase() {
return allKnowledgeBase;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/MotorFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/MotorFactory.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/MotorFactory.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -30,18 +30,19 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public final class MotorFactory<T> {
+public final class MotorFactory<T, L> {
- public IMotor<T> create(final IKnowledgeBase<T> allKnowledgeBase,
+ public IMotor<T, L> create(final IKnowledgeBase<T, L> allKnowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
- return new Motor<T>(allKnowledgeBase, blankNodeProvider);
+ return new Motor<T, L>(allKnowledgeBase, blankNodeProvider);
}
- public IMotor<T> create(final IKnowledgeBase<T> allKnowledgeBase,
+ public IMotor<T, L> create(final IKnowledgeBase<T, L> allKnowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider,
final IBuitinTermProvider<T> buitinTermProvider) {
- return new Motor<T>(allKnowledgeBase, blankNodeProvider,
+ return new Motor<T, L>(allKnowledgeBase, blankNodeProvider,
buitinTermProvider);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -30,8 +30,8 @@
*
* @param <T>
*/
-public abstract class AbstractPremiseTable<T> extends AbstractTable<T>
- implements IPremiseTable<T> {
+public abstract class AbstractPremiseTable<T, L> extends AbstractTable<T>
+ implements IPremiseTable<T, L> {
protected final IPremise<T> premise;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -41,12 +41,13 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class AssertedPremiseTable<T> implements IPremiseTable<T> {
+public class AssertedPremiseTable<T, L> implements IPremiseTable<T, L> {
private final int ruleIdentifier;
- private final AllKnowledgeBase<T> knowledgeBase;
+ private final AllKnowledgeBase<T, L> knowledgeBase;
private final IBlankNodeProvider<T> blankNodeProvider;
@@ -58,7 +59,7 @@
public AssertedPremiseTable(final int ruleIdentifier,
final IPremise<T> premise,
final VariableKeyValueMapping<T> mapping,
- final AllKnowledgeBase<T> knowledgeBase,
+ final AllKnowledgeBase<T, L> knowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
super();
this.ruleIdentifier = ruleIdentifier;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -37,15 +37,16 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class BuiltinPremiseTable<T> extends AbstractPremiseTable<T> {
+public class BuiltinPremiseTable<T, L> extends AbstractPremiseTable<T, L> {
private final int ruleIdentifier;
- private final IBuiltin<T> buitin;
+ private final IBuiltin<T, L> buitin;
public BuiltinPremiseTable(final IPremise<T> premise,
- final int ruleIdentifier, final IBuiltin<T> buitin,
+ final int ruleIdentifier, final IBuiltin<T, L> buitin,
final VariableKeyValueMapping<T> mapping) {
super(premise);
this.ruleIdentifier = ruleIdentifier;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IPremiseTable.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IPremiseTable.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -31,7 +31,7 @@
*
* @param <T>
*/
-public interface IPremiseTable<T> extends ITable<T> {
+public interface IPremiseTable<T, L> extends ITable<T> {
void dispose();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -38,8 +38,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class PremiseTable<T> extends AbstractPremiseTable<T> implements
+public class PremiseTable<T, L> extends AbstractPremiseTable<T, L> implements
IFactSetListener<T> {
protected final IFactSet<T> factSet;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -33,8 +33,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class PremiseTableAndDefault<T> extends PremiseTable<T> {
+public class PremiseTableAndDefault<T, L> extends PremiseTable<T, L> {
private final T defaultSubject;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -33,8 +33,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class ReteRule<T> {
+public class ReteRule<T, L> {
private static final int INITIAL_RULE_IDENTIFIER = 0;
@@ -48,7 +49,7 @@
private final Rule<T> rule;
- private final List<IPremiseTable<T>> premiseTableList = new LinkedList<IPremiseTable<T>>();
+ private final List<IPremiseTable<T, L>> premiseTableList = new LinkedList<IPremiseTable<T, L>>();
private ITable<T> rootTable;
@@ -70,12 +71,12 @@
this.rootTable = rootTable;
}
- public boolean add(final IPremiseTable<T> premiseTable) {
+ public boolean add(final IPremiseTable<T, L> premiseTable) {
return premiseTableList.add(premiseTable);
}
public void dispose() {
- for (IPremiseTable<T> premiseTable : premiseTableList) {
+ for (IPremiseTable<T, L> premiseTable : premiseTableList) {
premiseTable.dispose();
}
premiseTableList.clear();
@@ -87,7 +88,7 @@
}
@Fortest
- public List<IPremiseTable<T>> getPremiseTableList() {
+ public List<IPremiseTable<T, L>> getPremiseTableList() {
return premiseTableList;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -35,8 +35,9 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class PremiseTableFactory<T> {
+public class PremiseTableFactory<T, L> {
/**
*
@@ -45,17 +46,18 @@
* @param factSet
* @return
*/
- public PremiseTable<T> create(final IPremise<T> premise,
+ public PremiseTable<T, L> create(final IPremise<T> premise,
final VariableKeyValueMapping<T> mapping, final IFactSet<T> factSet) {
final IFactSet<T> view = factSet.view(premise.getSubject(),
premise.getPredicate(), premise.getObject());
- final PremiseTable<T> premiseTable;
+ final PremiseTable<T, L> premiseTable;
if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
- premiseTable = new PremiseTableAndDefault<T>(
+ premiseTable = new PremiseTableAndDefault<T, L>(
(AbstractPremiseAndDefault<T>) premise, view,
premise.getMode());
} else {
- premiseTable = new PremiseTable<T>(premise, view, premise.getMode());
+ premiseTable = new PremiseTable<T, L>(premise, view,
+ premise.getMode());
}
return premiseTable;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -62,26 +62,27 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
-public class ReteBuilder<T> implements IReteNodeVisitor<T> {
+public class ReteBuilder<T, L> implements IReteNodeVisitor<T> {
- private final PremiseTableFactory<T> premiseTableFactory = new PremiseTableFactory<T>();
+ private final PremiseTableFactory<T, L> premiseTableFactory = new PremiseTableFactory<T, L>();
private final MergeTableFactory<T> mergeTableFactory = new MergeTableFactory<T>();
private Deque<ITable<T>> stack;
- private final Motor<T> motor;
+ private final Motor<T, L> motor;
- private ReteRule<T> reteRule;
+ private ReteRule<T, L> reteRule;
- public ReteBuilder(final Motor<T> motor) {
+ public ReteBuilder(final Motor<T, L> motor) {
super();
this.motor = motor;
}
- public ReteRule<T> addRule(final Rule<T> rule) {
- reteRule = new ReteRule<T>(rule);
+ public ReteRule<T, L> addRule(final Rule<T> rule) {
+ reteRule = new ReteRule<T, L>(rule);
IReteTableNode<T> previousNode = null;
final Iterator<IPremise<T>> premiseIterator = rule.premiseIterator();
while (premiseIterator.hasNext()) {
@@ -105,7 +106,7 @@
stack = new LinkedList<ITable<T>>();
rootNode.accept(this);
stack = null;// NOPMD free memory
- final ReteRule<T> result = reteRule;
+ final ReteRule<T, L> result = reteRule;
reteRule = null;// NOPMD release/free memory
return result;
}
@@ -114,13 +115,13 @@
public void visit(final PremiseReteNode<T> premiseReteNode) {
final IPremise<T> premise = premiseReteNode.getPremise();
final VariableKeyValueMapping<T> mapping = premiseReteNode.getMapping();
- final IPremiseTable<T> premiseTable;
- final IBuiltin<T> builtin = buitin(premise);
+ final IPremiseTable<T, L> premiseTable;
+ final IBuiltin<T, L> builtin = buitin(premise);
switch (premise.getType()) {
case ASSERTED:
assertNotBuitlin(builtin, premise);
// FIXMELUC use of premiseTableFactory
- premiseTable = new AssertedPremiseTable<T>(
+ premiseTable = new AssertedPremiseTable<T, L>(
reteRule.getIdentifier(), premise, mapping,
motor.getKnowledgeBase(), motor.getBlankNodeProvider());
reteRule.add(premiseTable);
@@ -133,13 +134,13 @@
break;
case STANDARD:
if (builtin == null) {
- final PremiseTable<T> factPremiseTable = premiseTableFactory
+ final PremiseTable<T, L> factPremiseTable = premiseTableFactory
.create(premise, mapping, motor.getAllFactSet());
reteRule.add(factPremiseTable);
premiseTable = factPremiseTable;
} else {
// FIXMELUC use of premiseTableFactory
- premiseTable = new BuiltinPremiseTable<T>(premise,
+ premiseTable = new BuiltinPremiseTable<T, L>(premise,
reteRule.getIdentifier(), builtin, mapping);
}
break;
@@ -149,26 +150,26 @@
stack.push(premiseTable);
}
- private IBuiltin<T> buitin(final IPremise<T> premise) {
+ private IBuiltin<T, L> buitin(final IPremise<T> premise) {
final IFact<T> fact = new Fact<T>(premise.getSubject(),
premise.getPredicate(), premise.getObject());
return motor.builtin(fact);
}
- private IBuiltin<T> buitin(final IConclusion<T> conclusion) {
+ private IBuiltin<T, L> buitin(final IConclusion<T> conclusion) {
final IFact<T> fact = new Fact<T>(conclusion.getSubject(),
conclusion.getPredicate(), conclusion.getObject());
return motor.builtin(fact);
}
- private void assertNotBuitlin(final IBuiltin<T> builtin,
+ private void assertNotBuitlin(final IBuiltin<T, L> builtin,
final IPremise<T> premise) {
if (builtin != null) {
throw new ReasonerException("can not be a buitlin : " + premise);
}
}
- private void assertNotBuitlin(final IBuiltin<T> builtin,
+ private void assertNotBuitlin(final IBuiltin<T, L> builtin,
final IConclusion<T> conclusion) {
if (builtin != null) {
throw new ReasonerException("can not be a buitlin : " + conclusion);
@@ -194,7 +195,7 @@
final ITable<T> table = stack.peek();
final IConclusion<T> conclusion = conclusionReteNode.getConclusion();
final int[] mapping = conclusionReteNode.getMapping();
- final IBuiltin<T> builtin = buitin(conclusion);
+ final IBuiltin<T, L> builtin = buitin(conclusion);
@SuppressWarnings("unused")
final IConclusionNotifier<T> conclusionNotifier;
switch (conclusion.getType()) {
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/AbstractTestCase.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/AbstractTestCase.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/AbstractTestCase.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -36,8 +36,9 @@
public abstract class AbstractTestCase extends TestCase implements
IBlankNodeProvider<String>, IBuitinTermProvider<String> {
- protected final DefaultBuiltinProvider<String> defaultBuiltinProvider =
- /**/new DefaultBuiltinProvider<String>(new BuiltinComputerForTests());
+ protected final DefaultBuiltinProvider<String, String> defaultBuiltinProvider =
+ /**/new DefaultBuiltinProvider<String, String>(
+ new BuiltinComputerForTests());
@Override
public String getBlankNode(final int blankNodeIdentifier) {
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -34,15 +34,16 @@
* @author luc peuvrier
*
* @param <T>
+ * @param <L>
*/
@Fortest
-public class ReteRuleToString<T> implements ITableVisitor<T> {
+public class ReteRuleToString<T, L> implements ITableVisitor<T> {
private StringBuilder stringBuilder;
private int tableNumber;
- public String toString(final ReteRule<T> reteRule) {
+ public String toString(final ReteRule<T, L> reteRule) {
String result = null;
try {
stringBuilder = new StringBuilder();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -58,10 +58,10 @@
* ( ?A "x" ?B ) imply ( ?A "has" "x" )
*/
public void testSinglePremise() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory.create(kb, this);
final Rule<String> rule = new Rule<String>();
final IPremise<String> premise = new Premise<String>(
/* subject */"?A", null,
@@ -94,8 +94,8 @@
* imply (?X "a" "herbivore")
*/
public void testMultiplePremise() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
final Rule<String> rule = new Rule<String>();
IPremise<String> premise = new Premise<String>(
/* subject */"?X", null,
@@ -146,8 +146,10 @@
final IFact<String> secondFact = list2
.remove(secondPremiseIndex);
final IFact<String> thirdFact = list2.get(0);
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this);
+ final IKnowledgeBase<String, String> kb = kbFactory
+ .create();
+ final IMotor<String, String> motor = motorFactory.create(
+ kb, this);
motor.addRule(rule);
motor.assertFact(firstFact);
assertFalse(kb.contains(expectedConclusion));
@@ -176,10 +178,10 @@
}
public void testSameConclusion() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory.create(kb, this);
// first rule
Rule<String> rule = new Rule<String>();
IPremise<String> premise = new Premise<String>(
@@ -222,10 +224,10 @@
}
public void testRetract() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory.create(kb, this);
Rule<String> rule = new Rule<String>();
final IPremise<String> premise = new Premise<String>(
/* subject */"?X", null,
@@ -255,7 +257,7 @@
assertNull(kb.get("food", "available", "gateau"));
}
- private class IncrementBuiltin extends AbstractBuiltin<String> {
+ private class IncrementBuiltin extends AbstractBuiltin<String, String> {
public IncrementBuiltin() {
super(null, "increment", null);
}
@@ -272,10 +274,11 @@
}
public void testCountRetract() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory
+ .create(kb, this, this);
motor.addBuiltin(new IncrementBuiltin());
// first rule
Rule<String> rule = new Rule<String>();
@@ -325,7 +328,8 @@
assertNull(kb.get("myCar", "koCount", "2"));
}
- private void logKoCount(final String title, final IKnowledgeBase<String> kb) {
+ private void logKoCount(final String title,
+ final IKnowledgeBase<String, String> kb) {
if (LOGGER.isDebugEnabled()) {
final Iterator<IFact<String>> iterator = kb.view("myCar",
"koCount", null).iterator();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -51,10 +51,11 @@
private static final Logger LOGGER = Logger.getLogger(TestBuiltin.class);
public void testPropertySetToProductResult() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory
+ .create(kb, this, this);
motor.addBuiltin(defaultBuiltinProvider);
Rule<String> rule = new Rule<String>();
@@ -144,7 +145,7 @@
fact = new Fact<String>(":creamTart", ":hasXAcceleration", "20.0");
motor.assertFact(fact);
- final IFactSet<String> allFactSet = ((Motor<String>) motor)
+ final IFactSet<String> allFactSet = ((Motor<String, String>) motor)
.getAllFactSet();
final IFactSet<String> view = allFactSet.view(":creamTart", ":hasX",
null);
@@ -157,7 +158,8 @@
assertFalse(iterator.hasNext());
// assert result accessing knowledge base view
- IKnowledgeBase<String> kbView = kb.view(":creamTart", ":hasX", null);
+ IKnowledgeBase<String, String> kbView = kb.view(":creamTart", ":hasX",
+ null);
assertNotNull(kbView);
iterator = kbView.iterator();
assertTrue(iterator.hasNext());
@@ -166,10 +168,11 @@
}
public void testPropertyIsProductResultOfAnOtherProperty() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory
+ .create(kb, this, this);
motor.addBuiltin(defaultBuiltinProvider);
Rule<String> rule = new Rule<String>();
@@ -222,13 +225,14 @@
fact = new Fact<String>("truc", "factor", "6");
motor.assertFact(fact);
- final IFactSet<String> allFactSet = ((Motor<String>) motor)
+ final IFactSet<String> allFactSet = ((Motor<String, String>) motor)
.getAllFactSet();
final IFactSet<String> view = allFactSet.view(null, "xxx", null);
assertNotNull(view);
assertFalse(view.iterator().hasNext());
- final IKnowledgeBase<String> kbView = kb.view(null, "xxx", null);
+ final IKnowledgeBase<String, String> kbView = kb
+ .view(null, "xxx", null);
assertNotNull(kbView);
assertFalse(kbView.iterator().hasNext());
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExistential.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExistential.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExistential.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -47,11 +47,12 @@
* ( ?T "a" "t" ) => ( ?CT "a" "ct" )
*/
public void test() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
- motor.addBuiltin(new BlankNodeBuiltin<String>());
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory
+ .create(kb, this, this);
+ motor.addBuiltin(new BlankNodeBuiltin<String, String>());
final Rule<String> rule = new Rule<String>();
IPremise<String> premise = new Premise<String>(
/* subject */"?T", null,
@@ -82,7 +83,7 @@
LOGGER.debug(stringBuilder.toString());
}
- final IKnowledgeBase<String> view = kb.view(null, "a", "ct");
+ final IKnowledgeBase<String, String> view = kb.view(null, "a", "ct");
final Iterator<IFact<String>> iterator = view.iterator();
assertTrue(iterator.hasNext());
final IFact<String> created = iterator.next();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -54,12 +54,13 @@
.getLogger(TestExpressionCompute.class);
public void testListInListAndPropertySum() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory
+ .create(kb, this, this);
motor.addBuiltin(defaultBuiltinProvider);
- final BuiltinSupport<String> builtinSupport = ((Motor<String>) motor)
+ final BuiltinSupport<String, String> builtinSupport = ((Motor<String, String>) motor)
.getBuiltinSupport();
/*
@@ -127,7 +128,8 @@
assertList(builtinSupport, new String[] { "7" });
}
- private void assertList(final BuiltinSupport<String> builtinSupport,
+ private void assertList(
+ final BuiltinSupport<String, String> builtinSupport,
final String[] expectedValues) {
final String listTerm = builtinSupport.getObject("result", "list",
false);
@@ -152,7 +154,7 @@
}
@SuppressWarnings("unused")
- private void assertSum(final BuiltinSupport<String> builtinSupport,
+ private void assertSum(final BuiltinSupport<String, String> builtinSupport,
final String expected) {
final String sum = builtinSupport.getObject("result", "sum", false);
assertNotNull("no some found", sum);
@@ -164,12 +166,13 @@
*/
@SuppressWarnings("unused")
private void _testListAppendAndPropertySum() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory
+ .create(kb, this, this);
motor.addBuiltin(defaultBuiltinProvider);
- final BuiltinSupport<String> builtinSupport = ((Motor<String>) motor)
+ final BuiltinSupport<String, String> builtinSupport = ((Motor<String, String>) motor)
.getBuiltinSupport();
Rule<String> rule = new Rule<String>();
@@ -271,7 +274,8 @@
assertValueList(builtinSupport, new String[] { "7" });
}
- private void assertValueList(final BuiltinSupport<String> builtinSupport,
+ private void assertValueList(
+ final BuiltinSupport<String, String> builtinSupport,
final String[] expectedValues) {
final String listTerm = builtinSupport.getObject("result", "valueList",
false);
@@ -296,7 +300,7 @@
}
}
- private void logSum(final BuiltinSupport<String> builtinSupport,
+ private void logSum(final BuiltinSupport<String, String> builtinSupport,
final String message) {
if (LOGGER.isDebugEnabled()) {
final StringBuilder stringBuilder = new StringBuilder();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -92,10 +92,11 @@
}
private void test(final InputStream testFileInputStream) throws IOException {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory
+ .create(kb, this, this);
motor.addBuiltin(defaultBuiltinProvider);
Rule<String> currentRule = null;
final BufferedReader reader = new BufferedReader(new InputStreamReader(
@@ -169,26 +170,26 @@
expectedFactSet.remove(fact);
}
- private void addAssertedPremiseListener(final IMotor<String> motor,
+ private void addAssertedPremiseListener(final IMotor<String, String> motor,
Rule<String> currentRule) {
- final ReteRule<String> reteRule = ((AllKnowledgeBase<String>) motor
+ final ReteRule<String, String> reteRule = ((AllKnowledgeBase<String, String>) motor
.getKnowledgeBase()).getReteRule(currentRule);
- List<IPremiseTable<String>> premiseTableList = reteRule
+ List<IPremiseTable<String, String>> premiseTableList = reteRule
.getPremiseTableList();
- for (IPremiseTable<String> premiseTable : premiseTableList) {
+ for (IPremiseTable<String, String> premiseTable : premiseTableList) {
if (EnumPremiseType.ASSERTED.equals(premiseTable.getPremise()
.getType())) {
- ((AssertedPremiseTable<String>) premiseTable)
+ ((AssertedPremiseTable<String, String>) premiseTable)
.setFactSetListener(this);
}
}
}
- private void check(final IMotor<String> motor,
+ private void check(final IMotor<String, String> motor,
final Set<IFact<String>> expectedFactSet) {
- final IFactSet<String> kbFactSet = ((Motor<String>) motor)
+ final IFactSet<String> kbFactSet = ((Motor<String, String>) motor)
.getAllFactSet();
- final IKnowledgeBase<String> kb = motor.getKnowledgeBase();
+ final IKnowledgeBase<String, String> kb = motor.getKnowledgeBase();
final Iterator<IFact<String>> iterator = kbFactSet.iterator();
while (iterator.hasNext()) {
final IFact<String> kbFact = iterator.next();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java 2010-12-29 04:57:00 UTC (rev 45)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java 2010-12-29 06:06:33 UTC (rev 46)
@@ -58,13 +58,14 @@
private static final Logger LOGGER = Logger.getLogger(TestReteTable.class);
public void testAssertedPremise() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
- final IBuiltin<String> testBuiltin = new BlankNodeBuiltin<String>();
+ final MainKnowledgeBaseFactory<String, String> kbFactory = new MainKnowledgeBaseFactory<String, String>();
+ final MotorFactory<String, String> motorFactory = new MotorFactory<String, String>();
+ final IKnowledgeBase<String, String> kb = kbFactory.create();
+ final IMotor<String, String> motor = motorFactory
+ .create(kb, this, this);
+ final IBuiltin<String, String> testBuiltin = new BlankNodeBuiltin<String, String>();
motor.addBuiltin(testBuiltin);
- final ReteSimulator<String> reteSimulator = new ReteSimulator<String>();
+ final ReteSimulator<String, String> reteSimulator = new ReteSimulator<String, String>();
Rule<String> rule = new Rule<String>();
// ?X prop ?E.
@@ -116,7 +117,7 @@
motor.addRule(rule);
- final ReteRule<String> reteRule = ((AllKnowledgeBase<String>) motor
+ final ReteRule<String, String> reteRule = ((AllKnowledgeBase<String, String>) motor
.getKnowledgeBase()).getReteRule(rule);
final MergeTable<String> thirdMergeTable = (MergeTable<String>) reteRule
@@ -237,8 +238,9 @@
assertEquals("bad list size", expectedLength, count);
}
- private String logTable(final String title, final ReteRule<String> reteRule) {
- final ReteRuleToString<String> reteRuleToString = new ReteRuleToString<String>();
+ private String logTable(final String title,
+ final ReteRule<String, String> reteRule) {
+ final ReteRuleToString<String, String> reteRuleToString = new ReteRuleT...
[truncated message content] |
|
From: <luc...@us...> - 2010-12-29 04:57:09
|
Revision: 45
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=45&view=rev
Author: luc_peuvrier
Date: 2010-12-29 04:57:00 +0000 (Wed, 29 Dec 2010)
Log Message:
-----------
list builtin deprecated, logging added, log of conclude fact cause
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java
trunk/reasoner4j/src/test/resources/log4j.properties
Added Paths:
-----------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseMode.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestExpressionCompute.java
Removed Paths:
-------------
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -39,6 +39,8 @@
public static final String NIL_IDENTIFIER = "nil";
+ // FIXMELUC ListBuiltin no more needed
+ @Deprecated
public static final String LIST_PREDICATE_IDENTIFIER = "list";
public static final String IN_LIST_PREDICATE_IDENTIFIER = "inList";
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -79,6 +79,7 @@
@Override
public void removed(final int ruleIdentifier, final T subject,
final T predicate, final T object) {
- removeList(ruleIdentifier, object);
+ // FIXMELUC list can be used elsewhere
+ // removeList(ruleIdentifier, object);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -38,6 +38,8 @@
*
* @param <T>
*/
+// FIXMELUC ListBuiltin no more needed
+@Deprecated
public class ListBuiltin<T> extends AbstractBuiltin<T> {
@SuppressWarnings("unchecked")
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -29,8 +29,8 @@
import net.sf.reasoner4j.builtin.impl.BlankNodeBuiltin;
import net.sf.reasoner4j.builtin.impl.list.InListBuiltin;
import net.sf.reasoner4j.builtin.impl.list.ListAppendBuiltin;
-import net.sf.reasoner4j.builtin.impl.list.ListBuiltin;
import net.sf.reasoner4j.builtin.impl.math.MathProductBuiltin;
+import net.sf.reasoner4j.builtin.impl.math.MathSumBuiltin;
/**
*
@@ -46,7 +46,9 @@
super();
builtinList.add(new BlankNodeBuiltin<T>());
builtinList.add(new MathProductBuiltin<T>(builtinComputer));
- builtinList.add(new ListBuiltin<T>());
+ builtinList.add(new MathSumBuiltin<T>(builtinComputer));
+ // FIXMELUC ListBuiltin no more needed
+ // builtinList.add(new ListBuiltin<T>());
builtinList.add(new InListBuiltin<T>());
builtinList.add(new ListAppendBuiltin<T>());
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -28,6 +28,8 @@
import java.util.LinkedList;
import java.util.Map;
+import org.apache.log4j.Logger;
+
import net.sf.reasoner4j.ReasonerException;
/**
@@ -39,6 +41,8 @@
public class AllFactSet<T> extends AbstractSubFactSet<T> implements
ISubFactSet<T> {
+ private final static Logger LOGGER = Logger.getLogger(AllFactSet.class);
+
// private final Map<T/* S */, PredicateObjectOfSubject<T>>
// predicateObjectBySubjectMap =
// /**/new HashMap<T/* S */, PredicateObjectOfSubject<T>>();
@@ -121,6 +125,9 @@
} else {
added = false;
}
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("added=" + added + " " + fact + " doFire=" + doFire);
+ }
return added;
}
@@ -228,6 +235,10 @@
}
}
}
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("removed=" + removed + " " + fact + " doFire="
+ + doFire);
+ }
return removed;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/CauseIdentifiedFact.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -22,6 +22,8 @@
*/
package net.sf.reasoner4j.fact;
+import org.apache.log4j.Logger;
+
/**
*
* @author luc peuvrier
@@ -29,16 +31,28 @@
*/
public class CauseIdentifiedFact<T> {
+ private final static Logger LOGGER = Logger
+ .getLogger(CauseIdentifiedFact.class);
+
private final IFact<T> fact;
private final int ruleIdentifier;
+ private Exception creationTraceForDebug;
+
public CauseIdentifiedFact(final IFact<T> fact, final int ruleIdentifier) {
super();
this.fact = fact;
this.ruleIdentifier = ruleIdentifier;
+ if (LOGGER.isDebugEnabled()) {
+ creationTraceForDebug = new Exception("creation of " + fact);
+ }
}
+ public Exception getCreationTraceForDebug() {
+ return creationTraceForDebug;
+ }
+
public CauseIdentifiedFact(final T subject, final T predicate,
final T object, final int ruleIdentifier) {
this(new Fact<T>(subject, predicate, object), ruleIdentifier);
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -176,18 +176,21 @@
}
public void updateKnowledgeBaseWithConclusion() {
+ // FIXMELUC _multiple occurrence of same fact
CauseIdentifiedFact<T> asserted = assertedStack.poll();
CauseIdentifiedFact<T> retracted = retractedStack.poll();
do {
if (retracted != null) {
if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("conclusion retraction " + retracted);
+ LOGGER.debug("conclusion retraction " + retracted,
+ retracted.getCreationTraceForDebug());
}
allKnowledgeBase.retractFactInFactSet(retracted);
retracted = retractedStack.poll();
} else if (asserted != null) {
if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("conclusion assertion " + asserted);
+ LOGGER.debug("conclusion assertion " + asserted,
+ asserted.getCreationTraceForDebug());
}
allKnowledgeBase.assertFactInFactSet(asserted);
asserted = assertedStack.poll();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -24,9 +24,12 @@
import java.util.List;
+import org.apache.log4j.Logger;
+
import net.sf.reasoner4j.ReasonerException;
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.rule.IConclusion;
/**
@@ -38,6 +41,8 @@
public abstract class AbstractConclusionNotifier<T> implements
ITableListener<T>, IConclusionNotifier<T> {
+ protected final Logger logger = Logger.getLogger(getClass());
+
protected final IConclusionListener<T> listener;
private final IConclusion<T> conclusion;
@@ -58,11 +63,11 @@
this.ruleIdentifier = ruleIdentifier;
}
- protected CauseIdentifiedFact<T> createFact(final List<T> variableValueSet) {
- return createFact(variableValueSet, ruleIdentifier);
+ protected CauseIdentifiedFact<T> createFact(final List<T> value) {
+ return createFact(value, ruleIdentifier);
}
- protected CauseIdentifiedFact<T> createFact(final List<T> variableValueSet,
+ protected CauseIdentifiedFact<T> createFact(final List<T> value,
final int ruleIdentifier) {
try {
int index = 0;
@@ -70,19 +75,19 @@
if (conclusion.getSubjectVariableName() == null) {
subject = conclusion.getSubject();
} else {
- subject = variableValueSet.get(mapping[index++]);
+ subject = value.get(mapping[index++]);
}
final T predicate;
if (conclusion.getPredicateVariableName() == null) {
predicate = conclusion.getPredicate();
} else {
- predicate = variableValueSet.get(mapping[index++]);
+ predicate = value.get(mapping[index++]);
}
final T object;
if (conclusion.getObjectVariableName() == null) {
object = conclusion.getObject();
} else {
- object = variableValueSet.get(mapping[index++]);
+ object = value.get(mapping[index++]);
}
return new CauseIdentifiedFact<T>(new Fact<T>(subject, predicate,
object), ruleIdentifier);
@@ -92,20 +97,28 @@
}
@Override
- public void added(final List<T> value, final boolean conclude) {
+ public void added(final List<T> value, final IFact<T> cause,
+ final boolean conclude) {
if (conclude) {
- addedImpl(value);
+ addedImpl(value, cause);
+ } else if (logger.isDebugEnabled()) {
+ logger.debug("do not add conclude " + createFact(value)
+ + " cause by " + cause);
}
}
- protected abstract void addedImpl(List<T> value);
+ protected abstract void addedImpl(List<T> value, IFact<T> cause);
@Override
- public void removed(final List<T> value, final boolean conclude) {
+ public void removed(final List<T> value, final IFact<T> cause,
+ final boolean conclude) {
if (conclude) {
- removedImpl(value);
+ removedImpl(value, cause);
+ } else if (logger.isDebugEnabled()) {
+ logger.debug("do not remove conclude " + createFact(value)
+ + " cause by " + cause);
}
}
- protected abstract void removedImpl(List<T> value);
+ protected abstract void removedImpl(List<T> value, IFact<T> cause);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -25,6 +25,7 @@
import java.util.List;
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.rule.AbstractReplaceConclusion;
/**
@@ -72,9 +73,15 @@
return toRetract;
}
- protected void addedImpl(final List<T> value) {
+ protected void addedImpl(final List<T> value, final IFact<T> cause) {
final CauseIdentifiedFact<T> createFact = createFact(value);
final CauseIdentifiedFact<T> toRetract = toRetract(createFact);
+ if (logger.isDebugEnabled()) {
+ logger.debug("retraction of " + toRetract + " to "
+ + listener.getClass().getName() + "\n cause by " + cause);
+ logger.debug("assertion of " + createFact + " to "
+ + listener.getClass().getName() + "\n cause by " + cause);
+ }
listener.conclusionViewRetraction(toRetract);
listener.conclusionAssertion(createFact);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -26,6 +26,8 @@
import java.util.List;
import java.util.Set;
+import net.sf.reasoner4j.fact.IFact;
+
/**
*
* @author luc peuvrier
@@ -46,18 +48,20 @@
listenerSet.remove(listener);
}
- protected void fireAdded(final List<T> value, final boolean conclude) {
+ protected void fireAdded(final List<T> value, final IFact<T> cause,
+ final boolean conclude) {
if (!listenerSet.isEmpty()) {
for (ITableListener<T> listener : listenerSet) {
- listener.added(value, conclude);
+ listener.added(value, cause, conclude);
}
}
}
- protected void fireRemoved(final List<T> value, final boolean conclude) {
+ protected void fireRemoved(final List<T> value, final IFact<T> cause,
+ final boolean conclude) {
if (!listenerSet.isEmpty()) {
for (ITableListener<T> listener : listenerSet) {
- listener.removed(value, conclude);
+ listener.removed(value, cause, conclude);
}
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -24,6 +24,8 @@
import java.util.List;
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.rule.AbstractReplaceConclusion;
/**
@@ -43,7 +45,13 @@
}
@Override
- public void removedImpl(final List<T> value) {
+ public void removedImpl(final List<T> value, final IFact<T> cause) {
// no retraction
+ if (logger.isDebugEnabled()) {
+ final CauseIdentifiedFact<T> createFact = createFact(value,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER);
+ logger.debug("no remove conclude of " + createFact + " to "
+ + listener.getClass().getName() + "\n cause by " + cause);
+ }
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -24,6 +24,8 @@
import java.util.List;
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.rule.IConclusion;
/**
@@ -41,12 +43,22 @@
}
@Override
- public void addedImpl(final List<T> value) {
- listener.conclusionAssertion(createFact(value));
+ public void addedImpl(final List<T> value, final IFact<T> cause) {
+ final CauseIdentifiedFact<T> createFact = createFact(value);
+ if (logger.isDebugEnabled()) {
+ logger.debug("assertion of " + createFact + " to "
+ + listener.getClass().getName() + "\n cause by " + cause);
+ }
+ listener.conclusionAssertion(createFact);
}
@Override
- public void removedImpl(final List<T> value) {
- listener.conclusionRetraction(createFact(value));
+ public void removedImpl(final List<T> value, final IFact<T> cause) {
+ final CauseIdentifiedFact<T> createFact = createFact(value);
+ if (logger.isDebugEnabled()) {
+ logger.debug("retraction of " + createFact + " to "
+ + listener.getClass().getName() + "\n cause by " + cause);
+ }
+ listener.conclusionRetraction(createFact);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -24,6 +24,8 @@
import java.util.List;
+import net.sf.reasoner4j.fact.IFact;
+
/**
*
* @author luc peuvrier
@@ -32,7 +34,7 @@
*/
public interface ITableListener<T> {
- void added(List<T> value, boolean conclude);
+ void added(List<T> value, IFact<T> cause, boolean conclude);
- void removed(List<T> value, boolean conclude);
+ void removed(List<T> value, IFact<T> cause, boolean conclude);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -33,6 +33,7 @@
import net.sf.reasoner4j.Fortest;
import net.sf.reasoner4j.ReasonerException;
+import net.sf.reasoner4j.fact.IFact;
/**
*
@@ -83,33 +84,37 @@
this.rightTable = rightTable;
leftListener = new ITableListener<T>() {
@Override
- public void added(final List<T> leftValue, final boolean conclude) {
+ public void added(final List<T> leftValue, final IFact<T> cause,
+ final boolean conclude) {
addMerge(rightTable, leftValue, rightTableMapping,
leftTableMapping, rightIndexedTable, leftIndexedTable,
- conclude);
+ cause, conclude);
}
@Override
- public void removed(final List<T> leftValue, final boolean conclude) {
+ public void removed(final List<T> leftValue, final IFact<T> cause,
+ final boolean conclude) {
removeMerge(rightTable, leftValue, rightTableMapping,
/* leftTableMapping, */rightIndexedTable, leftIndexedTable,
- conclude);
+ cause, conclude);
}
};
leftTable.addListener(leftListener);
rightListener = new ITableListener<T>() {
@Override
- public void added(final List<T> rightValue, final boolean conclude) {
+ public void added(final List<T> rightValue, final IFact<T> cause,
+ final boolean conclude) {
addMerge(leftTable, rightValue, leftTableMapping,
rightTableMapping, leftIndexedTable, rightIndexedTable,
- conclude);
+ cause, conclude);
}
@Override
- public void removed(final List<T> rightValue, final boolean conclude) {
+ public void removed(final List<T> rightValue, final IFact<T> cause,
+ final boolean conclude) {
removeMerge(leftTable, rightValue, leftTableMapping,
/* rightTableMapping, */leftIndexedTable, rightIndexedTable,
- conclude);
+ cause, conclude);
}
};
rightTable.addListener(rightListener);
@@ -131,7 +136,7 @@
final TableSourceDestinationMapping<T> secondSourceTableMapping,
final Map<List<T>, Set<List<T>>> firstSourceIndexedTable,
final Map<List<T>, Set<List<T>>> secondSourceIndexedTable,
- final boolean conclude) {
+ final IFact<T> cause, final boolean conclude) {
final List<T> thisTableValue = secondSourceTableMapping
.fromSourceToDest(secondSourceValue);
final List<T> firstSourcevalue = firstSourceTableMapping
@@ -145,7 +150,7 @@
if (add(thisValueToAdd)) {
add(firstSourceIndexedTable, firstSourceValue, thisValueToAdd);
add(secondSourceIndexedTable, secondSourceValue, thisValueToAdd);
- fireAdded(thisValueToAdd, conclude);
+ fireAdded(thisValueToAdd, cause, conclude);
}
}
}
@@ -156,7 +161,7 @@
/* final TableSourceDestinationMapping<T> secondSourceTableMapping, */
final Map<List<T>, Set<List<T>>> firstSourceIndexedTable,
final Map<List<T>, Set<List<T>>> secondSourceIndexedTable,
- final boolean conclude) {
+ final IFact<T> cause, final boolean conclude) {
final Set<List<T>> toRemoveSet = secondSourceIndexedTable
.remove(secondSourceValue);
if (toRemoveSet == null) {
@@ -172,7 +177,7 @@
.fromDestToSource(thisValueToRemove);
firstSourceTable.removed(firstSourceValue);
remove(firstSourceIndexedTable, firstSourceValue, thisValueToRemove);
- fireRemoved(thisValueToRemove, conclude);
+ fireRemoved(thisValueToRemove, cause, conclude);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -29,6 +29,7 @@
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.fact.IFactSetListener;
+import net.sf.reasoner4j.rule.EnumPremiseMode;
import net.sf.reasoner4j.rule.EnumPremiseType;
import net.sf.reasoner4j.rule.IPremise;
@@ -43,13 +44,13 @@
protected final IFactSet<T> factSet;
- private final boolean conclude;
+ private final EnumPremiseMode mode;
public PremiseTable(final IPremise<T> premise, final IFactSet<T> factSet,
- final boolean conclude) {
+ final EnumPremiseMode mode) {
super(premise);
this.factSet = factSet;
- this.conclude = conclude;
+ this.mode = mode;
factSet.addListener(this);
}
@@ -60,14 +61,18 @@
@Override
public void asserted(final IFact<T> fact) {
- final List<T> value = premise.createVariableValueSet(fact);
- fireAdded(value, conclude);
+ if (!EnumPremiseMode.DO_NOT_LISTENING.equals(mode)) {
+ final List<T> value = premise.createVariableValueSet(fact);
+ fireAdded(value, fact,
+ true ^ EnumPremiseMode.DO_NOT_CONCLUDE.equals(mode));
+ }
}
@Override
public void retracted(final IFact<T> fact) {
final List<T> value = premise.createVariableValueSet(fact);
- fireRemoved(value, conclude);
+ fireRemoved(value, fact,
+ true ^ EnumPremiseMode.DO_NOT_CONCLUDE.equals(mode));
}
private class SelectionIterator implements Iterator<List<T>> {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -26,6 +26,7 @@
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.fact.SingleFactSet;
import net.sf.reasoner4j.rule.AbstractPremiseAndDefault;
+import net.sf.reasoner4j.rule.EnumPremiseMode;
/**
*
@@ -42,8 +43,8 @@
private final T defaultObject;
public PremiseTableAndDefault(final AbstractPremiseAndDefault<T> premise,
- final IFactSet<T> factSet, final boolean listening) {
- super(premise, factSet, listening);
+ final IFactSet<T> factSet, final EnumPremiseMode mode) {
+ super(premise, factSet, mode);
defaultSubject = premise.getDefaultSubject();
defaultPredicate = premise.getDefaultPredicate();
defaultObject = premise.getDefaultObject();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -25,6 +25,7 @@
import java.util.List;
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.rule.AbstractReplaceConclusion;
/**
@@ -44,8 +45,12 @@
}
@Override
- public void removedImpl(final List<T> value) {
+ public void removedImpl(final List<T> value, final IFact<T> cause) {
final CauseIdentifiedFact<T> createFact = createFact(value);
+ if (logger.isDebugEnabled()) {
+ logger.debug("retraction of " + createFact + " to "
+ + listener.getClass().getName() + "\n cause by " + cause);
+ }
listener.conclusionRetraction(createFact);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -24,6 +24,8 @@
import java.util.List;
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.rule.IConclusion;
/**
@@ -41,13 +43,23 @@
}
@Override
- public void addedImpl(final List<T> value) {
- listener.conclusionRetraction(createFact(value,
- ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
+ public void addedImpl(final List<T> value, final IFact<T> cause) {
+ final CauseIdentifiedFact<T> createFact = createFact(value,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER);
+ if (logger.isDebugEnabled()) {
+ logger.debug("retraction of " + createFact + " to "
+ + listener.getClass().getName() + "\n cause by " + cause);
+ }
+ listener.conclusionRetraction(createFact);
}
@Override
- public void removedImpl(final List<T> value) {
- // notify nothing
+ public void removedImpl(final List<T> value, final IFact<T> cause) {
+ if (logger.isDebugEnabled()) {
+ final CauseIdentifiedFact<T> createFact = createFact(value,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER);
+ logger.debug("no remove conclude of " + createFact + " to "
+ + listener.getClass().getName() + "\n cause by " + cause);
+ }
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -53,10 +53,9 @@
if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
premiseTable = new PremiseTableAndDefault<T>(
(AbstractPremiseAndDefault<T>) premise, view,
- premise.isConclude());
+ premise.getMode());
} else {
- premiseTable = new PremiseTable<T>(premise, view,
- premise.isConclude());
+ premiseTable = new PremiseTable<T>(premise, view, premise.getMode());
}
return premiseTable;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -40,17 +40,17 @@
private final EnumPremiseType type;
- private final boolean conclude;
+ private final EnumPremiseMode mode;
public AbstractPremise(final EnumPremiseType type,
final String subjectVariableName, final T subject,
final String predicateVariableName, final T predicate,
final String objectVariableName, final T object,
- final boolean conclude) {
+ final EnumPremiseMode mode) {
super(subjectVariableName, subject, predicateVariableName, predicate,
objectVariableName, object);
this.type = type;
- this.conclude = conclude;
+ this.mode = mode;
}
@Override
@@ -59,8 +59,8 @@
}
@Override
- public boolean isConclude() {
- return conclude;
+ public EnumPremiseMode getMode() {
+ return mode;
}
@Override
@@ -110,8 +110,8 @@
@Override
public String toString() {
- return "AbstractPremise [type=" + type + ", conclude=" + conclude
- + ", " + super.toString() + "]";
+ return "AbstractPremise [type=" + type + ", mode=" + mode + ", "
+ + super.toString() + "]";
}
@Override
@@ -119,6 +119,7 @@
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((type == null) ? 0 : type.hashCode());
+ result = prime * result + ((mode == null) ? 0 : mode.hashCode());
return result;
}
@@ -132,6 +133,8 @@
AbstractPremise<T> other = (AbstractPremise<T>) obj;
if (type != other.getType())
return false;
+ if (mode != other.getMode())
+ return false;
return true;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -39,10 +39,10 @@
final T subject, final T defaultSubject,
final String predicateVariableName, final T predicate,
final T defaultPredicate, final String objectVariableName,
- final T object, final T defaultObject, final boolean listening) {
+ final T object, final T defaultObject, final EnumPremiseMode mode) {
super(EnumPremiseType.DEFAULT, subjectVariableName, subject,
predicateVariableName, predicate, objectVariableName, object,
- listening);
+ mode);
this.defaultSubject = defaultSubject;
this.defaultPredicate = defaultPredicate;
this.defaultObject = defaultObject;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -35,7 +35,7 @@
final String objectVariableName, final T object) {
super(EnumPremiseType.ASSERTED, subjectVariableName, subject,
predicateVariableName, predicate, objectVariableName, object,
- true);
+ EnumPremiseMode.STANDARD);
}
@Override
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseMode.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseMode.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumPremiseMode.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -0,0 +1,39 @@
+package net.sf.reasoner4j.rule;
+
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public enum EnumPremiseMode {
+
+ /**
+ *
+ */
+ STANDARD,
+ /**
+ *
+ */
+ DO_NOT_CONCLUDE,
+ /**
+ *
+ */
+ DO_NOT_LISTENING;
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -36,7 +36,7 @@
EnumPremiseType getType();
- boolean isConclude();
+ EnumPremiseMode getMode();
String getSubjectVariableName();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -35,7 +35,7 @@
String objectVariableName, T object) {
super(EnumPremiseType.STANDARD, subjectVariableName, subject,
predicateVariableName, predicate, objectVariableName, object,
- true);
+ EnumPremiseMode.STANDARD);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -37,7 +37,8 @@
final T defaultObject) {
super(subjectVariableName, subject, defaultSubject,
predicateVariableName, predicate, defaultPredicate,
- objectVariableName, object, defaultObject, true);
+ objectVariableName, object, defaultObject,
+ EnumPremiseMode.STANDARD);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -38,7 +38,8 @@
final T object, final T defaultObject) {
super(subjectVariableName, subject, defaultSubject,
predicateVariableName, predicate, defaultPredicate,
- objectVariableName, object, defaultObject, false);
+ objectVariableName, object, defaultObject,
+ EnumPremiseMode.DO_NOT_CONCLUDE);
}
@Override
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class PremiseAndDefaultNotListening<T> extends
+ AbstractPremiseAndDefault<T> {
+
+ public PremiseAndDefaultNotListening(final String subjectVariableName,
+ final T subject, final T defaultSubject,
+ final String predicateVariableName, final T predicate,
+ final T defaultPredicate, final String objectVariableName,
+ final T object, final T defaultObject) {
+ super(subjectVariableName, subject, defaultSubject,
+ predicateVariableName, predicate, defaultPredicate,
+ objectVariableName, object, defaultObject,
+ EnumPremiseMode.DO_NOT_LISTENING);
+ }
+
+ @Override
+ public String toString() {
+ return "PremiseAndDefaultNotListening [" + super.toString() + "]";
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -35,7 +35,7 @@
String objectVariableName, T object) {
super(EnumPremiseType.STANDARD, subjectVariableName, subject,
predicateVariableName, predicate, objectVariableName, object,
- false);
+ EnumPremiseMode.DO_NOT_CONCLUDE);
}
@Override
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class PremiseNotListening<T> extends AbstractPremise<T> {
+
+ public PremiseNotListening(String subjectVariableName, T subject,
+ String predicateVariableName, T predicate,
+ String objectVariableName, T object) {
+ super(EnumPremiseType.STANDARD, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object,
+ EnumPremiseMode.DO_NOT_LISTENING);
+ }
+
+ @Override
+ public String toString() {
+ return "PremiseNotListening [" + super.toString() + "]";
+ }
+}
Copied: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java (from rev 44, trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java)
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java (rev 0)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuiltin.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j;
+
+import java.util.Iterator;
+
+import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
+import net.sf.reasoner4j.fact.IFactSet;
+import net.sf.reasoner4j.kb.IKnowledgeBase;
+import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
+import net.sf.reasoner4j.motor.IMotor;
+import net.sf.reasoner4j.motor.Motor;
+import net.sf.reasoner4j.motor.MotorFactory;
+import net.sf.reasoner4j.rule.AssertConclusion;
+import net.sf.reasoner4j.rule.AssertedPremise;
+import net.sf.reasoner4j.rule.IPremise;
+import net.sf.reasoner4j.rule.Premise;
+import net.sf.reasoner4j.rule.Rule;
+
+import org.apache.log4j.Logger;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ */
+public class TestBuiltin extends AbstractTestCase {
+
+ @SuppressWarnings("unused")
+ private static final Logger LOGGER = Logger.getLogger(TestBuiltin.class);
+
+ public void testPropertySetToProductResult() {
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
+ motor.addBuiltin(defaultBuiltinProvider);
+
+ Rule<String> rule = new Rule<String>();
+ // ?M :hasXAcceleration ?G.
+ IPremise<String> premise = new Premise<String>(
+ /* subject */"?M", null,
+ /* predicate */null, ":hasXAcceleration",
+ /* object */"?G", null);
+ rule.addPremise(premise);
+ // ?M :hasElapsedTime ?T.
+ premise = new Premise<String>(
+ /* subject */"?M", null,
+ /* predicate */null, ":hasElapsedTime",
+ /* object */"?T", null);
+ rule.addPremise(premise);
+ // ?L listFirst 0.5.
+ AssertedPremise<String> aPremise = new AssertedPremise<String>(
+ /* subject */"?L", null,
+ /* predicate */null, "listFirst",
+ /* object */null, "0.5");
+ rule.addPremise(aPremise);
+ // ?L listRest ?R1.
+ aPremise = new AssertedPremise<String>(
+ /* subject */"?L", null,
+ /* predicate */null, "listRest",
+ /* object */"?R1", null);
+ rule.addPremise(aPremise);
+ // ?R1 listFirst ?G.
+ aPremise = new AssertedPremise<String>(
+ /* subject */"?R1", null,
+ /* predicate */null, "listFirst",
+ /* object */"?G", null);
+ rule.addPremise(aPremise);
+ // ?R1 listRest ?R2.
+ aPremise = new AssertedPremise<String>(
+ /* subject */"?R1", null,
+ /* predicate */null, "listRest",
+ /* object */"?R2", null);
+ rule.addPremise(aPremise);
+ // ?R2 listFirst ?T.
+ aPremise = new AssertedPremise<String>(
+ /* subject */"?R2", null,
+ /* predicate */null, "listFirst",
+ /* object */"?T", null);
+ rule.addPremise(aPremise);
+ // ?R2 listRest ?R3.
+ aPremise = new AssertedPremise<String>(
+ /* subject */"?R2", null,
+ /* predicate */null, "listRest",
+ /* object */"?R3", null);
+ rule.addPremise(aPremise);
+ // ?R3 listFirst ?T.
+ aPremise = new AssertedPremise<String>(
+ /* subject */"?R3", null,
+ /* predicate */null, "listFirst",
+ /* object */"?T", null);
+ rule.addPremise(aPremise);
+ // ?R3 listRest nil.
+ aPremise = new AssertedPremise<String>(
+ /* subject */"?R3", null,
+ /* predicate */null, "listRest",
+ /* object */null, "nil");
+ rule.addPremise(aPremise);
+ // ?L mathProduct ?X.
+ premise = new Premise<String>(
+ /* subject */"?L", null,
+ /* predicate */null, "mathProduct",
+ /* object */"?X", null);
+ rule.addPremise(premise);
+
+ // ?M :hasX ?X.
+ final AssertConclusion<String> conclusion = new AssertConclusion<String>(
+ /* subject */"?M", null,
+ /* predicate */null, ":hasX",
+ /* object */"?X", null);
+ rule.addConclusion(conclusion);
+
+ motor.addRule(rule);
+
+ // :creamTart a :Mobile ;
+ // :hasXAcceleration 20.0 ;
+ // :hasElapsedTime 0.3 .
+
+ IFact<String> fact;
+ fact = new Fact<String>(":creamTart", ":hasElapsedTime", "0.3");
+ motor.assertFact(fact);
+ fact = new Fact<String>(":creamTart", ":hasXAcceleration", "20.0");
+ motor.assertFact(fact);
+
+ final IFactSet<String> allFactSet = ((Motor<String>) motor)
+ .getAllFactSet();
+ final IFactSet<String> view = allFactSet.view(":creamTart", ":hasX",
+ null);
+ assertNotNull(view);
+
+ // assert result accessing to internal fact set
+ Iterator<IFact<String>> iterator = view.iterator();
+ assertTrue(iterator.hasNext());
+ assertEquals("0.8999999999999999", iterator.next().getObject());
+ assertFalse(iterator.hasNext());
+
+ // assert result accessing knowledge base view
+ IKnowledgeBase<String> kbView = kb.view(":creamTart", ":hasX", null);
+ assertNotNull(kbView);
+ iterator = kbView.iterator();
+ assertTrue(iterator.hasNext());
+ assertEquals("0.8999999999999999", iterator.next().getObject());
+ assertFalse(iterator.hasNext());
+ }
+
+ public void testPropertyIsProductResultOfAnOtherProperty() {
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
+ motor.addBuiltin(defaultBuiltinProvider);
+
+ Rule<String> rule = new Rule<String>();
+ // ?X value ?V
+ IPremise<String> premise = new Premise<String>(
+ /* subject */"?X", null,
+ /* predicate */null, "value",
+ /* object */"?V", null);
+ rule.addPremise(premise);
+ // ?X factor ?F
+ premise = new Premise<String>(
+ /* subject */"?X", null,
+ /* predicate */null, "factor",
+ /* object */"?F", null);
+ rule.addPremise(premise);
+ // ?L listFirst ?F
+ AssertedPremise<String> aPremise = new AssertedPremise<String>(
+ /* subject */"?L", null,
+ /* predicate */null, "listFirst",
+ /* object */"?F", null);
+ rule.addPremise(aPremise);
+ // ?L listRest nil
+ aPremise = new AssertedPremise<String>(
+ /* subject */"?L", null,
+ /* predicate */null, "listRest",
+ /* object */null, "nil");
+ rule.addPremise(aPremise);
+ // ?L mathProduct ?V.
+ premise = new Premise<String>(
+ /* subject */"?L", null,
+ /* predicate */null, "mathProduct",
+ /* object */"?V", null);
+ rule.addPremise(premise);
+
+ // ?M :hasX ?X.
+ final AssertConclusion<String> conclusion = new AssertConclusion<String>(
+ /* subject */"?F", null,
+ /* predicate */null, "xxx",
+ /* object */"?V", null);
+ rule.addConclusion(conclusion);
+
+ motor.addRule(rule);
+
+ // truc value 5
+ // truc factor 6
+
+ IFact<String> fact;
+ fact = new Fact<String>("truc", "value", "5");
+ motor.assertFact(fact);
+ fact = new Fact<String>("truc", "factor", "6");
+
+ motor.assertFact(fact);
+ final IFactSet<String> allFactSet = ((Motor<String>) motor)
+ .getAllFactSet();
+ final IFactSet<String> view = allFactSet.view(null, "xxx", null);
+ assertNotNull(view);
+ assertFalse(view.iterator().hasNext());
+
+ final IKnowledgeBase<String> kbView = kb.view(null, "xxx", null);
+ assertNotNull(kbView);
+ assertFalse(kbView.iterator().hasNext());
+ }
+}
Deleted: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java 2010-12-28 01:57:31 UTC (rev 44)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java 2010-12-29 04:57:00 UTC (rev 45)
@@ -1,297 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import net.sf.reasoner4j.builtin.impl.BuiltinSupport;
-import net.sf.reasoner4j.fact.Fact;
-import net.sf.reasoner4j.fact.IFact;
-import net.sf.reasoner4j.fact.IFactSet;
-import net.sf.reasoner4j.kb.IKnowledgeBase;
-import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
-import net.sf.reasoner4j.motor.IMotor;
-import net.sf.reasoner4j.motor.Motor;
-import net.sf.reasoner4j.motor.MotorFactory;
-import net.sf.reasoner4j.rule.AssertConclusion;
-import net.sf.reasoner4j.rule.AssertedPremise;
-import net.sf.reasoner4j.rule.IPremise;
-import net.sf.reasoner4j.rule.Premise;
-import net.sf.reasoner4j.rule.Rule;
-
-/**
- *
- * @author luc peuvrier
- *
- */
-public class TestBuitin extends AbstractTestCase {
-
- public void testPropertySetToProductResult() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
- motor.addBuiltin(defaultBuiltinProvider);
-
- Rule<String> rule = new Rule<String>();
- // ?M :hasXAcceleration ?G.
- IPremise<String> premise = new Premise<String>(
- /* subject */"?M", null,
- /* predicate */null, ":hasXAcceleration",
- /* object */"?G", null);
- rule.addPremise(premise);
- // ?M :hasElapsedTime ?T.
- premise = new Premise<String>(
- /* subject */"?M", null,
- /* predicate */null, ":hasElapsedTime",
- /* object */"?T", null);
- rule.addPremise(premise);
- // ?L listFirst 0.5.
- AssertedPremise<String> aPremise = new AssertedPremise<String>(
- /* subject */"?L", null,
- /* predicate */null, "listFirst",
- /* object */null, "0.5");
- rule.addPremise(aPremise);
- // ?L listRest ?R1.
- aPremise = new AssertedPremise<String>(
- /* subject */"?L", null,
- /* predicate */null, "listRest",
- /* object */"?R1", null);
- rule.addPremise(aPremise);
- // ?R1 listFirst ?G.
- aPremise = new AssertedPremise<String>(
- /* subject */"?R1", null,
- /* predicate */null, "listFirst",
- /* object */"?G", null);
- rule.addPremise(aPremise);
- // ?R1 listRest ?R2.
- aPremise = new AssertedPremise<String>(
- /* subject */"?R1", null,
- /* predicate */null, "listRest",
- /* object */"?R2", null);
- rule.addPremise(aPremise);
- // ?R2 listFirst ?T.
- aPremise = new AssertedPremise<String>(
- /* subject */"?R2", null,
- /* predicate */null, "listFirst",
- /* object */"?T", null);
- rule.addPremise(aPremise);
- // ?R2 listRest ?R3.
- aPremise = new AssertedPremise<String>(
- /* subject */"?R2", null,
- /* predicate */null, "listRest",
- /* object */"?R3", null);
- rule.addPremise(aPremise);
- // ?R3 listFirst ?T.
- aPremise = new AssertedPremise<String>(
- /* subject */"?R3", null,
- /* predicate */null, "listFirst",
- /* object */"?T", null);
- rule.addPremise(aPremise);
- // ?R3 listRest nil.
- aPremise = new AssertedPremise<String>(
- /* subject */"?R3", null,
- /* predicate */null, "listRest",
- /* object */null, "nil");
- rule.addPremise(aPremise);
- // ?L mathProduct ?X.
- premise = new Premise<String>(
- /* subject */"?L", null,
- /* predicate */null, "mathProduct",
- /* object */"?X", null);
- rule.addPremise(premise);
-
- // ?M :hasX ?X.
- final AssertConclusion<String> conclusion = new AssertConclusion<String>(
- /* subject */"?M", null,
- /* predicate */null, ":hasX",
- /* object */"?X", null);
- rule.addConclusion(conclusion);
-
- motor.addRule(rule);
-
- // :creamTart a :Mobile ;
- // :hasXAcceleration 20.0 ;
- // :hasElapsedTime 0.3 .
-
- IFact<String> fact;
- fact = new Fact<String>(":creamTart", ":hasElapsedTime", "0.3");
- motor.assertFact(fact);
- fact = new Fact<String>(":creamTart", ":hasXAcceleration", "20.0");
- motor.assertFact(fact);
-
- final IFactSet<String> allFactSet = ((Motor<String>) motor)
- .getAllFactSet();
- final IFactSet<String> view = allFactSet.view(":creamTart", ":hasX",
- null);
- assertNotNull(view);
-
- // assert result accessing to internal fact set
- Iterator<IFact<String>> iterator = view.iterator();
- assertTrue(iterator.hasNext());
- assertEquals("0.8999999999999999", iterator.next().getObject());
- assertFalse(iterator.hasNext());
-
- // assert result accessing knowledge base view
- IKnowledgeBase<String> kbView = kb.view(":creamTart", ":hasX", null);
- assertNotNull(kbView);
- iterator = kbView.iterator();
- assertTrue(iterator.hasNext());
- assertEquals("0.8999999999999999", iterator.next().getObject());
- assertFalse(iterator.hasNext());
- }
-
- public void testPropertyIsProductResultOfAnOtherProperty() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
- motor.addBuiltin(defaultBuiltinProvider);
-
- Rule<String> rule = new Rule<String>();
- // ?X value ?V
- IPremise<String> premise = new Premise<String>(
- /* subject */"?X", null,
- /* predicate */null, "value",
- /* object */"?V", null);
- rule.addPremise(premise);
- // ?X factor ?F
- premise = new Premise<String>(
- /* subject */"?X", null,
- /* predicate */null, "factor",
- /* object */"?F", null);
- rule.addPremise(premise);
- // ?L listFirst ?F
- AssertedPremise<String> aPremise = new AssertedPremise<String>(
- /* subject */"?L", null,
- /* predicate */null, "listFirst",
- /* object */"?F", null);
- rule.addPremise(aPremise);
- // ?L listRest nil
- aPremise = new AssertedPremise<String>(
- /* subject */"?L", null,
- /* predicate */null, "listRest",
- /* object */null, "nil");
- rule.addPremise(aPremise);
- // ?L mathProduct ?V.
- premise = new Premise<String>(
- /* subject */"?L", null,
- /* predicate */null, "mathProduct",
- /* object */"?V", null);
- rule.addPremise(premise);
-
- // ?M :hasX ?X.
- final AssertConclusion<String> conclusion = new AssertConclusion<String>(
- /* subject */"?F", null,
- /* predicate */null, "xxx",
- /* object */"?V", null);
- rule.addConclusion(conclusion);
-
- motor.addRule(rule);
-
- // truc value 5
- // truc factor 6
-
- IFact<String> fact;
- fact = new Fact<String>("truc", "value", "5");
- motor.assertFact(fact);
- fact = new Fact<String>("truc", "factor", "6");
-
- motor.assertFact(fact);
- final IFactSet<String> allFactSet = ((Motor<String>) motor)
- .getAllFactSet();
- final IFactSet<String> view = allFactSet.view(null, "xxx", null);
- assertNotNull(view);
- assertFalse(view.iterator().hasNext());
-
- final IKnowledgeBase<String> kbView = kb.view(null, "xxx", null);
- assertNotNull(kbView);
- assertFalse(kbView.iterator().hasNext());
- }
-
- public void testListInListVersusPropertySum() {
- final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
- final MotorFactory<String> motorFactory = new MotorFactory<String>();
- final IKnowledgeBase<String> kb = kbFactory.create();
- final IMotor<String> motor = motorFactory.create(kb, this, this);
- motor.addBuiltin(defaultBuiltinProvider);
- final BuiltinSupport<String> builtinSupport = ((Motor<String>) motor)
- .getBuiltinSupport();
-
- Rule<String> rule = new Rule<String>();
- // ?X value ?V
- IPremise<String> premise = new Premise<String>(
- /* subject */"?X", null,
- /* predicate */null, "value",
- /* object */"?V", null);
- rule.addPremise(premise);
- // ?X factor ?F
- premise = new Premise<String>(
- /* subject */null, "xList",
- /* predicate */null, "list",
- /* object */"?L", null);
- rule.addPremise(premise);
-
- // ?M :hasX ?X.
- final AssertConclusion<String> conclusion = new AssertConclusion<String>(
- /* subject */"?V", null,
- /* predicate */null, "inList",
- /* object */"?L", null);
- rule.addConclusion(conclusion);
-
- motor.addRule(rule);
-
- motor.assertFact(new Fact<String>("truc", "value", "5"));
- assertList(builtinSupport, new String[] { "5" });
- motor.assertFact(new Fact<String>("truc", "value", "7"));
- assertList(builtinSupport, new String[] { "7", "5" });
- motor.retractFact(new Fact<String>("truc", "value", "5"));
- assertList(builtinSupport, new String[] { "7" });
- }
-
- private void assertList(final BuiltinSupport<String> builtinSupport,
- final String[] expectedValues) {
- final S...
[truncated message content] |
|
From: <luc...@us...> - 2010-12-28 01:57:39
|
Revision: 44
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=44&view=rev
Author: luc_peuvrier
Date: 2010-12-28 01:57:31 +0000 (Tue, 28 Dec 2010)
Log Message:
-----------
added list and inList builtin
Modified Paths:
--------------
trunk/reasoner4j/doc/builtin.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IIntermediateSubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractConclusion.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractReplaceConclusion.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractRuleTriple.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
trunk/reasoner4j/src/test/resources/log4j.properties
Added Paths:
-----------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ToFireFact.java
Modified: trunk/reasoner4j/doc/builtin.txt
===================================================================
--- trunk/reasoner4j/doc/builtin.txt 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/doc/builtin.txt 2010-12-28 01:57:31 UTC (rev 44)
@@ -93,23 +93,10 @@
?CN consumerType ?CT.
?CT value ?V
?V mathNotLessThan ?VOFCNP .
- ?CNP list ?L. <--not listen, default value: create ?L if not exists also listen * list *
+ ?CNP list ?LIST. <--- default empty list if fact does not exist
?CN number ?N.
- # ((?N) ?L ) listAppend ?NEWL.
- ?LN listFirst ?N <-- asserted
- ?LN listRest nil <-- asserted
- ?LL listFirst ?LN <-- asserted
- ?LL listRest ?LL2 <-- asserted
- ?LL2 listFirst ?L <-- asserted
- ?LL2 listRest nil <-- asserted
- ?LL listAppend ?NEWL. <-- builtin
-
- ?LN listFirst ?L
- ?LN listRest ?N
-
} => {
- # ?V in list ?L => ?L change
- replace object ?CNP list ?NEWL
+ ?N inList ?LIST
}.
@@ -118,7 +105,7 @@
?LIST mathSum ?NUMBER.
} => {
#?CNP number ?NUMBER. <----- replacement of ?NUMBER
- replace object ?CNP number ?NUMBER
+ ?CNP number ?NUMBER
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -22,8 +22,11 @@
*/
package net.sf.reasoner4j.builtin;
+import java.util.List;
+
import net.sf.reasoner4j.builtin.impl.BuiltinSupport;
import net.sf.reasoner4j.fact.IFact;
+import net.sf.reasoner4j.rete.entity.IConclusionListener;
/**
*
@@ -31,7 +34,7 @@
*
* @param <T>
*/
-public interface IBuiltin<T> {
+public interface IBuiltin<T> extends IConclusionListener<T> {
/**
* in builtin fact parameter and result term are null
@@ -50,9 +53,9 @@
* predicate term
* @param object
* object term
- * @return computed/matching result, null if not match
+ * @return computed/matching result, empty if not match
*/
- IFact<T> compute(int ruleIdentifier, T subject, T predicate, T object);
+ List<IFact<T>> compute(int ruleIdentifier, T subject, T predicate, T object);
void removed(int ruleIdentifier, T subject, T predicate, T object);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/TermIdentifierConstant.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -39,6 +39,10 @@
public static final String NIL_IDENTIFIER = "nil";
+ public static final String LIST_PREDICATE_IDENTIFIER = "list";
+
+ public static final String IN_LIST_PREDICATE_IDENTIFIER = "inList";
+
public static final String LIST_APPEND_PREDICATE_IDENTIFIER = "listAppend";
public static final String LIST_FIRST_PREDICATE_IDENTIFIER = "listFirst";
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -24,7 +24,9 @@
import java.util.List;
+import net.sf.reasoner4j.ReasonerException;
import net.sf.reasoner4j.builtin.IBuiltin;
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
@@ -67,6 +69,18 @@
return builtinFact;
}
+ protected T getBuiltinSubject() {
+ return builtinFact.getSubject();
+ }
+
+ protected T getBuiltinPredicate() {
+ return builtinFact.getPredicate();
+ }
+
+ protected T getBuiltinObbject() {
+ return builtinFact.getObject();
+ }
+
protected T newBlankNode() {
return builtinSupport.newBlankNode();
}
@@ -75,23 +89,65 @@
return builtinSupport.getTerm(identifier);
}
- protected T getObject(final T subject, final T predicate) {
- return builtinSupport.getObject(subject, predicate);
+ protected T getObject(final T subject, final T predicate,
+ final boolean mustFound) {
+ return builtinSupport.getObject(subject, predicate, mustFound);
}
protected List<T> getList(final T listTerm) {
return builtinSupport.getList(listTerm);
}
- public void removeList(final int ruleIdentifier, final T listTerm) {
+ protected void removeList(final int ruleIdentifier, final T listTerm) {
builtinSupport.removeList(ruleIdentifier, listTerm);
}
+ protected T getNil() {
+ return builtinSupport.getNil();
+ }
+
protected T createList(final int ruleIdentifier, final List<T> list) {
return builtinSupport.createList(ruleIdentifier, list);
}
+ protected void addInList(final T listTerm, final T elementTerm,
+ final int ruleIdentifier) {
+ builtinSupport.addInList(listTerm, elementTerm, ruleIdentifier);
+ }
+
+ protected void removeFromList(final T listTerm, final T elementTerm,
+ final int ruleIdentifier) {
+ builtinSupport.removeFromList(listTerm, elementTerm, ruleIdentifier);
+ }
+
+ public boolean addFact(final CauseIdentifiedFact<T> fact,
+ final boolean doFire) {
+ return builtinSupport.addFact(fact, doFire);
+ }
+
+ public boolean removeFact(final CauseIdentifiedFact<T> causeIdentifiedFact,
+ final boolean doFire) {
+ return builtinSupport.removeFact(causeIdentifiedFact, doFire);
+ }
+
@Override
+ public void conclusionAssertion(final CauseIdentifiedFact<T> fact) {
+ // by default not a conclusion listener
+ throw new ReasonerException("this builtin is not a conclusion listener");
+ }
+
+ @Override
+ public void conclusionRetraction(final CauseIdentifiedFact<T> fact) {
+ // by default not a conclusion listener
+ throw new ReasonerException("this builtin is not a conclusion listener");
+ }
+
+ @Override
+ public void conclusionViewRetraction(final CauseIdentifiedFact<T> fact) {
+ throw new ReasonerException("unsupported by builtin");
+ }
+
+ @Override
public void removed(final int ruleIdentifier, final T subject,
final T predicate, final T object) {
// by default no implementation
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BlankNodeBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -22,6 +22,9 @@
*/
package net.sf.reasoner4j.builtin.impl;
+import java.util.ArrayList;
+import java.util.List;
+
import net.sf.reasoner4j.ReasonerException;
import net.sf.reasoner4j.builtin.TermIdentifierConstant;
import net.sf.reasoner4j.fact.Fact;
@@ -41,12 +44,14 @@
}
@Override
- public IFact<T> compute(final int ruleIdentifier, final T subject,
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
final T predicate, final T object) {
if (object != null) {
throw new ReasonerException(
"this is a builtin to generate blank node");
}
- return new Fact<T>(subject, predicate, newBlankNode());
+ final List<IFact<T>> resultFactList = new ArrayList<IFact<T>>(1);
+ resultFactList.add(new Fact<T>(subject, predicate, newBlankNode()));
+ return resultFactList;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -35,8 +35,8 @@
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.kb.AllKnowledgeBase;
-import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.motor.IBlankNodeProvider;
+import net.sf.reasoner4j.rete.entity.ReteRule;
/**
*
@@ -48,7 +48,7 @@
private final IBuitinTermProvider<T> buitinTermProvider;
- private final IKnowledgeBase<T> knowledgeBase;
+ private final AllKnowledgeBase<T> knowledgeBase;
private final IBlankNodeProvider<T> blankNodeProvider;
@@ -63,13 +63,13 @@
private final IFactSet<T> allFactSet;
public BuiltinSupport(final IBuitinTermProvider<T> buitinTermProvider,
- final IKnowledgeBase<T> knowledgeBase,
+ final AllKnowledgeBase<T> knowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
super();
this.buitinTermProvider = buitinTermProvider;
this.knowledgeBase = knowledgeBase;
this.blankNodeProvider = blankNodeProvider;
- this.allFactSet = ((AllKnowledgeBase<T>) knowledgeBase).getFactSet();
+ this.allFactSet = knowledgeBase.getFactSet();
nil = getTerm(TermIdentifierConstant.NIL_IDENTIFIER);
listFirstPredicate = getTerm(TermIdentifierConstant.LIST_FIRST_PREDICATE_IDENTIFIER);
listRestPredicate = getTerm(TermIdentifierConstant.LIST_REST_PREDICATE_IDENTIFIER);
@@ -84,10 +84,20 @@
return allFactSet.addFact(fact, false);
}
+ public boolean addFact(final CauseIdentifiedFact<T> fact,
+ final boolean doFire) {
+ return allFactSet.addFact(fact, doFire);
+ }
+
public boolean removeFact(final CauseIdentifiedFact<T> causeIdentifiedFact) {
return allFactSet.removeFact(causeIdentifiedFact, false);
}
+ public boolean removeFact(final CauseIdentifiedFact<T> causeIdentifiedFact,
+ final boolean doFire) {
+ return allFactSet.removeFact(causeIdentifiedFact, doFire);
+ }
+
public final T getTerm(final String identifier) {
if (buitinTermProvider == null) {
throw new ReasonerException("need buildtermProvider to be defined");
@@ -112,51 +122,80 @@
return term;
}
- public T getObject(final T subject, final T predicate) {
- final IFact<T> fact = getFactForSubjectPredicate(subject, predicate);
- return fact.getObject();
+ public T getObject(final T subject, final T predicate,
+ final boolean mustFound) {
+ if (subject == null) {
+ throw new ReasonerException("subject is null, must be defined");
+ }
+ if (predicate == null) {
+ throw new ReasonerException("predicate is null, must be defined");
+ }
+ final IFact<T> fact = getFactForSubjectPredicate(subject, predicate,
+ mustFound);
+ return fact == null ? null : fact.getObject();
}
private IFact<T> getFactForSubjectPredicate(final T subject,
- final T predicate) {
+ final T predicate, final boolean mustFound) {
final IFactSet<T> factSet = allFactSet
.view(subject, predicate, null/* object */);
final Iterator<IFact<T>> iterator = factSet.iterator();
- if (!iterator.hasNext()) {
- throw new ReasonerException("must found oject for " + subject
- + " subject and " + predicate + " predicate");
- }
- final IFact<T> fact = iterator.next();
+ final IFact<T> fact;
if (iterator.hasNext()) {
- throw new ReasonerException("too much oject for " + subject
- + " subject and " + predicate + " predicate");
+ fact = iterator.next();
+ if (iterator.hasNext()) {
+ throw new ReasonerException("too much oject for \"" + subject
+ + "\" subject and \"" + predicate + "\" predicate");
+ }
+ } else {
+ if (mustFound) {
+ throw new ReasonerException("must found object for \""
+ + subject + "\" subject and \"" + predicate
+ + "\" predicate");
+ }
+ fact = null;
}
return fact;
}
public List<T> getList(final T listTerm) {
+ if (listTerm == null) {
+ throw new ReasonerException("listTerm is null, must be defined");
+ }
final List<T> list = new LinkedList<T>();
T currentList = listTerm;
while (!nil.equals(currentList)) {
- final T listFirst = getObject(currentList, listFirstPredicate);
- list.add(listFirst);
- currentList = getObject(currentList, listRestPredicate);
+ final T listFirst = getObject(currentList, listFirstPredicate,
+ false);
+ if (listFirst == null) {
+ currentList = nil;
+ } else {
+ list.add(listFirst);
+ currentList = getObject(currentList, listRestPredicate, true);
+ }
}
return list;
}
public void removeList(final int ruleIdentifier, final T listTerm) {
+ if (listTerm == null) {
+ throw new ReasonerException("listTerm is null, must be defined");
+ }
T current = listTerm;
while (!nil.equals(current)) {
IFact<T> fact = getFactForSubjectPredicate(current,
- listFirstPredicate);
+ listFirstPredicate, true);
removeFact(new CauseIdentifiedFact<T>(fact, ruleIdentifier));
- fact = getFactForSubjectPredicate(current, listRestPredicate);
+ fact = getFactForSubjectPredicate(current, listRestPredicate, true);
removeFact(new CauseIdentifiedFact<T>(fact, ruleIdentifier));
current = fact.getObject();
}
}
+ public T getNil() {
+ return nil;
+ }
+
public T createList(final int ruleIdentifier, final List<T> list) {
final T listTerm = newBlankNode();
T current = listTerm;
@@ -177,4 +216,87 @@
return listTerm;
}
+ public void addInList(final T listTerm, final T elementTerm,
+ final int ruleIdentifier) {
+ if (listTerm == null) {
+ throw new ReasonerException("listTerm is null, must be defined");
+ }
+ if (nil.equals(listTerm)) {
+ throw new ReasonerException("listTerm is nil, must be defined");
+ }
+ if (elementTerm == null) {
+ throw new ReasonerException(
+ "element to add is null, must be defined");
+ }
+ if (getFactForSubjectPredicate(listTerm, listFirstPredicate, false) == null) {
+ addFact(new CauseIdentifiedFact<T>(listTerm, listFirstPredicate,
+ elementTerm, ruleIdentifier));
+ addFact(new CauseIdentifiedFact<T>(listTerm, listRestPredicate,
+ nil, ruleIdentifier));
+
+ } else {
+
+ T previous = null;
+ T currentList = listTerm;
+ while (!nil.equals(currentList)) {
+ previous = currentList;
+ final IFact<T> fact = getFactForSubjectPredicate(currentList,
+ listRestPredicate, false);
+ if (fact == null) {
+ currentList = nil;
+ } else {
+ currentList = fact.getObject();
+ }
+ }
+ final T rest = newBlankNode();
+ removeFact(new CauseIdentifiedFact<T>(previous, listRestPredicate,
+ nil, ruleIdentifier));
+ addFact(new CauseIdentifiedFact<T>(previous, listRestPredicate,
+ rest, ruleIdentifier));
+ addFact(new CauseIdentifiedFact<T>(rest, listFirstPredicate,
+ elementTerm, ruleIdentifier));
+ addFact(new CauseIdentifiedFact<T>(rest, listRestPredicate, nil,
+ ruleIdentifier));
+ }
+ }
+
+ public void removeFromList(final T listTerm, final T elementTerm,
+ final int ruleIdentifier) {
+ if (listTerm == null) {
+ throw new ReasonerException("listTerm is null, must be defined");
+ }
+ if (elementTerm == null) {
+ throw new ReasonerException(
+ "element to remove is null, must be defined");
+ }
+ T currentList = listTerm;
+ while (!nil.equals(currentList)) {
+ final T listFirst = getObject(currentList, listFirstPredicate, true);
+ if (listFirst.equals(elementTerm)) {
+ removeFact(new CauseIdentifiedFact<T>(currentList,
+ listFirstPredicate, elementTerm,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
+ final T rest = getObject(currentList, listRestPredicate, true);
+ removeFact(new CauseIdentifiedFact<T>(currentList,
+ listRestPredicate, rest,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
+ if (!nil.equals(rest)) {
+ final T restFirst = getObject(rest, listFirstPredicate,
+ true);
+ removeFact(new CauseIdentifiedFact<T>(rest,
+ listFirstPredicate, restFirst,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
+ final T restRest = getObject(rest, listRestPredicate, true);
+ removeFact(new CauseIdentifiedFact<T>(rest,
+ listRestPredicate, restRest,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
+ addFact(new CauseIdentifiedFact<T>(currentList,
+ listFirstPredicate, restFirst, ruleIdentifier));
+ addFact(new CauseIdentifiedFact<T>(currentList,
+ listRestPredicate, restRest, ruleIdentifier));
+ }
+ }
+ currentList = getObject(currentList, listRestPredicate, true);
+ }
+ }
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/InListBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.impl.list;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import net.sf.reasoner4j.builtin.TermIdentifierConstant;
+import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class InListBuiltin<T> extends AbstractBuiltin<T> {
+
+ public InListBuiltin() {
+ super(null, TermIdentifierConstant.IN_LIST_PREDICATE_IDENTIFIER, null);
+ }
+
+ @Override
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
+ final T predicate, final T object) {
+ assert getBuiltinPredicate().equals(predicate);
+ final List<T> list = getList(object);
+ final List<IFact<T>> resultFactList = new LinkedList<IFact<T>>();
+ if (subject == null) {
+ for (T element : list) {
+ resultFactList.add(new Fact<T>(element, predicate, object));
+ }
+ } else {
+ if (list.contains(subject)) {
+ resultFactList.add(new Fact<T>(subject, predicate, object));
+ }// else not match
+ }
+ return resultFactList;
+ }
+
+ @Override
+ public void conclusionAssertion(final CauseIdentifiedFact<T> fact) {
+ assert getBuiltinPredicate().equals(fact.getPredicate());
+ addInList(fact.getObject(), fact.getSubject(), fact.getRuleIdentifier());
+ }
+
+ @Override
+ public void conclusionRetraction(final CauseIdentifiedFact<T> fact) {
+ assert getBuiltinPredicate().equals(fact.getPredicate());
+ removeFromList(fact.getObject(), fact.getSubject(),
+ fact.getRuleIdentifier());
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -22,6 +22,7 @@
*/
package net.sf.reasoner4j.builtin.impl.list;
+import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -47,13 +48,15 @@
}
@Override
- public IFact<T> compute(final int ruleIdentifier, final T subject,
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
final T predicate, final T object) {
+ assert getBuiltinPredicate().equals(predicate);
final List<T> listOfList = getList(subject);
final List<T> resultValue = new LinkedList<T>();
for (T term : listOfList) {
resultValue.addAll(getList(term));
}
+ final List<IFact<T>> resultFactList = new ArrayList<IFact<T>>(1);
final IFact<T> resultFact;
if (object == null) {
resultFact = new Fact<T>(subject, predicate, createList(
@@ -63,10 +66,14 @@
if (resultValue.equals(existing)) {
resultFact = new Fact<T>(subject, predicate, object);
} else {
+ // do not match
resultFact = null;
}
}
- return resultFact;
+ if (resultFact != null) {
+ resultFactList.add(resultFact);
+ }
+ return resultFactList;
}
@Override
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.builtin.impl.list;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.sf.reasoner4j.builtin.TermIdentifierConstant;
+import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.Fact;
+import net.sf.reasoner4j.fact.IFact;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class ListBuiltin<T> extends AbstractBuiltin<T> {
+
+ @SuppressWarnings("unchecked")
+ private final List<T> emptyList = Collections.EMPTY_LIST;
+
+ public ListBuiltin() {
+ super(null, TermIdentifierConstant.LIST_PREDICATE_IDENTIFIER, null);
+ }
+
+ @Override
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
+ final T predicate, final T object) {
+ assert getBuiltinPredicate().equals(predicate);
+ final T existingList = getObject(subject, predicate, false);
+ final T resultObject;
+ if (object == null) {
+ if (existingList == null) {
+ resultObject = createList(ruleIdentifier, emptyList);
+ } else {
+ resultObject = existingList;
+ }
+ } else {
+ if (object.equals(existingList)) {
+ resultObject = object;
+ } else {
+ // do not match
+ resultObject = null;
+ }
+ }
+
+ final List<IFact<T>> resultFactList = new ArrayList<IFact<T>>(1);
+ final IFact<T> resultFact;
+ if (resultObject == null) {
+ resultFact = null;
+ } else {
+ resultFact = new Fact<T>(subject, predicate, resultObject);
+ if (!resultObject.equals(object)) {
+ addFact(new CauseIdentifiedFact<T>(resultFact, ruleIdentifier),
+ true);
+ }
+ }
+ if (resultFact != null) {
+ resultFactList.add(resultFact);
+ }
+ return resultFactList;
+ }
+
+ // @Override
+ // public void removed(final int ruleIdentifier, final T subject,
+ // final T predicate, final T object) {
+ // removeList(ruleIdentifier, object);
+ // removeFact(new CauseIdentifiedFact<T>(subject, predicate, object,
+ // ruleIdentifier), true);
+ // }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathProductBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -22,6 +22,7 @@
*/
package net.sf.reasoner4j.builtin.impl.math;
+import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -52,7 +53,7 @@
}
@Override
- public IFact<T> compute(final int ruleIdentifier, final T subject,
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
final T predicate, final T object) {
final List<T> list = getList(subject);
List<BuiltinValue<T>> parameter = new LinkedList<BuiltinValue<T>>();
@@ -66,12 +67,16 @@
throw new ReasonerException("product result must be a single value");
}
final T resultValue = computeResult.getSingleValue();
+ final List<IFact<T>> resultFactList = new ArrayList<IFact<T>>(1);
final IFact<T> resultFact;
if (object == null || resultValue.equals(object)) {
resultFact = new Fact<T>(subject, predicate, resultValue);
} else {
resultFact = null;
}
- return resultFact;
+ if (resultFact != null) {
+ resultFactList.add(resultFact);
+ }
+ return resultFactList;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/math/MathSumBuiltin.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -22,6 +22,7 @@
*/
package net.sf.reasoner4j.builtin.impl.math;
+import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -51,7 +52,7 @@
}
@Override
- public IFact<T> compute(final int ruleIdentifier, final T subject,
+ public List<IFact<T>> compute(final int ruleIdentifier, final T subject,
final T predicate, final T object) {
final List<T> list = getList(subject);
List<BuiltinValue<T>> parameter = new LinkedList<BuiltinValue<T>>();
@@ -65,12 +66,16 @@
throw new ReasonerException("sum result must be a single value");
}
final T resultValue = computeResult.getSingleValue();
+ final List<IFact<T>> resultFactList = new ArrayList<IFact<T>>(1);
final IFact<T> resultFact;
if (object == null || resultValue.equals(object)) {
resultFact = new Fact<T>(subject, predicate, resultValue);
} else {
resultFact = null;
}
- return resultFact;
+ if (resultFact != null) {
+ resultFactList.add(resultFact);
+ }
+ return resultFactList;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/provider/DefaultBuiltinProvider.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -27,7 +27,9 @@
import net.sf.reasoner4j.builtin.IBuiltin;
import net.sf.reasoner4j.builtin.impl.BlankNodeBuiltin;
+import net.sf.reasoner4j.builtin.impl.list.InListBuiltin;
import net.sf.reasoner4j.builtin.impl.list.ListAppendBuiltin;
+import net.sf.reasoner4j.builtin.impl.list.ListBuiltin;
import net.sf.reasoner4j.builtin.impl.math.MathProductBuiltin;
/**
@@ -44,6 +46,8 @@
super();
builtinList.add(new BlankNodeBuiltin<T>());
builtinList.add(new MathProductBuiltin<T>(builtinComputer));
+ builtinList.add(new ListBuiltin<T>());
+ builtinList.add(new InListBuiltin<T>());
builtinList.add(new ListAppendBuiltin<T>());
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -106,13 +106,15 @@
}
@Override
- public void fireAsserted(ISubFactSet<T> subFactSet) {
- parentFactSet.fireAsserted(subFactSet);
+ public void fireAsserted(ISubFactSet<T> subFactSet,
+ CauseIdentifiedFact<T> fact) {
+ parentFactSet.fireAsserted(subFactSet, fact);
}
@Override
- public void fireRetracted(ISubFactSet<T> subFactSet) {
- parentFactSet.fireRetracted(subFactSet);
+ public void fireRetracted(ISubFactSet<T> subFactSet,
+ CauseIdentifiedFact<T> fact) {
+ parentFactSet.fireRetracted(subFactSet, fact);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -22,10 +22,10 @@
*/
package net.sf.reasoner4j.fact;
+import java.util.Deque;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
-import java.util.List;
import java.util.Map;
import net.sf.reasoner4j.ReasonerException;
@@ -58,10 +58,10 @@
/**/new HashMap<IFact<T>, SingleFactSet<T>>();
// FIXMELUC temporary for assertFact
- private final List<ISubFactSet<T>> subFactSetList = new LinkedList<ISubFactSet<T>>();
+ private final Deque<ToFireFact<T>> toAssertSubFactSetList = new LinkedList<ToFireFact<T>>();
// FIXMELUC temporary for retractFact
- private final List<ISubFactSet<T>> toRetractSubFactSetList = new LinkedList<ISubFactSet<T>>();
+ private final Deque<ToFireFact<T>> toRetractSubFactSetList = new LinkedList<ToFireFact<T>>();
public AllFactSet() {
super(null);
@@ -70,24 +70,37 @@
@Override
public void assertFact(final CauseIdentifiedFact<T> fact) {
assertOpen();
- subFactSetList.clear();
- if (addFact(fact, true)) {// update all
- // then fire
- for (ISubFactSet<T> subFactSet : subFactSetList) {
- subFactSet.fireAsserted(fact);
- }
+ toAssertSubFactSetList.clear();
+ toRetractSubFactSetList.clear();
+ if (addFact(fact, true)) {// update all then fire
+ fire();
}
- subFactSetList.clear();
fireAsserted(fact);
}
+ private void fire() {
+ ToFireFact<T> toRetract = toRetractSubFactSetList.pollFirst();
+ ToFireFact<T> toAssert = toAssertSubFactSetList.pollFirst();
+ while (toRetract != null || toAssert != null) {
+ if (toRetract == null) {
+ toAssert.getSubFactSet().fireAsserted(toAssert.getFact());
+ toAssert = toAssertSubFactSetList.pollFirst();
+ } else {
+ toRetract.getSubFactSet().fireRetracted(toRetract.getFact());
+ toRetract = toRetractSubFactSetList.pollFirst();
+ }
+ }
+ }
+
@Override
- public void fireAsserted(final ISubFactSet<T> subFactSet) {
- subFactSetList.add(subFactSet);
+ public void fireAsserted(final ISubFactSet<T> subFactSet,
+ CauseIdentifiedFact<T> fact) {
+ toAssertSubFactSetList.add(new ToFireFact<T>(subFactSet, fact));
}
@Override
- public boolean addFact(CauseIdentifiedFact<T> fact, final boolean doFire) {
+ public boolean addFact(final CauseIdentifiedFact<T> fact,
+ final boolean doFire) {
SingleFactSet<T> singleFactSet = getOrCreateSingleFactSet(fact
.getFact());
final boolean added;
@@ -98,13 +111,13 @@
final T object = fact.getObject();
final PredicateObjectOfSubject<T> predicateObjectOfSubject =
/**/predicateObjectOfSubjectGetOrCreate(subject);
- predicateObjectOfSubject.addFact(singleFactSet, doFire);
+ predicateObjectOfSubject.addFact(singleFactSet, fact, doFire);
final SubjectObjectOfPredicate<T> subjectObjectOfPredicate =
/**/subjectObjectOfPredicateGetOrCreate(predicate);
- subjectObjectOfPredicate.addFact(singleFactSet, doFire);
+ subjectObjectOfPredicate.addFact(singleFactSet, fact, doFire);
final SubjectPredicateOfObject<T> subjectPredicateOfObject =
/**/subjectPredicateOfObjectGetOrCreate(object);
- subjectPredicateOfObject.addFact(singleFactSet, doFire);
+ subjectPredicateOfObject.addFact(singleFactSet, fact, doFire);
} else {
added = false;
}
@@ -152,13 +165,10 @@
assertOpen();
try {
toRetractSubFactSetList.clear();
- if (removeFact(fact, true)) {// update all
- // then fire
- for (ISubFactSet<T> subFactSet : toRetractSubFactSetList) {
- subFactSet.fireRetracted(fact);
- }
+ toAssertSubFactSetList.clear();
+ if (removeFact(fact, true)) {// update all then fire
+ fire();
}
- toRetractSubFactSetList.clear();
fireRetracted(fact);
} catch (Exception exception) {
throw new ReasonerException("for " + fact, exception);
@@ -166,8 +176,9 @@
}
@Override
- public void fireRetracted(final ISubFactSet<T> subFactSet) {
- toRetractSubFactSetList.add(subFactSet);
+ public void fireRetracted(final ISubFactSet<T> subFactSet,
+ final CauseIdentifiedFact<T> fact) {
+ toRetractSubFactSetList.add(new ToFireFact<T>(subFactSet, fact));
}
@Override
@@ -191,7 +202,7 @@
/**/(PredicateObjectOfSubject<T>) predicateObjectBySubjectMapGetOrCreate(subject);
if (predicateObjectOfSubject != null) {
removed = predicateObjectOfSubject.removeFact(singleFactSet,
- doFire);
+ causeIdentifiedFact, doFire);
if (predicateObjectOfSubject.isEmpty()
&& !predicateObjectOfSubject.hasListener()) {
predicateObjectBySubjectMap.remove(subject).close();
@@ -200,7 +211,7 @@
final SubjectObjectOfPredicate<T> subjectObjectOfPredicate = subjectObjectByPredicateMapGetOrCreate(predicate);
if (subjectObjectOfPredicate != null) {
removed = subjectObjectOfPredicate.removeFact(singleFactSet,
- doFire);
+ causeIdentifiedFact, doFire);
if (subjectObjectOfPredicate.isEmpty()
&& !subjectObjectOfPredicate.hasListener()) {
subjectObjectByPredicateMap.remove(predicate).close();
@@ -211,7 +222,7 @@
if (subjectPredicateOfObject != null
&& !subjectPredicateOfObject.hasListener()) {
removed = subjectPredicateOfObject.removeFact(singleFactSet,
- doFire);
+ causeIdentifiedFact, doFire);
if (subjectPredicateOfObject.isEmpty()) {
subjectPredicateByObjectMap.remove(object).close();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IIntermediateSubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IIntermediateSubFactSet.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/IIntermediateSubFactSet.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -32,10 +32,12 @@
/**
*
* @param singleFactSet
+ * @param fact
* @param doFire
* @return true if fact added
*/
- boolean addFact(SingleFactSet<T> singleFactSet, boolean doFire);
+ boolean addFact(SingleFactSet<T> singleFactSet,
+ CauseIdentifiedFact<T> fact, boolean doFire);
// /**
// * also exists in {@link IFactSet} to make able to add asserted premise
@@ -46,8 +48,11 @@
/**
*
* @param singleFactSet
+ * @param fact
+ * @param doFire
* @return true if fact removed
*/
- boolean removeFact(SingleFactSet<T> singleFactSet, boolean doFire);
+ boolean removeFact(SingleFactSet<T> singleFactSet,
+ CauseIdentifiedFact<T> fact, boolean doFire);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -56,8 +56,8 @@
void fireRetracted(CauseIdentifiedFact<T> fact);
- void fireAsserted(ISubFactSet<T> subFactSet);
+ void fireAsserted(ISubFactSet<T> subFactSet, CauseIdentifiedFact<T> fact);
- void fireRetracted(ISubFactSet<T> subFactSet);
+ void fireRetracted(ISubFactSet<T> subFactSet, CauseIdentifiedFact<T> fact);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ObjectOfSubjectPredicate.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -70,7 +70,7 @@
@Override
public boolean addFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject())
&& predicate.equals(singleFactSet.getPredicate());
final T object = singleFactSet.getObject();
@@ -81,7 +81,7 @@
factByObjectMap.put(object, singleFactSet);
added = true;
if (doFire) {
- fireAsserted(this);
+ fireAsserted(this, fact);
}
} else {
assert singleFactSet == existingSingleFactSet;
@@ -99,7 +99,7 @@
@Override
public boolean removeFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject())
&& predicate.equals(singleFactSet.getPredicate());
final T object = singleFactSet.getObject();
@@ -111,7 +111,7 @@
} else {
removed = true;
if (doFire) {
- fireRetracted(this);
+ fireRetracted(this, fact);
}
}
return removed;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateObjectOfSubject.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -67,19 +67,19 @@
@Override
public boolean addFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject());
final T predicate = singleFactSet.getPredicate();
final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
/**/objectOfSubjectPredicateGetOrCreate(predicate);
final boolean added = objectOfSubjectPredicate.addFact(singleFactSet,
- doFire);
+ fact, doFire);
final T object = singleFactSet.getObject();
final PredicateOfSubjectObject<T> predicateOfSubjectObject =
/**/predicateOfSubjectObjectGetOrCreate(object);
- predicateOfSubjectObject.addFact(singleFactSet, doFire);
+ predicateOfSubjectObject.addFact(singleFactSet, fact, doFire);
if (added && doFire) {
- fireAsserted(this);
+ fireAsserted(this, fact);
}
return added;
}
@@ -119,7 +119,7 @@
@Override
public boolean removeFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert singleFactSet.getSubject().equals(subject);
final T predicate = singleFactSet.getPredicate();
boolean removed = false;
@@ -127,8 +127,8 @@
/**/(ObjectOfSubjectPredicate<T>) objectOfSubjectPredicateByPredicateMap
.get(predicate);
if (objectOfSubjectPredicate != null) {
- removed = objectOfSubjectPredicate
- .removeFact(singleFactSet, doFire);
+ removed = objectOfSubjectPredicate.removeFact(singleFactSet, fact,
+ doFire);
if (objectOfSubjectPredicate.isEmpty()
&& !objectOfSubjectPredicate.hasListener()) {
objectOfSubjectPredicateByPredicateMap.remove(predicate)
@@ -139,15 +139,15 @@
PredicateOfSubjectObject<T> predicateOfSubjectObject =
/**/predicateOfSubjectObjectByObjectMap.get(object);
if (predicateOfSubjectObject != null) {
- removed = predicateOfSubjectObject
- .removeFact(singleFactSet, doFire);
+ removed = predicateOfSubjectObject.removeFact(singleFactSet, fact,
+ doFire);
if (predicateOfSubjectObject.isEmpty()
&& !predicateOfSubjectObject.hasListener()) {
predicateOfSubjectObjectByObjectMap.remove(object).close();
}
}
if (removed && doFire) {
- fireRetracted(this);
+ fireRetracted(this, fact);
}
return removed;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/PredicateOfSubjectObject.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -70,7 +70,7 @@
@Override
public boolean addFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject())
&& object.equals(singleFactSet.getObject());
final T predicate = singleFactSet.getPredicate();
@@ -81,7 +81,7 @@
factByPredicate.put(predicate, singleFactSet);
added = true;
if (doFire) {
- fireAsserted(this);
+ fireAsserted(this, fact);
}
} else {
added = false;
@@ -98,7 +98,7 @@
@Override
public boolean removeFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert subject.equals(singleFactSet.getSubject())
&& object.equals(singleFactSet.getObject());
final T predicate = singleFactSet.getPredicate();
@@ -110,7 +110,7 @@
} else {
removed = true;
if (doFire) {
- fireRetracted(this);
+ fireRetracted(this, fact);
}
}
return removed;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -136,7 +136,7 @@
this.fact = null;
removed = true;
if (doFire) {
- fireRetracted(this);
+ fireRetracted(this, causeIdentifiedFact);
}
} else {
removed = false;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectObjectOfPredicate.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -67,19 +67,19 @@
@Override
public boolean addFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert predicate.equals(singleFactSet.getPredicate());
final T subject = singleFactSet.getSubject();
final ObjectOfSubjectPredicate<T> objectOfSubjectPredicate =
/**/objectOfSubjectPredicateGetOrCreate(subject);
final boolean added = objectOfSubjectPredicate.addFact(singleFactSet,
- doFire);
+ fact, doFire);
final T object = singleFactSet.getObject();
final SubjectOfPredicateObject<T> subjectOfPredicateObject =
/**/subjectOfPredicateObjectGetOrCreate(object);
- subjectOfPredicateObject.addFact(singleFactSet, doFire);
+ subjectOfPredicateObject.addFact(singleFactSet, fact, doFire);
if (added && doFire) {
- fireAsserted(this);
+ fireAsserted(this, fact);
}
return added;
}
@@ -119,7 +119,7 @@
@Override
public boolean removeFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert singleFactSet.getPredicate().equals(predicate);
boolean removed = false;
final T subject = singleFactSet.getSubject();
@@ -127,8 +127,8 @@
/**/(ObjectOfSubjectPredicate<T>) objectOfSubjectPredicateBySubjectMap
.get(subject);
if (objectOfSubjectPredicate != null) {
- removed = objectOfSubjectPredicate
- .removeFact(singleFactSet, doFire);
+ removed = objectOfSubjectPredicate.removeFact(singleFactSet, fact,
+ doFire);
if (objectOfSubjectPredicate.isEmpty()
&& !objectOfSubjectPredicate.hasListener()) {
objectOfSubjectPredicateBySubjectMap.remove(subject).close();
@@ -138,15 +138,15 @@
SubjectOfPredicateObject<T> subjectOfPredicateObject =
/**/subjectOfPredicateObjectByPredicateMap.get(object);
if (subjectOfPredicateObject != null) {
- removed = subjectOfPredicateObject
- .removeFact(singleFactSet, doFire);
+ removed = subjectOfPredicateObject.removeFact(singleFactSet, fact,
+ doFire);
if (subjectOfPredicateObject.isEmpty()
&& !subjectOfPredicateObject.hasListener()) {
subjectOfPredicateObjectByPredicateMap.remove(object).close();
}
}
if (removed && doFire) {
- fireRetracted(this);
+ fireRetracted(this, fact);
}
return removed;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectOfPredicateObject.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -70,7 +70,7 @@
@Override
public boolean addFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert predicate.equals(singleFactSet.getPredicate())
&& object.equals(singleFactSet.getObject());
final T subject = singleFactSet.getSubject();
@@ -81,7 +81,7 @@
factBySubject.put(subject, singleFactSet);
added = true;
if (doFire) {
- fireAsserted(this);
+ fireAsserted(this, fact);
}
} else {
added = false;
@@ -98,7 +98,7 @@
@Override
public boolean removeFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert predicate.equals(singleFactSet.getPredicate())
&& object.equals(singleFactSet.getObject());
final T subject = singleFactSet.getSubject();
@@ -110,7 +110,7 @@
} else {
removed = true;
if (doFire) {
- fireRetracted(this);
+ fireRetracted(this, fact);
}
}
return removed;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SubjectPredicateOfObject.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -67,19 +67,19 @@
@Override
public boolean addFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert object.equals(singleFactSet.getObject());
final T subject = singleFactSet.getSubject();
final PredicateOfSubjectObject<T> predicateOfSubjectObject =
/**/predicateOfSubjectObjectGetOrCreate(subject);
final boolean added = predicateOfSubjectObject.addFact(singleFactSet,
- doFire);
+ fact, doFire);
final T predicate = singleFactSet.getPredicate();
final SubjectOfPredicateObject<T> subjectOfPredicateObject =
/**/subjectOfPredicateObjectGetOrCreate(predicate);
- subjectOfPredicateObject.addFact(singleFactSet, doFire);
+ subjectOfPredicateObject.addFact(singleFactSet, fact, doFire);
if (added && doFire) {
- fireAsserted(this);
+ fireAsserted(this, fact);
}
return added;
}
@@ -119,7 +119,7 @@
@Override
public boolean removeFact(final SingleFactSet<T> singleFactSet,
- final boolean doFire) {
+ final CauseIdentifiedFact<T> fact, final boolean doFire) {
assert singleFactSet.getObject().equals(object);
boolean removed = false;
final T subject = singleFactSet.getSubject();
@@ -127,8 +127,8 @@
/**/(PredicateOfSubjectObject<T>) predicateOfSubjectObjectBySubjectMap
.get(subject);
if (objectOfSubjectPredicate != null) {
- removed = objectOfSubjectPredicate
- .removeFact(singleFactSet, doFire);
+ removed = objectOfSubjectPredicate.removeFact(singleFactSet, fact,
+ doFire);
if (objectOfSubjectPredicate.isEmpty()
&& !objectOfSubjectPredicate.hasListener()) {
predicateOfSubjectObjectBySubjectMap.remove(subject).close();
@@ -138,8 +138,8 @@
SubjectOfPredicateObject<T> subjectOfPredicateObject =
/**/subjectOfPredicateObjectByPredicateMap.get(predicate);
if (subjectOfPredicateObject != null) {
- removed = subjectOfPredicateObject
- .removeFact(singleFactSet, doFire);
+ removed = subjectOfPredicateObject.removeFact(singleFactSet, fact,
+ doFire);
if (subjectOfPredicateObject.isEmpty()
&& !objectOfSubjectPredicate.hasListener()) {
subjectOfPredicateObjectByPredicateMap.remove(predicate)
@@ -147,7 +147,7 @@
}
}
if (removed && doFire) {
- fireRetracted(this);
+ fireRetracted(this, fact);
}
return removed;
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ToFireFact.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ToFireFact.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ToFireFact.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.fact;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class ToFireFact<T> {
+
+ private final ISubFactSet<T> subFactSet;
+
+ private final CauseIdentifiedFact<T> fact;
+
+ public ToFireFact(final ISubFactSet<T> subFactSet,
+ final CauseIdentifiedFact<T> fact) {
+ super();
+ this.subFactSet = subFactSet;
+ this.fact = fact;
+ }
+
+ public ISubFactSet<T> getSubFactSet() {
+ return subFactSet;
+ }
+
+ public CauseIdentifiedFact<T> getFact() {
+ return fact;
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -31,12 +31,14 @@
import org.apache.log4j.Logger;
+import net.sf.reasoner4j.Fortest;
import net.sf.reasoner4j.ReasonerException;
import net.sf.reasoner4j.builtin.IBuiltin;
import net.sf.reasoner4j.builtin.impl.BuiltinSupport;
import net.sf.reasoner4j.builtin.provider.IBuiltinProvider;
import net.sf.reasoner4j.builtin.provider.IBuitinTermProvider;
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.kb.AllKnowledgeBase;
@@ -116,8 +118,26 @@
builtinMap.put(builtin.getBuiltinFact(), builtin);
}
+ @Fortest
+ public BuiltinSupport<T> getBuiltinSupport() {
+ if (builtinSupport == null) { // lazy initialization
+ builtinSupport = new BuiltinSupport<T>(buitinTermProvider,
+ allKnowledgeBase, blankNodeProvider);
+ }
+ return builtinSupport;
+ }
+
public IBuiltin<T> builtin(final IFact<T> fact) {
- return builtinMap.get(fact);
+ T subject = fact.getSubject();
+ T predicate = fact.getPredicate();
+ // T object=fact.getObject();
+ // FIXMELUC builtin always based on predicate ?
+ IBuiltin<T> builtin;
+ builtin = builtinMap.get(new Fact<T>(null, predicate, null));
+ if (builtin == null) {
+ builtin = builtinMap.get(new Fact<T>(subject, predicate, null));
+ }
+ return builtin;
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -51,7 +51,7 @@
final ITable<T> table, final IConclusion<T> conclusion,
final int[] mapping, final IConclusionListener<T> listener) {
super();
- table.addListener(this);
+ table.addListener(this);// FIXMELUC do that in rete builder
this.listener = listener;
this.conclusion = conclusion;
this.mapping = mapping;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-26 11:12:27 UTC (rev 43)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-28 01:57:31 UTC (rev 44)
@@ -64,77 +64,60 @@
@Override
public Iterator<List<T>> select(final List<T> value) {
- final IFact<T> buitlinFact = buitin.getBuiltinFact();
- final Iterator<T> iterator = value.iterator();
/*
* compute (subject,predicate,object) parameter
*/
- T subject;
- if (buitlinFact.getSubject() == null) {
- subject = iterator.next();
- } else {
- subject = buitlinFact.getSubject();
+ final IFact<T> fact = premise.createFact(value);
+ T subject = fact.getSubject();
+ if (subject == null) {
+ subject = premise.getSubject();
}
- T predicate;
- if (buitlinFact.getPredicate() == null) {
- predicate = iterator.next();
- } else {
- predicate = buitlinFact.getPredicate();
+ T predicate = fact.getPredicate();
+ if (predicate == null) {
+ predicate = premise.getPredicate();
}
- T object;
- if (buitlinFact.getObject() == null) {
- object = iterator.next();
- } else {
- object = buitlinFact.getObject();
+ T object = fact.getObject();
+ if (object == null) {
+ object = premise.getObject();
}
- final IFact<T> resultFact = buitin.compute(ruleIdentifier, subject,
- predicate, object);
- final List<T> resultValue;
- if (resultFact == null) {
- // do not match
- resultValue = null;
- } else {
+ final List<IFact<T>> resultFactList = buitin.compute(ruleIdentifier,
+ subject, predicate, object);
+ final List<List<T>> resultList = new ArrayList<List<T>>(
+ resultFactList.size());
+ for (IFact<T> resultFact : resultFactList) {
+ final List<T> resultValue;
resultValue = new ArrayList<T>(3);
- if (buitlinFact.getSubject() == null) {
+ if (premise.getSubject() == null) {
resultValue.add(resultFact.getSubject());
}
- if (buitlinFact.getPredicate() == null) {
+ if (premise.getPredicate() == null) {
resultValue.add(resultFact.getPredicate());
}
- if (buitlinFact.getObject() == null) {
+ if (premise.getObject() == null) {
resultValue.add(resultFact.getObject());
}
+ resultList.add(resultValue);
}
- return new SingleElementIterator<List<T>>(resultValue);
+ return resultList.iterator();
}
@Override
public void removed(final List<T> value) {
- final IFact<T> buitlinFact = buitin.getBuiltinFact();
- final Iterator<T> iterator = value.iterator();
/*
* compute (subject,predicate,object) parameter
*/
- T subject;
- if (buitlinFact.getSubject() == null) {
- subject = iterator.next();
- assert subject != null;
- } else {
- subject = buitlinFact.getSubject();
+ final IFact<T> fact = premise.createFact(value);
+ T subject = fact.getSubject()...
[truncated message content] |
|
From: <luc...@us...> - 2010-12-26 11:12:33
|
Revision: 43
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=43&view=rev
Author: luc_peuvrier
Date: 2010-12-26 11:12:27 +0000 (Sun, 26 Dec 2010)
Log Message:
-----------
changed for retract count test, concept of not concluding premise
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
Property Changed:
----------------
trunk/reasoner4j/
Property changes on: trunk/reasoner4j
___________________________________________________________________
Modified: svn:ignore
- target
+ target
logs
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-26 09:34:07 UTC (rev 42)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-26 11:12:27 UTC (rev 43)
@@ -161,7 +161,7 @@
.remove(secondSourceValue);
if (toRemoveSet == null) {
throw new ReasonerException("no elements for "
- + secondSourceValue.toString());
+ + secondSourceValue.toString() + " in " + table);
}
for (List<T> thisValueToRemove : toRemoveSet) {
if (!remove(thisValueToRemove)) {
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-26 09:34:07 UTC (rev 42)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-26 11:12:27 UTC (rev 43)
@@ -37,7 +37,6 @@
import net.sf.reasoner4j.rule.AssertConclusion;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
-import net.sf.reasoner4j.rule.PremiseAndDefault;
import net.sf.reasoner4j.rule.PremiseAndDefaultNotConclude;
import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
@@ -294,24 +293,30 @@
/* object */"?NC", null);
rule.addPremise(premise);
+ // AffectConclusion do not retract conclusion
AffectConclusion<String> conclusion = new AffectConclusion<String>(
- /* subject */"?X", null, false,
- /* predicate */null, "koCount", false,
- /* object */"?NC", null, true);
+ // ReplaceConclusion<String> conclusion = new ReplaceConclusion<String>(
+ /* subject */"?X", null, false,
+ /* predicate */null, "koCount", false,
+ /* object */"?NC", null, true);
rule.addConclusion(conclusion);
motor.addRule(rule);
motor.assertFact(new Fact<String>("myCar", "state", "ko"));
logKoCount("first ko assert", kb);
assertNotNull(kb.get("myCar", "koCount", "1"));
+
motor.retractFact(new Fact<String>("myCar", "state", "ko"));
logKoCount("ko retract", kb);
+
motor.assertFact(new Fact<String>("myCar", "state", "ko"));
logKoCount("second ko assert", kb);
assertNotNull(kb.get("myCar", "koCount", "2"));
assertNull(kb.get("myCar", "koCount", "1"));
+
motor.retractFact(new Fact<String>("myCar", "state", "ko"));
logKoCount("ko retract", kb);
+
motor.assertFact(new Fact<String>("myCar", "state", "ko"));
logKoCount("third ko assert", kb);
assertNotNull(kb.get("myCar", "koCount", "3"));
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-26 09:34:15
|
Revision: 42
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=42&view=rev
Author: luc_peuvrier
Date: 2010-12-26 09:34:07 +0000 (Sun, 26 Dec 2010)
Log Message:
-----------
changed for retract count test, concept of not concluding premise
Modified Paths:
--------------
trunk/reasoner4j/doc/doc.txt
trunk/reasoner4j/doc/todo.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumConclusionType.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/ReplaceConclusion.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java
trunk/reasoner4j/src/test/resources/log4j.properties
Added Paths:
-----------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractReplaceConclusion.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AffectConclusion.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java
Removed Paths:
-------------
trunk/reasoner4j/logs/
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java
Modified: trunk/reasoner4j/doc/doc.txt
===================================================================
--- trunk/reasoner4j/doc/doc.txt 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/doc/doc.txt 2010-12-26 09:34:07 UTC (rev 42)
@@ -16,10 +16,10 @@
Premise PremiseTable
BuiltinPremiseTable
-PremiseNotListening PremiseTableNotListening
+PremiseNotConclude PremiseTableNotConclude
AssertedPremise AssertedPremiseTable
PremiseAndDefault PremiseTable
-PremiseAndDefaultNotListening PremiseTableNotListening
+PremiseAndDefaultNotConclude PremiseTableNotConclude
Merge:
------
Modified: trunk/reasoner4j/doc/todo.txt
===================================================================
--- trunk/reasoner4j/doc/todo.txt 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/doc/todo.txt 2010-12-26 09:34:07 UTC (rev 42)
@@ -26,10 +26,11 @@
Rule:
-----
-consistency check
-conclusion variable must appears in premise, or create blank node -> rete
-premise must have at least one variable
-rule removal : see FactSet problem
+consistency check:
+- conclusion variable must appears in premise, or create blank node -> rete
+- premise must have at least one variable
+- loop problem: A B C => A
+rule add/remove and fact exist => conclude assertion/retraction
ReteBuilder:
------------
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -22,6 +22,8 @@
*/
package net.sf.reasoner4j.fact;
+import net.sf.reasoner4j.ReasonerException;
+
/**
*
* @author luc peuvrier
@@ -91,10 +93,15 @@
@Override
public void fireRetracted(final CauseIdentifiedFact<T> fact) {
- if (!listenerSet.isEmpty()) {
- for (IFactSetListener<T> listener : listenerSet) {
- listener.retracted(fact.getFact());
+ try {
+ if (!listenerSet.isEmpty()) {
+ for (IFactSetListener<T> listener : listenerSet) {
+ listener.retracted(fact.getFact());
+ }
}
+ } catch (Exception exception) {
+ // FIXMELUC for test
+ throw new ReasonerException("for " + fact, exception);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -57,9 +57,12 @@
private final Map<IFact<T>, SingleFactSet<T>> singleFacSetMap =
/**/new HashMap<IFact<T>, SingleFactSet<T>>();
- // FIXME FIXMELUC temporary for assertFact and retractFact
+ // FIXMELUC temporary for assertFact
private final List<ISubFactSet<T>> subFactSetList = new LinkedList<ISubFactSet<T>>();
+ // FIXMELUC temporary for retractFact
+ private final List<ISubFactSet<T>> toRetractSubFactSetList = new LinkedList<ISubFactSet<T>>();
+
public AllFactSet() {
super(null);
}
@@ -68,7 +71,8 @@
public void assertFact(final CauseIdentifiedFact<T> fact) {
assertOpen();
subFactSetList.clear();
- if (addFact(fact, true)) {
+ if (addFact(fact, true)) {// update all
+ // then fire
for (ISubFactSet<T> subFactSet : subFactSetList) {
subFactSet.fireAsserted(fact);
}
@@ -146,18 +150,24 @@
@Override
public void retractFact(final CauseIdentifiedFact<T> fact) {
assertOpen();
- subFactSetList.clear();
- removeFact(fact, true);
- for (ISubFactSet<T> subFactSet : subFactSetList) {
- subFactSet.fireRetracted(fact);
+ try {
+ toRetractSubFactSetList.clear();
+ if (removeFact(fact, true)) {// update all
+ // then fire
+ for (ISubFactSet<T> subFactSet : toRetractSubFactSetList) {
+ subFactSet.fireRetracted(fact);
+ }
+ }
+ toRetractSubFactSetList.clear();
+ fireRetracted(fact);
+ } catch (Exception exception) {
+ throw new ReasonerException("for " + fact, exception);
}
- subFactSetList.clear();
- fireRetracted(fact);
}
@Override
public void fireRetracted(final ISubFactSet<T> subFactSet) {
- subFactSetList.add(subFactSet);
+ toRetractSubFactSetList.add(subFactSet);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -186,14 +186,15 @@
}
@Override
- public void conclusionRetraction(final T subject, final T predicate,
- final T object, int ruleIdentifier) {
- final IKnowledgeBase<T> view = allKnowledgeBase.view(subject,
- predicate, object);
+ public void conclusionViewRetraction(final CauseIdentifiedFact<T> fact) {
+ final IKnowledgeBase<T> view = allKnowledgeBase.view(fact.getSubject(),
+ fact.getPredicate(), fact.getObject());
final Iterator<IFact<T>> iterator = view.iterator();
while (iterator.hasNext()) {
- conclusionRetraction(new CauseIdentifiedFact<T>(iterator.next(),
- ruleIdentifier));
+ // conclusionRetraction(new CauseIdentifiedFact<T>(iterator.next(),
+ // fact.getRuleIdentifier()));
+ retractedStack.push(new CauseIdentifiedFact<T>(iterator.next(),
+ fact.getRuleIdentifier()));
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -90,4 +90,22 @@
throw new ReasonerException("for conclusion " + conclusion, e);
}
}
+
+ @Override
+ public void added(final List<T> value, final boolean conclude) {
+ if (conclude) {
+ addedImpl(value);
+ }
+ }
+
+ protected abstract void addedImpl(List<T> value);
+
+ @Override
+ public void removed(final List<T> value, final boolean conclude) {
+ if (conclude) {
+ removedImpl(value);
+ }
+ }
+
+ protected abstract void removedImpl(List<T> value);
}
Copied: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java (from rev 41, trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java)
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractReplaceConclusionNotifier.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rete.entity;
+
+import java.util.List;
+
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.rule.AbstractReplaceConclusion;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public abstract class AbstractReplaceConclusionNotifier<T> extends
+ AbstractConclusionNotifier<T> {
+
+ private final AbstractReplaceConclusion<T> replaceConclusion;
+
+ public AbstractReplaceConclusionNotifier(final int ruleIdentifier,
+ final ITable<T> table,
+ final AbstractReplaceConclusion<T> replaceConclusion,
+ final int[] mapping, final IConclusionListener<T> listener) {
+ super(ruleIdentifier, table, replaceConclusion, mapping, listener);
+ this.replaceConclusion = replaceConclusion;
+ }
+
+ protected CauseIdentifiedFact<T> toRetract(
+ final CauseIdentifiedFact<T> createFact) {
+ final T subjectOfToRetract;
+ if (replaceConclusion.isSubjectReplacement()) {
+ subjectOfToRetract = null;
+ } else {
+ subjectOfToRetract = createFact.getSubject();
+ }
+ final T predicateOfToRetract;
+ if (replaceConclusion.isPredicateReplacement()) {
+ predicateOfToRetract = null;
+ } else {
+ predicateOfToRetract = createFact.getPredicate();
+ }
+ final T objectOfToRetract;
+ if (replaceConclusion.isObjectReplacement()) {
+ objectOfToRetract = null;
+ } else {
+ objectOfToRetract = createFact.getObject();
+ }
+ final CauseIdentifiedFact<T> toRetract = new CauseIdentifiedFact<T>(
+ subjectOfToRetract, predicateOfToRetract, objectOfToRetract,
+ ruleIdentifier);
+ return toRetract;
+ }
+
+ protected void addedImpl(final List<T> value) {
+ final CauseIdentifiedFact<T> createFact = createFact(value);
+ final CauseIdentifiedFact<T> toRetract = toRetract(createFact);
+ listener.conclusionViewRetraction(toRetract);
+ listener.conclusionAssertion(createFact);
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -46,18 +46,18 @@
listenerSet.remove(listener);
}
- protected void fireAdded(final List<T> value) {
+ protected void fireAdded(final List<T> value, final boolean conclude) {
if (!listenerSet.isEmpty()) {
for (ITableListener<T> listener : listenerSet) {
- listener.added(value);
+ listener.added(value, conclude);
}
}
}
- protected void fireRemoved(final List<T> value) {
+ protected void fireRemoved(final List<T> value, final boolean conclude) {
if (!listenerSet.isEmpty()) {
for (ITableListener<T> listener : listenerSet) {
- listener.removed(value);
+ listener.removed(value, conclude);
}
}
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AffectConclusionNotifier.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rete.entity;
+
+import java.util.List;
+
+import net.sf.reasoner4j.rule.AbstractReplaceConclusion;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class AffectConclusionNotifier<T> extends
+ AbstractReplaceConclusionNotifier<T> {
+
+ public AffectConclusionNotifier(final int ruleIdentifier,
+ final ITable<T> table,
+ final AbstractReplaceConclusion<T> replaceConclusion,
+ final int[] mapping, final IConclusionListener<T> listener) {
+ super(ruleIdentifier, table, replaceConclusion, mapping, listener);
+ }
+
+ @Override
+ public void removedImpl(final List<T> value) {
+ // no retraction
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -41,12 +41,12 @@
}
@Override
- public void added(final List<T> variableValueSet) {
- listener.conclusionAssertion(createFact(variableValueSet));
+ public void addedImpl(final List<T> value) {
+ listener.conclusionAssertion(createFact(value));
}
@Override
- public void removed(final List<T> variableValueSet) {
- listener.conclusionRetraction(createFact(variableValueSet));
+ public void removedImpl(final List<T> value) {
+ listener.conclusionRetraction(createFact(value));
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -36,6 +36,5 @@
void conclusionRetraction(CauseIdentifiedFact<T> fact);
- void conclusionRetraction(T subject, T predicate, T object,
- int ruleIdentifier);
+ void conclusionViewRetraction(CauseIdentifiedFact<T> fact);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -32,7 +32,7 @@
*/
public interface ITableListener<T> {
- void added(final List<T> value);
+ void added(List<T> value, boolean conclude);
- void removed(final List<T> value);
+ void removed(List<T> value, boolean conclude);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -83,29 +83,33 @@
this.rightTable = rightTable;
leftListener = new ITableListener<T>() {
@Override
- public void added(final List<T> leftValue) {
+ public void added(final List<T> leftValue, final boolean conclude) {
addMerge(rightTable, leftValue, rightTableMapping,
- leftTableMapping, rightIndexedTable, leftIndexedTable);
+ leftTableMapping, rightIndexedTable, leftIndexedTable,
+ conclude);
}
@Override
- public void removed(final List<T> leftValue) {
+ public void removed(final List<T> leftValue, final boolean conclude) {
removeMerge(rightTable, leftValue, rightTableMapping,
- /* leftTableMapping, */rightIndexedTable, leftIndexedTable);
+ /* leftTableMapping, */rightIndexedTable, leftIndexedTable,
+ conclude);
}
};
leftTable.addListener(leftListener);
rightListener = new ITableListener<T>() {
@Override
- public void added(final List<T> rightValue) {
+ public void added(final List<T> rightValue, final boolean conclude) {
addMerge(leftTable, rightValue, leftTableMapping,
- rightTableMapping, leftIndexedTable, rightIndexedTable);
+ rightTableMapping, leftIndexedTable, rightIndexedTable,
+ conclude);
}
@Override
- public void removed(final List<T> rightValue) {
+ public void removed(final List<T> rightValue, final boolean conclude) {
removeMerge(leftTable, rightValue, leftTableMapping,
- /* rightTableMapping, */leftIndexedTable, rightIndexedTable);
+ /* rightTableMapping, */leftIndexedTable, rightIndexedTable,
+ conclude);
}
};
rightTable.addListener(rightListener);
@@ -126,7 +130,8 @@
final TableSourceDestinationMapping<T> firstSourceTableMapping,
final TableSourceDestinationMapping<T> secondSourceTableMapping,
final Map<List<T>, Set<List<T>>> firstSourceIndexedTable,
- final Map<List<T>, Set<List<T>>> secondSourceIndexedTable) {
+ final Map<List<T>, Set<List<T>>> secondSourceIndexedTable,
+ final boolean conclude) {
final List<T> thisTableValue = secondSourceTableMapping
.fromSourceToDest(secondSourceValue);
final List<T> firstSourcevalue = firstSourceTableMapping
@@ -140,7 +145,7 @@
if (add(thisValueToAdd)) {
add(firstSourceIndexedTable, firstSourceValue, thisValueToAdd);
add(secondSourceIndexedTable, secondSourceValue, thisValueToAdd);
- fireAdded(thisValueToAdd);
+ fireAdded(thisValueToAdd, conclude);
}
}
}
@@ -150,9 +155,14 @@
final TableSourceDestinationMapping<T> firstSourceTableMapping,
/* final TableSourceDestinationMapping<T> secondSourceTableMapping, */
final Map<List<T>, Set<List<T>>> firstSourceIndexedTable,
- final Map<List<T>, Set<List<T>>> secondSourceIndexedTable) {
+ final Map<List<T>, Set<List<T>>> secondSourceIndexedTable,
+ final boolean conclude) {
final Set<List<T>> toRemoveSet = secondSourceIndexedTable
.remove(secondSourceValue);
+ if (toRemoveSet == null) {
+ throw new ReasonerException("no elements for "
+ + secondSourceValue.toString());
+ }
for (List<T> thisValueToRemove : toRemoveSet) {
if (!remove(thisValueToRemove)) {
throw new ReasonerException("must remove "
@@ -162,7 +172,7 @@
.fromDestToSource(thisValueToRemove);
firstSourceTable.removed(firstSourceValue);
remove(firstSourceIndexedTable, firstSourceValue, thisValueToRemove);
- fireRemoved(thisValueToRemove);
+ fireRemoved(thisValueToRemove, conclude);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -43,13 +43,13 @@
protected final IFactSet<T> factSet;
- private final boolean listening;
+ private final boolean conclude;
public PremiseTable(final IPremise<T> premise, final IFactSet<T> factSet,
- final boolean listening) {
+ final boolean conclude) {
super(premise);
this.factSet = factSet;
- this.listening = listening;
+ this.conclude = conclude;
factSet.addListener(this);
}
@@ -60,16 +60,14 @@
@Override
public void asserted(final IFact<T> fact) {
- if (listening) {
- final List<T> value = premise.createVariableValueSet(fact);
- fireAdded(value);
- }
+ final List<T> value = premise.createVariableValueSet(fact);
+ fireAdded(value, conclude);
}
@Override
public void retracted(final IFact<T> fact) {
final List<T> value = premise.createVariableValueSet(fact);
- fireRemoved(value);
+ fireRemoved(value, conclude);
}
private class SelectionIterator implements Iterator<List<T>> {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -58,7 +58,7 @@
final T dpredicate = predicate == null ? defaultPredicate
: predicate;
final T dobject = object == null ? defaultObject : object;
- // FIXMELUC a local minimum implementation of fact set
+ // FIXMELUC is it better a local minimum implementation of fact set
view = new SingleFactSet<T>(null, dsubject, dpredicate, dobject);
view.addFact(new CauseIdentifiedFact<T>(dsubject, dpredicate,
dobject, 0/*
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -25,7 +25,7 @@
import java.util.List;
import net.sf.reasoner4j.fact.CauseIdentifiedFact;
-import net.sf.reasoner4j.rule.ReplaceConclusion;
+import net.sf.reasoner4j.rule.AbstractReplaceConclusion;
/**
*
@@ -33,49 +33,19 @@
*
* @param <T>
*/
-public class ReplaceConclusionNotifier<T> extends AbstractConclusionNotifier<T> {
+public class ReplaceConclusionNotifier<T> extends
+ AbstractReplaceConclusionNotifier<T> {
- private final ReplaceConclusion<T> replaceConclusion;
-
public ReplaceConclusionNotifier(final int ruleIdentifier,
final ITable<T> table,
- final ReplaceConclusion<T> replaceConclusion, final int[] mapping,
- final IConclusionListener<T> listener) {
+ final AbstractReplaceConclusion<T> replaceConclusion,
+ final int[] mapping, final IConclusionListener<T> listener) {
super(ruleIdentifier, table, replaceConclusion, mapping, listener);
- this.replaceConclusion = replaceConclusion;
}
@Override
- public void added(final List<T> variableValueSet) {
- final CauseIdentifiedFact<T> createFact = createFact(variableValueSet);
- final T subjectOfToRetract;
- if (replaceConclusion.isSubjectReplacement()) {
- subjectOfToRetract = null;
- } else {
- subjectOfToRetract = createFact.getSubject();
- }
- final T predicateOfToRetract;
- if (replaceConclusion.isPredicateReplacement()) {
- predicateOfToRetract = null;
- } else {
- predicateOfToRetract = createFact.getPredicate();
- }
- final T objectOfToRetract;
- if (replaceConclusion.isObjectReplacement()) {
- objectOfToRetract = null;
- } else {
- objectOfToRetract = createFact.getObject();
- }
- listener.conclusionRetraction(subjectOfToRetract, predicateOfToRetract,
- objectOfToRetract, ruleIdentifier);
- listener.conclusionAssertion(createFact);
+ public void removedImpl(final List<T> value) {
+ final CauseIdentifiedFact<T> createFact = createFact(value);
+ listener.conclusionRetraction(createFact);
}
-
- @Override
- public void removed(final List<T> variableValueSet) {
- // FIXMELUC since asserted is always new, retract always fail
- // final CauseIdentifiedFact<T> createFact =
- // createFact(variableValueSet);
- // listener.conclusionRetraction(createFact);
- }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -41,13 +41,13 @@
}
@Override
- public void added(final List<T> variableValueSet) {
- listener.conclusionRetraction(createFact(variableValueSet,
+ public void addedImpl(final List<T> value) {
+ listener.conclusionRetraction(createFact(value,
ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
}
@Override
- public void removed(final List<T> variableValueSet) {
+ public void removedImpl(final List<T> value) {
// notify nothing
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -53,10 +53,10 @@
if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
premiseTable = new PremiseTableAndDefault<T>(
(AbstractPremiseAndDefault<T>) premise, view,
- premise.isListening());
+ premise.isConclude());
} else {
premiseTable = new PremiseTable<T>(premise, view,
- premise.isListening());
+ premise.isConclude());
}
return premiseTable;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -31,6 +31,7 @@
import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.motor.Motor;
+import net.sf.reasoner4j.rete.entity.AffectConclusionNotifier;
import net.sf.reasoner4j.rete.entity.AssertConclusionNotifier;
import net.sf.reasoner4j.rete.entity.AssertedPremiseTable;
import net.sf.reasoner4j.rete.entity.BuiltinPremiseTable;
@@ -51,9 +52,9 @@
import net.sf.reasoner4j.retemgr.entity.MergeReteNode;
import net.sf.reasoner4j.retemgr.entity.PremiseReteNode;
import net.sf.reasoner4j.retemgr.entity.RootReteNode;
+import net.sf.reasoner4j.rule.AbstractReplaceConclusion;
import net.sf.reasoner4j.rule.IConclusion;
import net.sf.reasoner4j.rule.IPremise;
-import net.sf.reasoner4j.rule.ReplaceConclusion;
import net.sf.reasoner4j.rule.Rule;
/**
@@ -194,8 +195,13 @@
case REPLACE:
conclusionNotifier = new ReplaceConclusionNotifier<T>(
reteRule.getIdentifier(), table,
- (ReplaceConclusion<T>) conclusion, mapping, motor);
+ (AbstractReplaceConclusion<T>) conclusion, mapping, motor);
break;
+ case AFFECT:
+ conclusionNotifier = new AffectConclusionNotifier<T>(
+ reteRule.getIdentifier(), table,
+ (AbstractReplaceConclusion<T>) conclusion, mapping, motor);
+ break;
default:
throw new ReasonerException("do not manage conclusion type "
+ conclusion.getType());
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -33,17 +33,17 @@
private final EnumPremiseType type;
- private final boolean listening;
+ private final boolean conclude;
public AbstractPremise(final EnumPremiseType type,
final String subjectVariableName, final T subject,
final String predicateVariableName, final T predicate,
final String objectVariableName, final T object,
- final boolean listening) {
+ final boolean conclude) {
super(subjectVariableName, subject, predicateVariableName, predicate,
objectVariableName, object);
this.type = type;
- this.listening = listening;
+ this.conclude = conclude;
}
@Override
@@ -52,13 +52,14 @@
}
@Override
- public boolean isListening() {
- return listening;
+ public boolean isConclude() {
+ return conclude;
}
@Override
public String toString() {
- return "[type=" + type + ", listening=" + listening + "]";
+ return "AbstractPremise [type=" + type + ", conclude=" + conclude
+ + ", " + super.toString() + "]";
}
@Override
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractReplaceConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractReplaceConclusion.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractReplaceConclusion.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class AbstractReplaceConclusion<T> extends AbstractConclusion<T> {
+
+ private final boolean subjectReplacement;
+
+ private final boolean predicateReplacement;
+
+ private final boolean objectReplacement;
+
+ public AbstractReplaceConclusion(final EnumConclusionType type,
+ final String subjectVariableName, final T subject,
+ final boolean subjectReplacement,
+ final String predicateVariableName, final T predicate,
+ final boolean predicateReplacement,
+ final String objectVariableName, final T object,
+ final boolean objectReplacement) {
+ super(type, subjectVariableName, subject, predicateVariableName,
+ predicate, objectVariableName, object);
+ this.subjectReplacement = subjectReplacement;
+ this.predicateReplacement = predicateReplacement;
+ this.objectReplacement = objectReplacement;
+ }
+
+ public boolean isSubjectReplacement() {
+ return subjectReplacement;
+ }
+
+ public boolean isPredicateReplacement() {
+ return predicateReplacement;
+ }
+
+ public boolean isObjectReplacement() {
+ return objectReplacement;
+ }
+}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AffectConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AffectConclusion.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AffectConclusion.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class AffectConclusion<T> extends AbstractReplaceConclusion<T> {
+
+ public AffectConclusion(final String subjectVariableName, final T subject,
+ final boolean subjectReplacement,
+ final String predicateVariableName, final T predicate,
+ final boolean predicateReplacement,
+ final String objectVariableName, final T object,
+ final boolean objectReplacement) {
+ super(EnumConclusionType.AFFECT, subjectVariableName, subject,
+ subjectReplacement, predicateVariableName, predicate,
+ predicateReplacement, objectVariableName, object,
+ objectReplacement);
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumConclusionType.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumConclusionType.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumConclusionType.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -40,5 +40,9 @@
/**
*
*/
- REPLACE;
+ REPLACE,
+ /**
+ *
+ */
+ AFFECT;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IPremise.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -36,7 +36,7 @@
EnumPremiseType getType();
- boolean isListening();
+ boolean isConclude();
String getSubjectVariableName();
Copied: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java (from rev 41, trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java)
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotConclude.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class PremiseAndDefaultNotConclude<T> extends
+ AbstractPremiseAndDefault<T> {
+
+ public PremiseAndDefaultNotConclude(final String subjectVariableName,
+ final T subject, final T defaultSubject,
+ final String predicateVariableName, final T predicate,
+ final T defaultPredicate, final String objectVariableName,
+ final T object, final T defaultObject) {
+ super(subjectVariableName, subject, defaultSubject,
+ predicateVariableName, predicate, defaultPredicate,
+ objectVariableName, object, defaultObject, false);
+ }
+
+ @Override
+ public String toString() {
+ return "PremiseAndDefaultNotListening [" + super.toString() + "]";
+ }
+}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -1,48 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rule;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseAndDefaultNotListening<T> extends
- AbstractPremiseAndDefault<T> {
-
- public PremiseAndDefaultNotListening(final String subjectVariableName,
- final T subject, final T defaultSubject,
- final String predicateVariableName, final T predicate,
- final T defaultPredicate, final String objectVariableName,
- final T object, final T defaultObject) {
- super(subjectVariableName, subject, defaultSubject,
- predicateVariableName, predicate, defaultPredicate,
- objectVariableName, object, defaultObject, false);
- }
-
- @Override
- public String toString() {
- return "PremiseAndDefaultNotListening [" + super.toString() + "]";
- }
-}
Copied: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java (from rev 41, trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java)
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotConclude.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class PremiseNotConclude<T> extends AbstractPremise<T> {
+
+ public PremiseNotConclude(String subjectVariableName, T subject,
+ String predicateVariableName, T predicate,
+ String objectVariableName, T object) {
+ super(EnumPremiseType.STANDARD, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object,
+ false);
+ }
+
+ @Override
+ public String toString() {
+ return "PremiseNotListening [" + super.toString() + "]";
+ }
+}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -1,45 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rule;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseNotListening<T> extends AbstractPremise<T> {
-
- public PremiseNotListening(String subjectVariableName, T subject,
- String predicateVariableName, T predicate,
- String objectVariableName, T object) {
- super(EnumPremiseType.STANDARD, subjectVariableName, subject,
- predicateVariableName, predicate, objectVariableName, object,
- false);
- }
-
- @Override
- public String toString() {
- return "PremiseNotListening [" + super.toString() + "]";
- }
-}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/ReplaceConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/ReplaceConclusion.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/ReplaceConclusion.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -28,14 +28,8 @@
*
* @param <T>
*/
-public class ReplaceConclusion<T> extends AbstractConclusion<T> {
+public class ReplaceConclusion<T> extends AbstractReplaceConclusion<T> {
- private final boolean subjectReplacement;
-
- private final boolean predicateReplacement;
-
- private final boolean objectReplacement;
-
public ReplaceConclusion(final String subjectVariableName, final T subject,
final boolean subjectReplacement,
final String predicateVariableName, final T predicate,
@@ -43,21 +37,8 @@
final String objectVariableName, final T object,
final boolean objectReplacement) {
super(EnumConclusionType.REPLACE, subjectVariableName, subject,
- predicateVariableName, predicate, objectVariableName, object);
- this.subjectReplacement = subjectReplacement;
- this.predicateReplacement = predicateReplacement;
- this.objectReplacement = objectReplacement;
+ subjectReplacement, predicateVariableName, predicate,
+ predicateReplacement, objectVariableName, object,
+ objectReplacement);
}
-
- public boolean isSubjectReplacement() {
- return subjectReplacement;
- }
-
- public boolean isPredicateReplacement() {
- return predicateReplacement;
- }
-
- public boolean isObjectReplacement() {
- return objectReplacement;
- }
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -26,8 +26,6 @@
import java.util.Iterator;
import java.util.List;
-import org.apache.log4j.Logger;
-
import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
@@ -35,14 +33,17 @@
import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
import net.sf.reasoner4j.motor.IMotor;
import net.sf.reasoner4j.motor.MotorFactory;
+import net.sf.reasoner4j.rule.AffectConclusion;
import net.sf.reasoner4j.rule.AssertConclusion;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
-import net.sf.reasoner4j.rule.PremiseAndDefaultNotListening;
-import net.sf.reasoner4j.rule.ReplaceConclusion;
+import net.sf.reasoner4j.rule.PremiseAndDefault;
+import net.sf.reasoner4j.rule.PremiseAndDefaultNotConclude;
import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
+import org.apache.log4j.Logger;
+
/**
*
* @author luc peuvrier
@@ -269,7 +270,7 @@
}
}
- public void testDefaultPremiseAndReplaceConclusion() {
+ public void testCountRetract() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
final IKnowledgeBase<String> kb = kbFactory.create();
@@ -282,7 +283,7 @@
/* predicate */null, "state",
/* object */null, "ko");
rule.addPremise(premise);
- premise = new PremiseAndDefaultNotListening<String>(
+ premise = new PremiseAndDefaultNotConclude<String>(
/* subject */"?X", null, null,
/* predicate */null, "koCount", null,
/* object */"?C", null, "0");
@@ -293,7 +294,7 @@
/* object */"?NC", null);
rule.addPremise(premise);
- ReplaceConclusion<String> conclusion = new ReplaceConclusion<String>(
+ AffectConclusion<String> conclusion = new AffectConclusion<String>(
/* subject */"?X", null, false,
/* predicate */null, "koCount", false,
/* object */"?NC", null, true);
@@ -309,6 +310,12 @@
logKoCount("second ko assert", kb);
assertNotNull(kb.get("myCar", "koCount", "2"));
assertNull(kb.get("myCar", "koCount", "1"));
+ motor.retractFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("ko retract", kb);
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("third ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "3"));
+ assertNull(kb.get("myCar", "koCount", "2"));
}
private void logKoCount(final String title, final IKnowledgeBase<String> kb) {
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -51,8 +51,8 @@
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
import net.sf.reasoner4j.rule.PremiseAndDefault;
-import net.sf.reasoner4j.rule.PremiseAndDefaultNotListening;
-import net.sf.reasoner4j.rule.PremiseNotListening;
+import net.sf.reasoner4j.rule.PremiseAndDefaultNotConclude;
+import net.sf.reasoner4j.rule.PremiseNotConclude;
import net.sf.reasoner4j.rule.ReplaceConclusion;
import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
@@ -187,8 +187,6 @@
final IFactSet<String> kbFactSet = ((Motor<String>) motor)
.getAllFactSet();
final IKnowledgeBase<String> kb = motor.getKnowledgeBase();
- // FIXMELUC because of fact added by asserted premise add to conclude
- // fact
final Iterator<IFact<String>> iterator = kbFactSet.iterator();
while (iterator.hasNext()) {
final IFact<String> kbFact = iterator.next();
@@ -224,7 +222,7 @@
private void addPremiseNotListening(final Rule<String> currentRule,
final String[] definition) {
final String[] params = getParams(definition);
- final IPremise<String> premise = new PremiseNotListening<String>(
+ final IPremise<String> premise = new PremiseNotConclude<String>(
/* subject */params[0], params[1],
/* predicate */params[2], params[3],
/* object */params[4], params[5]);
@@ -244,7 +242,7 @@
private void addPremiseAndDefaultNotListening(
final Rule<String> currentRule, final String[] definition) {
final String[] params = getParams(definition);
- final IPremise<String> premise = new PremiseAndDefaultNotListening<String>(
+ final IPremise<String> premise = new PremiseAndDefaultNotConclude<String>(
/* subject */params[0], params[1], params[6],
/* predicate */params[2], params[3], params[7],
/* object */params[4], params[5], params[8]);
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -63,7 +63,7 @@
}
final boolean added = indexedValueSetForKey.add(indexedValue);
if (added) {
- fireAdded(value);
+ fireAdded(value, true);
}
return added;
}
@@ -81,7 +81,7 @@
table.remove(key);
}
if (removed) {
- fireRemoved(value);
+ fireRemoved(value, true);
}
}
return removed;
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -98,8 +98,7 @@
}
@Override
- public void conclusionRetraction(String subject, String predicate,
- String object, int ruleIdentifier) {
- // FIXMELUC test with replacement conclusion
+ public void conclusionViewRetraction(final CauseIdentifiedFact<String> fact) {
+ // // FIXMELUC test with replacement conclusion
}
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -164,7 +164,8 @@
* add to merge table notification
*/
@Override
- public void added(final List<String> variableValueSet) {
+ public void added(final List<String> variableValueSet,
+ final boolean conclude) {
addedList.add(variableValueSet);
}
@@ -172,7 +173,8 @@
* remove from merge table notification
*/
@Override
- public void removed(final List<String> variableValueSet) {
+ public void removed(final List<String> variableValueSet,
+ final boolean conclude) {
removedList.add(variableValueSet);
}
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestPremiseTable.java 2010-12-26 09:34:07 UTC (rev 42)
@@ -152,15 +152,15 @@
* add to merge table notification
*/
@Override
- public void added(final List<String> variableValueSet) {
- addedList.add(variableValueSet);
+ public void added(final List<String> value, final boolean conclude) {
+ addedList.add(value);
}
/**
* remove from merge table notification
*/
@Override
- public void removed(final List<String> variableValueSet) {
- removedList.add(variableValueSet);
+ public void removed(final List<String> value, final boolean conclude) {
+ removedList.add(value);
}
}
Modified: trunk/reasoner4j/src/test/resources/log4j.properties
===================================================================
--- trunk/reasoner4j/src/test/resources/log4j.properties 2010-12-25 04:43:52 UTC (rev 41)
+++ trunk/reasoner4j/src/test/resources/log4j.properties 2010-12-26 09:34:07 UTC (rev 42)
@@ -21,6 +21,6 @@
#log4j.logger.net.sf.reasoner4j.TestReteTable=debug
#log4j.logger.net.sf.reasoner4j.TestExistential=debug
-#log4j.logger.net.sf.reasoner4j.TestBasicInference=debug
+log4j.logger.net.sf.reasoner4j.TestBasicInference=debug
-#log4j.logger.net.sf.reasoner4j.motor.Motor=debug
\ No newline at end of file
+log4j.logger.net.sf.reasoner4j.motor.Motor=debug
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-25 04:43:58
|
Revision: 41
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=41&view=rev
Author: luc_peuvrier
Date: 2010-12-25 04:43:52 +0000 (Sat, 25 Dec 2010)
Log Message:
-----------
clean up, java doc/comment updated/added, todo updated, doc updated
Modified Paths:
--------------
trunk/reasoner4j/doc/doc.txt
trunk/reasoner4j/doc/todo.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/builtin/provider/BuiltinComputerForTests.java
trunk/reasoner4j/src/test/resources/log4j.properties
Modified: trunk/reasoner4j/doc/doc.txt
===================================================================
--- trunk/reasoner4j/doc/doc.txt 2010-12-25 04:05:44 UTC (rev 40)
+++ trunk/reasoner4j/doc/doc.txt 2010-12-25 04:43:52 UTC (rev 41)
@@ -14,19 +14,17 @@
Premise:
--------
-Premise PremiseTable PremiseVariableTable (fact set view)
- BuiltinPremiseTable VariableTable (a premise fact set)
- need for retraction
-PremiseNotListening PremiseTableNotListening PremiseVariableTable (fact set view)
-AssertedPremise AssertedPremiseTable VariableTable (a premise fact set)
- need for retraction
-PremiseAndDefault PremiseTable PremiseVariableTableAndDefault (fact set view)
-PremiseAndDefaultNotListening PremiseTableNotListening PremiseVariableTableAndDefault (fact set view)
+Premise PremiseTable
+ BuiltinPremiseTable
+PremiseNotListening PremiseTableNotListening
+AssertedPremise AssertedPremiseTable
+PremiseAndDefault PremiseTable
+PremiseAndDefaultNotListening PremiseTableNotListening
Merge:
------
-MergeTable VariableTable
+MergeTable
Conclusion:
-----------
Modified: trunk/reasoner4j/doc/todo.txt
===================================================================
--- trunk/reasoner4j/doc/todo.txt 2010-12-25 04:05:44 UTC (rev 40)
+++ trunk/reasoner4j/doc/todo.txt 2010-12-25 04:43:52 UTC (rev 41)
@@ -1,9 +1,3 @@
-is blankNode premise needed ?
------------------------------
-
-why not AssertedPremise("","",?E) instead of Premise("","blankNode",?E)
-to test
-
IBuitinTermProvider chain
-------------------------
@@ -20,9 +14,6 @@
inList builtin
--------------
-
-
-
premise negation
----------------
@@ -32,16 +23,6 @@
fact asserted => fire retract to listener
fact retracted => fire assert to listener
-negate fact conclusion
-----------------------
-
-negate fact conclusion retract the fact
-
-FactSet:
---------
-
-problem with is empty: no fact and no listener
-
Rule:
-----
@@ -55,4 +36,18 @@
optimization:
- sort premise to better rete
-- reuse common premise and merge table (take care with rule removing)
\ No newline at end of file
+- reuse common premise and merge table (take care with rule removing)
+
+------------------------------------------------------------------------------------------------------------
+
+ -------------
+ WHY NOT TO DO
+ -------------
+
+is blankNode premise needed ?
+-----------------------------
+
+why not AssertedPremise("","",?E) instead of Premise("","blankNode",?E) ?
+no, because create ("","",?E) fact !
+
+
\ No newline at end of file
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2010-12-25 04:05:44 UTC (rev 40)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractFactSet.java 2010-12-25 04:43:52 UTC (rev 41)
@@ -52,11 +52,15 @@
@Override
public void removeListener(final IFactSetListener<T> listener) {
listenerSet.remove(listener);
- if (isEmpty()) {
+ if (!hasListener() && isEmpty()) {
fireNoListenerAndEmpty();
}
}
+ /**
+ * call when remove last listener of empty fact set, or remove last fact of
+ * fact set and has no listener
+ */
protected abstract void fireNoListenerAndEmpty();
@Override
@@ -66,19 +70,16 @@
protected void assertOpen() {
if (!open) {
- throw new ReasonerException("fact set closed", whoClose);
+ throw new ReasonerException("fact set closed");
}
}
- private Exception whoClose; // FIXME _for test
-
@Override
public void close() {
if (open) {
open = false;
- whoClose = new Exception();
} else {
- throw new ReasonerException("fact set closed", whoClose);
+ throw new ReasonerException("fact set closed");
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2010-12-25 04:05:44 UTC (rev 40)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AbstractSubFactSet.java 2010-12-25 04:43:52 UTC (rev 41)
@@ -58,21 +58,25 @@
@Override
protected void fireNoListenerAndEmpty() {
+ // notify this is empty and has not listener, parent must clean itself
parentFactSet.fireNoListenerAndEmpty(this);
}
@Override
public T getSubject() {
+ // by default no subject defined
return null;
}
@Override
public T getPredicate() {
+ // by default no predicate defined
return null;
}
@Override
public T getObject() {
+ // by default no object defined
return null;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-25 04:05:44 UTC (rev 40)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/AllFactSet.java 2010-12-25 04:43:52 UTC (rev 41)
@@ -219,7 +219,7 @@
@Override
protected void fireNoListenerAndEmpty() {
- // nothing to do
+ // nothing to do, no parent sub fact set to clean
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java 2010-12-25 04:05:44 UTC (rev 40)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/ISubFactSet.java 2010-12-25 04:43:52 UTC (rev 41)
@@ -30,35 +30,26 @@
*/
public interface ISubFactSet<T> extends IFactSet<T> {
- // /**
- // *
- // * @param fact
- // * @param doFire
- // * @return true if fact added
- // */
- // boolean addFact(CauseIdentifiedFact<T> fact, boolean doFire);
- //
- // // /**
- // // * also exists in {@link IFactSet} to make able to add asserted premise
- // // */
- // // @Override
- // // boolean addFact(CauseIdentifiedFact<T> fact, boolean doFire);
- //
- // /**
- // *
- // * @param fact
- // * @return true if fact removed
- // */
- // boolean removeFact(CauseIdentifiedFact<T> fact);
-
SingleFactSet<T> getOrCreateSingleFactSet(T subject, T predicate, T object);
void fireNoListenerAndEmpty(ISubFactSet<T> subFactSet);
+ /**
+ *
+ * @return subject of this sub fact set, null if none
+ */
T getSubject();
+ /**
+ *
+ * @return predicate of this sub fact set, null if none
+ */
T getPredicate();
+ /**
+ *
+ * @return object of this sub fact set, null if none
+ */
T getObject();
void fireAsserted(CauseIdentifiedFact<T> fact);
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/builtin/provider/BuiltinComputerForTests.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/builtin/provider/BuiltinComputerForTests.java 2010-12-25 04:05:44 UTC (rev 40)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/builtin/provider/BuiltinComputerForTests.java 2010-12-25 04:43:52 UTC (rev 41)
@@ -55,7 +55,7 @@
for (BuiltinValue<String> elt : parameter) {
if (!elt.isSingleValue()) {
throw new ReasonerException(
- "product parameter must be a singlr value");
+ "product parameter must be a single value");
}
final String strFactor = elt.getSingleValue();
result *= Double.parseDouble(strFactor);
@@ -72,7 +72,7 @@
for (BuiltinValue<String> elt : parameter) {
if (!elt.isSingleValue()) {
throw new ReasonerException(
- "sum parameter must be a singlr value");
+ "sum parameter must be a single value");
}
final String strFactor = elt.getSingleValue();
result += Double.parseDouble(strFactor);
Modified: trunk/reasoner4j/src/test/resources/log4j.properties
===================================================================
--- trunk/reasoner4j/src/test/resources/log4j.properties 2010-12-25 04:05:44 UTC (rev 40)
+++ trunk/reasoner4j/src/test/resources/log4j.properties 2010-12-25 04:43:52 UTC (rev 41)
@@ -19,7 +19,7 @@
log4j.logger.net.sf.joafip.meminspector=warn
log4j.logger.net.sf.joafip.java.util=warn
-log4j.logger.net.sf.reasoner4j.TestReteTable=debug
+#log4j.logger.net.sf.reasoner4j.TestReteTable=debug
#log4j.logger.net.sf.reasoner4j.TestExistential=debug
#log4j.logger.net.sf.reasoner4j.TestBasicInference=debug
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-25 04:05:50
|
Revision: 40
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=40&view=rev
Author: luc_peuvrier
Date: 2010-12-25 04:05:44 +0000 (Sat, 25 Dec 2010)
Log Message:
-----------
test failure correction
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-25 03:54:07 UTC (rev 39)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-25 04:05:44 UTC (rev 40)
@@ -169,8 +169,12 @@
object = iterator.next();
assert object != null : "object must be defined";
}
- knowledgeBase.removeFact(new CauseIdentifiedFact<T>(subject, predicate,
- object, ruleIdentifier), false);
+ final IFact<T> fact = new Fact<T>(subject, predicate, object);
+ if (factSetListener != null) {
+ factSetListener.retracted(fact);
+ }
+ knowledgeBase.removeFact(new CauseIdentifiedFact<T>(fact,
+ ruleIdentifier), false);
}
@SuppressWarnings("unchecked")
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-25 03:54:07 UTC (rev 39)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-25 04:05:44 UTC (rev 40)
@@ -67,6 +67,7 @@
private static final String REPLACE_FLAG = "r";
private Set<IFact<String>> expectedFactSet;
+ private String rscTestFileName;
@Override
protected void tearDown() throws Exception {
@@ -81,7 +82,7 @@
testListInputStream));
String line;
while ((line = reader.readLine()) != null) {
- final String rscTestFileName = line.trim();
+ rscTestFileName = line.trim();
final InputStream testFileInputStream = ClassLoader
.getSystemResourceAsStream("test_def/" + rscTestFileName);
test(testFileInputStream);
@@ -147,8 +148,8 @@
currentRule = null;
}
} else {
- throw new ReasonerException("\"" + line
- + "\" is bad identifier");
+ throw new ReasonerException(rscTestFileName + "test: \""
+ + line + "\" is bad identifier");
}
}
}
@@ -177,7 +178,6 @@
.getType())) {
((AssertedPremiseTable<String>) premiseTable)
.setFactSetListener(this);
- // premiseTable.addListener(this);
}
}
}
@@ -192,21 +192,21 @@
final Iterator<IFact<String>> iterator = kbFactSet.iterator();
while (iterator.hasNext()) {
final IFact<String> kbFact = iterator.next();
- assertTrue("unexpected fact " + kbFact + " in kb",
- expectedFactSet.contains(kbFact));
+ assertTrue(rscTestFileName + "test: unexpected fact " + kbFact
+ + " in kb", expectedFactSet.contains(kbFact));
}
for (IFact<String> expectedFact : expectedFactSet) {
- assertTrue("missing fact " + expectedFact + " in fact set",
- kbFactSet.contains(expectedFact));
- assertTrue("missing fact " + expectedFact + " in kb",
- kb.contains(expectedFact));
+ assertTrue(rscTestFileName + "test: missing fact " + expectedFact
+ + " in fact set", kbFactSet.contains(expectedFact));
+ assertTrue(rscTestFileName + "test: missing fact " + expectedFact
+ + " in kb", kb.contains(expectedFact));
}
}
private IFact<String> createFact(final String[] definition) {
if (definition.length != 4) {
- throw new ReasonerException("bad definition "
- + Arrays.toString(definition));
+ throw new ReasonerException(rscTestFileName
+ + "test: bad definition " + Arrays.toString(definition));
}
return new Fact<String>(definition[1], definition[2], definition[3]);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-25 03:54:14
|
Revision: 39
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=39&view=rev
Author: luc_peuvrier
Date: 2010-12-25 03:54:07 +0000 (Sat, 25 Dec 2010)
Log Message:
-----------
variable table classes no more needed after merge table modification for fact removal
Removed Paths:
-------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTableAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractVariableTable.java 2010-12-25 03:43:14 UTC (rev 38)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractVariableTable.java 2010-12-25 03:54:07 UTC (rev 39)
@@ -1,86 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public abstract class AbstractVariableTable<T> implements IVariableTable<T> {
-
- private final Set<ITableListener<T>> listenerSet = new HashSet<ITableListener<T>>();
-
- protected final VariableKeyValueMapping<T> mapping;
-
- public AbstractVariableTable(final VariableKeyValueMapping<T> mapping) {
- super();
- this.mapping = mapping;
- }
-
- @Override
- public void addListener(final ITableListener<T> listener) {
- listenerSet.add(listener);
- }
-
- @Override
- public void removeListener(final ITableListener<T> listener) {
- listenerSet.remove(listener);
- }
-
- @Override
- public boolean add(final List<T> variableValueSet) {
- final boolean added = addImpl(variableValueSet);
- if (added && !listenerSet.isEmpty()) {
- for (ITableListener<T> listener : listenerSet) {
- listener.added(variableValueSet);
- }
- }
- return added;
- }
-
- protected abstract boolean addImpl(final List<T> variableValueSet);
-
- @Override
- public boolean remove(final List<T> variableValueSet) {
- final boolean removed = removeImpl(variableValueSet);
- if (removed && !listenerSet.isEmpty()) {
- for (ITableListener<T> listener : listenerSet) {
- listener.removed(variableValueSet);
- }
- }
- return removed;
- }
-
- protected abstract boolean removeImpl(final List<T> variableValueSet);
-
- @Override
- public void removed(List<T> value) {
- }
-
-}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java 2010-12-25 03:43:14 UTC (rev 38)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java 2010-12-25 03:54:07 UTC (rev 39)
@@ -1,51 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import java.util.List;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public interface IVariableTable<T> extends ITable<T> {
-
- /**
- *
- * @param variableValueSet
- * FIXMELUC value
- * @return <tt>true</tt> if this set did not already contains the specified
- * element
- */
- boolean add(List<T> variableValueSet);
-
- /**
- *
- * @param variableValueSet
- * FIXMELUC value
- * @return <tt>true</tt> if this set contained the specified element
- */
- boolean remove(List<T> variableValueSet);
-}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-25 03:43:14 UTC (rev 38)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-25 03:54:07 UTC (rev 39)
@@ -1,159 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import java.util.Iterator;
-import java.util.List;
-
-import net.sf.reasoner4j.Fortest;
-import net.sf.reasoner4j.fact.IFact;
-import net.sf.reasoner4j.fact.IFactSet;
-import net.sf.reasoner4j.rule.IPremise;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseVariableTable<T> extends AbstractVariableTable<T> {
-
- protected final IFactSet<T> factSet;
-
- private final IPremise<T> premise;
-
- public PremiseVariableTable(final VariableKeyValueMapping<T> mapping,
- final IFactSet<T> factSet, final IPremise<T> premise) {
- super(mapping);
- this.factSet = factSet;
- this.premise = premise;
- }
-
- @Override
- protected boolean addImpl(final List<T> variableValueSet) {
- return true;
- }
-
- @Override
- protected boolean removeImpl(final List<T> variableValueSet) {
- return true;
- }
-
- private class SelectionIterator implements Iterator<List<T>> {
-
- private final Iterator<IFact<T>> iterator;
-
- public SelectionIterator(final IFactSet<T> view) {
- iterator = view.iterator();
- }
-
- @Override
- public boolean hasNext() {
- return iterator.hasNext();
- }
-
- @Override
- public List<T> next() {
- final IFact<T> fact = iterator.next();
- return premise.createVariableValueSet(fact);
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
-
- @Override
- public Iterator<List<T>> select(final List<T> value) {
- final Iterator<T> iterator = value.iterator();
- final T subject;
- if (premise.getSubjectVariableName() == null) {
- subject = premise.getSubject();
- } else {
- subject = iterator.next();
- }
- final T predicate;
- if (premise.getPredicateVariableName() == null) {
- predicate = premise.getPredicate();
- } else {
- predicate = iterator.next();
- }
- final T object;
- if (premise.getObjectVariableName() == null) {
- object = premise.getObject();
- } else {
- object = iterator.next();
- }
- final IFactSet<T> view = selectionView(subject, predicate, object);
- return new SelectionIterator(view);
- }
-
- protected IFactSet<T> selectionView(final T subject, final T predicate,
- final T object) {
- return factSet.view(subject, predicate, object);
- }
-
- // @Override
- // public Iterator<List<T>> removeSelect(final List<T> value) {
- // return select(value);
- // }
-
- private class FactIterator implements Iterator<List<T>> {
-
- private final Iterator<IFact<T>> iterator;
-
- public FactIterator() {
- super();
- iterator = factSet.iterator();
- }
-
- @Override
- public boolean hasNext() {
- return iterator.hasNext();
- }
-
- @Override
- public List<T> next() {
- final IFact<T> nextFact = iterator.next();
- return premise.createVariableValueSet(nextFact);
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
-
- @Override
- public Iterator<List<T>> iterator() {
- return new FactIterator();
- }
-
- @Fortest
- @Override
- public void accept(final ITableVisitor<T> visitor) {
- visitor.beginVisit(this);
- visitor.endVisit(this);
- }
-}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTableAndDefault.java 2010-12-25 03:43:14 UTC (rev 38)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTableAndDefault.java 2010-12-25 03:54:07 UTC (rev 39)
@@ -1,71 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import net.sf.reasoner4j.fact.CauseIdentifiedFact;
-import net.sf.reasoner4j.fact.IFactSet;
-import net.sf.reasoner4j.fact.SingleFactSet;
-import net.sf.reasoner4j.rule.AbstractPremiseAndDefault;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseVariableTableAndDefault<T> extends PremiseVariableTable<T> {
-
- private final T defaultSubject;
-
- private final T defaultPredicate;
-
- private final T defaultObject;
-
- public PremiseVariableTableAndDefault(
- final VariableKeyValueMapping<T> mapping,
- final IFactSet<T> factSet,
- final AbstractPremiseAndDefault<T> premise) {
- super(mapping, factSet, premise);
- defaultSubject = premise.getDefaultSubject();
- defaultPredicate = premise.getDefaultPredicate();
- defaultObject = premise.getDefaultObject();
- }
-
- @Override
- protected IFactSet<T> selectionView(final T subject, final T predicate,
- final T object) {
- IFactSet<T> view = factSet.view(subject, predicate, object);
- if (view.isEmpty()) {
- T dsubject = subject == null ? defaultSubject : subject;
- T dpredicate = predicate == null ? defaultPredicate : predicate;
- T dobject = object == null ? defaultObject : object;
- // FIXMELUC a local minimum implementation of fact set
- view = new SingleFactSet<T>(null, dsubject, dpredicate, dobject);
- view.addFact(new CauseIdentifiedFact<T>(dsubject, dpredicate,
- dobject, 0/*
- * 0 as dummy value , fact not in knowledge base
- */), false);
- }
- return view;
- }
-}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java 2010-12-25 03:43:14 UTC (rev 38)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java 2010-12-25 03:54:07 UTC (rev 39)
@@ -1,200 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import net.sf.reasoner4j.Fortest;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class VariableTable<T> extends AbstractVariableTable<T> {
-
- @SuppressWarnings("unchecked")
- private final Set<List<T>> emptySet = Collections.EMPTY_SET;
-
- protected final Map<List<T>, Set<List<T>>> table = new HashMap<List<T>, Set<List<T>>>();
-
- public VariableTable(final VariableKeyValueMapping<T> mapping) {
- super(mapping);
- }
-
- protected boolean addImpl(final List<T> variableValueSet) {
- final List<T> key = mapping.createKey(variableValueSet);
- final List<T> indexedValue = mapping
- .createIndexedValue(variableValueSet);
- Set<List<T>> indexedValueSetForKey = table.get(key);
- if (indexedValueSetForKey == null) {
- indexedValueSetForKey = new HashSet<List<T>>();
- table.put(key, indexedValueSetForKey);
- }
- return indexedValueSetForKey.add(indexedValue);
- }
-
- protected boolean removeImpl(final List<T> variableValueSet) {
- final List<T> key = mapping.createKey(variableValueSet);
- final List<T> indexedValue = mapping
- .createIndexedValue(variableValueSet);
- final Set<List<T>> indexedValueSetForKey = table.get(key);
- final boolean removed;
- if (indexedValueSetForKey == null) {
- removed = false;
- } else {
- removed = indexedValueSetForKey.remove(indexedValue);
- if (indexedValueSetForKey.isEmpty()) {
- table.remove(key);
- }
- }
- return removed;
- }
-
- class SelectionIterator implements Iterator<List<T>> {
-
- private final Iterator<List<T>> iterator;
-
- private final List<T> key;
-
- public SelectionIterator(final List<T> key,
- final Set<List<T>> valueListForKey) {
- super();
- this.key = key;
- iterator = valueListForKey.iterator();
- }
-
- @Override
- public boolean hasNext() {
- return iterator.hasNext();
- }
-
- @Override
- public List<T> next() {
- final List<T> indexedValues = iterator.next();
- return mapping.createValue(key, indexedValues);
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
-
- @Override
- public Iterator<List<T>> select(final List<T> value) {
- final List<T> key = mapping.createKey(value);
- Set<List<T>> valueListForKey = table.get(key);
- if (valueListForKey == null) {
- valueListForKey = emptySet;
- }
- return new SelectionIterator(key, valueListForKey);
- }
-
- // @Override
- // public Iterator<List<T>> removeSelect(final List<T> value) {
- // final List<T> key = mapping.createKey(value);
- // Set<List<T>> valueListForKey = table.remove(key);
- // if (valueListForKey == null) {
- // valueListForKey = emptySet;
- // }
- // return new SelectionIterator(key, valueListForKey);
- // }
-
- private class TableIterator implements Iterator<List<T>> {
-
- private List<T> next;
-
- private Iterator<Entry<List<T>, Set<List<T>>>> mapIterator;
-
- private Iterator<List<T>> keyIterator;
-
- private List<T> key;
-
- public TableIterator() {
- super();
- mapIterator = table.entrySet().iterator();
- computeNext();
- }
-
- @Override
- public boolean hasNext() {
- return next != null;
- }
-
- @Override
- public List<T> next() {
- final List<T> result = next;
- computeNext();
- return result;
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- private void computeNext() {
- if (keyIterator == null || !keyIterator.hasNext()) {
- while (mapIterator.hasNext()) {
- final Entry<List<T>, Set<List<T>>> entry = mapIterator
- .next();
- key = entry.getKey();
- keyIterator = entry.getValue().iterator();
- if (keyIterator.hasNext()) {
- next = mapping.createValue(key, keyIterator.next());
- return;
- }
- }
- next = null;
- } else {
- next = mapping.createValue(key, keyIterator.next());
- }
- }
- }
-
- @Override
- public Iterator<List<T>> iterator() {
- return new TableIterator();
- }
-
- @Fortest
- @Override
- public void accept(final ITableVisitor<T> visitor) {
- visitor.beginVisit(this);
- visitor.endVisit(this);
- }
-
- @Override
- public String toString() {
- return "VariableTable [table=" + table + "]";
- }
-}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-25 03:43:22
|
Revision: 38
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=38&view=rev
Author: luc_peuvrier
Date: 2010-12-25 03:43:14 +0000 (Sat, 25 Dec 2010)
Log Message:
-----------
merge table modification for fact removal
Modified Paths:
--------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/MergeTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/entity/MergeReteNode.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/service/MockTableFactory.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTable.java
trunk/reasoner4j/src/test/resources/log4j.properties
Added Paths:
-----------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
Removed Paths:
-------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableNotListening.java
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/IBuiltin.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -54,4 +54,5 @@
*/
IFact<T> compute(int ruleIdentifier, T subject, T predicate, T object);
+ void removed(int ruleIdentifier, T subject, T predicate, T object);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/AbstractBuiltin.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -83,7 +83,17 @@
return builtinSupport.getList(listTerm);
}
+ public void removeList(final int ruleIdentifier, final T listTerm) {
+ builtinSupport.removeList(ruleIdentifier, listTerm);
+ }
+
protected T createList(final int ruleIdentifier, final List<T> list) {
return builtinSupport.createList(ruleIdentifier, list);
}
+
+ @Override
+ public void removed(final int ruleIdentifier, final T subject,
+ final T predicate, final T object) {
+ // by default no implementation
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/BuiltinSupport.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -80,11 +80,11 @@
.getNextBlankNodeIdentifier());
}
- public boolean addFact(CauseIdentifiedFact<T> fact) {
+ public boolean addFact(final CauseIdentifiedFact<T> fact) {
return allFactSet.addFact(fact, false);
}
- public boolean removeFact(CauseIdentifiedFact<T> causeIdentifiedFact) {
+ public boolean removeFact(final CauseIdentifiedFact<T> causeIdentifiedFact) {
return allFactSet.removeFact(causeIdentifiedFact, false);
}
@@ -113,6 +113,12 @@
}
public T getObject(final T subject, final T predicate) {
+ final IFact<T> fact = getFactForSubjectPredicate(subject, predicate);
+ return fact.getObject();
+ }
+
+ private IFact<T> getFactForSubjectPredicate(final T subject,
+ final T predicate) {
final IFactSet<T> factSet = allFactSet
.view(subject, predicate, null/* object */);
final Iterator<IFact<T>> iterator = factSet.iterator();
@@ -125,7 +131,7 @@
throw new ReasonerException("too much oject for " + subject
+ " subject and " + predicate + " predicate");
}
- return fact.getObject();
+ return fact;
}
public List<T> getList(final T listTerm) {
@@ -139,6 +145,18 @@
return list;
}
+ public void removeList(final int ruleIdentifier, final T listTerm) {
+ T current = listTerm;
+ while (!nil.equals(current)) {
+ IFact<T> fact = getFactForSubjectPredicate(current,
+ listFirstPredicate);
+ removeFact(new CauseIdentifiedFact<T>(fact, ruleIdentifier));
+ fact = getFactForSubjectPredicate(current, listRestPredicate);
+ removeFact(new CauseIdentifiedFact<T>(fact, ruleIdentifier));
+ current = fact.getObject();
+ }
+ }
+
public T createList(final int ruleIdentifier, final List<T> list) {
final T listTerm = newBlankNode();
T current = listTerm;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/builtin/impl/list/ListAppendBuiltin.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -68,4 +68,10 @@
}
return resultFact;
}
+
+ @Override
+ public void removed(final int ruleIdentifier, final T subject,
+ final T predicate, final T object) {
+ removeList(ruleIdentifier, object);
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -29,6 +29,8 @@
import java.util.List;
import java.util.Map;
+import org.apache.log4j.Logger;
+
import net.sf.reasoner4j.ReasonerException;
import net.sf.reasoner4j.builtin.IBuiltin;
import net.sf.reasoner4j.builtin.impl.BuiltinSupport;
@@ -52,6 +54,8 @@
*/
public class Motor<T> implements IConclusionListener<T>, IMotor<T> {
+ private final static Logger LOGGER = Logger.getLogger(Motor.class);
+
private final AllKnowledgeBase<T> allKnowledgeBase;
private final ReteBuilder<T> reteBuilder = new ReteBuilder<T>(this);
@@ -133,6 +137,9 @@
@Override
public void assertFact(final IFact<T> fact) {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("assert " + fact);
+ }
allKnowledgeBase.assertFactInFactSet(new CauseIdentifiedFact<T>(fact,
ReteRule.ADDED_FACT_RULE_IDENTIFIER));
updateKnowledgeBaseWithConclusion();
@@ -140,6 +147,9 @@
@Override
public void retractFact(final IFact<T> fact) {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("retract " + fact);
+ }
allKnowledgeBase.retractFactInFactSet(new CauseIdentifiedFact<T>(fact,
ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
updateKnowledgeBaseWithConclusion();
@@ -150,9 +160,15 @@
CauseIdentifiedFact<T> retracted = retractedStack.poll();
do {
if (retracted != null) {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("conclusion retraction " + retracted);
+ }
allKnowledgeBase.retractFactInFactSet(retracted);
retracted = retractedStack.poll();
} else if (asserted != null) {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("conclusion assertion " + asserted);
+ }
allKnowledgeBase.assertFactInFactSet(asserted);
asserted = assertedStack.poll();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractPremiseTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -35,9 +35,8 @@
protected final IPremise<T> premise;
- public AbstractPremiseTable(final IPremise<T> premise,
- final IVariableTable<T> variableTable) {
- super(variableTable);
+ public AbstractPremiseTable(final IPremise<T> premise) {
+ super();
this.premise = premise;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -22,8 +22,9 @@
*/
package net.sf.reasoner4j.rete.entity;
-import java.util.Iterator;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
/**
*
@@ -33,30 +34,31 @@
*/
public abstract class AbstractTable<T> implements ITable<T> {
- protected final IVariableTable<T> variableTable;
+ private final Set<ITableListener<T>> listenerSet = new HashSet<ITableListener<T>>();
- public AbstractTable(final IVariableTable<T> variableTable) {
- super();
- this.variableTable = variableTable;
- }
-
@Override
public void addListener(final ITableListener<T> listener) {
- variableTable.addListener(listener);
+ listenerSet.add(listener);
}
@Override
public void removeListener(final ITableListener<T> listener) {
- variableTable.removeListener(listener);
+ listenerSet.remove(listener);
}
- @Override
- public Iterator<List<T>> select(final List<T> value) {
- return variableTable.select(value);
+ protected void fireAdded(final List<T> value) {
+ if (!listenerSet.isEmpty()) {
+ for (ITableListener<T> listener : listenerSet) {
+ listener.added(value);
+ }
+ }
}
- @Override
- public Iterator<List<T>> removeSelect(final List<T> value) {
- return variableTable.select(value);
+ protected void fireRemoved(final List<T> value) {
+ if (!listenerSet.isEmpty()) {
+ for (ITableListener<T> listener : listenerSet) {
+ listener.removed(value);
+ }
+ }
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractVariableTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractVariableTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -55,13 +55,13 @@
@Override
public boolean add(final List<T> variableValueSet) {
- final boolean add = addImpl(variableValueSet);
- if (add && !listenerSet.isEmpty()) {
+ final boolean added = addImpl(variableValueSet);
+ if (added && !listenerSet.isEmpty()) {
for (ITableListener<T> listener : listenerSet) {
listener.added(variableValueSet);
}
}
- return add;
+ return added;
}
protected abstract boolean addImpl(final List<T> variableValueSet);
@@ -79,4 +79,8 @@
protected abstract boolean removeImpl(final List<T> variableValueSet);
+ @Override
+ public void removed(List<T> value) {
+ }
+
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -22,6 +22,7 @@
*/
package net.sf.reasoner4j.rete.entity;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -32,7 +33,6 @@
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSetListener;
import net.sf.reasoner4j.kb.AllKnowledgeBase;
-import net.sf.reasoner4j.kb.IKnowledgeBase;
import net.sf.reasoner4j.motor.IBlankNodeProvider;
import net.sf.reasoner4j.rule.IPremise;
@@ -42,7 +42,7 @@
*
* @param <T>
*/
-public class AssertedPremiseTable<T> extends AbstractPremiseTable<T> {
+public class AssertedPremiseTable<T> implements IPremiseTable<T> {
private final int ruleIdentifier;
@@ -50,6 +50,8 @@
private final IBlankNodeProvider<T> blankNodeProvider;
+ private final IPremise<T> premise;
+
@Fortest
private IFactSetListener<T> factSetListener;
@@ -58,8 +60,9 @@
final VariableKeyValueMapping<T> mapping,
final AllKnowledgeBase<T> knowledgeBase,
final IBlankNodeProvider<T> blankNodeProvider) {
- super(premise, new VariableTable<T>(mapping));
+ super();
this.ruleIdentifier = ruleIdentifier;
+ this.premise = premise;
this.knowledgeBase = knowledgeBase;
this.blankNodeProvider = blankNodeProvider;
}
@@ -80,6 +83,11 @@
}
@Override
+ public IPremise<T> getPremise() {
+ return premise;
+ }
+
+ @Override
public void dispose() {
// nothing to do
}
@@ -127,7 +135,6 @@
factSetListener.asserted(fact);
}
final List<T> variableValueSet = premise.createVariableValueSet(fact);
- variableTable.add(variableValueSet);
return new SingleElementIterator<List<T>>(variableValueSet);
}
@@ -139,47 +146,37 @@
}
@Override
- public Iterator<List<T>> removeSelect(final List<T> value) {
+ public void removed(final List<T> value) {
final Iterator<T> iterator = value.iterator();
final T subject;
if (premise.getSubjectVariableName() == null) {
subject = premise.getSubject();
} else {
subject = iterator.next();
+ assert subject != null : "subject must be defined";
}
final T predicate;
if (premise.getPredicateVariableName() == null) {
predicate = premise.getPredicate();
} else {
predicate = iterator.next();
+ assert predicate != null : "predicate must be defined";
}
final T object;
if (premise.getObjectVariableName() == null) {
object = premise.getObject();
} else {
object = iterator.next();
+ assert object != null : "object must be defined";
}
- final IKnowledgeBase<T> view = knowledgeBase.view(subject, predicate,
- object);
- if (view == null) {
- throw new ReasonerException("no view for "
- + (new Fact<T>(subject, predicate, object)).toString());
- }
- final Iterator<IFact<T>> viewIterator = view.iterator();
- while (viewIterator.hasNext()) {
- final IFact<T> fact = viewIterator.next();
- knowledgeBase.removeFact(new CauseIdentifiedFact<T>(fact,
- ruleIdentifier), false);
- if (factSetListener != null) {
- factSetListener.retracted(fact);
- }
- }
- return variableTable.removeSelect(value);
+ knowledgeBase.removeFact(new CauseIdentifiedFact<T>(subject, predicate,
+ object, ruleIdentifier), false);
}
+ @SuppressWarnings("unchecked")
@Override
public Iterator<List<T>> iterator() {
- return variableTable.iterator();
+ return Collections.EMPTY_LIST.iterator();
}
@Fortest
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -23,6 +23,7 @@
package net.sf.reasoner4j.rete.entity;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -46,7 +47,7 @@
public BuiltinPremiseTable(final IPremise<T> premise,
final int ruleIdentifier, final IBuiltin<T> buitin,
final VariableKeyValueMapping<T> mapping) {
- super(premise, new VariableTable<T>(mapping));
+ super(premise);
this.ruleIdentifier = ruleIdentifier;
this.buitin = buitin;
}
@@ -103,19 +104,45 @@
if (buitlinFact.getObject() == null) {
resultValue.add(resultFact.getObject());
}
- variableTable.add(resultValue);
}
return new SingleElementIterator<List<T>>(resultValue);
}
@Override
- public Iterator<List<T>> removeSelect(final List<T> value) {
- return variableTable.removeSelect(value);
+ public void removed(final List<T> value) {
+ final IFact<T> buitlinFact = buitin.getBuiltinFact();
+ final Iterator<T> iterator = value.iterator();
+ /*
+ * compute (subject,predicate,object) parameter
+ */
+ T subject;
+ if (buitlinFact.getSubject() == null) {
+ subject = iterator.next();
+ assert subject != null;
+ } else {
+ subject = buitlinFact.getSubject();
+ }
+ T predicate;
+ if (buitlinFact.getPredicate() == null) {
+ predicate = iterator.next();
+ assert predicate != null;
+ } else {
+ predicate = buitlinFact.getPredicate();
+ }
+ T object;
+ if (buitlinFact.getObject() == null) {
+ object = iterator.next();
+ assert object != null;
+ } else {
+ object = buitlinFact.getObject();
+ }
+ buitin.removed(ruleIdentifier, subject, predicate, object);
}
+ @SuppressWarnings("unchecked")
@Override
public Iterator<List<T>> iterator() {
- return variableTable.iterator();
+ return Collections.EMPTY_LIST.iterator();
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -44,12 +44,7 @@
*/
Iterator<List<T>> select(List<T> value);
- /**
- *
- * @param value
- * @return record selection for key take from value parameter
- */
- Iterator<List<T>> removeSelect(List<T> value);
+ void removed(List<T> value);
Iterator<List<T>> iterator();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableListener.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -32,7 +32,7 @@
*/
public interface ITableListener<T> {
- void added(final List<T> variableValueSet);
+ void added(final List<T> value);
- void removed(final List<T> variableValueSet);
+ void removed(final List<T> value);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -35,7 +35,7 @@
/**
*
* @param variableValueSet
- * FIXMELUC record
+ * FIXMELUC value
* @return <tt>true</tt> if this set did not already contains the specified
* element
*/
@@ -44,7 +44,7 @@
/**
*
* @param variableValueSet
- * FIXMELUC record
+ * FIXMELUC value
* @return <tt>true</tt> if this set contained the specified element
*/
boolean remove(List<T> variableValueSet);
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -22,10 +22,17 @@
*/
package net.sf.reasoner4j.rete.entity;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
import net.sf.reasoner4j.Fortest;
+import net.sf.reasoner4j.ReasonerException;
/**
*
@@ -35,6 +42,8 @@
*/
public class MergeTable<T> extends AbstractTable<T> {
+ protected final VariableKeyValueMapping<T> mapping;
+
private final ITable<T> leftTable;
private final ITableListener<T> leftListener;
@@ -43,8 +52,17 @@
private final ITableListener<T> rightListener;
+ @SuppressWarnings("unchecked")
+ private final Set<List<T>> emptySet = Collections.EMPTY_SET;
+
+ private final Map<List<T>, Set<List<T>>> table = new HashMap<List<T>, Set<List<T>>>();
+
+ private final Map<List<T>, Set<List<T>>> leftIndexedTable = new HashMap<List<T>, Set<List<T>>>();
+
+ private final Map<List<T>, Set<List<T>>> rightIndexedTable = new HashMap<List<T>, Set<List<T>>>();
+
/**
- *
+ * @param mapping
* @param leftTable
* left source table
* @param leftTableMapping
@@ -53,42 +71,41 @@
* right source table
* @param rightTableMapping
* right table to this table mapping
- * @param variableTable
- * associated variable table
*/
- public MergeTable(final ITable<T> leftTable,
+ public MergeTable(final VariableKeyValueMapping<T> mapping,
+ final ITable<T> leftTable,
final TableSourceDestinationMapping<T> leftTableMapping,
final ITable<T> rightTable,
- final TableSourceDestinationMapping<T> rightTableMapping,
- final IVariableTable<T> variableTable) {
- super(variableTable);
+ final TableSourceDestinationMapping<T> rightTableMapping) {
+ super();
+ this.mapping = mapping;
this.leftTable = leftTable;
this.rightTable = rightTable;
leftListener = new ITableListener<T>() {
@Override
- public void added(final List<T> variableValueSet) {
- addMerge(rightTable, variableValueSet/* left value */
- , rightTableMapping, leftTableMapping);
+ public void added(final List<T> leftValue) {
+ addMerge(rightTable, leftValue, rightTableMapping,
+ leftTableMapping, rightIndexedTable, leftIndexedTable);
}
@Override
- public void removed(final List<T> variableValueSet) {
- removeMerge(rightTable, variableValueSet/* left value */
- , rightTableMapping, leftTableMapping);
+ public void removed(final List<T> leftValue) {
+ removeMerge(rightTable, leftValue, rightTableMapping,
+ /* leftTableMapping, */rightIndexedTable, leftIndexedTable);
}
};
leftTable.addListener(leftListener);
rightListener = new ITableListener<T>() {
@Override
- public void added(final List<T> variableValueSet) {
- addMerge(leftTable, variableValueSet/* right value */,
- leftTableMapping, rightTableMapping);
+ public void added(final List<T> rightValue) {
+ addMerge(leftTable, rightValue, leftTableMapping,
+ rightTableMapping, leftIndexedTable, rightIndexedTable);
}
@Override
- public void removed(final List<T> variableValueSet/* right value */) {
- removeMerge(leftTable, variableValueSet, leftTableMapping,
- rightTableMapping);
+ public void removed(final List<T> rightValue) {
+ removeMerge(leftTable, rightValue, leftTableMapping,
+ /* rightTableMapping, */leftIndexedTable, rightIndexedTable);
}
};
rightTable.addListener(rightListener);
@@ -104,17 +121,12 @@
return rightTable;
}
- // FIXMELUC not needed
- // @Override
- // public void dispose() {
- // rightTable.removeListener(rightListener);
- // leftTable.removeListener(leftListener);
- // }
-
private void addMerge(final ITable<T> firstSourceTable,
final List<T> secondSourceValue,
final TableSourceDestinationMapping<T> firstSourceTableMapping,
- final TableSourceDestinationMapping<T> secondSourceTableMapping) {
+ final TableSourceDestinationMapping<T> secondSourceTableMapping,
+ final Map<List<T>, Set<List<T>>> firstSourceIndexedTable,
+ final Map<List<T>, Set<List<T>>> secondSourceIndexedTable) {
final List<T> thisTableValue = secondSourceTableMapping
.fromSourceToDest(secondSourceValue);
final List<T> firstSourcevalue = firstSourceTableMapping
@@ -122,32 +134,181 @@
final Iterator<List<T>> iterator = firstSourceTable
.select(firstSourcevalue);
while (iterator.hasNext()) {
- final List<T> addedInTable = iterator.next();
- variableTable.add(firstSourceTableMapping.fromSourceToDest(
- addedInTable, thisTableValue));
+ final List<T> firstSourceValue = iterator.next();
+ final List<T> thisValueToAdd = firstSourceTableMapping
+ .fromSourceToDest(firstSourceValue, thisTableValue);
+ if (add(thisValueToAdd)) {
+ add(firstSourceIndexedTable, firstSourceValue, thisValueToAdd);
+ add(secondSourceIndexedTable, secondSourceValue, thisValueToAdd);
+ fireAdded(thisValueToAdd);
+ }
}
}
private void removeMerge(final ITable<T> firstSourceTable,
final List<T> secondSourceValue,
final TableSourceDestinationMapping<T> firstSourceTableMapping,
- final TableSourceDestinationMapping<T> secondSourceTableMapping) {
- final List<T> thisTableValue = secondSourceTableMapping
- .fromSourceToDest(secondSourceValue);
- final List<T> firstSourcevalue = firstSourceTableMapping
- .fromDestToSource(thisTableValue);
- final Iterator<List<T>> iterator = firstSourceTable
- .removeSelect(firstSourcevalue);
- while (iterator.hasNext()) {
- final List<T> removedFromTable = iterator.next();
- variableTable.remove(firstSourceTableMapping.fromSourceToDest(
- removedFromTable, thisTableValue));
+ /* final TableSourceDestinationMapping<T> secondSourceTableMapping, */
+ final Map<List<T>, Set<List<T>>> firstSourceIndexedTable,
+ final Map<List<T>, Set<List<T>>> secondSourceIndexedTable) {
+ final Set<List<T>> toRemoveSet = secondSourceIndexedTable
+ .remove(secondSourceValue);
+ for (List<T> thisValueToRemove : toRemoveSet) {
+ if (!remove(thisValueToRemove)) {
+ throw new ReasonerException("must remove "
+ + thisValueToRemove.toString());
+ }
+ final List<T> firstSourceValue = firstSourceTableMapping
+ .fromDestToSource(thisValueToRemove);
+ firstSourceTable.removed(firstSourceValue);
+ remove(firstSourceIndexedTable, firstSourceValue, thisValueToRemove);
+ fireRemoved(thisValueToRemove);
}
}
+ private boolean add(final List<T> value) {
+ final List<T> key = mapping.createKey(value);
+ final List<T> indexedValue = mapping.createIndexedValue(value);
+ Set<List<T>> indexedValueSetForKey = table.get(key);
+ if (indexedValueSetForKey == null) {
+ indexedValueSetForKey = new HashSet<List<T>>();
+ table.put(key, indexedValueSetForKey);
+ }
+ return indexedValueSetForKey.add(indexedValue);
+ }
+
+ private void add(final Map<List<T>, Set<List<T>>> table, final List<T> key,
+ List<T> value) {
+ Set<List<T>> valueSetForKey = table.get(key);
+ if (valueSetForKey == null) {
+ valueSetForKey = new HashSet<List<T>>();
+ table.put(key, valueSetForKey);
+ }
+ valueSetForKey.add(value);
+ }
+
+ private boolean remove(final List<T> value) {
+ final List<T> key = mapping.createKey(value);
+ final List<T> indexedValue = mapping.createIndexedValue(value);
+ final Set<List<T>> indexedValueSetForKey = table.get(key);
+ final boolean removed;
+ if (indexedValueSetForKey == null) {
+ removed = false;
+ } else {
+ removed = indexedValueSetForKey.remove(indexedValue);
+ if (indexedValueSetForKey.isEmpty()) {
+ table.remove(key);
+ }
+ }
+ return removed;
+ }
+
+ private void remove(final Map<List<T>, Set<List<T>>> table,
+ final List<T> key, final List<T> value) {
+ final Set<List<T>> indexedValueSetForKey = table.get(key);
+ if (indexedValueSetForKey != null) {
+ indexedValueSetForKey.remove(value);
+ if (indexedValueSetForKey.isEmpty()) {
+ table.remove(key);
+ }
+ }
+ }
+
+ class SelectionIterator implements Iterator<List<T>> {
+
+ private final Iterator<List<T>> iterator;
+
+ private final List<T> key;
+
+ public SelectionIterator(final List<T> key,
+ final Set<List<T>> valueListForKey) {
+ super();
+ this.key = key;
+ iterator = valueListForKey.iterator();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ @Override
+ public List<T> next() {
+ final List<T> indexedValues = iterator.next();
+ return mapping.createValue(key, indexedValues);
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
@Override
+ public Iterator<List<T>> select(final List<T> value) {
+ final List<T> key = mapping.createKey(value);
+ Set<List<T>> valueListForKey = table.get(key);
+ if (valueListForKey == null) {
+ valueListForKey = emptySet;
+ }
+ return new SelectionIterator(key, valueListForKey);
+ }
+
+ private class TableIterator implements Iterator<List<T>> {
+
+ private List<T> next;
+
+ private Iterator<Entry<List<T>, Set<List<T>>>> mapIterator;
+
+ private Iterator<List<T>> keyIterator;
+
+ private List<T> key;
+
+ public TableIterator() {
+ super();
+ mapIterator = table.entrySet().iterator();
+ computeNext();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return next != null;
+ }
+
+ @Override
+ public List<T> next() {
+ final List<T> result = next;
+ computeNext();
+ return result;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ private void computeNext() {
+ if (keyIterator == null || !keyIterator.hasNext()) {
+ while (mapIterator.hasNext()) {
+ final Entry<List<T>, Set<List<T>>> entry = mapIterator
+ .next();
+ key = entry.getKey();
+ keyIterator = entry.getValue().iterator();
+ if (keyIterator.hasNext()) {
+ next = mapping.createValue(key, keyIterator.next());
+ return;
+ }
+ }
+ next = null;
+ } else {
+ next = mapping.createValue(key, keyIterator.next());
+ }
+ }
+ }
+
+ @Override
public Iterator<List<T>> iterator() {
- return variableTable.iterator();
+ return new TableIterator();
}
@Fortest
@@ -158,4 +319,9 @@
rightTable.accept(visitor);
visitor.endVisit(this);
}
+
+ @Override
+ public void removed(final List<T> value) {
+ // no implementation
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -41,35 +41,126 @@
public class PremiseTable<T> extends AbstractPremiseTable<T> implements
IFactSetListener<T> {
- private final IFactSet<T> facSet;
+ protected final IFactSet<T> factSet;
- public PremiseTable(final IPremise<T> premise,
- final IVariableTable<T> variableTable, final IFactSet<T> factSet) {
- super(premise, variableTable);
- this.facSet = factSet;
+ private final boolean listening;
+
+ public PremiseTable(final IPremise<T> premise, final IFactSet<T> factSet,
+ final boolean listening) {
+ super(premise);
+ this.factSet = factSet;
+ this.listening = listening;
factSet.addListener(this);
}
@Override
public void dispose() {
- facSet.removeListener(this);
+ factSet.removeListener(this);
}
@Override
public void asserted(final IFact<T> fact) {
- final List<T> variableValueSet = premise.createVariableValueSet(fact);
- variableTable.add(variableValueSet);
+ if (listening) {
+ final List<T> value = premise.createVariableValueSet(fact);
+ fireAdded(value);
+ }
}
@Override
public void retracted(final IFact<T> fact) {
- final List<T> variableValueSet = premise.createVariableValueSet(fact);
- variableTable.remove(variableValueSet);
+ final List<T> value = premise.createVariableValueSet(fact);
+ fireRemoved(value);
}
+ private class SelectionIterator implements Iterator<List<T>> {
+
+ private final Iterator<IFact<T>> iterator;
+
+ public SelectionIterator(final IFactSet<T> view) {
+ iterator = view.iterator();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ @Override
+ public List<T> next() {
+ final IFact<T> fact = iterator.next();
+ return premise.createVariableValueSet(fact);
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
@Override
+ public Iterator<List<T>> select(final List<T> value) {
+ final Iterator<T> iterator = value.iterator();
+ final T subject;
+ if (premise.getSubjectVariableName() == null) {
+ subject = premise.getSubject();
+ } else {
+ subject = iterator.next();
+ }
+ final T predicate;
+ if (premise.getPredicateVariableName() == null) {
+ predicate = premise.getPredicate();
+ } else {
+ predicate = iterator.next();
+ }
+ final T object;
+ if (premise.getObjectVariableName() == null) {
+ object = premise.getObject();
+ } else {
+ object = iterator.next();
+ }
+ final IFactSet<T> view = selectionView(subject, predicate, object);
+ return new SelectionIterator(view);
+ }
+
+ protected IFactSet<T> selectionView(final T subject, final T predicate,
+ final T object) {
+ return factSet.view(subject, predicate, object);
+ }
+
+ @Override
+ public void removed(final List<T> value) {
+ // nothing to do
+ }
+
+ private class FactIterator implements Iterator<List<T>> {
+
+ private final Iterator<IFact<T>> iterator;
+
+ public FactIterator() {
+ super();
+ iterator = factSet.iterator();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ @Override
+ public List<T> next() {
+ final IFact<T> nextFact = iterator.next();
+ return premise.createVariableValueSet(nextFact);
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ @Override
public Iterator<List<T>> iterator() {
- return variableTable.iterator();
+ return new FactIterator();
}
@Fortest
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableAndDefault.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rete.entity;
+
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.IFactSet;
+import net.sf.reasoner4j.fact.SingleFactSet;
+import net.sf.reasoner4j.rule.AbstractPremiseAndDefault;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class PremiseTableAndDefault<T> extends PremiseTable<T> {
+
+ private final T defaultSubject;
+
+ private final T defaultPredicate;
+
+ private final T defaultObject;
+
+ public PremiseTableAndDefault(final AbstractPremiseAndDefault<T> premise,
+ final IFactSet<T> factSet, final boolean listening) {
+ super(premise, factSet, listening);
+ defaultSubject = premise.getDefaultSubject();
+ defaultPredicate = premise.getDefaultPredicate();
+ defaultObject = premise.getDefaultObject();
+ }
+
+ @Override
+ protected IFactSet<T> selectionView(final T subject, final T predicate,
+ final T object) {
+ IFactSet<T> view = factSet.view(subject, predicate, object);
+ if (view.isEmpty()) {
+ final T dsubject = subject == null ? defaultSubject : subject;
+ final T dpredicate = predicate == null ? defaultPredicate
+ : predicate;
+ final T dobject = object == null ? defaultObject : object;
+ // FIXMELUC a local minimum implementation of fact set
+ view = new SingleFactSet<T>(null, dsubject, dpredicate, dobject);
+ view.addFact(new CauseIdentifiedFact<T>(dsubject, dpredicate,
+ dobject, 0/*
+ * 0 as dummy value , fact not in knowledge base
+ */), false);
+ }
+ return view;
+ }
+}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableNotListening.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTableNotListening.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -1,46 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import net.sf.reasoner4j.fact.IFact;
-import net.sf.reasoner4j.fact.IFactSet;
-import net.sf.reasoner4j.rule.IPremise;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class PremiseTableNotListening<T> extends PremiseTable<T> {
-
- public PremiseTableNotListening(final IPremise<T> premise,
- final IVariableTable<T> variableTable, final IFactSet<T> factSet) {
- super(premise, variableTable, factSet);
- }
-
- @Override
- public void asserted(IFact<T> fact) {
- // ignore notification
- }
-}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -114,10 +114,10 @@
return factSet.view(subject, predicate, object);
}
- @Override
- public Iterator<List<T>> removeSelect(final List<T> value) {
- return select(value);
- }
+ // @Override
+ // public Iterator<List<T>> removeSelect(final List<T> value) {
+ // return select(value);
+ // }
private class FactIterator implements Iterator<List<T>> {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -119,15 +119,15 @@
return new SelectionIterator(key, valueListForKey);
}
- @Override
- public Iterator<List<T>> removeSelect(final List<T> value) {
- final List<T> key = mapping.createKey(value);
- Set<List<T>> valueListForKey = table.remove(key);
- if (valueListForKey == null) {
- valueListForKey = emptySet;
- }
- return new SelectionIterator(key, valueListForKey);
- }
+ // @Override
+ // public Iterator<List<T>> removeSelect(final List<T> value) {
+ // final List<T> key = mapping.createKey(value);
+ // Set<List<T>> valueListForKey = table.remove(key);
+ // if (valueListForKey == null) {
+ // valueListForKey = emptySet;
+ // }
+ // return new SelectionIterator(key, valueListForKey);
+ // }
private class TableIterator implements Iterator<List<T>> {
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/MergeTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/MergeTableFactory.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/MergeTableFactory.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -23,11 +23,9 @@
package net.sf.reasoner4j.rete.service;
import net.sf.reasoner4j.rete.entity.ITable;
-import net.sf.reasoner4j.rete.entity.IVariableTable;
import net.sf.reasoner4j.rete.entity.MergeTable;
import net.sf.reasoner4j.rete.entity.TableSourceDestinationMapping;
import net.sf.reasoner4j.rete.entity.VariableKeyValueMapping;
-import net.sf.reasoner4j.rete.entity.VariableTable;
/**
*
@@ -39,14 +37,10 @@
public MergeTable<T> create(final ITable<T> leftTable,
final TableSourceDestinationMapping<T> leftTableMapping,
- final VariableKeyValueMapping<T> leftTableKVMapping,
final ITable<T> rightTable,
final TableSourceDestinationMapping<T> rightTableMapping,
- final VariableKeyValueMapping<T> rightTableKVMapping,
final VariableKeyValueMapping<T> mergeTableMapping) {
- final IVariableTable<T> variableTable = new VariableTable<T>(
- mergeTableMapping);
- return new MergeTable<T>(leftTable, leftTableMapping, rightTable,
- rightTableMapping, variableTable);
+ return new MergeTable<T>(mergeTableMapping, leftTable,
+ leftTableMapping, rightTable, rightTableMapping);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -22,16 +22,10 @@
*/
package net.sf.reasoner4j.rete.service;
-import java.util.ArrayList;
-import java.util.List;
-
import net.sf.reasoner4j.fact.IFactSet;
-import net.sf.reasoner4j.rete.entity.IVariableTable;
import net.sf.reasoner4j.rete.entity.PremiseTable;
-import net.sf.reasoner4j.rete.entity.PremiseTableNotListening;
-import net.sf.reasoner4j.rete.entity.PremiseVariableTable;
+import net.sf.reasoner4j.rete.entity.PremiseTableAndDefault;
import net.sf.reasoner4j.rete.entity.VariableKeyValueMapping;
-import net.sf.reasoner4j.rete.entity.PremiseVariableTableAndDefault;
import net.sf.reasoner4j.rule.AbstractPremiseAndDefault;
import net.sf.reasoner4j.rule.EnumPremiseType;
import net.sf.reasoner4j.rule.IPremise;
@@ -55,31 +49,15 @@
final VariableKeyValueMapping<T> mapping, final IFactSet<T> factSet) {
final IFactSet<T> view = factSet.view(premise.getSubject(),
premise.getPredicate(), premise.getObject());
- final IVariableTable<T> variableTable;
+ final PremiseTable<T> premiseTable;
if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
- List<T> defaultValue = new ArrayList<T>(3);
- final AbstractPremiseAndDefault<T> premiseAndDefault = (AbstractPremiseAndDefault<T>) premise;
- if (premiseAndDefault.getSubjectVariableName() != null) {
- defaultValue.add(premiseAndDefault.getDefaultSubject());
- }
- if (premiseAndDefault.getPredicateVariableName() != null) {
- defaultValue.add(premiseAndDefault.getDefaultPredicate());
- }
- if (premiseAndDefault.getObjectVariableName() != null) {
- defaultValue.add(premiseAndDefault.getDefaultObject());
- }
- variableTable = new PremiseVariableTableAndDefault<T>(mapping,
- view, premiseAndDefault);
+ premiseTable = new PremiseTableAndDefault<T>(
+ (AbstractPremiseAndDefault<T>) premise, view,
+ premise.isListening());
} else {
- variableTable = new PremiseVariableTable<T>(mapping, view, premise);
+ premiseTable = new PremiseTable<T>(premise, view,
+ premise.isListening());
}
- final PremiseTable<T> premiseTable;
- if (premise.isListening()) {
- premiseTable = new PremiseTable<T>(premise, variableTable, view);
- } else {
- premiseTable = new PremiseTableNotListening<T>(premise,
- variableTable, view);
- }
return premiseTable;
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/entity/MergeReteNode.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/entity/MergeReteNode.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/entity/MergeReteNode.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -26,7 +26,6 @@
import java.util.List;
import net.sf.reasoner4j.rete.entity.TableSourceDestinationMapping;
-import net.sf.reasoner4j.rete.entity.VariableKeyValueMapping;
/**
*
@@ -40,10 +39,6 @@
private final IReteNode<T> rightNode;
- private final VariableKeyValueMapping<T> leftKVMapping;
-
- private final VariableKeyValueMapping<T> rightKVMapping;
-
private final TableSourceDestinationMapping<T> leftTableMapping;
private final TableSourceDestinationMapping<T> rightTableMapping;
@@ -73,8 +68,6 @@
}
index++;
}
- leftKVMapping = new VariableKeyValueMapping<T>(recordDef);
-
recordDef = new boolean[rightTableColumnName.size()];
index = 0;
for (String name : rightTableColumnName) {
@@ -83,8 +76,6 @@
}
index++;
}
- rightKVMapping = new VariableKeyValueMapping<T>(recordDef);
-
final int destLength = tableColumnName.size();
final int[] commonIndex = new int[leftTableColumnName.size()];
@@ -104,9 +95,6 @@
}
rightTableMapping = new TableSourceDestinationMapping<T>(
rightTableColumnName.size(), destLength, sourceIndex, destIndex);
-
- leftNode.setMapping(leftKVMapping);
- rightNode.setMapping(rightKVMapping);
}
public IReteNode<T> getLeftNode() {
@@ -117,14 +105,6 @@
return rightNode;
}
- public VariableKeyValueMapping<T> getLeftTableKVMapping() {
- return leftKVMapping;
- }
-
- public VariableKeyValueMapping<T> getRightTableKVMapping() {
- return rightKVMapping;
- }
-
public TableSourceDestinationMapping<T> getLeftTableMapping() {
return leftTableMapping;
}
@@ -143,9 +123,8 @@
@Override
public String toString() {
return "MergeReteNode [leftNode=" + leftNode + ", rightNode="
- + rightNode + ", leftKVMapping=" + leftKVMapping
- + ", rightKVMapping=" + rightKVMapping + ", leftTableMapping="
- + leftTableMapping + ", rightTableMapping=" + rightTableMapping
- + ", toString()=" + super.toString() + "]";
+ + rightNode + ", leftTableMapping=" + leftTableMapping
+ + ", rightTableMapping=" + rightTableMapping + ", toString()="
+ + super.toString() + "]";
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -165,19 +165,14 @@
public void endVisit(final MergeReteNode<T> mergeReteNode) {
final ITable<T> rightTable = stack.pop();
final ITable<T> leftTable = stack.pop();
- final VariableKeyValueMapping<T> leftTableKVMapping = mergeReteNode
- .getLeftTableKVMapping();
final TableSourceDestinationMapping<T> leftTableMapping = mergeReteNode
.getLeftTableMapping();
- final VariableKeyValueMapping<T> rightTableKVMapping = mergeReteNode
- .getRightTableKVMapping();
final TableSourceDestinationMapping<T> rightTableMapping = mergeReteNode
.getRightTableMapping();
final VariableKeyValueMapping<T> mergeTableMapping = mergeReteNode
.getMapping();
stack.push(mergeTableFactory.create(leftTable, leftTableMapping,
- leftTableKVMapping, rightTable, rightTableMapping,
- rightTableKVMapping, mergeTableMapping));
+ rightTable, rightTableMapping, mergeTableMapping));
}
@Override
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -94,7 +94,7 @@
/* object */"?E", null);
rule.addPremise(aPremise);
final ReteSimulatorTable<String> table3 = reteSimulator
- .addPremise(aPremise);
+ .addAssertedPremise(aPremise);
assertEquals(3, table3.getTableNumber());
// ?X list ?L.
@@ -104,7 +104,7 @@
/* object */"?L", null);
rule.addPremise(aPremise);
final ReteSimulatorTable<String> table5 = reteSimulator
- .addPremise(aPremise);
+ .addAssertedPremise(aPremise);
assertEquals(5, table5.getTableNumber());
// ?L listOf ?X.
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -22,12 +22,16 @@
*/
package net.sf.reasoner4j.rete.entity;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
import net.sf.reasoner4j.Fortest;
-import net.sf.reasoner4j.rete.entity.AbstractTable;
-import net.sf.reasoner4j.rete.entity.IVariableTable;
/**
*
@@ -37,21 +41,153 @@
*/
public class MockTable<T> extends AbstractTable<T> {
- public MockTable(final IVariableTable<T> variableTable) {
- super(variableTable);
+ private final VariableKeyValueMapping<T> keyValueMapping;
+
+ @SuppressWarnings("unchecked")
+ private final Set<List<T>> emptySet = Collections.EMPTY_SET;
+
+ protected final Map<List<T>, Set<List<T>>> table = new HashMap<List<T>, Set<List<T>>>();
+
+ public MockTable(final VariableKeyValueMapping<T> keyValueMapping) {
+ super();
+ this.keyValueMapping = keyValueMapping;
}
- public boolean add(final List<T> variableValueSet) {
- return variableTable.add(variableValueSet);
+ public boolean add(final List<T> value) {
+ final List<T> key = keyValueMapping.createKey(value);
+ final List<T> indexedValue = keyValueMapping.createIndexedValue(value);
+ Set<List<T>> indexedValueSetForKey = table.get(key);
+ if (indexedValueSetForKey == null) {
+ indexedValueSetForKey = new HashSet<List<T>>();
+ table.put(key, indexedValueSetForKey);
+ }
+ final boolean added = indexedValueSetForKey.add(indexedValue);
+ if (added) {
+ fireAdded(value);
+ }
+ return added;
}
- public boolean remove(final List<T> variableValueSet) {
- return variableTable.remove(variableValueSet);
+ public boolean remove(final List<T> value) {
+ final List<T> key = keyValueMapping.createKey(value);
+ final List<T> indexedValue = keyValueMapping.createIndexedValue(value);
+ final Set<List<T>> indexedValueSetForKey = table.get(key);
+ final boolean removed;
+ if (indexedValueSetForKey == null) {
+ removed = false;
+ } else {
+ removed = indexedValueSetForKey.remove(indexedValue);
+ if (indexedValueSetForKey.isEmpty()) {
+ table.remove(key);
+ }
+ if (removed) {
+ fireRemoved(value);
+ }
+ }
+ return removed;
}
+ class SelectionIterator implements Iterator<List<T>> {
+
+ private final Iterator<List<T>> iterator;
+
+ private final List<T> key;
+
+ public SelectionIterator(final List<T> key,
+ final Set<List<T>> valueListForKey) {
+ super();
+ this.key = key;
+ iterator = valueListForKey.iterator();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ @Override
+ public List<T> next() {
+ final List<T> indexedValues = iterator.next();
+ return keyValueMapping.createValue(key, indexedValues);
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
@Override
+ public Iterator<List<T>> select(final List<T> value) {
+ final List<T> key = keyValueMapping.createKey(value);
+ Set<List<T>> valueListForKey = table.get(key);
+ if (valueListForKey == null) {
+ valueListForKey = emptySet;
+ }
+ return new SelectionIterator(key, valueListForKey);
+ }
+
+ @Override
+ public void removed(final List<T> value) {
+ // no implementation
+ }
+
+ private class TableIterator implements Iterator<List<T>> {
+
+ private List<T> next;
+
+ private Iterator<Entry<List<T>, Set<List<T>>>> mapIterator;
+
+ private Iterator<List<T>> keyIterator;
+
+ private List<T> key;
+
+ public TableIterator() {
+ super();
+ mapIterator = table.entrySet().iterator();
+ computeNext();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return next != null;
+ }
+
+ @Override
+ public List<T> next() {
+ final List<T> result = next;
+ computeNext();
+ return result;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ private void computeNext() {
+ if (keyIterator == null || !keyIterator.hasNext()) {
+ while (mapIterator.hasNext()) {
+ final Entry<List<T>, Set<List<T>>> entry = mapIterator
+ .next();
+ key = entry.getKey();
+ keyIterator = entry.getValue().iterator();
+ if (keyIterator.hasNext()) {
+ next = keyValueMapping.createValue(key,
+ keyIterator.next());
+ return;
+ }
+ }
+ next = null;
+ } else {
+ next = keyValueMapping.createValue(key, keyIterator.next());
+ }
+ }
+ }
+
+ @Override
public Iterator<List<T>> iterator() {
- return variableTable.iterator();
+ return new TableIterator();
}
@Fortest
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestMergeTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -93,8 +93,8 @@
/**/new boolean[] { false, false, false, false });
final ITable<String> mergeTable = mergeTableFactory.create(leftTable,
- leftTableMapping, leftTableKVMapping, rightTable,
- rightTableMapping, rightTableKVMapping, mergeTableMapping);
+ leftTableMapping, rightTable, rightTableMapping,
+ mergeTableMapping);
mergeTable.addListener(this);
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/service/MockTableFactory.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/service/MockTableFactory.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/service/MockTableFactory.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -22,10 +22,8 @@
*/
package net.sf.reasoner4j.rete.service;
-import net.sf.reasoner4j.rete.entity.IVariableTable;
import net.sf.reasoner4j.rete.entity.MockTable;
import net.sf.reasoner4j.rete.entity.VariableKeyValueMapping;
-import net.sf.reasoner4j.rete.entity.VariableTable;
/**
*
@@ -36,8 +34,6 @@
public class MockTableFactory<T> {
public MockTable<T> create(final VariableKeyValueMapping<T> keyValueMapping) {
- final IVariableTable<T> variableTable = new VariableTable<T>(
- keyValueMapping);
- return new MockTable<T>(variableTable);
+ return new MockTable<T>(keyValueMapping);
}
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -54,18 +54,28 @@
public ReteSimulatorTable<T> addPremise(final IPremise<T> premise) {
final ReteSimulatorTable<T> result = new ReteSimulatorTable<T>(
- tableNumber++, premise, false);
+ tableNumber++, premise,
+ ReteSimulatorTable.EnumPremiseType.STANDARD);
link(result);
return result;
}
public ReteSimulatorTable<T> addPremiseBuiltin(final IPremise<T> premise) {
final ReteSimulatorTable<T> result = new ReteSimulatorTable<T>(
- tableNumber++, premise, true);
+ tableNumber++, premise,
+ ReteSimulatorTable.EnumPremiseType.BUILTIN);
link(result);
return result;
}
+ public ReteSimulatorTable<T> addAssertedPremise(final IPremise<T> premise) {
+ final ReteSimulatorTable<T> result = new ReteSimulatorTable<T>(
+ tableNumber++, premise,
+ ReteSimulatorTable.EnumPremiseType.ASSERTED);
+ link(result);
+ return result;
+ }
+
private void link(final ReteSimulatorTable<T> result) {
if (rootTable == null) {
rootTable = result;
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTable.java 2010-12-24 02:02:06 UTC (rev 37)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTable.java 2010-12-25 03:43:14 UTC (rev 38)
@@ -23,6 +23,7 @@
package net.sf.reasoner4j.retetest;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
@@ -40,6 +41,12 @@
*/
public class ReteSimulatorTable<T> {
+ public enum EnumPremiseType {
+ STANDARD, ASSERTED, BUILTIN;
+ }
+
+ final boolean premiseTable;
+
private ReteSimulatorTable<T> parentTable;
private final List<String> variableNameList = new ArrayList<String>();
@@ -52,14 +59,16 @@
private final int tableNumber;
- private boolean builtin;
+ private final EnumPremiseType type;
private List<T> settedValues;
public ReteSimulatorTable(final int tableNumber, final IPremise<T> premise,
- final boolean builtin) {
+ final EnumPremiseType type) {
+ super();
+ premiseTable = true;
this.tableNumber = tableNumber;
- this.buil...
[truncated message content] |
|
From: <luc...@us...> - 2010-12-24 02:02:14
|
Revision: 37
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=37&view=rev
Author: luc_peuvrier
Date: 2010-12-24 02:02:06 +0000 (Fri, 24 Dec 2010)
Log Message:
-----------
refactoring, select method of rete table has value argument instead of key
Modified Paths:
--------------
trunk/reasoner4j/doc/doc.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableKeyValueMapping.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/MergeTableFactory.java
Removed Paths:
-------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/NullVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/TableDestinationToSourceKeyMapping.java
Modified: trunk/reasoner4j/doc/doc.txt
===================================================================
--- trunk/reasoner4j/doc/doc.txt 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/doc/doc.txt 2010-12-24 02:02:06 UTC (rev 37)
@@ -23,6 +23,11 @@
PremiseAndDefault PremiseTable PremiseVariableTableAndDefault (fact set view)
PremiseAndDefaultNotListening PremiseTableNotListening PremiseVariableTableAndDefault (fact set view)
+Merge:
+------
+
+MergeTable VariableTable
+
Conclusion:
-----------
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractTable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -51,12 +51,12 @@
}
@Override
- public Iterator<List<T>> select(final List<T> key) {
- return variableTable.select(key);
+ public Iterator<List<T>> select(final List<T> value) {
+ return variableTable.select(value);
}
@Override
- public Iterator<List<T>> removeSelect(final List<T> key) {
- return variableTable.select(key);
+ public Iterator<List<T>> removeSelect(final List<T> value) {
+ return variableTable.select(value);
}
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -46,8 +46,6 @@
private final int ruleIdentifier;
- private final VariableKeyValueMapping<T> mapping;
-
private final AllKnowledgeBase<T> knowledgeBase;
private final IBlankNodeProvider<T> blankNodeProvider;
@@ -62,7 +60,6 @@
final IBlankNodeProvider<T> blankNodeProvider) {
super(premise, new VariableTable<T>(mapping));
this.ruleIdentifier = ruleIdentifier;
- this.mapping = mapping;
this.knowledgeBase = knowledgeBase;
this.blankNodeProvider = blankNodeProvider;
}
@@ -88,8 +85,7 @@
}
@Override
- public Iterator<List<T>> select(final List<T> key) {
- final List<T> value = mapping.createValue(key);
+ public Iterator<List<T>> select(final List<T> value) {
final Iterator<T> iterator = value.iterator();
T subject;
if (premise.getSubjectVariableName() == null) {
@@ -143,8 +139,7 @@
}
@Override
- public Iterator<List<T>> removeSelect(final List<T> key) {
- final List<T> value = mapping.createValue(key);
+ public Iterator<List<T>> removeSelect(final List<T> value) {
final Iterator<T> iterator = value.iterator();
final T subject;
if (premise.getSubjectVariableName() == null) {
@@ -179,7 +174,7 @@
factSetListener.retracted(fact);
}
}
- return variableTable.removeSelect(key);
+ return variableTable.removeSelect(value);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -43,15 +43,12 @@
private final IBuiltin<T> buitin;
- private final VariableKeyValueMapping<T> mapping;
-
public BuiltinPremiseTable(final IPremise<T> premise,
final int ruleIdentifier, final IBuiltin<T> buitin,
final VariableKeyValueMapping<T> mapping) {
super(premise, new VariableTable<T>(mapping));
this.ruleIdentifier = ruleIdentifier;
this.buitin = buitin;
- this.mapping = mapping;
}
@Override
@@ -65,8 +62,7 @@
}
@Override
- public Iterator<List<T>> select(final List<T> key) {
- final List<T> value = mapping.createValue(key);
+ public Iterator<List<T>> select(final List<T> value) {
final IFact<T> buitlinFact = buitin.getBuiltinFact();
final Iterator<T> iterator = value.iterator();
/*
@@ -113,8 +109,8 @@
}
@Override
- public Iterator<List<T>> removeSelect(final List<T> key) {
- return variableTable.removeSelect(key);
+ public Iterator<List<T>> removeSelect(final List<T> value) {
+ return variableTable.removeSelect(value);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -37,9 +37,19 @@
void removeListener(ITableListener<T> listener);
- Iterator<List<T>> select(List<T> key);
+ /**
+ *
+ * @param value
+ * @return record selection for key take from value parameter
+ */
+ Iterator<List<T>> select(List<T> value);
- Iterator<List<T>> removeSelect(List<T> key);
+ /**
+ *
+ * @param value
+ * @return record selection for key take from value parameter
+ */
+ Iterator<List<T>> removeSelect(List<T> value);
Iterator<List<T>> iterator();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IVariableTable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -35,7 +35,8 @@
/**
*
* @param variableValueSet
- * @return <tt>true</tt> if this set did not already contain the specified
+ * FIXMELUC record
+ * @return <tt>true</tt> if this set did not already contains the specified
* element
*/
boolean add(List<T> variableValueSet);
@@ -43,6 +44,7 @@
/**
*
* @param variableValueSet
+ * FIXMELUC record
* @return <tt>true</tt> if this set contained the specified element
*/
boolean remove(List<T> variableValueSet);
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -49,24 +49,17 @@
* left source table
* @param leftTableMapping
* left table to this table mapping
- * @param leftTableKVMapping
- * left table key value mapping
* @param rightTable
* right source table
* @param rightTableMapping
* right table to this table mapping
- * @param rightTableKVMapping
- * right table key value mapping
* @param variableTable
* associated variable table
*/
- public MergeTable(
- final ITable<T> leftTable,
+ public MergeTable(final ITable<T> leftTable,
final TableSourceDestinationMapping<T> leftTableMapping,
- final TableDestinationToSourceKeyMapping<T> leftSourceDestToKeyMapping,
final ITable<T> rightTable,
final TableSourceDestinationMapping<T> rightTableMapping,
- final TableDestinationToSourceKeyMapping<T> rightSourceDestToKeyMapping,
final IVariableTable<T> variableTable) {
super(variableTable);
this.leftTable = leftTable;
@@ -75,15 +68,13 @@
@Override
public void added(final List<T> variableValueSet) {
addMerge(rightTable, variableValueSet/* left value */
- , rightTableMapping, rightSourceDestToKeyMapping,
- leftTableMapping);
+ , rightTableMapping, leftTableMapping);
}
@Override
public void removed(final List<T> variableValueSet) {
removeMerge(rightTable, variableValueSet/* left value */
- , rightTableMapping, rightSourceDestToKeyMapping,
- leftTableMapping);
+ , rightTableMapping, leftTableMapping);
}
};
leftTable.addListener(leftListener);
@@ -91,14 +82,13 @@
@Override
public void added(final List<T> variableValueSet) {
addMerge(leftTable, variableValueSet/* right value */,
- leftTableMapping, leftSourceDestToKeyMapping,
- rightTableMapping);
+ leftTableMapping, rightTableMapping);
}
@Override
public void removed(final List<T> variableValueSet/* right value */) {
removeMerge(leftTable, variableValueSet, leftTableMapping,
- leftSourceDestToKeyMapping, rightTableMapping);
+ rightTableMapping);
}
};
rightTable.addListener(rightListener);
@@ -121,21 +111,16 @@
// leftTable.removeListener(leftListener);
// }
- private void addMerge(
- final ITable<T> firstSourceTable,
+ private void addMerge(final ITable<T> firstSourceTable,
final List<T> secondSourceValue,
final TableSourceDestinationMapping<T> firstSourceTableMapping,
- final TableDestinationToSourceKeyMapping<T> firstSourceDestToKeyMapping,
final TableSourceDestinationMapping<T> secondSourceTableMapping) {
final List<T> thisTableValue = secondSourceTableMapping
.fromSourceToDest(secondSourceValue);
- // final List<T> firstSourcevalue =
- // firstSourceTableMapping.fromDestToSource(thisTableValue);
- // final List<T> key =
- // firstSourceTableKVMapping.createKey(firstSourcevalue);
- final List<T> key = firstSourceDestToKeyMapping
- .fromDestToSourceKey(thisTableValue);
- final Iterator<List<T>> iterator = firstSourceTable.select(key);
+ final List<T> firstSourcevalue = firstSourceTableMapping
+ .fromDestToSource(thisTableValue);
+ final Iterator<List<T>> iterator = firstSourceTable
+ .select(firstSourcevalue);
while (iterator.hasNext()) {
final List<T> addedInTable = iterator.next();
variableTable.add(firstSourceTableMapping.fromSourceToDest(
@@ -143,21 +128,16 @@
}
}
- private void removeMerge(
- final ITable<T> firstSourceTable,
+ private void removeMerge(final ITable<T> firstSourceTable,
final List<T> secondSourceValue,
final TableSourceDestinationMapping<T> firstSourceTableMapping,
- final TableDestinationToSourceKeyMapping<T> firstSourceDestToKeyMapping,
final TableSourceDestinationMapping<T> secondSourceTableMapping) {
final List<T> thisTableValue = secondSourceTableMapping
.fromSourceToDest(secondSourceValue);
- // final List<T> firstSourcevalue =
- // firstSourceTableMapping.fromDestToSource(thisTableValue);
- // final List<T> key =
- // firstSourceTableKVMapping.createKey(firstSourcevalue);
- final List<T> key = firstSourceDestToKeyMapping
- .fromDestToSourceKey(thisTableValue);
- final Iterator<List<T>> iterator = firstSourceTable.removeSelect(key);
+ final List<T> firstSourcevalue = firstSourceTableMapping
+ .fromDestToSource(thisTableValue);
+ final Iterator<List<T>> iterator = firstSourceTable
+ .removeSelect(firstSourcevalue);
while (iterator.hasNext()) {
final List<T> removedFromTable = iterator.next();
variableTable.remove(firstSourceTableMapping.fromSourceToDest(
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/NullVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/NullVariableTable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/NullVariableTable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -1,84 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class NullVariableTable<T> implements IVariableTable<T> {
-
- @Override
- public void addListener(final ITableListener<T> listener) {
- // no implementation
- }
-
- @Override
- public void removeListener(final ITableListener<T> listener) {
- // no implementation
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public Iterator<List<T>> select(final List<T> key) {
- // no implementation
- return Collections.EMPTY_LIST.iterator();
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public Iterator<List<T>> removeSelect(final List<T> key) {
- // no implementation
- return Collections.EMPTY_LIST.iterator();
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public Iterator<List<T>> iterator() {
- // no implementation
- return Collections.EMPTY_LIST.iterator();
- }
-
- @Override
- public boolean add(List<T> variableValueSet) {
- // no implementation
- return true;
- }
-
- @Override
- public boolean remove(List<T> variableValueSet) {
- // no implementation
- return true;
- }
-
- @Override
- public void accept(final ITableVisitor<T> visitor) {
- // no implementation
- }
-}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -85,9 +85,8 @@
}
@Override
- public Iterator<List<T>> select(final List<T> key) {
- final List<T> values = mapping.createValue(key);
- final Iterator<T> iterator = values.iterator();
+ public Iterator<List<T>> select(final List<T> value) {
+ final Iterator<T> iterator = value.iterator();
final T subject;
if (premise.getSubjectVariableName() == null) {
subject = premise.getSubject();
@@ -116,8 +115,8 @@
}
@Override
- public Iterator<List<T>> removeSelect(final List<T> key) {
- return select(key);
+ public Iterator<List<T>> removeSelect(final List<T> value) {
+ return select(value);
}
private class FactIterator implements Iterator<List<T>> {
@@ -154,6 +153,7 @@
@Fortest
@Override
public void accept(final ITableVisitor<T> visitor) {
+ visitor.beginVisit(this);
visitor.endVisit(this);
}
}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/TableDestinationToSourceKeyMapping.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/TableDestinationToSourceKeyMapping.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/TableDestinationToSourceKeyMapping.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -1,69 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class TableDestinationToSourceKeyMapping<T> {
-
- private final int keyLength;
-
- private final int[] destKeyIndex;
-
- public TableDestinationToSourceKeyMapping(
- TableSourceDestinationMapping<T> sourceDestMapping,
- VariableKeyValueMapping<T> sourceTableKVMapping) {
- super();
- keyLength = sourceTableKVMapping.getKeyLength();
- final int[] keyPositioninValue = sourceTableKVMapping
- .getKeyPositionInValue();
- final int[] destIndex = sourceDestMapping.getDestIndex();
- final int[] sourceIndex = sourceDestMapping.getSourceIndex();
- destKeyIndex = new int[keyLength];
- for (int keyIndex = 0; keyIndex < keyLength; keyIndex++) {
- int kpos = keyPositioninValue[keyIndex];
- int mapIndex;
- for (mapIndex = 0; sourceIndex[mapIndex] != kpos; mapIndex++)
- ;
- destKeyIndex[keyIndex] = destIndex[mapIndex];
- }
- }
-
- public List<T> fromDestToSourceKey(final List<T> destValue) {
- // final List<T> firstSourcevalue =
- // sourceDestMapping.fromDestToSource(destValue);
- // return sourceTableKVMapping.createKey(firstSourcevalue);
- final List<T> key = new ArrayList<T>(keyLength);
- for (int index : destKeyIndex) {
- key.add(destValue.get(index));
- }
- return key;
- }
-}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableKeyValueMapping.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableKeyValueMapping.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableKeyValueMapping.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -102,13 +102,13 @@
/**
* create key from record value
*
- * @param values
+ * @param value
* @return
*/
- public List<T> createKey(final List<T> values) {
+ public List<T> createKey(final List<T> value) {
final List<T> key = new ArrayList<T>(keyLength);
for (int index = 0; index < keyLength; index++) {
- key.add(values.get(keyPositionInValue[index]));
+ key.add(value.get(keyPositionInValue[index]));
}
return key;
}
@@ -116,13 +116,13 @@
/**
* create indexed value from record value
*
- * @param values
+ * @param value
* @return
*/
- public List<T> createIndexedValue(final List<T> values) {
+ public List<T> createIndexedValue(final List<T> value) {
final List<T> indexedValue = new ArrayList<T>(indexedValueLength);
for (int index = 0; index < indexedValueLength; index++) {
- indexedValue.add(values.get(indexedValuePositionInValue[index]));
+ indexedValue.add(value.get(indexedValuePositionInValue[index]));
}
return indexedValue;
}
@@ -131,10 +131,10 @@
* create record value from key and indexed value
*
* @param key
- * @param indexedValues
+ * @param indexedValue
* @return
*/
- public List<T> createValue(final List<T> key, final List<T> indexedValues) {
+ public List<T> createValue(final List<T> key, final List<T> indexedValue) {
final List<T> value = new ArrayList<T>(recordLength);
for (int count = 0; count < recordLength; count++) {
value.add(null);
@@ -145,7 +145,7 @@
index++;
}
index = 0;
- for (T valueElt : indexedValues) {
+ for (T valueElt : indexedValue) {
value.set(indexedValuePositionInValue[index], valueElt);
index++;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -110,7 +110,8 @@
}
@Override
- public Iterator<List<T>> select(final List<T> key) {
+ public Iterator<List<T>> select(final List<T> value) {
+ final List<T> key = mapping.createKey(value);
Set<List<T>> valueListForKey = table.get(key);
if (valueListForKey == null) {
valueListForKey = emptySet;
@@ -119,7 +120,8 @@
}
@Override
- public Iterator<List<T>> removeSelect(final List<T> key) {
+ public Iterator<List<T>> removeSelect(final List<T> value) {
+ final List<T> key = mapping.createKey(value);
Set<List<T>> valueListForKey = table.remove(key);
if (valueListForKey == null) {
valueListForKey = emptySet;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/MergeTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/MergeTableFactory.java 2010-12-23 18:15:10 UTC (rev 36)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/MergeTableFactory.java 2010-12-24 02:02:06 UTC (rev 37)
@@ -25,7 +25,6 @@
import net.sf.reasoner4j.rete.entity.ITable;
import net.sf.reasoner4j.rete.entity.IVariableTable;
import net.sf.reasoner4j.rete.entity.MergeTable;
-import net.sf.reasoner4j.rete.entity.TableDestinationToSourceKeyMapping;
import net.sf.reasoner4j.rete.entity.TableSourceDestinationMapping;
import net.sf.reasoner4j.rete.entity.VariableKeyValueMapping;
import net.sf.reasoner4j.rete.entity.VariableTable;
@@ -47,14 +46,7 @@
final VariableKeyValueMapping<T> mergeTableMapping) {
final IVariableTable<T> variableTable = new VariableTable<T>(
mergeTableMapping);
- final TableDestinationToSourceKeyMapping<T> leftSourceDestToKeyMapping =
- /**/new TableDestinationToSourceKeyMapping<T>(leftTableMapping,
- leftTableKVMapping);
- final TableDestinationToSourceKeyMapping<T> rightSourceDestToKeyMapping =
- /**/new TableDestinationToSourceKeyMapping<T>(rightTableMapping,
- rightTableKVMapping);
- return new MergeTable<T>(leftTable, leftTableMapping,
- leftSourceDestToKeyMapping, rightTable, rightTableMapping,
- rightSourceDestToKeyMapping, variableTable);
+ return new MergeTable<T>(leftTable, leftTableMapping, rightTable,
+ rightTableMapping, variableTable);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-23 18:15:18
|
Revision: 36
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=36&view=rev
Author: luc_peuvrier
Date: 2010-12-23 18:15:10 +0000 (Thu, 23 Dec 2010)
Log Message:
-----------
added utilities for rete table content test
Modified Paths:
--------------
trunk/reasoner4j/doc/builtin.txt
trunk/reasoner4j/doc/todo.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java
trunk/reasoner4j/src/test/resources/log4j.properties
Added Paths:
-----------
trunk/reasoner4j/doc/conception.txt
trunk/reasoner4j/doc/doc.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableVisitor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/NullVariableTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTable.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTest.java
Removed Paths:
-------------
trunk/reasoner4j/doc/concept.txt
Modified: trunk/reasoner4j/doc/builtin.txt
===================================================================
--- trunk/reasoner4j/doc/builtin.txt 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/doc/builtin.txt 2010-12-23 18:15:10 UTC (rev 36)
@@ -102,7 +102,7 @@
?LL listRest ?LL2 <-- asserted
?LL2 listFirst ?L <-- asserted
?LL2 listRest nil <-- asserted
- ?LL listAppend ?NEWL. <-- builtin or asserted
+ ?LL listAppend ?NEWL. <-- builtin
?LN listFirst ?L
?LN listRest ?N
Deleted: trunk/reasoner4j/doc/concept.txt
===================================================================
--- trunk/reasoner4j/doc/concept.txt 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/doc/concept.txt 2010-12-23 18:15:10 UTC (rev 36)
@@ -1,145 +0,0 @@
-http://www.w3.org/2000/10/swap/doc/Rules
-
- ==============================
- @forAll :x, :y.
- { :x :parent :y } => { :y :child :x }.
-
-can be wrote
-
- { ?x parent ?y } => { ?y :child ?x }.
-
-x and y are universal variables
- ==============================
- @forSome :a, :b.
- :a :hates :b.
- :b :loves :a.
-
-can be wrote
-
- _:a :hates _:b.
- _:b :loves _:a.
-
-a and b are existential variables
-
------------------------------------------------------------------------------------------------------
-
-fact: subject predicate object
-
-subject, predicate, object: fact member
-
-fact has sources:
-- basic fact
-- consequence of one or more rules
-
-rule:
-
-if "premises" then "conclusions"
-
-premise
-
-conclusion
-
------------------------------------------------------------------------------------------------------
-
-Fact <>--- Premise
- ----- Subject
- ----- Predicate
- ----- Object
-
-Rule <>--- Premise
- <>--- Conclusion
-
-Premise ----- RuleMemberSubject
- ----- RuleMemberPredicate
- ----- RuleMemberObject
- <>--- FactSet filtered view of fact
-
-Conclusion ----- RuleMemberSubject
- ----- RuleMemberPredicate
- ----- RuleMemberObject
- <>--- FactSet source of fact
-
-RuleMember<XXX>
-an variable or a FactMember<XXX>
-
- ==============================
-
-{
- ?M a Map
- ?M entry ?E
- ?E user ?U
- ?U id ?ID
-}
-=> {
- ?E key ?ID
-}
-
-rete
-
- 0
-?M a Map : ?M --+
- 0 1 0 1
-?M entry ?E : ?M ?E --+-- ?M ?E --+
- 0 1 0 1 2
-?E user ?U : ?E ?U --------------+-- ?M ?E ?U --+
- 0 1 0 1 2 3
-?U id ?ID : ?U ?ID -----------------------------+-- ?M ?E ?U ?ID
-
-?M a Map : ?M --+
-?E user ?U : ?E ?U --+-- ?M ?E ?U --+
-?M entry ?E : ?M ?E -----------------+-- ?M ?E ?U --+
-?U id ?ID : ?U ?ID --------------------------------+-- ?M ?E ?U ?ID
-
-
-
- r1: ?A ?B r2: ?A ?C r1^r2: ?A ?B ?C
-
- --------------------------------------
--> a x
- --------------------------------------
- a x
--> b x
- --------------------------------------
- a x
- b x
--> a y a x y
- --------------------------------------
-
-
------------------------------------------------------------------------------------------------------
-
-
-? ? ?
-s ? ?
-? p ?
-? ? o
-s p ?
-s ? o
-? p o
-s p o
-
-fact:
-
-s -> po(s)
-p -> so(p)
-o -> sp(o)
-
-po(s): PredicateObjectOfSubject
-
-p -> o(s,p) ObjectOfSubjectPredicate
-o -> p(s,o) PredicateOfSubjectObject
-
-so(p): SubjectObjectOfPredicate
-
-s -> o(s,p) ObjectOfSubjectPredicate
-o -> s(p,o) SubjectOfPredicateObject
-
-sp(o): SubjectPredicateOfObject
-
-s -> p(s,o) PredicateOfSubjectObject
-p -> s(p,o) SubjectOfPredicateObject
-
-o(s,p) ObjectOfSubjectPredicate
-p(s,o) PredicateOfSubjectObject
-s(p,o) SubjectOfPredicateObject
-
Copied: trunk/reasoner4j/doc/conception.txt (from rev 34, trunk/reasoner4j/doc/concept.txt)
===================================================================
--- trunk/reasoner4j/doc/conception.txt (rev 0)
+++ trunk/reasoner4j/doc/conception.txt 2010-12-23 18:15:10 UTC (rev 36)
@@ -0,0 +1,145 @@
+http://www.w3.org/2000/10/swap/doc/Rules
+
+ ==============================
+ @forAll :x, :y.
+ { :x :parent :y } => { :y :child :x }.
+
+can be wrote
+
+ { ?x parent ?y } => { ?y :child ?x }.
+
+x and y are universal variables
+ ==============================
+ @forSome :a, :b.
+ :a :hates :b.
+ :b :loves :a.
+
+can be wrote
+
+ _:a :hates _:b.
+ _:b :loves _:a.
+
+a and b are existential variables
+
+-----------------------------------------------------------------------------------------------------
+
+fact: subject predicate object
+
+subject, predicate, object: fact member
+
+fact has sources:
+- basic fact
+- consequence of one or more rules
+
+rule:
+
+if "premises" then "conclusions"
+
+premise
+
+conclusion
+
+-----------------------------------------------------------------------------------------------------
+
+Fact <>--- Premise
+ ----- Subject
+ ----- Predicate
+ ----- Object
+
+Rule <>--- Premise
+ <>--- Conclusion
+
+Premise ----- RuleMemberSubject
+ ----- RuleMemberPredicate
+ ----- RuleMemberObject
+ <>--- FactSet filtered view of fact
+
+Conclusion ----- RuleMemberSubject
+ ----- RuleMemberPredicate
+ ----- RuleMemberObject
+ <>--- FactSet source of fact
+
+RuleMember<XXX>
+an variable or a FactMember<XXX>
+
+ ==============================
+
+{
+ ?M a Map
+ ?M entry ?E
+ ?E user ?U
+ ?U id ?ID
+}
+=> {
+ ?E key ?ID
+}
+
+rete
+
+ 0
+?M a Map : ?M --+
+ 0 1 0 1
+?M entry ?E : ?M ?E --+-- ?M ?E --+
+ 0 1 0 1 2
+?E user ?U : ?E ?U --------------+-- ?M ?E ?U --+
+ 0 1 0 1 2 3
+?U id ?ID : ?U ?ID -----------------------------+-- ?M ?E ?U ?ID
+
+?M a Map : ?M --+
+?E user ?U : ?E ?U --+-- ?M ?E ?U --+
+?M entry ?E : ?M ?E -----------------+-- ?M ?E ?U --+
+?U id ?ID : ?U ?ID --------------------------------+-- ?M ?E ?U ?ID
+
+
+
+ r1: ?A ?B r2: ?A ?C r1^r2: ?A ?B ?C
+
+ --------------------------------------
+-> a x
+ --------------------------------------
+ a x
+-> b x
+ --------------------------------------
+ a x
+ b x
+-> a y a x y
+ --------------------------------------
+
+
+-----------------------------------------------------------------------------------------------------
+
+
+? ? ?
+s ? ?
+? p ?
+? ? o
+s p ?
+s ? o
+? p o
+s p o
+
+fact:
+
+s -> po(s)
+p -> so(p)
+o -> sp(o)
+
+po(s): PredicateObjectOfSubject
+
+p -> o(s,p) ObjectOfSubjectPredicate
+o -> p(s,o) PredicateOfSubjectObject
+
+so(p): SubjectObjectOfPredicate
+
+s -> o(s,p) ObjectOfSubjectPredicate
+o -> s(p,o) SubjectOfPredicateObject
+
+sp(o): SubjectPredicateOfObject
+
+s -> p(s,o) PredicateOfSubjectObject
+p -> s(p,o) SubjectOfPredicateObject
+
+o(s,p) ObjectOfSubjectPredicate
+p(s,o) PredicateOfSubjectObject
+s(p,o) SubjectOfPredicateObject
+
Added: trunk/reasoner4j/doc/doc.txt
===================================================================
--- trunk/reasoner4j/doc/doc.txt (rev 0)
+++ trunk/reasoner4j/doc/doc.txt 2010-12-23 18:15:10 UTC (rev 36)
@@ -0,0 +1,51 @@
+IMmotor#assertFact IKnowledgeBase#assertFact:
+---------------------------------------------
+
+ works has adding rule "true => (x,y,z)" added fact: this is asserted fact
+
+IMmotor#retractFact IKnowledgeBase#retractFact and retract conclusion:
+----------------------------------------------------------------------
+ retract always, do not take care of assertion cause inferred (rules conclusion) or asserted (added in KB)
+ inferred fact:
+ asserted as rule conclusion
+ asserted fact:
+ added in KB, always true
+
+Premise:
+--------
+
+Premise PremiseTable PremiseVariableTable (fact set view)
+ BuiltinPremiseTable VariableTable (a premise fact set)
+ need for retraction
+PremiseNotListening PremiseTableNotListening PremiseVariableTable (fact set view)
+AssertedPremise AssertedPremiseTable VariableTable (a premise fact set)
+ need for retraction
+PremiseAndDefault PremiseTable PremiseVariableTableAndDefault (fact set view)
+PremiseAndDefaultNotListening PremiseTableNotListening PremiseVariableTableAndDefault (fact set view)
+
+Conclusion:
+-----------
+
+AssertConclusion AssertConclusionNotifier
+ReplaceConclusion ReplaceConclusionNotifier
+RetractConclusion RetractConclusionNotifier
+
+existential in conclusion:
+--------------------------
+
+use blankNode builtin
+see TestExistential
+
+ :o1 :p1 ?X
+ :o2 :p1 ?Y
+=>
+ ?X :p2 ?E
+ ?E :p3 ?Y
+
+Premise(":o1",":p1",?X)
+Premise(":o2",":p1",?Y)
+Premise("","blankNode",?E)
+=>
+Conclusion(?X,":p2",?E)
+Conclusion(?E,":p3",?Y)
+
Modified: trunk/reasoner4j/doc/todo.txt
===================================================================
--- trunk/reasoner4j/doc/todo.txt 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/doc/todo.txt 2010-12-23 18:15:10 UTC (rev 36)
@@ -1,11 +1,9 @@
-doc:
-IMmotor#assertFact IKnowledgeBase#assertFact:
- works has adding rule "true => (x,y,z)" added fact: this is asserted fact
-IMmotor#retractFact IKnowledgeBase#retractFact and retract conclusion:
- retract always, do not take care of assertion cause inferred (rules conclusion) or asserted (added in KB)
-inferred fact: asserted as rule conclusion
---------------------------------------------------------------------------------------------------------
+is blankNode premise needed ?
+-----------------------------
+why not AssertedPremise("","",?E) instead of Premise("","blankNode",?E)
+to test
+
IBuitinTermProvider chain
-------------------------
@@ -13,14 +11,18 @@
motor#addBuitinProvider
motor#defaultBuitinProvider(boolean enabled); //disabled by default
-existential in conclusion:
---------------------------
+to test
+-------
- :o1 :p1 ?X
- :o2 :p1 ?Y
-=>
- ?X :p2 ?E
- ?E :p3 ?Y
+builtin mathSum
+builtin listAppend
+
+inList builtin
+--------------
+
+
+
+
premise negation
----------------
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertedPremiseTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -186,4 +186,11 @@
public Iterator<List<T>> iterator() {
return variableTable.iterator();
}
+
+ @Fortest
+ @Override
+ public void accept(final ITableVisitor<T> visitor) {
+ visitor.beginVisit(this);
+ visitor.endVisit(this);
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/BuiltinPremiseTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -26,6 +26,7 @@
import java.util.Iterator;
import java.util.List;
+import net.sf.reasoner4j.Fortest;
import net.sf.reasoner4j.builtin.IBuiltin;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.rule.IPremise;
@@ -125,4 +126,11 @@
public void dispose() {
// nothing to do
}
+
+ @Fortest
+ @Override
+ public void accept(final ITableVisitor<T> visitor) {
+ visitor.beginVisit(this);
+ visitor.endVisit(this);
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -42,4 +42,6 @@
Iterator<List<T>> removeSelect(List<T> key);
Iterator<List<T>> iterator();
+
+ void accept(ITableVisitor<T> visitor);
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableVisitor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableVisitor.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ITableVisitor.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rete.entity;
+
+import net.sf.reasoner4j.Fortest;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+@Fortest
+public interface ITableVisitor<T> {
+
+ void beginVisit(ITable<T> table);
+
+ void endVisit(ITable<T> table);
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/MergeTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -169,4 +169,13 @@
public Iterator<List<T>> iterator() {
return variableTable.iterator();
}
+
+ @Fortest
+ @Override
+ public void accept(final ITableVisitor<T> visitor) {
+ visitor.beginVisit(this);
+ leftTable.accept(visitor);
+ rightTable.accept(visitor);
+ visitor.endVisit(this);
+ }
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/NullVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/NullVariableTable.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/NullVariableTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rete.entity;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class NullVariableTable<T> implements IVariableTable<T> {
+
+ @Override
+ public void addListener(final ITableListener<T> listener) {
+ // no implementation
+ }
+
+ @Override
+ public void removeListener(final ITableListener<T> listener) {
+ // no implementation
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Iterator<List<T>> select(final List<T> key) {
+ // no implementation
+ return Collections.EMPTY_LIST.iterator();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Iterator<List<T>> removeSelect(final List<T> key) {
+ // no implementation
+ return Collections.EMPTY_LIST.iterator();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Iterator<List<T>> iterator() {
+ // no implementation
+ return Collections.EMPTY_LIST.iterator();
+ }
+
+ @Override
+ public boolean add(List<T> variableValueSet) {
+ // no implementation
+ return true;
+ }
+
+ @Override
+ public boolean remove(List<T> variableValueSet) {
+ // no implementation
+ return true;
+ }
+
+ @Override
+ public void accept(final ITableVisitor<T> visitor) {
+ // no implementation
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -76,4 +76,11 @@
public boolean isAsserted() {
return EnumPremiseType.ASSERTED.equals(premise.getType());
}
+
+ @Fortest
+ @Override
+ public void accept(final ITableVisitor<T> visitor) {
+ visitor.beginVisit(this);
+ visitor.endVisit(this);
+ }
}
\ No newline at end of file
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -25,6 +25,7 @@
import java.util.Iterator;
import java.util.List;
+import net.sf.reasoner4j.Fortest;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.rule.IPremise;
@@ -149,4 +150,10 @@
public Iterator<List<T>> iterator() {
return new FactIterator();
}
+
+ @Fortest
+ @Override
+ public void accept(final ITableVisitor<T> visitor) {
+ visitor.endVisit(this);
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -66,10 +66,6 @@
return rule;
}
- public ITable<T> getRootTable() {
- return rootTable;
- }
-
public void setRootTable(final ITable<T> rootTable) {
this.rootTable = rootTable;
}
@@ -86,7 +82,17 @@
}
@Fortest
+ public ITable<T> getRootTable() {
+ return rootTable;
+ }
+
+ @Fortest
public List<IPremiseTable<T>> getPremiseTableList() {
return premiseTableList;
}
+
+ @Fortest
+ public void accept(final ITableVisitor<T> visitor) {
+ rootTable.accept(visitor);
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -31,6 +31,8 @@
import java.util.Map.Entry;
import java.util.Set;
+import net.sf.reasoner4j.Fortest;
+
/**
*
* @author luc peuvrier
@@ -181,4 +183,16 @@
public Iterator<List<T>> iterator() {
return new TableIterator();
}
+
+ @Fortest
+ @Override
+ public void accept(final ITableVisitor<T> visitor) {
+ visitor.beginVisit(this);
+ visitor.endVisit(this);
+ }
+
+ @Override
+ public String toString() {
+ return "VariableTable [table=" + table + "]";
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -114,26 +114,30 @@
final IPremise<T> premise = premiseReteNode.getPremise();
final VariableKeyValueMapping<T> mapping = premiseReteNode.getMapping();
final IPremiseTable<T> premiseTable;
+ final IBuiltin<T> buitin = buitin(premise);
switch (premise.getType()) {
case ASSERTED:
+ assertNotBuitlin(buitin, premise);
+ // FIXMELUC use of premiseTableFactory
premiseTable = new AssertedPremiseTable<T>(
reteRule.getIdentifier(), premise, mapping,
motor.getKnowledgeBase(), motor.getBlankNodeProvider());
reteRule.add(premiseTable);
break;
case DEFAULT:
+ assertNotBuitlin(buitin, premise);
premiseTable = premiseTableFactory.create(premise, mapping,
motor.getAllFactSet());
reteRule.add(premiseTable);
break;
case STANDARD:
- final IBuiltin<T> buitin = buitin(premise);
if (buitin == null) {
final PremiseTable<T> factPremiseTable = premiseTableFactory
.create(premise, mapping, motor.getAllFactSet());
reteRule.add(factPremiseTable);
premiseTable = factPremiseTable;
} else {
+ // FIXMELUC use of premiseTableFactory
premiseTable = new BuiltinPremiseTable<T>(premise,
reteRule.getIdentifier(), buitin, mapping);
}
@@ -150,6 +154,13 @@
return motor.builtin(fact);
}
+ private void assertNotBuitlin(final IBuiltin<T> buitin,
+ final IPremise<T> premise) {
+ if (buitin != null) {
+ throw new ReasonerException("can not be a buitlin : " + premise);
+ }
+ }
+
@Override
public void endVisit(final MergeReteNode<T> mergeReteNode) {
final ITable<T> rightTable = stack.pop();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremise.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -57,6 +57,11 @@
}
@Override
+ public String toString() {
+ return "[type=" + type + ", listening=" + listening + "]";
+ }
+
+ @Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -59,4 +59,11 @@
public T getDefaultObject() {
return defaultObject;
}
+
+ @Override
+ public String toString() {
+ return "[defaultSubject=" + defaultSubject + ", defaultPredicate="
+ + defaultPredicate + ", defaultObject=" + defaultObject + ", "
+ + super.toString() + "]";
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertedPremise.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -37,4 +37,9 @@
predicateVariableName, predicate, objectVariableName, object,
true);
}
+
+ @Override
+ public String toString() {
+ return "AssertedPremise [" + super.toString() + "]";
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/Premise.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -37,4 +37,9 @@
predicateVariableName, predicate, objectVariableName, object,
true);
}
+
+ @Override
+ public String toString() {
+ return "Premise [" + super.toString() + "]";
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -39,4 +39,9 @@
predicateVariableName, predicate, defaultPredicate,
objectVariableName, object, defaultObject, true);
}
+
+ @Override
+ public String toString() {
+ return "PremiseAndDefault [" + super.toString() + "]";
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -40,4 +40,9 @@
predicateVariableName, predicate, defaultPredicate,
objectVariableName, object, defaultObject, false);
}
+
+ @Override
+ public String toString() {
+ return "PremiseAndDefaultNotListening [" + super.toString() + "]";
+ }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseNotListening.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -37,4 +37,9 @@
predicateVariableName, predicate, objectVariableName, object,
false);
}
+
+ @Override
+ public String toString() {
+ return "PremiseNotListening [" + super.toString() + "]";
+ }
}
Added: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java (rev 0)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/ReteRuleToString.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j;
+
+import java.util.Iterator;
+import java.util.List;
+
+import net.sf.reasoner4j.rete.entity.ITable;
+import net.sf.reasoner4j.rete.entity.ITableVisitor;
+import net.sf.reasoner4j.rete.entity.ReteRule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+@Fortest
+public class ReteRuleToString<T> implements ITableVisitor<T> {
+
+ private StringBuilder stringBuilder;
+
+ private int tableNumber;
+
+ public String toString(final ReteRule<T> reteRule) {
+ String result = null;
+ try {
+ stringBuilder = new StringBuilder();
+ tableNumber = 0;
+ reteRule.accept(this);
+ result = stringBuilder.toString();
+ } finally {
+ stringBuilder = null;
+ }
+ return result;
+ }
+
+ @Override
+ public void beginVisit(final ITable<T> table) {
+ // no implementation
+ }
+
+ @Override
+ public void endVisit(final ITable<T> table) {
+ stringBuilder.append("table #");
+ stringBuilder.append(tableNumber++);
+ stringBuilder.append(' ');
+ stringBuilder.append(table.getClass().getName());
+ stringBuilder.append('\n');
+ final Iterator<List<T>> iterator = table.iterator();
+ while (iterator.hasNext()) {
+ final List<T> line = iterator.next();
+ stringBuilder.append("- ");
+ stringBuilder.append(line.toString());
+ stringBuilder.append('\n');
+ }
+ }
+}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBuitin.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -45,7 +45,7 @@
*/
public class TestBuitin extends AbstractTestCase {
- public void test1() {
+ public void testPropertySetToProductResult() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
final IKnowledgeBase<String> kb = kbFactory.create();
@@ -160,7 +160,7 @@
assertFalse(iterator.hasNext());
}
- public void test2() {
+ public void testPropertyIsProductResultOfAnOtherProperty() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
final IKnowledgeBase<String> kb = kbFactory.create();
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReteTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -26,8 +26,6 @@
import java.util.Iterator;
import java.util.List;
-import org.apache.log4j.Logger;
-
import net.sf.reasoner4j.builtin.IBuiltin;
import net.sf.reasoner4j.builtin.impl.BlankNodeBuiltin;
import net.sf.reasoner4j.fact.Fact;
@@ -37,17 +35,19 @@
import net.sf.reasoner4j.kb.MainKnowledgeBaseFactory;
import net.sf.reasoner4j.motor.IMotor;
import net.sf.reasoner4j.motor.MotorFactory;
-import net.sf.reasoner4j.rete.entity.AssertedPremiseTable;
-import net.sf.reasoner4j.rete.entity.BuiltinPremiseTable;
import net.sf.reasoner4j.rete.entity.ITable;
import net.sf.reasoner4j.rete.entity.MergeTable;
import net.sf.reasoner4j.rete.entity.ReteRule;
-import net.sf.reasoner4j.rule.AssertedPremise;
+import net.sf.reasoner4j.retetest.ReteSimulator;
+import net.sf.reasoner4j.retetest.ReteSimulatorTable;
import net.sf.reasoner4j.rule.AssertConclusion;
+import net.sf.reasoner4j.rule.AssertedPremise;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
import net.sf.reasoner4j.rule.Rule;
+import org.apache.log4j.Logger;
+
/**
*
* @author luc peuvrier
@@ -64,6 +64,7 @@
final IMotor<String> motor = motorFactory.create(kb, this, this);
final IBuiltin<String> testBuiltin = new BlankNodeBuiltin<String>();
motor.addBuiltin(testBuiltin);
+ final ReteSimulator<String> reteSimulator = new ReteSimulator<String>();
Rule<String> rule = new Rule<String>();
// ?X prop ?E.
@@ -72,6 +73,9 @@
/* predicate */null, "prop",
/* object */"?E", null);
rule.addPremise(premise);
+ final ReteSimulatorTable<String> table0 = reteSimulator
+ .addPremise(premise);
+ assertEquals(0, table0.getTableNumber());
// x blankNode ?L
premise = new Premise<String>(
@@ -79,6 +83,9 @@
/* predicate */null, "blankNode",
/* object */"?L", null);
rule.addPremise(premise);
+ final ReteSimulatorTable<String> table1 = reteSimulator
+ .addPremiseBuiltin(premise);
+ assertEquals(1, table1.getTableNumber());
// ?L listFirst ?E
AssertedPremise<String> aPremise = new AssertedPremise<String>(
@@ -86,6 +93,9 @@
/* predicate */null, "listFirst",
/* object */"?E", null);
rule.addPremise(aPremise);
+ final ReteSimulatorTable<String> table3 = reteSimulator
+ .addPremise(aPremise);
+ assertEquals(3, table3.getTableNumber());
// ?X list ?L.
aPremise = new AssertedPremise<String>(
@@ -93,6 +103,9 @@
/* predicate */null, "list",
/* object */"?L", null);
rule.addPremise(aPremise);
+ final ReteSimulatorTable<String> table5 = reteSimulator
+ .addPremise(aPremise);
+ assertEquals(5, table5.getTableNumber());
// ?L listOf ?X.
final AssertConclusion<String> conclusion = new AssertConclusion<String>(
@@ -112,27 +125,26 @@
.getLeftTable();
final MergeTable<String> firstMergeTable = (MergeTable<String>) secondMergeTable
.getLeftTable();
- final AssertedPremiseTable<String> assertedPremiseTable =
- /**/(AssertedPremiseTable<String>) secondMergeTable.getRightTable();
- final BuiltinPremiseTable<String> blankNodePremiseTable =
- /**/(BuiltinPremiseTable<String>) firstMergeTable.getRightTable();
final String[][] expectedEmpty = new String[0][];
assertTableContent(expectedEmpty, firstMergeTable);
assertTableContent(expectedEmpty, secondMergeTable);
assertTableContent(expectedEmpty, thirdMergeTable);
+ assertEquals("", reteSimulator.check(reteRule));
/*
* assert ("a", "prop", "propOfA")
*/
motor.assertFact(new Fact<String>("a", "prop", "propOfA"));
+ table1.setValue(new String[] { "_:0" });
+ table0.addValue(new String[] { "a", "propOfA" });
+ table3.addValue(new String[] { "_:0", "propOfA" });
+ table5.addValue(new String[] { "a", "_:0" });
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(logTable(
- "after assert (\"a\", \"prop\", \"propOfA\")",
- thirdMergeTable, secondMergeTable, firstMergeTable,
- assertedPremiseTable, blankNodePremiseTable));
+ "after assert (\"a\", \"prop\", \"propOfA\")", reteRule));
}
Iterator<IFact<String>> iterator = kb.view(null, "listOf", "a")
.iterator();
@@ -148,17 +160,21 @@
assertTableContent(firstExpected, secondMergeTable);
assertTableContent(firstExpected, thirdMergeTable);
+ assertEquals("", reteSimulator.check(reteRule));
+
/*
* assert ("b", "prop", "propOfB")
*/
motor.assertFact(new Fact<String>("b", "prop", "propOfB"));
+ table1.setValue(new String[] { "_:1" });
+ table0.addValue(new String[] { "b", "propOfB" });
+ table3.addValue(new String[] { "_:1", "propOfB" });
+ table5.addValue(new String[] { "b", "_:1" });
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(logTable(
- "after assert (\"b\", \"prop\", \"propOfB\")",
- thirdMergeTable, secondMergeTable, firstMergeTable,
- assertedPremiseTable, blankNodePremiseTable));
+ "after assert (\"b\", \"prop\", \"propOfB\")", reteRule));
}
iterator = kb.view(null, "listOf", "b").iterator();
assertTrue(iterator.hasNext());
@@ -173,17 +189,20 @@
assertTableContent(secondExpected, secondMergeTable);
assertTableContent(secondExpected, thirdMergeTable);
+ assertEquals("", reteSimulator.check(reteRule));
+
/*
* retract ("a", "prop", "propOfA")
*/
motor.retractFact(new Fact<String>("a", "prop", "propOfA"));
+ table0.removeValue(new String[] { "a", "propOfA" });
+ table3.removeValue(new String[] { "_:0", "propOfA" });
+ table5.removeValue(new String[] { "a", "_:0" });
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(logTable(
- "after retract (\"a\", \"prop\", \"propOfA\")",
- thirdMergeTable, secondMergeTable, firstMergeTable,
- assertedPremiseTable, blankNodePremiseTable));
+ "after retract (\"a\", \"prop\", \"propOfA\")", reteRule));
}
assertFalse(kb.contains("a", "list", firstListId));
final String[][] thirdExpected = new String[][] {
@@ -192,6 +211,7 @@
assertTableContent(thirdExpected, secondMergeTable);
assertTableContent(thirdExpected, thirdMergeTable);
+ assertEquals("", reteSimulator.check(reteRule));
}
private void assertTableContent(final String[][] expected,
@@ -217,35 +237,12 @@
assertEquals("bad list size", expectedLength, count);
}
- private String logTable(final String title,
- final MergeTable<String> thirdMergeTable,
- final MergeTable<String> secondMergeTable,
- final MergeTable<String> firstMergeTable,
- final AssertedPremiseTable<String> assertedPremiseTable,
- final BuiltinPremiseTable<String> blankNodePremiseTable) {
+ private String logTable(final String title, final ReteRule<String> reteRule) {
+ final ReteRuleToString<String> reteRuleToString = new ReteRuleToString<String>();
final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(title);
stringBuilder.append('\n');
- stringBuilder.append(log("blank node premise table",
- blankNodePremiseTable));
- stringBuilder.append(log("first merge table", firstMergeTable));
- stringBuilder
- .append(log("asserted premise table", assertedPremiseTable));
- stringBuilder.append(log("second merge table", secondMergeTable));
- stringBuilder.append(log("third merge table", thirdMergeTable));
+ stringBuilder.append(reteRuleToString.toString(reteRule));
return stringBuilder.toString();
}
-
- private String log(final String title, final ITable<String> table) {
- final StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append(title);
- stringBuilder.append('\n');
- final Iterator<List<String>> iterator = table.iterator();
- while (iterator.hasNext()) {
- final List<String> line = iterator.next();
- stringBuilder.append(line.toString());
- stringBuilder.append('\n');
- }
- return stringBuilder.toString();
- }
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/MockTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -25,6 +25,7 @@
import java.util.Iterator;
import java.util.List;
+import net.sf.reasoner4j.Fortest;
import net.sf.reasoner4j.rete.entity.AbstractTable;
import net.sf.reasoner4j.rete.entity.IVariableTable;
@@ -52,4 +53,11 @@
public Iterator<List<T>> iterator() {
return variableTable.iterator();
}
+
+ @Fortest
+ @Override
+ public void accept(final ITableVisitor<T> visitor) {
+ visitor.beginVisit(this);
+ visitor.endVisit(this);
+ }
}
Added: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java (rev 0)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulator.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.retetest;
+
+import java.util.Deque;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import net.sf.reasoner4j.rete.entity.ITable;
+import net.sf.reasoner4j.rete.entity.ITableVisitor;
+import net.sf.reasoner4j.rete.entity.ReteRule;
+import net.sf.reasoner4j.rule.IPremise;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class ReteSimulator<T> implements ITableVisitor<T> {
+
+ private ReteSimulatorTable<T> rootTable;
+
+ private ReteSimulatorTable<T> currentTable;
+
+ private boolean leftVisited;
+
+ private int tableNumber;
+
+ private StringBuilder stringBuilder;
+
+ private Deque<String> resultStack;
+
+ public ReteSimulatorTable<T> addPremise(final IPremise<T> premise) {
+ final ReteSimulatorTable<T> result = new ReteSimulatorTable<T>(
+ tableNumber++, premise, false);
+ link(result);
+ return result;
+ }
+
+ public ReteSimulatorTable<T> addPremiseBuiltin(final IPremise<T> premise) {
+ final ReteSimulatorTable<T> result = new ReteSimulatorTable<T>(
+ tableNumber++, premise, true);
+ link(result);
+ return result;
+ }
+
+ private void link(final ReteSimulatorTable<T> result) {
+ if (rootTable == null) {
+ rootTable = result;
+ } else {
+ rootTable = new ReteSimulatorTable<T>(tableNumber++, rootTable,
+ result);
+ }
+ }
+
+ public ReteSimulatorTable<T> getRootTable() {
+ return rootTable;
+ }
+
+ public String check(final ReteRule<T> reteRule) {
+ currentTable = null;
+ leftVisited = false;
+ stringBuilder = new StringBuilder();
+ resultStack = new LinkedList<String>();
+ reteRule.accept(this);
+ final String result = stringBuilder.toString();
+ currentTable = null;
+ stringBuilder = null;
+ resultStack = null;
+ return result;
+ }
+
+ @Override
+ public void beginVisit(final ITable<T> table) {
+ if (currentTable == null) {
+ currentTable = rootTable;
+ } else if (leftVisited) {
+ currentTable = currentTable.getRightTable();
+ } else {
+ currentTable = currentTable.getLeftTable();
+ }
+ final Iterator<List<T>> iterator = table.iterator();
+ final String result = currentTable.assertValue(iterator);
+ resultStack.push(result);
+ }
+
+ @Override
+ public void endVisit(final ITable<T> table) {
+ final String result = resultStack.pop();
+ if (result != null) {
+ stringBuilder.append(result);
+ }
+ final ReteSimulatorTable<T> oldCurrentTable = currentTable;
+ currentTable = currentTable.getParentTable();
+ leftVisited = currentTable == null
+ || currentTable.getLeftTable() == oldCurrentTable;
+ }
+}
Added: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTable.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTable.java (rev 0)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTable.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.retetest;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import net.sf.reasoner4j.ReasonerException;
+import net.sf.reasoner4j.rule.IPremise;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class ReteSimulatorTable<T> {
+
+ private ReteSimulatorTable<T> parentTable;
+
+ private final List<String> variableNameList = new ArrayList<String>();
+
+ private final Set<List<T>> valueTable = new HashSet<List<T>>();
+
+ private ReteSimulatorTable<T> leftTable;
+
+ private ReteSimulatorTable<T> rightTable;
+
+ private final int tableNumber;
+
+ private boolean builtin;
+
+ private List<T> settedValues;
+
+ public ReteSimulatorTable(final int tableNumber, final IPremise<T> premise,
+ final boolean builtin) {
+ this.tableNumber = tableNumber;
+ this.builtin = builtin;
+ String variableName = premise.getSubjectVariableName();
+ if (variableName != null) {
+ variableNameList.add(variableName);
+ }
+ variableName = premise.getPredicateVariableName();
+ if (variableName != null) {
+ variableNameList.add(variableName);
+ }
+ variableName = premise.getObjectVariableName();
+ if (variableName != null) {
+ variableNameList.add(variableName);
+ }
+ }
+
+ public ReteSimulatorTable(final int tableNumber,
+ final ReteSimulatorTable<T> leftTable,
+ final ReteSimulatorTable<T> rightTable) {
+ this.tableNumber = tableNumber;
+ this.leftTable = leftTable;
+ this.rightTable = rightTable;
+ leftTable.setParentTable(this);
+ rightTable.setParentTable(this);
+ variableNameList.addAll(leftTable.variableNameList);
+ for (String variableName : rightTable.variableNameList) {
+ if (!variableNameList.contains(variableName)) {
+ variableNameList.add(variableName);
+ }
+ }
+ }
+
+ public int getTableNumber() {
+ return tableNumber;
+ }
+
+ public ReteSimulatorTable<T> getParentTable() {
+ return parentTable;
+ }
+
+ public void setParentTable(final ReteSimulatorTable<T> parentTable) {
+ this.parentTable = parentTable;
+ }
+
+ public ReteSimulatorTable<T> getLeftTable() {
+ return leftTable;
+ }
+
+ public ReteSimulatorTable<T> getRightTable() {
+ return rightTable;
+ }
+
+ public void setValue(final T[] aValues) {
+ if (!builtin) {
+ throw new ReasonerException("only for builtin");
+ }
+ settedValues = toList(aValues);
+ valueTable.add(settedValues);
+ }
+
+ public void addValue(final T[] aValues) {
+ if (builtin) {
+ throw new ReasonerException("not for builtin");
+ }
+ final List<T> values = toList(aValues);
+ addValue(values);
+ }
+
+ private List<T> toList(final T[] aValues) {
+ final List<T> values = new ArrayList<T>(aValues.length);
+ for (T elt : aValues) {
+ values.add(elt);
+ }
+ return values;
+ }
+
+ public void addValue(final List<T> values) {
+ if (valueTable.add(values)) {
+ if (parentTable != null) {
+ parentTable.addValue(this, values);
+ }
+ }
+ }
+
+ public void addValue(final ReteSimulatorTable<T> childTable,
+ final List<T> childValues) {
+ final ReteSimulatorTable<T> otherChildTable;
+ if (childTable == leftTable) {
+ otherChildTable = rightTable;
+ } else {
+ otherChildTable = leftTable;
+ }
+ final List<T> otherChildKey = otherChildKey(childTable, childValues,
+ otherChildTable);
+
+ final Iterator<List<T>> iterator = otherChildTable
+ .select(otherChildKey);
+ while (iterator.hasNext()) {
+ final List<T> otherValue = iterator.next();
+ final List<T> thisValue = thisValue(childTable, childValues,
+ otherChildTable, otherValue);
+ // valueTable.add(thisValue);
+ addValue(thisValue);
+ }
+ }
+
+ public void removeValue(final T[] aValues) {
+ final List<T> values = toList(aValues);
+ removeValue(values);
+ }
+
+ public void removeValue(final List<T> values) {
+ if (valueTable.remove(values)) {
+ if (parentTable != null) {
+ parentTable.removeValue(this, values);
+ }
+ }
+ }
+
+ public void removeValue(final ReteSimulatorTable<T> childTable,
+ final List<T> childValues) {
+ final ReteSimulatorTable<T> otherChildTable;
+ if (childTable == leftTable) {
+ otherChildTable = rightTable;
+ } else {
+ otherChildTable = leftTable;
+ }
+ final List<T> otherChildKey = otherChildKey(childTable, childValues,
+ otherChildTable);
+
+ final Iterator<List<T>> iterator = otherChildTable
+ .removeSelect(otherChildKey);
+ while (iterator.hasNext()) {
+ final List<T> otherValue = iterator.next();
+ final List<T> thisValue = thisValue(childTable, childValues,
+ otherChildTable, otherValue);
+ // valueTable.remove(thisValue);
+ removeValue(thisValue);
+ }
+ }
+
+ private List<T> otherChildKey(final ReteSimulatorTable<T> childTable,
+ final List<T> childValues,
+ final ReteSimulatorTable<T> otherChildTable) {
+ final List<T> otherChildKey = new ArrayList<T>(
+ otherChildTable.variableNameList.size());
+ for (int count = 0; count < otherChildTable.variableNameList.size(); count++) {
+ otherChildKey.add(null);
+ }
+ int otherValueIndex = 0;
+ for (String variableName : otherChildTable.variableNameList) {
+ final int index = childTable.variableNameList.indexOf(variableName);
+ if (index != -1) {
+ otherChildKey.set(otherValueIndex, childValues.get(index));
+ }
+ otherValueIndex++;
+ }
+ return otherChildKey;
+ }
+
+ private List<T> thisValue(final ReteSimulatorTable<T> childTable,
+ final List<T> childValues,
+ final ReteSimulatorTable<T> otherChildTable,
+ final List<T> otherValue) {
+ final List<T> thisValue = new ArrayList<T>(variableNameList.size());
+ for (String variableName : variableNameList) {
+ int index = childTable.variableNameList.indexOf(variableName);
+ if (index == -1) {
+ index = otherChildTable.variableNameList.indexOf(variableName);
+ if (index == -1) {
+ throw new ReasonerException("must found");
+ }
+ thisValue.add(otherValue.get(index));
+ } else {
+ thisValue.add(childValues.get(index));
+ }
+ }
+ return thisValue;
+ }
+
+ private Iterator<List<T>> select(final List<T> key) {
+ return select(key, false);
+ }
+
+ private Iterator<List<T>> removeSelect(final List<T> key) {
+ return select(key, true);
+ }
+
+ private Iterator<List<T>> select(final List<T> key, final boolean remove) {
+ final List<List<T>> selection = new LinkedList<List<T>>();
+ if (builtin && !remove) {
+ if (settedValues != null) {
+ selection.add(settedValues);
+ settedValues = null;
+ }
+ } else {
+ for (List<T> entry : valueTable) {
+ boolean match = true;
+ final Iterator<T> iteratorOnKey = key.iterator();
+ final Iterator<T> iteratorOnEntry = entry.iterator();
+ while (match && iteratorOnEntry.hasNext()) {
+ final T keyElt = iteratorOnKey.next();
+ final T entryElt = iteratorOnEntry.next();
+ if (keyElt != null) {
+ match = keyElt.equals(entryElt);
+ }
+ }
+ if (match) {
+ selection.add(entry);
+ }
+ }
+ if (remove) {
+ valueTable.removeAll(selection);
+ }
+ }
+ return selection.iterator();
+ }
+
+ public boolean assertValue(final T[][] values) {
+ if (values.length != valueTable.size()) {
+ return false;
+ }
+ for (T[] entry : values) {
+ if (!valueTable.contains(toList(entry))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public String assertValue(final Iterator<List<T>> iterator) {
+ final List<List<T>> otherList = new LinkedList<List<T>>();
+ final List<String> diff = new LinkedList<String>();
+ while (iterator.hasNext()) {
+ final List<T> next = iterator.next();
+ if (!valueTable.contains(next)) {
+ diff.add(next.toString() + " not on simulator table");
+ }
+ otherList.add(next);
+ }
+ for (List<T> value : valueTable) {
+ if (!otherList.contains(value)) {
+ diff.add(value.toString() + " not in rete");
+ }
+ }
+ final String result;
+ if (diff.isEmpty()) {
+ result = null;
+ } else {
+ final StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("table #");
+ stringBuilder.append(tableNumber);
+ stringBuilder.append('\n');
+ stringBuilder.append(variableNameList.toString());
+ stringBuilder.append('\n');
+ for (String value : diff) {
+ stringBuilder.append(value);
+ stringBuilder.append('\n');
+ }
+ result = stringBuilder.toString();
+ }
+ return result;
+ }
+
+ public Iterator<List<T>> iterator() {
+ return valueTable.iterator();
+ }
+}
Added: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTest.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTest.java (rev 0)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/retetest/ReteSimulatorTest.java 2010-12-23 18:15:10 UTC (rev 36)
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.retetest;
+
+import junit.framework.TestCase;
+import net.sf.reasoner4j.rule.Premise;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ */
+public class ReteSimulatorTest extends TestCase {
+
+ public void test() {
+ final ReteSimulator<String> reteSimulator = new ReteSimulator<String>();
+ ReteSimulatorTable<String> firstTable = reteSimulator
+ .addPremise(new Premise<String>(
+ /**/null, "subject",
+ /**/"?P", null,
+ /**/null, "object"));
+ ReteSimulatorTable<String> secondTable = reteSimulator
+ .addPremise(new Premise<String>(
+ /**/"?S", null,
+ /**/"?P", null,
+ /**/null, "object"));
+ ReteSimulatorTable<String> rootTable = reteSimulator.getRootTable();
+
+ assertTrue(rootTable.assertValue(new String[][] {}));
+ firstTable.addValue(new String[] { "a" });
+ assertTrue(rootTable.assertValue(new String[][] {}));
+ secondTable.addValue(new String[] { "x", "y" });
+ assertTrue(rootTable.assertValue(new String[][] {}));
+ secondTable.addValue(new String[] { "x", "a" });
+ assertTrue(rootTable.assertValue(new String[][] { { "a", "x" } }));
+ firstTable.addValue(new String[] { "y" });
+ assertTrue(rootTable.assertValue(new String[][] { { "a", "x" },
+ { "y", "x" } }));
+ secondTable.removeValue(new String[] { "x", "a" });
+ assertTrue(rootTable.assertValue(new String[][] { { "y", "x" } }));
+ }
+}
Modified: trunk/reasoner4j/src/test/resources/log4j.properties
===================================================================
--- trunk/reasoner4j/src/test/resources/log4j.properties 2010-12-21 05:45:04 UTC (rev 35)
+++ trunk/reasoner4j/src/test/resources/log4j.properties 2010-12-23 18:15:10 UTC (rev 36)
@@ -19,6 +19,6 @@
log4j.logger.net.sf.joafip.meminspector=warn
log4j.logger.net.sf.joafip.java.util=warn
-#log4j.logger.net.sf.reasoner4j.TestReteTable=debug
+log4j.logger.net.sf.reasoner4j.TestReteTable=debug
#log4j.logger.net.sf.reasoner4j.TestExistential=debug
-log4j.logger.net.sf.reasoner4j.TestBasicInference=debug
\ No newline at end of file
+#log4j.logger.net.sf.reasoner4j.TestBasicInference=debug
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-21 05:45:11
|
Revision: 35
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=35&view=rev
Author: luc_peuvrier
Date: 2010-12-21 05:45:04 +0000 (Tue, 21 Dec 2010)
Log Message:
-----------
added test for default fact and replace builtin, correction done to make it working
Modified Paths:
--------------
trunk/reasoner4j/doc/todo.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java
trunk/reasoner4j/src/test/resources/log4j.properties
Added Paths:
-----------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTableAndDefault.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java
Removed Paths:
-------------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTableAndDefault.java
Modified: trunk/reasoner4j/doc/todo.txt
===================================================================
--- trunk/reasoner4j/doc/todo.txt 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/doc/todo.txt 2010-12-21 05:45:04 UTC (rev 35)
@@ -1,6 +1,9 @@
doc:
-motor#assertFact works has adding rule "true => (x,y,z)"
-
+IMmotor#assertFact IKnowledgeBase#assertFact:
+ works has adding rule "true => (x,y,z)" added fact: this is asserted fact
+IMmotor#retractFact IKnowledgeBase#retractFact and retract conclusion:
+ retract always, do not take care of assertion cause inferred (rules conclusion) or asserted (added in KB)
+inferred fact: asserted as rule conclusion
--------------------------------------------------------------------------------------------------------
IBuitinTermProvider chain
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -50,6 +50,7 @@
public SingleFactSet(final ISubFactSet<T> parentFactSet, final T subject,
final T predicate, final T object) {
super(parentFactSet);
+ assert subject != null && predicate != null && object != null;
this.subject = subject;
this.predicate = predicate;
this.object = object;
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -24,6 +24,7 @@
import java.util.Deque;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -168,6 +169,18 @@
retractedStack.push(fact);
}
+ @Override
+ public void conclusionRetraction(final T subject, final T predicate,
+ final T object, int ruleIdentifier) {
+ final IKnowledgeBase<T> view = allKnowledgeBase.view(subject,
+ predicate, object);
+ final Iterator<IFact<T>> iterator = view.iterator();
+ while (iterator.hasNext()) {
+ conclusionRetraction(new CauseIdentifiedFact<T>(iterator.next(),
+ ruleIdentifier));
+ }
+ }
+
public IFactSet<T> getAllFactSet() {
return allKnowledgeBase.getFactSet();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/IConclusionListener.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -36,4 +36,6 @@
void conclusionRetraction(CauseIdentifiedFact<T> fact);
+ void conclusionRetraction(T subject, T predicate, T object,
+ int ruleIdentifier);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTable.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -37,7 +37,7 @@
*/
public class PremiseVariableTable<T> extends AbstractVariableTable<T> {
- private final IFactSet<T> factSet;
+ protected final IFactSet<T> factSet;
private final IPremise<T> premise;
@@ -105,10 +105,15 @@
} else {
object = iterator.next();
}
- final IFactSet<T> view = factSet.view(subject, predicate, object);
+ final IFactSet<T> view = selectionView(subject, predicate, object);
return new SelectionIterator(view);
}
+ protected IFactSet<T> selectionView(final T subject, final T predicate,
+ final T object) {
+ return factSet.view(subject, predicate, object);
+ }
+
@Override
public Iterator<List<T>> removeSelect(final List<T> key) {
return select(key);
Copied: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTableAndDefault.java (from rev 34, trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTableAndDefault.java)
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTableAndDefault.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/PremiseVariableTableAndDefault.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rete.entity;
+
+import net.sf.reasoner4j.fact.CauseIdentifiedFact;
+import net.sf.reasoner4j.fact.IFactSet;
+import net.sf.reasoner4j.fact.SingleFactSet;
+import net.sf.reasoner4j.rule.AbstractPremiseAndDefault;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class PremiseVariableTableAndDefault<T> extends PremiseVariableTable<T> {
+
+ private final T defaultSubject;
+
+ private final T defaultPredicate;
+
+ private final T defaultObject;
+
+ public PremiseVariableTableAndDefault(
+ final VariableKeyValueMapping<T> mapping,
+ final IFactSet<T> factSet,
+ final AbstractPremiseAndDefault<T> premise) {
+ super(mapping, factSet, premise);
+ defaultSubject = premise.getDefaultSubject();
+ defaultPredicate = premise.getDefaultPredicate();
+ defaultObject = premise.getDefaultObject();
+ }
+
+ @Override
+ protected IFactSet<T> selectionView(final T subject, final T predicate,
+ final T object) {
+ IFactSet<T> view = factSet.view(subject, predicate, object);
+ if (view.isEmpty()) {
+ T dsubject = subject == null ? defaultSubject : subject;
+ T dpredicate = predicate == null ? defaultPredicate : predicate;
+ T dobject = object == null ? defaultObject : object;
+ // FIXMELUC a local minimum implementation of fact set
+ view = new SingleFactSet<T>(null, dsubject, dpredicate, dobject);
+ view.addFact(new CauseIdentifiedFact<T>(dsubject, dpredicate,
+ dobject, 0/*
+ * 0 as dummy value , fact not in knowledge base
+ */), false);
+ }
+ return view;
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -66,15 +66,16 @@
} else {
objectOfToRetract = createFact.getObject();
}
- listener.conclusionRetraction(new CauseIdentifiedFact<T>(
- subjectOfToRetract, predicateOfToRetract, objectOfToRetract,
- ruleIdentifier));
+ listener.conclusionRetraction(subjectOfToRetract, predicateOfToRetract,
+ objectOfToRetract, ruleIdentifier);
listener.conclusionAssertion(createFact);
}
@Override
public void removed(final List<T> variableValueSet) {
- final CauseIdentifiedFact<T> createFact = createFact(variableValueSet);
- listener.conclusionRetraction(createFact);
+ // FIXMELUC since asserted is always new, retract always fail
+ // final CauseIdentifiedFact<T> createFact =
+ // createFact(variableValueSet);
+ // listener.conclusionRetraction(createFact);
}
}
Deleted: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTableAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTableAndDefault.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/VariableTableAndDefault.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -1,54 +0,0 @@
-/*
- * Copyright 2010 Luc Peuvrier
- *
- * This file is a part of reasoner4j.
- *
- * reasoner4j is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License.
- *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
- * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.gnu.org/licenses/lgpl.html
- *
- * reasoner4j is distributed in the hope that it will be useful, but
- * unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.reasoner4j.rete.entity;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- *
- * @author luc peuvrier
- *
- * @param <T>
- */
-public class VariableTableAndDefault<T> extends VariableTable<T> {
-
- private final Set<List<T>> defaultSet = new HashSet<List<T>>();
-
- public VariableTableAndDefault(final VariableKeyValueMapping<T> mapping,
- final List<T> defaultIndextedValue) {
- super(mapping);
- defaultSet.add(defaultIndextedValue);
- }
-
- @Override
- public Iterator<List<T>> select(List<T> key) {
- Set<List<T>> valueListForKey = table.get(key);
- if (valueListForKey == null) {
- valueListForKey = defaultSet;
- }
- return new SelectionIterator(key, valueListForKey);
- }
-}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/service/PremiseTableFactory.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -31,10 +31,10 @@
import net.sf.reasoner4j.rete.entity.PremiseTableNotListening;
import net.sf.reasoner4j.rete.entity.PremiseVariableTable;
import net.sf.reasoner4j.rete.entity.VariableKeyValueMapping;
-import net.sf.reasoner4j.rete.entity.VariableTableAndDefault;
+import net.sf.reasoner4j.rete.entity.PremiseVariableTableAndDefault;
+import net.sf.reasoner4j.rule.AbstractPremiseAndDefault;
import net.sf.reasoner4j.rule.EnumPremiseType;
import net.sf.reasoner4j.rule.IPremise;
-import net.sf.reasoner4j.rule.PremiseAndDefault;
/**
*
@@ -58,14 +58,18 @@
final IVariableTable<T> variableTable;
if (EnumPremiseType.DEFAULT.equals(premise.getType())) {
List<T> defaultValue = new ArrayList<T>(3);
- final PremiseAndDefault<T> premiseAndDefault = (PremiseAndDefault<T>) premise;
- defaultValue.add(premiseAndDefault.getDefaultSubject());
- defaultValue.add(premiseAndDefault.getDefaultPredicate());
- defaultValue.add(premiseAndDefault.getDefaultObject());
- final List<T> defaultIndexedValue = mapping
- .createIndexedValue(defaultValue);
- variableTable = new VariableTableAndDefault<T>(mapping,
- defaultIndexedValue);
+ final AbstractPremiseAndDefault<T> premiseAndDefault = (AbstractPremiseAndDefault<T>) premise;
+ if (premiseAndDefault.getSubjectVariableName() != null) {
+ defaultValue.add(premiseAndDefault.getDefaultSubject());
+ }
+ if (premiseAndDefault.getPredicateVariableName() != null) {
+ defaultValue.add(premiseAndDefault.getDefaultPredicate());
+ }
+ if (premiseAndDefault.getObjectVariableName() != null) {
+ defaultValue.add(premiseAndDefault.getDefaultObject());
+ }
+ variableTable = new PremiseVariableTableAndDefault<T>(mapping,
+ view, premiseAndDefault);
} else {
variableTable = new PremiseVariableTable<T>(mapping, view, premise);
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractPremiseAndDefault.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ */
+public abstract class AbstractPremiseAndDefault<T> extends AbstractPremise<T> {
+
+ private final T defaultSubject;
+
+ private final T defaultPredicate;
+
+ private final T defaultObject;
+
+ public AbstractPremiseAndDefault(final String subjectVariableName,
+ final T subject, final T defaultSubject,
+ final String predicateVariableName, final T predicate,
+ final T defaultPredicate, final String objectVariableName,
+ final T object, final T defaultObject, final boolean listening) {
+ super(EnumPremiseType.DEFAULT, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object,
+ listening);
+ this.defaultSubject = defaultSubject;
+ this.defaultPredicate = defaultPredicate;
+ this.defaultObject = defaultObject;
+ }
+
+ public T getDefaultSubject() {
+ return defaultSubject;
+ }
+
+ public T getDefaultPredicate() {
+ return defaultPredicate;
+ }
+
+ public T getDefaultObject() {
+ return defaultObject;
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefault.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -28,36 +28,15 @@
*
* @param <T>
*/
-public class PremiseAndDefault<T> extends AbstractPremise<T> {
+public class PremiseAndDefault<T> extends AbstractPremiseAndDefault<T> {
- private final T defaultSubject;
-
- private final T defaultPredicate;
-
- private final T defaultObject;
-
public PremiseAndDefault(final String subjectVariableName, final T subject,
final T defaultSubject, final String predicateVariableName,
final T predicate, final T defaultPredicate,
final String objectVariableName, final T object,
final T defaultObject) {
- super(EnumPremiseType.DEFAULT, subjectVariableName, subject,
- predicateVariableName, predicate, objectVariableName, object,
- true);
- this.defaultSubject = defaultSubject;
- this.defaultPredicate = defaultPredicate;
- this.defaultObject = defaultObject;
+ super(subjectVariableName, subject, defaultSubject,
+ predicateVariableName, predicate, defaultPredicate,
+ objectVariableName, object, defaultObject, true);
}
-
- public T getDefaultSubject() {
- return defaultSubject;
- }
-
- public T getDefaultPredicate() {
- return defaultPredicate;
- }
-
- public T getDefaultObject() {
- return defaultObject;
- }
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/PremiseAndDefaultNotListening.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -28,36 +28,16 @@
*
* @param <T>
*/
-public class PremiseAndDefaultNotListening<T> extends AbstractPremise<T> {
+public class PremiseAndDefaultNotListening<T> extends
+ AbstractPremiseAndDefault<T> {
- private final T defaultSubject;
-
- private final T defaultPredicate;
-
- private final T defaultObject;
-
public PremiseAndDefaultNotListening(final String subjectVariableName,
final T subject, final T defaultSubject,
final String predicateVariableName, final T predicate,
final T defaultPredicate, final String objectVariableName,
final T object, final T defaultObject) {
- super(EnumPremiseType.DEFAULT, subjectVariableName, subject,
- predicateVariableName, predicate, objectVariableName, object,
- false);
- this.defaultSubject = defaultSubject;
- this.defaultPredicate = defaultPredicate;
- this.defaultObject = defaultObject;
+ super(subjectVariableName, subject, defaultSubject,
+ predicateVariableName, predicate, defaultPredicate,
+ objectVariableName, object, defaultObject, false);
}
-
- public T getDefaultSubject() {
- return defaultSubject;
- }
-
- public T getDefaultPredicate() {
- return defaultPredicate;
- }
-
- public T getDefaultObject() {
- return defaultObject;
- }
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -23,8 +23,12 @@
package net.sf.reasoner4j;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
+import org.apache.log4j.Logger;
+
+import net.sf.reasoner4j.builtin.impl.AbstractBuiltin;
import net.sf.reasoner4j.fact.Fact;
import net.sf.reasoner4j.fact.IFact;
import net.sf.reasoner4j.kb.IKnowledgeBase;
@@ -34,6 +38,8 @@
import net.sf.reasoner4j.rule.AssertConclusion;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
+import net.sf.reasoner4j.rule.PremiseAndDefaultNotListening;
+import net.sf.reasoner4j.rule.ReplaceConclusion;
import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
@@ -44,6 +50,9 @@
*/
public class TestBasicInference extends AbstractTestCase {
+ private static final Logger LOGGER = Logger
+ .getLogger(TestBasicInference.class);
+
/**
* test one conclusion for one premise<br>
* ( ?A "x" ?B ) imply ( ?A "has" "x" )
@@ -246,4 +255,74 @@
assertNull(kb.get("food", "available", "gateau"));
}
+ private class IncrementBuiltin extends AbstractBuiltin<String> {
+ public IncrementBuiltin() {
+ super(null, "increment", null);
+ }
+
+ @Override
+ public IFact<String> compute(final int ruleIdentifier,
+ final String subject, final String predicate,
+ final String object) {
+ return new Fact<String>(subject, predicate,
+ Integer.toString(Integer.parseInt(subject) + 1));
+ }
+ }
+
+ public void testDefaultPremiseAndReplaceConclusion() {
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this, this);
+ motor.addBuiltin(new IncrementBuiltin());
+ // first rule
+ Rule<String> rule = new Rule<String>();
+ IPremise<String> premise = new Premise<String>(
+ /* subject */"?X", null,
+ /* predicate */null, "state",
+ /* object */null, "ko");
+ rule.addPremise(premise);
+ premise = new PremiseAndDefaultNotListening<String>(
+ /* subject */"?X", null, null,
+ /* predicate */null, "koCount", null,
+ /* object */"?C", null, "0");
+ rule.addPremise(premise);
+ premise = new Premise<String>(
+ /* subject */"?C", null,
+ /* predicate */null, "increment",
+ /* object */"?NC", null);
+ rule.addPremise(premise);
+
+ ReplaceConclusion<String> conclusion = new ReplaceConclusion<String>(
+ /* subject */"?X", null, false,
+ /* predicate */null, "koCount", false,
+ /* object */"?NC", null, true);
+ rule.addConclusion(conclusion);
+ motor.addRule(rule);
+
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("first ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "1"));
+ motor.retractFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("ko retract", kb);
+ motor.assertFact(new Fact<String>("myCar", "state", "ko"));
+ logKoCount("second ko assert", kb);
+ assertNotNull(kb.get("myCar", "koCount", "2"));
+ assertNull(kb.get("myCar", "koCount", "1"));
+ }
+
+ private void logKoCount(final String title, final IKnowledgeBase<String> kb) {
+ if (LOGGER.isDebugEnabled()) {
+ final Iterator<IFact<String>> iterator = kb.view("myCar",
+ "koCount", null).iterator();
+ final StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append(title);
+ stringBuilder.append('\n');
+ while (iterator.hasNext()) {
+ stringBuilder.append(iterator.next());
+ stringBuilder.append('\n');
+ }
+ LOGGER.debug(stringBuilder.toString());
+ }
+ }
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/rete/entity/TestConclusionNotifier.java 2010-12-21 05:45:04 UTC (rev 35)
@@ -96,4 +96,10 @@
public void conclusionRetraction(final CauseIdentifiedFact<String> fact) {
retractedFact = fact.getFact();
}
+
+ @Override
+ public void conclusionRetraction(String subject, String predicate,
+ String object, int ruleIdentifier) {
+ // FIXMELUC test with replacement conclusion
+ }
}
Modified: trunk/reasoner4j/src/test/resources/log4j.properties
===================================================================
--- trunk/reasoner4j/src/test/resources/log4j.properties 2010-12-20 19:19:29 UTC (rev 34)
+++ trunk/reasoner4j/src/test/resources/log4j.properties 2010-12-21 05:45:04 UTC (rev 35)
@@ -19,5 +19,6 @@
log4j.logger.net.sf.joafip.meminspector=warn
log4j.logger.net.sf.joafip.java.util=warn
-log4j.logger.net.sf.reasoner4j.TestReteTable=debug
-log4j.logger.net.sf.reasoner4j.TestExistential=debug
\ No newline at end of file
+#log4j.logger.net.sf.reasoner4j.TestReteTable=debug
+#log4j.logger.net.sf.reasoner4j.TestExistential=debug
+log4j.logger.net.sf.reasoner4j.TestBasicInference=debug
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luc...@us...> - 2010-12-20 19:19:37
|
Revision: 34
http://reasoner4j.svn.sourceforge.net/reasoner4j/?rev=34&view=rev
Author: luc_peuvrier
Date: 2010-12-20 19:19:29 +0000 (Mon, 20 Dec 2010)
Log Message:
-----------
retract conclusion added, tests ok
Modified Paths:
--------------
trunk/reasoner4j/doc/builtin.txt
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertConclusion.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IConclusion.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/ReplaceConclusion.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
Added Paths:
-----------
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractConclusion.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumConclusionType.java
trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/RetractConclusion.java
Modified: trunk/reasoner4j/doc/builtin.txt
===================================================================
--- trunk/reasoner4j/doc/builtin.txt 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/doc/builtin.txt 2010-12-20 19:19:29 UTC (rev 34)
@@ -38,6 +38,24 @@
---------------------------------------------------------------------------------------------------------
+retract:
+--------
+
+:Food :available :saucisson .
+:Food :available :patates .
+:Food :available "gateau" .
+
+{
+ ?X :eats ?F
+} => {
+ _:d kb:retract ( :Food :available ?F ) .
+} .
+
+:theCat :eats :saucisson .
+:theDog :eats "gateau" .
+
+---------------------------------------------------------------------------------------------------------
+
find all:
---------
@@ -75,7 +93,7 @@
?CN consumerType ?CT.
?CT value ?V
?V mathNotLessThan ?VOFCNP .
- ?CNP list ?L. <-- asserted, create ?L if not exists also listen * list *
+ ?CNP list ?L. <--not listen, default value: create ?L if not exists also listen * list *
?CN number ?N.
# ((?N) ?L ) listAppend ?NEWL.
?LN listFirst ?N <-- asserted
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/fact/SingleFactSet.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -26,6 +26,9 @@
import java.util.Set;
import java.util.TreeSet;
+import net.sf.reasoner4j.ReasonerException;
+import net.sf.reasoner4j.rete.entity.ReteRule;
+
/**
*
* @author luc peuvrier
@@ -93,6 +96,9 @@
}
private void addRuleIdentifier(final int ruleIdentifier) {
+ if (ruleIdentifier == ReteRule.ANY_CAUSE_RULE_IDENTIFIER) {
+ throw new ReasonerException("bad rule identifier");
+ }
if (ruleIdentifierSet == null) {
ruleIdentifierSet = new TreeSet<Integer>();
}
@@ -116,14 +122,24 @@
final boolean removed;
if (this.fact == null) {
removed = false;
- } else if (removeRuleIdentifier(causeIdentifiedFact.getRuleIdentifier())) {
- this.fact = null;
- removed = true;
- if (doFire) {
- fireRetracted(this);
+ } else {
+ final int ruleIdentifier = causeIdentifiedFact.getRuleIdentifier();
+ final boolean remove;
+ if (ruleIdentifier == ReteRule.ANY_CAUSE_RULE_IDENTIFIER) {
+ ruleIdentifierSet.clear();
+ remove = true;
+ } else {
+ remove = removeRuleIdentifier(ruleIdentifier);
}
- } else {
- removed = false;
+ if (remove) {
+ this.fact = null;
+ removed = true;
+ if (doFire) {
+ fireRetracted(this);
+ }
+ } else {
+ removed = false;
+ }
}
return removed;
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/kb/AbstractKnowledgeBase.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -31,6 +31,7 @@
import net.sf.reasoner4j.fact.IFactSet;
import net.sf.reasoner4j.fact.IFactSetListener;
import net.sf.reasoner4j.motor.Motor;
+import net.sf.reasoner4j.rete.entity.ReteRule;
/**
*
@@ -77,12 +78,14 @@
}
public void assertFact(final IFact<T> fact) {
- factSet.assertFact(new CauseIdentifiedFact<T>(fact, Integer.MIN_VALUE));
+ factSet.assertFact(new CauseIdentifiedFact<T>(fact,
+ ReteRule.ADDED_FACT_RULE_IDENTIFIER));
motor.updateKnowledgeBaseWithConclusion();
}
public void retractFact(final IFact<T> fact) {
- factSet.retractFact(new CauseIdentifiedFact<T>(fact, Integer.MIN_VALUE));
+ factSet.retractFact(new CauseIdentifiedFact<T>(fact,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
motor.updateKnowledgeBaseWithConclusion();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/motor/Motor.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -133,14 +133,14 @@
@Override
public void assertFact(final IFact<T> fact) {
allKnowledgeBase.assertFactInFactSet(new CauseIdentifiedFact<T>(fact,
- Integer.MIN_VALUE));
+ ReteRule.ADDED_FACT_RULE_IDENTIFIER));
updateKnowledgeBaseWithConclusion();
}
@Override
public void retractFact(final IFact<T> fact) {
allKnowledgeBase.retractFactInFactSet(new CauseIdentifiedFact<T>(fact,
- Integer.MIN_VALUE));
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
updateKnowledgeBaseWithConclusion();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AbstractConclusionNotifier.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -45,9 +45,9 @@
/** table to fact mapping */
private final int[] mapping;
- protected final int ruleIndetifier;
+ protected final int ruleIdentifier;
- public AbstractConclusionNotifier(final int ruleIndetifier,
+ public AbstractConclusionNotifier(final int ruleIdentifier,
final ITable<T> table, final IConclusion<T> conclusion,
final int[] mapping, final IConclusionListener<T> listener) {
super();
@@ -55,10 +55,15 @@
this.listener = listener;
this.conclusion = conclusion;
this.mapping = mapping;
- this.ruleIndetifier = ruleIndetifier;
+ this.ruleIdentifier = ruleIdentifier;
}
protected CauseIdentifiedFact<T> createFact(final List<T> variableValueSet) {
+ return createFact(variableValueSet, ruleIdentifier);
+ }
+
+ protected CauseIdentifiedFact<T> createFact(final List<T> variableValueSet,
+ final int ruleIdentifier) {
try {
int index = 0;
final T subject;
@@ -80,7 +85,7 @@
object = variableValueSet.get(mapping[index++]);
}
return new CauseIdentifiedFact<T>(new Fact<T>(subject, predicate,
- object), ruleIndetifier);
+ object), ruleIdentifier);
} catch (Exception e) {
throw new ReasonerException("for conclusion " + conclusion, e);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/AssertConclusionNotifier.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -34,10 +34,10 @@
*/
public class AssertConclusionNotifier<T> extends AbstractConclusionNotifier<T> {
- public AssertConclusionNotifier(final int ruleIndetifier,
+ public AssertConclusionNotifier(final int ruleIdentifier,
final ITable<T> table, final IConclusion<T> conclusion,
final int[] mapping, final IConclusionListener<T> listener) {
- super(ruleIndetifier, table, conclusion, mapping, listener);
+ super(ruleIdentifier, table, conclusion, mapping, listener);
}
@Override
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReplaceConclusionNotifier.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -37,11 +37,11 @@
private final ReplaceConclusion<T> replaceConclusion;
- public ReplaceConclusionNotifier(final int ruleIndetifier,
+ public ReplaceConclusionNotifier(final int ruleIdentifier,
final ITable<T> table,
final ReplaceConclusion<T> replaceConclusion, final int[] mapping,
final IConclusionListener<T> listener) {
- super(ruleIndetifier, table, replaceConclusion, mapping, listener);
+ super(ruleIdentifier, table, replaceConclusion, mapping, listener);
this.replaceConclusion = replaceConclusion;
}
@@ -68,7 +68,7 @@
}
listener.conclusionRetraction(new CauseIdentifiedFact<T>(
subjectOfToRetract, predicateOfToRetract, objectOfToRetract,
- ruleIndetifier));
+ ruleIdentifier));
listener.conclusionAssertion(createFact);
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/ReteRule.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -36,8 +36,14 @@
*/
public class ReteRule<T> {
- private static int nextIdentifier = 0;
+ private static final int INITIAL_RULE_IDENTIFIER = 0;
+ public static final int ADDED_FACT_RULE_IDENTIFIER = -1;
+
+ public static final int ANY_CAUSE_RULE_IDENTIFIER = Integer.MIN_VALUE;
+
+ private static int nextIdentifier = INITIAL_RULE_IDENTIFIER;
+
private final int identifier;
private final Rule<T> rule;
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rete/entity/RetractConclusionNotifier.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rete.entity;
+
+import java.util.List;
+
+import net.sf.reasoner4j.rule.IConclusion;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class RetractConclusionNotifier<T> extends AbstractConclusionNotifier<T> {
+
+ public RetractConclusionNotifier(final int ruleIdentifier,
+ final ITable<T> table, final IConclusion<T> conclusion,
+ final int[] mapping, final IConclusionListener<T> listener) {
+ super(ruleIdentifier, table, conclusion, mapping, listener);
+ }
+
+ @Override
+ public void added(final List<T> variableValueSet) {
+ listener.conclusionRetraction(createFact(variableValueSet,
+ ReteRule.ANY_CAUSE_RULE_IDENTIFIER));
+ }
+
+ @Override
+ public void removed(final List<T> variableValueSet) {
+ // notify nothing
+ }
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/retemgr/service/ReteBuilder.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -40,6 +40,7 @@
import net.sf.reasoner4j.rete.entity.PremiseTable;
import net.sf.reasoner4j.rete.entity.ReplaceConclusionNotifier;
import net.sf.reasoner4j.rete.entity.ReteRule;
+import net.sf.reasoner4j.rete.entity.RetractConclusionNotifier;
import net.sf.reasoner4j.rete.entity.TableSourceDestinationMapping;
import net.sf.reasoner4j.rete.entity.VariableKeyValueMapping;
import net.sf.reasoner4j.rete.service.MergeTableFactory;
@@ -175,13 +176,23 @@
final int[] mapping = conclusionReteNode.getMapping();
@SuppressWarnings("unused")
final IConclusionNotifier<T> conclusionNotifier;
- if (conclusion.isReplacement()) {
+ switch (conclusion.getType()) {
+ case ASSERT:
+ conclusionNotifier = new AssertConclusionNotifier<T>(
+ reteRule.getIdentifier(), table, conclusion, mapping, motor);
+ break;
+ case RETRACT:
+ conclusionNotifier = new RetractConclusionNotifier<T>(
+ reteRule.getIdentifier(), table, conclusion, mapping, motor);
+ break;
+ case REPLACE:
conclusionNotifier = new ReplaceConclusionNotifier<T>(
reteRule.getIdentifier(), table,
(ReplaceConclusion<T>) conclusion, mapping, motor);
- } else {
- conclusionNotifier = new AssertConclusionNotifier<T>(
- reteRule.getIdentifier(), table, conclusion, mapping, motor);
+ break;
+ default:
+ throw new ReasonerException("do not manage conclusion type "
+ + conclusion.getType());
}
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractConclusion.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AbstractConclusion.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class AbstractConclusion<T> extends AbstractRuleTriple<T> implements
+ IConclusion<T> {
+
+ private final EnumConclusionType type;
+
+ public AbstractConclusion(final EnumConclusionType type,
+ final String subjectVariableName, final T subject,
+ final String predicateVariableName, final T predicate,
+ final String objectVariableName, final T object) {
+ super(subjectVariableName, subject, predicateVariableName, predicate,
+ objectVariableName, object);
+ this.type = type;
+ }
+
+ @Override
+ public EnumConclusionType getType() {
+ return type;
+ }
+
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertConclusion.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/AssertConclusion.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -28,18 +28,12 @@
*
* @param <T>
*/
-public class AssertConclusion<T> extends AbstractRuleTriple<T> implements
- IConclusion<T> {
+public class AssertConclusion<T> extends AbstractConclusion<T> {
public AssertConclusion(final String subjectVariableName, final T subject,
final String predicateVariableName, final T predicate,
final String objectVariableName, final T object) {
- super(subjectVariableName, subject, predicateVariableName, predicate,
- objectVariableName, object);
+ super(EnumConclusionType.ASSERT, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object);
}
-
- @Override
- public boolean isReplacement() {
- return false;
- }
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumConclusionType.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumConclusionType.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/EnumConclusionType.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ */
+public enum EnumConclusionType {
+
+ /**
+ *
+ */
+ ASSERT,
+ /**
+ *
+ */
+ RETRACT,
+ /**
+ *
+ */
+ REPLACE;
+}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IConclusion.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/IConclusion.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -31,11 +31,11 @@
*/
public interface IConclusion<T> extends IFact<T> {
+ EnumConclusionType getType();
+
String getSubjectVariableName();
String getPredicateVariableName();
String getObjectVariableName();
-
- boolean isReplacement();
}
Modified: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/ReplaceConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/ReplaceConclusion.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/ReplaceConclusion.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -28,8 +28,7 @@
*
* @param <T>
*/
-public class ReplaceConclusion<T> extends AbstractRuleTriple<T> implements
- IConclusion<T> {
+public class ReplaceConclusion<T> extends AbstractConclusion<T> {
private final boolean subjectReplacement;
@@ -43,18 +42,13 @@
final boolean predicateReplacement,
final String objectVariableName, final T object,
final boolean objectReplacement) {
- super(subjectVariableName, subject, predicateVariableName, predicate,
- objectVariableName, object);
+ super(EnumConclusionType.REPLACE, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object);
this.subjectReplacement = subjectReplacement;
this.predicateReplacement = predicateReplacement;
this.objectReplacement = objectReplacement;
}
- @Override
- public boolean isReplacement() {
- return true;
- }
-
public boolean isSubjectReplacement() {
return subjectReplacement;
}
Added: trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/RetractConclusion.java
===================================================================
--- trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/RetractConclusion.java (rev 0)
+++ trunk/reasoner4j/src/main/java/net/sf/reasoner4j/rule/RetractConclusion.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2010 Luc Peuvrier
+ *
+ * This file is a part of reasoner4j.
+ *
+ * reasoner4j is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * reasoner4j is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.reasoner4j.rule;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ * @param <T>
+ */
+public class RetractConclusion<T> extends AbstractConclusion<T> {
+
+ public RetractConclusion(final String subjectVariableName, final T subject,
+ final String predicateVariableName, final T predicate,
+ final String objectVariableName, final T object) {
+ super(EnumConclusionType.RETRACT, subjectVariableName, subject,
+ predicateVariableName, predicate, objectVariableName, object);
+ }
+}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestBasicInference.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -34,6 +34,7 @@
import net.sf.reasoner4j.rule.AssertConclusion;
import net.sf.reasoner4j.rule.IPremise;
import net.sf.reasoner4j.rule.Premise;
+import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
/**
@@ -154,6 +155,17 @@
}
}
+ private List<IFact<String>> createFactList(
+ final IFact<String> rabbitIsAnimalFact,
+ final IFact<String> rabbitEatSaladFact,
+ final IFact<String> saladIsVegetableFact) {
+ final List<IFact<String>> list = new ArrayList<IFact<String>>(3);
+ list.add(rabbitIsAnimalFact);
+ list.add(rabbitEatSaladFact);
+ list.add(saladIsVegetableFact);
+ return list;
+ }
+
public void testSameConclusion() {
final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
final MotorFactory<String> motorFactory = new MotorFactory<String>();
@@ -200,14 +212,38 @@
assertNull(kb.get("myCar", "state", "ko"));
}
- private List<IFact<String>> createFactList(
- final IFact<String> rabbitIsAnimalFact,
- final IFact<String> rabbitEatSaladFact,
- final IFact<String> saladIsVegetableFact) {
- final List<IFact<String>> list = new ArrayList<IFact<String>>(3);
- list.add(rabbitIsAnimalFact);
- list.add(rabbitEatSaladFact);
- list.add(saladIsVegetableFact);
- return list;
+ public void testRetract() {
+ final MainKnowledgeBaseFactory<String> kbFactory = new MainKnowledgeBaseFactory<String>();
+ final MotorFactory<String> motorFactory = new MotorFactory<String>();
+ final IKnowledgeBase<String> kb = kbFactory.create();
+ final IMotor<String> motor = motorFactory.create(kb, this);
+ Rule<String> rule = new Rule<String>();
+ final IPremise<String> premise = new Premise<String>(
+ /* subject */"?X", null,
+ /* predicate */null, "eats",
+ /* object */"?F", null);
+ rule.addPremise(premise);
+ RetractConclusion<String> conclusion = new RetractConclusion<String>(
+ /* subject */null, "food",
+ /* predicate */null, "available",
+ /* object */"?F", null);
+ rule.addConclusion(conclusion);
+ motor.addRule(rule);
+
+ motor.assertFact(new Fact<String>("food", "available", "saucisson"));
+ motor.assertFact(new Fact<String>("food", "available", "patates"));
+ motor.assertFact(new Fact<String>("food", "available", "gateau"));
+
+ assertNotNull(kb.get("food", "available", "saucisson"));
+ assertNotNull(kb.get("food", "available", "patates"));
+ assertNotNull(kb.get("food", "available", "gateau"));
+
+ motor.assertFact(new Fact<String>("theCat", "eats", "saucisson"));
+ motor.assertFact(new Fact<String>("theDog", "eats", "gateau"));
+
+ assertNull(kb.get("food", "available", "saucisson"));
+ assertNotNull(kb.get("food", "available", "patates"));
+ assertNull(kb.get("food", "available", "gateau"));
}
+
}
Modified: trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java
===================================================================
--- trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-20 17:48:33 UTC (rev 33)
+++ trunk/reasoner4j/src/test/java/net/sf/reasoner4j/TestReasoner.java 2010-12-20 19:19:29 UTC (rev 34)
@@ -54,6 +54,7 @@
import net.sf.reasoner4j.rule.PremiseAndDefaultNotListening;
import net.sf.reasoner4j.rule.PremiseNotListening;
import net.sf.reasoner4j.rule.ReplaceConclusion;
+import net.sf.reasoner4j.rule.RetractConclusion;
import net.sf.reasoner4j.rule.Rule;
/**
@@ -120,6 +121,8 @@
addAssertedPremise(currentRule, definition);
} else if ("Conclusion".equals(definition[0])) {
addConclussion(currentRule, definition);
+ } else if ("RetractConclusion".equals(definition[0])) {
+ addRetractConclussion(currentRule, definition);
} else if ("ReplaceConclusion".equals(definition[0])) {
addReplaceConclussion(currentRule, definition);
} else if ("AssertFact".equals(definition[0])) {
@@ -268,6 +271,16 @@
currentRule.addConclusion(conclusion);
}
+ private void addRetractConclussion(final Rule<String> currentRule,
+ final String[] definition) {
+ final String[] params = getParams(definition);
+ final RetractConclusion<String> conclusion = new RetractConclusion<String>(
+ /* subject */params[0], params[1],
+ /* predicate */params[2], params[3],
+ /* object */params[4], params[5]);
+ currentRule.addConclusion(conclusion);
+ }
+
private void addReplaceConclussion(final Rule<String> currentRule,
final String[] definition) {
final String[] params = getParams(definition);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|