06. Math言語げんご

方針ほうしん

数式すうしき表示対象ひょうじたいしょうたもち、その一部いちぶたいする厳密計算げんみつけいさん独立どくりつした操作そうさとして公開こうかいする。parse/renderが数式すうしき簡約かんやくしたり、等式とうしきただしさを主張しゅちょうしたりしない。

1. 表現ひょうげん

ぜんconstructorはmath-signatures参照さんしょうNumberは有限十進ゆうげんじっしん原表記げんひょうきち、意味値いみちはBigRationalへ正確せいかく変換へんかんする。整数せいすうp、分母ぶんぼqはq>0、gcd(|p|,q)=1、zero=0/1へ正規化せいきかする。Numberに格納かくのうできるあたいは、約分後やくぶんごのqの素因数そいんすうが2と5だけの有理数ゆうりすうかぎる。これ以外いがいをNumberとして構築こうちく・decodeする場合ばあいはNonFiniteDecimalNumberで拒否きょひする。評価値ひょうかちのRationalはこの制限せいげんたない。

任意有理数にんいゆうりすうからしきつくるconstructor helper expression_from_rational は、有限十進ゆうげんじっしんならNumber、それ以外いがいなら整数せいすうNumberをとするFrac(Number(p), Number(q))をかえす。もと構文こうぶんをlowerするときにこのhelperで著者ちょしゃのFracをたたまない。frac 1 2 はFracのまま保持ほじする。Numberのprintはcanonicalな整数せいすうまたは有限十進ゆうげんじっしん指数表記しすうひょうきなし、冗長じょうちょう末尾まつびzeroなし、zeroは0)で、意味値いみちとsnapshotの一致いっち確認かくにんした場合ばあいにはもとlexemeを表示ひょうじ利用りようできる。Number(1/3)をprintだけFracへ変換へんかんする設計せっけいにはしない。

Identifier leafは数学記号すうがくきごう自由記号じゆうきごうfree symbol許可きょかする。自由記号じゆうきごうはUnresolvedNameのエラーにしない。意味上いみじょう入力要求にゅうりょくようきゅうとして列挙れっきょする。symbol "..."予約語よやくごおなつづりや複数文字ふくすうもじ名前なまえ明示めいじできる。はだかのNameとsymbolのおなつづりはおな名前解決規則なまえかいけつきそく使つかう。

letはinitを外側そとがわ、bodyをあたらしい記号きごうscopeでむ。sum/integralのindexはbodyだけで有効ゆうこうであり、lower/upperでは外側そとがわ参照さんしょうする。自由記号じゆうきごう架空かくう定義位置ていぎいちあたえない。

subscript/superscript/scriptsは表示構造ひょうじこうぞう一般いっぱん添字そえじ配列はいれつアクセスや指数演算しすうえんざん暗黙変換あんもくへんかんしない。代数的だいすうてき累乗るいじょうにはpowを使つかう。call数学すうがく関数適用表現かんすうてきようひょうげんで、任意にんいのFnコード実行じっこうではない。

2. 構造検査こうぞうけんさ

matrixはひと以上いじょうのrow、かくrowはおなせい列数れつすうvectorはひと以上いじょう要素ようそfenceは左右さゆうそれぞれ0または1Unicode scalar。空文字からもじ片側かたがわだけの括弧かっこあらわせる。

rootのdegreeが数値すうちliteralで0ならInvalidRootDegree。そのほか定義域ていぎいきはevaluateにも検査けんさする。表示ひょうじだけのしき実数じっすう/複素数ふくそすう数値領域すうちりょういき勝手かっててない。

CheckedExpressionが保証ほしょうするのは構造こうぞう・binding・既知きち局所制約きょくしょせいやくであり、全記号ぜんきごうあたい全演算ぜんえんざん数値評価可能性すうちひょうかかのうせいではない。

3. evaluate

BindingEnvironmentはMathAssignmentのassignmentsれつであり、かく要素ようそ名前なまえnameとMathExactValueのvalueをつ。名前なまえはUTF-8辞書順じしょじゅん厳密げんみつ昇順しょうじゅんとし、重複ちょうふく順序違反じゅんじょいはん拒否きょひする。大文字おおもじ小文字こもじ同一視どういつしやUnicode正規化せいきかおこなわず、SymbolとおなじTextを比較ひかくする。から環境かんきょう未使用みしよう代入だいにゅう許可きょかするが、未使用みしようでもあたい形状けいじょう検査けんさする。検査済けんさず環境かんきょうもと不変入力ふへんにゅうりょく借用しゃくようし、名前なまえ二分探索にぶんたんさくする。名前なまえ未存在みそんざい不正入力ふせいにゅうりょく資源停止しげんていし区別くべつし、自由記号じゆうきごう未解決みかいけつ場合ばあいのSymbolic結果けっか利用りようする。この検査けんさしき全要求ぜんようきゅう充足じゅうそく証明しょうめいせず、NDF受信時じゅしんじにも順序じゅんじょあたい再検査さいけんさする。

入力にゅうりょくはCheckedExpression、自由記号じゆうきごうのBindingEnvironment、Limits。出力しゅつりょくはExact(Value)またはSymbolic(expression, Requirements)。定義域違反ていぎいきいはん形状不一致けいじょうふいっち明確めいかくなEvalError。あたい種類しゅるいはScalar(Q)、Vector(List<Q>)Matrix(rows,cols,List<Q>)、Truth(Bool)。

MathExactValueは評価値ひょうかち言語中立げんごちゅうりつschemaであり、もとのMathValueとはべつである。ScalarとVectorとMatrixの要素ようそ任意にんい正規形せいきけいRationalで、Numberの有限十進制約ゆうげんじっしんせいやく適用てきようしない。Vectorはからみとめず、Matrixのrowsとcolsはせい、valuesは行優先順ぎょうゆうせんじゅんでrowsとcolsのせきひとしい要素数ようそすうつ。次元じげんせきのU64 overflowも拒否きょひし、NDFの受信じゅしんでもおな形状検査けいじょうけんさおこなう。このあたい検査けんさだけで元式もとしき評価ひょうか演算えんざん定義域ていぎいき証明しょうめいされたとはあつかわない。

評価ひょうかはsourceじゅんひだりからみぎ純粋じゅんすいletはinitを評価ひょうかしてからbodyを評価ひょうかする。未解決みかいけつ記号きごう依存いぞんする部分ぶぶんはSymbolicとし、独立どくりつ数値すうちsubtreeの計算結果けいさんけっか保持ほじできるがもと構文こうぶん上書うわがきしない。

正確せいかく評価ひょうかする演算えんざん:

integral、call、表示用ひょうじようtext/sequence/subscript/superscript/scriptsは、評価専用規則ひょうかせんようきそくがないかぎりSymbolic(NotationOnly)。これらの表示ひょうじ完全かんぜん対応たいおうする。解析的かいせきてき積分せきぶん任意関数評価にんいかんすうひょうか実装済じっそうずみとしない。

4. MathML backend

MathML Coreの要素ようそをtyped Markupで生成せいせいする。Number=mn、Symbol=mi、表示ひょうじText=mtext、加減乗かげんじょう比較ひかく=mrow+mo、frac=mfrac、sqrt=msqrt、root=mroot、sub/sup/scripts=msub/msup/msubsup、vector/matrix=mtable/mtr/mtd、総和そうわ積分せきぶん=munder/munderoverまたは対応たいおうするscriptけいをdisplay modeから決定けっていする。

暗黙あんもくのブラウザprecedence解釈かいしゃく依存いぞんしない。binding powerは比較ひかく10、add/sub20、mul30、neg40、pow50、atomic60。よわつよおやれるさいはmoによる可視括弧かしかっこ挿入そうにゅうsubの右側みぎがわ、powの左側等ひだりがわなどおなじprecedenceでも非結合ひけつごう位置いち括弧かっこれる。fracは分子分母ぶんしぶんぼ構造自体こうぞうじたいがgroupになる。

数学表示すうがくひょうじの2項演算こうえんざんもと順序じゅんじょ保持ほじする。mulのscalar/記号列きごうれつでも、ちがいをけるためreference backendは中央点ちゅうおうてん表示ひょうじする。callはfunctionと括弧付かっこつきarguments。sequenceは指定順していじゅんのmrowであり、勝手かって演算えんざんおぎなわない。

letは「name := init ; body」のmrow。sumの下限かげんは「index = lower」、上限じょうげんはupper、bodyに必要ひつよう括弧かっこける。integralは積分記号せきぶんきごう上下限じょうかげん、body、微分記号びぶんきごうdとindex。equalは表示ひょうじであって証明書しょうめいしょではない。

labelのDoc sentence annotationはsuiteがsafeなphrasing fragmentへ準備じゅんびし、mtextをかいした注記ちゅうきとして出力しゅつりょくする。MathMLではlabelをmunderであらわし、最初さいしょ子要素こようそ数式すうしきつぎ子要素こようそにDocのXHTML phrasingをふくむmtextをく。複合演算ふくごうえんざん注記ちゅうきする場合ばあいはbaseを括弧かっこかこみ、注記ちゅうき対象範囲たいしょうはんい周囲しゅうい演算順序えんざんじゅんじょたもつ。hostは選択済せんたくずみのDoc rendererへもとのForeignClosureをわたし、おなじBudgetで準備じゅんび変換へんかんおこなう。Docのかた・source・局所きょくしょlabelを検査けんさし、未解決みかいけつ外部要求がいぶようきゅう保持ほじする。Math backendはかえされたphrasingと結合後けつごうご全表示経路ぜんひょうじけいろ検査けんさし、重複じゅうふくするHTML IDやblock内容ないよう拒否きょひする。MathMLの内容ないようモデルに適合てきごうしないblock内容ないようれない。

4.1. 公開こうかいarenaと原文保持げんぶんほじ

interfaces/model.json のMath record/unionはconstructorの論理的ろんりてき意味展開いみてんかいであり、Rust enumじゅんべつ再帰さいきwire layoutではない。実値じつちのschemaは interfaces/math.jsonMathSyntax / MathValue とする。MathRootはExpr / Row / DocGuestの3種類しゅるいMathKindは29 formとNumber leafに対応たいおうし、bare SymbolNameは明示めいじSymbolとおな意味いみkindへlowerする。はExprRef / RowRef / DocGuestRef、guestはEmbedRefで平坦へいたんなarenaを参照さんしょうする。schemaの明示めいじvariantめいとfieldれつがwire tagであり、入力由来にゅうりょくゆらいふかさをnativeの再帰所有さいきしょゆう転写てんしゃしない。

MathValueの構造検査こうぞうけんさはカテゴリ、参照さんしょう到達性とうたつせい、cycle、共有きょうゆうDAGの最大経路さいだいけいろ、Number有限十進制約ゆうげんじっしんせいやく、vector/matrix形状けいじょう、fenceはば、literal 0のroot degreeを検査けんさする。単独たんどくRowはからあらわせるが、Matrixにむrowの列数れつすうせいぜんrow同一どういつでなければならない。この証明しょうめいはsymbol解決済かいけつずみCheckedExpressionや評価可能性ひょうかかのうせい証明しょうめいではない。

MathSyntaxはsource宣言せんげんもとOriginひょう、tokenごとのowner headをつMathView、SourceMapを所有しょゆうする。Number.spellingは Option<Span> のまま保持ほじし、存在そんざいする場合ばあい宣言せんげんsourceとnode coverに整合せいごうする位置いちす。意味いみRationalとげんlexemeの一致いっち証明しょうめいしたときだけ元表記もとひょうきをprintへ利用りようでき、位置構造検査いちこうぞうけんさだけをその証明しょうめいとみなさない。Symbol/Let/Sum/Integralの名前なまえoperandはじたMathFieldLocationで選択位置せんたくいちとOriginを保持ほじする。本文ほんぶん名前検索なまえけんさく位置いち再発見さいはっけんせず、source-lessの位置いちはNoneとする。

LabelのDoc annotationと独立どくりつDocGuestは、Doc SentenceのForeignClosureを保持ほじする。ownerの環境かんきょう・Origin ID・source/map閉包へいほうとguest自身じしんのID空間くうかん混同こんどうせず、意味変換いみへんかんおこなわない。元構文もとこうぶん意味的いみてき不正ふせいなDoc annotationがあっても、Mathのsource構造検査こうぞうけんさ理由りゆうにDoc lowerや評価ひょうかしてはならない。prepared表示ひょうじわた意味いみ内容ないようモデル検査けんさべつ要求ようきゅうとしてのこす。

lower::expression はhostが選択済せんたくずみparse/profileを確認かくにんしたSyntaxBundleと明示めいじMath表層ひょうそうSchemaRef/categoryをけ、現在げんざいのBudget/SourceAdmissionで再検査さいけんさしてMathSyntaxをかえす。共有きょうゆうsourceは一度いちどだけ計上けいじょうし、げんFrac・表示ひょうじscriptsなど簡約かんやくしない。局所きょくしょconstructor制約せいやく失敗しっぱいもとのsource NodeRefとShapeErrorへ帰属きぞくさせ、破棄はきした出力しゅつりょくarenaのindexだけを位置情報いちじょうほうとしてかえさない。停止ていしげんStopReasonを保持ほじし、元構文木もとこうぶんき変更へんこうしない。

初回しょかいNDF受信じゅしんはschema検査後けんさごおなじsource/Origin/View/guest閉包へいほうとarena制約せいやく検査けんさする。宣言せんげんsourceの欠落けつらくをreceiverのambient storeからおぎなわない。raw MathSyntaxの受信じゅしんはbinding・free symbol要求ようきゅう評価結果ひょうかけっかのproofを発行はっこうしない。明示めいじconstructor helperはあたらしいsource-lessしきつくるためのもので、元式もとしき置換ちかんする処理しょりではない。

5. 出力しゅつりょく資源しげん

MathMLは独立どくりつした正式せいしきportable出力しゅつりょくであり、ブラウザがfont/layoutを担当たんとうする。Doc・MathのHTML生成せいせい17しょうのKaTeXPreferredを標準ひょうじゅんとし、生成環境せいせいかんきょうでKaTeXを実行じっこうしてCSS/fontと配布はいふする。忠実変換不能ちゅうじつへんかんふのう生成能力不足時せいせいのうりょくぶそくじはNEPL3 MathMLへ診断付しんだんつきでえる。閲覧時えつらんじにKaTeXを再実行さいじっこうせず、CLIがpixel描画びょうがまでおこなうとも広告こうこくしない。

独自どくじlayout/rasterizerを追加ついかする場合ばあいは、CheckedExpressionまたはMathLayout入力にゅうりょくmodelをけるべつbackendとする。OpenType MATH tableやglyph outlineの実装都合じっそうつごうをMathの意味いみモデルへまない。

6. 束縛解析そくばくかいせき交換値こうかんち

MathBindingsは構造検査後こうぞうけんさごのMathValueにたいする束縛解析そくばくかいせきであり、CheckedExpression全体ぜんたい証明しょうめいではない。MathBindingは束縛そくばくするformのoccurrenceとnodeを、MathSymbolUseは記号きごうのoccurrence・node・bindingを保持ほじする。bindingがNoneなら自由記号じゆうきごうであり、Someならもっとちか束縛そくばくformのoccurrenceをす。

occurrenceはrootを0として、意味いみfieldじゅんをたどる先行順せんこうじゅん番号ばんごうである。共有きょうゆうnodeも経路けいろごとにべつのoccurrenceをち、RowとDocGuestにも番号ばんごうてる。DocGuestの内部ないぶ走査そうさせず、名前なまえ文字列もじれつ完全一致かんぜんいっち比較ひかくする。

definitionsとusesはそれぞれoccurrenceじゅんである。sourceとOriginは入力にゅうりょくnodeのfield locationを参照さんしょうし、自由記号じゆうきごう定義位置ていぎいちつくらない。NDF境界きょうかいでは入力にゅうりょく指定していして再解析さいかいせきし、参照先さんしょうさき出現順しゅつげんじゅん過不足かふそく不一致ふいっちをBindingMismatchとして拒否きょひする。全出現ぜんしゅつげん名前比較なまえひかく共通予算きょうつうよさん適用てきようし、停止ていしした結果けっか部分成功ぶぶんせいこうとしてかえさない。

6.1. 自由記号じゆうきごう入力要求にゅうりょくようきゅう

free_symbolsはCheckedExpressionからMathFreeSymbolsを生成せいせいする。symbolsの各要素かくようそMathFreeSymbolはnameとoccurrencesをち、束縛そくばくされていない出現しゅつげんだけをおな名前なまえにまとめる。nameはUTF-8の辞書順じしょじゅん、occurrencesは先行順せんこうじゅんとし、重複じゅうふく欠落けつらくみとめない。

名前なまえ完全一致かんぜんいっち比較ひかくし、大文字おおもじ小文字こもじ同一視どういつしやUnicode正規化せいきかおこなわない。定義位置ていぎいち評価値ひょうかちおぎなわず、guestの内部ないぶ解析かいせきしない。NDFの受信じゅしんでは指定していされた入力にゅうりょくから再計算さいけいさんし、不一致ふいっちをFreeSymbolsMismatchとして拒否きょひする。共通予算きょうつうよさん停止ていし部分成功ぶぶんせいこうえない。

7. 公開操作こうかいそうさ

前置構文ぜんちこうぶんprinterは検査済けんさずみMath形状けいじょうけ、Expr・Row・DocGuestのentryとsource textをかえす。各出現かくしゅつげんをfieldじゅん出力しゅつりょくし、Frac・pow・表示用ひょうじようscripts・labelを評価ひょうか簡約かんやくえない。SymbolはsymbolとTextの明示形めいじけい使つかい、束縛名そくばくめいがNameであらわせなければUnprintableNameとして拒否きょひする。共有きょうゆうnodeも出現しゅつげんごとに展開てんかいし、ふかさ・出力しゅつりょく作業量さぎょうりょう確保量かくほりょう呼出元よびだしもと共通予算きょうつうよさんしたがう。

DocGuestは正確せいかく不変ふへんForeignClosureを同期どうきhost printerへわたし、から応答おうとうやhostの失敗しっぱい拒否きょひする。保持ほじsourceを無条件むじょうけん代用だいようせず、Math coreはDocの評価ひょうか・I/O・provider選択せんたくおこなわない。hostが生成せいせいしたguest textと全体ぜんたいのsourceは、選択せんたくしたProfileでさいparseして対応たいおう検証けんしょうするまでroundtripの証明しょうめいではない。出力しゅつりょくには架空かくうのsource identityをけず、保存ほぞんさいparseを担当たんとうするhostがあたらしいsnapshotをてる。

MathEvaluationOutcomeは成功せいこうした評価ひょうか交換値こうかんちであり、ExactにMathExactValue、SymbolicにMathEvaluationRequirementのれつつ。各要求かくようきゅう元式もとしきのExprRefとMathEvaluationReasonを保持ほじし、評価順ひょうかじゅんならぶ。sumの反復はんぷくおなじnodeの要求ようきゅうしょうじた場合ばあいも、出現しゅつげんごとの順序じゅんじょ重複ちょうふくたもつ。

受信側じゅしんがわはschemaとExactの形状けいじょう検査けんさし、指定していされた不変ふへんしき束縛環境そくばくかんきょうから再評価さいひょうかする。あたい要求ようきゅう理由りゆう順序じゅんじょ一致いっちしない結果けっかはEvaluationMismatchとして拒否きょひし、返却値へんきゃくち受信値じゅしんちではなく再評価さいひょうかした結果けっかとする。受信じゅしんから照合しょうごうまでおな予算よさん使つかい、停止ていし再試行さいしこうやSymbolicでさない。この交換値こうかんち操作そうさ失敗しっぱいやproviderの通信契約つうしんけいやくねない。

MathEvaluationResultはSuccessにMathEvaluationOutcome、FailureにMathEvaluationFailureをつ。Failureは失敗しっぱいしたconstructorのExprRefと、OperandShapeMismatch・NotSquare・DivisionByZero・InvalidRootDegreeの種別しゅべつつ。意味上いみじょう失敗しっぱい成功せいこうおなじく指定入力していにゅうりょくから再評価さいひょうかして照合しょうごうし、改変かいへんされた種別しゅべつ位置いち拒否きょひする。cancel・資源停止しげんていし内部不変条件違反ないぶふへんじょうけんいはんはFailureに変換へんかんせず、操作そうさのErrとしてかえす。providerの通信失敗つうしんしっぱい要求ようきゅうidentityの照合しょうごうは、この数値評価すうちひょうか結果型けっかがたとはべつ境界契約きょうかいけいやくである。

printの具体的ぐたいてき要求型ようきゅうがたはMathPrintRequest、結果型けっかがたはMathPrintResultである。要求ようきゅう閉包へいほうふくむMathSyntax、明示選択めいじせんたくしたDoc schema、MathPrintedGuestれつつ。guest応答おうとう全体ぜんたいsyntaxのdigest、guest閉包へいほうのdigest、EmbedRef、textをふくむ。identity取得しゅとくとprint実行じっこうはcanonicalから別々べつべつにdigestをもとめ、過去かこ検査けんさ予算よさん支払済しはらいずみとはしない。未選択みせんたく選択せんたくしたschemaとの不一致ふいっち欠落けつらく重複じゅうふくからのguest、digest不一致ふいっちをInvalidで拒否きょひする。Sentence以外いがいのguest categoryは、identity計算前けいさんまえ構造検査こうぞうけんさ入力境界にゅうりょくきょうかいのErrとして拒否きょひし、Invalid結果けっか変換へんかんしない。Completeだけが完全かんぜんなartifactをかえし、停止ていしもとのStopReasonを保持ほじしたStoppedとなる。構造不正こうぞうふせい入力境界にゅうりょくきょうかいのErrであり、受信じゅしんした結果けっかdataだけから実行じっこうproofや遠隔えんかくUsageを信用しんようしない。生成せいせい停止後ていしごのtransport encodeはべつ処理しょりであり、print途中とちゅうのBudgetを交換こうかんして成功せいこうさせない。

MathSourceArtifactはtextとMathCategoryをち、Expr・Row・DocGuestのさいparse入口いりぐち区別くべつする。portableのencode/decodeはschema適合てきごうdataをあつかうだけで、生成元せいせいもと証明しょうめいではない。verifyは要求ようきゅう不変ふへんMathと選択せんたくhostからおなじBudgetでprefixを再生成さいせいせいし、textとcategoryの完全一致かんぜんいっち検査けんさする。不一致ふいっちをMismatchとして拒否きょひし、成功時せいこうじかえすのは局所生成きょくしょせいせいしたartifactである。guestの意味同等性いみどうとうせい、provider要求ようきゅうidentity、保存先ほぞんさきsnapshot、失敗応答しっぱいおうとうのtransportはべつ契約けいやくとして検査けんさする。

lower、check、free_symbols、evaluate、print、render_mathml。評価結果ひょうかけっか部分評価ぶぶんひょうか新式しんしきもとしき別値べつちとしてかえす。文書側ぶんしょがわのrender要求ようきゅうがevaluateを自動じどう要求ようきゅうしない。