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 *)
(* to compile: Holmake outTheory.uo *)
(* for interactive use:
app load ["pred_setTheory","finite_mapTheory","stringTheory","containerTheory","ottLib"];
*)
open HolKernel boolLib Parse bossLib ottLib;
infix THEN THENC |-> ## ;
local open arithmeticTheory stringTheory containerTheory pred_setTheory listTheory
finite_mapTheory in end;
val _ = new_theory "out";
(** syntax *)
val _ = type_abbrev("value_name", ``:string``);
val _ = type_abbrev("ident", ``:string``);
val _ = type_abbrev("integer_literal", ``:num``);
val _ = type_abbrev("index", ``:num``);
val _ = Hol_datatype `
typeconstr =
TC_unit
| TC_bool
| TC_int
`;
val _ = Hol_datatype `
typvar =
TV_ident of ident
`;
val _ = Hol_datatype `
typexpr =
TE_var of typvar
| TE_arrow of typexpr => typexpr
| TE_constr0 of typeconstr
`;
val _ = Hol_datatype `
constant =
CONST_int of integer_literal
| CONST_false
| CONST_true
| CONST_unit
| CONST_and
| CONST_not
`;
val _ = Hol_datatype `
typscheme =
TS_ts of typvar list => typexpr
`;
val _ = Hol_datatype `
expr =
E_ident of value_name
| E_constant of constant
| E_apply of expr => expr
| E_function of value_name => expr
| E_let of value_name => expr => expr
`;
val _ = Hol_datatype `
G =
G_em
| G_vn of G => value_name => typscheme
`;
(** subrules *)
val _ = ottDefine "is_value_of_expr" `
( is_value_of_expr (E_ident value_name) = F)
/\ ( is_value_of_expr (E_constant constant) = (T))
/\ ( is_value_of_expr (E_apply expr expr') = F)
/\ ( is_value_of_expr (E_function value_name expr) = (T))
/\ ( is_value_of_expr (E_let value_name expr expr') = F)
`;
(** free variables *)
val _ = ottDefine "ftv_typexpr" `
( ftv_typexpr (TE_var typvar) = [typvar])
/\ ( ftv_typexpr (TE_arrow typexpr typexpr') = (ftv_typexpr typexpr) ++ (ftv_typexpr typexpr'))
/\ ( ftv_typexpr (TE_constr0 typeconstr) = [])
`;
val _ = ottDefine "ftv_typscheme" `
( ftv_typscheme (TS_ts (typvar_list) typexpr) = [] ++ (list_minus (ftv_typexpr typexpr) typvar_list))
`;
val _ = ottDefine "ftv_G" `
( ftv_G G_em = [])
/\ ( ftv_G (G_vn G value_name typscheme) = (ftv_G G) ++ (ftv_typscheme typscheme))
`;
(** substitutions *)
val _ = ottDefine "tsubst_typexpr" `
( 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)
`;
val _ = ottDefine "tsubst_typscheme" `
( tsubst_typscheme sub (TS_ts (typvar_list) typexpr) = TS_ts typvar_list (tsubst_typexpr (FILTER (\(tv5,t5). ~(MEM tv5 typvar_list)) sub) typexpr))
`;
val _ = ottDefine "subst_expr" `
( 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 MEM x5 [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 MEM x5 [value_name] then expr' else (subst_expr e5 x5 expr')))
`;
val _ = ottDefine "tsubst_G" `
( 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))
`;
val _ = Define `
(remove_duplicates [] = []) /\
(remove_duplicates (x::xs) = if (MEM x xs) then remove_duplicates xs
else x::(remove_duplicates xs))
`;
(** definitions *)
(* defns Jtype *)
val (Jtype_rules, Jtype_ind, Jtype_cases) = Hol_reln `
(* defn VTSin *)
( (* VTSin_vn1 *) !(value_name:value_name) (typscheme:typscheme) (G:G) . (clause_name "VTSin_vn1") ==>
( ( VTSin value_name typscheme (G_vn G value_name typscheme) )))
/\ ( (* VTSin_vn2 *) !(value_name:value_name) (typscheme:typscheme) (G:G) (value_name':value_name) (typscheme':typscheme) . (clause_name "VTSin_vn2") /\
(( ( VTSin value_name typscheme G )) /\
( ~( value_name = value_name' ) ))
==>
( ( VTSin value_name typscheme (G_vn G value_name' typscheme') )))
/\
(* defn G_constant *)
( (* constant_int *) !(G:G) (integer_literal:integer_literal) . (clause_name "constant_int") ==>
( ( G_constant G (CONST_int integer_literal) (TE_constr0 TC_int) )))
/\ ( (* constant_false *) !(G:G) . (clause_name "constant_false") ==>
( ( G_constant G CONST_false (TE_constr0 TC_bool) )))
/\ ( (* constant_true *) !(G:G) . (clause_name "constant_true") ==>
( ( G_constant G CONST_true (TE_constr0 TC_bool) )))
/\ ( (* constant_unit *) !(G:G) . (clause_name "constant_unit") ==>
( ( G_constant G CONST_unit (TE_constr0 TC_unit) )))
/\ ( (* constant_and *) !(G:G) . (clause_name "constant_and") ==>
( ( G_constant G CONST_and (TE_arrow (TE_constr0 TC_bool) (TE_arrow (TE_constr0 TC_bool) (TE_constr0 TC_bool)) ) )))
/\ ( (* constant_not *) !(G:G) . (clause_name "constant_not") ==>
( ( G_constant G CONST_not (TE_arrow (TE_constr0 TC_bool) (TE_constr0 TC_bool)) )))
/\
(* defn Get *)
( (* Get_value_name *) !(G:G) (x:value_name) (t:typexpr) (typscheme:typscheme) . (clause_name "Get_value_name") /\
(( ( VTSin x typscheme G )) /\
( ? typvars typexpr s .
( typscheme = TS_ts typvars typexpr )
/\ (typvars=MAP FST s )
/\ (tsubst_typexpr s typexpr = t ) ))
==>
( ( Get G (E_ident x) t )))
/\ ( (* Get_constant *) !(G:G) (constant:constant) (t:typexpr) . (clause_name "Get_constant") /\
(( ( G_constant G constant t )))
==>
( ( Get G (E_constant constant) t )))
/\ ( (* Get_apply *) !(G:G) (e:expr) (e':expr) (t2:typexpr) (t1:typexpr) . (clause_name "Get_apply") /\
(( ( Get G e (TE_arrow t1 t2) )) /\
( ( Get G e' t1 )))
==>
( ( Get G (E_apply e e') t2 )))
/\ ( (* Get_lambda *) !(G:G) (x1:value_name) (e:expr) (t1:typexpr) (t:typexpr) . (clause_name "Get_lambda") /\
(( ( Get (G_vn G x1 (TS_ts NIL t1)) e t )))
==>
( ( Get G (E_function x1 e) (TE_arrow t1 t) )))
/\ ( (* Get_let *) !(G:G) (x:value_name) (e:expr) (e':expr) (t':typexpr) (t:typexpr) (typscheme:typscheme) . (clause_name "Get_let") /\
(( ( Get G e t )) /\
( ( Get (G_vn G x typscheme) e' t' )) /\
( typscheme = (TS_ts (remove_duplicates (list_minus (ftv_typexpr t ) (ftv_G G ))) t ) ))
==>
( ( Get G (E_let x e e') t' )))
`;
(* defns Jop *)
val (Jop_rules, Jop_ind, Jop_cases) = Hol_reln `
(* defn red *)
( (* JO_red_app *) !(x:value_name) (e:expr) (v:expr) . (clause_name "JO_red_app") /\
((is_value_of_expr v))
==>
( ( JO_red (E_apply (E_function x e) v) (subst_expr v x e ) )))
/\ ( (* JO_red_let *) !(x:value_name) (e:expr) (v:expr) . (clause_name "JO_red_let") /\
((is_value_of_expr v))
==>
( ( JO_red (E_let x v e) (subst_expr v x e ) )))
/\ ( (* JO_red_context_app1 *) !(e:expr) (e1:expr) (e':expr) . (clause_name "JO_red_context_app1") /\
(( ( JO_red e e' )))
==>
( ( JO_red (E_apply e e1) (E_apply e' e1) )))
/\ ( (* JO_red_context_app2 *) !(v:expr) (e:expr) (e':expr) . (clause_name "JO_red_context_app2") /\
((is_value_of_expr v) /\
( ( JO_red e e' )))
==>
( ( JO_red (E_apply v e) (E_apply v e') )))
/\ ( (* JO_red_context_let *) !(x:value_name) (e:expr) (e1:expr) (e':expr) . (clause_name "JO_red_context_let") /\
(( ( JO_red e e' )))
==>
( ( JO_red (E_let x e e1) (E_let x e' e1) )))
/\ ( (* JO_red_not_1 *) (clause_name "JO_red_not_1") ==>
( ( JO_red (E_apply (E_constant CONST_not) (E_constant CONST_true)) (E_constant CONST_false) )))
/\ ( (* JO_red_not_2 *) (clause_name "JO_red_not_2") ==>
( ( JO_red (E_apply (E_constant CONST_not) (E_constant CONST_false)) (E_constant CONST_true) )))
/\ ( (* JO_red_and_1 *) !(e:expr) . (clause_name "JO_red_and_1") ==>
( ( JO_red (E_apply (E_apply (E_constant CONST_and) (E_constant CONST_true)) e) e )))
/\ ( (* JO_red_and_2 *) !(e:expr) . (clause_name "JO_red_and_2") ==>
( ( JO_red (E_apply (E_apply (E_constant CONST_and) (E_constant CONST_false)) e) (E_constant CONST_false) )))
`;
val _ = export_theory ();