292 | S.LAMB _ => raise TFL_ERR "FV_multiset" "lambda"; |
292 | S.LAMB _ => raise TFL_ERR "FV_multiset" "lambda"; |
293 |
293 |
294 fun no_repeat_vars thy pat = |
294 fun no_repeat_vars thy pat = |
295 let fun check [] = true |
295 let fun check [] = true |
296 | check (v::rst) = |
296 | check (v::rst) = |
297 if mem_term (v,rst) then |
297 if member (op aconv) rst v then |
298 raise TFL_ERR "no_repeat_vars" |
298 raise TFL_ERR "no_repeat_vars" |
299 (quote (#1 (dest_Free v)) ^ |
299 (quote (#1 (dest_Free v)) ^ |
300 " occurs repeatedly in the pattern " ^ |
300 " occurs repeatedly in the pattern " ^ |
301 quote (string_of_cterm (Thry.typecheck thy pat))) |
301 quote (string_of_cterm (Thry.typecheck thy pat))) |
302 else check rst |
302 else check rst |
332 val dummy = map (no_repeat_vars thy) pats |
332 val dummy = map (no_repeat_vars thy) pats |
333 val rows = ListPair.zip (map (fn x => ([]:term list,[x])) pats, |
333 val rows = ListPair.zip (map (fn x => ([]:term list,[x])) pats, |
334 map (fn (t,i) => (t,(i,true))) (enumerate R)) |
334 map (fn (t,i) => (t,(i,true))) (enumerate R)) |
335 val names = foldr add_term_names [] R |
335 val names = foldr add_term_names [] R |
336 val atype = type_of(hd pats) |
336 val atype = type_of(hd pats) |
337 and aname = variant names "a" |
337 and aname = Name.variant names "a" |
338 val a = Free(aname,atype) |
338 val a = Free(aname,atype) |
339 val ty_info = Thry.match_info thy |
339 val ty_info = Thry.match_info thy |
340 val ty_match = Thry.match_type thy |
340 val ty_match = Thry.match_type thy |
341 val range_ty = type_of (hd R) |
341 val range_ty = type_of (hd R) |
342 val (patts, case_tm) = mk_case ty_info ty_match (aname::names) range_ty |
342 val (patts, case_tm) = mk_case ty_info ty_match (aname::names) range_ty |
493 else () |
493 else () |
494 val (case_rewrites,context_congs) = extraction_thms thy |
494 val (case_rewrites,context_congs) = extraction_thms thy |
495 val tych = Thry.typecheck thy |
495 val tych = Thry.typecheck thy |
496 val WFREC_THM0 = R.ISPEC (tych functional) Thms.WFREC_COROLLARY |
496 val WFREC_THM0 = R.ISPEC (tych functional) Thms.WFREC_COROLLARY |
497 val Const("All",_) $ Abs(Rname,Rtype,_) = concl WFREC_THM0 |
497 val Const("All",_) $ Abs(Rname,Rtype,_) = concl WFREC_THM0 |
498 val R = Free (variant (foldr add_term_names [] eqns) Rname, |
498 val R = Free (Name.variant (foldr add_term_names [] eqns) Rname, |
499 Rtype) |
499 Rtype) |
500 val WFREC_THM = R.ISPECL [tych R, tych g] WFREC_THM0 |
500 val WFREC_THM = R.ISPECL [tych R, tych g] WFREC_THM0 |
501 val ([proto_def, WFR],_) = S.strip_imp(concl WFREC_THM) |
501 val ([proto_def, WFR],_) = S.strip_imp(concl WFREC_THM) |
502 val dummy = |
502 val dummy = |
503 if !trace then |
503 if !trace then |
694 let val tych = Thry.typecheck thy |
694 let val tych = Thry.typecheck thy |
695 val ty_info = Thry.induct_info thy |
695 val ty_info = Thry.induct_info thy |
696 in fn pats => |
696 in fn pats => |
697 let val names = foldr add_term_names [] pats |
697 let val names = foldr add_term_names [] pats |
698 val T = type_of (hd pats) |
698 val T = type_of (hd pats) |
699 val aname = Term.variant names "a" |
699 val aname = Name.variant names "a" |
700 val vname = Term.variant (aname::names) "v" |
700 val vname = Name.variant (aname::names) "v" |
701 val a = Free (aname, T) |
701 val a = Free (aname, T) |
702 val v = Free (vname, T) |
702 val v = Free (vname, T) |
703 val a_eq_v = HOLogic.mk_eq(a,v) |
703 val a_eq_v = HOLogic.mk_eq(a,v) |
704 val ex_th0 = R.EXISTS (tych (S.mk_exists{Bvar=v,Body=a_eq_v}), tych a) |
704 val ex_th0 = R.EXISTS (tych (S.mk_exists{Bvar=v,Body=a_eq_v}), tych a) |
705 (R.REFL (tych a)) |
705 (R.REFL (tych a)) |
845 let val tych = Thry.typecheck thy |
845 let val tych = Thry.typecheck thy |
846 val Sinduction = R.UNDISCH (R.ISPEC (tych R) Thms.WF_INDUCTION_THM) |
846 val Sinduction = R.UNDISCH (R.ISPEC (tych R) Thms.WF_INDUCTION_THM) |
847 val (pats,TCsl) = ListPair.unzip pat_TCs_list |
847 val (pats,TCsl) = ListPair.unzip pat_TCs_list |
848 val case_thm = complete_cases thy pats |
848 val case_thm = complete_cases thy pats |
849 val domain = (type_of o hd) pats |
849 val domain = (type_of o hd) pats |
850 val Pname = Term.variant (foldr (Library.foldr add_term_names) |
850 val Pname = Name.variant (foldr (Library.foldr add_term_names) |
851 [] (pats::TCsl)) "P" |
851 [] (pats::TCsl)) "P" |
852 val P = Free(Pname, domain --> HOLogic.boolT) |
852 val P = Free(Pname, domain --> HOLogic.boolT) |
853 val Sinduct = R.SPEC (tych P) Sinduction |
853 val Sinduct = R.SPEC (tych P) Sinduction |
854 val Sinduct_assumf = S.rand ((#ant o S.dest_imp o concl) Sinduct) |
854 val Sinduct_assumf = S.rand ((#ant o S.dest_imp o concl) Sinduct) |
855 val Rassums_TCl' = map (build_ih fconst (P,SV)) pat_TCs_list |
855 val Rassums_TCl' = map (build_ih fconst (P,SV)) pat_TCs_list |
856 val (Rassums,TCl') = ListPair.unzip Rassums_TCl' |
856 val (Rassums,TCl') = ListPair.unzip Rassums_TCl' |
857 val Rinduct_assum = R.ASSUME (tych (S.list_mk_conj Rassums)) |
857 val Rinduct_assum = R.ASSUME (tych (S.list_mk_conj Rassums)) |
858 val cases = map (fn pat => Term.betapply (Sinduct_assumf, pat)) pats |
858 val cases = map (fn pat => Term.betapply (Sinduct_assumf, pat)) pats |
859 val tasks = U.zip3 cases TCl' (R.CONJUNCTS Rinduct_assum) |
859 val tasks = U.zip3 cases TCl' (R.CONJUNCTS Rinduct_assum) |
860 val proved_cases = map (prove_case fconst thy) tasks |
860 val proved_cases = map (prove_case fconst thy) tasks |
861 val v = Free (variant (foldr add_term_names [] (map concl proved_cases)) |
861 val v = Free (Name.variant (foldr add_term_names [] (map concl proved_cases)) |
862 "v", |
862 "v", |
863 domain) |
863 domain) |
864 val vtyped = tych v |
864 val vtyped = tych v |
865 val substs = map (R.SYM o R.ASSUME o tych o (curry HOLogic.mk_eq v)) pats |
865 val substs = map (R.SYM o R.ASSUME o tych o (curry HOLogic.mk_eq v)) pats |
866 val proved_cases1 = ListPair.map (fn (th,th') => R.SUBS[th]th') |
866 val proved_cases1 = ListPair.map (fn (th,th') => R.SUBS[th]th') |