型解析:型ユニフィケーションの分類結果と処理順番
左側分類と右側分類の番号が微妙にずれてしまった。が、もう直すのが手間だから、ずれた番号をそのまま使うことにする。
ちと不恰好だが、もう勘弁してくれ。これで一応の結果としたい(間違いが発見されなければ)。後で元気があるときに、番号付けと順番を再考するかもしれない。
左側分類
- never
- any
- LIT
- SCA
- [,]
- {,}
- @
- x (var)
- ?
- join
右側分類
- never
- any
- LIT
- SCA
- [,]
- {,}
- @
- ? (ここでずれた、変数が最後になっている)
- xunion
- &
- y (var)
順番
10*11 = 110 の欄を持つマトリックスを、次の順番で塗りつぶす(網羅する)。この順番が絶対というわけではないし、効率は考えてない。が、とりあえず「うまくいく」であろう順番。
順番 | 左側 | 右側 | 分類番号 | 事後処理 |
---|---|---|---|---|
1 | join | - | 10*[1-11] | 進行=>join |
2 | never | - | 1*[1-11] | 成功終了 |
3 | - | never | [2-9]*1 | 完全失敗終了 |
4 | - | & | [2-9]*10 | 条件出力 and 進行=>inter |
5 | ? | ? | 9*8 | 進行=>b-opt |
6 | - | ? | [2-8]*8 | 進行=>r-opt |
7 | ? | - | 9*[2-7,9,11] | 条件出力 and 進行=>l-opt |
8 | - | any | [2-8]*2 | 判定 or 条件出力(8*2) |
9 | any | - | 2*[3-7,9,11] | 条件出力 |
10 | - | y | [3-8]*11 | 条件出力 |
11 | x | - | 8*[3-7,9] | 条件出力 |
12 | - | xunion | [3-7]*9 | 完全失敗 or 進行=>xunion |
13 | LIT | - | 3*[3-7] | 判定 |
14 | SCA | - | 4*[3-7] | 判定 |
15 | [,] | - | 5*[3-7] | 進行=>array |
16 | {,} | - | 6*[3-7] | 進行=>object |
17 | @ | - | 7*[3-7] | 完全失敗 or 進行=>tag |
構文的な正規化により、ユニフィケーションの左側(プロファイルの右側)では、∪を項の一番外側に移動できることもある。具体的には、Caty式にeachが含まれてなければ、∪を一番外まで移動できる。
∪を外に出せることはおおむね次のようにして分かる: never, any, LIT = {スカラーリテラルの全体}, SCA = {integer, number, string, boolean}, Var = {変数の全体} として、これらをベースにして、次の項構成子(コンストラクタ)によって、帰納的に項を定義する。
- [-, ..., -*] (配列の構成)
- {α1:-, ..., *:-} (オブジェクトの構成)
- @α - (タギング)
- -? (オプショナル)
- -∪- (合併/ジョイン)
次の公式が示せる。
- [A∪B, ..., X*] = [A, ..., X*]∪[B, ..., X*]
- {α1:A∪B, ..., *:X} = {α1:A, ..., *:X} ∪ {α1:B, ..., *:X}
- @α (A∪B) = (@α A) ∪ (@α B)
- (A∪B)? = A?∪B?
ただし、eachが入ると、(A∪B)* = A*∪B* とはならないのでうまくいかない。次は成立しない。
- {α1:A, ..., *:(X∪Y)} = {α1:A, ..., *:X} ∪ {α1:B, ..., *:Y}
- [A, ..., (X∪Y)*] = [A, ..., X*]∪[A, ..., Y*]
また、次に事実にも注意する必要がある。
- (A∪B)? = A?∪B = A∪B? = A?∪B?
これを使うと、∪を外に出すか、?を外に出すかを選べる。結論を言うと、?を外に出さないと、後の処理がうまくいかない。