packages feed

MiniAgda-0.2022.3.11: test/succeed/Pattern.golden

MiniAgda by Andreas Abel and Karl Mehltretter
--- opening "Pattern.ma" ---
--- scope checking ---
--- type checking ---
type  Unit : Set
term  Unit.unit : < Unit.unit : Unit >
type  Bool : Set
term  Bool.true : < Bool.true : Bool >
term  Bool.false : < Bool.false : Bool >
mixk  if : .[i : Size] -> (A : Set i) -> Bool -> ++(a : A) -> ++(b : A) -> A
{ if [i] A Bool.true a b = a
; if [i] A Bool.false a b = b
}
type  If : Bool -> ++(A : Set) -> ++(B : Set) -> Set
{ If Bool.true A B = A
; If Bool.false A B = B
}
type  Plus : ++(A : Set) -> ++(B : Set) -> Set
type  Plus = \ A -> \ B -> (b : Bool) & If b A B
pattern inl a = (true, a)
pattern inr b = (false, b)
term  casePlus : .[A : Set] -> .[B : Set] -> .[C : Set] -> (A -> C) -> (B -> C) -> Plus A B -> C
{ casePlus [A] [B] [C] f g (Bool.true, a) = f a
; casePlus [A] [B] [C] f g (Bool.false, b) = g b
}
type  Maybe : ++(A : Set) -> Set
type  Maybe = Plus Unit
pattern nothing = inl unit
pattern just a = inr a
term  maybe : .[A : Set] -> .[B : Set] -> B -> (A -> B) -> Maybe A -> B
{ maybe [A] [B] b f (Bool.true, un!t) = b
; maybe [A] [B] b f (Bool.false, a) = f a
}
term  mapMaybe : .[A : Set] -> .[B : Set] -> (A -> B) -> Maybe A -> Maybe B
term  mapMaybe = [\ A ->] [\ B ->] \ f -> maybe [A] [Maybe B] (Bool.true , Unit.unit) (\ a -> (Bool.false , f a))
type  ListF : ++(A : Set) -> ++(X : Set) -> Set
type  ListF = \ A -> \ X -> Maybe (A & X)
type  List : ++(A : Set) -> ++(i : Size) -> Set
{ List A i = .[j < i] & ListF A (List A j)
}
pattern nil j = (j, nothing)
pattern cons j a as = (j, just (a, as))
--- evaluating ---
--- closing "Pattern.ma" ---