src/HOL/Tools/BNF/bnf_comp.ML
changeset 56254 a2dd9200854d
parent 56018 c3fc8692dbc1
child 56634 a001337c8d24
equal deleted inserted replaced
56253:83b3c110f22d 56254:a2dd9200854d
   136     (* TODO: check olive = length inners > 0,
   136     (* TODO: check olive = length inners > 0,
   137                    forall inner from inners. ilive = live,
   137                    forall inner from inners. ilive = live,
   138                    forall inner from inners. idead = dead  *)
   138                    forall inner from inners. idead = dead  *)
   139 
   139 
   140     val (oDs, lthy1) = apfst (map TFree)
   140     val (oDs, lthy1) = apfst (map TFree)
   141       (Variable.invent_types (replicate odead HOLogic.typeS) lthy);
   141       (Variable.invent_types (replicate odead @{sort type}) lthy);
   142     val (Dss, lthy2) = apfst (map (map TFree))
   142     val (Dss, lthy2) = apfst (map (map TFree))
   143       (fold_map Variable.invent_types (map (fn n => replicate n HOLogic.typeS) ideads) lthy1);
   143       (fold_map Variable.invent_types (map (fn n => replicate n @{sort type}) ideads) lthy1);
   144     val (Ass, lthy3) = apfst (replicate ilive o map TFree)
   144     val (Ass, lthy3) = apfst (replicate ilive o map TFree)
   145       (Variable.invent_types (replicate ilive HOLogic.typeS) lthy2);
   145       (Variable.invent_types (replicate ilive @{sort type}) lthy2);
   146     val As = if ilive > 0 then hd Ass else [];
   146     val As = if ilive > 0 then hd Ass else [];
   147     val Ass_repl = replicate olive As;
   147     val Ass_repl = replicate olive As;
   148     val (Bs, names_lthy) = apfst (map TFree)
   148     val (Bs, names_lthy) = apfst (map TFree)
   149       (Variable.invent_types (replicate ilive HOLogic.typeS) lthy3);
   149       (Variable.invent_types (replicate ilive @{sort type}) lthy3);
   150     val Bss_repl = replicate olive Bs;
   150     val Bss_repl = replicate olive Bs;
   151 
   151 
   152     val ((((fs', Qs'), Asets), xs), _) = names_lthy
   152     val ((((fs', Qs'), Asets), xs), _) = names_lthy
   153       |> apfst snd o mk_Frees' "f" (map2 (curry op -->) As Bs)
   153       |> apfst snd o mk_Frees' "f" (map2 (curry op -->) As Bs)
   154       ||>> apfst snd o mk_Frees' "Q" (map2 mk_pred2T As Bs)
   154       ||>> apfst snd o mk_Frees' "Q" (map2 mk_pred2T As Bs)
   361     val nwits = nwits_of_bnf bnf;
   361     val nwits = nwits_of_bnf bnf;
   362 
   362 
   363     (* TODO: check 0 < n <= live *)
   363     (* TODO: check 0 < n <= live *)
   364 
   364 
   365     val (Ds, lthy1) = apfst (map TFree)
   365     val (Ds, lthy1) = apfst (map TFree)
   366       (Variable.invent_types (replicate dead HOLogic.typeS) lthy);
   366       (Variable.invent_types (replicate dead @{sort type}) lthy);
   367     val ((killedAs, As), lthy2) = apfst (`(take n) o map TFree)
   367     val ((killedAs, As), lthy2) = apfst (`(take n) o map TFree)
   368       (Variable.invent_types (replicate live HOLogic.typeS) lthy1);
   368       (Variable.invent_types (replicate live @{sort type}) lthy1);
   369     val (Bs, _(*lthy3*)) = apfst (append killedAs o map TFree)
   369     val (Bs, _(*lthy3*)) = apfst (append killedAs o map TFree)
   370       (Variable.invent_types (replicate (live - n) HOLogic.typeS) lthy2);
   370       (Variable.invent_types (replicate (live - n) @{sort type}) lthy2);
   371 
   371 
   372     val ((Asets, lives), _(*names_lthy*)) = lthy
   372     val ((Asets, lives), _(*names_lthy*)) = lthy
   373       |> mk_Frees "A" (map HOLogic.mk_setT (drop n As))
   373       |> mk_Frees "A" (map HOLogic.mk_setT (drop n As))
   374       ||>> mk_Frees "x" (drop n As);
   374       ||>> mk_Frees "x" (drop n As);
   375     val xs = map (fn T => HOLogic.choice_const T $ absdummy T @{term True}) killedAs @ lives;
   375     val xs = map (fn T => HOLogic.choice_const T $ absdummy T @{term True}) killedAs @ lives;
   460     val nwits = nwits_of_bnf bnf;
   460     val nwits = nwits_of_bnf bnf;
   461 
   461 
   462     (* TODO: check 0 < n *)
   462     (* TODO: check 0 < n *)
   463 
   463 
   464     val (Ds, lthy1) = apfst (map TFree)
   464     val (Ds, lthy1) = apfst (map TFree)
   465       (Variable.invent_types (replicate dead HOLogic.typeS) lthy);
   465       (Variable.invent_types (replicate dead @{sort type}) lthy);
   466     val ((newAs, As), lthy2) = apfst (chop n o map TFree)
   466     val ((newAs, As), lthy2) = apfst (chop n o map TFree)
   467       (Variable.invent_types (replicate (n + live) HOLogic.typeS) lthy1);
   467       (Variable.invent_types (replicate (n + live) @{sort type}) lthy1);
   468     val ((newBs, Bs), _(*lthy3*)) = apfst (chop n o map TFree)
   468     val ((newBs, Bs), _(*lthy3*)) = apfst (chop n o map TFree)
   469       (Variable.invent_types (replicate (n + live) HOLogic.typeS) lthy2);
   469       (Variable.invent_types (replicate (n + live) @{sort type}) lthy2);
   470 
   470 
   471     val (Asets, _(*names_lthy*)) = lthy
   471     val (Asets, _(*names_lthy*)) = lthy
   472       |> mk_Frees "A" (map HOLogic.mk_setT (newAs @ As));
   472       |> mk_Frees "A" (map HOLogic.mk_setT (newAs @ As));
   473 
   473 
   474     val T = mk_T_of_bnf Ds As bnf;
   474     val T = mk_T_of_bnf Ds As bnf;
   551 
   551 
   552     fun permute xs = permute_like_unique (op =) src dest xs;
   552     fun permute xs = permute_like_unique (op =) src dest xs;
   553     fun unpermute xs = permute_like_unique (op =) dest src xs;
   553     fun unpermute xs = permute_like_unique (op =) dest src xs;
   554 
   554 
   555     val (Ds, lthy1) = apfst (map TFree)
   555     val (Ds, lthy1) = apfst (map TFree)
   556       (Variable.invent_types (replicate dead HOLogic.typeS) lthy);
   556       (Variable.invent_types (replicate dead @{sort type}) lthy);
   557     val (As, lthy2) = apfst (map TFree)
   557     val (As, lthy2) = apfst (map TFree)
   558       (Variable.invent_types (replicate live HOLogic.typeS) lthy1);
   558       (Variable.invent_types (replicate live @{sort type}) lthy1);
   559     val (Bs, _(*lthy3*)) = apfst (map TFree)
   559     val (Bs, _(*lthy3*)) = apfst (map TFree)
   560       (Variable.invent_types (replicate live HOLogic.typeS) lthy2);
   560       (Variable.invent_types (replicate live @{sort type}) lthy2);
   561 
   561 
   562     val (Asets, _(*names_lthy*)) = lthy
   562     val (Asets, _(*names_lthy*)) = lthy
   563       |> mk_Frees "A" (map HOLogic.mk_setT (permute As));
   563       |> mk_Frees "A" (map HOLogic.mk_setT (permute As));
   564 
   564 
   565     val T = mk_T_of_bnf Ds As bnf;
   565     val T = mk_T_of_bnf Ds As bnf;
   755   let
   755   let
   756     val live = live_of_bnf bnf;
   756     val live = live_of_bnf bnf;
   757     val nwits = nwits_of_bnf bnf;
   757     val nwits = nwits_of_bnf bnf;
   758 
   758 
   759     val (As, lthy1) = apfst (map TFree)
   759     val (As, lthy1) = apfst (map TFree)
   760       (Variable.invent_types (replicate live HOLogic.typeS) (fold Variable.declare_typ Ds lthy));
   760       (Variable.invent_types (replicate live @{sort type}) (fold Variable.declare_typ Ds lthy));
   761     val (Bs, _) = apfst (map TFree)
   761     val (Bs, _) = apfst (map TFree)
   762       (Variable.invent_types (replicate live HOLogic.typeS) lthy1);
   762       (Variable.invent_types (replicate live @{sort type}) lthy1);
   763 
   763 
   764     val (((fs, fs'), (Rs, Rs')), _(*names_lthy*)) = lthy
   764     val (((fs, fs'), (Rs, Rs')), _(*names_lthy*)) = lthy
   765       |> mk_Frees' "f" (map2 (curry op -->) As Bs)
   765       |> mk_Frees' "f" (map2 (curry op -->) As Bs)
   766       ||>> mk_Frees' "R" (map2 mk_pred2T As Bs);
   766       ||>> mk_Frees' "R" (map2 mk_pred2T As Bs);
   767 
   767