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 если соответствие было успешно. См. Пример 1. Можно объявить эти свойства для операторов с помощью опций Associative, Commutative, и Null (см. ниже). Затем subs(pattern, S) и expression потребность больше не быть равными в MuPAD®, но они могут быть преобразованы друг в друга приложением правил, подразумеваемых опциями.

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

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

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

Примечание

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

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

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

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

В противном случае, если соответствие найдено и expression и pattern отличаются, затем набор S из замены уравнения возвращен. Для каждой переменной x шаблона появление в pattern это не объявляется постоянное с помощью опции ConstS содержит точно одно заменяющее уравнение формы 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.

Анонимные процедуры создаются через -> может использоваться, чтобы выразить простые условия. См. Пример 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 объединить несколько условий для той же переменной шаблона в одной процедуре условия. См. Пример 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