1 (* (c) Copyright, Bill Richter 2013 *)
2 (* Distributed under the same license as HOL Light *)
4 (* Examples showing error messages displayed by readable.ml when raising the *)
5 (* exception Readable_fail, with some working examples interspersed. *)
7 needs "RichterHilbertAxiomGeometry/readable.ml";;
9 let s = "abc]edf" in Str.string_before s (FindMatch "\[" "\]" s);;
11 let s = "123456[abc]lmn[op[abc]pq]rs!!!!!!!!!!]xyz" in
12 Str.string_before s (FindMatch "\[" "\]" s);;
14 (* val it : string = "abc]"
15 val it : string = "123456[abc]lmn[op[abc]pq]rs!!!!!!!!!!]" *)
17 let s = "123456[abc]lmn[op[abc]pq]rs!!!!!!!!!![]xyz" in Str.string_before s
18 (FindMatch "\[" "\]" s);;
21 No matching right bracket operator \] to left bracket operator \[ in xyz. *)
23 let s = "123456[abc]lmn[op[a; b; c]pq]rs[];xyz" in
24 Str.string_before s (FindSemicolon s);;
26 let s = "123456[abc]lmn[op[a; b; c]pq]rs![]xyz" in
27 Str.string_before s (FindSemicolon s);;
29 (* val it : string = "123456[abc]lmn[op[a; b; c]pq]rs[]"
31 Exception: No final semicolon in 123456[abc]lmn[op[a; b; c]pq]rs![]xyz. *)
33 let MOD_MOD_REFL = theorem `;
34 ∀m n. ¬(n = 0) ⇒ ((m MOD n) MOD n = m MOD n)
38 MP_TAC ISPECL [m; n; 1] MOD_MOD;
39 fol H1 MULT_CLAUSES MULT_EQ_0 ONE NOT_SUC;
43 (* 0..0..3..6..solved at 21
44 0..0..3..6..31..114..731..5973..solved at 6087
45 val MOD_MOD_REFL : thm = |- !m n. ~(n = 0) ==> m MOD n MOD n = m MOD n *)
47 let MOD_MOD_REFL = theorem `;
48 ∀m n. ¬(n = 0) ⇒ ((m MOD n) MOD n = m MOD n)
52 MP_TAC ISPECL [m; n; 1] MOD_MOD;
53 fol H1 MULT_CLAUSES MULT_EQ_0 ONE NOT_SUC;
57 (* Exception: Can't parse as a Proof:
59 INTRO_TAC !m n, H1. *)
61 let MOD_MOD_REFL = theorem `;
62 ∀m n. ¬(n = 0) ⇒ ((m MOD n) MOD n = m MOD n)
66 MP_TAC ISPECL [m; n; 1] mod_mod;
67 fol H1 MULT_CLAUSES MULT_EQ_0 ONE NOT_SUC;
71 (* Exception: Not a theorem:
75 let MOD_MOD_REFL = theorem `;
76 ∀m n. ¬(n = 0) ⇒ ((m MOD n) MOD n = m MOD n)
80 MP_TAC ISPECL MOD_MOD;
81 fol H1 MULT_CLAUSES MULT_EQ_0 ONE NOT_SUC;
85 (* Exception: termlist->thm->thm ISPECL
86 not followed by term list in
89 let MOD_MOD_REFL = theorem `;
90 ∀m n. ¬(n = 0) ⇒ ((m MOD n) MOD n = m MOD n)
94 MP_TAC ISPECL m n 1] MOD_MOD;
95 fol H1 MULT_CLAUSES MULT_EQ_0 ONE NOT_SUC;
100 termlist->thm->thm ISPECL
101 not followed by term list in
104 interactive_goal `;∀p q. p * p = 2 * q * q ⇒ q = 0
108 intro_TAC ∀p, A, ∀q, B;
109 EVEN(p * p) ⇔ EVEN(2 * q * q) [] proof qed;
112 (* Exception: Empty theorem:
116 interactive_goal `;∀p q. p * p = 2 * q * q ⇒ q = 0
119 MATCH_MP_TAC num_WF num_WF ;
120 intro_TAC ∀p, A, ∀q, B;
121 EVEN(p * p) ⇔ EVEN(2 * q * q) [] proof qed;
125 thm_tactic MATCH_MP_TAC not followed by a theorem, but instead
128 let EXP_2 = theorem `;
129 ∀n:num. n EXP 2 = n * n
130 by REWRITE BIT0_THM BIT1_THM EXP EXP_ADD MULT_CLAUSES ADD_CLAUSES`;;
134 REWRITE BIT0_THM BIT1_THM EXP EXP_ADD MULT_CLAUSES ADD_CLAUSES.
136 The problem is that REWRITE should be rewrite.*)
138 let MOD_MOD_REFL = theorem `;
139 ∀m n. ¬(n = 0) ⇒ ((m MOD n) MOD n = m MOD n)
143 MP_TAC ISPECL [m; n; 1] MOD_MOD;
144 fol H1 MULT_CLAUSES MULT_EQ_0 ONE NOT_SUC;
149 Missing initial "proof", "by", or final "qed;" in
151 !m n. ~(n = 0) ==> ((m MOD n) MOD n = m MOD n)
155 MP_TAC ISPECL [m; n; 1] MOD_MOD;
156 fol H1 MULT_CLAUSES MULT_EQ_0 ONE NOT_SUC;
160 let MOD_MOD_REFL = theorem `;
161 ∀m n. ¬(n = 0) ⇒ ((m MOD n) MOD n = m MOD n)
165 MP_TAC ISPECL [m; n; 1] MOD_MOD;
166 fol H1 MULT_CLAUSES MULT_EQ_0 ONE NOT_SUC;
171 (* Exception: Trailing garbage after the proof...qed:
175 Two examples from the ocaml reference manual sec 1.4 to show the
176 handling of exceptions other than Readable_fail. *)
178 exception Empty_list;;
181 [] -> raise Empty_list
186 exception Unbound_variable of string;;
191 | Sum of expression * expression
192 | Diff of expression * expression
193 | Prod of expression * expression
194 | Quot of expression * expression;;
196 let rec eval env exp =
200 (try List.assoc v env with Not_found -> raise(Unbound_variable v))
201 | Sum(f, g) -> eval env f +. eval env g
202 | Diff(f, g) -> eval env f -. eval env g
203 | Prod(f, g) -> eval env f *. eval env g
204 | Quot(f, g) -> eval env f /. eval env g;;
206 eval [("x", 1.0); ("y", 3.14)] (Prod(Sum(Var "x", Const 2.0), Var "y"));;
208 eval [("x", 1.0); ("y", 3.14)] (Prod(Sum(Var "z", Const 2.0), Var "y"));;
211 (* The only difference caused by printReadExn is that
212 Exception: Unbound_variable "z".
214 Exception: Unbound_variable("z"). *)
218 `(!n. binom(n,0) = 1) /\
219 (!k. binom(0,SUC(k)) = 0) /\
220 (!n k. binom(SUC(n),SUC(k)) = binom(n,SUC(k)) + binom(n,k))`;;
222 let BINOM_LT = theorem `;
223 ∀n k. n < k ⇒ binom(n,k) = 0
226 INDUCT_TAC; INDUCT_TAC;
227 rewrite binom ARITH LT_SUC LT;
228 ASM_SIMP_TAC ARITH_RULE [n < k ==> n < SUC(k)] ARITH;
232 let BINOM_REFL = theorem `;
237 ASM_SIMP_TAC binom BINOM_LT LT ARITH;
241 let BINOMIAL_THEOREM = theorem `;
242 ∀n. (x + y) EXP n = nsum(0..n) (\k. binom(n,k) * x EXP k * y EXP (n - k))
245 ∀f n. nsum (0.. SUC n) f = f(0) + nsum (0..n) (λi. f (SUC i)) [Nsum0SUC] by simplify LE_0 ADD1 NSUM_CLAUSES_LEFT NSUM_OFFSET;
246 MATCH_MP_TAC num_INDUCTION;
247 simplify EXP NSUM_SING_NUMSEG binom SUB_0 MULT_CLAUSES;
249 rewrite Nsum0SUC binom RIGHT_ADD_DISTRIB NSUM_ADD_NUMSEG GSYM NSUM_LMUL ADD_ASSOC;
251 rewriteRLDepth SUB_SUC EXP;
252 rewrite MULT_AC EQ_ADD_LCANCEL MESON [binom] [1 = binom(n, 0)] GSYM Nsum0SUC;
253 simplify NSUM_CLAUSES_RIGHT ARITH_RULE [0 < SUC n ∧ 0 <= SUC n] LT BINOM_LT MULT_CLAUSES ADD_CLAUSES SUC_SUB1;
254 simplify ARITH_RULE [k <= n ⇒ SUC n - k = SUC(n - k)] EXP MULT_AC;
259 |- (!n. binom (n,0) = 1) /\
260 (!k. binom (0,SUC k) = 0) /\
261 (!n k. binom (SUC n,SUC k) = binom (n,SUC k) + binom (n,k))
262 val BINOM_LT : thm = |- !n k. n < k ==> binom (n,k) = 0
263 val BINOM_REFL : thm = |- !n. binom (n,n) = 1
264 0..0..1..2..solved at 6
265 val BINOMIAL_THEOREM : thm =
266 |- !n. (x + y) EXP n =
267 nsum (0..n) (\k. binom (n,k) * x EXP k * y EXP (n - k)) *)
270 let BINOM_LT = theorem `;
271 ∀n k. n < k ⇒ binom(n,k) = 0
274 INDUCT_TAC; INDUCT_TAC;
275 rewrite binom ARITH LT_SUC LT;
276 ASM_SIMP_TAC ARITH_RULE n < k ==> n < SUC(k)] ARITH;
281 term->thm ARITH_RULE not followed by term list, but instead
282 n < k ==> n < SUC(k)] ARITH. *)
285 let BINOM_LT = theorem `;
286 ∀n k. n < k ⇒ binom(n,k) = 0
289 INDUCT_TAC; INDUCT_TAC;
290 rewrite binom ARITH LT_SUC LT;
291 ASM_SIMP_TAC ARITH_RULE [n < k; n < SUC(k)] ARITH;
296 term->thm ARITH_RULE not followed by length 1 term list, but instead the list
297 [n < k; n < SUC(k)]. *)
300 let BINOM_LT = theorem `;
301 ∀n k. n < k ⇒ binom(n,k) = 0
304 INDUCT_TAC; INDUCT_TAC;
305 rewrite binom ARITH LT_SUC LT;
306 ASM_SIMP_TAC ARITH_RULE [ ] ARITH;
311 term->thm ARITH_RULE not followed by length 1 term list, but instead the list
315 let BINOMIAL_THEOREM = theorem `;
316 ∀n. (x + y) EXP n = nsum(0..n) (\k. binom(n,k) * x EXP k * y EXP (n - k))
319 ∀f n. nsum (0.. SUC n) f = f(0) + nsum (0..n) (λi. f (SUC i)) [Nsum0SUC] by simplify LE_0 ADD1 NSUM_CLAUSES_LEFT NSUM_OFFSET;
320 MATCH_MP_TAC num_INDUCTION;
321 simplify EXP NSUM_SING_NUMSEG binom SUB_0 MULT_CLAUSES;
323 rewrite Nsum0SUC binom RIGHT_ADD_DISTRIB NSUM_ADD_NUMSEG GSYM NSUM_LMUL ADD_ASSOC;
325 rewriteRLDepth SUB_SUC EXP;
326 rewrite MULT_AC EQ_ADD_LCANCEL MESON binom] [1 = binom(n, 0)] GSYM Nsum0SUC;
327 simplify NSUM_CLAUSES_RIGHT ARITH_RULE [0 < SUC n ∧ 0 <= SUC n] LT BINOM_LT MULT_CLAUSES ADD_CLAUSES SUC_SUB1;
328 simplify ARITH_RULE [k <= n ⇒ SUC n - k = SUC(n - k)] EXP MULT_AC;
333 thmlist->term->thm MESON not followed by thm list in
334 binom] [1 = binom(n, 0)] GSYM Nsum0SUC. *)
337 let BINOMIAL_THEOREM = theorem `;
338 ∀n. (x + y) EXP n = nsum(0..n) (\k. binom(n,k) * x EXP k * y EXP (n - k))
341 ∀f n. nsum (0.. SUC n) f = f(0) + nsum (0..n) (λi. f (SUC i)) [Nsum0SUC] by simplify LE_0 ADD1 NSUM_CLAUSES_LEFT NSUM_OFFSET;
342 MATCH_MP_TAC num_INDUCTION;
343 simplify EXP NSUM_SING_NUMSEG binom SUB_0 MULT_CLAUSES;
345 rewrite Nsum0SUC binom RIGHT_ADD_DISTRIB NSUM_ADD_NUMSEG GSYM NSUM_LMUL ADD_ASSOC;
347 rewriteRLDepth SUB_SUC EXP;
348 rewrite MULT_AC EQ_ADD_LCANCEL MESON [binom] 1 = binom(n, 0)] GSYM Nsum0SUC;
349 simplify NSUM_CLAUSES_RIGHT ARITH_RULE [0 < SUC n ∧ 0 <= SUC n] LT BINOM_LT MULT_CLAUSES ADD_CLAUSES SUC_SUB1;
350 simplify ARITH_RULE [k <= n ⇒ SUC n - k = SUC(n - k)] EXP MULT_AC;
355 thmlist->term->thm MESON followed by list of theorems [binom]
356 not followed by term in
357 1 = binom(n, 0)] GSYM Nsum0SUC. *)