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