author | Cezary Kaliszyk <kaliszyk@in.tum.de> |
Fri, 11 Dec 2009 11:08:58 +0100 | |
changeset 705 | f51c6069cd17 |
parent 697 | 57944c1ef728 |
child 758 | 3104d62e7a16 |
permissions | -rw-r--r-- |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
1 |
theory FSet |
600
5d932e7a856c
List moved after QuotMain
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
597
diff
changeset
|
2 |
imports "../QuotMain" List |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
3 |
begin |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
4 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
5 |
inductive |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
6 |
list_eq (infix "\<approx>" 50) |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
7 |
where |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
8 |
"a#b#xs \<approx> b#a#xs" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
9 |
| "[] \<approx> []" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
10 |
| "xs \<approx> ys \<Longrightarrow> ys \<approx> xs" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
11 |
| "a#a#xs \<approx> a#xs" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
12 |
| "xs \<approx> ys \<Longrightarrow> a#xs \<approx> a#ys" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
13 |
| "\<lbrakk>xs1 \<approx> xs2; xs2 \<approx> xs3\<rbrakk> \<Longrightarrow> xs1 \<approx> xs3" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
14 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
15 |
lemma list_eq_refl: |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
16 |
shows "xs \<approx> xs" |
451
586e3dc4afdb
Added 'TRY' to refl in clean_tac to get as far as possible. Removed unnecessary [quot_rsp] in FSet. Added necessary [quot_rsp] and one lifted thm in LamEx.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
450
diff
changeset
|
17 |
by (induct xs) (auto intro: list_eq.intros) |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
18 |
|
529 | 19 |
lemma equivp_list_eq: |
20 |
shows "equivp list_eq" |
|
21 |
unfolding equivp_reflp_symp_transp reflp_def symp_def transp_def |
|
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
22 |
apply(auto intro: list_eq.intros list_eq_refl) |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
23 |
done |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
24 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
25 |
quotient fset = "'a list" / "list_eq" |
529 | 26 |
apply(rule equivp_list_eq) |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
27 |
done |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
28 |
|
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
29 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
30 |
"EMPTY :: 'a fset" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
31 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
32 |
"[]::'a list" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
33 |
|
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
34 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
35 |
"INSERT :: 'a \<Rightarrow> 'a fset \<Rightarrow> 'a fset" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
36 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
37 |
"op #" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
38 |
|
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
39 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
40 |
"FUNION :: 'a fset \<Rightarrow> 'a fset \<Rightarrow> 'a fset" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
41 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
42 |
"op @" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
43 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
44 |
fun |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
45 |
card1 :: "'a list \<Rightarrow> nat" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
46 |
where |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
47 |
card1_nil: "(card1 []) = 0" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
48 |
| card1_cons: "(card1 (x # xs)) = (if (x mem xs) then (card1 xs) else (Suc (card1 xs)))" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
49 |
|
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
50 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
51 |
"CARD :: 'a fset \<Rightarrow> nat" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
52 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
53 |
"card1" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
54 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
55 |
(* text {* |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
56 |
Maybe make_const_def should require a theorem that says that the particular lifted function |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
57 |
respects the relation. With it such a definition would be impossible: |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
58 |
make_const_def @{binding CARD} @{term "length"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
59 |
*}*) |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
60 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
61 |
lemma card1_0: |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
62 |
fixes a :: "'a list" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
63 |
shows "(card1 a = 0) = (a = [])" |
214 | 64 |
by (induct a) auto |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
65 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
66 |
lemma not_mem_card1: |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
67 |
fixes x :: "'a" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
68 |
fixes xs :: "'a list" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
69 |
shows "(~(x mem xs)) = (card1 (x # xs) = Suc (card1 xs))" |
309
20fa8dd8fb93
Lifting towards goal and manually finished the proof.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
305
diff
changeset
|
70 |
by auto |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
71 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
72 |
lemma mem_cons: |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
73 |
fixes x :: "'a" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
74 |
fixes xs :: "'a list" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
75 |
assumes a : "x mem xs" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
76 |
shows "x # xs \<approx> xs" |
214 | 77 |
using a by (induct xs) (auto intro: list_eq.intros ) |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
78 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
79 |
lemma card1_suc: |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
80 |
fixes xs :: "'a list" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
81 |
fixes n :: "nat" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
82 |
assumes c: "card1 xs = Suc n" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
83 |
shows "\<exists>a ys. ~(a mem ys) \<and> xs \<approx> (a # ys)" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
84 |
using c |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
85 |
apply(induct xs) |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
86 |
apply (metis Suc_neq_Zero card1_0) |
685
b12f0321dfb0
moved the interpretation code into Unused.thy
Christian Urban <urbanc@in.tum.de>
parents:
683
diff
changeset
|
87 |
apply (metis FSet.card1_cons list_eq.intros(6) list_eq_refl mem_cons) |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
88 |
done |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
89 |
|
294 | 90 |
definition |
91 |
rsp_fold |
|
92 |
where |
|
93 |
"rsp_fold f = ((!u v. (f u v = f v u)) \<and> (!u v w. ((f u (f v w) = f (f u v) w))))" |
|
94 |
||
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
95 |
primrec |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
96 |
fold1 |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
97 |
where |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
98 |
"fold1 f (g :: 'a \<Rightarrow> 'b) (z :: 'b) [] = z" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
99 |
| "fold1 f g z (a # A) = |
294 | 100 |
(if rsp_fold f |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
101 |
then ( |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
102 |
if (a mem A) then (fold1 f g z A) else (f (g a) (fold1 f g z A)) |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
103 |
) else z)" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
104 |
|
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
105 |
lemma fs1_strong_cases: |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
106 |
fixes X :: "'a list" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
107 |
shows "(X = []) \<or> (\<exists>a. \<exists> Y. (~(a mem Y) \<and> (X \<approx> a # Y)))" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
108 |
apply (induct X) |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
109 |
apply (simp) |
685
b12f0321dfb0
moved the interpretation code into Unused.thy
Christian Urban <urbanc@in.tum.de>
parents:
683
diff
changeset
|
110 |
apply (metis List.member.simps(1) list_eq.intros(6) list_eq_refl mem_cons) |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
111 |
done |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
112 |
|
296 | 113 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
114 |
"IN :: 'a \<Rightarrow> 'a fset \<Rightarrow> bool" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
115 |
as |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
116 |
"op mem" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
117 |
|
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
118 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
119 |
"FOLD :: ('a \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> ('b \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'b fset \<Rightarrow> 'a" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
120 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
121 |
"fold1" |
194
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
122 |
|
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
123 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
124 |
"fmap :: ('a \<Rightarrow> 'b) \<Rightarrow> 'a fset \<Rightarrow> 'b fset" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
125 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
126 |
"map" |
194
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
127 |
|
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
128 |
lemma mem_rsp: |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
129 |
fixes z |
450
2dc708ddb93a
introduced a global list of respectfulness lemmas; the attribute is [quot_rsp]
Christian Urban <urbanc@in.tum.de>
parents:
448
diff
changeset
|
130 |
assumes a: "x \<approx> y" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
131 |
shows "(z mem x) = (z mem y)" |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
132 |
using a by induct auto |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
133 |
|
636
520a4084d064
changed names of attributes
Christian Urban <urbanc@in.tum.de>
parents:
631
diff
changeset
|
134 |
lemma ho_memb_rsp[quot_respect]: |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
135 |
"(op = ===> (op \<approx> ===> op =)) (op mem) (op mem)" |
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
136 |
by (simp add: mem_rsp) |
164
4f00ca4f5ef4
Stronger tactic, simpler proof.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
163
diff
changeset
|
137 |
|
451
586e3dc4afdb
Added 'TRY' to refl in clean_tac to get as far as possible. Removed unnecessary [quot_rsp] in FSet. Added necessary [quot_rsp] and one lifted thm in LamEx.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
450
diff
changeset
|
138 |
lemma card1_rsp: |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
139 |
fixes a b :: "'a list" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
140 |
assumes e: "a \<approx> b" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
141 |
shows "card1 a = card1 b" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
142 |
using e by induct (simp_all add: mem_rsp) |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
143 |
|
636
520a4084d064
changed names of attributes
Christian Urban <urbanc@in.tum.de>
parents:
631
diff
changeset
|
144 |
lemma ho_card1_rsp[quot_respect]: |
450
2dc708ddb93a
introduced a global list of respectfulness lemmas; the attribute is [quot_rsp]
Christian Urban <urbanc@in.tum.de>
parents:
448
diff
changeset
|
145 |
"(op \<approx> ===> op =) card1 card1" |
214 | 146 |
by (simp add: card1_rsp) |
171
13aab4c59096
More infrastructure for automatic lifting of theorems lifted before
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
168
diff
changeset
|
147 |
|
680
d003f9e00c29
removed quot_respect attribute of a non-standard lemma
Christian Urban <urbanc@in.tum.de>
parents:
664
diff
changeset
|
148 |
lemma cons_rsp: |
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
149 |
fixes z |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
150 |
assumes a: "xs \<approx> ys" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
151 |
shows "(z # xs) \<approx> (z # ys)" |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
152 |
using a by (rule list_eq.intros(5)) |
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
153 |
|
636
520a4084d064
changed names of attributes
Christian Urban <urbanc@in.tum.de>
parents:
631
diff
changeset
|
154 |
lemma ho_cons_rsp[quot_respect]: |
228
268a727b0f10
disambiguate ===> syntax
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
226
diff
changeset
|
155 |
"(op = ===> op \<approx> ===> op \<approx>) op # op #" |
214 | 156 |
by (simp add: cons_rsp) |
164
4f00ca4f5ef4
Stronger tactic, simpler proof.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
163
diff
changeset
|
157 |
|
681 | 158 |
lemma append_rsp_aux1: |
159 |
assumes a : "l2 \<approx> r2 " |
|
160 |
shows "(h @ l2) \<approx> (h @ r2)" |
|
161 |
using a |
|
162 |
apply(induct h) |
|
163 |
apply(auto intro: list_eq.intros(5)) |
|
164 |
done |
|
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
165 |
|
681 | 166 |
lemma append_rsp_aux2: |
167 |
assumes a : "l1 \<approx> r1" "l2 \<approx> r2 " |
|
168 |
shows "(l1 @ l2) \<approx> (r1 @ r2)" |
|
169 |
using a |
|
170 |
apply(induct arbitrary: l2 r2) |
|
171 |
apply(simp_all) |
|
172 |
apply(blast intro: list_eq.intros append_rsp_aux1)+ |
|
173 |
done |
|
214 | 174 |
|
681 | 175 |
lemma append_rsp[quot_respect]: |
228
268a727b0f10
disambiguate ===> syntax
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
226
diff
changeset
|
176 |
"(op \<approx> ===> op \<approx> ===> op \<approx>) op @ op @" |
681 | 177 |
by (auto simp add: append_rsp_aux2) |
175
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
173
diff
changeset
|
178 |
|
451
586e3dc4afdb
Added 'TRY' to refl in clean_tac to get as far as possible. Removed unnecessary [quot_rsp] in FSet. Added necessary [quot_rsp] and one lifted thm in LamEx.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
450
diff
changeset
|
179 |
lemma map_rsp: |
194
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
180 |
assumes a: "a \<approx> b" |
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
181 |
shows "map f a \<approx> map f b" |
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
182 |
using a |
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
183 |
apply (induct) |
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
184 |
apply(auto intro: list_eq.intros) |
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
185 |
done |
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
186 |
|
636
520a4084d064
changed names of attributes
Christian Urban <urbanc@in.tum.de>
parents:
631
diff
changeset
|
187 |
lemma ho_map_rsp[quot_respect]: |
294 | 188 |
"(op = ===> op \<approx> ===> op \<approx>) map map" |
189 |
by (simp add: map_rsp) |
|
194
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
190 |
|
294 | 191 |
lemma map_append: |
450
2dc708ddb93a
introduced a global list of respectfulness lemmas; the attribute is [quot_rsp]
Christian Urban <urbanc@in.tum.de>
parents:
448
diff
changeset
|
192 |
"(map f (a @ b)) \<approx> (map f a) @ (map f b)" |
215
89a2ff3f82c7
More finshed proofs and cleaning
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
214
diff
changeset
|
193 |
by simp (rule list_eq_refl) |
194
03c03e88efa9
Simplifying Int and Working on map
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
190
diff
changeset
|
194 |
|
636
520a4084d064
changed names of attributes
Christian Urban <urbanc@in.tum.de>
parents:
631
diff
changeset
|
195 |
lemma ho_fold_rsp[quot_respect]: |
294 | 196 |
"(op = ===> op = ===> op = ===> op \<approx> ===> op =) fold1 fold1" |
536
44fa9df44e6f
More code cleaning and name changes
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
529
diff
changeset
|
197 |
apply (auto) |
294 | 198 |
apply (case_tac "rsp_fold x") |
199 |
prefer 2 |
|
200 |
apply (erule_tac list_eq.induct) |
|
201 |
apply (simp_all) |
|
202 |
apply (erule_tac list_eq.induct) |
|
203 |
apply (simp_all) |
|
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
204 |
apply (auto simp add: mem_rsp rsp_fold_def) |
294 | 205 |
done |
241
60acf3d3a4a0
Finding applications and duplicates filtered out in abstractions
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
239
diff
changeset
|
206 |
|
636
520a4084d064
changed names of attributes
Christian Urban <urbanc@in.tum.de>
parents:
631
diff
changeset
|
207 |
lemma list_equiv_rsp[quot_respect]: |
549
f178958d3d81
not yet quite functional treatment of constants
Christian Urban <urbanc@in.tum.de>
parents:
536
diff
changeset
|
208 |
shows "(op \<approx> ===> op \<approx> ===> op =) op \<approx> op \<approx>" |
f178958d3d81
not yet quite functional treatment of constants
Christian Urban <urbanc@in.tum.de>
parents:
536
diff
changeset
|
209 |
by (auto intro: list_eq.intros) |
f178958d3d81
not yet quite functional treatment of constants
Christian Urban <urbanc@in.tum.de>
parents:
536
diff
changeset
|
210 |
|
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
211 |
lemma "IN x EMPTY = False" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
212 |
apply(lifting member.simps(1)) |
455
9cb45d022524
tried to improve the inj_repabs_trm function but left the new part commented out
Christian Urban <urbanc@in.tum.de>
parents:
452
diff
changeset
|
213 |
done |
353
9a0e8ab42ee8
fixed the error by a temporary fix (the data of the eqivalence relation should be only its name)
Christian Urban <urbanc@in.tum.de>
parents:
350
diff
changeset
|
214 |
|
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
215 |
lemma "IN x (INSERT y xa) = (x = y \<or> IN x xa)" |
683
0d9e8aa1bc7a
removed memb and used standard mem (member from List.thy)
Christian Urban <urbanc@in.tum.de>
parents:
681
diff
changeset
|
216 |
by (lifting member.simps(2)) |
356
51aafebf4d06
Another theorem for which the new regularize differs from old one, so the goal is not proved. But it seems, that the new one is better.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
353
diff
changeset
|
217 |
|
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
218 |
lemma "INSERT a (INSERT a x) = INSERT a x" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
219 |
apply (lifting list_eq.intros(4)) |
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
220 |
done |
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
221 |
|
367
d444389fe3f9
The non-working procedure_tac.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
364
diff
changeset
|
222 |
lemma "x = xa \<Longrightarrow> INSERT a x = INSERT a xa" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
223 |
apply (lifting list_eq.intros(5)) |
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
224 |
done |
353
9a0e8ab42ee8
fixed the error by a temporary fix (the data of the eqivalence relation should be only its name)
Christian Urban <urbanc@in.tum.de>
parents:
350
diff
changeset
|
225 |
|
367
d444389fe3f9
The non-working procedure_tac.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
364
diff
changeset
|
226 |
lemma "CARD x = Suc n \<Longrightarrow> (\<exists>a b. \<not> IN a b & x = INSERT a b)" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
227 |
apply (lifting card1_suc) |
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
228 |
done |
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
229 |
|
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
230 |
lemma "(\<not> IN x xa) = (CARD (INSERT x xa) = Suc (CARD xa))" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
231 |
apply (lifting not_mem_card1) |
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
232 |
done |
356
51aafebf4d06
Another theorem for which the new regularize differs from old one, so the goal is not proved. But it seems, that the new one is better.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
353
diff
changeset
|
233 |
|
442
7beed9b75ea2
renamed LAMBDA_RES_TAC and WEAK_LAMBDA_RES_TAC to lower case names
Christian Urban <urbanc@in.tum.de>
parents:
435
diff
changeset
|
234 |
lemma "FOLD f g (z::'b) (INSERT a x) = |
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
235 |
(if rsp_fold f then if IN a x then FOLD f g z x else f (g a) (FOLD f g z x) else z)" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
236 |
apply(lifting fold1.simps(2)) |
364
4c455d58ac99
Fixes to the tactic after quotient_tac changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
356
diff
changeset
|
237 |
done |
356
51aafebf4d06
Another theorem for which the new regularize differs from old one, so the goal is not proved. But it seems, that the new one is better.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
353
diff
changeset
|
238 |
|
368 | 239 |
lemma "fmap f (FUNION (x::'b fset) (xa::'b fset)) = FUNION (fmap f x) (fmap f xa)" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
240 |
apply (lifting map_append) |
368 | 241 |
done |
242 |
||
367
d444389fe3f9
The non-working procedure_tac.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
364
diff
changeset
|
243 |
lemma "FUNION (FUNION x xa) xb = FUNION x (FUNION xa xb)" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
244 |
apply (lifting append_assoc) |
367
d444389fe3f9
The non-working procedure_tac.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
364
diff
changeset
|
245 |
done |
d444389fe3f9
The non-working procedure_tac.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
364
diff
changeset
|
246 |
|
477
6c88b42da228
A bit of progress; but the object-logic vs meta-logic distinction is troublesome.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
475
diff
changeset
|
247 |
|
376
e99c0334d8bf
lambda_prs and cleaning the existing examples.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
375
diff
changeset
|
248 |
lemma "\<lbrakk>P EMPTY; \<And>a x. P x \<Longrightarrow> P (INSERT a x)\<rbrakk> \<Longrightarrow> P l" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
249 |
apply(lifting list.induct) |
414 | 250 |
done |
390 | 251 |
|
482
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
252 |
lemma list_induct_part: |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
253 |
assumes a: "P (x :: 'a list) ([] :: 'c list)" |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
254 |
assumes b: "\<And>e t. P x t \<Longrightarrow> P x (e # t)" |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
255 |
shows "P x l" |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
256 |
apply (rule_tac P="P x" in list.induct) |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
257 |
apply (rule a) |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
258 |
apply (rule b) |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
259 |
apply (assumption) |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
260 |
done |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
261 |
|
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
262 |
lemma "P (x :: 'a list) (EMPTY :: 'c fset) \<Longrightarrow> (\<And>e t. P x t \<Longrightarrow> P x (INSERT e t)) \<Longrightarrow> P x l" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
263 |
apply (lifting list_induct_part) |
482
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
264 |
done |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
265 |
|
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
266 |
lemma "P (x :: 'a fset) (EMPTY :: 'c fset) \<Longrightarrow> (\<And>e t. P x t \<Longrightarrow> P x (INSERT e t)) \<Longrightarrow> P x l" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
267 |
apply (lifting list_induct_part) |
482
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
268 |
done |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
269 |
|
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
270 |
lemma "P (x :: 'a fset) ([] :: 'c list) \<Longrightarrow> (\<And>e t. P x t \<Longrightarrow> P x (e # t)) \<Longrightarrow> P x l" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
271 |
apply (lifting list_induct_part) |
482
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
272 |
done |
767baada01dc
New APPLY_RSP which finally does automatic partial lifting :). Doesn't support same relation yet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
481
diff
changeset
|
273 |
|
483
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
274 |
quotient fset2 = "'a list" / "list_eq" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
275 |
by (rule equivp_list_eq) |
483
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
276 |
|
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
277 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
278 |
"EMPTY2 :: 'a fset2" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
279 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
280 |
"[]::'a list" |
483
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
281 |
|
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
282 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
283 |
"INSERT2 :: 'a \<Rightarrow> 'a fset2 \<Rightarrow> 'a fset2" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
284 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
285 |
"op #" |
483
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
286 |
|
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
287 |
lemma "P (x :: 'a fset2) (EMPTY :: 'c fset) \<Longrightarrow> (\<And>e t. P x t \<Longrightarrow> P x (INSERT e t)) \<Longrightarrow> P x l" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
288 |
apply (lifting list_induct_part) |
483
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
289 |
done |
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
290 |
|
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
291 |
lemma "P (x :: 'a fset) (EMPTY2 :: 'c fset2) \<Longrightarrow> (\<And>e t. P x t \<Longrightarrow> P x (INSERT2 e t)) \<Longrightarrow> P x l" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
292 |
apply (lifting list_induct_part) |
483
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
293 |
done |
74348dc2f8bb
Lifting to 2 different types :)
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
482
diff
changeset
|
294 |
|
273
b82e765ca464
Lifting 'fold1.simps(2)' and some cleaning.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
270
diff
changeset
|
295 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
296 |
"fset_rec :: 'a \<Rightarrow> ('b \<Rightarrow> 'b fset \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> 'b fset \<Rightarrow> 'a" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
297 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
298 |
"list_rec" |
273
b82e765ca464
Lifting 'fold1.simps(2)' and some cleaning.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
270
diff
changeset
|
299 |
|
292
bd76f0398aa9
More functionality for lifting list.cases and list.recs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
291
diff
changeset
|
300 |
quotient_def |
705
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
301 |
"fset_case :: 'a \<Rightarrow> ('b \<Rightarrow> 'b fset \<Rightarrow> 'a) \<Rightarrow> 'b fset \<Rightarrow> 'a" |
f51c6069cd17
New syntax for definitions.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
697
diff
changeset
|
302 |
as |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
656
diff
changeset
|
303 |
"list_case" |
292
bd76f0398aa9
More functionality for lifting list.cases and list.recs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
291
diff
changeset
|
304 |
|
296 | 305 |
(* Probably not true without additional assumptions about the function *) |
636
520a4084d064
changed names of attributes
Christian Urban <urbanc@in.tum.de>
parents:
631
diff
changeset
|
306 |
lemma list_rec_rsp[quot_respect]: |
292
bd76f0398aa9
More functionality for lifting list.cases and list.recs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
291
diff
changeset
|
307 |
"(op = ===> (op = ===> op \<approx> ===> op =) ===> op \<approx> ===> op =) list_rec list_rec" |
536
44fa9df44e6f
More code cleaning and name changes
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
529
diff
changeset
|
308 |
apply (auto) |
296 | 309 |
apply (erule_tac list_eq.induct) |
310 |
apply (simp_all) |
|
292
bd76f0398aa9
More functionality for lifting list.cases and list.recs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
291
diff
changeset
|
311 |
sorry |
289
7e8617f20b59
Remaining fixes for polymorphic types. map_append now lifts properly with 'a list and 'b list.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
285
diff
changeset
|
312 |
|
636
520a4084d064
changed names of attributes
Christian Urban <urbanc@in.tum.de>
parents:
631
diff
changeset
|
313 |
lemma list_case_rsp[quot_respect]: |
292
bd76f0398aa9
More functionality for lifting list.cases and list.recs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
291
diff
changeset
|
314 |
"(op = ===> (op = ===> op \<approx> ===> op =) ===> op \<approx> ===> op =) list_case list_case" |
536
44fa9df44e6f
More code cleaning and name changes
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
529
diff
changeset
|
315 |
apply (auto) |
292
bd76f0398aa9
More functionality for lifting list.cases and list.recs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
291
diff
changeset
|
316 |
sorry |
bd76f0398aa9
More functionality for lifting list.cases and list.recs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
291
diff
changeset
|
317 |
|
376
e99c0334d8bf
lambda_prs and cleaning the existing examples.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
375
diff
changeset
|
318 |
lemma "fset_rec (f1::'t) x (INSERT a xa) = x a xa (fset_rec f1 x xa)" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
319 |
apply (lifting list.recs(2)) |
376
e99c0334d8bf
lambda_prs and cleaning the existing examples.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
375
diff
changeset
|
320 |
done |
e99c0334d8bf
lambda_prs and cleaning the existing examples.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
375
diff
changeset
|
321 |
|
e99c0334d8bf
lambda_prs and cleaning the existing examples.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
375
diff
changeset
|
322 |
lemma "fset_case (f1::'t) f2 (INSERT a xa) = f2 a xa" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
323 |
apply (lifting list.cases(2)) |
376
e99c0334d8bf
lambda_prs and cleaning the existing examples.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
375
diff
changeset
|
324 |
done |
348
b1f83c7a8674
More theorems lifted in the goal-directed way.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
338
diff
changeset
|
325 |
|
609
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
326 |
lemma ttt: "((op @) x ((op #) e [])) = (((op #) e x))" |
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
327 |
sorry |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
328 |
|
609
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
329 |
lemma "(FUNION x (INSERT e EMPTY)) = ((INSERT e x))" |
654
02fd9de9d45e
tuned the examples and flagged the problematic cleaning lemmas in FSet
Christian Urban <urbanc@in.tum.de>
parents:
653
diff
changeset
|
330 |
apply (lifting ttt) |
609
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
331 |
done |
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
332 |
|
658 | 333 |
|
609
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
334 |
lemma ttt2: "(\<lambda>e. ((op @) x ((op #) e []))) = (\<lambda>e. ((op #) e x))" |
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
335 |
sorry |
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
336 |
|
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
337 |
lemma "(\<lambda>e. (FUNION x (INSERT e EMPTY))) = (\<lambda>e. (INSERT e x))" |
641
b98d64dc98d9
added preserve rules to the cleaning_tac
Christian Urban <urbanc@in.tum.de>
parents:
638
diff
changeset
|
338 |
apply(lifting ttt2) |
639 | 339 |
apply(regularize) |
634
54573efed527
Manual regularization of a goal in FSet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
631
diff
changeset
|
340 |
apply(rule impI) |
54573efed527
Manual regularization of a goal in FSet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
631
diff
changeset
|
341 |
apply(simp) |
54573efed527
Manual regularization of a goal in FSet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
631
diff
changeset
|
342 |
apply(rule allI) |
54573efed527
Manual regularization of a goal in FSet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
631
diff
changeset
|
343 |
apply(rule list_eq_refl) |
54573efed527
Manual regularization of a goal in FSet.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
631
diff
changeset
|
344 |
done |
609
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
345 |
|
695
2eba169533b5
Found the problem with ttt3.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
685
diff
changeset
|
346 |
lemma ttt3: "(\<lambda>x. ((op @) x (e # []))) = (op #) e" |
609
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
347 |
sorry |
6ce4f274b0fa
3 lambda examples in FSet. In the last one regularize_term fails.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
600
diff
changeset
|
348 |
|
695
2eba169533b5
Found the problem with ttt3.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
685
diff
changeset
|
349 |
lemma "(\<lambda>x. (FUNION x (INSERT e EMPTY))) = INSERT e" |
2eba169533b5
Found the problem with ttt3.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
685
diff
changeset
|
350 |
apply(lifting ttt3) |
2eba169533b5
Found the problem with ttt3.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
685
diff
changeset
|
351 |
apply(regularize) |
2eba169533b5
Found the problem with ttt3.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
685
diff
changeset
|
352 |
apply(auto simp add: cons_rsp) |
2eba169533b5
Found the problem with ttt3.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
685
diff
changeset
|
353 |
done |
646
10d04ee52101
An example which is hard to lift because of the interplay between lambda_prs and unfolding.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
642
diff
changeset
|
354 |
lemma hard: "(\<lambda>P. \<lambda>Q. P (Q (x::'a list))) = (\<lambda>P. \<lambda>Q. Q (P (x::'a list)))" |
10d04ee52101
An example which is hard to lift because of the interplay between lambda_prs and unfolding.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
642
diff
changeset
|
355 |
sorry |
10d04ee52101
An example which is hard to lift because of the interplay between lambda_prs and unfolding.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
642
diff
changeset
|
356 |
|
10d04ee52101
An example which is hard to lift because of the interplay between lambda_prs and unfolding.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
642
diff
changeset
|
357 |
lemma hard_lift: "(\<lambda>P. \<lambda>Q. P (Q (x::'a fset))) = (\<lambda>P. \<lambda>Q. Q (P (x::'a fset)))" |
656
c86a47d4966e
Temporarily repeated fun_map_tac 4 times. Cleaning for all examples work.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
654
diff
changeset
|
358 |
apply(lifting hard) |
658 | 359 |
apply(regularize) |
697
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
360 |
apply(rule fun_rel_id_asm) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
361 |
apply(subst babs_simp) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
362 |
apply(tactic {* quotient_tac @{context} 1 *}) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
363 |
apply(rule fun_rel_id_asm) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
364 |
apply(rule impI) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
365 |
apply(rule mp[OF eq_imp_rel[OF fset_equivp]]) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
366 |
apply(drule fun_cong) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
367 |
apply(drule fun_cong) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
368 |
apply(assumption) |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
369 |
done |
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
370 |
|
57944c1ef728
Regularized the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
695
diff
changeset
|
371 |
|
650
bbaa07eea396
manually cleaned the hard lemma.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
646
diff
changeset
|
372 |
|
163
3da18bf6886c
Split Finite Set example into separate file
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
373 |
end |