author | wenzelm |
Thu, 27 Jul 2006 13:43:01 +0200 | |
changeset 20224 | 9c40a144ee0e |
parent 15648 | f6da795ee27a |
child 24823 | bfb619994060 |
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) |
|
15648 | 22 |
uterm_size :: "'a uterm => nat" |
23 |
||
24 |
syntax (xsymbols) |
|
25 |
"op <:" :: "'a uterm => 'a uterm => bool" (infixl "\<prec>" 54) |
|
15635 | 26 |
|
27 |
||
28 |
primrec |
|
29 |
vars_of_Var: "vars_of (Var v) = {v}" |
|
30 |
vars_of_Const: "vars_of (Const c) = {}" |
|
31 |
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
|
32 |
|
5184 | 33 |
primrec |
15648 | 34 |
occs_Var: "u \<prec> (Var v) = False" |
35 |
occs_Const: "u \<prec> (Const c) = False" |
|
36 |
occs_Comb: "u \<prec> (Comb M N) = (u=M | u=N | u \<prec> M | u \<prec> N)" |
|
968 | 37 |
|
5184 | 38 |
primrec |
15635 | 39 |
uterm_size_Var: "uterm_size (Var v) = 0" |
40 |
uterm_size_Const: "uterm_size (Const c) = 0" |
|
41 |
uterm_size_Comb: "uterm_size (Comb M N) = Suc(uterm_size M + uterm_size N)" |
|
42 |
||
43 |
||
15648 | 44 |
lemma vars_var_iff: "(v \<in> vars_of(Var(w))) = (w=v)" |
15635 | 45 |
by auto |
46 |
||
15648 | 47 |
lemma vars_iff_occseq: "(x \<in> vars_of(t)) = (Var(x) \<prec> t | Var(x) = t)" |
15635 | 48 |
by (induct_tac "t", auto) |
49 |
||
968 | 50 |
|
15648 | 51 |
text{* Not used, but perhaps useful in other proofs *} |
52 |
lemma occs_vars_subset [rule_format]: "M\<prec>N --> vars_of(M) \<subseteq> vars_of(N)" |
|
15635 | 53 |
by (induct_tac "N", auto) |
54 |
||
55 |
||
15648 | 56 |
lemma monotone_vars_of: |
57 |
"vars_of M Un vars_of N \<subseteq> (vars_of M Un A) Un (vars_of N Un B)" |
|
15635 | 58 |
by blast |
59 |
||
60 |
lemma finite_vars_of: "finite(vars_of M)" |
|
61 |
by (induct_tac "M", auto) |
|
62 |
||
968 | 63 |
|
64 |
end |