Skip to content

Commit 771e71e

Browse files
committed
WIP #1009 prepare some basics in patternmatching package
1 parent b96f8dd commit 771e71e

File tree

3 files changed

+99
-38
lines changed

3 files changed

+99
-38
lines changed

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/IPatternMap.java

+83-36
Original file line numberDiff line numberDiff line change
@@ -1625,42 +1625,8 @@ static IPatternMap determinePatterns(final IExpr lhsPatternExpr, int[] priority,
16251625

16261626
determinePatternsRecursive(patternIndexMap, (IAST) lhsPatternExpr, priority,
16271627
ruleWithoutPattern, 1);
1628-
int size = patternIndexMap.size();
1629-
switch (size) {
1630-
case 1:
1631-
PatternMap1 patternMap1 = new PatternMap1();
1632-
patternMap1.fSymbol1 = patternIndexMap.get(0).getFirst();
1633-
patternMap1.fPatternObject1 = patternIndexMap.get(0).getSecond();
1634-
return patternMap1;
1635-
case 2:
1636-
PatternMap2 patternMap2 = new PatternMap2();
1637-
patternMap2.fSymbol1 = patternIndexMap.get(0).getFirst();
1638-
patternMap2.fPatternObject1 = patternIndexMap.get(0).getSecond();
1639-
patternMap2.fSymbol2 = patternIndexMap.get(1).getFirst();
1640-
patternMap2.fPatternObject2 = patternIndexMap.get(1).getSecond();
1641-
return patternMap2;
1642-
case 3:
1643-
PatternMap3 patternMap3 = new PatternMap3();
1644-
patternMap3.fSymbol1 = patternIndexMap.get(0).getFirst();
1645-
patternMap3.fPatternObject1 = patternIndexMap.get(0).getSecond();
1646-
patternMap3.fSymbol2 = patternIndexMap.get(1).getFirst();
1647-
patternMap3.fPatternObject2 = patternIndexMap.get(1).getSecond();
1648-
patternMap3.fSymbol3 = patternIndexMap.get(2).getFirst();
1649-
patternMap3.fPatternObject3 = patternIndexMap.get(2).getSecond();
1650-
return patternMap3;
1651-
}
1652-
PatternMap patternMap = new PatternMap();
1653-
patternMap.fRuleWithoutPattern = ruleWithoutPattern[0];
1654-
patternMap.fSymbolsOrPattern = new IExpr[size];
1655-
patternMap.fSymbolsOrPatternValues = new IExpr[size];
1656-
patternMap.fPatternObjects = new IPatternObject[size];
1657-
int i = 0;
1658-
for (GenericPair<IExpr, IPatternObject> entry : patternIndexMap) {
1659-
patternMap.fSymbolsOrPattern[i] = entry.getFirst();
1660-
patternMap.fPatternObjects[i] = entry.getSecond();
1661-
i++;
1662-
}
1663-
return patternMap;
1628+
boolean isRuleWithoutPattern = ruleWithoutPattern[0];
1629+
return createPatternMap(patternIndexMap, isRuleWithoutPattern);
16641630
} else if (lhsPatternExpr instanceof PatternNested) {
16651631
PatternNested pattern2 = (PatternNested) lhsPatternExpr;
16661632
// PatternMap1 patternMap1 = new PatternMap1();
@@ -1691,6 +1657,87 @@ static IPatternMap determinePatterns(final IExpr lhsPatternExpr, int[] priority,
16911657
return new PatternMap0();
16921658
}
16931659

1660+
public static IPatternMap createSymbolValue(
1661+
List<GenericPair<IExpr, ISymbol>> patternIndexMap) {
1662+
int size = patternIndexMap.size();
1663+
switch (size) {
1664+
case 1:
1665+
PatternMap1 patternMap1 = new PatternMap1();
1666+
patternMap1.fValue1 = patternIndexMap.get(0).getFirst();
1667+
patternMap1.fSymbol1 = patternIndexMap.get(0).getSecond();
1668+
return patternMap1;
1669+
case 2:
1670+
PatternMap2 patternMap2 = new PatternMap2();
1671+
patternMap2.fValue1 = patternIndexMap.get(0).getFirst();
1672+
patternMap2.fSymbol1 = patternIndexMap.get(0).getSecond();
1673+
patternMap2.fValue2 = patternIndexMap.get(1).getFirst();
1674+
patternMap2.fSymbol2 = patternIndexMap.get(1).getSecond();
1675+
return patternMap2;
1676+
case 3:
1677+
PatternMap3 patternMap3 = new PatternMap3();
1678+
patternMap3.fValue1 = patternIndexMap.get(0).getFirst();
1679+
patternMap3.fSymbol1 = patternIndexMap.get(0).getSecond();
1680+
patternMap3.fValue2 = patternIndexMap.get(1).getFirst();
1681+
patternMap3.fSymbol2 = patternIndexMap.get(1).getSecond();
1682+
patternMap3.fValue3 = patternIndexMap.get(2).getFirst();
1683+
patternMap3.fSymbol3 = patternIndexMap.get(2).getSecond();
1684+
return patternMap3;
1685+
}
1686+
PatternMap patternMap = new PatternMap();
1687+
patternMap.fRuleWithoutPattern = true;
1688+
patternMap.fSymbolsOrPattern = new IExpr[size];
1689+
patternMap.fSymbolsOrPatternValues = new IExpr[size];
1690+
patternMap.fPatternObjects = new IPatternObject[size];
1691+
int i = 0;
1692+
for (GenericPair<IExpr, ISymbol> entry : patternIndexMap) {
1693+
patternMap.fSymbolsOrPatternValues[i] = entry.getFirst();
1694+
patternMap.fSymbolsOrPattern[i] = entry.getSecond();
1695+
i++;
1696+
}
1697+
return patternMap;
1698+
}
1699+
1700+
public static IPatternMap createPatternMap(
1701+
List<GenericPair<IExpr, IPatternObject>> patternIndexMap,
1702+
boolean isRuleWithoutPattern) {
1703+
int size = patternIndexMap.size();
1704+
switch (size) {
1705+
case 1:
1706+
PatternMap1 patternMap1 = new PatternMap1();
1707+
patternMap1.fSymbol1 = patternIndexMap.get(0).getFirst();
1708+
patternMap1.fPatternObject1 = patternIndexMap.get(0).getSecond();
1709+
return patternMap1;
1710+
case 2:
1711+
PatternMap2 patternMap2 = new PatternMap2();
1712+
patternMap2.fSymbol1 = patternIndexMap.get(0).getFirst();
1713+
patternMap2.fPatternObject1 = patternIndexMap.get(0).getSecond();
1714+
patternMap2.fSymbol2 = patternIndexMap.get(1).getFirst();
1715+
patternMap2.fPatternObject2 = patternIndexMap.get(1).getSecond();
1716+
return patternMap2;
1717+
case 3:
1718+
PatternMap3 patternMap3 = new PatternMap3();
1719+
patternMap3.fSymbol1 = patternIndexMap.get(0).getFirst();
1720+
patternMap3.fPatternObject1 = patternIndexMap.get(0).getSecond();
1721+
patternMap3.fSymbol2 = patternIndexMap.get(1).getFirst();
1722+
patternMap3.fPatternObject2 = patternIndexMap.get(1).getSecond();
1723+
patternMap3.fSymbol3 = patternIndexMap.get(2).getFirst();
1724+
patternMap3.fPatternObject3 = patternIndexMap.get(2).getSecond();
1725+
return patternMap3;
1726+
}
1727+
PatternMap patternMap = new PatternMap();
1728+
patternMap.fRuleWithoutPattern = isRuleWithoutPattern;
1729+
patternMap.fSymbolsOrPattern = new IExpr[size];
1730+
patternMap.fSymbolsOrPatternValues = new IExpr[size];
1731+
patternMap.fPatternObjects = new IPatternObject[size];
1732+
int i = 0;
1733+
for (GenericPair<IExpr, IPatternObject> entry : patternIndexMap) {
1734+
patternMap.fSymbolsOrPattern[i] = entry.getFirst();
1735+
patternMap.fPatternObjects[i] = entry.getSecond();
1736+
i++;
1737+
}
1738+
return patternMap;
1739+
}
1740+
16941741
/**
16951742
* Determine all patterns (i.e. all objects of instance IPattern) in the given expression
16961743
*

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/PatternMatcherAndEvaluator.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import java.io.IOException;
55
import java.io.ObjectInput;
66
import java.io.ObjectOutput;
7+
import java.util.List;
78
import org.matheclipse.core.basic.Config;
89
import org.matheclipse.core.eval.EvalEngine;
910
import org.matheclipse.core.eval.exception.ConditionException;
1011
import org.matheclipse.core.eval.exception.ReturnException;
1112
import org.matheclipse.core.expression.F;
1213
import org.matheclipse.core.expression.S;
14+
import org.matheclipse.core.generic.GenericPair;
1315
import org.matheclipse.core.interfaces.IAST;
1416
import org.matheclipse.core.interfaces.IEvalStepListener;
1517
import org.matheclipse.core.interfaces.IExpr;
@@ -216,6 +218,16 @@ public IExpr eval(final IExpr leftHandSide, EvalEngine engine) {
216218
return replace(leftHandSide, engine, true);
217219
}
218220

221+
public static IExpr evalInternal(final IExpr leftHandSide, final IExpr rightHandSide,
222+
List<GenericPair<IExpr, ISymbol>> patternIndexMap) {
223+
PatternMatcherAndEvaluator pm = new PatternMatcherAndEvaluator();
224+
IPatternMap patternMap = IPatternMap.createSymbolValue(patternIndexMap);
225+
pm.fPatternMap = patternMap;
226+
pm.fRightHandSide = rightHandSide;
227+
pm.setLHSExprToMatch(leftHandSide);
228+
return pm.replacePatternMatch(leftHandSide, patternMap, EvalEngine.get(), true);
229+
}
230+
219231
public IExpr replace(final IExpr leftHandSide, EvalEngine engine, boolean evaluate) {
220232
IPatternMap patternMap = null;
221233
if (isRuleWithoutPatterns()) {
@@ -288,7 +300,9 @@ public IExpr replacePatternMatch(final IExpr leftHandSide, IPatternMap patternMa
288300

289301
engine.pushOptionsStack();
290302
try {
291-
engine.setOptionsPattern(fLhsPatternExpr.topHead(), patternMap);
303+
if (fLhsPatternExpr != null) {
304+
engine.setOptionsPattern(fLhsPatternExpr.topHead(), patternMap);
305+
}
292306
if (fRightHandSide == DUMMY_SUBSET_CASES) {
293307
fSubstitutedMatch = patternMap.substitutePatterns(fLhsPatternExpr, F.CEmptySequence);
294308
} else {

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/patternmatching/RulesData.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ public final IPatternMatcher putDownRule(final IExpr leftHandSide, final IExpr r
574574

575575
public final IPatternMatcher putDownRule(final int setSymbol, final boolean equalRule,
576576
final IExpr leftHandSide, final IExpr rightHandSide) {
577-
return putDownRule(IPatternMatcher.SET_DELAYED, false, leftHandSide, rightHandSide,
577+
return putDownRule(setSymbol, false, leftHandSide, rightHandSide,
578578
IPatternMap.DEFAULT_RULE_PRIORITY);
579579
}
580580

0 commit comments

Comments
 (0)