lean4-htt/tests/lean/run/test_flat_assoc1.lean
2016-07-29 13:03:23 -07:00

58 lines
1.8 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.

import algebra.group data.nat
open expr decidable tactic nat
meta_definition is_poly_bin_app : expr → option name
| (app (app (app (app (const op ls) A) s) lhs) rhs) := some op
| _ := none
meta_definition is_add (e : expr) : bool :=
match is_poly_bin_app e with
| some op := to_bool (op = `add)
| none := ff
end
meta_definition flat_add (e : expr) : tactic (expr × expr) :=
do when (is_add e = ff) (fail "given expression is not an addition"),
add_fn : expr ← return $ app_fn (app_fn e),
A : expr ← return $ app_arg (app_fn add_fn),
s : expr ← mk_app `add_semigroup [A] >>= mk_instance,
assoc : expr ← mk_mapp `add.assoc [some A, some s],
flat_assoc add_fn assoc e
meta_definition tst_flat_add : tactic unit :=
do trace "--------",
(lhs, rhs) ← target >>= match_eq,
(new_lhs, H) ← flat_add lhs,
trace H,
exact H
example (a b c d : nat) : a + b + c + d = a + (b + (c + d)) :=
by tst_flat_add
example (a b c d : nat) : a + (b + (c + d)) = a + (b + (c + d)) :=
by tst_flat_add
example (a b c d : nat) : ((a + b) + (c + d)) = a + (b + (c + d)) :=
by tst_flat_add
example (a b c d e f : nat) : (a + b) + (c + (d + (e + f))) = a + (b + (c + (d + (e + f)))) :=
by tst_flat_add
example (a b c d e f : nat) : (a + b + c) + (d + (e + f)) = a + (b + (c + (d + (e + f)))) :=
by tst_flat_add
example (a b c d e f : nat) : a + b + c + d + e + f = a + (b + (c + (d + (e + f)))) :=
by tst_flat_add
example (a b c d e f : nat) : a + (b + c) + (d + e) + f = a + (b + (c + (d + (e + f)))) :=
by tst_flat_add
example (a b c d e f : nat) : a + (b + c + d) + (e + f) = a + (b + (c + (d + (e + f)))) :=
by tst_flat_add
example (a b c d e f : nat) : a + (b + (c + d)) + (e + f) = a + (b + (c + (d + (e + f)))) :=
by tst_flat_add
example (a b c d e f : nat) : (a + b) + (c + d) + (e + f) = a + (b + (c + (d + (e + f)))) :=
by tst_flat_add