src/HOL/Tools/Metis/metis_translate.ML
changeset 42895 c8d9bce88f89
parent 42894 ce269ee43800
child 43000 bd424c3dde46
equal deleted inserted replaced
42894:ce269ee43800 42895:c8d9bce88f89
    12   type name = string * string
    12   type name = string * string
    13 
    13 
    14   datatype type_literal =
    14   datatype type_literal =
    15     TyLitVar of name * name |
    15     TyLitVar of name * name |
    16     TyLitFree of name * name
    16     TyLitFree of name * name
    17   datatype arLit =
    17   datatype arity_literal =
    18     TConsLit of name * name * name list |
    18     TConsLit of name * name * name list |
    19     TVarLit of name * name
    19     TVarLit of name * name
    20   datatype arity_clause =
    20   datatype arity_clause =
    21     ArityClause of {name: string, conclLit: arLit, premLits: arLit list}
    21     ArityClause of
       
    22       {name: string,
       
    23        prem_lits: arity_literal list,
       
    24        concl_lits: arity_literal}
    22   datatype class_rel_clause =
    25   datatype class_rel_clause =
    23     ClassRelClause of {name: string, subclass: name, superclass: name}
    26     ClassRelClause of {name: string, subclass: name, superclass: name}
    24   datatype combterm =
    27   datatype combterm =
    25     CombConst of name * typ * typ list (* Const and Free *) |
    28     CombConst of name * typ * typ list (* Const and Free *) |
    26     CombVar of name * typ |
    29     CombVar of name * typ |
   272 
   275 
   273 (** make axiom and conjecture clauses. **)
   276 (** make axiom and conjecture clauses. **)
   274 
   277 
   275 (**** Isabelle arities ****)
   278 (**** Isabelle arities ****)
   276 
   279 
   277 datatype arLit =
   280 datatype arity_literal =
   278   TConsLit of name * name * name list |
   281   TConsLit of name * name * name list |
   279   TVarLit of name * name
   282   TVarLit of name * name
   280 
   283 
   281 datatype arity_clause =
   284 datatype arity_clause =
   282   ArityClause of {name: string, conclLit: arLit, premLits: arLit list}
   285   ArityClause of
   283 
   286     {name: string,
       
   287      prem_lits: arity_literal list,
       
   288      concl_lits: arity_literal}
   284 
   289 
   285 fun gen_TVars 0 = []
   290 fun gen_TVars 0 = []
   286   | gen_TVars n = ("T_" ^ string_of_int n) :: gen_TVars (n-1);
   291   | gen_TVars n = ("T_" ^ string_of_int n) :: gen_TVars (n-1);
   287 
   292 
   288 fun pack_sort(_,[])  = []
   293 fun pack_sort(_,[])  = []
   289   | pack_sort(tvar, "HOL.type"::srt) = pack_sort (tvar, srt)   (*IGNORE sort "type"*)
   294   | pack_sort(tvar, "HOL.type"::srt) = pack_sort (tvar, srt)   (*IGNORE sort "type"*)
   290   | pack_sort(tvar, cls::srt) =
   295   | pack_sort(tvar, cls::srt) =
   291     (`make_type_class cls, (tvar, tvar)) :: pack_sort (tvar, srt)
   296     (`make_type_class cls, `I tvar) :: pack_sort (tvar, srt)
   292 
   297 
   293 (*Arity of type constructor tcon :: (arg1,...,argN)res*)
   298 (*Arity of type constructor tcon :: (arg1,...,argN)res*)
   294 fun make_axiom_arity_clause (tcons, name, (cls,args)) =
   299 fun make_axiom_arity_clause (tcons, name, (cls,args)) =
   295   let
   300   let
   296     val tvars = gen_TVars (length args)
   301     val tvars = gen_TVars (length args)
   297     val tvars_srts = ListPair.zip (tvars, args)
   302     val tvars_srts = ListPair.zip (tvars, args)
   298   in
   303   in
   299     ArityClause {name = name,
   304     ArityClause {name = name,
   300                  conclLit = TConsLit (`make_type_class cls,
   305                  prem_lits = map TVarLit (union_all (map pack_sort tvars_srts)),
   301                                       `make_fixed_type_const tcons,
   306                  concl_lits = TConsLit (`make_type_class cls,
   302                                       tvars ~~ tvars),
   307                                         `make_fixed_type_const tcons,
   303                  premLits = map TVarLit (union_all (map pack_sort tvars_srts))}
   308                                         tvars ~~ tvars)}
   304   end
   309   end
   305 
   310 
   306 
   311 
   307 (**** Isabelle class relations ****)
   312 (**** Isabelle class relations ****)
   308 
   313 
   717 fun m_arity_cls (TConsLit ((c, _), (t, _), args)) =
   722 fun m_arity_cls (TConsLit ((c, _), (t, _), args)) =
   718     metis_lit true c [Metis_Term.Fn(t, map (Metis_Term.Var o fst) args)]
   723     metis_lit true c [Metis_Term.Fn(t, map (Metis_Term.Var o fst) args)]
   719   | m_arity_cls (TVarLit ((c, _), (s, _))) =
   724   | m_arity_cls (TVarLit ((c, _), (s, _))) =
   720     metis_lit false c [Metis_Term.Var s]
   725     metis_lit false c [Metis_Term.Var s]
   721 (*TrueI is returned as the Isabelle counterpart because there isn't any.*)
   726 (*TrueI is returned as the Isabelle counterpart because there isn't any.*)
   722 fun arity_cls (ArityClause {conclLit, premLits, ...}) =
   727 fun arity_cls (ArityClause {prem_lits, concl_lits, ...}) =
   723   (TrueI,
   728   (TrueI,
   724    Metis_Thm.axiom (Metis_LiteralSet.fromList (map m_arity_cls (conclLit :: premLits))));
   729    Metis_Thm.axiom (Metis_LiteralSet.fromList
       
   730                         (map m_arity_cls (concl_lits :: prem_lits))));
   725 
   731 
   726 (* CLASSREL CLAUSE *)
   732 (* CLASSREL CLAUSE *)
   727 fun m_class_rel_cls (subclass, _) (superclass, _) =
   733 fun m_class_rel_cls (subclass, _) (superclass, _) =
   728   [metis_lit false subclass [Metis_Term.Var "T"], metis_lit true superclass [Metis_Term.Var "T"]];
   734   [metis_lit false subclass [Metis_Term.Var "T"], metis_lit true superclass [Metis_Term.Var "T"]];
   729 fun class_rel_cls (ClassRelClause {subclass, superclass, ...}) =
   735 fun class_rel_cls (ClassRelClause {subclass, superclass, ...}) =