Step 3/~7 in upstreaming LeanSAT. A few thoughts: - Why is this not in `Std.Sat`? LeanSAT's bitblaster operates on a limited internal language. For example it has no idea that signed comparision operators even exist. This is because it relies on a normalization pass before being given the goal. For this reason I would not classify the bitblaster as an API that we should publicly advertise at this abstraction level - Sometimes I slightly rebuild parts of the LawfulOperator infrastructure for operators that work non-tail-recursively. This is because they do not return an `Entrypoint` but instead an `ExtendingEntrypoint` in order to even be defined in the first place (casting Ref's and all that). Given the fact that this barely happens and I never actually commit to rebuilding the full API I'm hoping that this is indeed a fine decision? - The single explicit `decreasing_by` that has a simp only which *almost* looks like `simp_wf` is missing a singular lemma from `simp_wf` because it doesn't terminate otherwise. - I am not using functional induction because it basically always fails at some generalization step, that is also the reason that there is lots of explicit `generalize` and manually recursive proofs. --------- Co-authored-by: Markus Himmel <markus@lean-fro.org> Co-authored-by: Tobias Grosser <tobias@grosser.es>
51 lines
2.6 KiB
Text
51 lines
2.6 KiB
Text
import Lean.Elab.Tactic.BVDecide.Bitblast.BoolExpr
|
|
|
|
open Std.Sat
|
|
open Lean.Elab.Tactic.BVDecide
|
|
|
|
def mkSharedTree (n : Nat) : BoolExpr Nat :=
|
|
match n with
|
|
| 0 => .literal 0
|
|
| n + 1 =>
|
|
let tree := mkSharedTree n
|
|
.gate .or tree tree
|
|
|
|
/--
|
|
info: #[Std.Sat.AIG.Decl.atom 0, Std.Sat.AIG.Decl.gate 0 0 true true, Std.Sat.AIG.Decl.const true,
|
|
Std.Sat.AIG.Decl.gate 1 2 true false]
|
|
-/
|
|
#guard_msgs in
|
|
#eval ofBoolExprCached (mkSharedTree 1) AIG.mkAtomCached |>.aig.decls
|
|
|
|
/--
|
|
info: #[Std.Sat.AIG.Decl.atom 0, Std.Sat.AIG.Decl.gate 0 0 true true, Std.Sat.AIG.Decl.const true,
|
|
Std.Sat.AIG.Decl.gate 1 2 true false, Std.Sat.AIG.Decl.gate 3 3 true true, Std.Sat.AIG.Decl.gate 2 4 false true]
|
|
-/
|
|
#guard_msgs in
|
|
#eval ofBoolExprCached (mkSharedTree 2) AIG.mkAtomCached |>.aig.decls
|
|
|
|
/--
|
|
info: #[Std.Sat.AIG.Decl.atom 0, Std.Sat.AIG.Decl.gate 0 0 true true, Std.Sat.AIG.Decl.const true,
|
|
Std.Sat.AIG.Decl.gate 1 2 true false, Std.Sat.AIG.Decl.gate 3 3 true true, Std.Sat.AIG.Decl.gate 2 4 false true,
|
|
Std.Sat.AIG.Decl.gate 5 5 true true, Std.Sat.AIG.Decl.gate 2 6 false true, Std.Sat.AIG.Decl.gate 7 7 true true,
|
|
Std.Sat.AIG.Decl.gate 2 8 false true]
|
|
-/
|
|
#guard_msgs in
|
|
#eval ofBoolExprCached (mkSharedTree 4) AIG.mkAtomCached |>.aig.decls
|
|
|
|
/--
|
|
info: #[Std.Sat.AIG.Decl.atom 0, Std.Sat.AIG.Decl.gate 0 0 true true, Std.Sat.AIG.Decl.const true,
|
|
Std.Sat.AIG.Decl.gate 1 2 true false, Std.Sat.AIG.Decl.gate 3 3 true true, Std.Sat.AIG.Decl.gate 2 4 false true,
|
|
Std.Sat.AIG.Decl.gate 5 5 true true, Std.Sat.AIG.Decl.gate 2 6 false true, Std.Sat.AIG.Decl.gate 7 7 true true,
|
|
Std.Sat.AIG.Decl.gate 2 8 false true, Std.Sat.AIG.Decl.gate 9 9 true true, Std.Sat.AIG.Decl.gate 2 10 false true,
|
|
Std.Sat.AIG.Decl.gate 11 11 true true, Std.Sat.AIG.Decl.gate 2 12 false true, Std.Sat.AIG.Decl.gate 13 13 true true,
|
|
Std.Sat.AIG.Decl.gate 2 14 false true, Std.Sat.AIG.Decl.gate 15 15 true true, Std.Sat.AIG.Decl.gate 2 16 false true,
|
|
Std.Sat.AIG.Decl.gate 17 17 true true, Std.Sat.AIG.Decl.gate 2 18 false true, Std.Sat.AIG.Decl.gate 19 19 true true,
|
|
Std.Sat.AIG.Decl.gate 2 20 false true, Std.Sat.AIG.Decl.gate 21 21 true true, Std.Sat.AIG.Decl.gate 2 22 false true,
|
|
Std.Sat.AIG.Decl.gate 23 23 true true, Std.Sat.AIG.Decl.gate 2 24 false true, Std.Sat.AIG.Decl.gate 25 25 true true,
|
|
Std.Sat.AIG.Decl.gate 2 26 false true, Std.Sat.AIG.Decl.gate 27 27 true true, Std.Sat.AIG.Decl.gate 2 28 false true,
|
|
Std.Sat.AIG.Decl.gate 29 29 true true, Std.Sat.AIG.Decl.gate 2 30 false true, Std.Sat.AIG.Decl.gate 31 31 true true,
|
|
Std.Sat.AIG.Decl.gate 2 32 false true]
|
|
-/
|
|
#guard_msgs in
|
|
#eval ofBoolExprCached (mkSharedTree 16) AIG.mkAtomCached |>.aig.decls
|