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