Agda-2.3.2.2: examples/outdated-and-incorrect/tait/Prelude.agda
module Prelude where
infix 20 _≡_ _≤_ _∈_
infixl 60 _,_ _++_ _+_ _◄_ _◄²_
_∘_ : {A B : Set}{C : B -> Set}(f : (x : B) -> C x)(g : A -> B)(x : A) -> C (g x)
(f ∘ g) x = f (g x)
data _≡_ {A : Set}(x : A) : {B : Set} -> B -> Set where
refl : x ≡ x
cong : {A : Set}{B : A -> Set}(f : (z : A) -> B z){x y : A} ->
x ≡ y -> f x ≡ f y
cong f refl = refl
subst : {A : Set}(P : A -> Set){x y : A} -> x ≡ y -> P y -> P x
subst P refl px = px
sym : {A : Set}{x y : A} -> x ≡ y -> y ≡ x
sym refl = refl
data Nat : Set where
zero : Nat
suc : Nat -> Nat
_+_ : Nat -> Nat -> Nat
zero + m = m
suc n + m = suc (n + m)
{-# BUILTIN NATURAL Nat #-}
{-# BUILTIN SUC suc #-}
{-# BUILTIN ZERO zero #-}
{-# BUILTIN NATPLUS _+_ #-}
data _≤_ : Nat -> Nat -> Set where
leqZ : {m : Nat} -> zero ≤ m
leqS : {n m : Nat} -> n ≤ m -> suc n ≤ suc m
refl-≤ : {n : Nat} -> n ≤ n
refl-≤ {zero } = leqZ
refl-≤ {suc n} = leqS refl-≤
refl-≤' : {n m : Nat} -> n ≡ m -> n ≤ m
refl-≤' refl = refl-≤
trans-≤ : {x y z : Nat} -> x ≤ y -> y ≤ z -> x ≤ z
trans-≤ leqZ yz = leqZ
trans-≤ (leqS xy) (leqS yz) = leqS (trans-≤ xy yz)
lem-≤suc : {x : Nat} -> x ≤ suc x
lem-≤suc {zero } = leqZ
lem-≤suc {suc x} = leqS lem-≤suc
lem-≤+L : (x : Nat){y : Nat} -> y ≤ x + y
lem-≤+L zero = refl-≤
lem-≤+L (suc x) = trans-≤ (lem-≤+L x) lem-≤suc
lem-≤+R : {x y : Nat} -> x ≤ x + y
lem-≤+R {zero } = leqZ
lem-≤+R {suc x} = leqS lem-≤+R
data List (A : Set) : Set where
ε : List A
_,_ : List A -> A -> List A
_++_ : {A : Set} -> List A -> List A -> List A
xs ++ ε = xs
xs ++ (ys , y) = (xs ++ ys) , y
data All {A : Set}(P : A -> Set) : List A -> Set where
∅ : All P ε
_◄_ : forall {xs x} -> All P xs -> P x -> All P (xs , x)
{-
data Some {A : Set}(P : A -> Set) : List A -> Set where
hd : forall {x xs} -> P x -> Some P (xs , x)
tl : forall {x xs} -> Some P xs -> Some P (xs , x)
-}
data _∈_ {A : Set}(x : A) : List A -> Set where
hd : forall {xs} -> x ∈ xs , x
tl : forall {y xs} -> x ∈ xs -> x ∈ xs , y
_!_ : {A : Set}{P : A -> Set}{xs : List A} ->
All P xs -> {x : A} -> x ∈ xs -> P x
∅ ! ()
(xs ◄ x) ! hd = x
(xs ◄ x) ! tl i = xs ! i
tabulate : {A : Set}{P : A -> Set}{xs : List A} ->
({x : A} -> x ∈ xs -> P x) -> All P xs
tabulate {xs = ε} f = ∅
tabulate {xs = xs , x} f = tabulate (f ∘ tl) ◄ f hd
data All² {I : Set}{A : I -> Set}(P : {i : I} -> A i -> Set) :
{is : List I} -> All A is -> Set where
∅² : All² P ∅
_◄²_ : forall {i is}{x : A i}{xs : All A is} ->
All² P xs -> P x -> All² P (xs ◄ x)
data _∈²_ {I : Set}{A : I -> Set}{i : I}(x : A i) :
{is : List I} -> All A is -> Set where
hd² : forall {is}{xs : All A is} -> x ∈² xs ◄ x
tl² : forall {j is}{y : A j}{xs : All A is} ->
x ∈² xs -> x ∈² xs ◄ y