型解析:型ユニフィケーション
型ユニフィケーションは、証明ターゲット S⊆T を証明する過程の中心的な処理である。処理の結果として、いくつかの「不定命題=動的なチェック条件」を出力する。
注意:このエントリーは他の関連エントリーとの兼ね合いで大幅に修正したり、場所を移動したりする可能性があります。
記号の約束:
- S, T, U, V, W :型
- a, b :スカラー定数
- x, y :型変数
- X, Y :スカラー型(integer, number, string, booleanの4種、nullはシングルトン型として扱う)
SとTのユニフィケーションを行うとして、Sはユニフィケーションの左側型、Tはユニフィケーションの右側型と呼ぶ。左側型Sは右辺型、右側型Tが左辺型であるので注意せよ。
ここでは(他では違う用語法を使った気もするが)、証明ターゲット S⊆T が証明できなかったとき(ユニフィケーション=証明が)「失敗」という。S∩T = never が確認されたときは「完全に失敗」という。失敗しても完全に失敗かどうかはわからない。完全に失敗のときは、目印に×を付ける。ユニフィケーション処理が成功または続行する場合は、○印に続けてその根拠となる公理や分解規則を示す。ユニフィケーションの後にさらに処理が必要な場合は、★を付ける。
1. Sがneverのとき
常に例外やシグナルを投げるコマンドは、プロファイルの右辺がneverなので、このケースは理論的には無意味ではない。(現実的にはほとんど無意味 ^^;)
- 確定命題 never⊆T を出力。○公理never
never⊆T は公理から常に真だが、neverが出現するときは警告すべきことも多い。
2. Sがanyのとき
- Tがneverならば、完全に失敗。×
- Tがanyならば、確定命題 any⊆any を出力。○公理any
- Tがシングルトン型bならば、確定命題 any⊆b を出力。★
- Tがスカラー型Yならば、確定命題 any⊆Y を出力。★
- Tが配列型ならば、確定命題 any⊆T を出力。★
- Tがオブジェクト型ならば、確定命題 any⊆T を出力。★
- Tがタグ付き型 @β W ならば、確定命題 any⊆(@β W) を出力。★
- Tがオプショナル型W?ならば、確定命題 any⊆W? を出力。★(any⊆W に還元)
- Tが排他的ユニオン型ならば、anyとTの各成分のORユニフィケーション。結果はすべて失敗。○xuni ★
- Tがインターセクション型 y&W ならば、不定命題 any⊆y を出力し、anyとWのユニフィケーション。○inter
- Tが型変数yのとき、不定命題 any⊆y を出力。○r-var
any⊆any 以外の確定命題はすべて偽になる。しかし、完全な失敗とは限らない。
3. Sがシングルトン型aのとき
- Tがneverならば、完全に失敗。×
- Tがanyならば、確定命題 a∈any を出力。○公理any
- Tがシングルトン型bならば、確定命題 a = b を出力。○s-eq
- Tがスカラー型Yならば、確定命題 a ∈ Y を出力。○s-elem
- Tが配列型ならば、完全に失敗。×
- Tがオブジェクト型ならば、完全に失敗。×
- Tがタグ付き型 @β W ならば、完全に失敗。×
- Tがオプショナル型W?ならば、aとWのユニフィケーション。○r-opt
- Tが排他的ユニオン型ならば、aとTの各成分のORユニフィケーション。結果として、失敗かまたは単一のユニフィケーション。○xuni
- Tがインターセクション型 y&W ならば、不定命題 a∈y を出力し、aとWのユニフィケーション。○inter
- Tが型変数yのとき、不定命題 a∈y を出力。○r-var
4. Sがスカラー型Xのとき
- Tがneverならば、完全に失敗。×
- Tがanyならば、確定命題 X⊆any を出力。○公理any
- Tがシングルトン型bならば、確定命題X⊆b を出力。★
- Tがスカラー型Yならば、確定命題 X⊆Y を出力。○st-inc
- Tが配列型ならば、完全に失敗。×
- Tがオブジェクト型ならば、完全に失敗。×
- Tがタグ付き型 @β W ならば、完全に失敗。×
- Tがオプショナル型 W? ならば、XとWのユニフィケーション。○r-opt
- Tが排他的ユニオン型ならば、XとTの各成分のORユニフィケーション。結果として、失敗かまたは単一のユニフィケーション。○xuni
- Tがインターセクション型 y&W ならば、不定命題 X⊆y を出力し、XとWのユニフィケーション。○inter
- Tが型変数yならば、不定命題 X⊆y を出力。○r-var
5. Sが配列型のとき
- Tがneverならば、完全に失敗。×
- Tがanyならば、確定命題 S⊆any を出力。○公理any
- Tがシングルトン型bならば、完全に失敗。×
- Tがスカラー型Yならば、完全に失敗。×
- Tが配列型ならば、Sの各項目とTの各項目のANDユニフィケーション。○arr
- Tがオブジェクト型ならば、完全に失敗。×
- Tがタグ付き型 @β W ならば、完全に失敗。×
- Tがオプショナル型 W? ならば、SとWのユニフィケーション。○r-opt
- Tが排他的ユニオン型ならば、SとTの各成分のORユニフィケーション。結果として、失敗かまたは単一のユニフィケーション。○xuni
- Tがインターセクション型 y&W ならば、不定命題 S⊆y を出力し、SとWのユニフィケーション。○inter
- Tが型変数yならば、不定命題S⊆yを出力。○r-var
6. Sがオブジェクト型のとき
- Tがneverならば、完全に失敗。×
- Tがanyならば、確定命題 X⊆any を出力。○公理any
- Tがシングルトン型bならば、完全に失敗。×
- Tがスカラー型Yならば、完全に失敗。×
- Tが配列型ならば、完全に失敗。×
- Tがオブジェクト型ならば、Sの各プロパティとTの各プロパティのANDユニフィケーション。○obj
- Tがタグ付き型 @β W ならば、完全に失敗。×
- Tがオプショナル型 W? ならば、SとWのユニフィケーション。○r-opt
- Tが排他的ユニオン型ならば、SとTの各成分のORユニフィケーション。結果として、失敗かまたは単一のユニフィケーション。○xuni
- Tがインターセクション型 y&W ならば、不定命題S⊆yを出力し、SとWのユニフィケーション。○inter
- Tが型変数yならば、不定命題S⊆yを出力。○r-var
7. Sがタグ付き型@α Vのとき
- Tがneverならば、完全に失敗。×
- Tがanyならば、確定命題 X⊆any を出力。○公理any
- Tがシングルトン型bならば、完全に失敗。×
- Tがスカラー型Yならば、完全に失敗。×
- Tが配列型ならば、完全に失敗。×
- Tがオブジェクト型ならば、完全に失敗。×
- Tがタグ付き型 @β W ならば、確定命題 α=β を出力し、VとWのユニフィケーション。○tag(α=β はその場でやってしまうほうが早いな)
- Tがオプショナル型 W? ならば、TとWのユニフィケーション。○r-opt
- Tが排他的ユニオン型ならば、SとTの各成分のORユニフィケーション。結果として、失敗かまたは単一のユニフィケーション。○xuni
- Tがインターセクション型 y&W ならば、不定命題S⊆yを出力し、SとWのユニフィケーション。○inter
- Tが型変数yならば、不定命題S⊆yを出力。○r-var
8. Sが変数xのとき
- Tがneverならば、完全に失敗。×
- Tがanyならば、確定命題 x⊆any を出力。○公理any
- Tがシングルトン型bならば、不定命題 x⊆b を出力。○l-var
- Tがスカラー型Yならば、不定命題 x⊆Y を出力。○l-var
- Tが配列型ならば、不定命題 x⊆T を出力。○l-var
- Tがオブジェクト型ならば、不定命題 x⊆T を出力。○l-var
- Tがタグ付き型 @β W ならば、不定命題 x⊆(@β W) を出力。○l-var
- Tがオプショナル型 W? ならば、不定命題 x ⊆ W? を出力。○l-var ★(x⊆W に還元)
- Tが排他的ユニオン型ならば、不定命題 x⊆T を出力。○l-var★(排他的ユニオンの一般処理ができない)
- Tがインターセクション型 y&W ならば、不定命題x⊆yを出力し、xとWのユニフィケーション。○inter
- Tが型変数yならば、不定命題x⊆yを出力。○r-var, l-var
9. Sがオプショナル型V?のとき
- Tがneverならば、完全に失敗。×
- Tがanyならば、確定命題 V?⊆any を出力。★
- Tがシングルトン型bならば、確定命題 V?⊆b を出力。★
- Tがスカラー型Yならば、確定命題 V?⊆Y を出力。★
- Tが配列型ならば、確定命題 V?⊆T を出力。★
- Tがオブジェクト型ならば、確定命題 V?⊆T を出力。★
- Tがタグ付き型 @β W ならば、確定命題 V?⊆(@β W) を出力。★
- Tがオプショナル型 W? ならば、VとWのユニフィケーション。○b-opt
- Tが排他的ユニオン型ならば、確定命題 V?⊆T を出力。★(排他的ユニオンの一般処理ができない)
- Tがインターセクション型 y&W ならば、不定命題V?⊆yを出力し、V?とWのユニフィケーション。○inter
- Tが型変数yならば、不定命題V?⊆yを出力。○r-var
確定命題はすべて偽になる。
10. Sが無制限ユニオン型U∪Vのとき
- (U, T), (V, T)のANDユニフィケーション。○join ★
出力する命題の形
記号の約束:
確定命題:
- a = b (s-eq; スカラー定数の比較)
- α=β (t-eq; ラベル名の比較)
- a ∈ Y (s-elem; sing(a)⊆Y; スカラー定数のスカラー型所属)
- X⊆Y (st-eq; スカラー型の比較)
不定命題:
- a ∈ y (sing(a)⊆y)
- T⊆y (Tは任意の型、r-var)
- x⊆T (Tは任意の型、l-var)