From d1380e9c7c0e6960f849539dfc117f20c031625b Mon Sep 17 00:00:00 2001
From: patham9 <patham9@91dfdad4-c543-0410-b26a-7d79dded8189>
Date: Mon, 21 Jul 2014 20:31:40 +0000
Subject: [PATCH] solution for issue44 now in general, not just for two
 statements in and-compound..

---
 nars_core_java/nars/entity/Concept.java       | 10 +++
 .../nars/inference/CompositionalRules.java    | 77 +++++++++++++++----
 nars_core_java/nars/storage/Bag.java          |  4 +
 nars_core_java/nars/storage/Memory.java       |  4 +
 4 files changed, 78 insertions(+), 17 deletions(-)

diff --git a/nars_core_java/nars/entity/Concept.java b/nars_core_java/nars/entity/Concept.java
index 07acbff..527f00b 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 5139c54..c4d9f77 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 55e4e04..67e4f8b 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 44ca276..93c9d52 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 {
 
-- 
GitLab