src/HOL/Codatatype/Tools/bnf_fp_util.ML
changeset 49130 3c26e17b2849
parent 49129 b5413cb7d860
child 49132 81487fc17185
equal deleted inserted replaced
49129:b5413cb7d860 49130:3c26e17b2849
    90 
    90 
    91   val mk_Field: term -> term
    91   val mk_Field: term -> term
    92   val mk_union: term * term -> term
    92   val mk_union: term * term -> term
    93 
    93 
    94   val mk_sumEN: int -> thm
    94   val mk_sumEN: int -> thm
       
    95   val mk_sum_casesN: int -> int -> thm
    95 
    96 
    96   val mk_tactics: 'a -> 'a -> 'a -> 'a list -> 'a -> 'a -> 'a list -> 'a -> 'a -> 'a list
    97   val mk_tactics: 'a -> 'a -> 'a -> 'a list -> 'a -> 'a -> 'a list -> 'a -> 'a -> 'a list
    97 
    98 
    98   val fixpoint: ('a * 'a -> bool) -> ('a list -> 'a list) -> 'a list -> 'a list
    99   val fixpoint: ('a * 'a -> bool) -> ('a list -> 'a list) -> 'a list -> 'a list
    99 
   100 
   241   fun mk_sumEN 1 = @{thm obj_sum_base}
   242   fun mk_sumEN 1 = @{thm obj_sum_base}
   242     | mk_sumEN 2 = @{thm sumE}
   243     | mk_sumEN 2 = @{thm sumE}
   243     | mk_sumEN n = (mk_sumEN' (n - 2) RSN (2, @{thm obj_sumE})) OF replicate n (impI RS allI);
   244     | mk_sumEN n = (mk_sumEN' (n - 2) RSN (2, @{thm obj_sumE})) OF replicate n (impI RS allI);
   244 end;
   245 end;
   245 
   246 
       
   247 fun mk_sum_casesN 1 1 = @{thm refl}
       
   248   | mk_sum_casesN _ 1 = @{thm sum.cases(1)}
       
   249   | mk_sum_casesN 2 2 = @{thm sum.cases(2)}
       
   250   | mk_sum_casesN n m = trans OF [@{thm sum_case_step(2)}, mk_sum_casesN (n - 1) (m - 1)];
       
   251 
   246 fun mk_tactics mid mcomp mcong snat bdco bdinf sbd inbd wpull =
   252 fun mk_tactics mid mcomp mcong snat bdco bdinf sbd inbd wpull =
   247   [mid, mcomp, mcong] @ snat @ [bdco, bdinf] @ sbd @ [inbd, wpull];
   253   [mid, mcomp, mcong] @ snat @ [bdco, bdinf] @ sbd @ [inbd, wpull];
   248 
   254 
   249 fun fp_sort lhss Ass = Library.sort (Term_Ord.typ_ord o pairself TFree)
   255 fun fp_sort lhss Ass = Library.sort (Term_Ord.typ_ord o pairself TFree)
   250   (subtract (op =) lhss (fold (fold (insert (op =))) Ass [])) @ lhss;
   256   (subtract (op =) lhss (fold (fold (insert (op =))) Ass [])) @ lhss;