author | paulson |
Tue, 29 Mar 2005 12:30:48 +0200 | |
changeset 15635 | 8408a06590a6 |
parent 12406 | c9775847ed66 |
child 15648 | f6da795ee27a |
permissions | -rw-r--r-- |
15635 | 1 |
(* ID: $Id$ |
1476 | 2 |
Author: Martin Coen, Cambridge University Computer Laboratory |
968 | 3 |
Copyright 1993 University of Cambridge |
4 |
*) |
|
5 |
||
15635 | 6 |
header{*Simple Term Structure for Unification*} |
7 |
||
8 |
theory UTerm |
|
9 |
imports Main |
|
968 | 10 |
|
15635 | 11 |
begin |
12 |
||
13 |
text{*Binary trees with leaves that are constants or variables.*} |
|
14 |
||
15 |
datatype 'a uterm = Var 'a |
|
16 |
| Const 'a |
|
17 |
| Comb "'a uterm" "'a uterm" |
|
968 | 18 |
|
19 |
consts |
|
15635 | 20 |
vars_of :: "'a uterm => 'a set" |
21 |
"<:" :: "'a uterm => 'a uterm => bool" (infixl 54) |
|
22 |
uterm_size :: "'a uterm => nat" |
|
23 |
||
24 |
||
25 |
primrec |
|
26 |
vars_of_Var: "vars_of (Var v) = {v}" |
|
27 |
vars_of_Const: "vars_of (Const c) = {}" |
|
28 |
vars_of_Comb: "vars_of (Comb M N) = (vars_of(M) Un vars_of(N))" |
|
3192
a75558a4ed37
New version, modified by Konrad Slind and LCP for TFL
paulson
parents:
2903
diff
changeset
|
29 |
|
968 | 30 |
|
5184 | 31 |
primrec |
15635 | 32 |
occs_Var: "u <: (Var v) = False" |
33 |
occs_Const: "u <: (Const c) = False" |
|
34 |
occs_Comb: "u <: (Comb M N) = (u=M | u=N | u <: M | u <: N)" |
|
968 | 35 |
|
5184 | 36 |
primrec |
15635 | 37 |
uterm_size_Var: "uterm_size (Var v) = 0" |
38 |
uterm_size_Const: "uterm_size (Const c) = 0" |
|
39 |
uterm_size_Comb: "uterm_size (Comb M N) = Suc(uterm_size M + uterm_size N)" |
|
40 |
||
41 |
||
42 |
lemma vars_var_iff: "(v : vars_of(Var(w))) = (w=v)" |
|
43 |
by auto |
|
44 |
||
45 |
lemma vars_iff_occseq: "(x : vars_of(t)) = (Var(x) <: t | Var(x) = t)" |
|
46 |
by (induct_tac "t", auto) |
|
47 |
||
968 | 48 |
|
15635 | 49 |
(* Not used, but perhaps useful in other proofs *) |
50 |
lemma occs_vars_subset: "M<:N --> vars_of(M) <= vars_of(N)" |
|
51 |
by (induct_tac "N", auto) |
|
52 |
||
53 |
||
54 |
lemma monotone_vars_of: "vars_of M Un vars_of N <= (vars_of M Un A) Un (vars_of N Un B)" |
|
55 |
by blast |
|
56 |
||
57 |
lemma finite_vars_of: "finite(vars_of M)" |
|
58 |
by (induct_tac "M", auto) |
|
59 |
||
968 | 60 |
|
61 |
end |