src/HOL/SMT_Examples/SMT_Tests.thy
changeset 58061 3d060f43accb
parent 57994 68b283f9f826
child 58366 5cf7df52d71d
equal deleted inserted replaced
58060:835b5443b978 58061:3d060f43accb
     6 
     6 
     7 theory SMT_Tests
     7 theory SMT_Tests
     8 imports Complex_Main
     8 imports Complex_Main
     9 begin
     9 begin
    10 
    10 
    11 smt2_status
    11 smt_status
    12 
    12 
    13 text {* Most examples are taken from various Isabelle theories and from HOL4. *}
    13 text {* Most examples are taken from various Isabelle theories and from HOL4. *}
    14 
    14 
    15 
    15 
    16 section {* Propositional logic *}
    16 section {* Propositional logic *}
    21   "\<not> \<not> True"
    21   "\<not> \<not> True"
    22   "True \<and> True"
    22   "True \<and> True"
    23   "True \<or> False"
    23   "True \<or> False"
    24   "False \<longrightarrow> True"
    24   "False \<longrightarrow> True"
    25   "\<not> (False \<longleftrightarrow> True)"
    25   "\<not> (False \<longleftrightarrow> True)"
    26   by smt2+
    26   by smt+
    27 
    27 
    28 lemma
    28 lemma
    29   "P \<or> \<not> P"
    29   "P \<or> \<not> P"
    30   "\<not> (P \<and> \<not> P)"
    30   "\<not> (P \<and> \<not> P)"
    31   "(True \<and> P) \<or> \<not> P \<or> (False \<and> P) \<or> P"
    31   "(True \<and> P) \<or> \<not> P \<or> (False \<and> P) \<or> P"
    60   "(P \<longrightarrow> Q) \<and> (Q  \<longrightarrow> P) \<longrightarrow> (P \<longleftrightarrow> Q)"
    60   "(P \<longrightarrow> Q) \<and> (Q  \<longrightarrow> P) \<longrightarrow> (P \<longleftrightarrow> Q)"
    61   "(P \<longleftrightarrow> Q) \<longleftrightarrow> (Q \<longleftrightarrow> P)"
    61   "(P \<longleftrightarrow> Q) \<longleftrightarrow> (Q \<longleftrightarrow> P)"
    62   "\<not> (P \<longleftrightarrow> \<not> P)"
    62   "\<not> (P \<longleftrightarrow> \<not> P)"
    63   "(P \<longrightarrow> Q) \<longleftrightarrow> (\<not> Q \<longrightarrow> \<not> P)"
    63   "(P \<longrightarrow> Q) \<longleftrightarrow> (\<not> Q \<longrightarrow> \<not> P)"
    64   "P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P"
    64   "P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P"
    65   by smt2+
    65   by smt+
    66 
    66 
    67 lemma
    67 lemma
    68   "(if P then Q1 else Q2) \<longleftrightarrow> ((P \<longrightarrow> Q1) \<and> (\<not> P \<longrightarrow> Q2))"
    68   "(if P then Q1 else Q2) \<longleftrightarrow> ((P \<longrightarrow> Q1) \<and> (\<not> P \<longrightarrow> Q2))"
    69   "if P then (Q \<longrightarrow> P) else (P \<longrightarrow> Q)"
    69   "if P then (Q \<longrightarrow> P) else (P \<longrightarrow> Q)"
    70   "(if P1 \<or> P2 then Q1 else Q2) \<longleftrightarrow> (if P1 then Q1 else if P2 then Q1 else Q2)"
    70   "(if P1 \<or> P2 then Q1 else Q2) \<longleftrightarrow> (if P1 then Q1 else if P2 then Q1 else Q2)"
    71   "(if P1 \<and> P2 then Q1 else Q2) \<longleftrightarrow> (if P1 then if P2 then Q1 else Q2 else Q2)"
    71   "(if P1 \<and> P2 then Q1 else Q2) \<longleftrightarrow> (if P1 then if P2 then Q1 else Q2 else Q2)"
    72   "(P1 \<longrightarrow> (if P2 then Q1 else Q2)) \<longleftrightarrow>
    72   "(P1 \<longrightarrow> (if P2 then Q1 else Q2)) \<longleftrightarrow>
    73    (if P1 \<longrightarrow> P2 then P1 \<longrightarrow> Q1 else P1 \<longrightarrow> Q2)"
    73    (if P1 \<longrightarrow> P2 then P1 \<longrightarrow> Q1 else P1 \<longrightarrow> Q2)"
    74   by smt2+
    74   by smt+
    75 
    75 
    76 lemma
    76 lemma
    77   "case P of True \<Rightarrow> P | False \<Rightarrow> \<not> P"
    77   "case P of True \<Rightarrow> P | False \<Rightarrow> \<not> P"
    78   "case P of False \<Rightarrow> \<not> P | True \<Rightarrow> P"
    78   "case P of False \<Rightarrow> \<not> P | True \<Rightarrow> P"
    79   "case \<not> P of True \<Rightarrow> \<not> P | False \<Rightarrow> P"
    79   "case \<not> P of True \<Rightarrow> \<not> P | False \<Rightarrow> P"
    80   "case P of True \<Rightarrow> (Q \<longrightarrow> P) | False \<Rightarrow> (P \<longrightarrow> Q)"
    80   "case P of True \<Rightarrow> (Q \<longrightarrow> P) | False \<Rightarrow> (P \<longrightarrow> Q)"
    81   by smt2+
    81   by smt+
    82 
    82 
    83 
    83 
    84 section {* First-order logic with equality *}
    84 section {* First-order logic with equality *}
    85 
    85 
    86 lemma
    86 lemma
    89   "x = y \<and> y = z \<longrightarrow> x = z"
    89   "x = y \<and> y = z \<longrightarrow> x = z"
    90   "x = y \<longrightarrow> f x = f y"
    90   "x = y \<longrightarrow> f x = f y"
    91   "x = y \<longrightarrow> g x y = g y x"
    91   "x = y \<longrightarrow> g x y = g y x"
    92   "f (f x) = x \<and> f (f (f (f (f x)))) = x \<longrightarrow> f x = x"
    92   "f (f x) = x \<and> f (f (f (f (f x)))) = x \<longrightarrow> f x = x"
    93   "((if a then b else c) = d) = ((a \<longrightarrow> (b = d)) \<and> (\<not> a \<longrightarrow> (c = d)))"
    93   "((if a then b else c) = d) = ((a \<longrightarrow> (b = d)) \<and> (\<not> a \<longrightarrow> (c = d)))"
    94   by smt2+
    94   by smt+
    95 
    95 
    96 lemma
    96 lemma
    97   "\<forall>x. x = x"
    97   "\<forall>x. x = x"
    98   "(\<forall>x. P x) \<longleftrightarrow> (\<forall>y. P y)"
    98   "(\<forall>x. P x) \<longleftrightarrow> (\<forall>y. P y)"
    99   "\<forall>x. P x \<longrightarrow> (\<forall>y. P x \<or> P y)"
    99   "\<forall>x. P x \<longrightarrow> (\<forall>y. P x \<or> P y)"
   102   "(\<forall>x y z. S x z) \<longleftrightarrow> (\<forall>x z. S x z)"
   102   "(\<forall>x y z. S x z) \<longleftrightarrow> (\<forall>x z. S x z)"
   103   "(\<forall>x y. S x y \<longrightarrow> S y x) \<longrightarrow> (\<forall>x. S x y) \<longrightarrow> S y x"
   103   "(\<forall>x y. S x y \<longrightarrow> S y x) \<longrightarrow> (\<forall>x. S x y) \<longrightarrow> S y x"
   104   "(\<forall>x. P x \<longrightarrow> P (f x)) \<and> P d \<longrightarrow> P (f(f(f(d))))"
   104   "(\<forall>x. P x \<longrightarrow> P (f x)) \<and> P d \<longrightarrow> P (f(f(f(d))))"
   105   "(\<forall>x y. s x y = s y x) \<longrightarrow> a = a \<and> s a b = s b a"
   105   "(\<forall>x y. s x y = s y x) \<longrightarrow> a = a \<and> s a b = s b a"
   106   "(\<forall>s. q s \<longrightarrow> r s) \<and> \<not> r s \<and> (\<forall>s. \<not> r s \<and> \<not> q s \<longrightarrow> p t \<or> q t) \<longrightarrow> p t \<or> r t"
   106   "(\<forall>s. q s \<longrightarrow> r s) \<and> \<not> r s \<and> (\<forall>s. \<not> r s \<and> \<not> q s \<longrightarrow> p t \<or> q t) \<longrightarrow> p t \<or> r t"
   107   by smt2+
   107   by smt+
   108 
   108 
   109 lemma
   109 lemma
   110   "(\<forall>x. P x) \<and> R \<longleftrightarrow> (\<forall>x. P x \<and> R)"
   110   "(\<forall>x. P x) \<and> R \<longleftrightarrow> (\<forall>x. P x \<and> R)"
   111   by smt2
   111   by smt
   112 
   112 
   113 lemma
   113 lemma
   114   "\<exists>x. x = x"
   114   "\<exists>x. x = x"
   115   "(\<exists>x. P x) \<longleftrightarrow> (\<exists>y. P y)"
   115   "(\<exists>x. P x) \<longleftrightarrow> (\<exists>y. P y)"
   116   "(\<exists>x. P x \<or> Q x) \<longleftrightarrow> (\<exists>x. P x) \<or> (\<exists>x. Q x)"
   116   "(\<exists>x. P x \<or> Q x) \<longleftrightarrow> (\<exists>x. P x) \<or> (\<exists>x. Q x)"
   117   "(\<exists>x. P x) \<and> R \<longleftrightarrow> (\<exists>x. P x \<and> R)"
   117   "(\<exists>x. P x) \<and> R \<longleftrightarrow> (\<exists>x. P x \<and> R)"
   118   "(\<exists>x y z. S x z) \<longleftrightarrow> (\<exists>x z. S x z)"
   118   "(\<exists>x y z. S x z) \<longleftrightarrow> (\<exists>x z. S x z)"
   119   "\<not> ((\<exists>x. \<not> P x) \<and> ((\<exists>x. P x) \<or> (\<exists>x. P x \<and> Q x)) \<and> \<not> (\<exists>x. P x))"
   119   "\<not> ((\<exists>x. \<not> P x) \<and> ((\<exists>x. P x) \<or> (\<exists>x. P x \<and> Q x)) \<and> \<not> (\<exists>x. P x))"
   120   by smt2+
   120   by smt+
   121 
   121 
   122 lemma
   122 lemma
   123   "\<exists>x y. x = y"
   123   "\<exists>x y. x = y"
   124   "\<exists>x. P x \<longrightarrow> (\<exists>y. P x \<and> P y)"
   124   "\<exists>x. P x \<longrightarrow> (\<exists>y. P x \<and> P y)"
   125   "(\<exists>x. P x) \<or> R \<longleftrightarrow> (\<exists>x. P x \<or> R)"
   125   "(\<exists>x. P x) \<or> R \<longleftrightarrow> (\<exists>x. P x \<or> R)"
   126   "\<exists>x. P x \<longrightarrow> P a \<and> P b"
   126   "\<exists>x. P x \<longrightarrow> P a \<and> P b"
   127   "\<exists>x. (\<exists>y. P y) \<longrightarrow> P x"
   127   "\<exists>x. (\<exists>y. P y) \<longrightarrow> P x"
   128   "(\<exists>x. Q \<longrightarrow> P x) \<longleftrightarrow> (Q \<longrightarrow> (\<exists>x. P x))"
   128   "(\<exists>x. Q \<longrightarrow> P x) \<longleftrightarrow> (Q \<longrightarrow> (\<exists>x. P x))"
   129   by smt2+
   129   by smt+
   130 
   130 
   131 lemma
   131 lemma
   132   "(\<not> (\<exists>x. P x)) \<longleftrightarrow> (\<forall>x. \<not> P x)"
   132   "(\<not> (\<exists>x. P x)) \<longleftrightarrow> (\<forall>x. \<not> P x)"
   133   "(\<exists>x. P x \<longrightarrow> Q) \<longleftrightarrow> (\<forall>x. P x) \<longrightarrow> Q"
   133   "(\<exists>x. P x \<longrightarrow> Q) \<longleftrightarrow> (\<forall>x. P x) \<longrightarrow> Q"
   134   "(\<forall>x y. R x y = x) \<longrightarrow> (\<exists>y. R x y) = R x c"
   134   "(\<forall>x y. R x y = x) \<longrightarrow> (\<exists>y. R x y) = R x c"
   135   "(if P x then \<not> (\<exists>y. P y) else (\<forall>y. \<not> P y)) \<longrightarrow> P x \<longrightarrow> P y"
   135   "(if P x then \<not> (\<exists>y. P y) else (\<forall>y. \<not> P y)) \<longrightarrow> P x \<longrightarrow> P y"
   136   "(\<forall>x y. R x y = x) \<and> (\<forall>x. \<exists>y. R x y) = (\<forall>x. R x c) \<longrightarrow> (\<exists>y. R x y) = R x c"
   136   "(\<forall>x y. R x y = x) \<and> (\<forall>x. \<exists>y. R x y) = (\<forall>x. R x c) \<longrightarrow> (\<exists>y. R x y) = R x c"
   137   by smt2+
   137   by smt+
   138 
   138 
   139 lemma
   139 lemma
   140   "\<forall>x. \<exists>y. f x y = f x (g x)"
   140   "\<forall>x. \<exists>y. f x y = f x (g x)"
   141   "(\<not> \<not> (\<exists>x. P x)) \<longleftrightarrow> (\<not> (\<forall>x. \<not> P x))"
   141   "(\<not> \<not> (\<exists>x. P x)) \<longleftrightarrow> (\<not> (\<forall>x. \<not> P x))"
   142   "\<forall>u. \<exists>v. \<forall>w. \<exists>x. f u v w x = f u (g u) w (h u w)"
   142   "\<forall>u. \<exists>v. \<forall>w. \<exists>x. f u v w x = f u (g u) w (h u w)"
   143   "\<exists>x. if x = y then (\<forall>y. y = x \<or> y \<noteq> x) else (\<forall>y. y = (x, x) \<or> y \<noteq> (x, x))"
   143   "\<exists>x. if x = y then (\<forall>y. y = x \<or> y \<noteq> x) else (\<forall>y. y = (x, x) \<or> y \<noteq> (x, x))"
   144   "\<exists>x. if x = y then (\<exists>y. y = x \<or> y \<noteq> x) else (\<exists>y. y = (x, x) \<or> y \<noteq> (x, x))"
   144   "\<exists>x. if x = y then (\<exists>y. y = x \<or> y \<noteq> x) else (\<exists>y. y = (x, x) \<or> y \<noteq> (x, x))"
   145   "(\<exists>x. \<forall>y. P x \<longleftrightarrow> P y) \<longrightarrow> ((\<exists>x. P x) \<longleftrightarrow> (\<forall>y. P y))"
   145   "(\<exists>x. \<forall>y. P x \<longleftrightarrow> P y) \<longrightarrow> ((\<exists>x. P x) \<longleftrightarrow> (\<forall>y. P y))"
   146   "\<exists>z. P z \<longrightarrow> (\<forall>x. P x)"
   146   "\<exists>z. P z \<longrightarrow> (\<forall>x. P x)"
   147   "(\<exists>y. \<forall>x. R x y) \<longrightarrow> (\<forall>x. \<exists>y. R x y)"
   147   "(\<exists>y. \<forall>x. R x y) \<longrightarrow> (\<forall>x. \<exists>y. R x y)"
   148   by smt2+
   148   by smt+
   149 
   149 
   150 lemma
   150 lemma
   151   "(\<exists>!x. P x) \<longrightarrow> (\<exists>x. P x)"
   151   "(\<exists>!x. P x) \<longrightarrow> (\<exists>x. P x)"
   152   "(\<exists>!x. P x) \<longleftrightarrow> (\<exists>x. P x \<and> (\<forall>y. y \<noteq> x \<longrightarrow> \<not> P y))"
   152   "(\<exists>!x. P x) \<longleftrightarrow> (\<exists>x. P x \<and> (\<forall>y. y \<noteq> x \<longrightarrow> \<not> P y))"
   153   "P a \<longrightarrow> (\<forall>x. P x \<longrightarrow> x = a) \<longrightarrow> (\<exists>!x. P x)"
   153   "P a \<longrightarrow> (\<forall>x. P x \<longrightarrow> x = a) \<longrightarrow> (\<exists>!x. P x)"
   154   "(\<exists>x. P x) \<and> (\<forall>x y. P x \<and> P y \<longrightarrow> x = y) \<longrightarrow> (\<exists>!x. P x)"
   154   "(\<exists>x. P x) \<and> (\<forall>x y. P x \<and> P y \<longrightarrow> x = y) \<longrightarrow> (\<exists>!x. P x)"
   155   "(\<exists>!x. P x) \<and> (\<forall>x. P x \<and> (\<forall>y. P y \<longrightarrow> y = x) \<longrightarrow> R) \<longrightarrow> R"
   155   "(\<exists>!x. P x) \<and> (\<forall>x. P x \<and> (\<forall>y. P y \<longrightarrow> y = x) \<longrightarrow> R) \<longrightarrow> R"
   156   by smt2+
   156   by smt+
   157 
   157 
   158 lemma
   158 lemma
   159   "(\<forall>x\<in>M. P x) \<and> c \<in> M \<longrightarrow> P c"
   159   "(\<forall>x\<in>M. P x) \<and> c \<in> M \<longrightarrow> P c"
   160   "(\<exists>x\<in>M. P x) \<or> \<not> (P c \<and> c \<in> M)"
   160   "(\<exists>x\<in>M. P x) \<or> \<not> (P c \<and> c \<in> M)"
   161   by smt2+
   161   by smt+
   162 
   162 
   163 lemma
   163 lemma
   164   "let P = True in P"
   164   "let P = True in P"
   165   "let P = P1 \<or> P2 in P \<or> \<not> P"
   165   "let P = P1 \<or> P2 in P \<or> \<not> P"
   166   "let P1 = True; P2 = False in P1 \<and> P2 \<longrightarrow> P2 \<or> P1"
   166   "let P1 = True; P2 = False in P1 \<and> P2 \<longrightarrow> P2 \<or> P1"
   167   "(let x = y in x) = y"
   167   "(let x = y in x) = y"
   168   "(let x = y in Q x) \<longleftrightarrow> (let z = y in Q z)"
   168   "(let x = y in Q x) \<longleftrightarrow> (let z = y in Q z)"
   169   "(let x = y1; z = y2 in R x z) \<longleftrightarrow> (let z = y2; x = y1 in R x z)"
   169   "(let x = y1; z = y2 in R x z) \<longleftrightarrow> (let z = y2; x = y1 in R x z)"
   170   "(let x = y1; z = y2 in R x z) \<longleftrightarrow> (let z = y1; x = y2 in R z x)"
   170   "(let x = y1; z = y2 in R x z) \<longleftrightarrow> (let z = y1; x = y2 in R z x)"
   171   "let P = (\<forall>x. Q x) in if P then P else \<not> P"
   171   "let P = (\<forall>x. Q x) in if P then P else \<not> P"
   172   by smt2+
   172   by smt+
   173 
   173 
   174 lemma
   174 lemma
   175   "a \<noteq> b \<and> a \<noteq> c \<and> b \<noteq> c \<and> (\<forall>x y. f x = f y \<longrightarrow> y = x) \<longrightarrow> f a \<noteq> f b"
   175   "a \<noteq> b \<and> a \<noteq> c \<and> b \<noteq> c \<and> (\<forall>x y. f x = f y \<longrightarrow> y = x) \<longrightarrow> f a \<noteq> f b"
   176   by smt2
   176   by smt
   177 
   177 
   178 lemma
   178 lemma
   179   "(\<forall>x y z. f x y = f x z \<longrightarrow> y = z) \<and> b \<noteq> c \<longrightarrow> f a b \<noteq> f a c"
   179   "(\<forall>x y z. f x y = f x z \<longrightarrow> y = z) \<and> b \<noteq> c \<longrightarrow> f a b \<noteq> f a c"
   180   "(\<forall>x y z. f x y = f z y \<longrightarrow> x = z) \<and> a \<noteq> d \<longrightarrow> f a b \<noteq> f d b"
   180   "(\<forall>x y z. f x y = f z y \<longrightarrow> x = z) \<and> a \<noteq> d \<longrightarrow> f a b \<noteq> f d b"
   181   by smt2+
   181   by smt+
   182 
   182 
   183 
   183 
   184 section {* Guidance for quantifier heuristics: patterns *}
   184 section {* Guidance for quantifier heuristics: patterns *}
   185 
   185 
   186 lemma
   186 lemma
   187   assumes "\<forall>x.
   187   assumes "\<forall>x.
   188     SMT2.trigger (SMT2.Symb_Cons (SMT2.Symb_Cons (SMT2.pat (f x)) SMT2.Symb_Nil) SMT2.Symb_Nil)
   188     SMT.trigger (SMT.Symb_Cons (SMT.Symb_Cons (SMT.pat (f x)) SMT.Symb_Nil) SMT.Symb_Nil)
   189     (f x = x)"
   189     (f x = x)"
   190   shows "f 1 = 1"
   190   shows "f 1 = 1"
   191   using assms using [[smt2_trace]] by smt2
   191   using assms using [[smt_trace]] by smt
   192 
   192 
   193 lemma
   193 lemma
   194   assumes "\<forall>x y.
   194   assumes "\<forall>x y.
   195     SMT2.trigger (SMT2.Symb_Cons (SMT2.Symb_Cons (SMT2.pat (f x))
   195     SMT.trigger (SMT.Symb_Cons (SMT.Symb_Cons (SMT.pat (f x))
   196       (SMT2.Symb_Cons (SMT2.pat (g y)) SMT2.Symb_Nil)) SMT2.Symb_Nil) (f x = g y)"
   196       (SMT.Symb_Cons (SMT.pat (g y)) SMT.Symb_Nil)) SMT.Symb_Nil) (f x = g y)"
   197   shows "f a = g b"
   197   shows "f a = g b"
   198   using assms by smt2
   198   using assms by smt
   199 
   199 
   200 
   200 
   201 section {* Meta-logical connectives *}
   201 section {* Meta-logical connectives *}
   202 
   202 
   203 lemma
   203 lemma
   217   "x \<equiv> y \<Longrightarrow> (f x :: 'b::type) \<equiv> f y"
   217   "x \<equiv> y \<Longrightarrow> (f x :: 'b::type) \<equiv> f y"
   218   "(\<And>x. g x) \<Longrightarrow> g a \<or> a"
   218   "(\<And>x. g x) \<Longrightarrow> g a \<or> a"
   219   "(\<And>x y. h x y \<and> h y x) \<Longrightarrow> \<forall>x. h x x"
   219   "(\<And>x y. h x y \<and> h y x) \<Longrightarrow> \<forall>x. h x x"
   220   "(p \<or> q) \<and> \<not> p \<Longrightarrow> q"
   220   "(p \<or> q) \<and> \<not> p \<Longrightarrow> q"
   221   "(a \<and> b) \<or> (c \<and> d) \<Longrightarrow> (a \<and> b) \<or> (c \<and> d)"
   221   "(a \<and> b) \<or> (c \<and> d) \<Longrightarrow> (a \<and> b) \<or> (c \<and> d)"
   222   by smt2+
   222   by smt+
   223 
   223 
   224 
   224 
   225 section {* Integers *}
   225 section {* Integers *}
   226 
   226 
   227 lemma
   227 lemma
   232   "(0::int) < 1"
   232   "(0::int) < 1"
   233   "(0::int) \<le> 1"
   233   "(0::int) \<le> 1"
   234   "-123 + 345 < (567::int)"
   234   "-123 + 345 < (567::int)"
   235   "(123456789::int) < 2345678901"
   235   "(123456789::int) < 2345678901"
   236   "(-123456789::int) < 2345678901"
   236   "(-123456789::int) < 2345678901"
   237   by smt2+
   237   by smt+
   238 
   238 
   239 lemma
   239 lemma
   240   "(x::int) + 0 = x"
   240   "(x::int) + 0 = x"
   241   "0 + x = x"
   241   "0 + x = x"
   242   "x + y = y + x"
   242   "x + y = y + x"
   243   "x + (y + z) = (x + y) + z"
   243   "x + (y + z) = (x + y) + z"
   244   "(x + y = 0) = (x = -y)"
   244   "(x + y = 0) = (x = -y)"
   245   by smt2+
   245   by smt+
   246 
   246 
   247 lemma
   247 lemma
   248   "(-1::int) = - 1"
   248   "(-1::int) = - 1"
   249   "(-3::int) = - 3"
   249   "(-3::int) = - 3"
   250   "-(x::int) < 0 \<longleftrightarrow> x > 0"
   250   "-(x::int) < 0 \<longleftrightarrow> x > 0"
   251   "x > 0 \<longrightarrow> -x < 0"
   251   "x > 0 \<longrightarrow> -x < 0"
   252   "x < 0 \<longrightarrow> -x > 0"
   252   "x < 0 \<longrightarrow> -x > 0"
   253   by smt2+
   253   by smt+
   254 
   254 
   255 lemma
   255 lemma
   256   "(x::int) - 0 = x"
   256   "(x::int) - 0 = x"
   257   "0 - x = -x"
   257   "0 - x = -x"
   258   "x < y \<longrightarrow> x - y < 0"
   258   "x < y \<longrightarrow> x - y < 0"
   259   "x - y = -(y - x)"
   259   "x - y = -(y - x)"
   260   "x - y = -y + x"
   260   "x - y = -y + x"
   261   "x - y - z = x - (y + z)"
   261   "x - y - z = x - (y + z)"
   262   by smt2+
   262   by smt+
   263 
   263 
   264 lemma
   264 lemma
   265   "(x::int) * 0 = 0"
   265   "(x::int) * 0 = 0"
   266   "0 * x = 0"
   266   "0 * x = 0"
   267   "x * 1 = x"
   267   "x * 1 = x"
   268   "1 * x = x"
   268   "1 * x = x"
   269   "x * -1 = -x"
   269   "x * -1 = -x"
   270   "-1 * x = -x"
   270   "-1 * x = -x"
   271   "3 * x = x * 3"
   271   "3 * x = x * 3"
   272   by smt2+
   272   by smt+
   273 
   273 
   274 lemma
   274 lemma
   275   "(0::int) div 0 = 0"
   275   "(0::int) div 0 = 0"
   276   "(x::int) div 0 = 0"
   276   "(x::int) div 0 = 0"
   277   "(0::int) div 1 = 0"
   277   "(0::int) div 1 = 0"
   294   "(-3::int) div 3 = -1"
   294   "(-3::int) div 3 = -1"
   295   "(-5::int) div 3 = -2"
   295   "(-5::int) div 3 = -2"
   296   "(-1::int) div -3 = 0"
   296   "(-1::int) div -3 = 0"
   297   "(-3::int) div -3 = 1"
   297   "(-3::int) div -3 = 1"
   298   "(-5::int) div -3 = 1"
   298   "(-5::int) div -3 = 1"
   299   using [[z3_new_extensions]]
   299   using [[z3_extensions]]
   300   by smt2+
   300   by smt+
   301 
   301 
   302 lemma
   302 lemma
   303   "(0::int) mod 0 = 0"
   303   "(0::int) mod 0 = 0"
   304   "(x::int) mod 0 = x"
   304   "(x::int) mod 0 = x"
   305   "(0::int) mod 1 = 0"
   305   "(0::int) mod 1 = 0"
   324   "(-1::int) mod -3 = -1"
   324   "(-1::int) mod -3 = -1"
   325   "(-3::int) mod -3 = 0"
   325   "(-3::int) mod -3 = 0"
   326   "(-5::int) mod -3 = -2"
   326   "(-5::int) mod -3 = -2"
   327   "x mod 3 < 3"
   327   "x mod 3 < 3"
   328   "(x mod 3 = x) \<longrightarrow> (x < 3)"
   328   "(x mod 3 = x) \<longrightarrow> (x < 3)"
   329   using [[z3_new_extensions]]
   329   using [[z3_extensions]]
   330   by smt2+
   330   by smt+
   331 
   331 
   332 lemma
   332 lemma
   333   "(x::int) = x div 1 * 1 + x mod 1"
   333   "(x::int) = x div 1 * 1 + x mod 1"
   334   "x = x div 3 * 3 + x mod 3"
   334   "x = x div 3 * 3 + x mod 3"
   335   using [[z3_new_extensions]]
   335   using [[z3_extensions]]
   336   by smt2+
   336   by smt+
   337 
   337 
   338 lemma
   338 lemma
   339   "abs (x::int) \<ge> 0"
   339   "abs (x::int) \<ge> 0"
   340   "(abs x = 0) = (x = 0)"
   340   "(abs x = 0) = (x = 0)"
   341   "(x \<ge> 0) = (abs x = x)"
   341   "(x \<ge> 0) = (abs x = x)"
   342   "(x \<le> 0) = (abs x = -x)"
   342   "(x \<le> 0) = (abs x = -x)"
   343   "abs (abs x) = abs x"
   343   "abs (abs x) = abs x"
   344   by smt2+
   344   by smt+
   345 
   345 
   346 lemma
   346 lemma
   347   "min (x::int) y \<le> x"
   347   "min (x::int) y \<le> x"
   348   "min x y \<le> y"
   348   "min x y \<le> y"
   349   "z < x \<and> z < y \<longrightarrow> z < min x y"
   349   "z < x \<and> z < y \<longrightarrow> z < min x y"
   350   "min x y = min y x"
   350   "min x y = min y x"
   351   "x \<ge> 0 \<longrightarrow> min x 0 = 0"
   351   "x \<ge> 0 \<longrightarrow> min x 0 = 0"
   352   "min x y \<le> abs (x + y)"
   352   "min x y \<le> abs (x + y)"
   353   by smt2+
   353   by smt+
   354 
   354 
   355 lemma
   355 lemma
   356   "max (x::int) y \<ge> x"
   356   "max (x::int) y \<ge> x"
   357   "max x y \<ge> y"
   357   "max x y \<ge> y"
   358   "z > x \<and> z > y \<longrightarrow> z > max x y"
   358   "z > x \<and> z > y \<longrightarrow> z > max x y"
   359   "max x y = max y x"
   359   "max x y = max y x"
   360   "x \<ge> 0 \<longrightarrow> max x 0 = x"
   360   "x \<ge> 0 \<longrightarrow> max x 0 = x"
   361   "max x y \<ge> - abs x - abs y"
   361   "max x y \<ge> - abs x - abs y"
   362   by smt2+
   362   by smt+
   363 
   363 
   364 lemma
   364 lemma
   365   "0 < (x::int) \<and> x \<le> 1 \<longrightarrow> x = 1"
   365   "0 < (x::int) \<and> x \<le> 1 \<longrightarrow> x = 1"
   366   "x \<le> x"
   366   "x \<le> x"
   367   "x \<le> y \<longrightarrow> 3 * x \<le> 3 * y"
   367   "x \<le> y \<longrightarrow> 3 * x \<le> 3 * y"
   372   "x \<le> y \<longrightarrow> y \<le> z \<longrightarrow> x \<le> z"
   372   "x \<le> y \<longrightarrow> y \<le> z \<longrightarrow> x \<le> z"
   373   "x < y \<longrightarrow> y \<le> z \<longrightarrow> x \<le> z"
   373   "x < y \<longrightarrow> y \<le> z \<longrightarrow> x \<le> z"
   374   "x \<le> y \<longrightarrow> y < z \<longrightarrow> x \<le> z"
   374   "x \<le> y \<longrightarrow> y < z \<longrightarrow> x \<le> z"
   375   "x < y \<longrightarrow> y < z \<longrightarrow> x < z"
   375   "x < y \<longrightarrow> y < z \<longrightarrow> x < z"
   376   "x < y \<and> y < z \<longrightarrow> \<not> (z < x)"
   376   "x < y \<and> y < z \<longrightarrow> \<not> (z < x)"
   377   by smt2+
   377   by smt+
   378 
   378 
   379 
   379 
   380 section {* Reals *}
   380 section {* Reals *}
   381 
   381 
   382 lemma
   382 lemma
   388   "(0::real) < 1"
   388   "(0::real) < 1"
   389   "(0::real) \<le> 1"
   389   "(0::real) \<le> 1"
   390   "-123 + 345 < (567::real)"
   390   "-123 + 345 < (567::real)"
   391   "(123456789::real) < 2345678901"
   391   "(123456789::real) < 2345678901"
   392   "(-123456789::real) < 2345678901"
   392   "(-123456789::real) < 2345678901"
   393   by smt2+
   393   by smt+
   394 
   394 
   395 lemma
   395 lemma
   396   "(x::real) + 0 = x"
   396   "(x::real) + 0 = x"
   397   "0 + x = x"
   397   "0 + x = x"
   398   "x + y = y + x"
   398   "x + y = y + x"
   399   "x + (y + z) = (x + y) + z"
   399   "x + (y + z) = (x + y) + z"
   400   "(x + y = 0) = (x = -y)"
   400   "(x + y = 0) = (x = -y)"
   401   by smt2+
   401   by smt+
   402 
   402 
   403 lemma
   403 lemma
   404   "(-1::real) = - 1"
   404   "(-1::real) = - 1"
   405   "(-3::real) = - 3"
   405   "(-3::real) = - 3"
   406   "-(x::real) < 0 \<longleftrightarrow> x > 0"
   406   "-(x::real) < 0 \<longleftrightarrow> x > 0"
   407   "x > 0 \<longrightarrow> -x < 0"
   407   "x > 0 \<longrightarrow> -x < 0"
   408   "x < 0 \<longrightarrow> -x > 0"
   408   "x < 0 \<longrightarrow> -x > 0"
   409   by smt2+
   409   by smt+
   410 
   410 
   411 lemma
   411 lemma
   412   "(x::real) - 0 = x"
   412   "(x::real) - 0 = x"
   413   "0 - x = -x"
   413   "0 - x = -x"
   414   "x < y \<longrightarrow> x - y < 0"
   414   "x < y \<longrightarrow> x - y < 0"
   415   "x - y = -(y - x)"
   415   "x - y = -(y - x)"
   416   "x - y = -y + x"
   416   "x - y = -y + x"
   417   "x - y - z = x - (y + z)"
   417   "x - y - z = x - (y + z)"
   418   by smt2+
   418   by smt+
   419 
   419 
   420 lemma
   420 lemma
   421   "(x::real) * 0 = 0"
   421   "(x::real) * 0 = 0"
   422   "0 * x = 0"
   422   "0 * x = 0"
   423   "x * 1 = x"
   423   "x * 1 = x"
   424   "1 * x = x"
   424   "1 * x = x"
   425   "x * -1 = -x"
   425   "x * -1 = -x"
   426   "-1 * x = -x"
   426   "-1 * x = -x"
   427   "3 * x = x * 3"
   427   "3 * x = x * 3"
   428   by smt2+
   428   by smt+
   429 
   429 
   430 lemma
   430 lemma
   431   "(1/2 :: real) < 1"
   431   "(1/2 :: real) < 1"
   432   "(1::real) / 3 = 1 / 3"
   432   "(1::real) / 3 = 1 / 3"
   433   "(1::real) / -3 = - 1 / 3"
   433   "(1::real) / -3 = - 1 / 3"
   434   "(-1::real) / 3 = - 1 / 3"
   434   "(-1::real) / 3 = - 1 / 3"
   435   "(-1::real) / -3 = 1 / 3"
   435   "(-1::real) / -3 = 1 / 3"
   436   "(x::real) / 1 = x"
   436   "(x::real) / 1 = x"
   437   "x > 0 \<longrightarrow> x / 3 < x"
   437   "x > 0 \<longrightarrow> x / 3 < x"
   438   "x < 0 \<longrightarrow> x / 3 > x"
   438   "x < 0 \<longrightarrow> x / 3 > x"
   439   using [[z3_new_extensions]]
   439   using [[z3_extensions]]
   440   by smt2+
   440   by smt+
   441 
   441 
   442 lemma
   442 lemma
   443   "(3::real) * (x / 3) = x"
   443   "(3::real) * (x / 3) = x"
   444   "(x * 3) / 3 = x"
   444   "(x * 3) / 3 = x"
   445   "x > 0 \<longrightarrow> 2 * x / 3 < x"
   445   "x > 0 \<longrightarrow> 2 * x / 3 < x"
   446   "x < 0 \<longrightarrow> 2 * x / 3 > x"
   446   "x < 0 \<longrightarrow> 2 * x / 3 > x"
   447   using [[z3_new_extensions]]
   447   using [[z3_extensions]]
   448   by smt2+
   448   by smt+
   449 
   449 
   450 lemma
   450 lemma
   451   "abs (x::real) \<ge> 0"
   451   "abs (x::real) \<ge> 0"
   452   "(abs x = 0) = (x = 0)"
   452   "(abs x = 0) = (x = 0)"
   453   "(x \<ge> 0) = (abs x = x)"
   453   "(x \<ge> 0) = (abs x = x)"
   454   "(x \<le> 0) = (abs x = -x)"
   454   "(x \<le> 0) = (abs x = -x)"
   455   "abs (abs x) = abs x"
   455   "abs (abs x) = abs x"
   456   by smt2+
   456   by smt+
   457 
   457 
   458 lemma
   458 lemma
   459   "min (x::real) y \<le> x"
   459   "min (x::real) y \<le> x"
   460   "min x y \<le> y"
   460   "min x y \<le> y"
   461   "z < x \<and> z < y \<longrightarrow> z < min x y"
   461   "z < x \<and> z < y \<longrightarrow> z < min x y"
   462   "min x y = min y x"
   462   "min x y = min y x"
   463   "x \<ge> 0 \<longrightarrow> min x 0 = 0"
   463   "x \<ge> 0 \<longrightarrow> min x 0 = 0"
   464   "min x y \<le> abs (x + y)"
   464   "min x y \<le> abs (x + y)"
   465   by smt2+
   465   by smt+
   466 
   466 
   467 lemma
   467 lemma
   468   "max (x::real) y \<ge> x"
   468   "max (x::real) y \<ge> x"
   469   "max x y \<ge> y"
   469   "max x y \<ge> y"
   470   "z > x \<and> z > y \<longrightarrow> z > max x y"
   470   "z > x \<and> z > y \<longrightarrow> z > max x y"
   471   "max x y = max y x"
   471   "max x y = max y x"
   472   "x \<ge> 0 \<longrightarrow> max x 0 = x"
   472   "x \<ge> 0 \<longrightarrow> max x 0 = x"
   473   "max x y \<ge> - abs x - abs y"
   473   "max x y \<ge> - abs x - abs y"
   474   by smt2+
   474   by smt+
   475 
   475 
   476 lemma
   476 lemma
   477   "x \<le> (x::real)"
   477   "x \<le> (x::real)"
   478   "x \<le> y \<longrightarrow> 3 * x \<le> 3 * y"
   478   "x \<le> y \<longrightarrow> 3 * x \<le> 3 * y"
   479   "x < y \<longrightarrow> 3 * x < 3 * y"
   479   "x < y \<longrightarrow> 3 * x < 3 * y"
   482   "x \<le> y \<longrightarrow> y \<le> z \<longrightarrow> x \<le> z"
   482   "x \<le> y \<longrightarrow> y \<le> z \<longrightarrow> x \<le> z"
   483   "x < y \<longrightarrow> y \<le> z \<longrightarrow> x \<le> z"
   483   "x < y \<longrightarrow> y \<le> z \<longrightarrow> x \<le> z"
   484   "x \<le> y \<longrightarrow> y < z \<longrightarrow> x \<le> z"
   484   "x \<le> y \<longrightarrow> y < z \<longrightarrow> x \<le> z"
   485   "x < y \<longrightarrow> y < z \<longrightarrow> x < z"
   485   "x < y \<longrightarrow> y < z \<longrightarrow> x < z"
   486   "x < y \<and> y < z \<longrightarrow> \<not> (z < x)"
   486   "x < y \<and> y < z \<longrightarrow> \<not> (z < x)"
   487   by smt2+
   487   by smt+
   488 
   488 
   489 
   489 
   490 section {* Datatypes, Records, and Typedefs *}
   490 section {* Datatypes, Records, and Typedefs *}
   491 
   491 
   492 subsection {* Without support by the SMT solver *}
   492 subsection {* Without support by the SMT solver *}
   505   "(fst (x, y) = snd (x, y)) = (x = y)"
   505   "(fst (x, y) = snd (x, y)) = (x = y)"
   506   "p1 = (x, y) \<and> p2 = (y, x) \<longrightarrow> fst p1 = snd p2"
   506   "p1 = (x, y) \<and> p2 = (y, x) \<longrightarrow> fst p1 = snd p2"
   507   "(fst (x, y) = snd (x, y)) = (x = y)"
   507   "(fst (x, y) = snd (x, y)) = (x = y)"
   508   "(fst p = snd p) = (p = (snd p, fst p))"
   508   "(fst p = snd p) = (p = (snd p, fst p))"
   509   using fst_conv snd_conv pair_collapse
   509   using fst_conv snd_conv pair_collapse
   510   by smt2+
   510   by smt+
   511 
   511 
   512 lemma
   512 lemma
   513   "[x] \<noteq> Nil"
   513   "[x] \<noteq> Nil"
   514   "[x, y] \<noteq> Nil"
   514   "[x, y] \<noteq> Nil"
   515   "x \<noteq> y \<longrightarrow> [x] \<noteq> [y]"
   515   "x \<noteq> y \<longrightarrow> [x] \<noteq> [y]"
   518   "hd [x, y, z] = x"
   518   "hd [x, y, z] = x"
   519   "tl [x, y, z] = [y, z]"
   519   "tl [x, y, z] = [y, z]"
   520   "hd (tl [x, y, z]) = y"
   520   "hd (tl [x, y, z]) = y"
   521   "tl (tl [x, y, z]) = [z]"
   521   "tl (tl [x, y, z]) = [z]"
   522   using list.sel(1,3) list.simps
   522   using list.sel(1,3) list.simps
   523   by smt2+
   523   by smt+
   524 
   524 
   525 lemma
   525 lemma
   526   "fst (hd [(a, b)]) = a"
   526   "fst (hd [(a, b)]) = a"
   527   "snd (hd [(a, b)]) = b"
   527   "snd (hd [(a, b)]) = b"
   528   using fst_conv snd_conv pair_collapse list.sel(1,3) list.simps
   528   using fst_conv snd_conv pair_collapse list.sel(1,3) list.simps
   529   by smt2+
   529   by smt+
   530 
   530 
   531 
   531 
   532 subsubsection {* Records *}
   532 subsubsection {* Records *}
   533 
   533 
   534 record point =
   534 record point =
   542   "p1 = p2 \<longrightarrow> cx p1 = cx p2"
   542   "p1 = p2 \<longrightarrow> cx p1 = cx p2"
   543   "p1 = p2 \<longrightarrow> cy p1 = cy p2"
   543   "p1 = p2 \<longrightarrow> cy p1 = cy p2"
   544   "cx p1 \<noteq> cx p2 \<longrightarrow> p1 \<noteq> p2"
   544   "cx p1 \<noteq> cx p2 \<longrightarrow> p1 \<noteq> p2"
   545   "cy p1 \<noteq> cy p2 \<longrightarrow> p1 \<noteq> p2"
   545   "cy p1 \<noteq> cy p2 \<longrightarrow> p1 \<noteq> p2"
   546   using point.simps
   546   using point.simps
   547   by smt2+
   547   by smt+
   548 
   548 
   549 lemma
   549 lemma
   550   "cx \<lparr> cx = 3, cy = 4 \<rparr> = 3"
   550   "cx \<lparr> cx = 3, cy = 4 \<rparr> = 3"
   551   "cy \<lparr> cx = 3, cy = 4 \<rparr> = 4"
   551   "cy \<lparr> cx = 3, cy = 4 \<rparr> = 4"
   552   "cx \<lparr> cx = 3, cy = 4 \<rparr> \<noteq> cy \<lparr> cx = 3, cy = 4 \<rparr>"
   552   "cx \<lparr> cx = 3, cy = 4 \<rparr> \<noteq> cy \<lparr> cx = 3, cy = 4 \<rparr>"
   553   "\<lparr> cx = 3, cy = 4 \<rparr> \<lparr> cx := 5 \<rparr> = \<lparr> cx = 5, cy = 4 \<rparr>"
   553   "\<lparr> cx = 3, cy = 4 \<rparr> \<lparr> cx := 5 \<rparr> = \<lparr> cx = 5, cy = 4 \<rparr>"
   554   "\<lparr> cx = 3, cy = 4 \<rparr> \<lparr> cy := 6 \<rparr> = \<lparr> cx = 3, cy = 6 \<rparr>"
   554   "\<lparr> cx = 3, cy = 4 \<rparr> \<lparr> cy := 6 \<rparr> = \<lparr> cx = 3, cy = 6 \<rparr>"
   555   "p = \<lparr> cx = 3, cy = 4 \<rparr> \<longrightarrow> p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
   555   "p = \<lparr> cx = 3, cy = 4 \<rparr> \<longrightarrow> p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
   556   "p = \<lparr> cx = 3, cy = 4 \<rparr> \<longrightarrow> p \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr> = p"
   556   "p = \<lparr> cx = 3, cy = 4 \<rparr> \<longrightarrow> p \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr> = p"
   557   using point.simps
   557   using point.simps
   558   by smt2+
   558   by smt+
   559 
   559 
   560 lemma
   560 lemma
   561   "cy (p \<lparr> cx := a \<rparr>) = cy p"
   561   "cy (p \<lparr> cx := a \<rparr>) = cy p"
   562   "cx (p \<lparr> cy := a \<rparr>) = cx p"
   562   "cx (p \<lparr> cy := a \<rparr>) = cx p"
   563   "p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr>"
   563   "p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr>"
   569   "p1 = p2 \<longrightarrow> black p1 = black p2"
   569   "p1 = p2 \<longrightarrow> black p1 = black p2"
   570   "cx p1 \<noteq> cx p2 \<longrightarrow> p1 \<noteq> p2"
   570   "cx p1 \<noteq> cx p2 \<longrightarrow> p1 \<noteq> p2"
   571   "cy p1 \<noteq> cy p2 \<longrightarrow> p1 \<noteq> p2"
   571   "cy p1 \<noteq> cy p2 \<longrightarrow> p1 \<noteq> p2"
   572   "black p1 \<noteq> black p2 \<longrightarrow> p1 \<noteq> p2"
   572   "black p1 \<noteq> black p2 \<longrightarrow> p1 \<noteq> p2"
   573   using point.simps bw_point.simps
   573   using point.simps bw_point.simps
   574   by smt2+
   574   by smt+
   575 
   575 
   576 lemma
   576 lemma
   577   "cx \<lparr> cx = 3, cy = 4, black = b \<rparr> = 3"
   577   "cx \<lparr> cx = 3, cy = 4, black = b \<rparr> = 3"
   578   "cy \<lparr> cx = 3, cy = 4, black = b \<rparr> = 4"
   578   "cy \<lparr> cx = 3, cy = 4, black = b \<rparr> = 4"
   579   "black \<lparr> cx = 3, cy = 4, black = b \<rparr> = b"
   579   "black \<lparr> cx = 3, cy = 4, black = b \<rparr> = b"
   585   "p = \<lparr> cx = 3, cy = 4, black = True \<rparr> \<longrightarrow>
   585   "p = \<lparr> cx = 3, cy = 4, black = True \<rparr> \<longrightarrow>
   586      p \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> = p"
   586      p \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> = p"
   587   "p = \<lparr> cx = 3, cy = 4, black = True \<rparr> \<longrightarrow>
   587   "p = \<lparr> cx = 3, cy = 4, black = True \<rparr> \<longrightarrow>
   588      p \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
   588      p \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
   589   using point.simps bw_point.simps
   589   using point.simps bw_point.simps
   590   sorry (* smt2 FIXME: bad Z3 4.3.x proof *)
   590   sorry (* smt FIXME: bad Z3 4.3.x proof *)
   591 
   591 
   592 lemma
   592 lemma
   593   "\<lparr> cx = 3, cy = 4, black = b \<rparr> \<lparr> black := w \<rparr> = \<lparr> cx = 3, cy = 4, black = w \<rparr>"
   593   "\<lparr> cx = 3, cy = 4, black = b \<rparr> \<lparr> black := w \<rparr> = \<lparr> cx = 3, cy = 4, black = w \<rparr>"
   594   "\<lparr> cx = 3, cy = 4, black = True \<rparr> \<lparr> black := False \<rparr> =
   594   "\<lparr> cx = 3, cy = 4, black = True \<rparr> \<lparr> black := False \<rparr> =
   595      \<lparr> cx = 3, cy = 4, black = False \<rparr>"
   595      \<lparr> cx = 3, cy = 4, black = False \<rparr>"
   609 
   609 
   610 lemma
   610 lemma
   611   "n0 \<noteq> n1"
   611   "n0 \<noteq> n1"
   612   "plus' n1 n1 = n2"
   612   "plus' n1 n1 = n2"
   613   "plus' n0 n2 = n2"
   613   "plus' n0 n2 = n2"
   614   by (smt2 n0_def n1_def n2_def plus'_def Abs_int'_inverse Rep_int'_inverse UNIV_I)+
   614   by (smt n0_def n1_def n2_def plus'_def Abs_int'_inverse Rep_int'_inverse UNIV_I)+
   615 
   615 
   616 
   616 
   617 subsection {* With support by the SMT solver (but without proofs) *}
   617 subsection {* With support by the SMT solver (but without proofs) *}
   618 
   618 
   619 subsubsection {* Algebraic datatypes *}
   619 subsubsection {* Algebraic datatypes *}
   630   "(fst (x, y) = snd (x, y)) = (x = y)"
   630   "(fst (x, y) = snd (x, y)) = (x = y)"
   631   "p1 = (x, y) \<and> p2 = (y, x) \<longrightarrow> fst p1 = snd p2"
   631   "p1 = (x, y) \<and> p2 = (y, x) \<longrightarrow> fst p1 = snd p2"
   632   "(fst (x, y) = snd (x, y)) = (x = y)"
   632   "(fst (x, y) = snd (x, y)) = (x = y)"
   633   "(fst p = snd p) = (p = (snd p, fst p))"
   633   "(fst p = snd p) = (p = (snd p, fst p))"
   634   using fst_conv snd_conv pair_collapse
   634   using fst_conv snd_conv pair_collapse
   635   using [[smt2_oracle, z3_new_extensions]]
   635   using [[smt_oracle, z3_extensions]]
   636   by smt2+
   636   by smt+
   637 
   637 
   638 lemma
   638 lemma
   639   "[x] \<noteq> Nil"
   639   "[x] \<noteq> Nil"
   640   "[x, y] \<noteq> Nil"
   640   "[x, y] \<noteq> Nil"
   641   "x \<noteq> y \<longrightarrow> [x] \<noteq> [y]"
   641   "x \<noteq> y \<longrightarrow> [x] \<noteq> [y]"
   644   "hd [x, y, z] = x"
   644   "hd [x, y, z] = x"
   645   "tl [x, y, z] = [y, z]"
   645   "tl [x, y, z] = [y, z]"
   646   "hd (tl [x, y, z]) = y"
   646   "hd (tl [x, y, z]) = y"
   647   "tl (tl [x, y, z]) = [z]"
   647   "tl (tl [x, y, z]) = [z]"
   648   using list.sel(1,3)
   648   using list.sel(1,3)
   649   using [[smt2_oracle, z3_new_extensions]]
   649   using [[smt_oracle, z3_extensions]]
   650   by smt2+
   650   by smt+
   651 
   651 
   652 lemma
   652 lemma
   653   "fst (hd [(a, b)]) = a"
   653   "fst (hd [(a, b)]) = a"
   654   "snd (hd [(a, b)]) = b"
   654   "snd (hd [(a, b)]) = b"
   655   using fst_conv snd_conv pair_collapse list.sel(1,3)
   655   using fst_conv snd_conv pair_collapse list.sel(1,3)
   656   using [[smt2_oracle, z3_new_extensions]]
   656   using [[smt_oracle, z3_extensions]]
   657   by smt2+
   657   by smt+
   658 
   658 
   659 
   659 
   660 subsubsection {* Records *}
   660 subsubsection {* Records *}
   661 
   661 
   662 lemma
   662 lemma
   663   "p1 = p2 \<longrightarrow> cx p1 = cx p2"
   663   "p1 = p2 \<longrightarrow> cx p1 = cx p2"
   664   "p1 = p2 \<longrightarrow> cy p1 = cy p2"
   664   "p1 = p2 \<longrightarrow> cy p1 = cy p2"
   665   "cx p1 \<noteq> cx p2 \<longrightarrow> p1 \<noteq> p2"
   665   "cx p1 \<noteq> cx p2 \<longrightarrow> p1 \<noteq> p2"
   666   "cy p1 \<noteq> cy p2 \<longrightarrow> p1 \<noteq> p2"
   666   "cy p1 \<noteq> cy p2 \<longrightarrow> p1 \<noteq> p2"
   667   using point.simps
   667   using point.simps
   668   using [[smt2_oracle, z3_new_extensions]]
   668   using [[smt_oracle, z3_extensions]]
   669   by smt2+
   669   by smt+
   670 
   670 
   671 lemma
   671 lemma
   672   "cx \<lparr> cx = 3, cy = 4 \<rparr> = 3"
   672   "cx \<lparr> cx = 3, cy = 4 \<rparr> = 3"
   673   "cy \<lparr> cx = 3, cy = 4 \<rparr> = 4"
   673   "cy \<lparr> cx = 3, cy = 4 \<rparr> = 4"
   674   "cx \<lparr> cx = 3, cy = 4 \<rparr> \<noteq> cy \<lparr> cx = 3, cy = 4 \<rparr>"
   674   "cx \<lparr> cx = 3, cy = 4 \<rparr> \<noteq> cy \<lparr> cx = 3, cy = 4 \<rparr>"
   675   "\<lparr> cx = 3, cy = 4 \<rparr> \<lparr> cx := 5 \<rparr> = \<lparr> cx = 5, cy = 4 \<rparr>"
   675   "\<lparr> cx = 3, cy = 4 \<rparr> \<lparr> cx := 5 \<rparr> = \<lparr> cx = 5, cy = 4 \<rparr>"
   676   "\<lparr> cx = 3, cy = 4 \<rparr> \<lparr> cy := 6 \<rparr> = \<lparr> cx = 3, cy = 6 \<rparr>"
   676   "\<lparr> cx = 3, cy = 4 \<rparr> \<lparr> cy := 6 \<rparr> = \<lparr> cx = 3, cy = 6 \<rparr>"
   677   "p = \<lparr> cx = 3, cy = 4 \<rparr> \<longrightarrow> p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
   677   "p = \<lparr> cx = 3, cy = 4 \<rparr> \<longrightarrow> p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
   678   "p = \<lparr> cx = 3, cy = 4 \<rparr> \<longrightarrow> p \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr> = p"
   678   "p = \<lparr> cx = 3, cy = 4 \<rparr> \<longrightarrow> p \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr> = p"
   679   using point.simps
   679   using point.simps
   680   using [[smt2_oracle, z3_new_extensions]]
   680   using [[smt_oracle, z3_extensions]]
   681   by smt2+
   681   by smt+
   682 
   682 
   683 lemma
   683 lemma
   684   "cy (p \<lparr> cx := a \<rparr>) = cy p"
   684   "cy (p \<lparr> cx := a \<rparr>) = cy p"
   685   "cx (p \<lparr> cy := a \<rparr>) = cx p"
   685   "cx (p \<lparr> cy := a \<rparr>) = cx p"
   686   "p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr>"
   686   "p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr>"
   687   using point.simps
   687   using point.simps
   688   using [[smt2_oracle, z3_new_extensions]]
   688   using [[smt_oracle, z3_extensions]]
   689   by smt2+
   689   by smt+
   690 
   690 
   691 lemma
   691 lemma
   692   "p1 = p2 \<longrightarrow> cx p1 = cx p2"
   692   "p1 = p2 \<longrightarrow> cx p1 = cx p2"
   693   "p1 = p2 \<longrightarrow> cy p1 = cy p2"
   693   "p1 = p2 \<longrightarrow> cy p1 = cy p2"
   694   "p1 = p2 \<longrightarrow> black p1 = black p2"
   694   "p1 = p2 \<longrightarrow> black p1 = black p2"
   695   "cx p1 \<noteq> cx p2 \<longrightarrow> p1 \<noteq> p2"
   695   "cx p1 \<noteq> cx p2 \<longrightarrow> p1 \<noteq> p2"
   696   "cy p1 \<noteq> cy p2 \<longrightarrow> p1 \<noteq> p2"
   696   "cy p1 \<noteq> cy p2 \<longrightarrow> p1 \<noteq> p2"
   697   "black p1 \<noteq> black p2 \<longrightarrow> p1 \<noteq> p2"
   697   "black p1 \<noteq> black p2 \<longrightarrow> p1 \<noteq> p2"
   698   using point.simps bw_point.simps
   698   using point.simps bw_point.simps
   699   using [[smt2_oracle, z3_new_extensions]]
   699   using [[smt_oracle, z3_extensions]]
   700   by smt2+
   700   by smt+
   701 
   701 
   702 lemma
   702 lemma
   703   "cx \<lparr> cx = 3, cy = 4, black = b \<rparr> = 3"
   703   "cx \<lparr> cx = 3, cy = 4, black = b \<rparr> = 3"
   704   "cy \<lparr> cx = 3, cy = 4, black = b \<rparr> = 4"
   704   "cy \<lparr> cx = 3, cy = 4, black = b \<rparr> = 4"
   705   "black \<lparr> cx = 3, cy = 4, black = b \<rparr> = b"
   705   "black \<lparr> cx = 3, cy = 4, black = b \<rparr> = b"
   711   "p = \<lparr> cx = 3, cy = 4, black = True \<rparr> \<longrightarrow>
   711   "p = \<lparr> cx = 3, cy = 4, black = True \<rparr> \<longrightarrow>
   712      p \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> = p"
   712      p \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> = p"
   713   "p = \<lparr> cx = 3, cy = 4, black = True \<rparr> \<longrightarrow>
   713   "p = \<lparr> cx = 3, cy = 4, black = True \<rparr> \<longrightarrow>
   714      p \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
   714      p \<lparr> black := True \<rparr> \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> = p"
   715   using point.simps bw_point.simps
   715   using point.simps bw_point.simps
   716   using [[smt2_oracle, z3_new_extensions]]
   716   using [[smt_oracle, z3_extensions]]
   717   by smt2+
   717   by smt+
   718 
   718 
   719 lemma
   719 lemma
   720   "\<lparr> cx = 3, cy = 4, black = b \<rparr> \<lparr> black := w \<rparr> = \<lparr> cx = 3, cy = 4, black = w \<rparr>"
   720   "\<lparr> cx = 3, cy = 4, black = b \<rparr> \<lparr> black := w \<rparr> = \<lparr> cx = 3, cy = 4, black = w \<rparr>"
   721   "\<lparr> cx = 3, cy = 4, black = True \<rparr> \<lparr> black := False \<rparr> =
   721   "\<lparr> cx = 3, cy = 4, black = True \<rparr> \<lparr> black := False \<rparr> =
   722      \<lparr> cx = 3, cy = 4, black = False \<rparr>"
   722      \<lparr> cx = 3, cy = 4, black = False \<rparr>"
   724 
   724 
   725 lemma
   725 lemma
   726   "p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> =
   726   "p \<lparr> cx := 3 \<rparr> \<lparr> cy := 4 \<rparr> \<lparr> black := True \<rparr> =
   727      p \<lparr> black := True \<rparr> \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr>"
   727      p \<lparr> black := True \<rparr> \<lparr> cy := 4 \<rparr> \<lparr> cx := 3 \<rparr>"
   728   using point.simps bw_point.simps
   728   using point.simps bw_point.simps
   729   using [[smt2_oracle, z3_new_extensions]]
   729   using [[smt_oracle, z3_extensions]]
   730   by smt2
   730   by smt
   731 
   731 
   732 
   732 
   733 subsubsection {* Type definitions *}
   733 subsubsection {* Type definitions *}
   734 
   734 
   735 lemma
   735 lemma
   736   "n0 \<noteq> n1"
   736   "n0 \<noteq> n1"
   737   "plus' n1 n1 = n2"
   737   "plus' n1 n1 = n2"
   738   "plus' n0 n2 = n2"
   738   "plus' n0 n2 = n2"
   739   using [[smt2_oracle, z3_new_extensions]]
   739   using [[smt_oracle, z3_extensions]]
   740   by (smt2 n0_def n1_def n2_def plus'_def)+
   740   by (smt n0_def n1_def n2_def plus'_def)+
   741 
   741 
   742 
   742 
   743 section {* Function updates *}
   743 section {* Function updates *}
   744 
   744 
   745 lemma
   745 lemma
   749   "i1 \<noteq> i2 \<longrightarrow> (f (i1 := v1, i2 := v2)) i2 = v2"
   749   "i1 \<noteq> i2 \<longrightarrow> (f (i1 := v1, i2 := v2)) i2 = v2"
   750   "i1 = i2 \<longrightarrow> (f (i1 := v1, i2 := v2)) i1 = v2"
   750   "i1 = i2 \<longrightarrow> (f (i1 := v1, i2 := v2)) i1 = v2"
   751   "i1 = i2 \<longrightarrow> (f (i1 := v1, i2 := v2)) i1 = v2"
   751   "i1 = i2 \<longrightarrow> (f (i1 := v1, i2 := v2)) i1 = v2"
   752   "i1 \<noteq> i2 \<and>i1 \<noteq> i3 \<and>  i2 \<noteq> i3 \<longrightarrow> (f (i1 := v1, i2 := v2)) i3 = f i3"
   752   "i1 \<noteq> i2 \<and>i1 \<noteq> i3 \<and>  i2 \<noteq> i3 \<longrightarrow> (f (i1 := v1, i2 := v2)) i3 = f i3"
   753   using fun_upd_same fun_upd_apply
   753   using fun_upd_same fun_upd_apply
   754   by smt2+
   754   by smt+
   755 
   755 
   756 
   756 
   757 section {* Sets *}
   757 section {* Sets *}
   758 
   758 
   759 lemma Empty: "x \<notin> {}" by simp
   759 lemma Empty: "x \<notin> {}" by simp
   760 
   760 
   761 lemmas smt2_sets = Empty UNIV_I Un_iff Int_iff
   761 lemmas smt_sets = Empty UNIV_I Un_iff Int_iff
   762 
   762 
   763 lemma
   763 lemma
   764   "x \<notin> {}"
   764   "x \<notin> {}"
   765   "x \<in> UNIV"
   765   "x \<in> UNIV"
   766   "x \<in> A \<union> B \<longleftrightarrow> x \<in> A \<or> x \<in> B"
   766   "x \<in> A \<union> B \<longleftrightarrow> x \<in> A \<or> x \<in> B"
   774   "x \<in> P \<inter> UNIV \<longleftrightarrow> x \<in> P"
   774   "x \<in> P \<inter> UNIV \<longleftrightarrow> x \<in> P"
   775   "x \<in> P \<inter> Q \<longleftrightarrow> x \<in> Q \<inter> P"
   775   "x \<in> P \<inter> Q \<longleftrightarrow> x \<in> Q \<inter> P"
   776   "x \<in> P \<inter> P \<longleftrightarrow> x \<in> P"
   776   "x \<in> P \<inter> P \<longleftrightarrow> x \<in> P"
   777   "x \<in> P \<inter> (Q \<inter> R) \<longleftrightarrow> x \<in> (P \<inter> Q) \<inter> R"
   777   "x \<in> P \<inter> (Q \<inter> R) \<longleftrightarrow> x \<in> (P \<inter> Q) \<inter> R"
   778   "{x. x \<in> P} = {y. y \<in> P}"
   778   "{x. x \<in> P} = {y. y \<in> P}"
   779   by (smt2 smt2_sets)+
   779   by (smt smt_sets)+
   780 
   780 
   781 end
   781 end