Skip to content

[WIP] CVC 5 integration - #140

Draft
RSoulatIOHK wants to merge 20 commits into
mainfrom
feat/cvc5
Draft

[WIP] CVC 5 integration#140
RSoulatIOHK wants to merge 20 commits into
mainfrom
feat/cvc5

Conversation

@RSoulatIOHK

Copy link
Copy Markdown
Collaborator

I used the short time we got Fable 5 to try to have it do the CVC 5 integration.

This has not been reviewed. Done with Fable 5 everything maxed.

RSoulatIOHK and others added 20 commits July 6, 2026 08:57
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cvc5 1.3.4 reserves @/.-prefixed symbols in default parsing mode, but
Blaster emits qualifiers like @isnat; spawn with --parsing-mode=lenient.
Bump minVersion to 1.3.4 (local + CI pin), add end-to-end cvc5 tests
(valid/falsified/gen-cex/timeout/seed/tactic) on goals the pre-SMT
optimizer cannot fold away.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Script-generated: 497 siblings across 45 files. Skips invocations that
never reach a solver (only-smt-lib/only-optimize), #guard_msgs-wrapped
blocks (Z3 baselines, handled separately), and invocations already
carrying a solver option.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
:finite-model-find + :fmf-fun (suggested by JFE) let cvc5 produce
counterexample models for falsified goals over recursively-defined
functions. :tlimit-per 30000 caps every check by default so no cvc5
invocation can run forever; explicit (timeout: n) still overrides.
Spec documents the qualifier bridge-axiom limitation and the proven
define-fun follow-up fix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…outs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SolverChoice (one/all/any) replaces the single-solver option. all/any
spawn every supported solver (Z3+cvc5), each with its own startup
options, all receiving the identical command stream via a broadcast
submission layer over an smtProcs array.

any: first definitive answer wins; losing processes are killed and the
run narrows to the winner (BMC/K-Induction rounds after the first
decided check are single-solver). all: answers are cross-checked each
round — sat vs unsat is a hard soundness error; definitive vs unknown
raises a warning listing per-solver verdicts (tracking signal for goals
not discharged by every solver). Model values are queried only on the
answering process using that solver's query style.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…suggestion

all mode logs per-solver verdicts with wall-clock answer times
(⏱ Z3 → unsat (12ms), cvc5 → unsat (24ms)) for benchmarking; any mode
announces the winning solver and its time (🏁), and offers a 'Try this'
code action replacing (solver: any) with the winner so the result can
be reproduced deterministically — on both the #blaster command and the
blaster tactic. (verbose: 1) additionally reports the total wall-clock
of the whole call. Per-solver timings and the any-winner are recorded
in SmtEnv (solverPerf/anyWinner).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The all-mode cross-check now records the fastest solver whose answer
matches the adopted result; the Try-this code action offers replacing
(solver: all) with it, same as for any-mode races.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The builtin tryThisProvider reads TryThisInfo from the command info
tree, which async-elaborated commands like #blaster never expose to the
server — leaving only the InfoView link. This code-action provider
reconstructs the quick fix from the reported 'Try this:' diagnostic
itself (its range is the invocation to replace; its rendered message
carries the replacement) and links the action to the diagnostic, so
editors offer it from the diagnostic hover box and the quick-fix menu.
Verified with a headless LSP probe: quickfix returned, preferred, with
the correct text edit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
497 command pairs and 19 tactic-theorem pairs collapse into one
(solver: all) call each: both solvers now run in parallel per test with
a sat/unsat soundness cross-check, definitive-vs-unknown divergences
surface as tracking warnings, and the suite shrinks by ~650 lines.
Differing pair expectations resolve to the definitive solve-result;
cvc5-side timeouts are kept. #guard_msgs-baselined blocks and the
deliberate per-solver coverage in SmtSolverSelection stay unchanged.
Side effect: the previously failing cvc5-only tactic siblings in
Issue26/27 are fixed — all-mode adopts Z3's unsat when cvc5 gives up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant