@@ -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+
3993end 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-
72116namespace resetAig
73117variable {it : Std.Iter Var} {state : Aig} {map : Array Lit}
74118variable {swf : state.WellFormed}
75119variable {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
174157end resetAig
175158
176159@[simp, grind .]
177160theorem 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 .]
182166theorem 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 =]
187172theorem 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 .]
192178theorem 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 .]
197191theorem 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+ -/
0 commit comments