forked from leanprover-community/mathlib3
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrefine_struct.lean
More file actions
211 lines (178 loc) · 6.1 KB
/
Copy pathrefine_struct.lean
File metadata and controls
211 lines (178 loc) · 6.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
import tactic.interactive
import algebra.group.basic
/-!
`refine_struct` caused a variety of interesting problems,
which were identified in
https://github.com/leanprover-community/mathlib/pull/2251
and
https://leanprover.zulipchat.com/#narrow/stream/113488-general/topic/Need.20help.20with.20class.20instance.20resolution
These tests are quite specific to testing the patch made in
https://github.com/leanprover-community/mathlib/pull/2319
and are not a complete test suite for `refine_struct`.
-/
instance pi_has_one {α : Type*} {β : α → Type*} [Π x, has_one (β x)] : has_one (Π x, β x) :=
by refine_struct { .. }; exact λ _, 1
open tactic
run_cmd (do
(declaration.defn _ _ _ b _ _) ← get_decl ``pi_has_one,
-- Make sure that `eq.mpr` really doesn't occur in the body:
when (b.list_constant.contains ``eq.mpr) $
fail "result generated by `refine_struct` contained an unnecessary `eq.mpr`",
-- Make sure that `id` really doesn't occur in the body:
when (b.list_constant.contains ``id) $
fail "result generated by `refine_struct` contained an unnecessary `id`")
-- Next we check that fields defined for embedded structures are unfolded
-- when seen by fields in the outer structure.
structure foo (α : Type):=
(a : α)
structure bar (α : Type) extends foo α :=
(b : a = a)
example : bar ℕ :=
begin
refine_struct { a := 1, .. },
-- We're making sure that the goal is
-- ⊢ 1 = 1
-- rather than
-- ⊢ {a := 1}.a = {a := 1}.a
guard_target 1 = 1,
trivial
end
section
variables {α : Type} [_inst : monoid α]
include _inst
example : true :=
begin
have : group α,
{ refine_struct { .._inst },
guard_tags _field inv group, admit,
guard_tags _field div group, admit,
guard_tags _field div_eq_mul_inv group, admit,
guard_tags _field gpow group, admit,
guard_tags _field gpow_zero' group, admit,
guard_tags _field gpow_succ' group, admit,
guard_tags _field gpow_neg' group, admit,
guard_tags _field mul_left_inv group, admit, },
trivial
end
end
def my_foo {α} (x : semigroup α) (y : group α) : true := trivial
example {α : Type} : true :=
begin
have : true,
{ refine_struct (@my_foo α { .. } { .. } ),
-- 18 goals
guard_tags _field mul semigroup, admit,
-- case semigroup, mul
-- α : Type
-- ⊢ α → α → α
guard_tags _field mul_assoc semigroup, admit,
-- case semigroup, mul_assoc
-- α : Type
-- ⊢ ∀ (a b c : α), a * b * c = a * (b * c)
guard_tags _field mul group, admit,
-- case group, mul
-- α : Type
-- ⊢ α → α → α
guard_tags _field mul_assoc group, admit,
-- case group, mul_assoc
-- α : Type
-- ⊢ ∀ (a b c : α), a * b * c = a * (b * c)
guard_tags _field one group, admit,
-- case group, one
-- α : Type
-- ⊢ α
guard_tags _field one_mul group, admit,
-- case group, one_mul
-- α : Type
-- ⊢ ∀ (a : α), 1 * a = a
guard_tags _field mul_one group, admit,
-- case group, mul_one
-- α : Type
-- ⊢ ∀ (a : α), a * 1 = a
guard_tags _field npow group, admit,
-- case group, npow
-- α : Type
-- ⊢ ℕ → α → α
guard_tags _field npow_zero' group, admit,
-- case group, inv
-- α : Type
-- ⊢ ∀ (x : α), sorry 0 x = 1
guard_tags _field npow_succ' group, admit,
-- case group, npow_succ'
-- α : Type
-- ⊢ ∀ (n : ℕ) (x : α), sorry n.succ x = x * sorry n x
guard_tags _field inv group, admit,
-- case group, inv
-- α : Type
-- ⊢ α → α
guard_tags _field div group, admit,
-- case group, div
-- α : Type
-- ⊢ α → α
guard_tags _field div_eq_mul_inv group, admit,
-- case group, div_eq_mul_inv
-- α : Type
-- ⊢ α → α
guard_tags _field gpow group, admit,
-- case group, gpow
-- α : Type
-- ⊢ ℤ → α → α
guard_tags _field gpow_zero' group, admit,
-- case group, gpow_zero'
-- α : Type
-- ⊢ ∀ (a : α), sorry 0 a = 1
guard_tags _field gpow_succ' group, admit,
-- case group, inv
-- α : Type
-- ⊢ ∀ (n : ℕ) (a : α), sorry (int.of_nat n.succ) a = a * sorry (int.of_nat n) a
guard_tags _field gpow_neg' group, admit,
-- case group, inv
-- α : Type
-- ⊢ ∀ (n : ℕ) (a : α), sorry -[1+ n] a = sorry (sorry ↑(n.succ) a)
guard_tags _field mul_left_inv group, admit,
-- case group, mul_left_inv
-- α : Type
-- ⊢ ∀ (a : α), a⁻¹ * a = 1
},
trivial
end
def my_bar {α} (x : semigroup α) (y : group α) (i j : α) : α := i
example {α : Type} : true :=
begin
have : monoid α,
{ refine_struct { mul := my_bar { .. } { .. } },
guard_tags _field mul semigroup, admit,
guard_tags _field mul_assoc semigroup, admit,
guard_tags _field mul group, admit,
guard_tags _field mul_assoc group, admit,
guard_tags _field one group, admit,
guard_tags _field one_mul group, admit,
guard_tags _field mul_one group, admit,
guard_tags _field npow group, admit,
guard_tags _field npow_zero' group, admit,
guard_tags _field npow_succ' group, admit,
guard_tags _field inv group, admit,
guard_tags _field div group, admit,
guard_tags _field div_eq_mul_inv group, admit,
guard_tags _field gpow group, admit,
guard_tags _field gpow_zero' group, admit,
guard_tags _field gpow_succ' group, admit,
guard_tags _field gpow_neg' group, admit,
guard_tags _field mul_left_inv group, admit,
guard_tags _field mul_assoc monoid, admit,
guard_tags _field one monoid, admit,
guard_tags _field one_mul monoid, admit,
guard_tags _field mul_one monoid, admit,
guard_tags _field npow monoid, admit,
guard_tags _field npow_zero' monoid, admit,
guard_tags _field npow_succ' monoid, admit, },
trivial
end
def my_semigroup := semigroup
example {α} (mul : α → α → α) (h : false) : my_semigroup α :=
begin
refine_struct { mul := mul, .. },
field mul_assoc {
guard_target ∀ a b c : α, mul (mul a b) c = mul a (mul b c),
exact h.elim }
end