src/HOL/HOLCF/Tools/Domain/domain_constructors.ML
changeset 54895 515630483010
parent 54742 7a86358a3c0b
child 58112 8081087096ad
equal deleted inserted replaced
54894:cb9d981fa9a0 54895:515630483010
   225           val eqn = mk_eq (y, list_ccomb (con, vs))
   225           val eqn = mk_eq (y, list_ccomb (con, vs))
   226           val conj = foldr1 mk_conj (eqn :: map mk_defined nonlazy)
   226           val conj = foldr1 mk_conj (eqn :: map mk_defined nonlazy)
   227         in Library.foldr mk_ex (vs, conj) end
   227         in Library.foldr mk_ex (vs, conj) end
   228       val goal = mk_trp (foldr1 mk_disj (mk_undef y :: map one_con spec'))
   228       val goal = mk_trp (foldr1 mk_disj (mk_undef y :: map one_con spec'))
   229       (* first rules replace "y = bottom \/ P" with "rep$y = bottom \/ P" *)
   229       (* first rules replace "y = bottom \/ P" with "rep$y = bottom \/ P" *)
   230       fun tacs {context = ctxt, prems} = [
   230       fun tacs ctxt = [
   231           rtac (iso_locale RS @{thm iso.casedist_rule}) 1,
   231           rtac (iso_locale RS @{thm iso.casedist_rule}) 1,
   232           rewrite_goals_tac ctxt [mk_meta_eq (iso_locale RS @{thm iso.iso_swap})],
   232           rewrite_goals_tac ctxt [mk_meta_eq (iso_locale RS @{thm iso.iso_swap})],
   233           rtac thm3 1]
   233           rtac thm3 1]
   234     in
   234     in
   235       val nchotomy = prove thy con_betas goal tacs
   235       val nchotomy = prove thy con_betas goal (tacs o #context)
   236       val exhaust =
   236       val exhaust =
   237           (nchotomy RS @{thm exh_casedist0})
   237           (nchotomy RS @{thm exh_casedist0})
   238           |> rewrite_rule (Proof_Context.init_global thy) @{thms exh_casedists}
   238           |> rewrite_rule (Proof_Context.init_global thy) @{thms exh_casedists}
   239           |> Drule.zero_var_indexes
   239           |> Drule.zero_var_indexes
   240     end
   240     end
   270           fun one_strict v' =
   270           fun one_strict v' =
   271             let
   271             let
   272               val bottom = mk_bottom (fastype_of v')
   272               val bottom = mk_bottom (fastype_of v')
   273               val vs' = map (fn v => if v = v' then bottom else v) vs
   273               val vs' = map (fn v => if v = v' then bottom else v) vs
   274               val goal = mk_trp (mk_undef (list_ccomb (con, vs')))
   274               val goal = mk_trp (mk_undef (list_ccomb (con, vs')))
   275               val tacs = [simp_tac (Simplifier.global_context thy HOL_basic_ss addsimps rules) 1]
   275               fun tacs ctxt = [simp_tac (put_simpset HOL_basic_ss ctxt addsimps rules) 1]
   276             in prove thy con_betas goal (K tacs) end
   276             in prove thy con_betas goal (tacs o #context) end
   277         in map one_strict nonlazy end
   277         in map one_strict nonlazy end
   278 
   278 
   279       fun con_defin (con, args) =
   279       fun con_defin (con, args) =
   280         let
   280         let
   281           fun iff_disj (t, []) = HOLogic.mk_not t
   281           fun iff_disj (t, []) = HOLogic.mk_not t
   284           val lhs = mk_undef (list_ccomb (con, vs))
   284           val lhs = mk_undef (list_ccomb (con, vs))
   285           val rhss = map mk_undef nonlazy
   285           val rhss = map mk_undef nonlazy
   286           val goal = mk_trp (iff_disj (lhs, rhss))
   286           val goal = mk_trp (iff_disj (lhs, rhss))
   287           val rule1 = iso_locale RS @{thm iso.abs_bottom_iff}
   287           val rule1 = iso_locale RS @{thm iso.abs_bottom_iff}
   288           val rules = rule1 :: @{thms con_bottom_iff_rules}
   288           val rules = rule1 :: @{thms con_bottom_iff_rules}
   289           val tacs = [simp_tac (Simplifier.global_context thy HOL_ss addsimps rules) 1]
   289           fun tacs ctxt = [simp_tac (put_simpset HOL_ss ctxt addsimps rules) 1]
   290         in prove thy con_betas goal (K tacs) end
   290         in prove thy con_betas goal (tacs o #context) end
   291     in
   291     in
   292       val con_stricts = maps con_strict spec'
   292       val con_stricts = maps con_strict spec'
   293       val con_defins = map con_defin spec'
   293       val con_defins = map con_defin spec'
   294       val con_rews = con_stricts @ con_defins
   294       val con_rews = con_stricts @ con_defins
   295     end
   295     end
   315         let
   315         let
   316           val abs_below = iso_locale RS @{thm iso.abs_below}
   316           val abs_below = iso_locale RS @{thm iso.abs_below}
   317           val rules1 = abs_below :: @{thms sinl_below sinr_below spair_below up_below}
   317           val rules1 = abs_below :: @{thms sinl_below sinr_below spair_below up_below}
   318           val rules2 = @{thms up_defined spair_defined ONE_defined}
   318           val rules2 = @{thms up_defined spair_defined ONE_defined}
   319           val rules = rules1 @ rules2
   319           val rules = rules1 @ rules2
   320           val tacs = [asm_simp_tac (Simplifier.global_context thy simple_ss addsimps rules) 1]
   320           fun tacs ctxt = [asm_simp_tac (put_simpset simple_ss ctxt addsimps rules) 1]
   321         in map (fn c => pgterm mk_below c (K tacs)) cons' end
   321         in map (fn c => pgterm mk_below c (tacs o #context)) cons' end
   322       val injects =
   322       val injects =
   323         let
   323         let
   324           val abs_eq = iso_locale RS @{thm iso.abs_eq}
   324           val abs_eq = iso_locale RS @{thm iso.abs_eq}
   325           val rules1 = abs_eq :: @{thms sinl_eq sinr_eq spair_eq up_eq}
   325           val rules1 = abs_eq :: @{thms sinl_eq sinr_eq spair_eq up_eq}
   326           val rules2 = @{thms up_defined spair_defined ONE_defined}
   326           val rules2 = @{thms up_defined spair_defined ONE_defined}
   327           val rules = rules1 @ rules2
   327           val rules = rules1 @ rules2
   328           val tacs = [asm_simp_tac (Simplifier.global_context thy simple_ss addsimps rules) 1]
   328           fun tacs ctxt = [asm_simp_tac (put_simpset simple_ss ctxt addsimps rules) 1]
   329         in map (fn c => pgterm mk_eq c (K tacs)) cons' end
   329         in map (fn c => pgterm mk_eq c (tacs o #context)) cons' end
   330     end
   330     end
   331 
   331 
   332     (* prove distinctness of constructors *)
   332     (* prove distinctness of constructors *)
   333     local
   333     local
   334       fun map_dist (f : 'a -> 'a -> 'b) (xs : 'a list) : 'b list =
   334       fun map_dist (f : 'a -> 'a -> 'b) (xs : 'a list) : 'b list =
   348           val lhs = mk_below (list_ccomb (con1, vs1), list_ccomb (con2, vs2))
   348           val lhs = mk_below (list_ccomb (con1, vs1), list_ccomb (con2, vs2))
   349           val rhss = map mk_undef zs1
   349           val rhss = map mk_undef zs1
   350           val goal = mk_trp (iff_disj (lhs, rhss))
   350           val goal = mk_trp (iff_disj (lhs, rhss))
   351           val rule1 = iso_locale RS @{thm iso.abs_below}
   351           val rule1 = iso_locale RS @{thm iso.abs_below}
   352           val rules = rule1 :: @{thms con_below_iff_rules}
   352           val rules = rule1 :: @{thms con_below_iff_rules}
   353           val tacs = [simp_tac (Simplifier.global_context thy HOL_ss addsimps rules) 1]
   353           fun tacs ctxt = [simp_tac (put_simpset HOL_ss ctxt addsimps rules) 1]
   354         in prove thy con_betas goal (K tacs) end
   354         in prove thy con_betas goal (tacs o #context) end
   355       fun dist_eq (con1, args1) (con2, args2) =
   355       fun dist_eq (con1, args1) (con2, args2) =
   356         let
   356         let
   357           val (vs1, zs1) = get_vars args1
   357           val (vs1, zs1) = get_vars args1
   358           val (vs2, zs2) = get_vars args2 |> pairself (map prime)
   358           val (vs2, zs2) = get_vars args2 |> pairself (map prime)
   359           val lhs = mk_eq (list_ccomb (con1, vs1), list_ccomb (con2, vs2))
   359           val lhs = mk_eq (list_ccomb (con1, vs1), list_ccomb (con2, vs2))
   360           val rhss1 = map mk_undef zs1
   360           val rhss1 = map mk_undef zs1
   361           val rhss2 = map mk_undef zs2
   361           val rhss2 = map mk_undef zs2
   362           val goal = mk_trp (iff_disj2 (lhs, rhss1, rhss2))
   362           val goal = mk_trp (iff_disj2 (lhs, rhss1, rhss2))
   363           val rule1 = iso_locale RS @{thm iso.abs_eq}
   363           val rule1 = iso_locale RS @{thm iso.abs_eq}
   364           val rules = rule1 :: @{thms con_eq_iff_rules}
   364           val rules = rule1 :: @{thms con_eq_iff_rules}
   365           val tacs = [simp_tac (Simplifier.global_context thy HOL_ss addsimps rules) 1]
   365           fun tacs ctxt = [simp_tac (put_simpset HOL_ss ctxt addsimps rules) 1]
   366         in prove thy con_betas goal (K tacs) end
   366         in prove thy con_betas goal (tacs o #context) end
   367     in
   367     in
   368       val dist_les = map_dist dist_le spec'
   368       val dist_les = map_dist dist_le spec'
   369       val dist_eqs = map_dist dist_eq spec'
   369       val dist_eqs = map_dist dist_eq spec'
   370     end
   370     end
   371 
   371 
   516           val defs = case_beta :: con_betas
   516           val defs = case_beta :: con_betas
   517           val rules1 = @{thms strictify2 sscase2 sscase3 ssplit2 fup2 ID1}
   517           val rules1 = @{thms strictify2 sscase2 sscase3 ssplit2 fup2 ID1}
   518           val rules2 = @{thms con_bottom_iff_rules}
   518           val rules2 = @{thms con_bottom_iff_rules}
   519           val rules3 = @{thms cfcomp2 one_case2}
   519           val rules3 = @{thms cfcomp2 one_case2}
   520           val rules = abs_inverse :: rules1 @ rules2 @ rules3
   520           val rules = abs_inverse :: rules1 @ rules2 @ rules3
   521           val tacs = [asm_simp_tac (Simplifier.global_context thy beta_ss addsimps rules) 1]
   521           fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps rules) 1]
   522         in prove thy defs goal (K tacs) end
   522         in prove thy defs goal (tacs o #context) end
   523     in
   523     in
   524       val case_apps = map2 one_case spec fs
   524       val case_apps = map2 one_case spec fs
   525     end
   525     end
   526 
   526 
   527   in
   527   in
   584 
   584 
   585     (* prove selector strictness rules *)
   585     (* prove selector strictness rules *)
   586     val sel_stricts : thm list =
   586     val sel_stricts : thm list =
   587       let
   587       let
   588         val rules = rep_strict :: @{thms sel_strict_rules}
   588         val rules = rep_strict :: @{thms sel_strict_rules}
   589         val tacs = [simp_tac (Simplifier.global_context thy HOL_basic_ss addsimps rules) 1]
   589         fun tacs ctxt = [simp_tac (put_simpset HOL_basic_ss ctxt addsimps rules) 1]
   590         fun sel_strict sel =
   590         fun sel_strict sel =
   591           let
   591           let
   592             val goal = mk_trp (mk_strict sel)
   592             val goal = mk_trp (mk_strict sel)
   593           in
   593           in
   594             prove thy sel_defs goal (K tacs)
   594             prove thy sel_defs goal (tacs o #context)
   595           end
   595           end
   596       in
   596       in
   597         map sel_strict sel_consts
   597         map sel_strict sel_consts
   598       end
   598       end
   599 
   599 
   600     (* prove selector application rules *)
   600     (* prove selector application rules *)
   601     val sel_apps : thm list =
   601     val sel_apps : thm list =
   602       let
   602       let
   603         val defs = con_betas @ sel_defs
   603         val defs = con_betas @ sel_defs
   604         val rules = abs_inv :: @{thms sel_app_rules}
   604         val rules = abs_inv :: @{thms sel_app_rules}
   605         val tacs = [asm_simp_tac (Simplifier.global_context thy simple_ss addsimps rules) 1]
   605         fun tacs ctxt = [asm_simp_tac (put_simpset simple_ss ctxt addsimps rules) 1]
   606         fun sel_apps_of (i, (con, args: (bool * term option * typ) list)) =
   606         fun sel_apps_of (i, (con, args: (bool * term option * typ) list)) =
   607           let
   607           let
   608             val Ts : typ list = map #3 args
   608             val Ts : typ list = map #3 args
   609             val ns : string list = Datatype_Prop.make_tnames Ts
   609             val ns : string list = Datatype_Prop.make_tnames Ts
   610             val vs : term list = map Free (ns ~~ Ts)
   610             val vs : term list = map Free (ns ~~ Ts)
   615                 val xs = map snd (filter_out fst (nth_drop n vs'))
   615                 val xs = map snd (filter_out fst (nth_drop n vs'))
   616                 val assms = map (mk_trp o mk_defined) xs
   616                 val assms = map (mk_trp o mk_defined) xs
   617                 val concl = mk_trp (mk_eq (sel ` con_app, nth vs n))
   617                 val concl = mk_trp (mk_eq (sel ` con_app, nth vs n))
   618                 val goal = Logic.list_implies (assms, concl)
   618                 val goal = Logic.list_implies (assms, concl)
   619               in
   619               in
   620                 prove thy defs goal (K tacs)
   620                 prove thy defs goal (tacs o #context)
   621               end
   621               end
   622             fun one_diff (_, sel, T) =
   622             fun one_diff (_, sel, T) =
   623               let
   623               let
   624                 val goal = mk_trp (mk_eq (sel ` con_app, mk_bottom T))
   624                 val goal = mk_trp (mk_eq (sel ` con_app, mk_bottom T))
   625               in
   625               in
   626                 prove thy defs goal (K tacs)
   626                 prove thy defs goal (tacs o #context)
   627               end
   627               end
   628             fun one_con (j, (_, args')) : thm list =
   628             fun one_con (j, (_, args')) : thm list =
   629               let
   629               let
   630                 fun prep (_, (_, NONE, _)) = NONE
   630                 fun prep (_, (_, NONE, _)) = NONE
   631                   | prep (i, (_, SOME sel, T)) = SOME (i, sel, T)
   631                   | prep (i, (_, SOME sel, T)) = SOME (i, sel, T)
   645 
   645 
   646   (* prove selector definedness rules *)
   646   (* prove selector definedness rules *)
   647     val sel_defins : thm list =
   647     val sel_defins : thm list =
   648       let
   648       let
   649         val rules = rep_bottom_iff :: @{thms sel_bottom_iff_rules}
   649         val rules = rep_bottom_iff :: @{thms sel_bottom_iff_rules}
   650         val tacs = [simp_tac (Simplifier.global_context thy HOL_basic_ss addsimps rules) 1]
   650         fun tacs ctxt = [simp_tac (put_simpset HOL_basic_ss ctxt addsimps rules) 1]
   651         fun sel_defin sel =
   651         fun sel_defin sel =
   652           let
   652           let
   653             val (T, U) = dest_cfunT (fastype_of sel)
   653             val (T, U) = dest_cfunT (fastype_of sel)
   654             val x = Free ("x", T)
   654             val x = Free ("x", T)
   655             val lhs = mk_eq (sel ` x, mk_bottom U)
   655             val lhs = mk_eq (sel ` x, mk_bottom U)
   656             val rhs = mk_eq (x, mk_bottom T)
   656             val rhs = mk_eq (x, mk_bottom T)
   657             val goal = mk_trp (mk_eq (lhs, rhs))
   657             val goal = mk_trp (mk_eq (lhs, rhs))
   658           in
   658           in
   659             prove thy sel_defs goal (K tacs)
   659             prove thy sel_defs goal (tacs o #context)
   660           end
   660           end
   661         fun one_arg (false, SOME sel, _) = SOME (sel_defin sel)
   661         fun one_arg (false, SOME sel, _) = SOME (sel_defin sel)
   662           | one_arg _                    = NONE
   662           | one_arg _                    = NONE
   663       in
   663       in
   664         case spec2 of
   664         case spec2 of
   722           val lhs = dis ` list_ccomb (con, vs)
   722           val lhs = dis ` list_ccomb (con, vs)
   723           val rhs = if i = j then @{term TT} else @{term FF}
   723           val rhs = if i = j then @{term TT} else @{term FF}
   724           val assms = map (mk_trp o mk_defined) nonlazy
   724           val assms = map (mk_trp o mk_defined) nonlazy
   725           val concl = mk_trp (mk_eq (lhs, rhs))
   725           val concl = mk_trp (mk_eq (lhs, rhs))
   726           val goal = Logic.list_implies (assms, concl)
   726           val goal = Logic.list_implies (assms, concl)
   727           val tacs = [asm_simp_tac (Simplifier.global_context thy beta_ss addsimps case_rews) 1]
   727           fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps case_rews) 1]
   728         in prove thy dis_defs goal (K tacs) end
   728         in prove thy dis_defs goal (tacs o #context) end
   729       fun one_dis (i, dis) =
   729       fun one_dis (i, dis) =
   730           map_index (dis_app (i, dis)) spec
   730           map_index (dis_app (i, dis)) spec
   731     in
   731     in
   732       val dis_apps = flat (map_index one_dis dis_consts)
   732       val dis_apps = flat (map_index one_dis dis_consts)
   733     end
   733     end
   736     local
   736     local
   737       fun dis_defin dis =
   737       fun dis_defin dis =
   738         let
   738         let
   739           val x = Free ("x", lhsT)
   739           val x = Free ("x", lhsT)
   740           val simps = dis_apps @ @{thms dist_eq_tr}
   740           val simps = dis_apps @ @{thms dist_eq_tr}
   741           val tacs =
   741           fun tacs ctxt =
   742             [rtac @{thm iffI} 1,
   742             [rtac @{thm iffI} 1,
   743              asm_simp_tac (Simplifier.global_context thy HOL_basic_ss addsimps dis_stricts) 2,
   743              asm_simp_tac (put_simpset HOL_basic_ss ctxt addsimps dis_stricts) 2,
   744              rtac exhaust 1, atac 1,
   744              rtac exhaust 1, atac 1,
   745              ALLGOALS (asm_full_simp_tac (Simplifier.global_context thy simple_ss addsimps simps))]
   745              ALLGOALS (asm_full_simp_tac (put_simpset simple_ss ctxt addsimps simps))]
   746           val goal = mk_trp (mk_eq (mk_undef (dis ` x), mk_undef x))
   746           val goal = mk_trp (mk_eq (mk_undef (dis ` x), mk_undef x))
   747         in prove thy [] goal (K tacs) end
   747         in prove thy [] goal (tacs o #context) end
   748     in
   748     in
   749       val dis_defins = map dis_defin dis_consts
   749       val dis_defins = map dis_defin dis_consts
   750     end
   750     end
   751 
   751 
   752   in
   752   in
   811       fun match_strict mat =
   811       fun match_strict mat =
   812         let
   812         let
   813           val (T, (U, V)) = apsnd dest_cfunT (dest_cfunT (fastype_of mat))
   813           val (T, (U, V)) = apsnd dest_cfunT (dest_cfunT (fastype_of mat))
   814           val k = Free ("k", U)
   814           val k = Free ("k", U)
   815           val goal = mk_trp (mk_eq (mat ` mk_bottom T ` k, mk_bottom V))
   815           val goal = mk_trp (mk_eq (mat ` mk_bottom T ` k, mk_bottom V))
   816           val tacs = [asm_simp_tac (Simplifier.global_context thy beta_ss addsimps case_rews) 1]
   816           fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps case_rews) 1]
   817         in prove thy match_defs goal (K tacs) end
   817         in prove thy match_defs goal (tacs o #context) end
   818     in
   818     in
   819       val match_stricts = map match_strict match_consts
   819       val match_stricts = map match_strict match_consts
   820     end
   820     end
   821 
   821 
   822     (* prove match/constructor rules *)
   822     (* prove match/constructor rules *)
   830           val lhs = mat ` list_ccomb (con, vs) ` k
   830           val lhs = mat ` list_ccomb (con, vs) ` k
   831           val rhs = if i = j then list_ccomb (k, vs) else fail
   831           val rhs = if i = j then list_ccomb (k, vs) else fail
   832           val assms = map (mk_trp o mk_defined) nonlazy
   832           val assms = map (mk_trp o mk_defined) nonlazy
   833           val concl = mk_trp (mk_eq (lhs, rhs))
   833           val concl = mk_trp (mk_eq (lhs, rhs))
   834           val goal = Logic.list_implies (assms, concl)
   834           val goal = Logic.list_implies (assms, concl)
   835           val tacs = [asm_simp_tac (Simplifier.global_context thy beta_ss addsimps case_rews) 1]
   835           fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps case_rews) 1]
   836         in prove thy match_defs goal (K tacs) end
   836         in prove thy match_defs goal (tacs o #context) end
   837       fun one_match (i, mat) =
   837       fun one_match (i, mat) =
   838           map_index (match_app (i, mat)) spec
   838           map_index (match_app (i, mat)) spec
   839     in
   839     in
   840       val match_apps = flat (map_index one_match match_consts)
   840       val match_apps = flat (map_index one_match match_consts)
   841     end
   841     end