Skip to content

Commit ea2ae5c

Browse files
committed
Tidying work on resetAig proof
* The denote proof is broken for now
1 parent bd539c8 commit ea2ae5c

5 files changed

Lines changed: 158 additions & 130 deletions

File tree

Valaig/Aig/Iter.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ theorem length_eq_size_sub_val [lawful : Lawful inc valid toNat ofNat size] :
143143
induction it using Std.Iter.inductSteps with | step it ihy _ =>
144144
grind [Std.Iter.length_eq_match_step, lawful.consecutive, lawful.max]
145145

146+
grind_pattern length_eq_size_sub_val => it.length, size - toNat it.val
147+
146148
omit [DecidablePred valid] in
147149
@[simp, grind! .]
148150
theorem val_init :
@@ -176,6 +178,8 @@ theorem length_yield_gt_zero (h : it.IsPlausibleStep (.yield it' out)) :
176178
it.length > 0 := by
177179
grind [lawful.max]
178180

181+
grind_pattern length_yield_gt_zero => it.IsPlausibleStep (.yield it' out), it.length
182+
179183
@[simp]
180184
theorem length_yield' (h : it.IsPlausibleStep (.yield it' out)) :
181185
it'.length + 1 = it.length := by
@@ -195,6 +199,8 @@ theorem length_zero_done (h : it.length = 0) :
195199
it.step.val = .done := by
196200
grind [lawful.max]
197201

202+
grind_pattern length_zero_done => it.length, it.step
203+
198204
@[simp, grind .]
199205
theorem length_le_size :
200206
it.length ≤ size := by

Valaig/Aig/Projections.lean

Lines changed: 139 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,60 @@ theorem input_validIn_initLeaves {idx : InputIdx} (valid : idx.validIn aig) :
3636
idx.validIn (initLeaves aig) := by
3737
grind [InputIdx.validIn_eq]
3838

39+
@[always_inline]
40+
def step (aig : Aig) (state : Aig) (map : Array Lit) (var : Var)
41+
(valid : var.validIn aig := by grind)
42+
(wf : aig.WellFormed := by grind)
43+
(inputsValid : {idx : InputIdx} → idx.validIn aig → idx.validIn state := by grind)
44+
(valid : ∀ {lit}, lit ∈ map → lit.validIn state := by grind)
45+
(size : var.idx = map.size := by grind) :
46+
Aig × Array Lit :=
47+
let mapLit (lit : Lit) (h : lit.var < var := by grind) : Lit.In state :=
48+
lit.mapTo map[lit.var.idx] |>.castIn state
49+
50+
let (eq:=_) (state, lit) : Aig × Lit :=
51+
match _ : aig[var] with
52+
| .false => (state, .false)
53+
| .input idx => (state, idx.getLit state)
54+
| .latch idx => (state, mapLit (idx.getReset aig))
55+
| .and rhs0 rhs1 => state.addAnd (mapLit rhs0) (mapLit rhs1)
56+
57+
(state, map.push lit)
58+
59+
variable {state : Aig} {map : Array Lit} {var : Var}
60+
variable {valid : var.validIn aig}
61+
variable {wf : aig.WellFormed}
62+
variable {swf : state.WellFormed}
63+
variable {inputsValid : {idx : InputIdx} → idx.validIn aig → idx.validIn state}
64+
variable {valid : ∀ {lit}, lit ∈ map → lit.validIn state}
65+
variable {size : var.idx = map.size}
66+
67+
@[simp, grind =]
68+
theorem size_step :
69+
(step aig state map var).snd.size = map.size + 1 := by
70+
unfold step
71+
grind
72+
73+
@[simp, grind .]
74+
theorem inputsValid_step {idx : InputIdx} (h : idx.validIn aig) :
75+
idx.validIn (step aig state map var).fst := by
76+
unfold step
77+
grind
78+
79+
include swf in
80+
@[simp, grind .]
81+
theorem WellFormed_step :
82+
(step aig state map var).fst.WellFormed := by
83+
unfold step
84+
grind
85+
86+
include swf in
87+
@[simp, grind .]
88+
theorem valid_step {lit} (h : lit ∈ (step aig state map var).snd) :
89+
lit.validIn (step aig state map var).fst := by
90+
simp_all [step]
91+
grind
92+
3993
end resetAig
4094

4195
/--
@@ -55,146 +109,119 @@ where
55109
| .done _ =>
56110
⟨state, fun lit => lit.val.mapTo <| map[lit.val.var.idx]'(by grind [Var.validIn_eq])⟩
57111
| .yield it' var _ =>
58-
let mapLit (lit : Lit) (h : lit.var < var := by grind) : Lit.In state :=
59-
lit.mapTo map[lit.var.idx] |>.castIn state
60-
61-
match _ : aig[var] with
62-
| .false => go it' state <| map.push .false
63-
| .input idx => go it' state <| map.push <| idx.getLit state
64-
| .latch idx => go it' state <| map.push <| mapLit (idx.getReset aig)
65-
| .and rhs0 rhs1 =>
66-
let (eq:=_) (state, lit) := state.addAnd (mapLit rhs0) (mapLit rhs1)
67-
go it' state <| map.push lit
112+
let (eq:=_) res := resetAig.step aig state map var
113+
go it' res.fst res.snd
68114
termination_by it.finitelyManySteps
69115

70-
-- Mark it as Comb, WellFormed, inputs valid iff, matching semantics
71-
72116
namespace resetAig
73117
variable {it : Std.Iter Var} {state : Aig} {map : Array Lit}
74118
variable {swf : state.WellFormed}
75119
variable {size : it.val.idx = map.size}
76120

77-
@[simp, grind .]
78-
theorem Comb_go (comb : state.Comb) :
79-
(go aig wf it state map swf inputsValid valid size).fst.Comb := by
80-
fun_induction go <;> grind
81-
82-
@[simp, grind .]
83-
theorem WellFormed_go :
84-
(go aig wf it state map swf inputsValid valid size).fst.WellFormed := by
85-
fun_induction go <;> assumption
86-
87-
@[simp, grind =]
88-
theorem numInputs_go :
89-
(go aig wf it state map swf inputsValid valid size).fst.numInputs = state.numInputs := by
90-
fun_induction go <;> grind
91-
92-
@[simp, grind .]
93-
theorem go_validIn {lit : Lit.In aig} :
121+
def go.induction
122+
(motive : (Aig × (Lit.In aig -> Lit)) -> Prop)
123+
(init : motive (state, (go aig wf it state map).snd))
124+
(ind :
125+
(it : Std.Iter Var) -> (state : Aig) -> (map : Array Lit) ->
126+
(swf : state.WellFormed) ->
127+
(inputsValid : {idx : InputIdx} → idx.validIn aig → idx.validIn state) ->
128+
(valid : ∀ {lit}, lit ∈ map → lit.validIn state) ->
129+
(valid' : it.val.validIn aig) ->
130+
(size : it.val.idx = map.size) ->
131+
(h : motive (state, (go aig wf it state map).snd)) ->
132+
motive ((step aig state map it.val).fst, (go aig wf it state map).snd)) :
94133
let res := go aig wf it state map swf inputsValid valid size
95-
(res.snd lit).validIn res.fst := by
96-
fun_induction go <;> grind
97-
98-
@[simp, grind .]
99-
theorem input_validIn_go {idx : InputIdx} (valid : idx.validIn aig) :
100-
idx.validIn (go aig wf it state map swf inputsValid valid' size).fst := by
101-
fun_induction go <;> grind
102-
103-
@[simp, grind =]
104-
theorem go_map_eq {lit : Lit.In aig} (lt : lit.val.var < it.val) :
105-
(go aig wf it state map swf inputsValid valid' size).snd lit =
106-
(lit.val.mapTo map[lit.val.var.idx]) := by
107-
fun_induction go <;> grind
108-
109-
@[simp, grind .]
110-
theorem Monotone_go :
111-
state ≤ (go aig wf it state map swf inputsValid valid' size).fst := by
112-
fun_induction go <;> grind
113-
114-
-- TODO: This needs tidying badly
115-
@[simp, grind .]
116-
theorem denote_go {assign} {lit : Lit} (valid : lit.validIn aig)
117-
(h : ∀ {var' : Var} (_ : var'.validIn aig) (_ : var' < it.val),
118-
state.denote map[var'.idx] 0 assign = aig.denoteVar var' 0 assign) :
119-
let res := go aig wf it state map swf inputsValid valid' size
120-
res.fst.denote (res.snd ⟨lit, valid⟩) 0 assign =
121-
aig.denote lit 0 assign := by
122-
intro res
123-
generalize heq : go aig wf it state map swf inputsValid valid' size = aaa
124-
have : res = aaa := by grind
125-
simp only [this]
134+
motive res := by
126135
fun_induction go
127-
· grind [go]
128-
· unfold go at heq
129-
split at heq
130-
· grind
131-
· split at heq
132-
· grind [Var.ext_idx]
133-
· grind
134-
· grind
135-
· grind
136-
· unfold go at heq
137-
grind [Var.ext_idx]
138-
· unfold go at heq
139-
split at heq
140-
· grind
141-
· split at heq
142-
· grind
143-
· grind
144-
· simp_all [-denote_eq]
145-
rename_i var _ _ idx _ _ ih _
146-
apply ih
147-
· clear ih
148-
intro var' _ _
149-
grind [Var.ext_idx]
150-
· grind
151-
· trivial
152-
· grind
153-
· unfold go at heq
154-
split at heq
155-
· grind
156-
· split at heq
157-
· grind
158-
· grind
159-
· grind
160-
· simp_all [-denote_eq]
161-
rename_i var _ _ _ _ heq _ ih _
162-
apply ih
163-
· clear ih
164-
intro var' _ _
165-
simp only [Array.getElem_push]
166-
split
167-
· grind
168-
· clear heq
169-
have : var = var' := by grind [Var.ext_idx]
170-
grind
171-
· grind
172-
· trivial
136+
· grind
137+
next ih =>
138+
apply ih
139+
clear ih
140+
grind [go]
141+
142+
def induction
143+
(motive : (Aig × (Lit.In aig -> Lit)) -> Prop)
144+
(init : motive (initLeaves aig, (go aig wf aig.iter (initLeaves aig) (.emptyWithCapacity aig.size)).snd))
145+
(ind :
146+
(it : Std.Iter Var) -> (state : Aig) -> (map : Array Lit) ->
147+
(swf : state.WellFormed) ->
148+
(inputsValid : {idx : InputIdx} → idx.validIn aig → idx.validIn state) ->
149+
(valid : ∀ {lit}, lit ∈ map → lit.validIn state) ->
150+
(valid' : it.val.validIn aig) ->
151+
(size : it.val.idx = map.size) ->
152+
(h : motive (state, (go aig wf it state map).snd)) ->
153+
motive ((step aig state map it.val).fst, (go aig wf it state map).snd)) :
154+
motive aig.resetAig := by
155+
apply go.induction motive <;> grind
173156

174157
end resetAig
175158

176159
@[simp, grind .]
177160
theorem Comb_resetAig :
178161
aig.resetAig.fst.Comb := by
179-
grind [resetAig]
162+
apply resetAig.induction (·.fst.Comb)
163+
<;> (try unfold resetAig.step) <;> grind
180164

181165
@[simp, grind .]
182166
theorem WellFormed_resetAig :
183167
aig.resetAig.fst.WellFormed := by
184-
grind [resetAig]
168+
apply resetAig.induction (·.fst.WellFormed)
169+
<;> (try unfold resetAig.step) <;> grind
185170

186171
@[simp, grind =]
187172
theorem numInputs_resetAig :
188173
aig.resetAig.fst.numInputs = aig.numInputs := by
189-
grind [resetAig]
174+
apply resetAig.induction (·.fst.numInputs = aig.numInputs)
175+
<;> (try unfold resetAig.step) <;> grind
190176

191177
@[simp, grind .]
192178
theorem resetAig_validIn {lit : Lit.In aig} :
193179
(aig.resetAig.snd lit).validIn aig.resetAig.fst := by
194-
grind [resetAig]
195-
180+
grind [resetAig, @go_validIn]
181+
where
182+
go_validIn {it state map swf inputsValid valid size} :
183+
let res := resetAig.go aig wf it state map swf inputsValid valid size
184+
(res.snd lit).validIn res.fst := by
185+
fun_induction resetAig.go <;> grind
186+
187+
/-
188+
-- set_option trace.grind.ematch.instance true in
189+
set_option maxHeartbeats 500000 in
196190
@[simp, grind .]
197191
theorem denote_resetAig {assign} {lit : Lit} (valid : lit.validIn aig) :
198192
aig.resetAig.fst.denote (aig.resetAig.snd ⟨lit, valid⟩) 0 assign =
199193
aig.denote lit 0 assign := by
200-
grind [resetAig]
194+
sorry
195+
where
196+
denote_step {state : Aig} {map var inputsValid valid valid' size} {swf : state.WellFormed}
197+
(denote : ∀ {var: Var} (valid : var.validIn aig) (lt : var.idx < map.size),
198+
state.denote map[var.idx] 0 assign = aig.denoteVar var 0 assign) :
199+
let res := resetAig.step aig state map var valid wf inputsValid valid' size
200+
var.idx < res.snd.size →
201+
res.fst.denote res.snd[var.idx] 0 assign = aig.denoteVar var 0 assign := by
202+
-- intro res h
203+
-- have : res.snd.size = map.size + 1 := by grind
204+
-- rw [this] at h
205+
-- subst res
206+
-- simp only [resetAig.step]
207+
208+
cases h : aig[var] with
209+
| false => -- simp [resetAig.step]
210+
sorry
211+
-- grind
212+
| input idx => -- simp [resetAig.step]
213+
sorry
214+
-- grind
215+
| latch idx =>
216+
simp only [resetAig.step]
217+
grind
218+
| and _ _ =>
219+
intro res h'
220+
have : res.snd.size = map.size + 1 := by grind
221+
rw [this] at h'
222+
subst res
223+
rw [denoteVar_get_and h]
224+
simp [resetAig.step]
225+
-- grind
226+
-- grind (splits := 10)
227+
-/

Valaig/Aig/Refs.lean

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ theorem ext_idx (var var' : Var) :
3434
var = var' ↔ var.idx = var'.idx := by
3535
grind only [Var]
3636

37+
@[ext, grind ext]
38+
theorem ext_idx' (var var' : Var) (eq : var.idx = var'.idx) :
39+
var = var' := by
40+
grind only [Var]
41+
3742
-- Instantiate these directly for inlining
3843
instance : Ord Var where compare := (compare ·.idx ·.idx)
3944

@@ -48,7 +53,7 @@ theorem le_idx (var var' : Var) :
4853
instance : Std.IsLinearOrder Var := by
4954
apply Std.IsLinearOrder.of_le
5055
<;> constructor
51-
<;> grind [ext_idx, le_idx]
56+
<;> grind [le_idx]
5257

5358
instance : LT Var where lt := (·.idx < ·.idx)
5459
instance : DecidableLT Var := fun a b =>
@@ -105,7 +110,7 @@ theorem idx_constant :
105110

106111
theorem constant_iff_idx_zero :
107112
var = constant ↔ var.idx = 0 := by
108-
grind [Var.ext_idx]
113+
grind
109114

110115
/--
111116
Adding a `Nat` to a `Var` increments the `Var`'s index.

Valaig/Aig/Semantics.lean

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -410,21 +410,13 @@ theorem denoteVar_addInput_self :
410410
grind
411411

412412
@[simp, grind =]
413-
theorem denoteVar_addLatch_self_reset {next reset : Lit} (nextValid : next.validIn aig) (resetValid : reset.validIn aig) :
414-
(aig.addLatch next reset).fst.denoteVar ((aig.addLatch next reset).snd.getVar (aig.addLatch next reset).fst) 0 assign =
415-
aig.denote reset 0 assign := by
416-
grind
417-
418-
@[simp]
419-
theorem denoteVar_addLatch_self_next {next reset : Lit} (nextValid : next.validIn aig) (resetValid : reset.validIn aig)
420-
{n} (h : frame = Nat.succ n) :
413+
theorem denoteVar_addLatch_self {next reset : Lit} (nextValid : next.validIn aig) (resetValid : reset.validIn aig) :
421414
(aig.addLatch next reset).fst.denoteVar ((aig.addLatch next reset).snd.getVar (aig.addLatch next reset).fst) frame assign =
422-
aig.denote next n assign := by
415+
match frame with
416+
| 0 => aig.denote reset 0 assign
417+
| n + 1 => aig.denote next n assign := by
423418
grind
424419

425-
grind_pattern denoteVar_addLatch_self_next =>
426-
(aig.addLatch next reset).fst.denoteVar ((aig.addLatch next reset).snd.getVar (aig.addLatch next reset).fst) frame assign, Nat.succ n
427-
428420
@[simp, grind =]
429421
theorem denote_addAnd_self {rhs0 rhs1 : Lit} (h0 : rhs0.validIn aig) (h1 : rhs1.validIn aig) :
430422
(aig.addAnd rhs0 rhs1 h0 h1).fst.denote (aig.addAnd rhs0 rhs1 h0 h1).snd frame assign =

Valaig/Aig/ValidIn.lean

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,7 @@ theorem addInput_getVar_mono {var : Var} (valid : var.validIn aig):
139139
aig.addInput.snd.getVar aig.addInput.fst > var := by
140140
simpa [Var.lt_idx, Std.mkAtom_ref_eq_decls_size, simp_valaig_defs]
141141

142-
grind_pattern addInput_getVar_mono =>
143-
var.validIn aig, aig.addInput.snd.getVar aig.addInput.fst where
142+
grind_pattern addInput_getVar_mono => aig.addInput.snd.getVar aig.addInput.fst > var where
144143
var =/= aig.addInput.snd.getVar aig.addInput.fst
145144

146145
@[simp, grind =]
@@ -185,8 +184,7 @@ theorem addLatch_getVar_mono {var : Var} (valid : var.validIn aig):
185184
(aig.addLatch next reset).snd.getVar (aig.addLatch next reset).fst > var := by
186185
simpa [Var.lt_idx, Std.mkAtom_ref_eq_decls_size, simp_valaig_defs]
187186

188-
grind_pattern addLatch_getVar_mono =>
189-
var.validIn aig, (aig.addLatch next reset).snd.getVar (aig.addLatch next reset).fst where
187+
grind_pattern addLatch_getVar_mono => (aig.addLatch next reset).snd.getVar (aig.addLatch next reset).fst > var where
190188
var =/= (aig.addLatch next reset).snd.getVar (aig.addLatch next reset).fst
191189

192190
@[simp, grind =]

0 commit comments

Comments
 (0)