1 (* Title: HOL/Metis_Examples/Proxies.thy
2 Author: Jasmin Blanchette, TU Muenchen
4 Example that exercises Metis's and Sledgehammer's logical symbol proxies for
5 rudimentary higher-order reasoning.
9 Example that Exercises Metis's and Sledgehammer's Logical Symbol Proxies for
10 Rudimentary Higher-Order Reasoning.
14 imports Type_Encodings
17 text {* Extensionality and set constants *}
19 lemma plus_1_not_0: "n + (1\<Colon>nat) \<noteq> 0"
22 definition inc :: "nat \<Rightarrow> nat" where
25 lemma "inc \<noteq> (\<lambda>y. 0)"
26 sledgehammer [expect = some] (inc_def plus_1_not_0)
27 by (new_metis_exhaust inc_def plus_1_not_0)
29 lemma "inc = (\<lambda>y. y + 1)"
30 sledgehammer [expect = some] (inc_def)
31 by (new_metis_exhaust inc_def)
33 definition add_swap :: "nat \<Rightarrow> nat \<Rightarrow> nat" where
34 "add_swap = (\<lambda>x y. y + x)"
36 lemma "add_swap m n = n + m"
37 sledgehammer [expect = some] (add_swap_def)
38 by (new_metis_exhaust add_swap_def)
40 definition "A = {xs\<Colon>'a list. True}"
43 sledgehammer [expect = some]
44 by (new_metis_exhaust A_def Collect_def mem_def)
46 definition "B (y::int) \<equiv> y \<le> 0"
47 definition "C (y::int) \<equiv> y \<le> 1"
49 lemma int_le_0_imp_le_1: "x \<le> (0::int) \<Longrightarrow> x \<le> 1"
52 lemma "B \<subseteq> C"
53 sledgehammer [type_sys = poly_args, max_relevant = 200, expect = some]
54 by (new_metis_exhaust B_def C_def int_le_0_imp_le_1 predicate1I)
57 text {* Proxies for logical constants *}
60 sledgehammer [type_sys = erased, expect = none] (id_apply)
61 sledgehammer [type_sys = poly_tags?, expect = none] (id_apply) (* unfortunate *)
62 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
63 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
64 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
65 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
66 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
67 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
68 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
72 sledgehammer [type_sys = erased, expect = some] (id_apply)
73 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
74 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
75 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
76 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
77 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
78 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
79 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
80 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
81 by (new_metis_exhaust id_apply)
83 lemma "\<not> id False"
84 sledgehammer [type_sys = erased, expect = some] (id_apply)
85 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
86 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
87 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
88 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
89 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
90 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
91 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
92 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
93 by (new_metis_exhaust id_apply)
95 lemma "x = id True \<or> x = id False"
96 sledgehammer [type_sys = erased, expect = some] (id_apply)
97 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
98 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
99 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
100 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
101 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
102 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
103 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
104 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
105 by (new_metis_exhaust id_apply)
107 lemma "id x = id True \<or> id x = id False"
108 sledgehammer [type_sys = erased, expect = some] (id_apply)
109 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
110 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
111 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
112 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
113 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
114 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
115 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
116 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
117 by (new_metis_exhaust id_apply)
119 lemma "P True \<Longrightarrow> P False \<Longrightarrow> P x"
120 sledgehammer [type_sys = erased, expect = none] ()
121 sledgehammer [type_sys = poly_args, expect = none] ()
122 sledgehammer [type_sys = poly_tags?, expect = some] ()
123 sledgehammer [type_sys = poly_tags, expect = some] ()
124 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
125 sledgehammer [type_sys = poly_preds, expect = some] ()
126 sledgehammer [type_sys = mangled_tags?, expect = some] ()
127 sledgehammer [type_sys = mangled_tags, expect = some] ()
128 sledgehammer [type_sys = mangled_preds?, expect = some] ()
129 sledgehammer [type_sys = mangled_preds, expect = some] ()
132 lemma "id (\<not> a) \<Longrightarrow> \<not> id a"
133 sledgehammer [type_sys = erased, expect = some] (id_apply)
134 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
135 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
136 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
137 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
138 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
139 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
140 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
141 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
142 by (new_metis_exhaust id_apply)
144 lemma "id (\<not> \<not> a) \<Longrightarrow> id a"
145 sledgehammer [type_sys = erased, expect = some] (id_apply)
146 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
147 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
148 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
149 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
150 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
151 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
152 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
153 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
154 by (new_metis_exhaust id_apply)
156 lemma "id (\<not> (id (\<not> a))) \<Longrightarrow> id a"
157 sledgehammer [type_sys = erased, expect = some] (id_apply)
158 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
159 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
160 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
161 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
162 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
163 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
164 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
165 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
166 by (new_metis_exhaust id_apply)
168 lemma "id (a \<and> b) \<Longrightarrow> id a"
169 sledgehammer [type_sys = erased, expect = some] (id_apply)
170 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
171 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
172 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
173 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
174 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
175 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
176 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
177 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
178 by (new_metis_exhaust id_apply)
180 lemma "id (a \<and> b) \<Longrightarrow> id b"
181 sledgehammer [type_sys = erased, expect = some] (id_apply)
182 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
183 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
184 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
185 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
186 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
187 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
188 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
189 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
190 by (new_metis_exhaust id_apply)
192 lemma "id a \<Longrightarrow> id b \<Longrightarrow> id (a \<and> b)"
193 sledgehammer [type_sys = erased, expect = some] (id_apply)
194 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
195 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
196 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
197 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
198 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
199 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
200 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
201 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
202 by (new_metis_exhaust id_apply)
204 lemma "id a \<Longrightarrow> id (a \<or> b)"
205 sledgehammer [type_sys = erased, expect = some] (id_apply)
206 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
207 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
208 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
209 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
210 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
211 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
212 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
213 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
214 by (new_metis_exhaust id_apply)
216 lemma "id b \<Longrightarrow> id (a \<or> b)"
217 sledgehammer [type_sys = erased, expect = some] (id_apply)
218 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
219 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
220 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
221 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
222 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
223 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
224 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
225 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
226 by (new_metis_exhaust id_apply)
228 lemma "id (\<not> a) \<Longrightarrow> id (\<not> b) \<Longrightarrow> id (\<not> (a \<or> b))"
229 sledgehammer [type_sys = erased, expect = some] (id_apply)
230 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
231 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
232 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
233 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
234 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
235 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
236 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
237 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
238 by (new_metis_exhaust id_apply)
240 lemma "id (\<not> a) \<Longrightarrow> id (a \<longrightarrow> b)"
241 sledgehammer [type_sys = erased, expect = some] (id_apply)
242 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
243 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
244 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
245 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
246 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
247 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
248 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
249 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
250 by (new_metis_exhaust id_apply)
252 lemma "id (a \<longrightarrow> b) \<longleftrightarrow> id (\<not> a \<or> b)"
253 sledgehammer [type_sys = erased, expect = some] (id_apply)
254 sledgehammer [type_sys = poly_tags?, expect = some] (id_apply)
255 sledgehammer [type_sys = poly_tags, expect = some] (id_apply)
256 sledgehammer [type_sys = poly_preds?, expect = some] (id_apply)
257 sledgehammer [type_sys = poly_preds, expect = some] (id_apply)
258 sledgehammer [type_sys = mangled_tags?, expect = some] (id_apply)
259 sledgehammer [type_sys = mangled_tags, expect = some] (id_apply)
260 sledgehammer [type_sys = mangled_preds?, expect = some] (id_apply)
261 sledgehammer [type_sys = mangled_preds, expect = some] (id_apply)
262 by (new_metis_exhaust id_apply)