| author | paulson | 
| Thu, 07 Apr 2005 13:29:41 +0200 | |
| changeset 15676 | 042692b6275d | 
| 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: 
2903diff
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 |