author | Christian Urban <christian dot urban at kcl dot ac dot uk> |
Sun, 06 Jul 2014 22:56:29 +0100 | |
changeset 286 | e0f6eb0b5d53 |
parent 107 | 5c816239deaa |
permissions | -rw-r--r-- |
107
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
2 |
theory Terms = Main + Swap: |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
3 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
4 |
(* terms *) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
5 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
6 |
datatype trm = Abst string trm |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
7 |
| Susp "(string \<times> string)list" string |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
8 |
| Unit |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
9 |
| Atom string |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
10 |
| Paar trm trm |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
11 |
| Func string trm |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
12 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
13 |
(* swapping operation on terms *) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
14 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
15 |
consts swap :: "(string \<times> string)list \<Rightarrow> trm \<Rightarrow> trm" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
16 |
primrec |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
17 |
"swap pi (Unit) = Unit" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
18 |
"swap pi (Atom a) = Atom (swapas pi a)" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
19 |
"swap pi (Susp pi' X) = Susp (pi@pi') X" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
20 |
"swap pi (Abst a t) = Abst (swapas pi a) (swap pi t)" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
21 |
"swap pi (Paar t1 t2) = Paar (swap pi t1) (swap pi t2)" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
22 |
"swap pi (Func F t) = Func F (swap pi t)" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
23 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
24 |
lemma [simp]: "swap [] t = t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
25 |
apply(induct_tac t) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
26 |
apply(auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
27 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
28 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
29 |
lemma swap_append[rule_format]: "\<forall>pi1 pi2. swap (pi1@pi2) t = swap pi1 (swap pi2 t)" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
30 |
apply(induct_tac t, auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
31 |
apply(induct_tac pi1,auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
32 |
apply(induct_tac pi1,auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
33 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
34 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
35 |
lemma swap_empty: "swap pi t=Susp [] X\<longrightarrow> pi=[]" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
36 |
apply(induct_tac t) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
37 |
apply(auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
38 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
39 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
40 |
(* depyh of terms *) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
41 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
42 |
consts depth :: "trm \<Rightarrow> nat" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
43 |
primrec |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
44 |
"depth (Unit) = 0" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
45 |
"depth (Atom a) = 0" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
46 |
"depth (Susp pi X) = 0" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
47 |
"depth (Abst a t) = 1 + depth t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
48 |
"depth (Func F t) = 1 + depth t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
49 |
"depth (Paar t t') = 1 + (max (depth t) (depth t'))" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
50 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
51 |
lemma |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
52 |
Suc_max_left: "Suc(max x y) = z \<longrightarrow> x < z" and |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
53 |
Suc_max_right: "Suc(max x y) = z \<longrightarrow> y < z" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
54 |
apply(auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
55 |
apply(simp_all only: max_Suc_Suc[THEN sym] less_max_iff_disj) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
56 |
apply(simp_all) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
57 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
58 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
59 |
lemma [simp]: "depth (swap pi t) = depth t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
60 |
apply(induct_tac t,auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
61 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
62 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
63 |
(* occurs predicate and variables in terms *) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
64 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
65 |
consts occurs :: "string \<Rightarrow> trm \<Rightarrow> bool" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
66 |
primrec |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
67 |
"occurs X (Unit) = False" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
68 |
"occurs X (Atom a) = False" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
69 |
"occurs X (Susp pi Y) = (if X=Y then True else False)" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
70 |
"occurs X (Abst a t) = occurs X t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
71 |
"occurs X (Paar t1 t2) = (if (occurs X t1) then True else (occurs X t2))" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
72 |
"occurs X (Func F t) = occurs X t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
73 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
74 |
consts vars_trm :: "trm \<Rightarrow> string set" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
75 |
primrec |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
76 |
"vars_trm (Unit) = {}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
77 |
"vars_trm (Atom a) = {}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
78 |
"vars_trm (Susp pi X) = {X}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
79 |
"vars_trm (Paar t1 t2) = (vars_trm t1)\<union>(vars_trm t2)" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
80 |
"vars_trm (Abst a t) = vars_trm t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
81 |
"vars_trm (Func F t) = vars_trm t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
82 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
83 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
84 |
(* subterms and proper subterms *) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
85 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
86 |
consts sub_trms :: "trm \<Rightarrow> trm set" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
87 |
primrec |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
88 |
"sub_trms (Unit) = {Unit}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
89 |
"sub_trms (Atom a) = {Atom a}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
90 |
"sub_trms (Susp pi Y) = {Susp pi Y}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
91 |
"sub_trms (Abst a t) = {Abst a t}\<union>sub_trms t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
92 |
"sub_trms (Paar t1 t2) = {Paar t1 t2}\<union>sub_trms t1 \<union>sub_trms t2" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
93 |
"sub_trms (Func F t) = {Func F t}\<union>sub_trms t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
94 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
95 |
consts psub_trms :: "trm \<Rightarrow> trm set" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
96 |
primrec |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
97 |
"psub_trms (Unit) = {}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
98 |
"psub_trms (Atom a) = {}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
99 |
"psub_trms (Susp pi X) = {}" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
100 |
"psub_trms (Paar t1 t2) = sub_trms t1 \<union> sub_trms t2" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
101 |
"psub_trms (Abst a t) = sub_trms t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
102 |
"psub_trms (Func F t) = sub_trms t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
103 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
104 |
lemma psub_sub_trms[rule_format]: |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
105 |
"\<forall>t1 . t1 \<in> psub_trms t2 \<longrightarrow> t1 \<in> sub_trms t2" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
106 |
apply(induct t2) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
107 |
apply(auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
108 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
109 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
110 |
lemma t_sub_trms_t: |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
111 |
"t\<in> sub_trms t" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
112 |
apply(induct t) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
113 |
apply(auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
114 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
115 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
116 |
lemma abst_psub_trms[rule_format]: |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
117 |
"\<forall> t1. Abst a t1 \<in> sub_trms t2 \<longrightarrow> t1 \<in> psub_trms t2" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
118 |
apply(induct_tac t2) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
119 |
apply(auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
120 |
apply(simp only: t_sub_trms_t) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
121 |
apply(best dest!: psub_sub_trms)+ |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
122 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
123 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
124 |
lemma func_psub_trms[rule_format]: |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
125 |
"\<forall> t1. Func F t1 \<in> sub_trms t2 \<longrightarrow> t1 \<in> psub_trms t2" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
126 |
apply(induct_tac t2) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
127 |
apply(auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
128 |
apply(best dest!: psub_sub_trms)+ |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
129 |
apply(simp add: t_sub_trms_t) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
130 |
apply(best dest!: psub_sub_trms) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
131 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
132 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
133 |
lemma paar_psub_trms[rule_format]: |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
134 |
"\<forall> t1. Paar t1 t2 \<in> sub_trms t3\<longrightarrow>(t1 \<in> psub_trms t3 \<and> t2 \<in> psub_trms t3)" |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
135 |
apply(induct_tac t3) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
136 |
apply(auto) |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
137 |
apply(best dest!: psub_sub_trms)+ |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
138 |
apply(simp add: t_sub_trms_t)+ |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
139 |
apply(best dest!: psub_sub_trms)+ |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
140 |
done |
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
141 |
|
5c816239deaa
added Unification subdirectory
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
142 |
end |