diff --git a/nars_core_java/nars/entity/Concept.java b/nars_core_java/nars/entity/Concept.java index 07acbff97000a88aa86c88a1a899595025a31508..527f00bb6ccb18c3366ab6e84542b9270b4c6e0d 100644 --- a/nars_core_java/nars/entity/Concept.java +++ b/nars_core_java/nars/entity/Concept.java @@ -353,6 +353,16 @@ public final class Concept extends Item { public Term getTerm() { return term; } + + /** + * Return the questions, called in ComposionalRules + * in dedConjunctionByQuestion only + * + * @return The associated term + */ + public ArrayList<Task> getQuestions() { + return questions; + } /** * Return a string representation of the concept, called in ConceptBag only diff --git a/nars_core_java/nars/inference/CompositionalRules.java b/nars_core_java/nars/inference/CompositionalRules.java index 5139c54bf503719c4c25355d14503e7a0977ba9d..c4d9f7736132a6f1f6301f8f40e7a753f8cdbd6d 100644 --- a/nars_core_java/nars/inference/CompositionalRules.java +++ b/nars_core_java/nars/inference/CompositionalRules.java @@ -43,27 +43,70 @@ public final class CompositionalRules { * @param memory Reference to the memory */ static void dedConjunctionByQuestion(Sentence sentence, Sentence belief, Memory memory) { - if(sentence==null || belief==null || memory.currentConcept==null || memory.currentTask==null) + if(sentence==null || belief==null || memory.currentTask==null || sentence.isQuestion() || belief.isQuestion()) return; - Task parent = memory.currentTask.getParentTask(); - if(parent==null) - return; - parent=parent.getParentTask(); - if(parent==null) - return; - Term pcontent = parent.getContent(); Term term1 = sentence.getContent(); Term term2 = belief.getContent(); - if(pcontent==null || !(pcontent instanceof Conjunction) || !parent.getSentence().isQuestion() || - !((CompoundTerm)pcontent).containComponent(term1) || !((CompoundTerm)pcontent).containComponent(term2)) { - return; + ArrayList<LinkedList<Concept>> bag=memory.getConceptBag().getItemTable(); + for(LinkedList<Concept> baglevel : bag) + { + for(Concept concept : baglevel) + { + for(Task question : concept.getQuestions()) + { + if(question==null) + continue; + Sentence qu=question.getSentence(); + if(qu==null) + continue; + Term pcontent = qu.getContent(); + if(pcontent==null || !(pcontent instanceof Conjunction) || ((CompoundTerm)pcontent).containVar()) { + continue; + } + if(!(term1 instanceof Conjunction) && !(term2 instanceof Conjunction)) { + if(!((CompoundTerm)pcontent).containComponent(term1) || !((CompoundTerm)pcontent).containComponent(term2)) { + continue; + } + } + if(term1 instanceof Conjunction) { + if(!(term2 instanceof Conjunction) && !((CompoundTerm)pcontent).containComponent(term2)) { + continue; + } + if(((CompoundTerm)term1).containVar()) { + continue; + } + for(Term t : ((CompoundTerm)term1).getComponents()) { + if(!((CompoundTerm)pcontent).containComponent(t)) { + continue; + } + } + } + if(term2 instanceof Conjunction) { + if(!(term1 instanceof Conjunction) && !((CompoundTerm)pcontent).containComponent(term1)) { + continue; + } + if(((CompoundTerm)term2).containVar()) { + continue; + } + for(Term t : ((CompoundTerm)term2).getComponents()) { + if(!((CompoundTerm)pcontent).containComponent(t)) { + continue; + } + } + } + Term conj = Conjunction.make(term1, term2, memory); + TruthValue truthT = memory.currentTask.getSentence().getTruth(); + TruthValue truthB = memory.currentBelief.getTruth(); + if(truthT==null || truthB==null) { + return; + } + TruthValue truthAnd = TruthFunctions.intersection(truthT, truthB); + BudgetValue budget = BudgetFunctions.compoundForward(truthAnd, conj, memory); + memory.doublePremiseTask(conj, truthAnd, budget); + break; + } + } } - Term conj = Conjunction.make(term1, term2, memory); - TruthValue truthT = memory.currentTask.getSentence().getTruth(); - TruthValue truthB = memory.currentBelief.getTruth(); - TruthValue truthAnd = TruthFunctions.intersection(truthT, truthB); - BudgetValue budget = BudgetFunctions.compoundForward(truthAnd, conj, memory); - memory.doublePremiseTask(conj, truthAnd, budget); } /* -------------------- intersections and differences -------------------- */ diff --git a/nars_core_java/nars/storage/Bag.java b/nars_core_java/nars/storage/Bag.java index 55e4e04449f3eb0e051529c57be1835bb0a215f0..67e4f8b7c29e76448ba2576ad046332c5ba41a55 100644 --- a/nars_core_java/nars/storage/Bag.java +++ b/nars_core_java/nars/storage/Bag.java @@ -434,4 +434,8 @@ public abstract class Bag<E extends Item> { public void setShowLevel(int showLevel) { this.showLevel = showLevel; } + + public ArrayList<LinkedList<E>> getItemTable() { + return itemTable; + } } diff --git a/nars_core_java/nars/storage/Memory.java b/nars_core_java/nars/storage/Memory.java index 44ca276fbdc5c9a4321eb09c6154d586f2e05e23..93c9d522723a873080e43686ad11843ae72cc034 100644 --- a/nars_core_java/nars/storage/Memory.java +++ b/nars_core_java/nars/storage/Memory.java @@ -649,6 +649,10 @@ public class Memory { public AtomicInteger getConceptForgettingRate() { return conceptForgettingRate; } + + public ConceptBag getConceptBag() { + return concepts; + } class NullInferenceRecorder implements IInferenceRecorder {