Pure
- 空列はPureの項ではない。
- 任意の識別子は項になる。
- 型推論される。
- 勝手な識別子の型は型変数 'a とされる。型総称な変数ということだろう。
- 併置は適用演算のはず。
- ラムダ抽象は %x. A 、ピリオドの直後の空白は必須。
- η変換は自動で行う。
- β変換も自動で行う。
- op ==> は項で、型は prop=>prop=>prop
- PROPは予約された特殊なキーワードで、式をprop型だと強制するらしい。
- PROPは前置されるが、優先度(結合度)は低い。
- 型定数はpropだけ、射定数は==>だけの体系らしい。
- なぜか分からないが、==> はPROPで型を強制しないと使えないようだ。
- ['a, 'b]=>'c は、'a => 'b => 'c の略記。便利は便利。
- Pureで定義されているclassは型クラスじゃないみたいだ。なんだ、これ?(いやっ、やはり型クラスか?)
- 型が定義されているかどうかは typ "型表現" で分かる。
- default_sortでsortが出てくるが、ソートは意味不明。
名前の導入は
- axiomatizationのシグネチャ部に書く。事前に名前の型が必要。
- 組み込み型以外の型(の名前)が必要なら、typedeclで宣言する。この宣言は、その名前が型の定数名だとマークするだけ。型の実体が決まるわけではなく、構文的に認められる(登録される)だけ。
- 総称的な名前(不定な型を持つ名前)なら、型定数なしに導入できる。例:eq, lessなど。そのときの型変数はパラメータ(圏論なら対象類を走る変数)となる。
- definition "名前 == 項" でも名前を導入できる。
- datatypeもprimrecはPureでは存在しない。帰納的定義をどうするか?
- typedecl は型構成子を定義するので、型変数(構成子の型パラメータ)を使える。
- class宣言はある。sortという言葉もある。型クラスは別物か?関係が謎。
- Pureのレベルでソートという、おそらくは型の集合のような概念があり、classはソートとして登録されているようだ。
- Pureでもlocaleは使えるのでモジュール化は出来る。
axiomatization E:: "'a ⇒ 'a ⇒ prop" (infix "##" 50) where refl: "a ## a"
↑はOK、次はダメ、ワカラン!
axiomatization E:: "'a ⇒ 'a ⇒ prop" (infix "##" 50) where refl: "E a a"
↓はOK
axiomatization E:: "['a, 'a] ⇒ prop" (infix "##" 50) where symm: "E a b ≡ E b a"
↓でもOK
axiomatization E:: "['a, 'a] ⇒ prop" (infix "##" 50) where symm: "a ## b ≡ b ## a"
納得いかん。