blob: c95297fa3873e275bbc9de6dd96265a86fe8784e [file] [edit]
inductive Vec (α : Type u) : Nat → Type u
| nil : Vec α 0
| cons : α → Vec α n → Vec α (n+1)
def Vec.map (xs : Vec α n) (f : α → β) : Vec β n :=
match xs with
| nil => nil
| cons a as => cons (f a) (map as f)
def Vec.map' (f : α → β) : Vec α n → Vec β n
| nil => nil
| cons a as => cons (f a) (map' f as)
def Vec.map2 (f : α → α → β) : Vec α n → Vec α n → Vec β n
| nil, nil => nil
| cons a as, cons b bs => cons (f a b) (map2 f as bs)
def Vec.head (xs : Vec α (n+1)) : α :=
match xs with
| cons x _ => x
theorem ex1 (xs ys : Vec α (n+1)) (h : xs = ys) : xs.head = ys.head := by
induction xs -- error, use cases
theorem ex2 (xs ys : Vec α (n+1)) (h : xs = ys) : xs.head = ys.head := by
cases xs with
| cons x xs =>
trace_state -- `h` has been refined
repeat admit
inductive ExprType where
| bool : ExprType
| nat : ExprType
inductive Expr : ExprType → Type
| natVal : Nat → Expr ExprType.nat
| boolVal : Bool → Expr ExprType.bool
| eq : Expr α → Expr α → Expr ExprType.bool
| add : Expr ExprType.nat → Expr ExprType.nat → Expr ExprType.nat
def constProp : Expr α → Expr α
| Expr.add a b =>
match constProp a, constProp b with
| Expr.natVal v, Expr.natVal w => Expr.natVal (v + w)
| a, b => Expr.add a b
| e => e
abbrev denoteType : ExprType → Type
| ExprType.bool => Bool
| ExprType.nat => Nat
instance : BEq (denoteType α) where
beq a b :=
match α, a, b with
| ExprType.bool, a, b => a == b
| ExprType.nat, a, b => a == b
def eval : Expr α → denoteType α
| Expr.natVal v => v
| Expr.boolVal b => b
| Expr.eq a b => eval a == eval b
| Expr.add a b => eval a + eval b
theorem ex3 (a b : Expr α) (h : a = b) : eval (constProp a) = eval b := by
set_option trace.Meta.debug true in
induction a
trace_state -- b's type must have been refined, `h` too
repeat admit
inductive Foo : Nat → Nat → Type where
| mk : Foo 1 2
theorem ex4 (n m : Nat) (heq : n = m) (h : Foo n m) : False := by
induction h using Foo.rec
case mk => contradiction
theorem ex5 (n : Nat) (h : Foo n n) : False := by
induction h using Foo.rec -- error, target repeated