Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
201 commits
Select commit Hold shift + click to select a range
99ba9b8
Add support for function declarations within statement blocks
MikaelMayer Jan 27, 2026
6b1cdc2
Fix Factory_wf proof using rotate_left to reorder goals
MikaelMayer Jan 27, 2026
a8a4a0c
Remove unnecessary Lambda namespace opening in Statement.lean
MikaelMayer Jan 27, 2026
b8ec252
Remove unnecessary Lambda namespace opening in Program.lean
MikaelMayer Jan 27, 2026
d666882
Restore proper function body formatting by adding ToFormat instance f…
MikaelMayer Jan 28, 2026
ed1f8ac
Remove B3 .gitignore (moved to .git/info/exclude for local use)
MikaelMayer Jan 28, 2026
c6ede80
Clean up: revert ProcedureWF.lean to main, remove unnecessary comment
MikaelMayer Jan 28, 2026
77eb4fa
Merge main into add-func-decl-to-statements
MikaelMayer Jan 28, 2026
62a5f70
Fix merge: add missing funcDecl cases in ProcedureInlining and apply …
MikaelMayer Jan 28, 2026
5f65da9
Update funcDecl test to demonstrate variable capture semantics
MikaelMayer Jan 29, 2026
a13b470
Merge branch 'main' into add-func-decl-to-statements
MikaelMayer Jan 29, 2026
6797599
Fix merge: convert Format to String for EvalError.Misc
MikaelMayer Jan 29, 2026
5ceddf3
Implement value capture for funcDecl: substitute free variables at de…
MikaelMayer Jan 29, 2026
86f6c90
Fix merge: convert Format errors to DiagnosticModel in funcDecl type …
MikaelMayer Jan 29, 2026
776a87d
Merge branch 'main' into add-func-decl-to-statements
shigoel Jan 30, 2026
dbfe96e
Add polymorphic function test for funcDecl with evaluation verification
MikaelMayer Feb 2, 2026
ebbab10
Update semantics and proofs for FuncContext parameter in EvalStmt/Eva…
MikaelMayer Feb 2, 2026
494dedc
Merge branch 'main' into add-func-decl-to-statements
MikaelMayer Feb 2, 2026
c588f0c
Fix eval_stmts_set_comm proof after FuncContext refactor
MikaelMayer Feb 2, 2026
93914c6
Thread δ through semantics instead of FuncContext
MikaelMayer Feb 3, 2026
95a3386
Merge branch 'main' into add-func-decl-to-statements
MikaelMayer Feb 3, 2026
dfd9dcc
Address PR review comments: refactor Func, fix type checking, remove …
MikaelMayer Feb 3, 2026
a86b658
Fix getVarsTrans to exclude formal parameters for funcDecl
MikaelMayer Feb 3, 2026
92ab1f8
Fix funcDecl_sem case in EvalStmtRefinesContract theorem
MikaelMayer Feb 3, 2026
dc17906
Update comment: funcDecl WF checks are TODO, not always true
MikaelMayer Feb 3, 2026
117aeab
Add well-formedness checks for funcDecl in StatementWF
MikaelMayer Feb 3, 2026
e673135
Add extendEval parameter to DetToNondetCorrect theorems
MikaelMayer Feb 4, 2026
e1ce657
Merge main into add-func-decl-to-statements
MikaelMayer Feb 5, 2026
049bff4
Fix FactoryWF.lean to use LFuncWF instead of FuncWF after merge
MikaelMayer Feb 5, 2026
3183890
Merge branch 'main' into add-func-decl-to-statements
MikaelMayer Feb 5, 2026
80c1833
Fix unused section variable warning in LFunc.type_inputs_nodup
MikaelMayer Feb 5, 2026
a8e9809
Add DDM support for function declaration statements
MikaelMayer Feb 3, 2026
b05a3b4
Remove incorrect test file
MikaelMayer Feb 3, 2026
e188726
Fix DDM translateExpr to support bound function calls with arguments
MikaelMayer Feb 3, 2026
c0e5d13
Fix function declaration statement bound variable scoping
MikaelMayer Feb 3, 2026
d415650
Fix bound variable issue in function declaration translation
MikaelMayer Feb 5, 2026
f630000
Fix function declaration DDM transform bound variable issues
MikaelMayer Feb 5, 2026
b52d16f
Fix function declaration statement parsing in DDM transform
MikaelMayer Feb 9, 2026
34ccb82
Merge main into add-function-statements-ddm
MikaelMayer Feb 9, 2026
a7c50c1
Merge branch 'main' into add-function-statements-ddm
MikaelMayer Feb 9, 2026
8455248
Remove trivial EvalCmd_eval_cst theorem
MikaelMayer Feb 9, 2026
6cacee5
Add support for parsing top-level blocks directly
MikaelMayer Feb 9, 2026
117b3fd
Refactor: merge duplicate bvar handling cases
MikaelMayer Feb 9, 2026
f7088a8
Fix: use func.opExpr for correct function type in fvar translation
MikaelMayer Feb 9, 2026
bf9a6c9
Add requirements for Core SMT verifier pipeline
MikaelMayer Feb 10, 2026
f46e006
Add CoreSMT verifier requirements and design specs
MikaelMayer Feb 16, 2026
b1c68d8
Add implementation tasks for CoreSMT Verifier spec
MikaelMayer Feb 16, 2026
ebaa2df
Task 1: Extend Cmd.init to support optional RHS expression
MikaelMayer Feb 16, 2026
0d15757
Task 1: Extend Cmd.init to support optional RHS expression
MikaelMayer Feb 16, 2026
e48d39c
Merge feat/optional-init-rhs into migrate-b3-smt-pipeline-core-to-core
MikaelMayer Feb 16, 2026
4f558be
feat: Support optional RHS in Cmd.init for unconstrained variable dec…
MikaelMayer Feb 16, 2026
925cead
Merge feat/optional-init-rhs
MikaelMayer Feb 16, 2026
11d8c04
feat: Support optional RHS in Cmd.init for unconstrained variable dec…
MikaelMayer Feb 16, 2026
e9786ed
Merge feat/optional-init-rhs
MikaelMayer Feb 16, 2026
32fc046
Add DDM parser support for init without RHS
MikaelMayer Feb 16, 2026
a730eb6
Fix CI errors
MikaelMayer Feb 17, 2026
91c9531
Merge branch 'feat/optional-init-rhs' into migrate-b3-smt-pipeline-co…
MikaelMayer Feb 17, 2026
f52347a
Merge branch 'main' into feat/optional-init-rhs
MikaelMayer Feb 17, 2026
2caff99
Fix remaining CI errors after merge with main
MikaelMayer Feb 17, 2026
564d427
Merge branch 'feat/optional-init-rhs' into migrate-b3-smt-pipeline-co…
MikaelMayer Feb 17, 2026
6eadd55
Add SMT Solver Interface for CoreSMT Verifier (Task 3)
MikaelMayer Feb 19, 2026
875e064
Add isCoreSMT predicate for CoreSMT subset (Task 4)
MikaelMayer Feb 19, 2026
9f234e5
Add CoreSMT state/context management and fix namespaces (Task 5)
MikaelMayer Feb 19, 2026
74083d9
Add expression translator for CoreSMT (Task 6)
MikaelMayer Feb 19, 2026
01a39e6
Add statement processor, verifier interface, and main module (Tasks 8…
MikaelMayer Feb 19, 2026
de87707
Fix C_Simp Verify for optional init RHS
MikaelMayer Feb 19, 2026
3101195
Merge branch 'main' into migrate-b3-smt-pipeline-core-to-core
MikaelMayer Feb 19, 2026
fd89d26
Update task list with completed items
MikaelMayer Feb 19, 2026
83f17d4
Add diagnosis engine, fix CBMC build failures (Tasks 9, 11)
MikaelMayer Feb 19, 2026
783c6c6
Add B3 to Core converter (Task 14)
MikaelMayer Feb 19, 2026
f893264
Fix CoreToCProverGOTO for optional init RHS
MikaelMayer Feb 19, 2026
a1922ac
Update task list - all CoreSMT implementation tasks complete
MikaelMayer Feb 19, 2026
42b48fd
Remove initStatementNoRhs - varStatement already handles var declarat…
MikaelMayer Feb 19, 2026
b0fab71
Remove scratch experiment files
MikaelMayer Feb 19, 2026
70c4f8f
Fix test files for optional init RHS and remove initStatementNoRhs
MikaelMayer Feb 19, 2026
a6f9d72
Update tasks.md - mark task 14 complete
MikaelMayer Feb 19, 2026
746a98f
Fix B3→Core quantifier conversion to use bvar, add test harness, upda…
MikaelMayer Feb 23, 2026
49a2459
feat(core): Add diagnosis field to VCResult for refuted assertions
MikaelMayer Feb 23, 2026
2c60c01
test(b3): Add CoreSMT pipeline tests for B3 verifier
MikaelMayer Feb 23, 2026
f0cfc4c
wip(b3): Begin migration to CoreSMT pipeline
MikaelMayer Feb 23, 2026
977c3c1
feat(b3): Complete migration to CoreSMT pipeline
MikaelMayer Feb 23, 2026
3289a42
test(b3): Add integration test for CoreSMT pipeline
MikaelMayer Feb 23, 2026
02ce10d
Merge main into migrate-b3-smt-pipeline-core-to-core
MikaelMayer Feb 23, 2026
fc66261
chore: Remove development artifacts
MikaelMayer Feb 23, 2026
1f667ce
fix: Restore accidentally deleted code and remove duplicate VerboseMode
MikaelMayer Feb 23, 2026
5658c04
fix: Reuse existing types and fix CoreSMT issues
MikaelMayer Feb 23, 2026
3895dd8
fix: Complete type reuse and build fixes
MikaelMayer Feb 23, 2026
d188d3f
fix: Restore accidentally deleted B3/Verifier/Program.lean
MikaelMayer Feb 23, 2026
f52b554
fix: Update B3 tests to use CoreSMT pipeline
MikaelMayer Feb 23, 2026
73c4402
fix: Restore old B3 verifier files for existing tests
MikaelMayer Feb 23, 2026
a3869cf
Merge branch 'main' into migrate-b3-smt-pipeline-core-to-core
MikaelMayer Feb 24, 2026
d26a674
fix: Address PR feedback - proper error handling and cleanup
MikaelMayer Feb 24, 2026
0ce4729
refactor: Improve error handling and fix test expectations
MikaelMayer Feb 24, 2026
29acc8d
refactor: Complete translateOrThrow removal - use error collection
MikaelMayer Feb 24, 2026
4547dee
docs: Add TODO comments for remaining architectural improvements
MikaelMayer Feb 24, 2026
d71be51
refactor: Move SolverInterface to SMT dialect and use check-sat-assuming
MikaelMayer Feb 24, 2026
f86f5dd
test: Fix remaining test expectations for optional RHS
MikaelMayer Feb 24, 2026
c8f37f0
refactor: Use ConvResult for proper error collection in B3→Core
MikaelMayer Feb 24, 2026
6c43d2f
refactor: Move State to SMT dialect and rename StmtProcessor to StmtV…
MikaelMayer Feb 24, 2026
639c4b2
refactor: Move accumulateErrors to CoreSMT, remove unused config from…
MikaelMayer Feb 24, 2026
a6250f8
docs: Update State.lean comment to remove configuration reference
MikaelMayer Feb 24, 2026
4b07317
refactor: Remove unused resultCount from VerifierState
MikaelMayer Feb 24, 2026
18444ce
refactor: Delete old B3→SMT verifier, keep API stubs for test compati…
MikaelMayer Feb 24, 2026
2757afa
feat: Implement CoreSMT to B3 result conversion for test compatibility
MikaelMayer Feb 24, 2026
587ba53
fix: Add type annotations for solver accessor calls
MikaelMayer Feb 24, 2026
e996495
fix: Rename parameter to avoid shadowing in processStatements
MikaelMayer Feb 24, 2026
058224a
refactor: Remove FunctionToAxiom, add CoreSMT State, create B3 Format…
MikaelMayer Feb 24, 2026
ae53d98
feat: Implement diagnosis in CoreSMT verifier
MikaelMayer Feb 24, 2026
18c289a
feat: Add Core→B3 expression converter stub
MikaelMayer Feb 24, 2026
d9b0e8d
feat: Implement Core→B3 expression converter
MikaelMayer Feb 24, 2026
8dac950
fix: Correct function calls in Diagnosis module
MikaelMayer Feb 24, 2026
4288d10
feat: Change Core metadata from Unit to SourceRange
MikaelMayer Feb 25, 2026
18c550f
feat: Preserve source locations in B3↔Core conversion
MikaelMayer Feb 25, 2026
52f03b5
fix: Replace all () metadata with SourceRange.none
MikaelMayer Feb 25, 2026
597ab05
fix: Complete metadata replacement in Transform and Python files
MikaelMayer Feb 25, 2026
797ab4b
fix: Complete metadata replacement across all files
MikaelMayer Feb 25, 2026
dcd64f9
fix: Fix remaining metadata issues in CoreSMT
MikaelMayer Feb 25, 2026
2b69f5d
feat: Add diagnosis support to CoreSMT verifier
MikaelMayer Feb 25, 2026
38e5e5a
fix: Use proper solver initialization and fix cvc5 PATH
MikaelMayer Feb 25, 2026
a8a553b
fix: Pass procedure name as label in B3→Core conversion
MikaelMayer Feb 25, 2026
7f1642f
fix: Add Core→B3 conversion in test diagnosis display
MikaelMayer Feb 25, 2026
ec29757
feat: Implement Core→B3 expression conversion for diagnosis
MikaelMayer Feb 25, 2026
0a21a7f
feat: Add statement display and multi-result support
MikaelMayer Feb 25, 2026
e8a17c8
fix: Update test expectations and fix assert semantics
MikaelMayer Feb 25, 2026
aa45292
fix: Correct source location offsets for statements vs expressions
MikaelMayer Feb 25, 2026
f466772
feat: Complete diagnosis with assumptions and fix HO_ error
MikaelMayer Feb 25, 2026
75bc7d1
feat: Migrate commented-out exampleVerification test
MikaelMayer Feb 25, 2026
e9da659
merge: Merge main into branch and fix all conflicts
MikaelMayer Feb 25, 2026
5514121
fix: Fix all test failures after merge with main
MikaelMayer Feb 25, 2026
e385ffd
fix: Fix CI failures - StrataVerify import and CBMC metadata
MikaelMayer Feb 26, 2026
2e294c6
refactor: Use csimpMetaToCore conversion function in C_Simp/Verify
MikaelMayer Feb 26, 2026
69fe2e8
refactor: Extract TermType.toSMTString to TermType.lean
MikaelMayer Feb 26, 2026
d2fa219
ci: Trigger CI build
MikaelMayer Feb 26, 2026
055fb5a
ci: Trigger CI build (2)
MikaelMayer Feb 26, 2026
f9de856
merge: Merge latest main into branch
MikaelMayer Feb 26, 2026
72e2a0b
merge: Merge main (multiple invariants in Core loop)
MikaelMayer Feb 26, 2026
fd9e258
refactor: Remove dead code identified in review
MikaelMayer Feb 26, 2026
887b160
merge: Merge main + address PR review comments
MikaelMayer Feb 26, 2026
ad921d6
merge: Merge main (mandatory Cmd/Stmt metadata) + fix all () metadata
MikaelMayer Feb 26, 2026
9fd1a7d
fix: Check procedure params/specs are empty in B3→Core conversion
MikaelMayer Feb 26, 2026
f90f8ff
refactor: Remove dead fields from DiagnosisResult and DiagnosedFailure
MikaelMayer Feb 26, 2026
a3e6b79
merge: Merge main (goto→exit) + fix IsCoreSMT
MikaelMayer Feb 26, 2026
cc982d3
merge: Auto-merge latest main
MikaelMayer Feb 26, 2026
44fa111
merge: Auto-merge latest main
MikaelMayer Feb 27, 2026
dfe079d
fix: Use createInteractiveSolver in StrataVerify for solver-agnostic …
MikaelMayer Feb 27, 2026
3a58a11
merge: Merge main (Laurel function/procedure split)
MikaelMayer Feb 27, 2026
524f4e6
ci: Force cache invalidation for Laurel grammar rebuild
MikaelMayer Feb 27, 2026
e184d23
fix: Invalidate Laurel/DDM .olean cache before build
MikaelMayer Feb 27, 2026
623b404
fix: Include .st files in lake cache key to prevent stale Laurel .olean
MikaelMayer Feb 27, 2026
8732c61
merge: Merge main (fix duplicate loop labels)
MikaelMayer Feb 27, 2026
a30c263
fix: Apply .st cache fix to CBMC workflow as well
MikaelMayer Feb 27, 2026
b3f7086
refactor: Remove stateful comment from Identifiers.lean
MikaelMayer Feb 27, 2026
af084db
refactor: Extract formatOp helper to remove duplication in Format.lean
MikaelMayer Feb 27, 2026
31b6fcc
refactor: Simplify StmtVerifier - unify proveCheck/coverCheck, extrac…
MikaelMayer Feb 27, 2026
391b9c7
fix: Address reviewer comments on TranslationTests and VerifierTests
MikaelMayer Feb 27, 2026
197bd1f
fix: Restore push/pop in TranslationTests, only filter prelude commands
MikaelMayer Feb 27, 2026
f516193
fix: Remove Option datatype from CoreSMT prelude
MikaelMayer Feb 27, 2026
4610ccc
fix: Fix diagnosis to correctly identify proved/refuted sub-expressions
MikaelMayer Feb 27, 2026
36e01a5
ci: Revert CI cache changes (extracted to PR #498)
MikaelMayer Feb 27, 2026
ff0b7ac
fix: Thread conjunction path conditions through diagnosis
MikaelMayer Feb 27, 2026
b76a40a
fix: Show 'assert' instead of 'check' for assert statement failures
MikaelMayer Feb 27, 2026
9a9173a
fix: Restore Identifiers tests and propagate DDM source ranges in Tra…
MikaelMayer Feb 27, 2026
de62017
fix: Address remaining reviewer comments
MikaelMayer Feb 27, 2026
e36f56f
merge: Merge main (SimpleAPI refactor + CI cache fix)
MikaelMayer Feb 27, 2026
bf36915
fix: Make SourceRange Repr always show () and erase metadata in erase…
MikaelMayer Feb 27, 2026
a04e796
feat: Add --interactive flag for in-memory CoreSMT verification
MikaelMayer Mar 2, 2026
91dbc61
merge: Merge main (PyLaurel class support, remove Visibility from Cor…
MikaelMayer Mar 2, 2026
eddbf0a
fix: Add test_interactive_simple to expected_laurel to debug translation
MikaelMayer Mar 2, 2026
a1c155d
fix: Rename --interactive to --incremental, add debug output for incr…
MikaelMayer Mar 2, 2026
7935d24
Improve incremental CoreSMT verifier: better errors, dead var elimina…
MikaelMayer Mar 2, 2026
1169d8f
Replace test_interactive_simple with test_incremental_simple, fix --i…
MikaelMayer Mar 2, 2026
2de9e54
Remove unnecessary skip for test_incremental_simple in laurel mode
MikaelMayer Mar 2, 2026
cc32c8d
fix: Rename interactive→incremental in script/CI, fix expected dir name
MikaelMayer Mar 2, 2026
bcbb96f
merge: Integrate reviewer's incremental verifier improvements
MikaelMayer Mar 2, 2026
112243f
fix: Fix indentation in pyAnalyzeLaurel non-incremental print loop
MikaelMayer Mar 2, 2026
2e4d6de
fix: Update test_incremental_simple expected byte offsets
MikaelMayer Mar 2, 2026
f2264f2
fix: Update expected_interactive byte offsets for test_incremental_si…
MikaelMayer Mar 2, 2026
dc8dcb0
fix: Skip test_incremental_simple in pyAnalyze and SARIF tests
MikaelMayer Mar 3, 2026
bcf1939
merge: Merge main (LExpr named quantifiers, datatype destructors)
MikaelMayer Mar 3, 2026
1c68d0e
fix: Address review comments
MikaelMayer Mar 4, 2026
24a07f2
refactor: Move DiagnosisTypes out of CoreSMT namespace
MikaelMayer Mar 4, 2026
81717b5
fix: Address remaining review comments
MikaelMayer Mar 4, 2026
9cf672e
merge: Merge main (LExprModel counterexample support)
MikaelMayer Mar 4, 2026
1df67f9
fix: Qualify Lean.FileMap in extracted verify functions
MikaelMayer Mar 4, 2026
d3e7702
fix: Address review comments
MikaelMayer Mar 4, 2026
fa00716
merge: Merge main
MikaelMayer Mar 4, 2026
e2b8ac0
fix: Address review comments
MikaelMayer Mar 4, 2026
e8d8bb5
fix: Make --incremental independent of laurel in run_py_analyze.sh
MikaelMayer Mar 5, 2026
1ae0a7a
merge: Merge main (exit statement for Laurel return)
MikaelMayer Mar 5, 2026
74c0054
merge: Merge main (Laurel exit statement, isPureExpr cases)
MikaelMayer Mar 5, 2026
d338480
fix: --incremental requires laurel mode
MikaelMayer Mar 5, 2026
884bc01
merge: Merge main (public imports, fileMap changes)
MikaelMayer Mar 6, 2026
e968fc7
fix: Apply SourceRange.none to all merged files
MikaelMayer Mar 6, 2026
f988f3b
fix: Update pySourceOpt to use source text instead of FileMap
MikaelMayer Mar 6, 2026
0e488e7
fix: Use expr metadata for Laurel literals
MikaelMayer Mar 6, 2026
8610c0f
Merge branch 'main' into migrate-b3-smt-pipeline-core-to-core
MikaelMayer Mar 9, 2026
6452cee
fix: Add typeDecl case to CoreSMT predicates
MikaelMayer Mar 9, 2026
5014be6
Merge branch 'main' into migrate-b3-smt-pipeline-core-to-core
MikaelMayer Mar 9, 2026
83d9942
merge: Merge main (typeDecl, propType for division by zero)
MikaelMayer Mar 9, 2026
7b4cded
merge: Merge main (regex helper refactor)
MikaelMayer Mar 9, 2026
d112689
Merge branch 'main' into migrate-b3-smt-pipeline-core-to-core
MikaelMayer Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ jobs:
run: |
./run_py_analyze.sh
./run_py_analyze.sh laurel
./run_py_analyze.sh --incremental laurel
python run_py_analyze_sarif.py
python run_py_analyze_sarif.py --laurel
- name: Run regex differential tests
Expand Down
3 changes: 2 additions & 1 deletion Strata/Backends/CBMC/CoreToCBMC.lean
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,8 @@ end

def listToExpr (l: ListMap CoreLabel Core.Procedure.Check) : Core.Expression.Expr :=
match l with
| _ => .true ()
-- CBMC does not track source locations; SourceRange.none is used for synthesized expressions.
| _ => .true Strata.SourceRange.none

def createContractSymbolFromAST (func : Core.Procedure) : Except String CBMCSymbol := do
let location : Location := {
Expand Down
12 changes: 11 additions & 1 deletion Strata/DDM/Util/SourceRange.lean
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,24 @@ structure SourceRange where
start : String.Pos.Raw
/-- One past the end of the range. -/
stop : String.Pos.Raw
deriving DecidableEq, Inhabited, Repr
deriving DecidableEq, Inhabited

/-- Compact repr: always displays as `()` to keep debug output readable.
Source location info is available via `SourceRange.format`. -/
instance : Repr SourceRange where
reprPrec _ _ := "()"

namespace SourceRange

def none : SourceRange := { start := 0, stop := 0 }

def isNone (loc : SourceRange) : Bool := loc.start = 0 ∧ loc.stop = 0

/-- info: "()" -/
#guard_msgs in #eval toString (reprPrec (none : SourceRange) 0)
/-- info: "()" -/
#guard_msgs in #eval toString (reprPrec ({ start := ⟨5⟩, stop := ⟨10⟩ } : SourceRange) 0)

instance : Std.ToFormat SourceRange where
format fr := f!"{fr.start}-{fr.stop}"

Expand Down
94 changes: 48 additions & 46 deletions Strata/DL/Lambda/LExpr.lean

Large diffs are not rendered by default.

110 changes: 110 additions & 0 deletions Strata/DL/SMT/SolverInterface.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/-
Copyright Strata Contributors

SPDX-License-Identifier: Apache-2.0 OR MIT
-/

import Strata.DL.SMT.Solver
import Strata.DL.SMT.Term
import Strata.DL.SMT.TermType
import Strata.DL.SMT.DDMTransform.Translate
import Strata.Languages.Core.Options

/-!
# SMT Solver Interface

Abstract interface for SMT solvers using `Strata.SMT.Term` and `Strata.SMT.TermType`.
Converts to SMT-LIB strings via `SMTDDM.toString` when communicating with solvers.

The interface is a structure (not a type class) to allow runtime selection of
different solver backends.
-/

namespace Strata.SMT

open Strata.SMT

/-- Abstract interface for SMT solvers.
Uses Strata.SMT.Term which can be converted to SMT-LIB strings via SMTDDM.toString -/
structure SolverInterface where
/-- Push a new scope onto the solver stack -/
push : IO Unit
/-- Pop the top scope from the solver stack -/
pop : IO Unit
/-- Declare an uninterpreted sort -/
declareSort : String → Nat → IO Unit
/-- Declare an uninterpreted function -/
declareFun : String → List TermType → TermType → IO Unit
/-- Define a function with a body -/
defineFun : String → List (String × TermType) → TermType → Term → IO Unit
/-- Assert a term -/
assert : Term → IO Unit
/-- Check satisfiability -/
checkSat : IO Decision
/-- Check satisfiability with assumptions (check-sat-assuming) -/
checkSatAssuming : List Term → IO Decision
/-- Get model values for variables -/
getModel : List String → IO (List (String × String))
/-- Reset the solver state -/
reset : IO Unit

/-- Helper to convert Term to SMT-LIB string -/
private def termToString (t : Term) : Except String String :=
Strata.SMTDDM.termToString t

/-- Helper to create an SMTSolverInterface from an initialized Solver -/
def mkSolverInterfaceFromSolver (solver : Solver) : IO SolverInterface := do
let solverRef ← IO.mkRef solver
return {
push := do
let s ← solverRef.get
s.smtLibInput.putStr "(push 1)\n"
s.smtLibInput.flush
pop := do
let s ← solverRef.get
s.smtLibInput.putStr "(pop 1)\n"
s.smtLibInput.flush
declareSort := fun name arity => do
let _ ← (Solver.declareSort name arity).run (← solverRef.get)
declareFun := fun name argTypes retType => do
let _ ← (Solver.declareFun name argTypes retType).run (← solverRef.get)
defineFun := fun name args retType body => do
let _ ← (Solver.defineFunTerm name args retType body).run (← solverRef.get)
assert := fun term => do
let _ ← (Solver.assert term).run (← solverRef.get)
checkSat := do
(Solver.checkSat []).run (← solverRef.get) >>= fun (d, _) => pure d
checkSatAssuming := fun assumptions => do
let s ← solverRef.get
let assumptionStrs ← assumptions.mapM fun a =>
match termToString a with
| .ok str => pure str
| .error e => throw (IO.userError s!"Failed to convert term to string: {e}")
let assumptionsStr := String.intercalate " " assumptionStrs
s.smtLibInput.putStr s!"(check-sat-assuming ({assumptionsStr}))\n"
s.smtLibInput.flush
match s.smtLibOutput with
| .some stdout =>
let result := (← stdout.getLine).trimAscii.toString
match result with
| "sat" => return .sat
| "unsat" => return .unsat
| "unknown" => return .unknown
| other => throw (IO.userError s!"Unrecognized solver output: {other}")
| .none => return .unsat -- Buffer solver: assume proved (no diagnosis)
getModel := fun vars => do
let s ← solverRef.get
let varsStr := String.intercalate " " vars
s.smtLibInput.putStr s!"(get-value ({varsStr}))\n"
s.smtLibInput.flush
match s.smtLibOutput with
| .some stdout =>
let response ← stdout.getLine
return vars.map fun v => (v, response)
| .none => return []
reset := do
let _ ← (Solver.reset).run (← solverRef.get)
let _ ← (Solver.setLogic "ALL").run (← solverRef.get)
: SolverInterface }

end Strata.SMT
76 changes: 76 additions & 0 deletions Strata/DL/SMT/State.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/-
Copyright Strata Contributors

SPDX-License-Identifier: Apache-2.0 OR MIT
-/

import Strata.DL.SMT.SolverInterface
import Strata.Languages.Core.Expressions

/-!
# SMT State and Context Management

Defines the SMT solver state and context tracking. The state is returned from
verify calls to enable reuse across multiple verification sessions.
-/

namespace Strata.SMT

open Strata.SMT

/-- A context item represents something added to the SMT solver state -/
inductive ContextItem where
/-- An assumed expression (as SMT term) -/
| assumption : Term → ContextItem
/-- A declared sort (name, arity) -/
| sortDecl : String → Nat → ContextItem
/-- A declared function (name, arg types, return type) -/
| funcDecl : String → List TermType → TermType → ContextItem
/-- A defined function (name, args, return type, body) -/
| funcDef : String → List (String × TermType) → TermType → Term → ContextItem
/-- A declared variable (name, type) -/
| varDecl : String → TermType → ContextItem
/-- A defined variable (name, type, value) -/
| varDef : String → TermType → Term → ContextItem

/-- A scope is a list of context items added at the same push level -/
abbrev ContextScope := List ContextItem

/-- Context stack: a stack of scopes, where each scope corresponds to a push level.
The head of the list is the current (innermost) scope. -/
abbrev ContextStack := List ContextScope

/-- Verification state that can be reused across calls -/
structure VerifierState where
/-- The SMT solver interface -/
solver : SMT.SolverInterface
/-- Stack of context scopes (for push/pop support) -/
contextStack : ContextStack

/-- Create initial state from a solver interface -/
def VerifierState.init (solver : SMT.SolverInterface) : VerifierState :=
{ solver, contextStack := [[]] }

/-- Push a new scope onto the context stack -/
def VerifierState.push (state : VerifierState) : IO VerifierState := do
state.solver.push
return { state with contextStack := [] :: state.contextStack }

/-- Pop the top scope from the context stack -/
def VerifierState.pop (state : VerifierState) : IO VerifierState := do
state.solver.pop
match state.contextStack with
| [] => return state
| _ :: rest => return { state with contextStack := rest }

/-- Add an item to the current scope -/
def VerifierState.addItem (state : VerifierState) (item : ContextItem) : VerifierState :=
match state.contextStack with
| [] => { state with contextStack := [[item]] }
| scope :: rest => { state with contextStack := (item :: scope) :: rest }

/-- Get all context items (flattened from all scopes) for error reporting -/
def VerifierState.allContextItems (state : VerifierState) : List ContextItem :=
state.contextStack.flatten

end Strata.SMT
49 changes: 49 additions & 0 deletions Strata/Languages/B3/Format.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/-
Copyright Strata Contributors

SPDX-License-Identifier: Apache-2.0 OR MIT
-/

import Strata.Languages.B3.DDMTransform.Conversion
import Strata.Languages.B3.DDMTransform.DefinitionAST

/-!
# B3 Formatting Utilities

Helper functions for formatting B3 AST nodes to strings using DDM.
-/

namespace B3

open Strata

/-- Get metadata from B3 expression -/
def getExpressionMetadata (expr : B3AST.Expression SourceRange) : SourceRange :=
match expr with
| .literal m _ => m
| .id m _ => m
| .ite m _ _ _ => m
| .binaryOp m _ _ _ => m
| .unaryOp m _ _ => m
| .functionCall m _ _ => m
| .labeledExpr m _ _ => m
| .letExpr m _ _ _ => m
| .quantifierExpr m _ _ _ _ => m

/-- Format a DDM operation AST node to string -/
private def formatOp (prog : Program) (op : Operation) : String :=
let fmtCtx := FormatContext.ofDialects prog.dialects prog.globalContext {}
let fmtState : FormatState := { openDialects := prog.dialects.toList.foldl (init := {}) fun a (dialect : Dialect) => a.insert dialect.name }
(mformat (ArgF.op op) fmtCtx fmtState).format.pretty.trimAscii.toString

/-- Format B3 statement to string -/
def formatStatement (prog : Program) (stmt : B3AST.Statement SourceRange) (ctx : ToCSTContext) : String :=
let (cstStmt, _) := B3.stmtToCST ctx stmt
formatOp prog cstStmt.toAst

/-- Format B3 expression to string -/
def formatExpression (prog : Program) (expr : B3AST.Expression SourceRange) (ctx : ToCSTContext) : String :=
let (cstExpr, _) := B3.expressionToCST ctx expr
formatOp prog cstExpr.toAst

end B3
Loading
Loading