diff -r d425bdf419f5 -r 5ff9fe3fee66 src/HOL/SMT_Examples/SMT_Tests.thy --- a/src/HOL/SMT_Examples/SMT_Tests.thy Thu Jul 27 15:22:35 2017 +0100 +++ b/src/HOL/SMT_Examples/SMT_Tests.thy Fri Jul 28 15:36:32 2017 +0100 @@ -222,6 +222,123 @@ by smt+ +section {* Natural numbers *} + +declare [[smt_nat_as_int]] + +lemma + "(0::nat) = 0" + "(1::nat) = 1" + "(0::nat) < 1" + "(0::nat) \ 1" + "(123456789::nat) < 2345678901" + by smt+ + +lemma + "Suc 0 = 1" + "Suc x = x + 1" + "x < Suc x" + "(Suc x = Suc y) = (x = y)" + "Suc (x + y) < Suc x + Suc y" + by smt+ + +lemma + "(x::nat) + 0 = x" + "0 + x = x" + "x + y = y + x" + "x + (y + z) = (x + y) + z" + "(x + y = 0) = (x = 0 \ y = 0)" + by smt+ + +lemma + "(x::nat) - 0 = x" + "x < y \ x - y = 0" + "x - y = 0 \ y - x = 0" + "(x - y) + y = (if x < y then y else x)" + "x - y - z = x - (y + z)" + by smt+ + +lemma + "(x::nat) * 0 = 0" + "0 * x = 0" + "x * 1 = x" + "1 * x = x" + "3 * x = x * 3" + by smt+ + +lemma + "(0::nat) div 0 = 0" + "(x::nat) div 0 = 0" + "(0::nat) div 1 = 0" + "(1::nat) div 1 = 1" + "(3::nat) div 1 = 3" + "(x::nat) div 1 = x" + "(0::nat) div 3 = 0" + "(1::nat) div 3 = 0" + "(3::nat) div 3 = 1" + "(x::nat) div 3 \ x" + "(x div 3 = x) = (x = 0)" + using [[z3_extensions]] + by smt+ + +lemma + "(0::nat) mod 0 = 0" + "(x::nat) mod 0 = x" + "(0::nat) mod 1 = 0" + "(1::nat) mod 1 = 0" + "(3::nat) mod 1 = 0" + "(x::nat) mod 1 = 0" + "(0::nat) mod 3 = 0" + "(1::nat) mod 3 = 1" + "(3::nat) mod 3 = 0" + "x mod 3 < 3" + "(x mod 3 = x) = (x < 3)" + using [[z3_extensions]] + by smt+ + +lemma + "(x::nat) = x div 1 * 1 + x mod 1" + "x = x div 3 * 3 + x mod 3" + using [[z3_extensions]] + by smt+ + +lemma + "min (x::nat) y \ x" + "min x y \ y" + "min x y \ x + y" + "z < x \ z < y \ z < min x y" + "min x y = min y x" + "min x 0 = 0" + by smt+ + +lemma + "max (x::nat) y \ x" + "max x y \ y" + "max x y \ (x - y) + (y - x)" + "z > x \ z > y \ z > max x y" + "max x y = max y x" + "max x 0 = x" + by smt+ + +lemma + "0 \ (x::nat)" + "0 < x \ x \ 1 \ x = 1" + "x \ x" + "x \ y \ 3 * x \ 3 * y" + "x < y \ 3 * x < 3 * y" + "x < y \ x \ y" + "(x < y) = (x + 1 \ y)" + "\ (x < x)" + "x \ y \ y \ z \ x \ z" + "x < y \ y \ z \ x \ z" + "x \ y \ y < z \ x \ z" + "x < y \ y < z \ x < z" + "x < y \ y < z \ \ (z < x)" + by smt+ + +declare [[smt_nat_as_int = false]] + + section \Integers\ lemma