match

Сопоставление с образцом

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

match(expression, pattern, options)

Описание

match(expression, pattern) проверяет, совпадает ли синтаксическая структура expression с pattern. Если так, вызов возвращает набор заменяющих уравнений, преобразовывающих pattern в expression.

match вычисляет набор заменяющих уравнений S для идентификаторов, происходящих в pattern, таком, что subs(pattern, S) и expression совпадают до ассоциативности, коммутативности и нейтральных элементов.

Без дополнительных опций выполняется чисто синтаксическое соответствие; ассоциативность, коммутативность или нейтральные элементы учтены только для встроенных операторов + и *, and и or, и union и intersect. В этом случае subs(pattern, S) = expression содержит для набора S заменяющих уравнений, возвращенных match, если соответствие было успешно. Cf. Пример 1. Можно объявить эти свойства для операторов с помощью опций Associative, Commutative и Null (см. ниже). Затем subs(pattern, S) и expression больше не должны быть равными в MuPAD®, но они могут быть преобразованы друг в друга приложением правил, подразумеваемых опциями.

И expression и pattern могут быть произвольными выражениями MuPAD, т.е. и атомарные выражения, такие как числа, булевы константы, и идентификаторы и составной объектвыражения.

Каждый идентификатор без значения, которое происходит в pattern, включая 0th операнды, рассматривается как переменная шаблона, в том смысле, что это может быть заменено некоторым выражением в порядке преобразовать pattern в expression. Используйте опцию Const (см. ниже) объявить идентификаторы как незаменимые.

За исключением некоторых автоматических упрощений, выполняемых ядром MuPAD, не учтена дистрибутивность. Cf. Пример 5.

Примечание

match оценивает свои аргументы, как обычно. Эта оценка обычно охватывает определенное количество упрощения, которое может изменить синтаксическую структуру и expression и pattern неожиданным способом. Cf. Пример 6.

Даже если существует несколько возможных соответствий, match возвращает самое большее одного из них. Cf. Пример 7.

Если структура expression не совпадает с pattern, match возвращает FAIL.

Если expression и pattern равны, пустое множество возвращено.

В противном случае, если соответствие найдено, и expression и pattern отличаются, то набор S заменяющих уравнений возвращен. Для каждой переменной x шаблона, происходящей в pattern, который не объявляется постоянный с помощью опции Const, S содержит точно одно заменяющее уравнение формы x = y, и y является выражением, которым заменят x в порядке преобразовать pattern в expression.

Примеры

Пример 1

Все идентификаторы следующего шаблона являются переменными шаблона:

match(f(a, b), f(X, Y))

Функциональный f объявляется незаменимый:

match(f(a, b), f(X, Y), Const = {f})

Пример 2

Следующий вызов содержит условие для переменной X шаблона:

match(f(a, b), f(X, Y), Const = {f}, Cond = {X -> not has(X, a)})

Если функциональный f объявляется коммутативный, выражение совпадает с данным шаблоном — в отличие от предыдущего примера:

match(f(a, b), f(X, Y), Const = {f}, Commutative = {f},
                        Cond = {X -> not has(X, a)})

Пример 3

Следующее выражение не может быть соответствующим, поскольку количество аргументов выражения и шаблона отличается:

match(f(a, b, c), f(X, Y), Const = {f})

Мы объявляем функциональный f, ассоциативный с опцией Associative. В этом случае шаблон совпадает с данным выражением:

match(f(a, b, c), f(X, Y), Const = {f}, Associative = {f})

Пример 4

Если, однако, вызов функции в шаблоне имеет больше аргументов, чем соответствующий вызов функции в выражении, никакое соответствие не найдено:

match(f(a, b), f(X, Y, Z), Const = {f}, Associative = {f})

Если нейтральный элемент относительно оператора, f известен, дополнительные соответствия, возможен путем заменения им некоторые переменные шаблона:

match(f(a, b), f(X, Y, Z), Const = {f},
     Associative = {f}, Null = {f = 0})

Пример 5

Дистрибутивность не учтена в целом:

match(a*x + a*y, a*(X + Y), Const = {a})

Следующий вызов находит соответствие, но не ожидаемое:

match(a*(x + y), X + Y)

Следующие объявления и условия не приводят к ожидаемому результату, также:

match(a*(x + y), a*X + a*Y, Const = {a},
                            Cond = {X -> X <> 0, Y -> Y <> 0})

Пример 6

Автоматические упрощения могут “уничтожить” структуру данного выражения или шаблона:

match(sin(-2), sin(X))

Результатом является FAIL, потому что первый аргумент sin(-2) оценен и переписан к -sin(2):

sin(-2)

Можно обойти эту проблему при помощи hold:

match(hold(sin(-2)), sin(X))

Пример 7

match возвращает только одно возможное соответствие:

match(a + b + c + 1, X + Y)

Чтобы получить другие решения, используйте условия исключить решения, которые вы уже имеете:

match(a + b + c + 1, X + Y, Cond = {X <> a})

match(a + b + c + 1, X + Y, Cond = {X <> a and Y <> a})

match(a + b + c + 1, X + Y,
      Cond = {X <> a and X <> b and Y <> a})

Пример 8

Каждая переменная шаблона может иметь самое большее одну процедуру условия. Простые условия могут быть даны анонимными процедурами (->):

match(a + b, X + Y, Cond = {X -> X <> a, Y -> Y <> b})

Несколько условий на переменной шаблона могут быть объединены в одной процедуре:

Xcond := proc(X) begin
  if domtype(X) = DOM_IDENT then
    X <> a and X <> b
  else
    X <> 0
  end_if
end_proc:
match(sin(a*b), sin(X*Y), Cond = {Xcond})

match(sin(a*c), sin(X*Y), Cond = {Xcond})

delete Xcond:

Параметры

expression

Выражение MuPAD

pattern

Шаблон: выражение MuPAD

option1, option2, …

Дополнительные аргументы, как описано ниже

Опции

Associative

Опция, заданная как Associative = {f1, f2, …}

Это принято, что идентификаторы f1, f2, ... представляет ассоциативные операторы и может взять произвольное число аргументов, т.е. выражения, такие как f1(f1(a, b), c), f1(a, f1(b, c)), и f1(a, b, c) рассматривается равным.

Никакие специальные правила для ассоциативных операторов меньше чем с двумя аргументами не применяются. В частности, f1(a) и a не рассматриваются равными.

Commutative

Опция, заданная как Commutative = {g1, g2, …}

Это принято, что идентификаторы, g1, g2, ... представляет коммутативные операторы, т.е. выражения, такие как g1(a, b) и g1(b, a), рассматриваются равными.

Cond

Опция, заданная как Cond = {p1, p2, …}

Только соответствия, удовлетворяющие условия, заданные процедурами p1, p2, ..., рассматриваются. Каждая процедура должна взять точно один аргумент и представляет условие точно на одной переменной шаблона. Имя формального аргумента процедуры должно быть равно имени переменной шаблона, происходящей в pattern, который не объявляется постоянный с помощью опции Const. Каждая процедура условия должна возвратить выражение, что функциональный bool может оценить к одному из булевых значений TRUE или FALSE.

Анонимные процедуры, созданные через ->, могут использоваться, чтобы выразить простые условия. Cf. Пример 8.

Если возможное соответствие найдено, данное набором заменяющих уравнений S, то match проверяет, удовлетворены ли все заданные условия путем вызова bool(p1(y1) and p2(y2) and ...), где y1 является выражением, которым заменят переменную x1 шаблона, которая согласовывает с формальным аргументом процедуры p1 и т.д. Если возвращаемым значением вызова является TRUE, то match возвращает S. В противном случае следующее возможное соответствие пробуют.

Например, если p1 является процедурой с формальным аргументом x1, где x1 является переменной шаблона, происходящей в pattern, затем соответствие, S = {..., x1 = y1, ...} рассматривается допустимым, только если bool(p1(y1)) возвращает TRUE.

Может быть самое большее одна процедура условия для каждой переменной шаблона. При необходимости используйте логические операторы and и or, а также управляющие структуры if и case, чтобы объединить несколько условий для той же переменной шаблона в одной процедуре условия. Cf. Пример 8.

Const

Опция, заданная как Const = {c1, c2, …}

Идентификаторы c1, c2, ... рассматривается как константы, т.е. они должны соответствовать буквально и не должны быть заменены в порядке преобразовать pattern в expression.

Null

Опция, заданная как Null = {h1 = e1, h2 = e2, …}

Это принято, что e1, e2, ... является нейтральными элементами относительно ассоциативных операций h1, h2, ... т.е. выражений, таких как h1(a, e1), h1(e1, a), и h1(a) рассматривается равным.

Это объявление влияет только на операторы, которые объявляются ассоциативные с помощью опции Associative. Кроме того, нейтральные элементы неявно не приняты, чтобы быть константами.

Возвращаемые значения

Набор заменяющих уравнений или FAIL.

Смотрите также

Функции MuPAD