src/HOL/Product_Type.thy
changeset 28537 1e84256d1a8a
parent 28346 b8390cd56b8f
child 28562 4e74209f113e
equal deleted inserted replaced
28536:8dccb6035d0f 28537:1e84256d1a8a
   977   | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of
   977   | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of
   978         (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u)
   978         (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u)
   979       | _ => ([], u))
   979       | _ => ([], u))
   980   | strip_abs_split i t = ([], t);
   980   | strip_abs_split i t = ([], t);
   981 
   981 
   982 fun let_codegen thy defs gr dep thyname brack t = (case strip_comb t of
   982 fun let_codegen thy defs dep thyname brack t gr = (case strip_comb t of
   983     (t1 as Const ("Let", _), t2 :: t3 :: ts) =>
   983     (t1 as Const ("Let", _), t2 :: t3 :: ts) =>
   984     let
   984     let
   985       fun dest_let (l as Const ("Let", _) $ t $ u) =
   985       fun dest_let (l as Const ("Let", _) $ t $ u) =
   986           (case strip_abs_split 1 u of
   986           (case strip_abs_split 1 u of
   987              ([p], u') => apfst (cons (p, t)) (dest_let u')
   987              ([p], u') => apfst (cons (p, t)) (dest_let u')
   988            | _ => ([], l))
   988            | _ => ([], l))
   989         | dest_let t = ([], t);
   989         | dest_let t = ([], t);
   990       fun mk_code (gr, (l, r)) =
   990       fun mk_code (l, r) gr =
   991         let
   991         let
   992           val (gr1, pl) = Codegen.invoke_codegen thy defs dep thyname false (gr, l);
   992           val (pl, gr1) = Codegen.invoke_codegen thy defs dep thyname false l gr;
   993           val (gr2, pr) = Codegen.invoke_codegen thy defs dep thyname false (gr1, r);
   993           val (pr, gr2) = Codegen.invoke_codegen thy defs dep thyname false r gr1;
   994         in (gr2, (pl, pr)) end
   994         in ((pl, pr), gr2) end
   995     in case dest_let (t1 $ t2 $ t3) of
   995     in case dest_let (t1 $ t2 $ t3) of
   996         ([], _) => NONE
   996         ([], _) => NONE
   997       | (ps, u) =>
   997       | (ps, u) =>
   998           let
   998           let
   999             val (gr1, qs) = foldl_map mk_code (gr, ps);
   999             val (qs, gr1) = fold_map mk_code ps gr;
  1000             val (gr2, pu) = Codegen.invoke_codegen thy defs dep thyname false (gr1, u);
  1000             val (pu, gr2) = Codegen.invoke_codegen thy defs dep thyname false u gr1;
  1001             val (gr3, pargs) = foldl_map
  1001             val (pargs, gr3) = fold_map
  1002               (Codegen.invoke_codegen thy defs dep thyname true) (gr2, ts)
  1002               (Codegen.invoke_codegen thy defs dep thyname true) ts gr2
  1003           in
  1003           in
  1004             SOME (gr3, Codegen.mk_app brack
  1004             SOME (Codegen.mk_app brack
  1005               (Pretty.blk (0, [Codegen.str "let ", Pretty.blk (0, List.concat
  1005               (Pretty.blk (0, [Codegen.str "let ", Pretty.blk (0, List.concat
  1006                   (separate [Codegen.str ";", Pretty.brk 1] (map (fn (pl, pr) =>
  1006                   (separate [Codegen.str ";", Pretty.brk 1] (map (fn (pl, pr) =>
  1007                     [Pretty.block [Codegen.str "val ", pl, Codegen.str " =",
  1007                     [Pretty.block [Codegen.str "val ", pl, Codegen.str " =",
  1008                        Pretty.brk 1, pr]]) qs))),
  1008                        Pretty.brk 1, pr]]) qs))),
  1009                 Pretty.brk 1, Codegen.str "in ", pu,
  1009                 Pretty.brk 1, Codegen.str "in ", pu,
  1010                 Pretty.brk 1, Codegen.str "end"])) pargs)
  1010                 Pretty.brk 1, Codegen.str "end"])) pargs, gr3)
  1011           end
  1011           end
  1012     end
  1012     end
  1013   | _ => NONE);
  1013   | _ => NONE);
  1014 
  1014 
  1015 fun split_codegen thy defs gr dep thyname brack t = (case strip_comb t of
  1015 fun split_codegen thy defs dep thyname brack t gr = (case strip_comb t of
  1016     (t1 as Const ("split", _), t2 :: ts) =>
  1016     (t1 as Const ("split", _), t2 :: ts) =>
  1017       (case strip_abs_split 1 (t1 $ t2) of
  1017       (case strip_abs_split 1 (t1 $ t2) of
  1018          ([p], u) =>
  1018          ([p], u) =>
  1019            let
  1019            let
  1020              val (gr1, q) = Codegen.invoke_codegen thy defs dep thyname false (gr, p);
  1020              val (q, gr1) = Codegen.invoke_codegen thy defs dep thyname false p gr;
  1021              val (gr2, pu) = Codegen.invoke_codegen thy defs dep thyname false (gr1, u);
  1021              val (pu, gr2) = Codegen.invoke_codegen thy defs dep thyname false u gr1;
  1022              val (gr3, pargs) = foldl_map
  1022              val (pargs, gr3) = fold_map
  1023                (Codegen.invoke_codegen thy defs dep thyname true) (gr2, ts)
  1023                (Codegen.invoke_codegen thy defs dep thyname true) ts gr2
  1024            in
  1024            in
  1025              SOME (gr2, Codegen.mk_app brack
  1025              SOME (Codegen.mk_app brack
  1026                (Pretty.block [Codegen.str "(fn ", q, Codegen.str " =>",
  1026                (Pretty.block [Codegen.str "(fn ", q, Codegen.str " =>",
  1027                  Pretty.brk 1, pu, Codegen.str ")"]) pargs)
  1027                  Pretty.brk 1, pu, Codegen.str ")"]) pargs, gr2)
  1028            end
  1028            end
  1029        | _ => NONE)
  1029        | _ => NONE)
  1030   | _ => NONE);
  1030   | _ => NONE);
  1031 
  1031 
  1032 in
  1032 in