src/HOL/Product_Type.thy
changeset 30604 2a9911f4b0a3
parent 28719 01e04e41cc7b
child 30924 c1ed09f3fbfe
equal deleted inserted replaced
30598:eb827cd69fd3 30604:2a9911f4b0a3
   979         val v = Free (s', T)
   979         val v = Free (s', T)
   980       in apfst (cons v) (strip_abs_split (i-1) (subst_bound (v, t))) end
   980       in apfst (cons v) (strip_abs_split (i-1) (subst_bound (v, t))) end
   981   | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of
   981   | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of
   982         (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u)
   982         (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u)
   983       | _ => ([], u))
   983       | _ => ([], u))
   984   | strip_abs_split i t = ([], t);
   984   | strip_abs_split i t =
       
   985       strip_abs_split i (Abs ("x", hd (binder_types (fastype_of t)), t $ Bound 0));
   985 
   986 
   986 fun let_codegen thy defs dep thyname brack t gr = (case strip_comb t of
   987 fun let_codegen thy defs dep thyname brack t gr = (case strip_comb t of
   987     (t1 as Const ("Let", _), t2 :: t3 :: ts) =>
   988     (t1 as Const ("Let", _), t2 :: t3 :: ts) =>
   988     let
   989     let
   989       fun dest_let (l as Const ("Let", _) $ t $ u) =
   990       fun dest_let (l as Const ("Let", _) $ t $ u) =
  1016     end
  1017     end
  1017   | _ => NONE);
  1018   | _ => NONE);
  1018 
  1019 
  1019 fun split_codegen thy defs dep thyname brack t gr = (case strip_comb t of
  1020 fun split_codegen thy defs dep thyname brack t gr = (case strip_comb t of
  1020     (t1 as Const ("split", _), t2 :: ts) =>
  1021     (t1 as Const ("split", _), t2 :: ts) =>
  1021       (case strip_abs_split 1 (t1 $ t2) of
  1022       let
  1022          ([p], u) =>
  1023         val ([p], u) = strip_abs_split 1 (t1 $ t2);
  1023            let
  1024         val (q, gr1) = Codegen.invoke_codegen thy defs dep thyname false p gr;
  1024              val (q, gr1) = Codegen.invoke_codegen thy defs dep thyname false p gr;
  1025         val (pu, gr2) = Codegen.invoke_codegen thy defs dep thyname false u gr1;
  1025              val (pu, gr2) = Codegen.invoke_codegen thy defs dep thyname false u gr1;
  1026         val (pargs, gr3) = fold_map
  1026              val (pargs, gr3) = fold_map
  1027           (Codegen.invoke_codegen thy defs dep thyname true) ts gr2
  1027                (Codegen.invoke_codegen thy defs dep thyname true) ts gr2
  1028       in
  1028            in
  1029         SOME (Codegen.mk_app brack
  1029              SOME (Codegen.mk_app brack
  1030           (Pretty.block [Codegen.str "(fn ", q, Codegen.str " =>",
  1030                (Pretty.block [Codegen.str "(fn ", q, Codegen.str " =>",
  1031             Pretty.brk 1, pu, Codegen.str ")"]) pargs, gr2)
  1031                  Pretty.brk 1, pu, Codegen.str ")"]) pargs, gr2)
  1032       end
  1032            end
       
  1033        | _ => NONE)
       
  1034   | _ => NONE);
  1033   | _ => NONE);
  1035 
  1034 
  1036 in
  1035 in
  1037 
  1036 
  1038   Codegen.add_codegen "let_codegen" let_codegen
  1037   Codegen.add_codegen "let_codegen" let_codegen