Skip to content

Enable calling procedures in contracts#1352

Merged
keyboardDrummer merged 146 commits into
strata-org:reviewed-kbd-will-merge-to-mainfrom
keyboardDrummer:issue-924-contract-and-proof-pass
Jun 23, 2026
Merged

Enable calling procedures in contracts#1352
keyboardDrummer merged 146 commits into
strata-org:reviewed-kbd-will-merge-to-mainfrom
keyboardDrummer:issue-924-contract-and-proof-pass

Conversation

@keyboardDrummer

@keyboardDrummer keyboardDrummer commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Functional changes

  1. [Debugging] Improve the printing of Laurel if-then-else expressions
  2. EliminateReturnsInExpression now runs for procedures as well, which enables more types of transparent bodies for procedures. To make it work for both functions and procedures, it was also necessary for the body of functions to be immediately wrapped in a return statement during parsing.
  3. Allow calling procedures from contracts. Combined with the previous change this makes procedures strictly more powerful than functions
  4. Let the transparency pass rewrite the bodies of assume statements so they don't assert anything.
  5. Improve diagnostics related to contracts, using the correct verbiage "precondition" and "postcondition" instead of "assertion"
  6. Generalized the LaurelPass concept so it works for all transformation between Laurel source and Core, not just the Laurel->Laurel transformation. This helps make the documentation more complete.

Why let the transparency pass rewrite the bodies of assume statements so they don't assert anything?

After the contract pass, a call will look like assert <preconditions>; call(..); assume <postconditions>, where the body of the callee looks like assume <preconditions>; <body>; assert <postconditions>. If we now do either concrete execution, or we do inlining, then any assertions that occur inside the pre or postconditions will be asserted twice, because they occur once in an assert and once in an assume. By ignoring the assertions inside the assume, we prevent the duplication.

Whether you also want this behavior for assumptions that were created by users is something I'm not sure about. However, if we want we can let those behave differently. Right now I think we don't have enough data to decide what we want for user created assumptions, and they are AFAIK not yet used, so I think it's OK to change their behavior.

Implementation

Add these passes:

  • [New] EliminateReturnStatements: rewrite return to exit statements, needed for the next pass.
  • [New] ContractPass: translate away pre and postconditions entirely by introducing assertion and assumptions at call sites and at procedure starts and ends
  • [Updated] Lift assertions, assumptions and procedure calls when they occur in expressions. Note: the changes in this pass could have been extracted to a different PR to reduce the scope of this one, but I think that keeping them in this PR is most efficient from a developer time perspective.

Follow-up work

  • Remove the now obsolete functions from Laurel
  • Create WF proofs for quantifier bodies
  • Lift assumptions in expressions to axioms.
  • In the transparency phase, if something has no asserts and only calls functions, only create a function and no procedure

@fabiomadge

Copy link
Copy Markdown
Contributor

Re-checked at 4efaebd45: assert/assume expr-position regression fixed via transformLiftedExpr (clears subst, still lifts calls/holes). Verified (546 green): assert foo() == 5 translates clean; assert <??>assertion does not hold, not the old crash. Older threads addressed/non-gating (inline).

Note: PR is CONFLICTING (7 Laurel files vs base, incl. LiftImperativeExpressions.lean) — worth confirming the fix survives the merge.

fabiomadge
fabiomadge previously approved these changes Jun 22, 2026
Comment thread StrataTest/Languages/Laurel/Examples/Objects/T1_MutableFields.lean
@keyboardDrummer keyboardDrummer added this pull request to the merge queue Jun 23, 2026
Merged via the queue into strata-org:reviewed-kbd-will-merge-to-main with commit 49c3e1a Jun 23, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants