構文的なdom/cod
これは、あくまで構文的であり、決して意味的ではないことに注意。意味的な議論は解釈を決めないとできないし、解釈は色々あり、解釈ごとに定義は変わる。
基底:コマンド呼び出しと定数
- Dom(f::S -> T) = S
- Dom(c) = null
帰納ステップ:
- Dom(E | F) = Dom(E)
- Dom([E, F]) = Dom(E)∩Dom(F) (∩は & に還元可能)
- Dom({α:E, β:F}) = Dom(E)∩Dom(F)
- Dom(when {α=>E, β=>F}) = (@α Dom(E) | @β Dom(F))
- Dom(each{E}) = list[Dom(E)]
- Dom(@α E) = Dom(E)
- Cod(E | F) = Cod(F)
- Cod([E, F]) = tuple [Cod(E), Cod(F)]
- Cod({α:E, β:F}) = object {α: Cod(E), β:Cod(F)}
- Cod(when {α=>E, β=>F}) = Cod(E)∪Cod(F) (還元不可能)
- Cod(each{E}) = list[Cod(E)]
- Cod(@α E) = @α Cod(E)
集合の合併∪は、型表現に還元不可能なので、プロファイルは一般に次の形になる。
- S -> T1, T2, ..., Tn