diff --git a/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/IPatternMap.java b/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/IPatternMap.java index c5dc0bd092..156f8dea55 100644 --- a/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/IPatternMap.java +++ b/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/IPatternMap.java @@ -1625,42 +1625,8 @@ static IPatternMap determinePatterns(final IExpr lhsPatternExpr, int[] priority, determinePatternsRecursive(patternIndexMap, (IAST) lhsPatternExpr, priority, ruleWithoutPattern, 1); - int size = patternIndexMap.size(); - switch (size) { - case 1: - PatternMap1 patternMap1 = new PatternMap1(); - patternMap1.fSymbol1 = patternIndexMap.get(0).getFirst(); - patternMap1.fPatternObject1 = patternIndexMap.get(0).getSecond(); - return patternMap1; - case 2: - PatternMap2 patternMap2 = new PatternMap2(); - patternMap2.fSymbol1 = patternIndexMap.get(0).getFirst(); - patternMap2.fPatternObject1 = patternIndexMap.get(0).getSecond(); - patternMap2.fSymbol2 = patternIndexMap.get(1).getFirst(); - patternMap2.fPatternObject2 = patternIndexMap.get(1).getSecond(); - return patternMap2; - case 3: - PatternMap3 patternMap3 = new PatternMap3(); - patternMap3.fSymbol1 = patternIndexMap.get(0).getFirst(); - patternMap3.fPatternObject1 = patternIndexMap.get(0).getSecond(); - patternMap3.fSymbol2 = patternIndexMap.get(1).getFirst(); - patternMap3.fPatternObject2 = patternIndexMap.get(1).getSecond(); - patternMap3.fSymbol3 = patternIndexMap.get(2).getFirst(); - patternMap3.fPatternObject3 = patternIndexMap.get(2).getSecond(); - return patternMap3; - } - PatternMap patternMap = new PatternMap(); - patternMap.fRuleWithoutPattern = ruleWithoutPattern[0]; - patternMap.fSymbolsOrPattern = new IExpr[size]; - patternMap.fSymbolsOrPatternValues = new IExpr[size]; - patternMap.fPatternObjects = new IPatternObject[size]; - int i = 0; - for (GenericPair entry : patternIndexMap) { - patternMap.fSymbolsOrPattern[i] = entry.getFirst(); - patternMap.fPatternObjects[i] = entry.getSecond(); - i++; - } - return patternMap; + boolean isRuleWithoutPattern = ruleWithoutPattern[0]; + return createPatternMap(patternIndexMap, isRuleWithoutPattern); } else if (lhsPatternExpr instanceof PatternNested) { PatternNested pattern2 = (PatternNested) lhsPatternExpr; // PatternMap1 patternMap1 = new PatternMap1(); @@ -1691,6 +1657,87 @@ static IPatternMap determinePatterns(final IExpr lhsPatternExpr, int[] priority, return new PatternMap0(); } + public static IPatternMap createSymbolValue( + List> patternIndexMap) { + int size = patternIndexMap.size(); + switch (size) { + case 1: + PatternMap1 patternMap1 = new PatternMap1(); + patternMap1.fValue1 = patternIndexMap.get(0).getFirst(); + patternMap1.fSymbol1 = patternIndexMap.get(0).getSecond(); + return patternMap1; + case 2: + PatternMap2 patternMap2 = new PatternMap2(); + patternMap2.fValue1 = patternIndexMap.get(0).getFirst(); + patternMap2.fSymbol1 = patternIndexMap.get(0).getSecond(); + patternMap2.fValue2 = patternIndexMap.get(1).getFirst(); + patternMap2.fSymbol2 = patternIndexMap.get(1).getSecond(); + return patternMap2; + case 3: + PatternMap3 patternMap3 = new PatternMap3(); + patternMap3.fValue1 = patternIndexMap.get(0).getFirst(); + patternMap3.fSymbol1 = patternIndexMap.get(0).getSecond(); + patternMap3.fValue2 = patternIndexMap.get(1).getFirst(); + patternMap3.fSymbol2 = patternIndexMap.get(1).getSecond(); + patternMap3.fValue3 = patternIndexMap.get(2).getFirst(); + patternMap3.fSymbol3 = patternIndexMap.get(2).getSecond(); + return patternMap3; + } + PatternMap patternMap = new PatternMap(); + patternMap.fRuleWithoutPattern = true; + patternMap.fSymbolsOrPattern = new IExpr[size]; + patternMap.fSymbolsOrPatternValues = new IExpr[size]; + patternMap.fPatternObjects = new IPatternObject[size]; + int i = 0; + for (GenericPair entry : patternIndexMap) { + patternMap.fSymbolsOrPatternValues[i] = entry.getFirst(); + patternMap.fSymbolsOrPattern[i] = entry.getSecond(); + i++; + } + return patternMap; + } + + public static IPatternMap createPatternMap( + List> patternIndexMap, + boolean isRuleWithoutPattern) { + int size = patternIndexMap.size(); + switch (size) { + case 1: + PatternMap1 patternMap1 = new PatternMap1(); + patternMap1.fSymbol1 = patternIndexMap.get(0).getFirst(); + patternMap1.fPatternObject1 = patternIndexMap.get(0).getSecond(); + return patternMap1; + case 2: + PatternMap2 patternMap2 = new PatternMap2(); + patternMap2.fSymbol1 = patternIndexMap.get(0).getFirst(); + patternMap2.fPatternObject1 = patternIndexMap.get(0).getSecond(); + patternMap2.fSymbol2 = patternIndexMap.get(1).getFirst(); + patternMap2.fPatternObject2 = patternIndexMap.get(1).getSecond(); + return patternMap2; + case 3: + PatternMap3 patternMap3 = new PatternMap3(); + patternMap3.fSymbol1 = patternIndexMap.get(0).getFirst(); + patternMap3.fPatternObject1 = patternIndexMap.get(0).getSecond(); + patternMap3.fSymbol2 = patternIndexMap.get(1).getFirst(); + patternMap3.fPatternObject2 = patternIndexMap.get(1).getSecond(); + patternMap3.fSymbol3 = patternIndexMap.get(2).getFirst(); + patternMap3.fPatternObject3 = patternIndexMap.get(2).getSecond(); + return patternMap3; + } + PatternMap patternMap = new PatternMap(); + patternMap.fRuleWithoutPattern = isRuleWithoutPattern; + patternMap.fSymbolsOrPattern = new IExpr[size]; + patternMap.fSymbolsOrPatternValues = new IExpr[size]; + patternMap.fPatternObjects = new IPatternObject[size]; + int i = 0; + for (GenericPair entry : patternIndexMap) { + patternMap.fSymbolsOrPattern[i] = entry.getFirst(); + patternMap.fPatternObjects[i] = entry.getSecond(); + i++; + } + return patternMap; + } + /** * Determine all patterns (i.e. all objects of instance IPattern) in the given expression * diff --git a/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/PatternMatcherAndEvaluator.java b/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/PatternMatcherAndEvaluator.java index a7b71df724..d9cdba5980 100644 --- a/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/PatternMatcherAndEvaluator.java +++ b/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/PatternMatcherAndEvaluator.java @@ -4,12 +4,14 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; +import java.util.List; import org.matheclipse.core.basic.Config; import org.matheclipse.core.eval.EvalEngine; import org.matheclipse.core.eval.exception.ConditionException; import org.matheclipse.core.eval.exception.ReturnException; import org.matheclipse.core.expression.F; import org.matheclipse.core.expression.S; +import org.matheclipse.core.generic.GenericPair; import org.matheclipse.core.interfaces.IAST; import org.matheclipse.core.interfaces.IEvalStepListener; import org.matheclipse.core.interfaces.IExpr; @@ -216,6 +218,16 @@ public IExpr eval(final IExpr leftHandSide, EvalEngine engine) { return replace(leftHandSide, engine, true); } + public static IExpr evalInternal(final IExpr leftHandSide, final IExpr rightHandSide, + List> patternIndexMap) { + PatternMatcherAndEvaluator pm = new PatternMatcherAndEvaluator(); + IPatternMap patternMap = IPatternMap.createSymbolValue(patternIndexMap); + pm.fPatternMap = patternMap; + pm.fRightHandSide = rightHandSide; + pm.setLHSExprToMatch(leftHandSide); + return pm.replacePatternMatch(leftHandSide, patternMap, EvalEngine.get(), true); + } + public IExpr replace(final IExpr leftHandSide, EvalEngine engine, boolean evaluate) { IPatternMap patternMap = null; if (isRuleWithoutPatterns()) { @@ -288,7 +300,9 @@ public IExpr replacePatternMatch(final IExpr leftHandSide, IPatternMap patternMa engine.pushOptionsStack(); try { - engine.setOptionsPattern(fLhsPatternExpr.topHead(), patternMap); + if (fLhsPatternExpr != null) { + engine.setOptionsPattern(fLhsPatternExpr.topHead(), patternMap); + } if (fRightHandSide == DUMMY_SUBSET_CASES) { fSubstitutedMatch = patternMap.substitutePatterns(fLhsPatternExpr, F.CEmptySequence); } else { diff --git a/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/RulesData.java b/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/RulesData.java index a3727589ea..d61b3b6e6a 100644 --- a/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/RulesData.java +++ b/symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/RulesData.java @@ -574,7 +574,7 @@ public final IPatternMatcher putDownRule(final IExpr leftHandSide, final IExpr r public final IPatternMatcher putDownRule(final int setSymbol, final boolean equalRule, final IExpr leftHandSide, final IExpr rightHandSide) { - return putDownRule(IPatternMatcher.SET_DELAYED, false, leftHandSide, rightHandSide, + return putDownRule(setSymbol, false, leftHandSide, rightHandSide, IPatternMap.DEFAULT_RULE_PRIORITY); }