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 |