lean4-htt/tests/lean/run/smt_ematch2.lean
2017-02-11 18:37:15 -08:00

109 lines
2.7 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

universe variables u
namespace foo
variables {α : Type u}
open smt_tactic
meta def no_ac : smt_config :=
{ cc_cfg := { ac := ff }}
meta def blast : tactic unit :=
using_smt_with no_ac $ intros >> repeat (ematch >> try close)
section add_comm_monoid
variables [add_comm_monoid α]
attribute [ematch] add_comm add_assoc
theorem add_comm_three (a b c : α) : a + b + c = c + b + a :=
by blast
theorem add.comm4 : ∀ (n m k l : α), n + m + (k + l) = n + k + (m + l) :=
by blast
end add_comm_monoid
section group
variable [group α]
attribute [ematch] mul_assoc mul_left_inv one_mul
theorem inv_mul_cancel_left (a b : α) : a⁻¹ * (a * b) = b :=
by blast
end group
namespace subt
constant subt : nat → nat → Prop
axiom subt_trans {a b c : nat} : subt a b → subt b c → subt a c
attribute [ematch] subt_trans
lemma ex (a b c d : nat) : subt a b → subt b c → subt c d → subt a d :=
by blast
end subt
section ring
variables [ring α] (a b : α)
attribute [ematch] zero_mul
lemma ex2 : a = 0 → a * b = 0 :=
by blast
definition ex1 (a b : int) : a = 0 → a * b = 0 :=
by blast
end ring
namespace cast1
constant C : nat → Type
constant f : ∀ n, C n → C n
axiom fax (n : nat) (a : C (2*n)) : (: f (2*n) a :) = a
attribute [ematch] fax
lemma ex3 (n m : nat) (a : C n) : n = 2*m → f n a = a :=
by blast
end cast1
namespace cast2
constant C : nat → Type
constant f : ∀ n, C n → C n
constant g : ∀ n, C n → C n → C n
axiom gffax (n : nat) (a b : C n) : (: g n (f n a) (f n b) :) = a
attribute [ematch] gffax
lemma ex4 (n m : nat) (a c : C n) (b : C m) : n = m → a == f m b → g n a (f n c) == b :=
by blast
end cast2
namespace cast3
constant C : nat → Type
constant f : ∀ n, C n → C n
constant g : ∀ n, C n → C n → C n
axiom gffax (n : nat) (a b : C n) : (: g n a b :) = a
attribute [ematch] gffax
lemma ex5 (n m : nat) (a c : C n) (b : C m) (e : m = n) : a == b → g n a a == b :=
by blast
end cast3
namespace tuple
constant {α} tuple: Type α → nat → Type α
constant nil {α : Type u} : tuple α 0
constant append {α : Type u} {n m : nat} : tuple α n → tuple α m → tuple α (n + m)
infix ` ++ ` := append
axiom append_assoc {α : Type u} {n₁ n₂ n₃ : nat} (v₁ : tuple α n₁) (v₂ : tuple α n₂) (v₃ : tuple α n₃) :
(v₁ ++ v₂) ++ v₃ == v₁ ++ (v₂ ++ v₃)
attribute [ematch] append_assoc
variables {p m n q : nat}
variables {xs : tuple α m}
variables {ys : tuple α n}
variables {zs : tuple α p}
variables {ws : tuple α q}
lemma ex6 : p = m + n → zs == xs ++ ys → zs ++ ws == xs ++ (ys ++ ws) :=
by blast
def ex : p = n + m → zs == xs ++ ys → zs ++ ws == xs ++ (ys ++ ws) :=
by blast
end tuple
end foo