(* Title: ZF/Coind/Static.thy ID: $Id: Static.thy,v 1.9 2005/06/17 14:15:10 haftmann Exp $ Author: Jacob Frost, Cambridge University Computer Laboratory Copyright 1995 University of Cambridge *) theory Static imports Values Types begin (*** Basic correspondence relation -- not completely specified, as it is a parameter of the proof. A concrete version could be defined inductively. ***) consts isof :: "[i,i] => o" axioms isof_app: "[|isof(c1,t_fun(t1,t2)); isof(c2,t1)|] ==> isof(c_app(c1,c2),t2)" (*Its extension to environments*) constdefs isofenv :: "[i,i] => o" "isofenv(ve,te) == ve_dom(ve) = te_dom(te) & (\x \ ve_dom(ve). \c \ Const. ve_app(ve,x) = v_const(c) & isof(c,te_app(te,x)))" (*** Elaboration ***) consts ElabRel :: i inductive domains "ElabRel" <= "TyEnv * Exp * Ty" intros constI [intro!]: "[| te \ TyEnv; c \ Const; t \ Ty; isof(c,t) |] ==> \ ElabRel" varI [intro!]: "[| te \ TyEnv; x \ ExVar; x \ te_dom(te) |] ==> \ ElabRel" fnI [intro!]: "[| te \ TyEnv; x \ ExVar; e \ Exp; t1 \ Ty; t2 \ Ty; \ ElabRel |] ==> \ ElabRel" fixI [intro!]: "[| te \ TyEnv; f \ ExVar; x \ ExVar; t1 \ Ty; t2 \ Ty; \ ElabRel |] ==> \ ElabRel" appI [intro]: "[| te \ TyEnv; e1 \ Exp; e2 \ Exp; t1 \ Ty; t2 \ Ty; \ ElabRel; \ ElabRel |] ==> \ ElabRel" type_intros te_appI Exp.intros Ty.intros inductive_cases elab_constE [elim!]: " \ ElabRel" and elab_varE [elim!]: " \ ElabRel" and elab_fnE [elim]: " \ ElabRel" and elab_fixE [elim!]: " \ ElabRel" and elab_appE [elim]: " \ ElabRel" declare ElabRel.dom_subset [THEN subsetD, dest] end