このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

型解析:型ユニフィケーションの分類結果と処理順番

左側分類と右側分類の番号が微妙にずれてしまった。が、もう直すのが手間だから、ずれた番号をそのまま使うことにする。

ちと不恰好だが、もう勘弁してくれ。これで一応の結果としたい(間違いが発見されなければ)。後で元気があるときに、番号付けと順番を再考するかもしれない。

左側分類

  1. never
  2. any
  3. LIT
  4. SCA
  5. [,]
  6. {,}
  7. @
  8. x (var)
  9. ?
  10. join

右側分類

  1. never
  2. any
  3. LIT
  4. SCA
  5. [,]
  6. {,}
  7. @
  8. ? (ここでずれた、変数が最後になっている)
  9. xunion
  10. &
  11. 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. [-, ..., -*] (配列の構成)
  2. 1:-, ..., *:-} (オブジェクトの構成)
  3. @α - (タギング
  4. -? (オプショナル)
  5. -∪- (合併/ジョイン)

次の公式が示せる。

  1. [A∪B, ..., X*] = [A, ..., X*]∪[B, ..., X*]
  2. 1:A∪B, ..., *:X} = {α1:A, ..., *:X} ∪ {α1:B, ..., *:X}
  3. @α (A∪B) = (@α A) ∪ (@α B)
  4. (A∪B)? = A?∪B?

ただし、eachが入ると、(A∪B)* = A*∪B* とはならないのでうまくいかない。次は成立しない

  1. 1:A, ..., *:(X∪Y)} = {α1:A, ..., *:X} ∪ {α1:B, ..., *:Y}
  2. [A, ..., (X∪Y)*] = [A, ..., X*]∪[A, ..., Y*]

また、次に事実にも注意する必要がある。

  • (A∪B)? = A?∪B = A∪B? = A?∪B?

これを使うと、∪を外に出すか、?を外に出すかを選べる。結論を言うと、?を外に出さないと、後の処理がうまくいかない。