Skip to content
This repository was archived by the owner on Oct 14, 2023. It is now read-only.

Commit 060a554

Browse files
committed
feat(library/tactic): add norm_num_tactic
1 parent b84d581 commit 060a554

File tree

6 files changed

+146
-6
lines changed

6 files changed

+146
-6
lines changed

library/init/algebra/norm_num.lean

Lines changed: 101 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ a + 1
1616
local attribute [reducible] bit0 bit1 add1
1717
local attribute [simp] right_distrib left_distrib
1818

19+
private meta def u : tactic unit :=
20+
`[unfold bit0 bit1 add1]
21+
22+
private meta def usimp : tactic unit :=
23+
u >> `[simp]
24+
1925
lemma mul_zero [mul_zero_class α] (a : α) : a * 0 = 0 :=
2026
by simp
2127

@@ -107,26 +113,26 @@ lemma div_mul_helper [field α] (n d c v : α) (hd : d ≠ 0) (h : (n * c) / d =
107113
(n / d) * c = v :=
108114
by rw [-h, field.div_mul_eq_mul_div_comm _ _ hd, mul_div_assoc]
109115

110-
lemma mul_div_helper [s : field α] (a n d v : α) (hd : d ≠ 0) (h : (a * n) / d = v) :
116+
lemma mul_div_helper [field α] (a n d v : α) (hd : d ≠ 0) (h : (a * n) / d = v) :
111117
a * (n / d) = v :=
112118
by rw [-h, mul_div_assoc]
113119

114-
lemma nonzero_of_div_helper [s : field α] (a b : α) (ha : a ≠ 0) (hb : b ≠ 0) : a / b ≠ 0 :=
120+
lemma nonzero_of_div_helper [field α] (a b : α) (ha : a ≠ 0) (hb : b ≠ 0) : a / b ≠ 0 :=
115121
begin
116122
intro hab,
117123
assert habb : (a / b) * b = 0, rw [hab, zero_mul],
118124
rw [div_mul_cancel _ hb] at habb,
119125
exact ha habb
120126
end
121127

122-
lemma div_helper [s : field α] (n d v : α) (hd : d ≠ 0) (h : v * d = n) : n / d = v :=
128+
lemma div_helper [field α] (n d v : α) (hd : d ≠ 0) (h : v * d = n) : n / d = v :=
123129
begin
124130
apply eq_of_mul_eq_mul_of_nonzero_right hd,
125131
rw (div_mul_cancel _ hd),
126132
exact eq.symm h
127133
end
128134

129-
lemma div_eq_div_helper [s : field α] (a b c d v : α) (h1 : a * d = v) (h2 : c * b = v)
135+
lemma div_eq_div_helper [field α] (a b c d v : α) (h1 : a * d = v) (h2 : c * b = v)
130136
(hb : b ≠ 0) (hd : d ≠ 0) : a / b = c / d :=
131137
begin
132138
apply eq_div_of_mul_eq,
@@ -138,8 +144,98 @@ begin
138144
rw [h1, h2]
139145
end
140146

141-
lemma subst_into_div [s : has_div α] (a₁ b₁ a₂ b₂ v : α) (h : a₁ / b₁ = v) (h1 : a₂ = a₁)
147+
lemma subst_into_div [has_div α] (a₁ b₁ a₂ b₂ v : α) (h : a₁ / b₁ = v) (h1 : a₂ = a₁)
142148
(h2 : b₂ = b₁) : a₂ / b₂ = v :=
143149
by rw [h1, h2, h]
144150

151+
152+
lemma add_comm_four [add_comm_semigroup α] (a b : α) : a + a + (b + b) = (a + b) + (a + b) :=
153+
by simp
154+
155+
lemma add_comm_middle [add_comm_semigroup α] (a b c : α) : a + b + c = a + c + b :=
156+
by simp
157+
158+
lemma bit0_add_bit0 [add_comm_semigroup α] (a b : α) : bit0 a + bit0 b = bit0 (a + b) :=
159+
by usimp
160+
161+
lemma bit0_add_bit0_helper [add_comm_semigroup α] (a b t : α) (h : a + b = t) :
162+
bit0 a + bit0 b = bit0 t :=
163+
begin rw -h, usimp end
164+
165+
lemma bit1_add_bit0 [add_comm_semigroup α] [has_one α] (a b : α) : bit1 a + bit0 b = bit1 (a + b) :=
166+
by usimp
167+
168+
lemma bit1_add_bit0_helper [add_comm_semigroup α] [has_one α] (a b t : α)
169+
(h : a + b = t) : bit1 a + bit0 b = bit1 t :=
170+
begin rw -h, usimp end
171+
172+
lemma bit0_add_bit1 [add_comm_semigroup α] [has_one α] (a b : α) :
173+
bit0 a + bit1 b = bit1 (a + b) :=
174+
by usimp
175+
176+
lemma bit0_add_bit1_helper [add_comm_semigroup α] [has_one α] (a b t : α)
177+
(h : a + b = t) : bit0 a + bit1 b = bit1 t :=
178+
begin rw -h, usimp end
179+
180+
lemma bit1_add_bit1 [add_comm_semigroup α] [has_one α] (a b : α) :
181+
bit1 a + bit1 b = bit0 (add1 (a + b)) :=
182+
by usimp
183+
184+
lemma bit1_add_bit1_helper [add_comm_semigroup α] [has_one α] (a b t s : α)
185+
(h : (a + b) = t) (h2 : add1 t = s) : bit1 a + bit1 b = bit0 s :=
186+
begin rw -h at h2, rw -h2, usimp end
187+
188+
lemma bin_add_zero [add_monoid α] (a : α) : a + zero = a :=
189+
by simp
190+
191+
lemma bin_zero_add [add_monoid α] (a : α) : zero + a = a :=
192+
by simp
193+
194+
lemma one_add_bit0 [add_comm_semigroup α] [has_one α] (a : α) : one + bit0 a = bit1 a :=
195+
begin unfold bit0 bit1, simp end
196+
197+
lemma bit0_add_one [has_add α] [has_one α] (a : α) : bit0 a + one = bit1 a :=
198+
rfl
199+
200+
lemma bit1_add_one [has_add α] [has_one α] (a : α) : bit1 a + one = add1 (bit1 a) :=
201+
rfl
202+
203+
lemma bit1_add_one_helper [has_add α] [has_one α] (a t : α) (h : add1 (bit1 a) = t) :
204+
bit1 a + one = t :=
205+
by rw -h
206+
207+
lemma one_add_bit1 [add_comm_semigroup α] [has_one α] (a : α) : one + bit1 a = add1 (bit1 a) :=
208+
begin unfold bit0 bit1 add1, simp end
209+
210+
lemma one_add_bit1_helper [add_comm_semigroup α] [has_one α] (a t : α)
211+
(h : add1 (bit1 a) = t) : one + bit1 a = t :=
212+
begin rw -h, usimp end
213+
214+
lemma add1_bit0 [has_add α] [has_one α] (a : α) : add1 (bit0 a) = bit1 a :=
215+
rfl
216+
217+
lemma add1_bit1 [add_comm_semigroup α] [has_one α] (a : α) :
218+
add1 (bit1 a) = bit0 (add1 a) :=
219+
by usimp
220+
221+
lemma add1_bit1_helper [add_comm_semigroup α] [has_one α] (a t : α) (h : add1 a = t) :
222+
add1 (bit1 a) = bit0 t :=
223+
begin rw -h, usimp end
224+
225+
lemma add1_one [has_add α] [has_one α] : add1 (one : α) = bit0 one :=
226+
rfl
227+
228+
lemma add1_zero [add_monoid α] [has_one α] : add1 (zero : α) = one :=
229+
by usimp
230+
231+
lemma one_add_one [has_add α] [has_one α] : (one : α) + one = bit0 one :=
232+
rfl
233+
234+
lemma subst_into_sum [has_add α] (l r tl tr t : α) (prl : l = tl) (prr : r = tr)
235+
(prt : tl + tr = t) : l + r = t :=
236+
by rw [-prt, prr, prl]
237+
238+
lemma neg_zero_helper [add_group α] (a : α) (h : a = 0) : - a = 0 :=
239+
begin rw h, simp end
240+
145241
end norm_num

library/init/meta/simp_tactic.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,9 @@ meta def join_user_simp_lemmas : list name → tactic simp_lemmas
309309
| [] := simp_lemmas.mk_default
310310
| attr_names := join_user_simp_lemmas_core simp_lemmas.mk attr_names
311311

312+
/- Normalize numerical expression, returns a pair (n, pr) where n is the resultant numeral,
313+
and pr is a proof that the input argument is equal to n. -/
314+
meta constant norm_num : expr → tactic (expr × expr)
312315
end tactic
313316

314317
export tactic (mk_simp_attr)

src/library/tactic/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ add_library(tactic OBJECT occurrences.cpp kabstract.cpp tactic_state.cpp
88
hsubstitution.cpp gexpr.cpp elaborate.cpp init_module.cpp
99
simp_result.cpp user_attribute.cpp eval.cpp
1010
simp_lemmas.cpp eqn_lemmas.cpp dsimplify.cpp simplify.cpp
11-
vm_monitor.cpp)
11+
vm_monitor.cpp norm_num_tactic.cpp)

src/library/tactic/init_module.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Author: Leonardo de Moura
3333
#include "library/tactic/dsimplify.h"
3434
#include "library/tactic/simplify.h"
3535
#include "library/tactic/vm_monitor.h"
36+
#include "library/tactic/norm_num_tactic.h"
3637
#include "library/tactic/backward/init_module.h"
3738

3839
namespace lean {
@@ -66,10 +67,12 @@ void initialize_tactic_module() {
6667
initialize_simp_lemmas();
6768
initialize_eqn_lemmas();
6869
initialize_dsimplify();
70+
initialize_norm_num_tactic();
6971
initialize_vm_monitor();
7072
}
7173
void finalize_tactic_module() {
7274
finalize_vm_monitor();
75+
finalize_norm_num_tactic();
7376
finalize_dsimplify();
7477
finalize_eqn_lemmas();
7578
finalize_simp_lemmas();
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Robert Y. Lewis, Leonardo de Moura
5+
*/
6+
#include "library/norm_num.h"
7+
#include "library/type_context.h"
8+
#include "library/vm/vm_expr.h"
9+
#include "library/tactic/tactic_state.h"
10+
11+
namespace lean {
12+
vm_obj tactic_norm_num(vm_obj const & e, vm_obj const & _s) {
13+
tactic_state const & s = to_tactic_state(_s);
14+
type_context ctx = mk_type_context_for(s);
15+
try {
16+
pair<expr, expr> p = mk_norm_num(ctx, to_expr(e));
17+
return mk_tactic_success(mk_vm_pair(to_obj(p.first), to_obj(p.second)), s);
18+
} catch (exception & ex) {
19+
return mk_tactic_exception(ex, s);
20+
}
21+
}
22+
23+
void initialize_norm_num_tactic() {
24+
DECLARE_VM_BUILTIN(name({"tactic", "norm_num"}), tactic_norm_num);
25+
}
26+
void finalize_norm_num_tactic() {
27+
}
28+
}

src/library/tactic/norm_num_tactic.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Robert Y. Lewis, Leonardo de Moura
5+
*/
6+
#pragma once
7+
namespace lean {
8+
void initialize_norm_num_tactic();
9+
void finalize_norm_num_tactic();
10+
}

0 commit comments

Comments
 (0)