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, ...}) = |