From d203ebfdfed021d7413fdccbb8c46fbd2de94092 Mon Sep 17 00:00:00 2001
From: "NARS.Wang@gmail.com"
 <NARS.Wang@gmail.com@91dfdad4-c543-0410-b26a-7d79dded8189>
Date: Wed, 16 Jul 2014 00:07:13 +0000
Subject: [PATCH] Solving Issue 27 with random shuffle of components

---
 nars_core_java/nars/language/Variable.java | 19 ++++++++++---------
 nars_core_java/nars/storage/Memory.java    |  4 ++++
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/nars_core_java/nars/language/Variable.java b/nars_core_java/nars/language/Variable.java
index d5effb5..0d2d1d6 100644
--- a/nars_core_java/nars/language/Variable.java
+++ b/nars_core_java/nars/language/Variable.java
@@ -23,12 +23,12 @@ package nars.language;
 import java.util.*;
 
 import nars.io.Symbols;
+import nars.storage.Memory;
 
 /**
  * A variable term, which does not correspond to a concept
  */
 public class Variable extends Term {
-
     /**
      * Constructor, from a given variable name
      *
@@ -213,17 +213,18 @@ public class Variable extends Term {
             if (cTerm1.size() != (cTerm2).size()) {
                 return false;
             }
-            if ((cTerm1 instanceof ImageExt) && (((ImageExt) cTerm1).getRelationIndex() != ((ImageExt) cTerm2).getRelationIndex())) {
-                return false;
-            }
-            if ((cTerm1 instanceof ImageInt) && (((ImageInt) cTerm1).getRelationIndex() != ((ImageInt) cTerm2).getRelationIndex())) {
+            if ((cTerm1 instanceof ImageExt) && (((ImageExt) cTerm1).getRelationIndex() != ((ImageExt) cTerm2).getRelationIndex())
+                    || (cTerm1 instanceof ImageInt) && (((ImageInt) cTerm1).getRelationIndex() != ((ImageInt) cTerm2).getRelationIndex())) {
                 return false;
             }
-            for (int i = 0; i < cTerm1.size(); i++) {   // assuming matching order, to be refined in the future
-                Term t1 = cTerm1.componentAt(i);
+            ArrayList<Term> list = cTerm1.cloneComponents();
+            if (cTerm1.isCommutative()) {
+                 Collections.shuffle(list, Memory.randomNumber);
+            } 
+            for (int i = 0; i < cTerm1.size(); i++) {   // assuming matching order
+                Term t1 = list.get(i);
                 Term t2 = cTerm2.componentAt(i);
-                boolean haveSub = findSubstitute(type, t1, t2, map1, map2);
-                if (!haveSub) {
+                if (!findSubstitute(type, t1, t2, map1, map2)) {
                     return false;
                 }
             }
diff --git a/nars_core_java/nars/storage/Memory.java b/nars_core_java/nars/storage/Memory.java
index b13447d..830444b 100644
--- a/nars_core_java/nars/storage/Memory.java
+++ b/nars_core_java/nars/storage/Memory.java
@@ -108,6 +108,9 @@ public class Memory {
      * TODO unused
      */
     protected HashMap<Term, Term> substitute;
+    
+    public static Random randomNumber = new Random(1);
+
 
 
     /* ---------- Constructor ---------- */
@@ -133,6 +136,7 @@ public class Memory {
         newTasks.clear();
         exportStrings.clear();
         reasoner.initTimer();
+        randomNumber = new Random(1);
         recorder.append("\n-----RESET-----\n");
     }
 
-- 
GitLab