diff --git a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/lemmas.k b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/lemmas.k index 3dd3dfdf8b..d6ae1bb695 100644 --- a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/lemmas.k +++ b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/lemmas.k @@ -59,6 +59,10 @@ module LEMMAS-WITHOUT-SLOT-UPDATES [symbolic] // bool2Word reasoning // ######################## + // Reduce when the path condition only implies the argument. + rule [b2w-true]: bool2Word(B) => 1 requires B [simplification] + rule [b2w-false]: bool2Word(B) => 0 requires notBool B [simplification] + // Range rule [b2w-lb]: 0 <=Int bool2Word(_) => true [simplification, smt-lemma] rule [b2w-ub]: bool2Word(_) <=Int 1 => true [simplification, smt-lemma] diff --git a/kevm-pyk/src/tests/integration/test_prove.py b/kevm-pyk/src/tests/integration/test_prove.py index ca641ac638..f0c0b8b590 100644 --- a/kevm-pyk/src/tests/integration/test_prove.py +++ b/kevm-pyk/src/tests/integration/test_prove.py @@ -110,6 +110,7 @@ def exclude_list(exclude_file: Path) -> list[Path]: 'functional/lemmas-no-smt-spec.k': 'lemmas-no-smt-spec.k', 'functional/lemmas-spec.k': 'lemmas-spec.k', 'functional/abi-spec.k': 'abi-spec.k', + 'functional/bool2Word-symbolic-spec.k': 'bool2Word-symbolic-spec.k', 'functional/merkle-spec.k': 'merkle-spec.k', 'functional/slot-updates-spec.k': 'slot-updates-spec.k', 'functional/storageRoot-spec.k': 'storageRoot-spec.k', diff --git a/tests/specs/functional/bool2Word-symbolic-spec.k b/tests/specs/functional/bool2Word-symbolic-spec.k new file mode 100644 index 0000000000..07fca3ffa7 --- /dev/null +++ b/tests/specs/functional/bool2Word-symbolic-spec.k @@ -0,0 +1,48 @@ +requires "edsl.md" +requires "lemmas/lemmas.k" + +module VERIFICATION + imports EDSL + imports LEMMAS + + syntax StepSort ::= Int | Bool + // ------------------------------ + + syntax KItem ::= runLemma ( StepSort ) [symbol(runLemma)] + | doneLemma( StepSort ) + // -------------------------------------- + rule runLemma( T ) => doneLemma( T ) + +endmodule + +// Without the `b2w-true` / `b2w-false` simplification lemmas in lemmas.k, +// claims 5-6 fail: the path condition implies but does not equate the +// argument, so the function-rule matcher cannot discharge it without SMT. +// With the simplification lemmas, all six claims pass. +module BOOL2WORD-SYMBOLIC-SPEC + imports VERIFICATION + + claim [b2w-var-true]: + runLemma ( bool2Word(B:Bool) ) => doneLemma( 1 ) ... + requires B + + claim [b2w-var-false]: + runLemma ( bool2Word(B:Bool) ) => doneLemma( 0 ) ... + requires notBool B + + claim [b2w-expr-eq-true]: + runLemma ( bool2Word(X >Int Y) ) => doneLemma( 1 ) ... + requires X >Int Y + + claim [b2w-expr-eq-false]: + runLemma ( bool2Word(X >Int Y) ) => doneLemma( 0 ) ... + requires notBool (X >Int Y) + + claim [b2w-implied-true]: + runLemma ( bool2Word(X >=Int 0) ) => doneLemma( 1 ) ... + requires X >Int 0 + + claim [b2w-implied-false]: + runLemma ( bool2Word(X doneLemma( 0 ) ... + requires X >Int 0 +endmodule