Mentions légales du service

Skip to content
Snippets Groups Projects
Commit c2724c3f authored by CHAROENSIT Akira's avatar CHAROENSIT Akira
Browse files

Dynamic rule transformer in progress

parent e3a6b257
No related branches found
No related tags found
1 merge request!68Resolve "add explanation module"
Pipeline #1122950 failed
package fr.boreal.explanation.kb_gri.explainers;
import fr.boreal.explanation.api.explainers.AtomicQueryExplainer;
import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
import fr.boreal.explanation.api.solver.Solver;
import fr.boreal.explanation.configuration.DefaultChaseForExplanations;
import fr.boreal.explanation.kb_gri.rule_transformation.dynamic_gri.DynamicGRIRuleTransformer;
import fr.boreal.explanation.kb_gri.rule_transformation.static_gri.StaticGRIRuleTransformer;
import fr.boreal.explanation.solving_enumerating.marco.MARCOGMUSSolver;
import fr.boreal.forward_chaining.chase.Chase;
import fr.boreal.model.kb.api.KnowledgeBase;
import fr.boreal.model.kb.api.RuleBase;
import fr.boreal.model.kb.impl.KnowledgeBaseImpl;
import fr.boreal.model.logicalElements.api.Atom;
import fr.boreal.model.logicalElements.impl.AtomImpl;
import java.util.Set;
public abstract class AbstractDynamicGRIBasedExplainer_KBGRI<ExplanationType> implements AtomicQueryExplainer<ExplanationType> {
/*
* The rulebase used to build the GRI
*/
private final RuleBase transformedRB;
/*
* A KB whose factbase will contain the GRI and whose rulebase is the transformedRB
*/
protected KnowledgeBase downwardClosure;
/**
* The chase object used to compute the GRI, so that it can be reused for tracing.
*/
protected Chase griKBChase;
/**
* Sets the initial KB and compute the GRI
*
* @param kb the current kb
*/
public AbstractDynamicGRIBasedExplainer_KBGRI(KnowledgeBase kb, Atom query) {
DefaultChaseForExplanations.chase(kb);
DynamicGRIRuleTransformer ruleTransformer = new DynamicGRIRuleTransformer(query);
this.transformedRB = ruleTransformer.createTransformedRB(kb);
this.downwardClosure = new KnowledgeBaseImpl(kb.getFactBase(), transformedRB);
}
/**
* Saturates the GRI with Tracing rules to compute relevant atoms and triggers for the query.
* Then calls the solver.
*
* @param query
* @return
*/
public Set<ExplanationType> getAllExplanations(Atom query) {
Atom queryWithFuncId = StaticGRIRuleTransformer.instance().createAtomWithStoredFnTermIdentifier(query);
if (!downwardClosure.getFactBase().contains(queryWithFuncId)) {
return Set.of();
}
// add seed atom to the factbase
Atom RELquery = new AtomImpl(StaticGRIRuleTransformer.REL, StaticGRIRuleTransformer.createFnTermIdentifier(query));
downwardClosure.getFactBase().add(RELquery);
// chase only with the tracing rules
griKBChase = DefaultChaseForExplanations.chase(downwardClosure.getFactBase(),this.transformedRB);
griKBChase.execute();
return getGMUSProcessor(new MARCOGMUSSolver()).computeAllExplanations(downwardClosure, query, null);
}
abstract ExplanationProcessor_GRI getGMUSProcessor(Solver solver);
// abstract RuleTransformer getRuleTransformer();
}
...@@ -19,7 +19,6 @@ import java.util.Set; ...@@ -19,7 +19,6 @@ import java.util.Set;
public abstract class AbstractStaticGRIBasedExplainer_KBGRI<ExplanationType> implements AtomicQueryExplainer<ExplanationType> { public abstract class AbstractStaticGRIBasedExplainer_KBGRI<ExplanationType> implements AtomicQueryExplainer<ExplanationType> {
private final RuleBase originalRB;
/* /*
* The rulebase used to build the GRI * The rulebase used to build the GRI
...@@ -47,7 +46,6 @@ public abstract class AbstractStaticGRIBasedExplainer_KBGRI<ExplanationType> imp ...@@ -47,7 +46,6 @@ public abstract class AbstractStaticGRIBasedExplainer_KBGRI<ExplanationType> imp
* @param kb the current kb * @param kb the current kb
*/ */
public AbstractStaticGRIBasedExplainer_KBGRI(KnowledgeBase kb) { public AbstractStaticGRIBasedExplainer_KBGRI(KnowledgeBase kb) {
this.originalRB = kb.getRuleBase();
this.transformedRB = ruleTransformer.createTransformedRB(kb); this.transformedRB = ruleTransformer.createTransformedRB(kb);
this.griKB = new KnowledgeBaseImpl(kb.getFactBase(), transformedRB.getStaticRuleBase()); this.griKB = new KnowledgeBaseImpl(kb.getFactBase(), transformedRB.getStaticRuleBase());
this.griKBChase = DefaultChaseForExplanations.chase(griKB); this.griKBChase = DefaultChaseForExplanations.chase(griKB);
......
...@@ -68,12 +68,15 @@ public class DynamicGRIRuleTransformer { ...@@ -68,12 +68,15 @@ public class DynamicGRIRuleTransformer {
transformedRuleBase.add(createQuerySeedRule(queryAtom)); transformedRuleBase.add(createQuerySeedRule(queryAtom));
for (Iterator<Predicate> it = kb.getFactBase().getPredicates(); it.hasNext(); ) { for (Iterator<Predicate> it = kb.getFactBase().getPredicates(); it.hasNext(); ) {
Predicate p = it.next(); Predicate p = it.next();
transformedRuleBase.add(createGRINodeBuildingRule(p)); transformedRuleBase.add(createGRINodeBuildingRule(p));
} }
for (FORule r : kb.getRuleBase().getRules()) { for (FORule r : kb.getRuleBase().getRules()) {
transformedRuleBase.add(createGRIDownwardClosureRule(r));
} }
return transformedRuleBase; return transformedRuleBase;
...@@ -146,8 +149,8 @@ public class DynamicGRIRuleTransformer { ...@@ -146,8 +149,8 @@ public class DynamicGRIRuleTransformer {
listOfVariableIdentifiersForBodyAtoms.add(bodyAtomWithVariableIdentifier.getTerm(bodyAtomWithVariableIdentifier.getPredicate().arity() - 1)); listOfVariableIdentifiersForBodyAtoms.add(bodyAtomWithVariableIdentifier.getTerm(bodyAtomWithVariableIdentifier.getPredicate().arity() - 1));
} }
Predicate edgePredicate = getOrGenerateEdgePredicateFromRule(r); Predicate relEdgePredicate = getOrGenerateRelEdgePredicateFromRule(r);
Atom edgeAtom = new AtomImpl(edgePredicate, listOfVariableIdentifiersForBodyAtoms); Atom edgeAtom = new AtomImpl(relEdgePredicate, listOfVariableIdentifiersForBodyAtoms);
newHeadAtoms.add(edgeAtom); newHeadAtoms.add(edgeAtom);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment