ex/Term.thy
author lcp
Thu, 06 Apr 1995 11:49:42 +0200
changeset 246 0f9230a24164
parent 195 df6b3bd14dcb
child 249 492493334e0f
permissions -rw-r--r--
Deleted extra space in clos_mk.

(*  Title: 	HOL/ex/Term
    ID:         $Id$
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
    Copyright   1992  University of Cambridge

Terms over a given alphabet -- function applications; illustrates list functor
  (essentially the same type as in Trees & Forests)

There is no constructor APP because it is simply cons ($) 
*)

Term = SList +

types   'a term

arities term :: (term)term

consts
  term		:: "'a item set => 'a item set"
  Rep_term	:: "'a term => 'a item"
  Abs_term	:: "'a item => 'a term"
  Rep_Tlist	:: "'a term list => 'a item"
  Abs_Tlist	:: "'a item => 'a term list"
  App		:: "['a, ('a term)list] => 'a term"
  Term_rec	:: "['a item, ['a item , 'a item, 'b list]=>'b] => 'b"
  term_rec	:: "['a term, ['a ,'a term list, 'b list]=>'b] => 'b"

inductive "term(A)"
  intrs
    APP_I "[| M: A;  N : list(term(A)) |] ==> M$N : term(A)"
  monos   "[list_mono]"

defs
  (*defining abstraction/representation functions for term list...*)
  Rep_Tlist_def	"Rep_Tlist == Rep_map(Rep_term)"
  Abs_Tlist_def	"Abs_Tlist == Abs_map(Abs_term)"

  (*defining the abstract constants*)
  App_def 	"App(a,ts) == Abs_term(Leaf(a) $ Rep_Tlist(ts))"

  (*list recursion*)
  Term_rec_def	
   "Term_rec(M,d) == wfrec(trancl(pred_sexp),  M, \
\            Split(%x y g. d(x,y, Abs_map(g,y))))"

  term_rec_def
   "term_rec(t,d) == \
\   Term_rec(Rep_term(t), %x y r. d(Inv(Leaf,x), Abs_Tlist(y), r))"

rules
    (*faking a type definition for term...*)
  Rep_term 		"Rep_term(n): term(range(Leaf))"
  Rep_term_inverse 	"Abs_term(Rep_term(t)) = t"
  Abs_term_inverse 	"M: term(range(Leaf)) ==> Rep_term(Abs_term(M)) = M"
end