77
88prelude
99public import Std.Sat.AIG.CachedGates
10+ import Init.Grind
1011
1112@[expose] public section
1213
@@ -47,10 +48,12 @@ private theorem imp_as_aig : ∀ (a b : Bool), (!(a && !b)) = (!a || b) := by
4748
4849variable {α : Type } [Hashable α] [DecidableEq α]
4950
51+ @[grind! .]
5052theorem mkNotCached_le_size (aig : AIG α) (gate : Ref aig) :
5153 aig.decls.size ≤ (aig.mkNotCached gate).aig.decls.size := by
5254 simp [mkNotCached]
5355
56+ @[grind =]
5457theorem mkNotCached_decl_eq idx (aig : AIG α) (gate : Ref aig) {h : idx < aig.decls.size} {h2} :
5558 (aig.mkNotCached gate).aig.decls[idx]'h2 = aig.decls[idx]'h := by
5659 simp [mkNotCached]
@@ -66,17 +69,18 @@ theorem denote_mkNotCached {aig : AIG α} {gate : Ref aig} :
6669 ⟦aig.mkNotCached gate, assign⟧ = !⟦aig, gate, assign⟧ := by
6770 simp [mkNotCached]
6871
72+ @[grind! .]
6973theorem mkAndCached_le_size (aig : AIG α) (input : BinaryInput aig) :
7074 aig.decls.size ≤ (aig.mkAndCached input).aig.decls.size := by
7175 simp only [mkAndCached]
72- apply LawfulOperator.le_size_of_le_aig_size
73- omega
76+ grind
7477
78+ @[grind =]
7579theorem mkAndCached_decl_eq idx (aig : AIG α) (input : BinaryInput aig) {h : idx < aig.decls.size}
7680 {h2} :
7781 (aig.mkAndCached input).aig.decls[idx]'h2 = aig.decls[idx] := by
7882 simp only [mkAndCached]
79- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
83+ grind
8084
8185instance : LawfulOperator α BinaryInput mkAndCached where
8286 le_size := mkAndCached_le_size
@@ -87,16 +91,18 @@ theorem denote_mkAndCached {aig : AIG α} {input : BinaryInput aig} :
8791 ⟦aig.mkAndCached input, assign⟧ = (⟦aig, input.lhs, assign⟧ && ⟦aig, input.rhs, assign⟧) := by
8892 simp [mkAndCached]
8993
94+ @[grind! .]
9095theorem mkOrCached_le_size (aig : AIG α) (input : BinaryInput aig) :
9196 aig.decls.size ≤ (aig.mkOrCached input).aig.decls.size := by
9297 simp only [mkOrCached]
93- apply LawfulOperator.le_size
98+ grind
9499
100+ @[grind =]
95101theorem mkOrCached_decl_eq idx (aig : AIG α) (input : BinaryInput aig) {h : idx < aig.decls.size}
96102 {h2} :
97103 (aig.mkOrCached input).aig.decls[idx]'h2 = aig.decls[idx] := by
98104 simp only [mkOrCached]
99- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
105+ grind
100106
101107instance : LawfulOperator α BinaryInput mkOrCached where
102108 le_size := mkOrCached_le_size
@@ -108,27 +114,18 @@ theorem denote_mkOrCached {aig : AIG α} {input : BinaryInput aig} :
108114 rw [← or_as_aig]
109115 simp [mkOrCached]
110116
111-
117+ @[grind! .]
112118theorem mkXorCached_le_size (aig : AIG α) {input : BinaryInput aig} :
113119 aig.decls.size ≤ (aig.mkXorCached input).aig.decls.size := by
114120 simp only [mkXorCached]
115- apply LawfulOperator.le_size_of_le_aig_size
116- apply LawfulOperator.le_size_of_le_aig_size
117- apply LawfulOperator.le_size_of_le_aig_size
118- omega
121+ grind
119122
123+ @[grind =]
120124theorem mkXorCached_decl_eq idx (aig : AIG α) (input : BinaryInput aig) {h : idx < aig.decls.size}
121125 {h2} :
122126 (aig.mkXorCached input).aig.decls[idx]'h2 = aig.decls[idx] := by
123127 simp only [mkXorCached]
124- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
125- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
126- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
127- · apply LawfulOperator.lt_size_of_lt_aig_size
128- assumption
129- · apply LawfulOperator.lt_size_of_lt_aig_size
130- apply LawfulOperator.lt_size_of_lt_aig_size
131- assumption
128+ grind
132129
133130instance : LawfulOperator α BinaryInput mkXorCached where
134131 le_size := mkXorCached_le_size
@@ -144,26 +141,18 @@ theorem denote_mkXorCached {aig : AIG α} {input : BinaryInput aig} :
144141 LawfulOperator.denote_mem_prefix (f := mkGateCached) input.rhs.hgate
145142 ]
146143
144+ @[grind! .]
147145theorem mkBEqCached_le_size (aig : AIG α) {input : BinaryInput aig} :
148146 aig.decls.size ≤ (aig.mkBEqCached input).aig.decls.size := by
149147 simp only [mkBEqCached]
150- apply LawfulOperator.le_size_of_le_aig_size
151- apply LawfulOperator.le_size_of_le_aig_size
152- apply LawfulOperator.le_size_of_le_aig_size
153- omega
148+ grind
154149
150+ @[grind =]
155151theorem mkBEqCached_decl_eq idx (aig : AIG α) (input : BinaryInput aig) {h : idx < aig.decls.size}
156152 {h2} :
157153 (aig.mkBEqCached input).aig.decls[idx]'h2 = aig.decls[idx] := by
158154 simp only [mkBEqCached]
159- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
160- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
161- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
162- · apply LawfulOperator.lt_size_of_lt_aig_size
163- assumption
164- · apply LawfulOperator.lt_size_of_lt_aig_size
165- apply LawfulOperator.lt_size_of_lt_aig_size
166- assumption
155+ grind
167156
168157instance : LawfulOperator α BinaryInput mkBEqCached where
169158 le_size := mkBEqCached_le_size
@@ -179,16 +168,18 @@ theorem denote_mkBEqCached {aig : AIG α} {input : BinaryInput aig} :
179168 LawfulOperator.denote_mem_prefix (f := mkGateCached) input.rhs.hgate
180169 ]
181170
171+ @[grind! .]
182172theorem mkImpCached_le_size (aig : AIG α) (input : BinaryInput aig) :
183173 aig.decls.size ≤ (aig.mkImpCached input).aig.decls.size := by
184174 simp only [mkImpCached]
185- apply LawfulOperator.le_size
175+ grind
186176
177+ @[grind =]
187178theorem mkImpCached_decl_eq idx (aig : AIG α) (input : BinaryInput aig) {h : idx < aig.decls.size}
188179 {h2} :
189180 (aig.mkImpCached input).aig.decls[idx]'h2 = aig.decls[idx] := by
190181 simp only [mkImpCached]
191- rw [AIG.LawfulOperator.decl_eq (f := mkGateCached)]
182+ grind
192183
193184instance : LawfulOperator α BinaryInput mkImpCached where
194185 le_size := mkImpCached_le_size
0 commit comments