656 else (raw_induct RSN (2, rev_mp), [ind_case_names, RuleCases.consumes 1]); |
656 else (raw_induct RSN (2, rev_mp), [ind_case_names, RuleCases.consumes 1]); |
657 |
657 |
658 val (intrs', ctxt2) = |
658 val (intrs', ctxt2) = |
659 ctxt1 |> |
659 ctxt1 |> |
660 LocalTheory.notes |
660 LocalTheory.notes |
661 (map (NameSpace.append rec_name) intr_names ~~ |
661 (map (NameSpace.qualified rec_name) intr_names ~~ |
662 intr_atts ~~ |
662 intr_atts ~~ |
663 map (fn th => [([th], [])]) (ProofContext.export ctxt1 ctxt intrs)) |>> |
663 map (fn th => [([th], [])]) (ProofContext.export ctxt1 ctxt intrs)) |>> |
664 map (hd o snd); (* FIXME? *) |
664 map (hd o snd); (* FIXME? *) |
665 val (((_, elims'), (_, [induct'])), ctxt3) = |
665 val (((_, elims'), (_, [induct'])), ctxt3) = |
666 ctxt2 |> |
666 ctxt2 |> |
667 LocalTheory.note ((NameSpace.append rec_name "intros", []), intrs') ||>> |
667 LocalTheory.note ((NameSpace.qualified rec_name "intros", |
|
668 [Attrib.internal (ContextRules.intro_query NONE)]), intrs') ||>> |
668 fold_map (fn (name, (elim, cases)) => |
669 fold_map (fn (name, (elim, cases)) => |
669 LocalTheory.note ((NameSpace.append (Sign.base_name name) "cases", |
670 LocalTheory.note ((NameSpace.qualified (Sign.base_name name) "cases", |
670 [Attrib.internal (RuleCases.case_names cases), |
671 [Attrib.internal (RuleCases.case_names cases), |
671 Attrib.internal (RuleCases.consumes 1), |
672 Attrib.internal (RuleCases.consumes 1), |
672 Attrib.internal (InductAttrib.cases_set name)]), [elim]) #> |
673 Attrib.internal (InductAttrib.cases_set name), |
|
674 Attrib.internal (ContextRules.elim_query NONE)]), [elim]) #> |
673 apfst (hd o snd)) elims ||>> |
675 apfst (hd o snd)) elims ||>> |
674 LocalTheory.note ((NameSpace.append rec_name (coind_prefix coind ^ "induct"), |
676 LocalTheory.note ((NameSpace.qualified rec_name (coind_prefix coind ^ "induct"), |
675 map Attrib.internal (#2 induct)), [rulify (#1 induct)]); |
677 map Attrib.internal (#2 induct)), [rulify (#1 induct)]); |
676 |
678 |
677 val induct_att = if coind then InductAttrib.coinduct_set else InductAttrib.induct_set; |
679 val induct_att = if coind then InductAttrib.coinduct_set else InductAttrib.induct_set; |
678 val ctxt4 = if no_ind then ctxt3 else |
680 val ctxt4 = if no_ind then ctxt3 else |
679 let val inducts = cnames ~~ ProjectRule.projects ctxt (1 upto length cnames) induct' |
681 let val inducts = cnames ~~ ProjectRule.projects ctxt (1 upto length cnames) induct' |
681 ctxt3 |> |
683 ctxt3 |> |
682 LocalTheory.notes (inducts |> map (fn (name, th) => (("", |
684 LocalTheory.notes (inducts |> map (fn (name, th) => (("", |
683 [Attrib.internal ind_case_names, |
685 [Attrib.internal ind_case_names, |
684 Attrib.internal (RuleCases.consumes 1), |
686 Attrib.internal (RuleCases.consumes 1), |
685 Attrib.internal (induct_att name)]), [([th], [])]))) |> snd |> |
687 Attrib.internal (induct_att name)]), [([th], [])]))) |> snd |> |
686 LocalTheory.note ((NameSpace.append rec_name (coind_prefix coind ^ "inducts"), |
688 LocalTheory.note ((NameSpace.qualified rec_name (coind_prefix coind ^ "inducts"), |
687 [Attrib.internal ind_case_names, |
689 [Attrib.internal ind_case_names, |
688 Attrib.internal (RuleCases.consumes 1)]), map snd inducts) |> snd |
690 Attrib.internal (RuleCases.consumes 1)]), map snd inducts) |> snd |
689 end; |
691 end; |
690 |
692 |
691 val result = |
693 val result = |