TFL/tfl.ML
changeset 20088 bffda4cd0f79
parent 20062 60de4603e645
child 20155 da0505518e69
equal deleted inserted replaced
20087:979f012b5df3 20088:bffda4cd0f79
   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')