見出し画像

厳格なコンテントMathMLで使われるラムダ式

今回は、MathMLの中でも、プレゼンテーションMathMLの影に追いやられている感じのコンテントMathMLに焦点を当ててみたいと考えています。

MathML3から厳格なコンテントMathMLが導入されました。この厳格なコンテントMathMLは、全ての数式を関数で表すことで、複雑な構造を利用する要素や大量の空要素を使用しない、コンテントMathMLの最小の部分集合となるものです。なお、MathML仕様書では、関数(function)ではなく記号(symbol)という用語で呼ばれていますが、分かりやすさのため、ここでは関数と呼びます。

例えば、$${\int^a_b f(x)dx}$$は、$${f(x)}$$がコンテントMathMLでexpression-in-xと表されるとすると、次のように表されます。

<apply><int/>
  <bvar><ci>x</ci></bvar>
  <lowlimit><ci>a</ci></lowlimit>
  <uplimit><ci>b</ci></uplimit>
  <ci>expression-in-x</ci>
</apply>

コンテントMathMLの例(MathML4仕様書)

<apply><csymbol cd="calculus1">defint</csymbol>
  <apply><csymbol cd="interval1">oriented_interval</csymbol>
    <ci>a</ci> <ci>b</ci>
  </apply>
  <bind><csymbol cd="fns1">lambda</csymbol>
    <bvar><ci>x</ci></bvar>
    <ci>expression-in-x</ci>
  </bind>
</apply>

厳格なコンテントMathMLの例(MathML4仕様書)

厳格なコンテントMathMLは何でも関数で表すので、aからbの範囲もoriented_intervalという関数で表されます。まるで、関数型言語LISPのようにも感じられます。また、全ての数式が関数で表わされるので、処理は実装しやすいかもしれません。

ただ、lambdaという元々の式には無かった関数が導入されています。行数も増えて冗長になっています。ちなみに、このlambdaというのは、いわゆるラムダ式を表しています。

なぜ、いきなりラムダ式が登場するのかについて説明します。厳格なコンテントMathMLの式では一番外側の式(1)が、定積分defintを指定された範囲(2)で指定された式(3)に適用することを表しています。その内側で、まず、指定された範囲(2)は、範囲oriented_intervalという関数をaとbに適用することで、a~bの範囲を表しています。続いて、指定された式(3)は、積分定数xと式expression-in-xを結び付けるラムダ式を表しています。

厳格なコンテントMathMLの例(説明用に色分け)

ラムダ式でなく、単にexpression-in-xでも良いように思えます。しかしながら、expression-in-xが(例えば、$${xy+z}$$といった具合に)変数x以外の変数を含んでいる可能性もあることから、積分変数がどの変数なのかを指定する必要があり、単にexpression-in-xでは不十分です。そのため、ラムダ式が必要になります。

ただ、ここで元々無かったラムダ式がいきなり出てくるのはややこしいという意見もあるかと思います。定積分defintの引数として、ラムダ式ではなく積分変数xと式expression-in-xを用いれば良いのではという考えも浮かびます。しかし、それでは、関数ごとに、引数の場所によってその役割が変化すること位なるので、<apply>の実装が複雑になってしまいます。これでは、厳格なコンテントMathMLの最小の部分集合であるという趣旨と反してしまいます。この点で、ラムダ式を無理やりにでも利用するのが最適でしょう。

今回は、厳格なコンテントMathMLに焦点を当ててみました。ラムダ式が利用されるのは何だかややこしいですが、最小限の種類の構文で書けるのは、実装の観点からいって厳格なコンテントMathMLの利点かと思います。

いいなと思ったら応援しよう!