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 |
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 |
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" |
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" |
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>" |
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>" |
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>" |