From 43488bcd6164fd862fbba9269744066b27b60baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petar=20Maksimovi=C4=87?= Date: Tue, 10 Sep 2024 13:23:03 +0200 Subject: [PATCH] Stabilising `chop` lemmas (#2613) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * removing some unneeded lemmas * first attempt at stabilising chop lemmas * removing unused claim * correction * formatting * corrections * further corrections * correction * adding tests --------- Co-authored-by: Andrei Văcaru <16517508+anvacaru@users.noreply.github.com> --- .../lemmas/evm-int-simplification.k | 36 +++++++++++++++---- tests/specs/functional/lemmas-spec.k | 19 ++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) 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