diff --git a/nars-dist/NARS.jar b/nars-dist/NARS.jar index f6a3ceb62b73b073d3367f1ffa3998b6994b71f6..f807e02d8671dc4d2ae34713309b74d4d3fd1f16 100644 Binary files a/nars-dist/NARS.jar and b/nars-dist/NARS.jar differ diff --git a/nars_core_java/nars/inference/CompositionalRules.java b/nars_core_java/nars/inference/CompositionalRules.java index 8da6fa6358155b8b676867910b82a36b81e52e32..8c63adebe6a4393143c53f7c457b01f335683a74 100644 --- a/nars_core_java/nars/inference/CompositionalRules.java +++ b/nars_core_java/nars/inference/CompositionalRules.java @@ -37,6 +37,43 @@ import nars.storage.Memory; */ public final class CompositionalRules { + static void IntroVarSameSubject(Sentence originalMainSentence, Sentence subSentence, Term component, Term content, int index,Memory memory) { + Sentence cloned=(Sentence) originalMainSentence.clone(); + Term T1=cloned.getContent(); + if(!(T1 instanceof CompoundTerm) || !(content instanceof CompoundTerm)) { + return; + } + CompoundTerm T=(CompoundTerm) T1; + CompoundTerm T2=(CompoundTerm) content.clone(); + if((component instanceof Inheritance && content instanceof Inheritance) || + (component instanceof Similarity && content instanceof Similarity)) { + CompoundTerm result=T; + if(component.equals(content)) { + return; //wouldnt make sense to create a conjunction here, would contain a statement twice + } + if(((Statement)component).getPredicate().equals(((Statement)content).getPredicate()) && !(((Statement)component).getPredicate() instanceof Variable)) { + Variable V=new Variable("#depIndVar1"); + CompoundTerm zw=(CompoundTerm) T.getComponents().get(index).clone(); + zw=(CompoundTerm) CompoundTerm.setComponent(zw,1,V,memory); + T2=(CompoundTerm) CompoundTerm.setComponent(T2,1,V,memory); + Conjunction res=(Conjunction) Conjunction.make(zw, T2, memory); + T=(CompoundTerm) CompoundTerm.setComponent(T, index, res, memory); + } + else + if(((Statement)component).getSubject().equals(((Statement)content).getSubject()) && !(((Statement)component).getSubject() instanceof Variable)) { + Variable V=new Variable("#depIndVar2"); + CompoundTerm zw=(CompoundTerm) T.getComponents().get(index).clone(); + zw=(CompoundTerm) CompoundTerm.setComponent(zw,0,V,memory); + T2=(CompoundTerm) CompoundTerm.setComponent(T2,0,V,memory); + Conjunction res=(Conjunction) Conjunction.make(zw, T2, memory); + T=(CompoundTerm) CompoundTerm.setComponent(T, index, res, memory); + } + TruthValue truth = TruthFunctions.induction(originalMainSentence.getTruth(), subSentence.getTruth()); + BudgetValue budget = BudgetFunctions.compoundForward(truth, T, memory); + memory.doublePremiseTask(T, truth, budget); + } + } + public static Random rand = new Random(1); static boolean dedSecondLayerVariableUnification(Task task, Memory memory) { diff --git a/nars_core_java/nars/inference/RuleTables.java b/nars_core_java/nars/inference/RuleTables.java index ab65f53f5c4d83f094b8e6355ae00b9f40e71df7..b0360c03daa90a6637dc419a45de59b6ed51ea2d 100644 --- a/nars_core_java/nars/inference/RuleTables.java +++ b/nars_core_java/nars/inference/RuleTables.java @@ -437,6 +437,9 @@ public class RuleTables { if (s2.getSubject().equals(((Statement) content).getSubject())) { CompositionalRules.introVarInner((Statement) content, s2, statement, memory); } + CompositionalRules.IntroVarSameSubject(originalMainSentence,subSentence,component,content,index,memory); + } else if ((statement instanceof Equivalence) && (statement.getPredicate() instanceof Statement) && (memory.currentTask.getSentence().isJudgment())) { + CompositionalRules.IntroVarSameSubject(originalMainSentence,subSentence,component,content,index,memory); } } } diff --git a/nars_core_java/nars/language/CompoundTerm.java b/nars_core_java/nars/language/CompoundTerm.java index 596c1c5cbc607e949983016820d5dd7144e93ef1..0f542d060aee5fdaf3f36c1c8aa4a5e3914be997 100644 --- a/nars_core_java/nars/language/CompoundTerm.java +++ b/nars_core_java/nars/language/CompoundTerm.java @@ -252,6 +252,12 @@ public abstract class CompoundTerm extends Term { if(op.equals(Symbols.EQUIVALENCE_RELATION)) { return Equivalence.make(arg.get(0), arg.get(1), memory); } + if(op.equals(Symbols.SIMILARITY_RELATION)) { + return Similarity.make(arg.get(0), arg.get(1), memory); + } + if(op.equals(Symbols.INHERITANCE_RELATION)) { + return Inheritance.make(arg.get(0), arg.get(1), memory); + } } return null; }