diff --git a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/evm-int-simplification.k b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/evm-int-simplification.k index 6c2e39931c..a4c168fbb2 100644 --- a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/evm-int-simplification.k +++ b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/evm-int-simplification.k @@ -91,12 +91,36 @@ module EVM-INT-SIMPLIFICATION-COMMON rule [chop-upper-bound]: 0 <=Int chop(_V) => true [simplification, smt-lemma] rule [chop-lower-bound]: chop(_V) true [simplification, smt-lemma] - rule [chop-sum-left]: chop ( chop ( X:Int ) +Int Y:Int ) => chop ( X +Int Y ) [simplification] - rule [chop-sum-right]: chop ( X:Int +Int chop ( Y:Int ) ) => chop ( X +Int Y ) [simplification] - - rule [chop-no-overflow-add]: - X:Int <=Int chop ( X +Int Y:Int ) => X +Int Y chop ( X +Int Y ) [simplification] + rule [chop-add-right]: chop ( X:Int +Int chop ( Y:Int ) ) => chop ( X +Int Y ) [simplification] + rule [chop-mul-left]: chop ( chop ( X:Int ) *Int Y:Int ) => chop ( X *Int Y ) [simplification] + rule [chop-mul-right]: chop ( X:Int *Int chop ( Y:Int ) ) => chop ( X *Int Y ) [simplification] + + rule [chop-add-r-pos]: + chop ( X:Int +Int Y:Int ) ==Int 0 => X ==Int chop ( pow256 -Int chop ( Y ) ) + requires #rangeUInt(256, X) andBool 0 <=Int Y + [simplification, concrete(Y), comm] + + rule [chop-add-r-neg]: + chop ( X:Int +Int Y:Int ) ==Int 0 => X ==Int (-1) *Int Y + requires #rangeUInt(256, X) andBool #rangeUInt(256, (-1) *Int Y) + [simplification, concrete(Y), comm] + + rule [chop-zero-sub]: + chop ( 0 -Int X:Int ) ==Int Y:Int => X ==Int chop ( pow256 -Int Y ) requires #rangeUInt(256, X) andBool #rangeUInt(256, Y) - [simplification] + [simplification, concrete(Y), comm] + + rule [chop-no-overflow-add-le-l]: X:Int <=Int chop ( X +Int Y:Int ) => X +Int Y X +Int Y X *Int Y X *Int Y X *Int Y X *Int Y { true #Equals X *Int Y { true #Equals X *Int Y { true #Equals X *Int Y { true #Equals X *Int Y doneLemma ( false ) ... requires #rangeUInt(256, X) andBool #rangeUInt(256, Y) andBool #rangeUInt(256, C) + claim [chop-sub-01]: runLemma ( chop ( X -Int Y ) ) => doneLemma ( X -Int Y ) ... + requires #rangeUInt(256, X) andBool #rangeUInt(256, Y) andBool Y <=Int X + + claim [chop-mul-01]: runLemma ( chop ( X *Int Y ) ) => doneLemma ( X *Int Y ) ... + requires 0 <=Int X andBool X runLemma ( chop ( 0 -Int chop ( X +Int (-16)) ) ==Int 0 ) => doneLemma ( false ) ... + requires 0 <=Int X andBool X runLemma ( X:Int <=Int chop ( X +Int Y:Int ) ) => doneLemma ( true ) ... + requires #rangeUInt(128, X) andBool #rangeUInt(128, Y) + + claim [chop-overflow-02]: runLemma ( X:Int <=Int chop ( X *Int Y:Int ) /Int Y ) => doneLemma ( true ) ... + requires #rangeUInt(128, X) andBool #rangeUInt(128, Y) + + claim [chop-overflow-03]: runLemma ( X:Int ==Int chop ( X *Int Y:Int ) /Int Y ) => doneLemma ( false ) ... + requires pow128 <=Int X andBool X