Quellcode-Bibliothek
© Kompilation durch diese Firma
[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]
Datei:
SMT_Tests_Verit.thy
Sprache: VDM
(* Title: HOL/SMT_Examples/SMT_Tests.thy
Author: Sascha Boehme, TU Muenchen
Author: Mathias Fleury, MPII, JKU
*)
section \<open>Tests for the SMT binding\<close>
theory SMT_Tests_Verit
imports Complex_Main
begin
declare [[smt_solver=verit]]
smt_status
text \<open>Most examples are taken from the equivalent Z3 theory called \<^file>\<open>SMT_Tests.thy\<close>,
and have been taken from various Isabelle and HOL4 developments.\<close>
section \<open>Propositional logic\<close>
lemma
"True"
"\ False"
"\ \ True"
"True \ True"
"True \ False"
"False \ True"
"\ (False \ True)"
by smt+
lemma
"P \ \ P"
"\ (P \ \ P)"
"(True \ P) \ \ P \ (False \ P) \ P"
"P \ P"
"P \ \ P \ False"
"P \ Q \ Q \ P"
"P \ Q \ Q \ P"
"P \ Q \ P \ Q"
"\ (P \ Q) \ \ P"
"\ (P \ Q) \ \ Q"
"\ P \ \ (P \ Q)"
"\ Q \ \ (P \ Q)"
"(P \ Q) \ (\ (\ P \ \ Q))"
"(P \ Q) \ R \ P \ (Q \ R)"
"(P \ Q) \ R \ P \ (Q \ R)"
"(P \ Q) \ R \ (P \ R) \ (Q \ R)"
"(P \ R) \ (Q \ R) \ (P \ Q) \ R"
"(P \ Q) \ R \ (P \ R) \ (Q \ R)"
"(P \ R) \ (Q \ R) \ (P \ Q) \ R"
"((P \ Q) \ P) \ P"
"(P \ R) \ (Q \ R) \ (P \ Q \ R)"
"(P \ Q \ R) \ (P \ (Q \ R))"
"((P \ R) \ R) \ ((Q \ R) \ R) \ (P \ Q \ R) \ R"
"\ (P \ R) \ \ (Q \ R) \ \ (P \ Q \ R)"
"(P \ Q \ R) \ (P \ Q) \ (P \ R)"
"P \ (Q \ P)"
"(P \ Q \ R) \ (P \ Q)\ (P \ R)"
"(P \ Q) \ (P \ R) \ (P \ Q \ R)"
"((((P \ Q) \ P) \ P) \ Q) \ Q"
"(P \ Q) \ (\ Q \ \ P)"
"(P \ Q \ R) \ (P \ Q) \ (P \ R)"
"(P \ Q) \ (Q \ P) \ (P \ Q)"
"(P \ Q) \ (Q \ P)"
"\ (P \ \ P)"
"(P \ Q) \ (\ Q \ \ P)"
"P \ P \ P \ P \ P \ P \ P \ P \ P \ P"
by smt+
lemma
"(if P then Q1 else Q2) \ ((P \ Q1) \ (\ P \ Q2))"
"if P then (Q \ P) else (P \ Q)"
"(if P1 \ P2 then Q1 else Q2) \ (if P1 then Q1 else if P2 then Q1 else Q2)"
"(if P1 \ P2 then Q1 else Q2) \ (if P1 then if P2 then Q1 else Q2 else Q2)"
"(P1 \ (if P2 then Q1 else Q2)) \
(if P1 \<longrightarrow> P2 then P1 \<longrightarrow> Q1 else P1 \<longrightarrow> Q2)"
by smt+
lemma
"case P of True \ P | False \ \ P"
"case P of False \ \ P | True \ P"
"case \ P of True \ \ P | False \ P"
"case P of True \ (Q \ P) | False \ (P \ Q)"
by smt+
section \<open>First-order logic with equality\<close>
lemma
"x = x"
"x = y \ y = x"
"x = y \ y = z \ x = z"
"x = y \ f x = f y"
"x = y \ g x y = g y x"
"f (f x) = x \ f (f (f (f (f x)))) = x \ f x = x"
"((if a then b else c) = d) = ((a \ (b = d)) \ (\ a \ (c = d)))"
by smt+
lemma
"\x. x = x"
"(\x. P x) \ (\y. P y)"
"\x. P x \ (\y. P x \ P y)"
"(\x. P x \ Q x) \ (\x. P x) \ (\x. Q x)"
"(\x. P x) \ R \ (\x. P x \ R)"
"(\x y z. S x z) \ (\x z. S x z)"
"(\x y. S x y \ S y x) \ (\x. S x y) \ S y x"
"(\x. P x \ P (f x)) \ P d \ P (f(f(f(d))))"
"(\x y. s x y = s y x) \ a = a \ s a b = s b a"
"(\s. q s \ r s) \ \ r s \ (\s. \ r s \ \ q s \ p t \ q t) \ p t \ r t"
by smt+
lemma
"(\x. P x) \ R \ (\x. P x \ R)"
by smt
lemma
"\x. x = x"
"(\x. P x) \ (\y. P y)"
"(\x. P x \ Q x) \ (\x. P x) \ (\x. Q x)"
"(\x. P x) \ R \ (\x. P x \ R)"
"(\x y z. S x z) \ (\x z. S x z)"
"\ ((\x. \ P x) \ ((\x. P x) \ (\x. P x \ Q x)) \ \ (\x. P x))"
by smt+
lemma
"\x y. x = y"
"(\x. P x) \ R \ (\x. P x \ R)"
"\x. P x \ P a \ P b"
"(\x. Q \ P x) \ (Q \ (\x. P x))"
by smt+
lemma
"(P False \ P True) \ \ P False"
by smt
lemma
"(\ (\x. P x)) \ (\x. \ P x)"
"(\x. P x \ Q) \ (\x. P x) \ Q"
"(\x y. R x y = x) \ (\y. R x y) = R x c"
"(if P x then \ (\y. P y) else (\y. \ P y)) \ P x \ P y"
"(\x y. R x y = x) \ (\x. \y. R x y) = (\x. R x c) \ (\y. R x y) = R x c"
by smt+
lemma
"\x. \y. f x y = f x (g x)"
"(\ \ (\x. P x)) \ (\ (\x. \ P x))"
"\u. \v. \w. \x. f u v w x = f u (g u) w (h u w)"
"\x. if x = y then (\y. y = x \ y \ x) else (\y. y = (x, x) \ y \ (x, x))"
"\x. if x = y then (\y. y = x \ y \ x) else (\y. y = (x, x) \ y \ (x, x))"
"(\x. \y. P x \ P y) \ ((\x. P x) \ (\y. P y))"
"(\y. \x. R x y) \ (\x. \y. R x y)"
by smt+
lemma
"(\!x. P x) \ (\x. P x)"
"(\!x. P x) \ (\x. P x \ (\y. y \ x \ \ P y))"
"P a \ (\x. P x \ x = a) \ (\!x. P x)"
"(\x. P x) \ (\x y. P x \ P y \ x = y) \ (\!x. P x)"
"(\!x. P x) \ (\x. P x \ (\y. P y \ y = x) \ R) \ R"
by smt+
lemma
"(\x\M. P x) \ c \ M \ P c"
"(\x\M. P x) \ \ (P c \ c \ M)"
by smt+
lemma
"let P = True in P"
"let P = P1 \ P2 in P \ \ P"
"let P1 = True; P2 = False in P1 \ P2 \ P2 \ P1"
"(let x = y in x) = y"
"(let x = y in Q x) \ (let z = y in Q z)"
"(let x = y1; z = y2 in R x z) \ (let z = y2; x = y1 in R x z)"
"(let x = y1; z = y2 in R x z) \ (let z = y1; x = y2 in R z x)"
"let P = (\x. Q x) in if P then P else \ P"
by smt+
lemma
"a \ b \ a \ c \ b \ c \ (\x y. f x = f y \ y = x) \ f a \ f b"
by smt
lemma
"(\x y z. f x y = f x z \ y = z) \ b \ c \ f a b \ f a c"
"(\x y z. f x y = f z y \ x = z) \ a \ d \ f a b \ f d b"
by smt+
section \<open>Guidance for quantifier heuristics: patterns\<close>
lemma
assumes "\x.
SMT.trigger (SMT.Symb_Cons (SMT.Symb_Cons (SMT.pat (f x)) SMT.Symb_Nil) SMT.Symb_Nil)
(f x = x)"
shows "f 1 = 1"
using assms by smt
lemma
assumes "\x y.
SMT.trigger (SMT.Symb_Cons (SMT.Symb_Cons (SMT.pat (f x))
(SMT.Symb_Cons (SMT.pat (g y)) SMT.Symb_Nil)) SMT.Symb_Nil) (f x = g y)"
shows "f a = g b"
using assms by smt
section \<open>Meta-logical connectives\<close>
lemma
"True \ True"
"False \ True"
"False \ False"
"P' x \ P' x"
"P \ P \ Q"
"Q \ P \ Q"
"\ P \ P \ Q"
"Q \ P \ Q"
"\P; \ Q\ \ \ (P \ Q)"
"P' x \ P' x"
"P' x \ Q' x \ P' x = Q' x"
"P' x = Q' x \ P' x \ Q' x"
"x \ y \ y \ z \ x \ (z::'a::type)"
"x \ y \ (f x :: 'b::type) \ f y"
"(\x. g x) \ g a \ a"
"(\x y. h x y \ h y x) \ \x. h x x"
"(p \ q) \ \ p \ q"
"(a \ b) \ (c \ d) \ (a \ b) \ (c \ d)"
by smt+
section \<open>Natural numbers\<close>
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
"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 \<open>Integers\<close>
lemma
"(0::int) = 0"
"(0::int) = (- 0)"
"(1::int) = 1"
"\ (-1 = (1::int))"
"(0::int) < 1"
"(0::int) \ 1"
"-123 + 345 < (567::int)"
"(123456789::int) < 2345678901"
"(-123456789::int) < 2345678901"
by smt+
lemma
"(x::int) + 0 = x"
"0 + x = x"
"x + y = y + x"
"x + (y + z) = (x + y) + z"
"(x + y = 0) = (x = -y)"
by smt+
lemma
"(-1::int) = - 1"
"(-3::int) = - 3"
"-(x::int) < 0 \ x > 0"
"x > 0 \ -x < 0"
"x < 0 \ -x > 0"
by smt+
lemma
"(x::int) - 0 = x"
"0 - x = -x"
"x < y \ x - y < 0"
"x - y = -(y - x)"
"x - y = -y + x"
"x - y - z = x - (y + z)"
by smt+
lemma
"(x::int) * 0 = 0"
"0 * x = 0"
"x * 1 = x"
"1 * x = x"
"x * -1 = -x"
"-1 * x = -x"
"3 * x = x * 3"
by smt+
lemma
"\x::int\ \ 0"
"(\x\ = 0) = (x = 0)"
"(x \ 0) = (\x\ = x)"
"(x \ 0) = (\x\ = -x)"
"\\x\\ = \x\"
by smt+
lemma
"min (x::int) y \ x"
"min x y \ y"
"z < x \ z < y \ z < min x y"
"min x y = min y x"
"x \ 0 \ min x 0 = 0"
"min x y \ \x + y\"
by smt+
lemma
"max (x::int) y \ x"
"max x y \ y"
"z > x \ z > y \ z > max x y"
"max x y = max y x"
"x \ 0 \ max x 0 = x"
"max x y \ - \x\ - \y\"
by smt+
lemma
"0 < (x::int) \ 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+
section \<open>Reals\<close>
lemma
"(0::real) = 0"
"(0::real) = -0"
"(0::real) = (- 0)"
"(1::real) = 1"
"\ (-1 = (1::real))"
"(0::real) < 1"
"(0::real) \ 1"
"-123 + 345 < (567::real)"
"(123456789::real) < 2345678901"
"(-123456789::real) < 2345678901"
by smt+
lemma
"(x::real) + 0 = x"
"0 + x = x"
"x + y = y + x"
"x + (y + z) = (x + y) + z"
"(x + y = 0) = (x = -y)"
by smt+
lemma
"(-1::real) = - 1"
"(-3::real) = - 3"
"-(x::real) < 0 \ x > 0"
"x > 0 \ -x < 0"
"x < 0 \ -x > 0"
by smt+
lemma
"(x::real) - 0 = x"
"0 - x = -x"
"x < y \ x - y < 0"
"x - y = -(y - x)"
"x - y = -y + x"
"x - y - z = x - (y + z)"
by smt+
lemma
"(x::real) * 0 = 0"
"0 * x = 0"
"x * 1 = x"
"1 * x = x"
"x * -1 = -x"
"-1 * x = -x"
"3 * x = x * 3"
by smt+
lemma
"\x::real\ \ 0"
"(\x\ = 0) = (x = 0)"
"(x \ 0) = (\x\ = x)"
"(x \ 0) = (\x\ = -x)"
"\\x\\ = \x\"
by smt+
lemma
"min (x::real) y \ x"
"min x y \ y"
"z < x \ z < y \ z < min x y"
"min x y = min y x"
"x \ 0 \ min x 0 = 0"
"min x y \ \x + y\"
by smt+
lemma
"max (x::real) y \ x"
"max x y \ y"
"z > x \ z > y \ z > max x y"
"max x y = max y x"
"x \ 0 \ max x 0 = x"
"max x y \ - \x\ - \y\"
by smt+
lemma
"x \ (x::real)"
"x \ y \ 3 * x \ 3 * y"
"x < y \ 3 * x < 3 * y"
"x < y \ x \ 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+
section \<open>Datatypes, records, and typedefs\<close>
subsection \<open>Without support by the SMT solver\<close>
subsubsection \<open>Algebraic datatypes\<close>
lemma
"x = fst (x, y)"
"y = snd (x, y)"
"((x, y) = (y, x)) = (x = y)"
"((x, y) = (u, v)) = (x = u \ y = v)"
"(fst (x, y, z) = fst (u, v, w)) = (x = u)"
"(snd (x, y, z) = snd (u, v, w)) = (y = v \ z = w)"
"(fst (snd (x, y, z)) = fst (snd (u, v, w))) = (y = v)"
"(snd (snd (x, y, z)) = snd (snd (u, v, w))) = (z = w)"
"(fst (x, y) = snd (x, y)) = (x = y)"
"p1 = (x, y) \ p2 = (y, x) \ fst p1 = snd p2"
"(fst (x, y) = snd (x, y)) = (x = y)"
"(fst p = snd p) = (p = (snd p, fst p))"
using fst_conv snd_conv prod.collapse
by smt+
lemma
"[x] \ Nil"
"[x, y] \ Nil"
"x \ y \ [x] \ [y]"
"hd (x # xs) = x"
"tl (x # xs) = xs"
"hd [x, y, z] = x"
"tl [x, y, z] = [y, z]"
"hd (tl [x, y, z]) = y"
"tl (tl [x, y, z]) = [z]"
using list.sel(1,3) list.simps
by smt+
lemma
"fst (hd [(a, b)]) = a"
"snd (hd [(a, b)]) = b"
using fst_conv snd_conv prod.collapse list.sel(1,3) list.simps
by smt+
subsubsection \<open>Records\<close>
record point =
cx :: int
cy :: int
record bw_point = point +
black :: bool
lemma
"\cx = x, cy = y\ = \cx = x', cy = y'\ \ x = x' \ y = y'"
using point.simps
by smt
lemma
"cx \ cx = 3, cy = 4 \ = 3"
"cy \ cx = 3, cy = 4 \ = 4"
"cx \ cx = 3, cy = 4 \ \ cy \ cx = 3, cy = 4 \"
"\ cx = 3, cy = 4 \ \ cx := 5 \ = \ cx = 5, cy = 4 \"
"\ cx = 3, cy = 4 \ \ cy := 6 \ = \ cx = 3, cy = 6 \"
"p = \ cx = 3, cy = 4 \ \ p \ cx := 3 \ \ cy := 4 \ = p"
"p = \ cx = 3, cy = 4 \ \ p \ cy := 4 \ \ cx := 3 \ = p"
using point.simps
by smt+
lemma
"\cx = x, cy = y, black = b\ = \cx = x', cy = y', black = b'\ \ x = x' \ y = y' \ b = b'"
using point.simps bw_point.simps
by smt
lemma
"cx \ cx = 3, cy = 4, black = b \ = 3"
"cy \ cx = 3, cy = 4, black = b \ = 4"
"black \ cx = 3, cy = 4, black = b \ = b"
"cx \ cx = 3, cy = 4, black = b \ \ cy \ cx = 3, cy = 4, black = b \"
"\ cx = 3, cy = 4, black = b \ \ cx := 5 \ = \ cx = 5, cy = 4, black = b \"
"\ cx = 3, cy = 4, black = b \ \ cy := 6 \ = \ cx = 3, cy = 6, black = b \"
"p = \ cx = 3, cy = 4, black = True \ \
p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> = p"
"p = \ cx = 3, cy = 4, black = True \ \
p \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> = p"
"p = \ cx = 3, cy = 4, black = True \ \
p \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
using point.simps bw_point.simps
by smt+
lemma
"\ cx = 3, cy = 4, black = b \ \ black := w \ = \ cx = 3, cy = 4, black = w \"
"\ cx = 3, cy = 4, black = True \ \ black := False \ =
\<lparr> cx = 3, cy = 4, black = False \<rparr>"
"p \ cx := 3 \ \ cy := 4 \ \ black := True \ =
p \<lparr> black := True \<rparr> \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr>"
apply (smt add_One add_inc bw_point.update_convs(1) default_unit_def inc.simps(2) one_plus_BitM
semiring_norm(6,26))
apply (smt bw_point.update_convs(1))
apply (smt bw_point.cases_scheme bw_point.update_convs(1) point.update_convs(1,2))
done
subsubsection \<open>Type definitions\<close>
typedef int' = "UNIV::int set" by (rule UNIV_witness)
definition n0 where "n0 = Abs_int' 0"
definition n1 where "n1 = Abs_int' 1"
definition n2 where "n2 = Abs_int' 2"
definition plus' where "plus' n m = Abs_int' (Rep_int' n + Rep_int' m)"
lemma
"n0 \ n1"
"plus' n1 n1 = n2"
"plus' n0 n2 = n2"
by (smt n0_def n1_def n2_def plus'_def Abs_int'_inverse Rep_int'_inverse UNIV_I)+
subsection \<open>With support by the SMT solver (but without proofs)\<close>
subsubsection \<open>Algebraic datatypes\<close>
lemma
"x = fst (x, y)"
"y = snd (x, y)"
"((x, y) = (y, x)) = (x = y)"
"((x, y) = (u, v)) = (x = u \ y = v)"
"(fst (x, y, z) = fst (u, v, w)) = (x = u)"
"(snd (x, y, z) = snd (u, v, w)) = (y = v \ z = w)"
"(fst (snd (x, y, z)) = fst (snd (u, v, w))) = (y = v)"
"(snd (snd (x, y, z)) = snd (snd (u, v, w))) = (z = w)"
"(fst (x, y) = snd (x, y)) = (x = y)"
"p1 = (x, y) \ p2 = (y, x) \ fst p1 = snd p2"
"(fst (x, y) = snd (x, y)) = (x = y)"
"(fst p = snd p) = (p = (snd p, fst p))"
using fst_conv snd_conv prod.collapse
by smt+
lemma
"x \ y \ [x] \ [y]"
"hd (x # xs) = x"
"tl (x # xs) = xs"
"hd [x, y, z] = x"
"tl [x, y, z] = [y, z]"
"hd (tl [x, y, z]) = y"
"tl (tl [x, y, z]) = [z]"
using list.sel(1,3)
by smt+
lemma
"fst (hd [(a, b)]) = a"
"snd (hd [(a, b)]) = b"
using fst_conv snd_conv prod.collapse list.sel(1,3)
by smt+
subsubsection \<open>Records\<close>
text \<open>The equivalent theory for Z3 contains more example, but unlike Z3, we are able
to reconstruct the proofs.\<close>
lemma
"cx \ cx = 3, cy = 4 \ = 3"
"cy \ cx = 3, cy = 4 \ = 4"
"cx \ cx = 3, cy = 4 \ \ cy \ cx = 3, cy = 4 \"
"\ cx = 3, cy = 4 \ \ cx := 5 \ = \ cx = 5, cy = 4 \"
"\ cx = 3, cy = 4 \ \ cy := 6 \ = \ cx = 3, cy = 6 \"
"p = \ cx = 3, cy = 4 \ \ p \ cx := 3 \ \ cy := 4 \ = p"
"p = \ cx = 3, cy = 4 \ \ p \ cy := 4 \ \ cx := 3 \ = p"
using point.simps
by smt+
lemma
"cx \ cx = 3, cy = 4, black = b \ = 3"
"cy \ cx = 3, cy = 4, black = b \ = 4"
"black \ cx = 3, cy = 4, black = b \ = b"
"cx \ cx = 3, cy = 4, black = b \ \ cy \ cx = 3, cy = 4, black = b \"
"\ cx = 3, cy = 4, black = b \ \ cx := 5 \ = \ cx = 5, cy = 4, black = b \"
"\ cx = 3, cy = 4, black = b \ \ cy := 6 \ = \ cx = 3, cy = 6, black = b \"
"p = \ cx = 3, cy = 4, black = True \ \
p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> = p"
"p = \ cx = 3, cy = 4, black = True \ \
p \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> = p"
"p = \ cx = 3, cy = 4, black = True \ \
p \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
using point.simps bw_point.simps
by smt+
section \<open>Functions\<close>
lemma "\f. map_option f (Some x) = Some (y + x)"
by (smt option.map(2))
lemma
"(f (i := v)) i = v"
"i1 \ i2 \ (f (i1 := v)) i2 = f i2"
"i1 \ i2 \ (f (i1 := v1, i2 := v2)) i1 = v1"
"i1 \ i2 \ (f (i1 := v1, i2 := v2)) i2 = v2"
"i1 = i2 \ (f (i1 := v1, i2 := v2)) i1 = v2"
"i1 = i2 \ (f (i1 := v1, i2 := v2)) i1 = v2"
"i1 \ i2 \i1 \ i3 \ i2 \ i3 \ (f (i1 := v1, i2 := v2)) i3 = f i3"
using fun_upd_same fun_upd_apply
by smt+
section \<open>Sets\<close>
lemma Empty: "x \ {}" by simp
lemmas smt_sets = Empty UNIV_I Un_iff Int_iff
lemma
"x \ {}"
"x \ UNIV"
"x \ A \ B \ x \ A \ x \ B"
"x \ P \ {} \ x \ P"
"x \ P \ UNIV"
"x \ P \ Q \ x \ Q \ P"
"x \ P \ P \ x \ P"
"x \ P \ (Q \ R) \ x \ (P \ Q) \ R"
"x \ A \ B \ x \ A \ x \ B"
"x \ P \ {}"
"x \ P \ UNIV \ x \ P"
"x \ P \ Q \ x \ Q \ P"
"x \ P \ P \ x \ P"
"x \ P \ (Q \ R) \ x \ (P \ Q) \ R"
"{x. x \ P} = {y. y \ P}"
by (smt smt_sets)+
end
[ zur Elbe Produktseite wechseln0.28Quellennavigators
Analyse erneut starten
]
|
|