MiniAgda-0.2022.3.11: test/succeed/MeasuredHerSubst1.golden
MiniAgda by Andreas Abel and Karl Mehltretter
--- opening "MeasuredHerSubst1.ma" ---
--- scope checking ---
--- type checking ---
type Maybe : ^(A : Set) -> Set
term Maybe.nothing : .[A : Set] -> < Maybe.nothing : Maybe A >
term Maybe.just : .[A : Set] -> ^(y0 : A) -> < Maybe.just y0 : Maybe A >
term just_ : .[A : Set] -> A -> Maybe A
term just_ = [\ A ->] \ a -> Maybe.just a
term mapMaybe : .[A : Set] -> .[B : Set] -> (A -> B) -> Maybe A -> Maybe B
{ mapMaybe [A] [B] f Maybe.nothing = Maybe.nothing
; mapMaybe [A] [B] f (Maybe.just a) = Maybe.just (f a)
}
type Ty : + Size -> Set
term Ty.base : .[s!ze : Size] -> .[i < s!ze] -> Ty s!ze
term Ty.base : .[i : Size] -> < Ty.base i : Ty $i >
term Ty.arr : .[s!ze : Size] -> .[i < s!ze] -> ^ Ty i -> ^ Ty i -> Ty s!ze
term Ty.arr : .[i : Size] -> ^(y1 : Ty i) -> ^(y2 : Ty i) -> < Ty.arr i y1 y2 : Ty $i >
type Tm : ^(A : Set) -> + Size -> Set
term Tm.var : .[A : Set] -> .[s!ze : Size] -> .[i < s!ze] -> ^ A -> Tm A s!ze
term Tm.var : .[A : Set] -> .[i : Size] -> ^(y1 : A) -> < Tm.var i y1 : Tm A $i >
term Tm.app : .[A : Set] -> .[s!ze : Size] -> .[i < s!ze] -> ^ Tm A i -> ^ Tm A i -> Tm A s!ze
term Tm.app : .[A : Set] -> .[i : Size] -> ^(y1 : Tm A i) -> ^(y2 : Tm A i) -> < Tm.app i y1 y2 : Tm A $i >
term Tm.abs : .[A : Set] -> .[s!ze : Size] -> .[i < s!ze] -> ^ Ty # -> ^ Tm (Maybe A) i -> Tm A s!ze
term Tm.abs : .[A : Set] -> .[i : Size] -> ^(y1 : Ty #) -> ^(y2 : Tm (Maybe A) i) -> < Tm.abs i y1 y2 : Tm A $i >
term mapTm : .[A : Set] -> .[B : Set] -> .[i : Size] -> (A -> B) -> Tm A i -> Tm B i
{ mapTm [A] [B] [i] f (Tm.var [j < i] x) = Tm.var [j] (f x)
; mapTm [A] [B] [i] f (Tm.app [j < i] r s) = Tm.app [j] (mapTm [A] [B] [j] f r) (mapTm [A] [B] [j] f s)
; mapTm [A] [B] [i] f (Tm.abs [j < i] a r) = Tm.abs [j] a (mapTm [Maybe A] [Maybe B] [j] (mapMaybe [A] [B] f) r)
}
term shiftTm : .[A : Set] -> .[i : Size] -> Tm A i -> Tm (Maybe A) i
term shiftTm = [\ A ->] [\ i ->] \ t -> mapTm [A] [Maybe A] [i] (just_ [A]) t
type Res : ^(A : Set) -> +(i : Size) -> Set
term Res.ne : .[A : Set] -> .[i : Size] -> ^(y0 : Tm A #) -> < Res.ne y0 : Res A i >
term Res.nf : .[A : Set] -> .[i : Size] -> ^(y0 : Tm A #) -> ^(y1 : Ty i) -> < Res.nf y0 y1 : Res A i >
term tm : .[A : Set] -> .[i : Size] -> Res A i -> Tm A #
{ tm [A] [i] (Res.ne t) = t
; tm [A] [i] (Res.nf t a) = t
}
term shiftRes : .[A : Set] -> .[i : Size] -> Res A i -> Res (Maybe A) i
{ shiftRes [A] [i] (Res.ne t) = Res.ne (shiftTm [A] [#] t)
; shiftRes [A] [i] (Res.nf t a) = Res.nf (shiftTm [A] [#] t) a
}
term varRes : .[A : Set] -> .[i : Size] -> A -> Res A i
term varRes = [\ A ->] [\ i ->] \ x -> Res.ne (Tm.var [#] x)
term absRes : .[A : Set] -> .[i : Size] -> Ty # -> Res (Maybe A) # -> Res A i
term absRes = [\ A ->] [\ i ->] \ a -> \ r -> Res.ne (Tm.abs [#] a (tm [Maybe A] [#] r))
term appRes : .[A : Set] -> .[i : Size] -> Res A # -> Res A # -> Res A i
term appRes = [\ A ->] [\ i ->] \ t -> \ u -> Res.ne (Tm.app [#] (tm [A] [#] t) (tm [A] [#] u))
type Env : Set -> Set -> Size -> Set
type Env = \ A -> \ B -> \ i -> A -> Res B i
term sg : .[A : Set] -> .[i : Size] -> Tm A # -> Ty i -> Env (Maybe A) A i
{ sg [A] [i] s a Maybe.nothing = Res.nf s a
; sg [A] [i] s a (Maybe.just y) = varRes [A] [i] y
}
term lift : .[A : Set] -> .[B : Set] -> .[i : Size] -> Env A B i -> Env (Maybe A) (Maybe B) i
{ lift [A] [B] [i] rho Maybe.nothing = varRes [Maybe B] [i] Maybe.nothing
; lift [A] [B] [i] rho (Maybe.just x) = shiftRes [B] [i] (rho x)
}
term subst : .[i : Size] -> Ty i -> .[A : Set] -> Tm A # -> Tm (Maybe A) # -> Tm A #
term simsubst : .[i : Size] -> .[j : Size] -> .[A : Set] -> .[B : Set] -> Tm A j -> Env A B i -> Res B i
term normApp : .[i : Size] -> .[B : Set] -> Res B i -> Res B i -> Res B i
{ subst [i] a [A] s t = tm [A] [i] (simsubst [i] [#] [Maybe A] [A] t (sg [A] [i] s a))
}
{ simsubst [i] [j] [A] [B] (Tm.var [j' < j] x) rho = rho x
; simsubst [i] [j] [A] [B] (Tm.abs [j' < j] b t) rho = absRes [B] [i] b (simsubst [i] [j'] [Maybe A] [Maybe B] t (lift [A] [B] [i] rho))
; simsubst [i] [j] [A] [B] (Tm.app [j' < j] t u) rho = let t' : Res B i
= simsubst [i] [j'] [A] [B] t rho
in let u' : Res B i
= simsubst [i] [j'] [A] [B] u rho
in normApp [i] [B] t' u'
}
{ normApp [i] [B] (Res.nf (Tm.abs [.#] b' r') (Ty.arr [i' < i] b c)) u' = Res.nf (subst [i'] b [B] (tm [B] [i] u') r') c
; normApp [i] [B] t' u' = appRes [B] [i] t' u'
}
--- evaluating ---
--- closing "MeasuredHerSubst1.ma" ---