[Reasoner4j-user] SF.net SVN: reasoner4j:[35] trunk/reasoner4j
Status: Pre-Alpha
Brought to you by:
luc_peuvrier
|
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.
|