Во-первых, в вашем выражении нет подвыражения a*b
. Внутри звонка на log
в вашем непарсированном входе появляется подтерма c/b*a
. Но в синтаксисе Maple он разбирается на что-то математически эквивалентное (c*a)/b
, а не c/(b*a)
.
Но ваш вопрос содержит другую двусмысленность. Давайте рассмотрим несколько примеров:
restart;
expr1 := y = s + (a/b)*log(a+c/b*a);
c a
a ln(a + ---)
b
expr1 := y = s + -------------
b
expr2 := y = s + a*log(a+c/b*a)/b;
c a
a ln(a + ---)
b
expr2 := y = s + -------------
b
expr2 - expr1;
0 = 0
Таким образом, expr1
и expr2
математически эквивалентны. Клен даже держит их структуры одинаково, внутри. (Вы можете проверить это с помощью команд lprint
и dismantle
.)
Таким образом, вы, похоже, просите, чтобы a/b
был распознан в любом из них, после синтаксического анализа ввода , даже если этот термин не появляется в виде буквально во входных данных (до синтаксического анализа). По сути, это не так, но нам нужно знать, что это часть ваших ожиданий. Если a/b
должен быть распознан как возможное поджатие этого значения, независимо от того, введено ли оно как expr1
или expr2
, то это ключевая деталь. Если это не ваше желание, то вам действительно придется обосновать, как их можно отличить друг от друга после анализа (поскольку они могут анализировать одно и то же , в зависимости от того, что уже произошло в сеансе Клен!).
Кроме того, как вы собираетесь обрабатывать что-то, что математически эквивалентно (a*s)/(b)
? Вы хотите код, который возвращает все возможные арифметические пары, например. a*s, a/b, s/b
? Или вы хотите просто a*s
, или просто a/b
, или просто s/b
?
Теперь рассмотрим другой пример:
expr3 := a+c*a/b;
c a
expr3 := a + ---
b
normal(expr3);
a (b + c)
---------
b
Они математически эквивалентны, хотя хранятся по-разному. В зависимости от вашего определения приемлемого «подвыражения» вы можете или не хотите хотеть a/b
, или c/b
, или b+c
, в ваших результатах.
Я думаю, что вам, вероятно, нужно решить, что именно вы хотите, по крайней мере в этих трех неоднозначных ситуациях, описанных выше, прежде чем ваш вопрос может быть решен разумно.