Skip to content

Commit 349b1cf

Browse files
authored
Move Boole dialect to the StrataBoole package (#1210)
# Move Boole dialect to standalone package Extract the Boole dialect into its own `StrataBoole` Lake package with a dependency on the main `Strata` package. This enables faster incremental builds for Boole-specific work and cleaner separation of concerns. ## Changes - Move `Strata/Languages/Boole/` source files to `StrataBoole/StrataBoole/` - Move Boole test files to `StrataBoole/StrataBooleTest/` - Create `StrataBoole/lakefile.toml` with `Strata` as a dependency - Add `StrataBoole/StrataBooleTest.lean` root module importing all test files - Fix `MetaVerifier.lean` to add required meta imports (`Lean.Meta.Eval`, `Lean.Meta.Tactic.Rewrite`, `Lean.Meta.Tactic.Unfold`) and define `genSMTVCsBoole` as a standalone function for the tactic infrastructure - Update all test imports from `Strata.Languages.Boole.*` to `StrataBoole.*` - Update `#guard_msgs` expected output to reflect shifted source positions - Add CI workflow step for building the `StrataBoole` package - Remove Boole-specific code from the main `Strata` package (`Strata.lean`, `MetaVerifier.lean`, `StrataMainLib.lean`)
1 parent e9d0f83 commit 349b1cf

55 files changed

Lines changed: 467 additions & 247 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ jobs:
6565
git diff --exit-code editors/vscode/syntaxes/ editors/emacs/
6666
- name: Build and run strata verify
6767
run: lake exe strata verify Examples/SimpleProc.core.st
68+
- name: Build StrataBoole
69+
run: lake build StrataBoole StrataBooleTest
70+
working-directory: StrataBoole
6871
- name: Build BoogieToStrata
6972
run: dotnet build -warnaserror ${SOLUTION}
7073
- name: Test BoogieToStrata

Strata.lean

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ import Strata.Transform.Specification
3838

3939
/- Strata Languages — additional -/
4040
import Strata.Languages.B3
41-
import Strata.Languages.Boole.Boole
42-
import Strata.Languages.Boole.Verify
4341
import Strata.Languages.C_Simp.C_Simp
4442
import Strata.Languages.C_Simp.Verify
4543
import Strata.Languages.Core.EntryPoint

Strata/MetaVerifier.lean

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ module
77

88
import Strata.Transform.LoopElim
99
import Strata.Languages.Core.ObligationExtraction
10-
public import Strata.Languages.Boole.Boole
1110
public import Strata.Languages.C_Simp.C_Simp
1211
public import Strata.Languages.Core.SMTEncoder
1312
import Std.Tactic.BVDecide.Normalize.Prop
1413
import Strata.DL.Lambda.Denote.LExprAnnotated
1514
import Strata.DL.SMT.Denote
16-
import Strata.Languages.Boole.Verify
1715
import Strata.Languages.C_Simp.DDMTransform.Translate
1816
import Strata.Languages.C_Simp.Verify
1917
import Strata.Languages.Core.Core
@@ -98,19 +96,14 @@ def genVCs (program : Strata.C_Simp.Program) (options : Core.VerifyOptions := .d
9896

9997
end C_Simp
10098

101-
namespace Boole
102-
103-
def genVCs (program : Strata.Boole.Program) (gctx : Strata.GlobalContext) (options : Core.VerifyOptions := .default) : Option Core.coreVCs := do
104-
let program ← (Strata.Boole.toCoreProgram program gctx).toOption
105-
Core.genVCs program options
106-
107-
end Boole
108-
10999
namespace Strata
110100

111101
/--
112102
Generate verification conditions for a `Strata.Program` by translating it to the
113103
appropriate frontend verifier and collecting its deferred proof obligations.
104+
105+
Note that this can be extended to new dialects by using
106+
`unsafe/@[implemented_by]` as in `StrataBoole.MetaVerifier`.
114107
-/
115108
def genCoreVCs (program : Program) : Option Core.coreVCs := do
116109
if program.dialect == "Core" then
@@ -119,11 +112,6 @@ def genCoreVCs (program : Program) : Option Core.coreVCs := do
119112
else if program.dialect == "C_Simp" then
120113
let (program, #[]) := C_Simp.TransM.run default (C_Simp.translateProgram program.commands) | none
121114
C_Simp.genVCs program { (default : Core.VerifyOptions) with verbose := .quiet : Core.VerifyOptions }
122-
else if program.dialect == "Boole" then
123-
match Boole.getProgram program with
124-
| .ok booleProgram =>
125-
Boole.genVCs booleProgram program.globalContext { (default : Core.VerifyOptions) with verbose := .quiet : Core.VerifyOptions }
126-
| .error _ => none
127115
else
128116
none
129117

StrataBoole/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.lake

StrataBoole/StrataBoole.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/-
2+
Copyright Strata Contributors
3+
4+
SPDX-License-Identifier: Apache-2.0 OR MIT
5+
-/
6+
import StrataBoole.Boole
7+
import StrataBoole.Grammar
8+
import StrataBoole.MetaVerifier
9+
import StrataBoole.Verify
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
-/
66
module
77

8-
public import Strata.Languages.Boole.Grammar -- shake: keep
8+
public import StrataBoole.Grammar -- shake: keep
99
import Strata.DDM.Integration.Lean.Gen -- shake: keep
1010

1111
public section
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/-
2+
Copyright Strata Contributors
3+
4+
SPDX-License-Identifier: Apache-2.0 OR MIT
5+
-/
6+
module
7+
8+
public import Strata.MetaVerifier -- shake: keep
9+
public import StrataBoole.Verify
10+
meta import Lean.Meta.Eval
11+
import Lean.Meta.Eval -- shake: keep
12+
import Lean.Meta.Tactic.Rewrite -- shake: keep
13+
meta import Lean.Meta.Tactic.Rewrite
14+
import Lean.Meta.Tactic.Unfold -- shake: keep
15+
meta import Lean.Meta.Tactic.Unfold
16+
17+
/-!
18+
# Boole MetaVerifier
19+
20+
Extends `Strata.MetaVerifier` with Boole dialect support for `genCoreVCs` and
21+
`smtVCsCorrect`. Test files in the `StrataBoole` package should import this
22+
module instead of `Strata.MetaVerifier` directly.
23+
-/
24+
25+
public section
26+
27+
namespace Strata.Boole
28+
29+
def genVCs (program : Strata.Boole.Program) (gctx : Strata.GlobalContext) (options : Core.VerifyOptions := .default) : Option Core.coreVCs := do
30+
let program ← (Strata.Boole.toCoreProgram program gctx).toOption
31+
Core.genVCs program options
32+
33+
end Strata.Boole
34+
35+
namespace Strata
36+
37+
/--
38+
Generate verification conditions for a `Strata.Program`, with Boole support.
39+
Extends `Strata.genCoreVCs` to handle the Boole dialect.
40+
-/
41+
def genCoreVCsBoole (program : Program) : Option Core.coreVCs := do
42+
if program.dialect == "Boole" then
43+
match Boole.getProgram program with
44+
| .ok booleProgram =>
45+
Boole.genVCs booleProgram program.globalContext { (default : Core.VerifyOptions) with verbose := .quiet : Core.VerifyOptions }
46+
| .error _ => none
47+
else
48+
genCoreVCs program
49+
50+
/--
51+
Generate SMT verification conditions for a `Strata.Program`, with Boole support.
52+
-/
53+
def genSMTVCsBoole (program : Program) : Option SMT.SMTVCs := do
54+
let coreVCs ← genCoreVCsBoole program
55+
toSMTVCs coreVCs
56+
57+
/--
58+
State semantic correctness of the SMT verification conditions generated for a
59+
program, with Boole dialect support.
60+
-/
61+
def smtVCsCorrectBoole (program : Program) : Prop :=
62+
match genSMTVCsBoole program with
63+
| some vcs => (denoteQueries vcs).getD False
64+
| none => False
65+
66+
end Strata
67+
68+
namespace Strata.Meta
69+
70+
open Lean hiding Options
71+
72+
private unsafe def genSMTVCsBooleUnsafe (mv : MVarId) : MetaM (List MVarId) := do
73+
let type ← mv.getType
74+
let some program := type.app1? ``Strata.smtVCsCorrectBoole | throwError "Expected a Strata.smtVCsCorrectBoole goal"
75+
trace[debug] m!"Generating SMT VCs for {program}"
76+
let mv ← Meta.unfoldTarget mv ``Strata.smtVCsCorrectBoole
77+
let ovcs := .app (.const ``Strata.genSMTVCsBoole []) program
78+
let ovcsType := .app (.const ``Option [0]) (.const ``Strata.SMT.SMTVCs [])
79+
let some evcs ← Meta.evalExpr (Option Strata.SMT.SMTVCs) ovcsType ovcs
80+
| throwError "Failed to generate VCs"
81+
trace[debug] m!"Generated {repr evcs}"
82+
let rhs := toExpr (some evcs)
83+
let eqVCs := mkApp3 (.const ``Eq [1]) ovcsType ovcs rhs
84+
let hEQVCs ← nativeDecide eqVCs
85+
let r ← mv.rewrite (← mv.getType) hEQVCs
86+
let mv ← mv.replaceTargetEq r.eNew r.eqProof
87+
let mvs ← evcs.mapM SMT.createGoal
88+
trace[debug] m!"Created {mvs.length} SMT VC goals: {mvs}"
89+
let ps ← mvs.mapM MVarId.getType
90+
let hP := andNIntro (List.zip ps (mvs.map Expr.mvar))
91+
mv.assign hP
92+
return mvs
93+
94+
@[implemented_by genSMTVCsBooleUnsafe]
95+
meta opaque genSMTVCsBoole (mv : MVarId) : MetaM (List MVarId)
96+
97+
end Strata.Meta
98+
99+
namespace Strata.Tactic
100+
101+
open Lean Elab Tactic in
102+
/--
103+
Generate one Lean goal per SMT verification condition in a goal of the form
104+
`Strata.smtVCsCorrectBoole program`. Boole-aware variant of `gen_smt_vcs`.
105+
-/
106+
syntax (name := genSMTVCsBoole) "gen_smt_vcs_boole" : tactic
107+
108+
open Lean Elab Tactic in
109+
@[tactic genSMTVCsBoole] meta def evalGenSMTVCsBoole : Tactic := fun stx => do
110+
match stx with
111+
| `(tactic| gen_smt_vcs_boole) =>
112+
let mvs ← Meta.genSMTVCsBoole (← Tactic.getMainGoal)
113+
Tactic.replaceMainGoal mvs
114+
| _ => throwUnsupportedSyntax
115+
116+
end Strata.Tactic
117+
118+
end -- public section
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
-/
66
module
77

8-
public import Strata.Languages.Boole.Boole
8+
public import StrataBoole.Boole
99
public import Strata.Languages.Core.Verifier
1010
import Strata.Languages.Core.Core
1111
import Strata.Util.Tactics

StrataBoole/StrataBooleTest.lean

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/-
2+
Copyright Strata Contributors
3+
4+
SPDX-License-Identifier: Apache-2.0 OR MIT
5+
-/
6+
import StrataBooleTest.array_2d
7+
import StrataBooleTest.array_assignment
8+
import StrataBooleTest.bit_vectors
9+
import StrataBooleTest.code_expression
10+
import StrataBooleTest.demo
11+
import StrataBooleTest.deterministic
12+
import StrataBooleTest.find_max
13+
import StrataBooleTest.find_max_verus
14+
import StrataBooleTest.format_program
15+
import StrataBooleTest.function_definitions
16+
import StrataBooleTest.global_readonly_call
17+
import StrataBooleTest.grammar_extensions
18+
import StrataBooleTest.insertion_sort
19+
import StrataBooleTest.loop_simple
20+
import StrataBooleTest.procedure_signatures
21+
import StrataBooleTest.square_matrix_multiply
22+
import StrataBooleTest.stack_array_based
23+
import StrataBooleTest.string_operators
24+
import StrataBooleTest.top_level_block_selection
25+
import StrataBooleTest.verification_coverage
26+
import StrataBooleTest.FeatureRequests.abstract_types_and_stubs
27+
import StrataBooleTest.FeatureRequests.bitvector_ops
28+
import StrataBooleTest.FeatureRequests.bitvector_proof_mode
29+
import StrataBooleTest.FeatureRequests.choose_operator
30+
import StrataBooleTest.FeatureRequests.datatypes_and_selectors
31+
import StrataBooleTest.FeatureRequests.decreases_metadata
32+
import StrataBooleTest.FeatureRequests.early_return
33+
import StrataBooleTest.FeatureRequests.higher_order_encoding
34+
import StrataBooleTest.FeatureRequests.horner_poly_eval
35+
import StrataBooleTest.FeatureRequests.lambda_closure
36+
import StrataBooleTest.FeatureRequests.map_extensionality
37+
import StrataBooleTest.FeatureRequests.mutual_recursion
38+
import StrataBooleTest.FeatureRequests.nat_int_boundary
39+
import StrataBooleTest.FeatureRequests.opaque_reveal_hide
40+
import StrataBooleTest.FeatureRequests.option_matches
41+
import StrataBooleTest.FeatureRequests.overflow_guard
42+
import StrataBooleTest.FeatureRequests.reveal_with_fuel
43+
import StrataBooleTest.FeatureRequests.seq_slicing
44+
import StrataBooleTest.FeatureRequests.struct_field_access
45+
import StrataBooleTest.FeatureRequests.trait_spec_methods
46+
import StrataBooleTest.FeatureRequests.widening_casts

0 commit comments

Comments
 (0)