src/HOL/Tools/Predicate_Compile/predicate_compile_aux.ML
changeset 59058 a78612c67ec0
parent 59057 5b649fb2f2e1
child 59484 a130ae7a9398
equal deleted inserted replaced
59057:5b649fb2f2e1 59058:a78612c67ec0
   348       | split_arg_mode' m t =
   348       | split_arg_mode' m t =
   349         if eq_mode (m, Input) then (SOME t, NONE)
   349         if eq_mode (m, Input) then (SOME t, NONE)
   350         else if eq_mode (m, Output) then (NONE,  SOME t)
   350         else if eq_mode (m, Output) then (NONE,  SOME t)
   351         else raise Fail "split_map_mode: mode and term do not match"
   351         else raise Fail "split_map_mode: mode and term do not match"
   352   in
   352   in
   353     (pairself (map_filter I) o split_list) (map2 split_arg_mode' (strip_fun_mode mode) ts)
   353     (apply2 (map_filter I) o split_list) (map2 split_arg_mode' (strip_fun_mode mode) ts)
   354   end
   354   end
   355 
   355 
   356 (* splits mode and maps function to higher-order argument types *)
   356 (* splits mode and maps function to higher-order argument types *)
   357 fun split_map_modeT f mode Ts =
   357 fun split_map_modeT f mode Ts =
   358   let
   358   let
   366         end
   366         end
   367       | split_arg_mode' Input T = (SOME T, NONE)
   367       | split_arg_mode' Input T = (SOME T, NONE)
   368       | split_arg_mode' Output T = (NONE,  SOME T)
   368       | split_arg_mode' Output T = (NONE,  SOME T)
   369       | split_arg_mode' _ _ = raise Fail "split_modeT': mode and type do not match"
   369       | split_arg_mode' _ _ = raise Fail "split_modeT': mode and type do not match"
   370   in
   370   in
   371     (pairself (map_filter I) o split_list) (map2 split_arg_mode' (strip_fun_mode mode) Ts)
   371     (apply2 (map_filter I) o split_list) (map2 split_arg_mode' (strip_fun_mode mode) Ts)
   372   end
   372   end
   373 
   373 
   374 fun split_mode mode ts = split_map_mode (fn _ => fn _ => (NONE, NONE)) mode ts
   374 fun split_mode mode ts = split_map_mode (fn _ => fn _ => (NONE, NONE)) mode ts
   375 
   375 
   376 fun fold_map_aterms_prodT comb f (Type (@{type_name Product_Type.prod}, [T1, T2])) s =
   376 fun fold_map_aterms_prodT comb f (Type (@{type_name Product_Type.prod}, [T1, T2])) s =
   398           end
   398           end
   399       | split_arg_mode Input T = ([T], [])
   399       | split_arg_mode Input T = ([T], [])
   400       | split_arg_mode Output T = ([], [T])
   400       | split_arg_mode Output T = ([], [T])
   401       | split_arg_mode _ _ = raise Fail "split_modeT: mode and type do not match"
   401       | split_arg_mode _ _ = raise Fail "split_modeT: mode and type do not match"
   402   in
   402   in
   403     (pairself flat o split_list) (map2 split_arg_mode (strip_fun_mode mode) Ts)
   403     (apply2 flat o split_list) (map2 split_arg_mode (strip_fun_mode mode) Ts)
   404   end
   404   end
   405 
   405 
   406 fun string_of_mode mode =
   406 fun string_of_mode mode =
   407   let
   407   let
   408     fun string_of_mode1 Input = "i"
   408     fun string_of_mode1 Input = "i"