| author | Christian Urban <urbanc@in.tum.de> | 
| Fri, 25 Nov 2011 00:27:05 +0000 | |
| changeset 504 | 1d1165432c9f | 
| parent 469 | 7a558c5119b2 | 
| child 517 | d8c376662bb4 | 
| permissions | -rw-r--r-- | 
| 
15
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
1  | 
theory Solutions  | 
| 441 | 2  | 
imports First_Steps "Recipes/Timing"  | 
| 
15
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
3  | 
begin  | 
| 
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
4  | 
|
| 
346
 
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
 
Christian Urban <urbanc@in.tum.de> 
parents: 
329 
diff
changeset
 | 
5  | 
(*<*)  | 
| 
 
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
 
Christian Urban <urbanc@in.tum.de> 
parents: 
329 
diff
changeset
 | 
6  | 
setup{*
 | 
| 
 
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
 
Christian Urban <urbanc@in.tum.de> 
parents: 
329 
diff
changeset
 | 
7  | 
open_file_with_prelude  | 
| 
 
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
 
Christian Urban <urbanc@in.tum.de> 
parents: 
329 
diff
changeset
 | 
8  | 
"Solutions_Code.thy"  | 
| 441 | 9  | 
["theory Solutions", "imports First_Steps", "begin"]  | 
| 
346
 
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
 
Christian Urban <urbanc@in.tum.de> 
parents: 
329 
diff
changeset
 | 
10  | 
*}  | 
| 
 
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
 
Christian Urban <urbanc@in.tum.de> 
parents: 
329 
diff
changeset
 | 
11  | 
(*>*)  | 
| 
 
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
 
Christian Urban <urbanc@in.tum.de> 
parents: 
329 
diff
changeset
 | 
12  | 
|
| 156 | 13  | 
chapter {* Solutions to Most Exercises\label{ch:solutions} *}
 | 
| 
15
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
14  | 
|
| 
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
15  | 
text {* \solution{fun:revsum} *}
 | 
| 
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
16  | 
|
| 447 | 17  | 
ML{*fun rev_sum 
 | 
18  | 
  ((p as Const (@{const_name plus}, _)) $ t $ u) = p $ u $ rev_sum t
 | 
|
| 271 | 19  | 
| rev_sum t = t *}  | 
20  | 
||
| 
293
 
0a567f923b42
slightly changed exercises about rev_sum
 
Christian Urban <urbanc@in.tum.de> 
parents: 
272 
diff
changeset
 | 
21  | 
text {* 
 | 
| 
316
 
74f0a06f751f
further polishing of index generation
 
Christian Urban <urbanc@in.tum.de> 
parents: 
314 
diff
changeset
 | 
22  | 
  An alternative solution using the function @{ML_ind mk_binop in HOLogic} is:
 | 
| 
293
 
0a567f923b42
slightly changed exercises about rev_sum
 
Christian Urban <urbanc@in.tum.de> 
parents: 
272 
diff
changeset
 | 
23  | 
*}  | 
| 271 | 24  | 
|
| 
69
 
19106a9975c1
highligted the background of ML-code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
58 
diff
changeset
 | 
25  | 
ML{*fun rev_sum t =
 | 
| 
47
 
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35 
diff
changeset
 | 
26  | 
let  | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
27  | 
  fun dest_sum (Const (@{const_name plus}, _) $ u $ u') = u' :: dest_sum u
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
28  | 
| dest_sum u = [u]  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
29  | 
in  | 
| 447 | 30  | 
  foldl1 (HOLogic.mk_binop @{const_name plus}) (dest_sum t)
 | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
31  | 
end *}  | 
| 
15
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
32  | 
|
| 
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
33  | 
text {* \solution{fun:makesum} *}
 | 
| 
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
34  | 
|
| 
69
 
19106a9975c1
highligted the background of ML-code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
58 
diff
changeset
 | 
35  | 
ML{*fun make_sum t1 t2 =
 | 
| 447 | 36  | 
HOLogic.mk_nat (HOLogic.dest_nat t1 + HOLogic.dest_nat t2) *}  | 
| 
15
 
9da9ba2b095b
added a solution section and some other minor additions
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
37  | 
|
| 
469
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
38  | 
text {* \solution{fun:killqnt} *}
 | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
39  | 
|
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
40  | 
ML %linenosgray{*val quantifiers = [@{const_name All}, @{const_name Ex}]
 | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
41  | 
|
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
42  | 
fun kill_trivial_quantifiers trm =  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
43  | 
let  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
44  | 
fun aux t =  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
45  | 
case t of  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
46  | 
Const (s1, T1) $ Abs (x, T2, t2) =>  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
47  | 
if member (op =) quantifiers s1 andalso not (loose_bvar1 (t2, 0))  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
48  | 
then incr_boundvars ~1 (aux t2)  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
49  | 
else Const (s1, T1) $ Abs (x, T2, aux t2)  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
50  | 
| t1 $ t2 => aux t1 $ aux t2  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
51  | 
| Abs (s, T, t') => Abs (s, T, aux t')  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
52  | 
| _ => t  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
53  | 
in  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
54  | 
aux trm  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
55  | 
end*}  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
56  | 
|
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
57  | 
text {*
 | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
58  | 
In line 7 we traverse the term, by first checking whether a term is an  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
59  | 
application of a constant with an abstraction. If the constant stands for  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
60  | 
a listed quantifier (see Line 1) and the bound variable does not occur  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
61  | 
as a loose bound variable in the body, then we delete the quantifier.  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
62  | 
For this we have to increase all other dangling de Bruijn indices by  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
63  | 
  @{text "-1"} to account for the deleted quantifier. An example is 
 | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
64  | 
as follows:  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
65  | 
|
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
66  | 
  @{ML_response_fake [display,gray]
 | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
67  | 
  "@{prop \"\<forall>x y z. P x = P z\"}
 | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
68  | 
|> kill_trivial_quantifiers  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
69  | 
  |> pretty_term @{context} 
 | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
70  | 
|> pwriteln"  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
71  | 
"\<forall>x z. P x = P z"}  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
72  | 
*}  | 
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
73  | 
|
| 
 
7a558c5119b2
added an excercise originally by Jasmin Blanchette
 
Christian Urban <urbanc@in.tum.de> 
parents: 
458 
diff
changeset
 | 
74  | 
|
| 
446
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
75  | 
|
| 
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
76  | 
text {* \solution{fun:makelist} *}
 | 
| 
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
77  | 
|
| 
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
78  | 
ML{*fun mk_rev_upto i = 
 | 
| 
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
79  | 
1 upto i  | 
| 
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
80  | 
  |> map (HOLogic.mk_number @{typ int})
 | 
| 
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
81  | 
  |> HOLogic.mk_list @{typ int}
 | 
| 
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
82  | 
  |> curry (op $) @{term "rev :: int list \<Rightarrow> int list"}*}
 | 
| 
 
4c32349b9875
added an example to be used for conversions later on
 
Christian Urban <urbanc@in.tum.de> 
parents: 
441 
diff
changeset
 | 
83  | 
|
| 
313
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
84  | 
text {* \solution{ex:debruijn} *}
 | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
85  | 
|
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
86  | 
ML{*fun P n = @{term "P::nat \<Rightarrow> bool"} $ (HOLogic.mk_number @{typ "nat"} n) 
 | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
87  | 
|
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
88  | 
fun rhs 1 = P 1  | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
89  | 
| rhs n = HOLogic.mk_conj (P n, rhs (n - 1))  | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
90  | 
|
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
91  | 
fun lhs 1 n = HOLogic.mk_imp (HOLogic.mk_eq (P 1, P n), rhs n)  | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
92  | 
| lhs m n = HOLogic.mk_conj (HOLogic.mk_imp  | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
93  | 
(HOLogic.mk_eq (P (m - 1), P m), rhs n), lhs (m - 1) n)  | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
94  | 
|
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
95  | 
fun de_bruijn n =  | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
96  | 
HOLogic.mk_Trueprop (HOLogic.mk_imp (lhs n n, rhs n))*}  | 
| 
 
1ca2f41770cc
polished the exercises about constructing terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
312 
diff
changeset
 | 
97  | 
|
| 
56
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
98  | 
text {* \solution{ex:scancmts} *}
 | 
| 
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
99  | 
|
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
100  | 
ML{*val any = Scan.one (Symbol.not_eof)
 | 
| 
56
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
101  | 
|
| 
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
102  | 
val scan_cmt =  | 
| 
168
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
103  | 
let  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
104  | 
val begin_cmt = Scan.this_string "(*"  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
105  | 
val end_cmt = Scan.this_string "*)"  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
106  | 
in  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
107  | 
begin_cmt |-- Scan.repeat (Scan.unless end_cmt any) --| end_cmt  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
108  | 
>> (enclose "(**" "**)" o implode)  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
109  | 
end  | 
| 
56
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
110  | 
|
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
111  | 
val parser = Scan.repeat (scan_cmt || any)  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
112  | 
|
| 
56
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
113  | 
val scan_all =  | 
| 
168
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
114  | 
Scan.finite Symbol.stopper parser >> implode #> fst *}  | 
| 
56
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
115  | 
|
| 
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
116  | 
text {*
 | 
| 58 | 117  | 
  By using @{text "#> fst"} in the last line, the function 
 | 
118  | 
  @{ML scan_all} retruns a string, instead of the pair a parser would
 | 
|
119  | 
normally return. For example:  | 
|
| 
56
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
120  | 
|
| 80 | 121  | 
  @{ML_response [display,gray]
 | 
122  | 
"let  | 
|
| 
458
 
242e81f4d461
updated to post-2011 Isabelle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
447 
diff
changeset
 | 
123  | 
val input1 = (Symbol.explode \"foo bar\")  | 
| 
 
242e81f4d461
updated to post-2011 Isabelle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
447 
diff
changeset
 | 
124  | 
val input2 = (Symbol.explode \"foo (*test*) bar (*test*)\")  | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
125  | 
in  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
126  | 
(scan_all input1, scan_all input2)  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
127  | 
end"  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
128  | 
"(\"foo bar\", \"foo (**test**) bar (**test**)\")"}  | 
| 
56
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
129  | 
*}  | 
| 
 
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
 
Christian Urban <urbanc@in.tum.de> 
parents: 
47 
diff
changeset
 | 
130  | 
|
| 391 | 131  | 
text {* \solution{ex:contextfree} *}
 | 
132  | 
||
133  | 
ML{*datatype expr = 
 | 
|
134  | 
Number of int  | 
|
135  | 
| Mult of expr * expr  | 
|
136  | 
| Add of expr * expr  | 
|
| 314 | 137  | 
|
| 391 | 138  | 
fun parse_basic xs =  | 
| 426 | 139  | 
(Parse.nat >> Number  | 
140  | 
   || Parse.$$$ "(" |-- parse_expr --| Parse.$$$ ")") xs
 | 
|
| 391 | 141  | 
and parse_factor xs =  | 
| 426 | 142  | 
(parse_basic --| Parse.$$$ "*" -- parse_factor >> Mult  | 
| 391 | 143  | 
|| parse_basic) xs  | 
144  | 
and parse_expr xs =  | 
|
| 426 | 145  | 
(parse_factor --| Parse.$$$ "+" -- parse_expr >> Add  | 
| 391 | 146  | 
|| parse_factor) xs*}  | 
147  | 
||
148  | 
||
| 407 | 149  | 
text {* \solution{ex:dyckhoff} *}
 | 
150  | 
||
151  | 
text {* 
 | 
|
| 314 | 152  | 
  The axiom rule can be implemented with the function @{ML atac}. The other
 | 
153  | 
rules correspond to the theorems:  | 
|
154  | 
||
155  | 
  \begin{center}
 | 
|
156  | 
  \begin{tabular}{cc}
 | 
|
157  | 
  \begin{tabular}{rl}
 | 
|
158  | 
  $\wedge_R$ & @{thm [source] conjI}\\
 | 
|
159  | 
  $\vee_{R_1}$ & @{thm [source] disjI1}\\
 | 
|
160  | 
  $\vee_{R_2}$ & @{thm [source] disjI2}\\
 | 
|
161  | 
  $\longrightarrow_R$ & @{thm [source] impI}\\
 | 
|
162  | 
  $=_R$ & @{thm [source] iffI}\\
 | 
|
163  | 
  \end{tabular}
 | 
|
164  | 
&  | 
|
165  | 
  \begin{tabular}{rl}
 | 
|
166  | 
  $False$ & @{thm [source] FalseE}\\
 | 
|
167  | 
  $\wedge_L$ & @{thm [source] conjE}\\
 | 
|
168  | 
  $\vee_L$ & @{thm [source] disjE}\\
 | 
|
169  | 
  $=_L$ & @{thm [source] iffE}
 | 
|
170  | 
  \end{tabular}
 | 
|
171  | 
  \end{tabular}
 | 
|
172  | 
  \end{center}
 | 
|
173  | 
||
174  | 
For the other rules we need to prove the following lemmas.  | 
|
175  | 
*}  | 
|
176  | 
||
177  | 
lemma impE1:  | 
|
178  | 
shows "\<lbrakk>A \<longrightarrow> B; A; B \<Longrightarrow> R\<rbrakk> \<Longrightarrow> R"  | 
|
179  | 
by iprover  | 
|
180  | 
||
181  | 
lemma impE2:  | 
|
182  | 
shows "\<lbrakk>(C \<and> D) \<longrightarrow> B; C \<longrightarrow> (D \<longrightarrow>B) \<Longrightarrow> R\<rbrakk> \<Longrightarrow> R"  | 
|
| 447 | 183  | 
and "\<lbrakk>(C \<or> D) \<longrightarrow> B; \<lbrakk>C \<longrightarrow> B; D \<longrightarrow> B\<rbrakk> \<Longrightarrow> R\<rbrakk> \<Longrightarrow> R"  | 
184  | 
and "\<lbrakk>(C \<longrightarrow> D) \<longrightarrow> B; D \<longrightarrow> B \<Longrightarrow> C \<longrightarrow> D; B \<Longrightarrow> R\<rbrakk> \<Longrightarrow> R"  | 
|
185  | 
and "\<lbrakk>(C = D) \<longrightarrow> B; (C \<longrightarrow> D) \<longrightarrow> ((D \<longrightarrow> C) \<longrightarrow> B) \<Longrightarrow> R\<rbrakk> \<Longrightarrow> R"  | 
|
186  | 
by iprover+  | 
|
| 314 | 187  | 
|
188  | 
text {*
 | 
|
189  | 
Now the tactic which applies a single rule can be implemented  | 
|
190  | 
as follows.  | 
|
191  | 
*}  | 
|
192  | 
||
193  | 
ML %linenosgray{*val apply_tac =
 | 
|
194  | 
let  | 
|
| 447 | 195  | 
  val intros = @{thms conjI disjI1 disjI2 impI iffI}
 | 
196  | 
  val elims = @{thms FalseE conjE disjE iffE impE2}
 | 
|
| 314 | 197  | 
in  | 
198  | 
atac  | 
|
199  | 
ORELSE' resolve_tac intros  | 
|
200  | 
ORELSE' eresolve_tac elims  | 
|
201  | 
  ORELSE' (etac @{thm impE1} THEN' atac)
 | 
|
202  | 
end*}  | 
|
203  | 
||
204  | 
text {*
 | 
|
205  | 
  In Line 11 we apply the rule @{thm [source] impE1} in concjunction 
 | 
|
206  | 
  with @{ML atac} in order to reduce the number of possibilities that
 | 
|
207  | 
need to be explored. You can use the tactic as follows.  | 
|
208  | 
*}  | 
|
209  | 
||
210  | 
lemma  | 
|
211  | 
shows "((((P \<longrightarrow> Q) \<longrightarrow> P) \<longrightarrow> P) \<longrightarrow> Q) \<longrightarrow> Q"  | 
|
212  | 
apply(tactic {* (DEPTH_SOLVE o apply_tac) 1 *})
 | 
|
213  | 
done  | 
|
214  | 
||
215  | 
text {*
 | 
|
216  | 
We can use the tactic to prove or disprove automatically the  | 
|
217  | 
  de Bruijn formulae from Exercise \ref{ex:debruijn}.
 | 
|
218  | 
*}  | 
|
219  | 
||
220  | 
ML{*fun de_bruijn_prove ctxt n =
 | 
|
221  | 
let  | 
|
222  | 
val goal = HOLogic.mk_Trueprop (HOLogic.mk_imp (lhs n n, rhs n))  | 
|
223  | 
in  | 
|
224  | 
Goal.prove ctxt ["P"] [] goal  | 
|
225  | 
(fn _ => (DEPTH_SOLVE o apply_tac) 1)  | 
|
226  | 
end*}  | 
|
227  | 
||
228  | 
text {* 
 | 
|
229  | 
You can use this function to prove de Bruijn formulae.  | 
|
230  | 
*}  | 
|
231  | 
||
232  | 
ML{*de_bruijn_prove @{context} 3 *}
 | 
|
233  | 
||
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
234  | 
text {* \solution{ex:addsimproc} *}
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
235  | 
|
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
236  | 
ML{*fun dest_sum term =
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
237  | 
case term of  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
238  | 
    (@{term "(op +):: nat \<Rightarrow> nat \<Rightarrow> nat"} $ t1 $ t2) =>
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
239  | 
(snd (HOLogic.dest_number t1), snd (HOLogic.dest_number t2))  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
240  | 
  | _ => raise TERM ("dest_sum", [term])
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
241  | 
|
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
242  | 
fun get_sum_thm ctxt t (n1, n2) =  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
243  | 
let  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
244  | 
  val sum = HOLogic.mk_number @{typ "nat"} (n1 + n2)
 | 
| 132 | 245  | 
val goal = Logic.mk_equals (t, sum)  | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
246  | 
in  | 
| 
214
 
7e04dc2368b0
updated to latest Isabelle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
192 
diff
changeset
 | 
247  | 
Goal.prove ctxt [] [] goal (K (Arith_Data.arith_tac ctxt 1))  | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
248  | 
end  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
249  | 
|
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
250  | 
fun add_sp_aux ss t =  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
251  | 
let  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
252  | 
val ctxt = Simplifier.the_context ss  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
253  | 
val t' = term_of t  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
254  | 
in  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
255  | 
SOME (get_sum_thm ctxt t' (dest_sum t'))  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
256  | 
handle TERM _ => NONE  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
257  | 
end*}  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
258  | 
|
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
259  | 
text {* The setup for the simproc is *}
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
260  | 
|
| 177 | 261  | 
simproc_setup %gray add_sp ("t1 + t2") = {* K add_sp_aux *}
 | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
262  | 
|
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
263  | 
text {* and a test case is the lemma *}
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
264  | 
|
| 
405
 
f8d020bbc2c0
improved section on conversions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
402 
diff
changeset
 | 
265  | 
lemma "P (Suc (99 + 1)) ((0 + 0)::nat) (Suc (3 + 3 + 3)) ((4 + 1)::nat)"  | 
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
266  | 
  apply(tactic {* simp_tac (HOL_basic_ss addsimprocs [@{simproc add_sp}]) 1 *})
 | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
267  | 
txt {* 
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
268  | 
where the simproc produces the goal state  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
269  | 
|
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
270  | 
  \begin{minipage}{\textwidth}
 | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
271  | 
  @{subgoals [display]}
 | 
| 
151
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
272  | 
  \end{minipage}\bigskip
 | 
| 
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
273  | 
*}(*<*)oops(*>*)  | 
| 
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
274  | 
|
| 
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
275  | 
text {* \solution{ex:addconversion} *}
 | 
| 
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
276  | 
|
| 
168
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
277  | 
text {*
 | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
278  | 
  The following code assumes the function @{ML dest_sum} from the previous
 | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
279  | 
exercise.  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
280  | 
*}  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
281  | 
|
| 407 | 282  | 
ML{*fun add_simple_conv ctxt ctrm =
 | 
| 
166
 
00d153e32a53
improvments to the solutions suggested by Sacha B?hme
 
Christian Urban <urbanc@in.tum.de> 
parents: 
158 
diff
changeset
 | 
283  | 
let  | 
| 
405
 
f8d020bbc2c0
improved section on conversions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
402 
diff
changeset
 | 
284  | 
val trm = Thm.term_of ctrm  | 
| 
 
f8d020bbc2c0
improved section on conversions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
402 
diff
changeset
 | 
285  | 
in  | 
| 
 
f8d020bbc2c0
improved section on conversions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
402 
diff
changeset
 | 
286  | 
case trm of  | 
| 
 
f8d020bbc2c0
improved section on conversions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
402 
diff
changeset
 | 
287  | 
     @{term "(op +)::nat \<Rightarrow> nat \<Rightarrow> nat"} $ _ $ _ => 
 | 
| 
 
f8d020bbc2c0
improved section on conversions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
402 
diff
changeset
 | 
288  | 
get_sum_thm ctxt trm (dest_sum trm)  | 
| 
 
f8d020bbc2c0
improved section on conversions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
402 
diff
changeset
 | 
289  | 
| _ => Conv.all_conv ctrm  | 
| 
166
 
00d153e32a53
improvments to the solutions suggested by Sacha B?hme
 
Christian Urban <urbanc@in.tum.de> 
parents: 
158 
diff
changeset
 | 
290  | 
end  | 
| 
151
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
291  | 
|
| 424 | 292  | 
val add_conv = Conv.bottom_conv add_simple_conv  | 
| 
151
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
293  | 
|
| 410 | 294  | 
fun add_tac ctxt = CONVERSION (add_conv ctxt)*}  | 
| 
151
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
295  | 
|
| 
168
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
296  | 
text {*
 | 
| 175 | 297  | 
A test case for this conversion is as follows  | 
| 
168
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
298  | 
*}  | 
| 
 
009ca4807baa
polished somewhat the recipes and solutions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
167 
diff
changeset
 | 
299  | 
|
| 
405
 
f8d020bbc2c0
improved section on conversions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
402 
diff
changeset
 | 
300  | 
lemma "P (Suc (99 + 1)) ((0 + 0)::nat) (Suc (3 + 3 + 3)) ((4 + 1)::nat)"  | 
| 
186
 
371e4375c994
made the Ackermann function example safer and included suggestions from MW
 
Christian Urban <urbanc@in.tum.de> 
parents: 
178 
diff
changeset
 | 
301  | 
  apply(tactic {* add_tac @{context} 1 *})?
 | 
| 
151
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
302  | 
txt {* 
 | 
| 175 | 303  | 
where it produces the goal state  | 
| 
151
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
304  | 
|
| 
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
305  | 
  \begin{minipage}{\textwidth}
 | 
| 
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
306  | 
  @{subgoals [display]}
 | 
| 
 
7e0bf13bf743
added more material to the attribute section; merged the recipe about named theorems into the main body; added a solution to an exercise in the conversion section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
132 
diff
changeset
 | 
307  | 
  \end{minipage}\bigskip
 | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
308  | 
*}(*<*)oops(*>*)  | 
| 
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
309  | 
|
| 407 | 310  | 
text {* \solution{ex:compare} *}
 | 
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
311  | 
|
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
312  | 
text {* 
 | 
| 174 | 313  | 
  We use the timing function @{ML timing_wrapper} from Recipe~\ref{rec:timing}.
 | 
314  | 
To measure any difference between the simproc and conversion, we will create  | 
|
315  | 
mechanically terms involving additions and then set up a goal to be  | 
|
316  | 
simplified. We have to be careful to set up the goal so that  | 
|
| 
178
 
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
 
Christian Urban <urbanc@in.tum.de> 
parents: 
177 
diff
changeset
 | 
317  | 
other parts of the simplifier do not interfere. For this we construct an  | 
| 174 | 318  | 
unprovable goal which, after simplification, we are going to ``prove'' with  | 
| 351 | 319  | 
  the help of ``\isacommand{sorry}'', that is the method @{ML Skip_Proof.cheat_tac}
 | 
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
320  | 
|
| 174 | 321  | 
For constructing test cases, we first define a function that returns a  | 
322  | 
complete binary tree whose leaves are numbers and the nodes are  | 
|
323  | 
additions.  | 
|
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
324  | 
*}  | 
| 
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
325  | 
|
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
326  | 
ML{*fun term_tree n =
 | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
327  | 
let  | 
| 
328
 
c0cae24b9d46
updated to new Isabelle; more work on the data section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
316 
diff
changeset
 | 
328  | 
val count = Unsynchronized.ref 0;  | 
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
329  | 
|
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
330  | 
fun term_tree_aux n =  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
331  | 
case n of  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
332  | 
      0 => (count := !count + 1; HOLogic.mk_number @{typ nat} (!count))
 | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
333  | 
    | _ => Const (@{const_name "plus"}, @{typ "nat\<Rightarrow>nat\<Rightarrow>nat"}) 
 | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
334  | 
$ (term_tree_aux (n - 1)) $ (term_tree_aux (n - 1))  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
335  | 
in  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
336  | 
term_tree_aux n  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
337  | 
end*}  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
338  | 
|
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
339  | 
text {*
 | 
| 
178
 
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
 
Christian Urban <urbanc@in.tum.de> 
parents: 
177 
diff
changeset
 | 
340  | 
This function generates for example:  | 
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
341  | 
|
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
342  | 
  @{ML_response_fake [display,gray] 
 | 
| 
440
 
a0b280dd4bc7
partially moved from string_of_term to pretty_term
 
Christian Urban <urbanc@in.tum.de> 
parents: 
426 
diff
changeset
 | 
343  | 
  "pwriteln (pretty_term @{context} (term_tree 2))" 
 | 
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
344  | 
"(1 + 2) + (3 + 4)"}  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
345  | 
|
| 174 | 346  | 
  The next function constructs a goal of the form @{text "P \<dots>"} with a term 
 | 
347  | 
  produced by @{ML term_tree} filled in.
 | 
|
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
348  | 
*}  | 
| 
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
349  | 
|
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
350  | 
ML{*fun goal n = HOLogic.mk_Trueprop (@{term "P::nat\<Rightarrow> bool"} $ (term_tree n))*}
 | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
351  | 
|
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
352  | 
text {*
 | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
353  | 
  Note that the goal needs to be wrapped in a @{term "Trueprop"}. Next we define
 | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
354  | 
  two tactics, @{text "c_tac"} and @{text "s_tac"}, for the conversion and simproc,
 | 
| 174 | 355  | 
respectively. The idea is to first apply the conversion (respectively simproc) and  | 
| 351 | 356  | 
  then prove the remaining goal using @{ML "cheat_tac" in Skip_Proof}.
 | 
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
357  | 
*}  | 
| 
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
358  | 
|
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
359  | 
ML{*local
 | 
| 
225
 
7859fc59249a
section for further material about simple inductive
 
Christian Urban <urbanc@in.tum.de> 
parents: 
214 
diff
changeset
 | 
360  | 
fun mk_tac tac =  | 
| 351 | 361  | 
        timing_wrapper (EVERY1 [tac, K (Skip_Proof.cheat_tac @{theory})])
 | 
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
362  | 
in  | 
| 
352
 
9f12e53eb121
polished theorem section
 
Christian Urban <urbanc@in.tum.de> 
parents: 
351 
diff
changeset
 | 
363  | 
  val c_tac = mk_tac (add_tac @{context}) 
 | 
| 407 | 364  | 
val s_tac = mk_tac (simp_tac  | 
365  | 
                       (HOL_basic_ss addsimprocs [@{simproc add_sp}]))
 | 
|
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
366  | 
end*}  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
367  | 
|
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
368  | 
text {*
 | 
| 175 | 369  | 
This is all we need to let the conversion run against the simproc:  | 
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
370  | 
*}  | 
| 
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
371  | 
|
| 174 | 372  | 
ML{*val _ = Goal.prove @{context} [] [] (goal 8) (K c_tac)
 | 
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
373  | 
val _ = Goal.prove @{context} [] [] (goal 8) (K s_tac)*}
 | 
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
374  | 
|
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
375  | 
text {*
 | 
| 174 | 376  | 
If you do the exercise, you can see that both ways of simplifying additions  | 
| 
178
 
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
 
Christian Urban <urbanc@in.tum.de> 
parents: 
177 
diff
changeset
 | 
377  | 
perform relatively similar with perhaps some advantages for the  | 
| 174 | 378  | 
simproc. That means the simplifier, even if much more complicated than  | 
379  | 
conversions, is quite efficient for tasks it is designed for. It usually does not  | 
|
380  | 
make sense to implement general-purpose rewriting using  | 
|
| 
172
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
381  | 
conversions. Conversions only have clear advantages in special situations:  | 
| 
 
ec47352e99c2
improved the solution for the simproc/conversion exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
168 
diff
changeset
 | 
382  | 
for example if you need to have control over innermost or outermost  | 
| 174 | 383  | 
rewriting, or when rewriting rules are lead to non-termination.  | 
| 
167
 
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
 
Christian Urban <urbanc@in.tum.de> 
parents: 
166 
diff
changeset
 | 
384  | 
*}  | 
| 
130
 
a21d7b300616
polished the section about simprocs and added an exercise
 
Christian Urban <urbanc@in.tum.de> 
parents: 
80 
diff
changeset
 | 
385  | 
|
| 
270
 
bfcabed9079e
included an alternative solution for the "rev_sum" example as a comment
 
griff 
parents: 
225 
diff
changeset
 | 
386  | 
end  |