Agda の集合の Level
Menu Menu集合のLevel
Agda の方を先に読んだ方がわかりやすいはずです。 ここでは、Set n などと書く時の n について調べます。List の定義 で、集合のLevelを取っても、定義自体は問題なく受け入れられます。
postulate A : Set postulate B : Set postulate C : Set postulate a : A postulate b : A postulate c : A infixr 40 _::_ data List (A : Set ) : Set where [] : List A _::_ : A -> List A -> List Aでは、
l1 = a :: []問題ありませんが、
l1' = A :: []では、
Set₁ != Setと言われてしまいます。これは A が Set₁ であることを示しています。a は、宣言から Set です。
集合 (Set) の Level は
open import Levelを使うことにより、操作することができます。Level は自然数であり、zero から suc level という形を持つ。ただの Set は Set zero です。また、
{ c₁ c₂ ℓ : Level} Set (c₁ ⊔ c₂ ⊔ ℓ)などのように ⊔ を使って、大きい方を取ることができます。
infixr 40 _::_ data List (A : Set (suc zero)) : Set (suc zero) where [] : List A _::_ : A -> List A -> List Aとすると、
l1' = A :: []は問題ありませんが、
l1 = a :: []は、
Set != Set₁と言われてしまいます。
すべてのレベルに対する List の定義
Level を含んだ List の定義 は以下のようになります。
infixr 40 _::_ data List {a} (A : Set a) : Set a where [] : List A _::_ : A -> List A -> List A infixl 30 _++_ _++_ : ∀ {a} {A : Set a} -> List A -> List A -> List A [] ++ ys = ys (x :: xs) ++ ys = x :: (xs ++ ys) l1 = a :: [] l1' = A :: [] l2 = a :: b :: a :: c :: [] l3 = l1 ++ l2 infixr 20 _==_ data _==_ {n} {A : Set n} : List A -> List A -> Set n where reflection : {x : List A} -> x == x eq-cons : {x y : List A} { a : A } -> x == y -> ( a :: x ) == ( a :: y ) trans-list : {x y z : List A} { a : A } -> x == y -> y == z -> x == zLevel は{a}という暗黙の引数 (implicit variable) で書かれます。data は「ある Level a」に対して定義されます。
append _++_ は、すべてのレベルに対して定義されています。
_++_ : {a : Level} -> {A : Set a} -> List A -> List A -> List Aとも書きます。data の {a} に ∀ を付けることはできません。
list-id-l : { A : Set } -> { x : List A} -> [] ++ x == x list-id-l = reflection使う場合は、Level を省略しても良い。暗黙の引数は自動的に推論されます。推論に失敗することもありますが。
Level が上がる場合
引数に異なる Level の集合が含まれる場合は、その最大値に合わせる必要があります。
{ c₁ c₂ ℓ : Level} Set (c₁ ⊔ c₂ ⊔ ℓ)を使います。
Level n の集合を返す関数自体は、一つ上の Level の集合である必要があります。 level-ex.agda
module level-ex where open import Level postulate ℓ : Level postulate A : Set ℓ postulate a : A lemma1 : Set ℓ -> A lemma1 = \x -> a lemma2 : A -> Set ℓ lemma2 = \x -> A lemma3 : Set (suc ℓ) lemma3 = A -> Set ℓBinary Relation に、そういう例があります。
-- Heterogeneous binary relations REL : ∀ {a b} → Set a → Set b → (ℓ : Level) → Set (a ⊔ b ⊔ suc ℓ) REL A B ℓ = A → B → Set ℓ -- Homogeneous binary relations Rel : ∀ {a} → Set a → (ℓ : Level) → Set (a ⊔ suc ℓ) Rel A ℓ = REL A A ℓNext : Agda の record