Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
(* generated by Ott 0.10.14 from: ../tests/test8.ott *) theory out imports Main Multiset begin (** syntax *) types value_name = "string" types ident = "string" types integer_literal = "int" types index = "nat" datatype typeconstr = TC_unit | TC_bool | TC_int datatype typvar = TV_ident "ident" datatype typexpr = TE_var "typvar" | TE_arrow "typexpr" "typexpr" | TE_constr0 "typeconstr" datatype constant = CONST_int "integer_literal" | CONST_false | CONST_true | CONST_unit | CONST_and | CONST_not datatype typscheme = TS_ts "typvar list" "typexpr" datatype expr = E_ident "value_name" | E_constant "constant" | E_apply "expr" "expr" | E_function "value_name" "expr" | E_let "value_name" "expr" "expr" datatype G = G_em | G_vn "G" "value_name" "typscheme" (** library functions *) lemma [mono]:" (!! x. f x --> g x) ==> list_all (%b. b) (map f foo_list)--> list_all (%b. b) (map g foo_list) " apply(induct_tac foo_list, auto) done lemma [mono]: "split f p = f (fst p) (snd p)" by (simp add: split_def) consts list_assoc :: "'a => ('a*'b) list => 'b option" primrec "list_assoc x0 Nil = None" "list_assoc x0 (Cons xy xys) = (if x0=fst xy then Some (snd xy) else list_assoc x0 xys)" consts list_minus :: "'a list => 'a list => 'a list" primrec "list_minus Nil ys = Nil" "list_minus (Cons x xs) ys = (if Not(x : set ys) then Cons x (list_minus xs ys) else list_minus xs ys)" (** subrules *) consts is_value_of_expr :: "expr => bool" primrec "is_value_of_expr (E_ident value_name) = (False)" "is_value_of_expr (E_constant constant) = ((True))" "is_value_of_expr (E_apply expr expr') = (False)" "is_value_of_expr (E_function value_name expr) = ((True))" "is_value_of_expr (E_let value_name expr expr') = (False)" (** free variables *) consts ftv_typexpr :: "typexpr => typvar list" primrec "ftv_typexpr (TE_var typvar) = ([typvar])" "ftv_typexpr (TE_arrow typexpr typexpr') = ((ftv_typexpr typexpr) @ (ftv_typexpr typexpr'))" "ftv_typexpr (TE_constr0 typeconstr) = ([])" consts ftv_typscheme :: "typscheme => typvar list" primrec "ftv_typscheme (TS_ts (typvar_list) typexpr) = ([] @ (list_minus (ftv_typexpr typexpr) typvar_list))" consts ftv_G :: "G => typvar list" primrec "ftv_G G_em = ([])" "ftv_G (G_vn G value_name typscheme) = ((ftv_G G) @ (ftv_typscheme typscheme))" (** substitutions *) consts tsubst_typexpr :: "(typvar*typexpr) list => typexpr => typexpr" primrec "tsubst_typexpr sub (TE_var typvar) = ((case list_assoc typvar sub of None => (TE_var typvar) | Some t5 => t5))" "tsubst_typexpr sub (TE_arrow typexpr typexpr') = (TE_arrow (tsubst_typexpr sub typexpr) (tsubst_typexpr sub typexpr'))" "tsubst_typexpr sub (TE_constr0 typeconstr) = (TE_constr0 typeconstr)" consts tsubst_typscheme :: "(typvar*typexpr) list => typscheme => typscheme" primrec "tsubst_typscheme sub (TS_ts (typvar_list) typexpr) = (TS_ts typvar_list (tsubst_typexpr (List.filter (%(tv5,t5).Not(tv5 mem typvar_list)) sub) typexpr))" consts subst_expr :: "expr => value_name => expr => expr" primrec "subst_expr e5 x5 (E_ident value_name) = ((if value_name=x5 then e5 else (E_ident value_name)))" "subst_expr e5 x5 (E_constant constant) = (E_constant constant)" "subst_expr e5 x5 (E_apply expr expr') = (E_apply (subst_expr e5 x5 expr) (subst_expr e5 x5 expr'))" "subst_expr e5 x5 (E_function value_name expr) = (E_function value_name (if x5 mem [value_name] then expr else (subst_expr e5 x5 expr)))" "subst_expr e5 x5 (E_let value_name expr expr') = (E_let value_name (subst_expr e5 x5 expr) (if x5 mem [value_name] then expr' else (subst_expr e5 x5 expr')))" consts tsubst_G :: "(typvar*typexpr) list => G => G" primrec "tsubst_G sub G_em = (G_em )" "tsubst_G sub (G_vn G value_name typscheme) = (G_vn (tsubst_G sub G) value_name (tsubst_typscheme sub typscheme))" (** definitions *) (*defns Jtype *) consts VTSin :: "(value_name*typscheme*G) set" G_constant :: "(G*constant*typexpr) set" Get :: "(G*expr*typexpr) set" inductive VTSin G_constant Get intros (* defn VTSin *) VTSin_vn1I: " ( value_name , typscheme , (G_vn G value_name typscheme) ) : VTSin" VTSin_vn2I: "[| ( value_name , typscheme , G ) : VTSin ; Not( value_name = value_name' ) |] ==> ( value_name , typscheme , (G_vn G value_name' typscheme') ) : VTSin" (* defn G_constant *) constant_intI: " ( G , (CONST_int integer_literal) , (TE_constr0 TC_int) ) : G_constant" constant_falseI: " ( G , CONST_false , (TE_constr0 TC_bool) ) : G_constant" constant_trueI: " ( G , CONST_true , (TE_constr0 TC_bool) ) : G_constant" constant_unitI: " ( G , CONST_unit , (TE_constr0 TC_unit) ) : G_constant" constant_andI: " ( G , CONST_and , (TE_arrow (TE_constr0 TC_bool) (TE_arrow (TE_constr0 TC_bool) (TE_constr0 TC_bool)) ) ) : G_constant" constant_notI: " ( G , CONST_not , (TE_arrow (TE_constr0 TC_bool) (TE_constr0 TC_bool)) ) : G_constant" (* defn Get *) Get_value_nameI: "[| ( x , typscheme , G ) : VTSin ; ? typvars . ? typexpr . ? s . typscheme = TS_ts typvars typexpr & typvars=List.map fst s & tsubst_typexpr s typexpr = t |] ==> ( G , (E_ident x) , t ) : Get" Get_constantI: "[| ( G , constant , t ) : G_constant|] ==> ( G , (E_constant constant) , t ) : Get" Get_applyI: "[| ( G , e , (TE_arrow t1 t2) ) : Get ; ( G , e' , t1 ) : Get|] ==> ( G , (E_apply e e') , t2 ) : Get" Get_lambdaI: "[| ( (G_vn G x1 (TS_ts [] t1)) , e , t ) : Get|] ==> ( G , (E_function x1 e) , (TE_arrow t1 t) ) : Get" Get_letI: "[| ( G , e , t ) : Get ; ( (G_vn G x typscheme) , e' , t' ) : Get ; typscheme = (TS_ts (List.remdups (list_minus (ftv_typexpr t ) (ftv_G G ))) t ) |] ==> ( G , (E_let x e e') , t' ) : Get" (*defns Jop *) consts JO_red :: "(expr*expr) set" inductive JO_red intros (* defn red *) JO_red_appI: "[|is_value_of_expr v|] ==> ( (E_apply (E_function x e) v) , subst_expr v x e ) : JO_red" JO_red_letI: "[|is_value_of_expr v|] ==> ( (E_let x v e) , subst_expr v x e ) : JO_red" JO_red_context_app1I: "[| ( e , e' ) : JO_red|] ==> ( (E_apply e e1) , (E_apply e' e1) ) : JO_red" JO_red_context_app2I: "[|is_value_of_expr v ; ( e , e' ) : JO_red|] ==> ( (E_apply v e) , (E_apply v e') ) : JO_red" JO_red_context_letI: "[| ( e , e' ) : JO_red|] ==> ( (E_let x e e1) , (E_let x e' e1) ) : JO_red" JO_red_not_1I: " ( (E_apply (E_constant CONST_not) (E_constant CONST_true)) , (E_constant CONST_false) ) : JO_red" JO_red_not_2I: " ( (E_apply (E_constant CONST_not) (E_constant CONST_false)) , (E_constant CONST_true) ) : JO_red" JO_red_and_1I: " ( (E_apply (E_apply (E_constant CONST_and) (E_constant CONST_true)) e) , e ) : JO_red" JO_red_and_2I: " ( (E_apply (E_apply (E_constant CONST_and) (E_constant CONST_false)) e) , (E_constant CONST_false) ) : JO_red" end