Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/Archive-of-Formal-Proofs/thys/Valuation/   (Sammlung formaler Beweise Version 2026-5©)  Datei vom 29.4.2026 mit Größe 216 kB image not shown  

SSL Valuation3.thy

  Sprache: Isabelle
 

(**        Valuation3  
                            author Hidetsune Kobayashi
                            Group You Santo
                            Department of Mathematics
                            Nihon University
                            h_coba@math.cst.nihon-u.ac.jp
                            June 24, 2005
                            July 20, 2007

   chapter 1. elementary properties of a valuation
     section 9. completion 
      subsection Hensel's theorem
   **)


theory Valuation3 
imports Valuation2
begin

section "Completion"

textIn this section we formalize "completion" of the ground field K

definition
  limit :: "[_, 'b ==> ant, nat ==> 'b, 'b]
           ==> bool" ((4lim_ _ _ _) [90,90,90,91]90where
  "lim v f b (N. M. (n. M < n
                ((f n) ± (-a b)) (vp K v)(Vr K v) (an N)))"

(* In this definition, f represents a sequence of elements of K, which is
   converging to b. Key lemmas of this section are n_value_x_1 and
   n_value_x_2 *)
 


lemma not_in_singleton_noneq:"x {a} ==> x a"
apply simp
done   (* later move this lemma to Algebra1 *) 

lemma noneq_not_in_singleton:"x a ==> x {a}"
apply simp
done

lemma inf_neq_1[simp]:" 1"
by (simp only:ant_1[THEN sym], rule z_neq_inf[THEN not_sym, of 1])

lemma a1_neq_0[simp]:"(1::ant) 0"
by (simp only:an_1[THEN sym], simp only:an_0[THEN sym],
    subst aneq_natneq[of 1 0], simp)

lemma a1_poss[simp]:"(0::ant) < 1"
by (cut_tac zposs_aposss[of 1], simp)

lemma a_p1_gt[simp]:"[a ; a -] ==> a < a + 1"
apply (cut_tac aadd_poss_less[of a 1],
       simp add:aadd_commute, assumption+) 
apply simp
done

lemma (in Corps) vpr_pow_inter_zero:"valuation K v ==>
      ( {I. n. I = (vp K v)Vr K v) (an n)}) = {0}"
apply (frule Vr_ring[of v], frule vp_ideal[of v])
apply (rule equalityI) 
defer
 apply (rule subsetI)
 apply simp
 apply (rule allI, rule impI, erule exE, simp)
 apply (cut_tac n = "an n" in vp_apow_ideal[of v], assumption+)
 apply simp
 apply (cut_tac I = "(vp K v)(Vr K v) (an n)" in  Ring.ideal_zero[of "Vr K v"],
        assumption+)
 apply (simp add:Vr_0_f_0)

apply (rule subsetI, simp) 
 apply (rule contrapos_pp, simp+)
 apply (subgoal_tac "x vp K v")
 prefer 2 
 apply (drule_tac x = "vp K v(Vr K v) (an 1)" in spec)
 apply (subgoal_tac "n. vp K v(Vr K v) (an (Suc 0)) = vp K v(Vr K v) (an n)"
        simp,
        thin_tac " n. vp K v(Vr K v) (an (Suc 0)) = vp K v(Vr K v) (an n)")
 apply (simp add:r_apow_def an_def) 
 apply (simp only:na_1)
  apply (simp only:Ring.idealpow_1_self[of "Vr K v" "vp K v"])

  apply blast

apply (frule n_val_valuation[of v])

apply (frule_tac x = x in val_nonzero_z[of "n_val K v"],
       frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"],
       assumption+,
       simp add:Vr_mem_f_mem, assumption+) apply (
       frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"],
       simp add:Vr_mem_f_mem, assumption+)
apply (cut_tac x = x in val_pos_mem_Vr[of v], assumption) apply(
       simp add:Vr_mem_f_mem, simp) 
       apply (frule_tac x = x in val_pos_n_val_pos[of v],
       simp add:Vr_mem_f_mem, simp)
apply (cut_tac x = "n_val K v x" and y = 1 in aadd_pos_poss, assumption+,
       simp) apply (frule_tac y = "n_val K v x + 1" in aless_imp_le[of 0])
apply (cut_tac x1 = x and n1 = "(n_val K v x) + 1" in n_val_n_pow[THEN sym, 
       of v], assumption+) 
apply (drule_tac a = "vp K v(Vr K v) (n_val K v x + 1)" in forall_spec)
apply (erule exE, simp)
apply (simp only:ant_1[THEN sym] a_zpz,
       cut_tac z = "z + 1" in z_neq_inf)
 apply (subst an_na[THEN sym], assumption+, blast)
 apply simp
 apply (cut_tac a = "n_val K v x" in a_p1_gt)
 apply (erule exE, simp only:ant_1[THEN sym], simp only:a_zpz z_neq_inf)
 apply (cut_tac i = "z + 1" and j = z in ale_zle, simp)
 apply (erule exE, simp add:z_neq_minf)
 apply (cut_tac y1 = "n_val K v x" and x1 = "n_val K v x + 1" in 
        aneg_le[THEN sym], simp)
done 

lemma (in Corps) limit_diff_n_val:"[b carrier K; j. f j carrier K;
      valuation K v] ==> (lim v f b) = (N. M. n. M < n
       (an N) (n_val K v ((f n) ± (-a b))))" 
apply (rule iffI)
apply (rule allI)
apply (simp add:limit_def) apply (rotate_tac -1)
 apply (drule_tac x = N in spec)
 apply (erule exE)
apply (subgoal_tac "n>M. (an N) (n_val K v (f n ± (-a b)))")
apply blast
 apply (rule allI, rule impI) apply (rotate_tac -2)
 apply (drule_tac x = n in spec, simp) 
 apply (rule n_value_x_1[of v], assumption+,
        simp add:an_nat_pos, assumption)

apply (simp add:limit_def)
 apply (rule allI, rotate_tac -1, drule_tac x = N in spec)

 apply (erule exE)
 apply (subgoal_tac "n>M. f n ± (-a b) vp K v Vr K v) (an N)")
 apply blast
apply (rule allI, rule impI)
apply (rotate_tac -2, drule_tac x = n in spec, simp)
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (rule_tac x = "f n ± -a b" and n = "an N" in n_value_x_2[of "v"],
        assumption+) 
 apply (subst val_pos_mem_Vr[THEN sym, of "v"], assumption+)
 apply (drule_tac x = n in spec)
 apply (rule aGroup.ag_pOp_closed[of "K"], assumption+)
 apply (simp add:aGroup.ag_mOp_closed)
 apply (subst val_pos_n_val_pos[of  "v"], assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption+) apply simp
 apply (simp add:aGroup.ag_mOp_closed)
 apply (rule_tac j = "an N" and k = "n_val K v ( f n ± -a b)" in 
        ale_trans[of "0"], simp, assumption+)   
        apply simp 
done

lemma (in Corps) an_na_Lv:"valuation K v ==> an (na (Lv K v)) = Lv K v" 
apply (frule Lv_pos[of "v"])
apply (frule aless_imp_le[of "0" "Lv K v"])
apply (frule apos_neq_minf[of "Lv K v"])
apply (frule Lv_z[of "v"], erule exE)
apply (rule an_na)
 apply (rule contrapos_pp, simp+)
done

lemma (in Corps) limit_diff_val:"[b carrier K; j. f j carrier K;
      valuation K v] ==> (lim v f b) = (N. M. n. M < n
             (an N) (v ((f n) ± (-a b))))" 
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp add:limit_diff_n_val[of "b" "f" "v"])
apply (rule iffI)
 apply (rule allI,
   rotate_tac -1, drule_tac x = N in spec, erule exE) 
 apply (subgoal_tac "n > M. an N v( f n ± -a b)", blast)
 apply (rule allI, rule impI)
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec, simp) 
 apply (frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
     frule_tac x = "f n" and y = "-a b" in aGroup.ag_pOp_closed, assumption+)
 apply (frule_tac x = "f n ± -a b" in n_val_le_val[of "v"], 
         assumption+)
 apply (cut_tac n = N in an_nat_pos)
 apply (frule_tac j = "an N" and k = "n_val K v ( f n ± -a b)" in 
                   ale_trans[of "0"], assumption+)
 apply (subst val_pos_n_val_pos, assumption+)
 apply (rule_tac i = "an N" and j = "n_val K v ( f n ± -a b)" and 
        k = "v ( f n ± -a b)" in ale_trans, assumption+)
 apply (rule allI)
 apply (rotate_tac 3, drule_tac x = "N * (na (Lv K v))" in spec)
 apply (erule exE)
 apply (subgoal_tac "n. M < n (an N) n_val K v (f n ± -a b)", blast)
 apply (rule allI, rule impI)
 apply (rotate_tac -2, drule_tac x = n in spec, simp)

  apply (drule_tac x = n in spec)
  apply (frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
      frule_tac x = "f n" and y = "-a b" in aGroup.ag_pOp_closed, assumption+)
 apply (cut_tac n = "N * na (Lv K v)" in an_nat_pos)
 apply (frule_tac i = 0 and j = "an (N * na (Lv K v))" and 
                  k = "v ( f n ± -a b)" in ale_trans, assumption+)
 apply (simp add:amult_an_an, simp add:an_na_Lv)
 apply (frule Lv_pos[of "v"])
 apply (frule_tac x1 = "f n ± -a b" in n_val[THEN sym, of v], 
        assumption+, simp)
 apply (frule Lv_z[of v], erule exE, simp)
 apply (simp add:amult_pos_mono_r)
done

textuniqueness of the limit is derived from vp_pow_inter_zero
lemma (in Corps) limit_unique:"[b carrier K; j. f j carrier K;
      valuation K v; c carrier K; lim v f b; lim v f c] ==> b = c" 
apply (rule contrapos_pp, simp+, simp add:limit_def,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp add:aGroup.ag_neq_diffnonzero[of "K" "b" "c"], 
       frule vpr_pow_inter_zero[THEN sym, of v], 
       frule noneq_not_in_singleton[of "b ± -a c" "0"])
apply simp
apply (rotate_tac -1, erule exE, erule conjE)
apply (erule exE, simp, thin_tac "x = (vp K v)Vr K v) (an n)")
apply (rotate_tac 3, drule_tac x = n in spec,
       erule exE,
       drule_tac x = n in spec,
       erule exE)
apply (rename_tac x N M1 M2)
apply (subgoal_tac "M1 < Suc (max M1 M2)",
       subgoal_tac "M2 < Suc (max M1 M2)",
       drule_tac x = "Suc (max M1 M2)" in spec,
       drule_tac x = "Suc (max M1 M2)" in spec,
       drule_tac x = "Suc (max M1 M2)" in spec)
 apply simp

(* We see (f (Suc (max xb xc)) +\<^sub>K -\<^sub>K b) +\<^sub>K (-\<^sub>K (f (Suc (max xb xc)) +\<^sub>K -\<^sub>K c)) \<in> vpr K G a i v \<^bsup>\<diamondsuit>Vr K G a i v xa\<^esup>" *) 
 apply (frule_tac n = "an N" in vp_apow_ideal[of "v"], 
       frule_tac x = "f (Suc (max M1 M2)) ± -a b" and N = "an N" in 
       mem_vp_apow_mem_Vr[of "v"], simp,
       frule Vr_ring[of "v"],  simp, simp)
      
apply (frule Vr_ring[of "v"], 
       frule_tac I = "vp K vVr K v) (an N)" and x = "f (Suc (max M1 M2)) ± -a b"
       in Ring.ideal_inv1_closed[of "Vr K v"], assumption+)
 (** mOp of Vring and that of K is the same **)
apply (frule_tac I = "vp K vVr K v) (an N)" and h = "f (Suc (max M1 M2)) ± -a b"
 in Ring.ideal_subset[of "Vr K v"], assumption+)
 apply (simp add:Vr_mOp_f_mOp,
        cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
        simp add:aGroup.ag_p_inv, simp add:aGroup.ag_inv_inv)
 (** addition of  -\<^sub>K f (Suc (max xb xc)) +\<^sub>K b  and f (Suc (max xb xc)) +\<^sub>K -\<^sub>K c
    is included in vpr K G a i v \<^bsup>\<diamondsuit>(Vr K G a i v) xa\<^esup> **)

 apply (frule_tac  I = "vp K vVr K v) (an N)" and x = 
 "-a (f (Suc (max M1 M2))) ± b " and y = "f (Suc (max M1 M2)) ± (-a c)" in 
  Ring.ideal_pOp_closed[of "Vr K v"], assumption+)
 apply (frule_tac x = "f (Suc (max M1 M2)) ± -a c" and N = "an N" in 
        mem_vp_apow_mem_Vr[of v], simp, assumption,
        frule_tac x = "-a (f (Suc (max M1 M2))) ± b" and N = "an N" in 
        mem_vp_apow_mem_Vr[of "v"], simp,
        simp add:Vr_pOp_f_pOp, simp add:Vr_pOp_f_pOp,
   frule aGroup.ag_mOp_closed[of "K" "c"], assumption+,
   frule_tac x = "f (Suc (max M1 M2))" in aGroup.ag_mOp_closed[of "K"], 
      assumption+,
   frule_tac x = "f (Suc (max M1 M2))" and y = "-a c" in 
      aGroup.ag_pOp_closed[of "K"], assumption+) 

apply (simp add:aGroup.ag_pOp_assoc[of "K" _ "b" _],
       simp add:aGroup.ag_pOp_assoc[THEN sym, of "K" "b" _ "-a c"],
       simp add:aGroup.ag_pOp_commute[of "K" "b"],
       simp add:aGroup.ag_pOp_assoc[of "K" _ "b" "-a c"],
       frule aGroup.ag_pOp_closed[of "K" "b" "-a c"], assumption+,
       simp add:aGroup.ag_pOp_assoc[THEN sym, of "K" _ _ "b ± -a c"],
       simp add:aGroup.ag_l_inv1, simp add:aGroup.ag_l_zero)
apply (simp add:aGroup.ag_pOp_commute[of "K" _ "b"])
apply arith apply arith
done


(** The following lemma will be used to prove lemma limit_t. This lemma and
 them next lemma show that the valuation v is continuous (see lemma 
 n_val **)
 
lemma (in Corps) limit_n_val:"[b carrier K; b 0; valuation K v;
       j. f j carrier K; lim v f b] ==>
       N. (m. N < m (n_val K v) (f m) = (n_val K v) b)"
apply (simp add:limit_def)
apply (frule n_val_valuation[of "v"])
apply (frule val_nonzero_z[of "n_val K v" "b"], assumption+, erule exE,
       rename_tac L)
apply (rotate_tac -3, drule_tac x = "nat (abs L + 1)" in spec)
apply (erule exE, rename_tac M)

    (* |L| + 1 \<le> (n_val K v ( f n +\<^sub>K -\<^sub>K b)). *) 
 apply (subgoal_tac "n. M < n n_val K v (f n) = n_val K v b", blast)
 apply (rule allI, rule impI) 
 apply (rotate_tac -2
        drule_tac x = n in spec,
        simp)
apply (frule_tac x = "f n ± -a b" and n = "an (nat (L + 1))" in 
       n_value_x_1[of "v"],
       thin_tac "f n ± -a b vp K vVr K v) (an (nat (L + 1)))")
apply (simp add:an_def) 
 apply (simp add: zpos_apos [symmetric])
 apply assumption

 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (frule aGroup.ag_mOp_closed[of "K" "b"], assumption+)
 
 apply (drule_tac x = n in spec, 
        frule_tac x = "f n" in aGroup.ag_pOp_closed[of "K" _ "-a b"], 
        assumption+,  
        frule_tac x = "b" and y = "(f n) ± (-a b)" in value_less_eq[of 
        "n_val K v"], assumption+)
 apply simp 
 apply (rule_tac x = "ant L" and y = "an (nat (L + 1))" and 
        z = "n_val K v ( f n ± -a b)" in aless_le_trans)
 apply (subst an_def)
 apply (subst aless_zless) apply arith apply assumption+
 apply (simp add:aGroup.ag_pOp_commute[of "K" "b"])
 apply (simp add:aGroup.ag_pOp_assoc) apply (simp add:aGroup.ag_l_inv1)
 apply (simp add:aGroup.ag_r_zero)
done 

lemma (in Corps) limit_val:"[b carrier K; b 0; j. f j carrier K;
      valuation K v; lim v f b] ==> N. (n. N < n v (f n) = v b)"
apply (frule limit_n_val[of "b" "v" "f"], assumption+)
 apply (erule exE)
 apply (subgoal_tac "m. N < m v (f m) = v b")
 apply blast
apply (rule allI, rule impI)
 apply (drule_tac x = m in spec)
 apply (drule_tac x = m in spec)
  apply simp
 apply (frule Lv_pos[of "v"])
 apply (simp add:n_val[THEN sym, of "v"])
done

lemma (in Corps) limit_val_infinity:"[valuation K v; j. f j carrier K;
      lim v f 0] ==> N.(M. (m. M < m (an N) (n_val K v (f m))))"
apply (simp add:limit_def)
 apply (rule allI)
 apply (drule_tac x = N in spec, 
        erule exE)
       
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        simp only:aGroup.ag_inv_zero[of "K"], simp only:aGroup.ag_r_zero)
apply (subgoal_tac "n. M < n an N n_val K v (f n)", blast)

 apply (rule allI, rule impI)
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec, simp)
 apply (simp add:n_value_x_1)
done

lemma (in Corps) not_limit_zero:"[valuation K v; j. f j carrier K;
      ¬ (lim v f 0)] ==> N.(M. (m. (M < m)
                                    ((n_val K v) (f m)) < (an N)))"
apply (simp add:limit_def)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (simp add:aGroup.ag_inv_zero aGroup.ag_r_zero)
apply (erule exE)
 apply (case_tac "N = 0", simp add:r_apow_def) 
 apply (subgoal_tac "M. n. M < n n_val K v (f n) < (an 0)"apply blast
 apply (rule allI, 
        rotate_tac 4, frule_tac x = M in spec,
        erule exE, erule conjE)
 apply (frule_tac x1 = "f n" in val_pos_mem_Vr[THEN sym, of "v"]) apply simp 
 apply simp
 apply (frule_tac x = "f n" in val_pos_n_val_pos[of "v"])
 apply simp apply simp apply (thin_tac "¬ 0 v (f n)")
 apply (simp add:aneg_le) apply blast

apply (simp)
 apply (subgoal_tac "n. ((f n) vp K v(Vr K v) (an N)) =
                                ((an N) n_val K v (f n))")
 apply simp
 apply (thin_tac "n. (f n vp K v(Vr K v) (an N)) = (an N n_val K v (f n))")
 apply (simp add:aneg_le) apply blast

apply (rule allI)
 apply (thin_tac "M. n. M < n f n vp K v(Vr K v) (an N)")
 apply (rule iffI)
 apply (frule_tac x1 = "f n" and n1 = "an N" in n_val_n_pow[THEN sym, of v])
 apply (rule_tac N = "an N" and x = "f n" in mem_vp_apow_mem_Vr[of v],
        assumption+, simp, assumption, simp, simp)
 apply (frule_tac x = "f n" and n = "an N" in n_val_n_pow[of "v"])
 apply (frule_tac x1 = "f n" in val_pos_mem_Vr[THEN sym, of "v"])
 apply simp
 apply (cut_tac n = N in an_nat_pos) 
 apply (frule_tac j = "an N" and k = "n_val K v (f n)" in ale_trans[of "0"],
         assumption+)
 apply (frule_tac x1 = "f n" in val_pos_n_val_pos[THEN sym, of "v"]) 
 apply simp+ 
done

lemma (in Corps) limit_p:"[valuation K v; j. f j carrier K;
   j. g j carrier K; b carrier K; c carrier K; lim v f b; lim v g c]
   ==> lim v (λj. (f j) ± (g j)) (b ± c)"
apply (simp add:limit_def)
 apply (rule allI) apply (rotate_tac 3,
       drule_tac x = N in spec,
       drule_tac x = N in spec,
       (erule exE)+) 
 apply (frule_tac x = M and y = Ma in two_inequalities, simp,
        subgoal_tac "n > (max M Ma). (f n) ± (g n) ± -a (b ± c)
         (vp K v)Vr K v) (an N)")
 apply (thin_tac "n. Ma < n
                     g n ± -a c (vp K v)Vr K v) (an N)",
        thin_tac "n. M < n
                      f n ± -a b (vp K v)Vr K v) (an N)", blast)
 apply (frule Vr_ring[of v], 
        frule_tac n = "an N" in vp_apow_ideal[of v])
apply simp 
 apply (rule allI, rule impI)
 apply (thin_tac "n>M. f n ± -a b vp K v(Vr K v) (an N)",
        thin_tac "n>Ma. g n ± -a c vp K v(Vr K v) (an N)",
        frule_tac I = "vp K vVr K v) (an N)" and x = "f n ± -a b" 
        and y = "g n ± -a c" in Ring.ideal_pOp_closed[of "Vr K v"], 
        assumption+, simp, simp) 
apply (frule_tac I = "vp K vVr K v) (an N)" and h = "f n ± -a b" 
        in Ring.ideal_subset[of "Vr K v"], assumption+, simp,
        frule_tac I = "vp K vVr K v) (an N)" and h = "g n ± -a c" in
                   Ring.ideal_subset[of "Vr K v"], assumption+, simp)
 apply (simp add:Vr_pOp_f_pOp) 
 apply (thin_tac "f n ± -a b carrier (Vr K v)",
        thin_tac "g n ± -a c carrier (Vr K v)")

 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
        frule aGroup.ag_mOp_closed[of "K" "c"], assumption+,
        frule_tac a = "f n" and b = "-a b" and c = "g n" and d = "-a c" in 
                  aGroup.ag_add4_rel[of "K"], simp+)
 apply (simp add:aGroup.ag_p_inv[THEN sym]) 
done

lemma (in Corps) Abs_ant_abs[simp]:"Abs (ant z) = ant (abs z)"
apply (simp add:Abs_def, simp add:aminus)
apply (simp only:ant_0[THEN sym], simp only:aless_zless)
apply (simp add:zabs_def)
done

lemma (in Corps) limit_t_nonzero:"[valuation K v; (j::nat). (f j) carrier K; (j::nat). g j carrier K; b carrier K; c carrier K; b 0; c 0;
 lim v f b; lim v g c] ==> lim v (λj. (f j) r (g j)) (b r c)"
apply (cut_tac field_is_ring, simp add:limit_def, rule allI) 
 apply (subgoal_tac "j. (f j) r (g j) ± -a (b r c) =
 ((f j) r (g j) ± (f j) r (-a c)) ± ((f j) r c ± -a (b r c))", simp,
 thin_tac "j. f j r g j ± -a b r c =
             f j r g j ± f j r (-a c) ± (f j r c ± -a b r c)")
 apply (frule limit_n_val[of  "b" "v" "f"], assumption+,
        simp add:limit_def)
 apply (frule n_val_valuation[of "v"])
 apply (frule val_nonzero_z[of "n_val K v" "b"], assumption+, 
        rotate_tac -1, erule exE,
        frule val_nonzero_z[of "n_val K v" "c"], assumption+,
        rotate_tac -1, erule exE, rename_tac N bz cz)
 apply (rotate_tac 5
  drule_tac x = "N + nat (abs cz)" in spec, 
  drule_tac x = "N + nat (abs bz)" in spec)
  apply (erule exE)+ 
  apply (rename_tac N bz cz M M1 M2)
(** three inequalities together **)
apply (subgoal_tac "n. (max (max M1 M2) M) < n
 (f n) r (g n) ± (f n) r (-a c) ± ((f n) r c ± (-a (b r c)))
                   vp K v Vr K v) (an N)",  blast)
apply (rule allI, rule impI) apply (simp, (erule conjE)+) 
 apply (rotate_tac 11, drule_tac x = n in spec,
      drule_tac x = n in spec, simp,
      drule_tac x = n in spec, simp)
 apply (frule_tac b = "g n ± -a c" and n = "an N" and x = "f n" in 
        convergenceTr1[of v])
 apply simp apply simp apply (simp add:an_def a_zpz[THEN sym]) apply simp
 apply (frule_tac b = "f n ± -a b" and n = "an N" in convergenceTr1[of  
  "v" "c"], assumption+, simp) apply (simp add:an_def)
   apply (simp add:a_zpz[THEN sym]) apply simp

 apply (drule_tac x = n in spec, 
        drule_tac x = n in spec)
 apply (simp add:Ring.ring_inv1_1[of "K" "b" "c"],
        cut_tac Ring.ring_is_ag, frule aGroup.ag_mOp_closed[of "K" "c"], 
        assumption+,
        simp add:Ring.ring_distrib1[THEN sym],
        frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
        simp add:Ring.ring_distrib2[THEN sym],
        subst Ring.ring_tOp_commute[of "K" _ "c"], assumption+,
        rule aGroup.ag_pOp_closed, assumption+) 
apply (cut_tac n = N in an_nat_pos)
apply (frule_tac n = "an N" in vp_apow_ideal[of "v"], assumption+)
apply (frule Vr_ring[of "v"]) 

apply (frule_tac x = "(f n) r (g n ± -a c)" and y = "c r (f n ± -a b)"
   and I = "vp K v(Vr K v) (an N)" in Ring.ideal_pOp_closed[of "Vr K v"], 
   assumption+)
apply (frule_tac R = "Vr K v" and I = "vp K v(Vr K v) (an N)" and 
       h = "(f n) r (g n ± -a c)" in Ring.ideal_subset, assumption+,
       frule_tac R = "Vr K v" and I = "vp K v(Vr K v) (an N)" and 
       h = "c r (f n ± -a b)" in Ring.ideal_subset, assumption+) 
apply (simp add:Vr_pOp_f_pOp, assumption+)
apply (rule allI)
 apply (thin_tac "N. M. n>M. f n ± -a b vp K v(Vr K v) (an N)",
        thin_tac "N. M. n>M. g n ± -a c vp K v(Vr K v) (an N)")
 apply (drule_tac x = j in spec,
        drule_tac x = j in spec,
        cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule_tac x = "f j" and y = "g j" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = "b" and y = "c" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = "f j" and y = "c" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = c in aGroup.ag_mOp_closed[of "K"], assumption+,
       frule_tac x = "f j" and y = "-a c" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = "b r c" in aGroup.ag_mOp_closed[of "K"], assumption+)
 apply (subst aGroup.pOp_assocTr41[THEN sym, of "K"], assumption+,
        subst aGroup.pOp_assocTr42[of "K"], assumption+,
        subst Ring.ring_distrib1[THEN sym, of "K"], assumption+)
 apply (simp add:aGroup.ag_l_inv1, simp add:Ring.ring_times_x_0, 
        simp add:aGroup.ag_r_zero)
done

lemma an_npn[simp]:"an (n + m) = an n + an m"
by (simp add:an_def a_zpz) (** move **) 

lemma Abs_noninf:"a - a ==> Abs a "
by (cut_tac mem_ant[of "a"], simp, erule exE, simp add:Abs_def,
       simp add:aminus)

lemma (in Corps) limit_t_zero:"[c carrier K; valuation K v;
      (j::nat). f j carrier K; (j::nat). g j carrier K;
      lim v f 0; lim v g c] ==> lim v (λj. (f j) r (g j)) 0"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"], 
       simp add:limit_def, simp add:aGroup.ag_inv_zero, simp add:aGroup.ag_r_zero)
apply (subgoal_tac "j. (f j) r (g j) carrier K",
       simp add:aGroup.ag_r_zero)
 prefer 2 apply (rule allI, simp add:Ring.ring_tOp_closed)
apply (case_tac "c = 0")
 apply (simp add:aGroup.ag_inv_zero, simp add:aGroup.ag_r_zero)
 apply (rule allI,
        rotate_tac 4,
        drule_tac x = N in spec,
        drule_tac x = N in spec, (erule exE)+,
        rename_tac N M1 M2)
 apply (subgoal_tac "n>(max M1 M2). (f n) r (g n) (vp K v)Vr K v) (an N)"
        blast) 
 apply (rule allI, rule impI)
 apply (drule_tac x = M1 and y = M2 in two_inequalities, assumption+,
        thin_tac "n>M2. g n vp K v(Vr K v) (an N)")
apply (thin_tac "j. f j r g j carrier K",
       thin_tac "j. f j carrier K",
       thin_tac "j. g j carrier K",
       drule_tac x = n in spec, simp, erule conjE,
       erule conjE,
       frule Vr_ring[of v])
 apply (cut_tac n = N in an_nat_pos) 
 apply (frule_tac x = "f n" in mem_vp_apow_mem_Vr[of  "v"], assumption+,
        frule_tac x = "g n" in mem_vp_apow_mem_Vr[of  "v"], assumption+,
       frule_tac n = "an N" in vp_apow_ideal[of  "v"], assumption+)
 apply (frule_tac I = "vp K vVr K v) (an N)" and x = "g n" and 
        r = "f n" in Ring.ideal_ring_multiple[of "Vr K v"], assumption+,
        simp add:Vr_tOp_f_tOp)


 (** case c \<noteq> 0\<^sub>K **)
 apply (rule allI)
 apply (subgoal_tac "j. (f j) r (g j) =
        (f j) r ((g j) ± (-a c)) ± (f j) r c", simp,
        thin_tac "j. (f j) r (g j) =
        (f j) r ((g j) ± (-a c)) ± (f j) r c",
        thin_tac "j. (f j) r ( g j ± -a c) ± (f j) r c carrier K")
apply (rotate_tac 4,
       drule_tac x = "N + na (Abs (n_val K v c))" in  spec,
       drule_tac x = N in spec)
 apply (erule exE)+ apply (rename_tac N M1 M2)
apply (subgoal_tac "n. (max M1 M2) < n (f n) r (g n ± -a c) ±
                     (f n) r c vp K vVr K v) (an N)", blast)
apply (rule allI, rule impI, simp, erule conjE,
      drule_tac x = n in spec,
      drule_tac x = n in spec,
      drule_tac x = n in spec) 
apply (frule n_val_valuation[of "v"])
apply (frule value_in_aug_inf[of "n_val K v" "c"], assumption+, 
       simp add:aug_inf_def)
apply (frule val_nonzero_noninf[of "n_val K v" "c"], assumption+)
apply (cut_tac Abs_noninf[of "n_val K v c"])
apply (cut_tac Abs_pos[of "n_val K v c"]) apply (simp add:an_na)

apply (drule_tac x = n in spec, simp)
 apply (frule_tac b = "f n" and n = "an N" in convergenceTr1[of 
                                   "v" "c"], assumption+)
 apply simp

apply (frule_tac x = "f n" and N = "an N + Abs (n_val K v c)" in 
       mem_vp_apow_mem_Vr[of "v"], 
       frule_tac n = "an N" in vp_apow_ideal[of "v"])
      apply simp
apply (rule_tac x = "an N" and y = "Abs (n_val K v c)" in aadd_two_pos)
    apply simp apply (simp add:Abs_pos) apply assumption
   
apply (frule_tac x = "g n ± (-a c)" and N = "an N" in mem_vp_apow_mem_Vr[of 
       "v"], simp, assumption+) apply (
       frule_tac x = "c r (f n)" and N = "an N" in mem_vp_apow_mem_Vr[of 
       "v"], simp)  apply simp  
apply (simp add:Ring.ring_tOp_commute[of "K" "c"]) apply (
       frule Vr_ring[of  "v"], 
       frule_tac I = "(vp K v)Vr K v) (an N)" and x = "g n ± (-a c)" 
       and r = "f n" in Ring.ideal_ring_multiple[of "Vr K v"]) 
apply (simp add:vp_apow_ideal) apply assumption+
apply (frule_tac I = "vp K vVr K v) (an N)" and 
       x = "(f n) r (g n ± -a c)" and y = "(f n) r c" in 
                      Ring.ideal_pOp_closed[of "Vr K v"])
    apply (simp add:vp_apow_ideal)
 apply (simp add:Vr_tOp_f_tOp,  assumption)
 apply (simp add:Vr_tOp_f_tOp Vr_pOp_f_pOp,
       frule_tac x = "(f n) r (g n ± -a c)" and N = "an N" in mem_vp_apow_mem_Vr[of "v"], simp add:Vr_pOp_f_pOp, assumption+)
 apply (frule_tac N = "an N" and x = "(f n) r c" in mem_vp_apow_mem_Vr[of 
        "v"]) apply simp apply assumption
 apply (simp add:Vr_pOp_f_pOp) apply simp

 apply (thin_tac "N. M. n>M. f n vp K v(Vr K v) (an N)",
        thin_tac "N. M. n>M. g n ± -a c vp K v(Vr K v) (an N)",
        rule allI)
 apply (drule_tac x = j in spec, 
    drule_tac x = j in spec,
    drule_tac x = j in spec,
    frule  aGroup.ag_mOp_closed[of "K" "c"], assumption+,
    frule_tac x = "f j" in Ring.ring_tOp_closed[of "K" _ "c"], assumption+,
    frule_tac x = "f j" in Ring.ring_tOp_closed[of "K" _ "-a c"], assumption+)
 apply (simp add:Ring.ring_distrib1, simp add:aGroup.ag_pOp_assoc, 
        simp add:Ring.ring_distrib1[THEN sym],
        simp add:aGroup.ag_l_inv1, simp add:Ring.ring_times_x_0, 
        simp add:aGroup.ag_r_zero)
done

lemma (in Corps) limit_minus:"[valuation K v; j. f j carrier K;
      b carrier K; lim v f b] ==> lim v (λj. (-a (f j))) (-a b)"
apply (simp add:limit_def)
 apply (rule allI,
       rotate_tac -1, frule_tac x = N in spec,
        thin_tac "N. M. n. M < n
                   f n ± -a b (vp K v)Vr K v) (an N)",
       erule exE,
       subgoal_tac "n. M < n
           (-a (f n)) ± (-a (-a b)) (vp K v)Vr K v) (an N)",
      blast) 
 apply (rule allI, rule impI,
        frule_tac x = n in spec,
        frule_tac x = n in spec, simp) 

apply (frule Vr_ring[of "v"],
       frule_tac n = "an N" in vp_apow_ideal[of "v"], simp)
apply (frule_tac x = "f n ± -a b" and N = "an N" in 
       mem_vp_apow_mem_Vr[of "v"], simp+,
       frule_tac I = "vp K vVr K v) (an N)" and x = "f n ± (-a b)" in 
       Ring.ideal_inv1_closed[of "Vr K v"], assumption+, simp) 
 apply (simp add:Vr_mOp_f_mOp) 
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        frule aGroup.ag_mOp_closed[of "K" "b"], assumption+)
 apply (simp add:aGroup.ag_p_inv[of "K"])
done

lemma (in Corps) inv_diff:"[x carrier K; x 0; y carrier K; y 0] ==>
                (x<hyphen>K) ± (-a (y<hyphen>K)) = (x<hyphen>K) r ( y<hyphen>K) r (-a (x ± (-a y)))"
apply (cut_tac invf_closed1[of "x"], simp, erule conjE,
       cut_tac invf_closed1[of y], simp, erule conjE,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_tOp_closed[of "K" "x<hyphen>K" "y<hyphen>K"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "y"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "x<hyphen>K"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "y<hyphen>K"], assumption+,
       frule aGroup.ag_pOp_closed[of "K" "x" "-a y"], assumption+) 
                                    
apply (simp add:Ring.ring_inv1_2[THEN sym],
       simp only:Ring.ring_distrib1[of "K" "(x<hyphen>K) r (y<hyphen>K)" "x" "-a y"],
       simp only:Ring.ring_tOp_commute[of "K" _ x],
       simp only:Ring.ring_inv1_2[THEN sym, of "K"], 
       simp only:Ring.ring_tOp_assoc[THEN sym],
       simp only:Ring.ring_tOp_commute[of "K" "x"],
       cut_tac linvf[of  "x"], simp+,
       simp add:Ring.ring_l_one, simp only:Ring.ring_tOp_assoc,
       cut_tac linvf[of "y"], simp+, 
       simp only:Ring.ring_r_one) 
apply (simp add:aGroup.ag_p_inv[of "K"], simp add:aGroup.ag_inv_inv,
       rule aGroup.ag_pOp_commute[of "K" "x<hyphen>K" "-a y<hyphen>K"], assumption+)
apply simp+
done

lemma times2plus:"(2::nat)*n = n + n"
by simp

lemma (in Corps) limit_inv:"[valuation K v; j. f j carrier K;
      b carrier K; b 0; lim v f b] ==>
           lim v (λj. if (f j) = 0 then 0 else (f j)<hyphen>K) (b<hyphen>K)"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (frule limit_n_val[of "b" "v" "f"], assumption+) 
apply (subst limit_def)
 apply (rule allI, erule exE)
 apply (subgoal_tac "m>Na. f m 0"
 prefer 2
 apply (rule allI, rule impI, rotate_tac -2,
        drule_tac x = m in spec, simp)
 apply (frule n_val_valuation[of v]) 
 apply (frule val_nonzero_noninf[of "n_val K v" b], assumption+)
 apply (rule contrapos_pp, simp+, simp add:value_of_zero)
 apply (unfold limit_def)
  apply (rotate_tac 2,
         frule_tac x = "N + 2*(na (Abs (n_val K v b)))" in 
         spec)
  apply (erule exE)
  apply (subgoal_tac "n>(max Na M).
          (if f n = 0 then 0 else f n<hyphen>K) ± -a b<hyphen>K vp K vVr K v) (an N)"
         blast) 
  apply (rule allI, rule impI)
  apply (cut_tac x = "Na" and y = "max Na M" and z = n
         in le_less_trans)
  apply simp+
  apply (thin_tac "N. M. n>M. f n ± -a b vp K v(Vr K v) (an N)")
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec,
        drule_tac x = n in spec,
        drule_tac x = n in spec, simp)
 apply (subst inv_diff, assumption+)
 apply (cut_tac x = "f n" in invf_closed1, simp,
        cut_tac x = b in invf_closed1, simp, simp, (erule conjE)+)
(* apply (frule field_is_idom[of "K"], frule field_iOp_closed[of "K" "b"], 
                                                 simp, simp, erule conjE,
        frule idom_tOp_nonzeros [of "K" "b\<^bsup>\<hyphen>K\<^esup>" "b\<^bsup>\<hyphen>K\<^esup>"], assumption+) *)

 apply (frule_tac n = "an N + an (2 * na (Abs (n_val K v b)))" and 
        x = "f n ± -a b" in n_value_x_1[of v])
 apply (simp only:an_npn[THEN sym], rule an_nat_pos) 
 apply assumption
 apply (rule_tac x = "f n<hyphen> K r b<hyphen> K r (-a (f n ± -a b))" and v = v and 
        n = "an N" in n_value_x_2, assumption+)
 apply (frule n_val_valuation[of v])
 apply (subst val_pos_mem_Vr[THEN sym, of "v"], assumption+)
  apply (rule Ring.ring_tOp_closed, assumption+)+
  apply (rule aGroup.ag_mOp_closed, assumption)
  apply (rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+)
  apply (subst val_pos_n_val_pos[of v], assumption+,
         rule Ring.ring_tOp_closed, assumption+,
         rule Ring.ring_tOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+,
         rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+)
  apply (subst val_t2p[of "n_val K v"], assumption+,
         rule Ring.ring_tOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+,
         rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+,
         subst val_minus_eq[of "n_val K v"], assumption+,
          (rule aGroup.ag_pOp_closed, assumption+),
          (rule aGroup.ag_mOp_closed, assumption+))
  apply (subst val_t2p[of "n_val K v"], assumption+)
  apply (simp add:value_of_inv)
  apply (frule_tac x = "an N + an (2 * na (Abs (n_val K v b)))" and y = "n_val K v (f n ± -a b)" and z = "- n_val K v b + - n_val K v b" in aadd_le_mono)
  apply (cut_tac z = "n_val K v b" in Abs_pos)
  apply (frule val_nonzero_z[of "n_val K v" b], assumption+, erule exE)
  apply (rotate_tac -1, drule sym, cut_tac z = z in z_neq_minf,
         cut_tac z = z in z_neq_inf, simp,
         cut_tac a = "(n_val K v b)" in Abs_noninf, simp)
  apply (simp only:times2plus an_npn, simp add:an_na)
  apply (rotate_tac -4, drule sym, simp)
  apply (thin_tac "f n ± -a b vp K v(Vr K v) (an N + (ant z + ant z))")
  apply (simp add:an_def, simp add:aminus, (simp add:a_zpz)+)
  apply (subst aadd_commute)
  apply (rule_tac i = 0 and j = "ant (int N + 2 * z - 2 * z)" and 
         k = "n_val K v (f n ± -a b) + ant (- (2 * z))" in ale_trans)
  apply (subst ant_0[THEN sym])
  apply (subst ale_zle, simp, assumption)

  apply (frule n_val_valuation[of v])
  apply (subst val_t2p[of "n_val K v"], assumption+)
  apply (rule Ring.ring_tOp_closed, assumption+)+
  apply (rule aGroup.ag_mOp_closed, assumption)
  apply (rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+)
  apply (subst val_t2p[of "n_val K v"], assumption+) 
  apply (subst val_minus_eq[of "n_val K v"], assumption+,
         rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+)

  apply (simp add:value_of_inv)
  apply (frule_tac x = "an N + an (2 * na (Abs (n_val K v b)))" and y = "n_val K v (f n ± -a b)" and z = "- n_val K v b + - n_val K v b" in aadd_le_mono)
  apply (cut_tac z = "n_val K v b" in Abs_pos)
  apply (frule val_nonzero_z[of "n_val K v" b], assumption+, erule exE)
  apply (rotate_tac -1, drule sym, cut_tac z = z in z_neq_minf,
         cut_tac z = z in z_neq_inf, simp,
         cut_tac a = "(n_val K v b)" in Abs_noninf, simp)
  apply (simp only:times2plus an_npn, simp add:an_na)
  apply (rotate_tac -4, drule sym, simp)
  apply (thin_tac "f n ± -a b vp K v(Vr K v) (an N + (ant z + ant z))")
  apply (simp add:an_def, simp add:aminus, (simp add:a_zpz)+)
  apply (subst aadd_commute)
  apply (rule_tac i = "ant (int N)" and j = "ant (int N + 2 * z - 2 * z)" 
        and k = "n_val K v (f n ± -a b) + ant (- (2 * z))" in ale_trans)
  apply (subst ale_zle, simp, assumption)
 
  apply simp
done

definition
  Cauchy_seq :: "[_ , 'b ==> ant, nat ==> 'b]
           ==> bool" ((3Cauchy_ _ _) [90,90,91]90where
  "Cauchy v f (n. (f n) carrier K) (
  N. M. (n m. M < n M < m
                ((f n) ± (-a (f m))) (vp K v)Vr K v) (an N)))"

definition
  v_complete :: "['b ==> ant, _] ==> bool"
                    ((2Complete _)  [90,91]90where
  "Complete K (f. (Cauchy v f)
                           (b. b (carrier K) lim v f b))"

lemma (in Corps) has_limit_Cauchy:"[valuation K v; j. f j carrier K;
      b carrier K; lim v f b] ==> Cauchy v f" 
apply (simp add:Cauchy_seq_def)
apply (rule allI)
apply (simp add:limit_def)
 apply (rotate_tac -1)
 apply (drule_tac x = N in spec)
 apply (erule exE)
 apply (subgoal_tac "n m. M < n M < m
                        f n ± -a (f m) vp K vVr K v) (an N)")
 apply blast
 apply ((rule allI)+, rule impI, erule conjE)
 apply (frule_tac x = n in spec,
        frule_tac x = m in spec,
        thin_tac "j. f j carrier K",
        frule_tac x = n in spec,
        frule_tac x = m in spec,
        thin_tac "n. M < n f n ± -a b vp K vVr K v) (an N)",
        simp)
 apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp)
 apply (frule Vr_ring[of "v"])
 apply (frule_tac x = "f m ± -a b" and I = "vp K vVr K v) (an N)" in 
           Ring.ideal_inv1_closed[of "Vr K v"], assumption+)
 apply (frule_tac h = "f m ± -a b" and I = "vp K vVr K v) (an N)" in 
           Ring.ideal_subset[of "Vr K v"], assumption+,
        frule_tac h = "f n ± -a b" and I = "vp K vVr K v) (an N)" in 
           Ring.ideal_subset[of "Vr K v"], assumption+)  
apply (frule_tac h = "-a K v (f m ± -a b)" and I = "vp K vVr K v) (an N)" in         Ring.ideal_subset[of "Vr K v"], assumption+,
       frule_tac h = "f n ± -a b" and I = "vp K vVr K v) (an N)" in 
        Ring.ideal_subset[of "Vr K v"], assumption+) 
apply (frule_tac I = "(vp K v)(Vr K v) (an N)" and x = "f n ± -a b" and
       y = "-aVr K v) (f m ± -a b)" in Ring.ideal_pOp_closed[of "Vr K v"],
       assumption+)
apply (simp add:Vr_pOp_f_pOp) apply (simp add:Vr_mOp_f_mOp)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (frule aGroup.ag_mOp_closed[of "K" "b"], assumption+)
 apply (frule_tac x = "f m ± -a b" in Vr_mem_f_mem[of "v"], assumption+)
 apply (frule_tac x = "f m ± -a b" in aGroup.ag_mOp_closed[of "K"], 
         assumption+)
 apply (simp add:aGroup.ag_pOp_assoc)
 apply (simp add:aGroup.ag_pOp_commute[of "K" "-a b"])
 apply (simp add:aGroup.ag_p_inv[of "K"])
 apply (frule_tac x = "f m" in aGroup.ag_mOp_closed[of "K"], assumption+)
 apply (simp add:aGroup.ag_inv_inv)
 apply (simp add:aGroup.ag_pOp_assoc[of "K" _ "b" "-a b"])
 apply (simp add:aGroup.ag_r_inv1[of "K"], simp add:aGroup.ag_r_zero)
done

lemma (in Corps) no_limit_zero_Cauchy:"[valuation K v; Cauchy v f;
    ¬ (lim v f 0)] ==>
 N M. (m. N < m ((n_val K v) (f M)) = ((n_val K v) (f m)))"
apply (frule not_limit_zero[of "v" "f"], thin_tac "¬ limK v f 0")
apply (simp add:Cauchy_seq_def, assumption) apply (erule exE)
apply (rename_tac L)
apply (simp add:Cauchy_seq_def, erule conjE,
       rotate_tac -1,
       frule_tac x = L in spec, thin_tac "N. M. n m.
       M < n M < m f n ± -a (f m) vp K vVr K v) (an N)")
apply (erule exE)
apply (drule_tac x = M in spec)
apply (erule exE, erule conjE)
apply (rotate_tac -3,
       frule_tac x = m in spec)
    apply (thin_tac "n m. M < n M < m
               f n ± -a (f m) (vp K v)Vr K v) (an L)")
   apply (subgoal_tac "M < m (ma. M < ma
                             n_val K v (f m) = n_val K v (f ma))")
   apply blast
  apply simp
 
 apply (rule allI, rule impI)
 apply (rotate_tac -2)
 apply (drule_tac x = ma in spec)
 apply simp
 (** we have f ma \<plusminus> -\<^sub>a f m \<in> vpr K G a i v \<^bsup>\<diamondsuit>Vr K G a i v L\<^esup> as **) 
 apply (frule Vr_ring[of "v"], 
        frule_tac n = "an L" in vp_apow_ideal[of "v"], simp)
apply (frule_tac I = "vp K vVr K v) (an L)" and x = "f m ± -a (f ma)"
        in Ring.ideal_inv1_closed[of "Vr K v"], assumption+) apply (
        frule_tac I = "vp K vVr K v) (an L)" and 
        h = "f m ± -a (f ma)" in Ring.ideal_subset[of "Vr K v"], 
        assumption+, simp add:Vr_mOp_f_mOp)
   apply (frule_tac x = m in spec,
          drule_tac x = ma in spec)  apply (
         
          cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
          frule_tac x = "f ma" in aGroup.ag_mOp_closed[of "K"], assumption+,
          frule_tac x = "f m" and y = "-a (f ma)" in aGroup.ag_p_inv[of "K"],
          assumption+, simp only:aGroup.ag_inv_inv,
          frule_tac x = "f m" in aGroup.ag_mOp_closed[of "K"], assumption+,
          simp add:aGroup.ag_pOp_commute,
          thin_tac "-a ( f m ± -a (f ma)) = f ma ± -a (f m)",
          thin_tac "f m ± -a (f ma) vp K vVr K v) (an L)")
  (** finally, by f ma = f m \<plusminus> (f ma \<plusminus> -\<^sub>a (f m)) and value_less_eq 
      we have the conclusion **)

   apply (frule_tac x = "f ma ± -a (f m)" and n = "an L" in n_value_x_1[of 
         "v" ], simp) apply assumption apply (
         frule n_val_valuation[of "v"], 
         frule_tac x = "f m" and y = "f ma ± -a (f m)" in value_less_eq[of 
         "n_val K v"], assumption+) apply (simp add:aGroup.ag_pOp_closed) 
  apply (
         rule_tac x = "n_val K v (f m)" and y = "an L" and
         z = "n_val K v ( f ma ± -a (f m))" in  
         aless_le_trans, assumption+) 
  apply (frule_tac x = "f ma ± -a (f m)" in Vr_mem_f_mem[of "v"])
  apply (simp add:Ring.ideal_subset)
  apply (frule_tac x = "f m" and y = "f ma ± -a (f m)" in 
         aGroup.ag_pOp_commute[of "K"], assumption+) 
  apply (simp add:aGroup.ag_pOp_assoc,
         simp add:aGroup.ag_l_inv1, simp add:aGroup.ag_r_zero)
done 

lemma (in Corps) no_limit_zero_Cauchy1:"[valuation K v; j. f j carrier K;
  Cauchy v f; ¬ (lim v f 0)] ==> N M. (m. N < m v (f M) = v (f m))"
apply (frule no_limit_zero_Cauchy[of "v" "f"], assumption+)
 apply (erule exE)+
 apply (subgoal_tac "m. N < m v (f M) = v (f m)"apply blast
 apply (rule allI, rule impI)
 apply (frule_tac x = M in spec,
        drule_tac x = m in spec,
        drule_tac x = m in spec, simp)
 apply (simp add:n_val[THEN sym, of "v"])
done
 
definition
  subfield :: "[_, ('b, 'm1) Ring_scheme] ==> bool" where
  "subfield K K' Corps K' carrier K carrier K'
                   idmap (carrier K) rHom K K'"

definition
  v_completion :: "['b ==> ant, 'b ==> ant, _, ('b, 'm) Ring_scheme] ==> bool" 
               ((4Completion _ _ _) [90,90,90,91]90where
  "Completion v' K K' subfield K K'
      Complete' K' (x carrier K. v x = v' x)
      (x carrier K'. (f. Cauchy v f lim' v' f x))"

lemma (in Corps) subfield_zero:"[Corps K'; subfield K K'] ==> 0 = 0'"
apply (simp add:subfield_def, (erule conjE)+)
apply (simp add:rHom_def, (erule conjE)+)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Corps.field_is_ring[of "K'"], frule Ring.ring_is_ag[of "K'"])
apply (frule aHom_0_0[of "K" "K'" "I"], assumption+)
apply (frule aGroup.ag_inc_zero[of "K"], simp add:idmap_def)
done

lemma (in Corps) subfield_pOp:"[Corps K'; subfield K K'; x carrier K;
      y carrier K] ==> x ± y = x ±' y"
apply (cut_tac field_is_ring, frule Corps.field_is_ring[of "K'"],
       frule Ring.ring_is_ag[of "K"], frule Ring.ring_is_ag[of "K'"])
apply (simp add:subfield_def, erule conjE, simp add:rHom_def,
       frule conjunct1)
apply (thin_tac "I aHom K K'
     (xcarrier K. ycarrier K. I (x r y) = I x r' I y)
     I 1r = 1r'")
apply (frule aHom_add[of "K" "K'" "I" "x" "y"], assumption+,
       frule aGroup.ag_pOp_closed[of "K" "x" "y"], assumption+, 
       simp add:idmap_def)
done

lemma (in Corps) subfield_mOp:"[Corps K'; subfield K K'; x carrier K] ==>
                     -a x = -a' x"
apply (cut_tac field_is_ring, frule Corps.field_is_ring[of "K'"],
       frule Ring.ring_is_ag[of "K"], frule Ring.ring_is_ag[of "K'"])
apply (simp add:subfield_def, erule conjE, simp add:rHom_def,
       frule conjunct1)
apply (thin_tac "I aHom K K'
     (xcarrier K. ycarrier K. I (x r y) = I x r' I y)
     I 1r = 1r'")
apply (frule aHom_inv_inv[of "K" "K'" "I" "x"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+)
apply (simp add:idmap_def)
done

lemma (in Corps) completion_val_eq:"[Corps K'; valuation K v; valuation K' v';
 x carrier K; Completion v' K K'] ==> v x = v' x"
apply (unfold v_completion_def, (erule conjE)+)
apply simp
done

lemma (in Corps) completion_subset:"[Corps K'; valuation K v; valuation K' v';
 Completion v' K K'] ==> carrier K carrier K'"
apply (unfold v_completion_def, (erule conjE)+)
apply (simp add:subfield_def)
done

lemma (in Corps) completion_subfield:"[Corps K'; valuation K v;
       valuation K' v'; Completion v' K K'] ==> subfield K K'"
apply (simp add:v_completion_def)
done

lemma (in Corps) subfield_sub:"subfield K K' ==> carrier K carrier K'"
apply (simp add:subfield_def)
done

lemma (in Corps) completion_Vring_sub:"[Corps K'; valuation K v;
  valuation K' v'; Completion v' K K'] ==>
                     carrier (Vr K v) carrier (Vr K' v')"
apply (rule subsetI,
      frule completion_subset[of  "K'" "v" "v'"], assumption+,
      frule_tac x = x in Vr_mem_f_mem[of "v"], assumption+,
      frule_tac x = x in completion_val_eq[of "K'" "v" "v'"],
        assumption+)
apply (frule_tac x1 = x in val_pos_mem_Vr[THEN sym, of  "v"],
       assumption+, simp,
       frule_tac c = x in subsetD[of "carrier K" "carrier K'"], assumption+,
      simp add:Corps.val_pos_mem_Vr[of "K'" "v'"])
done

lemma (in Corps) completion_idmap_rHom:"[Corps K'; valuation K v;
  valuation K' v'; Completion v' K K'] ==>
             IVr K v) rHom (Vr K v) (Vr K' v')"
apply (frule completion_Vring_sub[of  "K'" "v" "v'"],
         assumption+,
       frule completion_subfield[of "K'" "v" "v'"], 
         assumption+,
       frule Vr_ring[of "v"],
        frule Ring.ring_is_ag[of "Vr K v"],
       frule Corps.Vr_ring[of "K'" "v'"], assumption+,
       frule Ring.ring_is_ag[of "Vr K' v'"])
apply (simp add:rHom_def)
apply (rule conjI) 
 apply (simp add:aHom_def,
        rule conjI,
        simp add:idmap_def, simp add:subsetD)
apply (rule conjI)
 apply (simp add:idmap_def extensional_def)
 apply ((rule ballI)+) apply (
        frule_tac x = a and y = b in aGroup.ag_pOp_closed, assumption+,
        simp add:idmap_def, 
   frule_tac c = a in subsetD[of "carrier (Vr K v)" 
                         "carrier (Vr K' v')"], assumption+,
   frule_tac c = b in subsetD[of "carrier (Vr K v)" 
                         "carrier (Vr K' v')"], assumption+,
   simp add:Vr_pOp_f_pOp,
   frule_tac x = a in Vr_mem_f_mem[of v], assumption,
   frule_tac x = b in Vr_mem_f_mem[of v], assumption,
   simp add:Corps.Vr_pOp_f_pOp,
   simp add:subfield_pOp)
apply (rule conjI)
 apply ((rule ballI)+, 
        frule_tac x = x and y = y in Ring.ring_tOp_closed, assumption+,
        simp add:idmap_def, simp add:subfield_def, erule conjE)
 apply (frule_tac c = x in subsetD[of "carrier (Vr K v)" 
            "carrier (Vr K' v')"], assumption+,
        frule_tac c = y in subsetD[of "carrier (Vr K v)" 
            "carrier (Vr K' v')"], assumption+)
 apply (simp add:Vr_tOp_f_tOp Corps.Vr_tOp_f_tOp)
apply (frule_tac x = x in Vr_mem_f_mem[of "v"], assumption+,
       frule_tac x = y in Vr_mem_f_mem[of "v"], assumption+,
     frule_tac x = x in Corps.Vr_mem_f_mem[of "K'" "v'"], assumption+,
     frule_tac x = y in Corps.Vr_mem_f_mem[of "K'" "v'"], assumption+,
       cut_tac field_is_ring, frule Corps.field_is_ring[of "K'"],
       frule_tac x = x and y = y in Ring.ring_tOp_closed[of "K"], assumption+)
apply (frule_tac x = x and y = y in rHom_tOp[of "K" "K'" _ _ "I"], 
                 assumption+, simp add:idmap_def)
apply (frule Ring.ring_one[of "Vr K v"], simp add:idmap_def)
apply (simp add:Vr_1_f_1 Corps.Vr_1_f_1)
apply (simp add:subfield_def, (erule conjE)+)
apply (cut_tac field_is_ring, frule Corps.field_is_ring[of "K'"],
       frule Ring.ring_one[of "K"],
       frule rHom_one[of "K" "K'" "I"], assumption+, simp add:idmap_def)
done

lemma (in Corps) completion_vpr_sub:"[Corps K'; valuation K v; valuation K' v';
      Completion v' K K'] ==> vp K v vp K' v'"
apply (rule subsetI,
      frule completion_subset[of "K'" "v" "v'"], assumption+,
      frule Vr_ring[of "v"], frule vp_ideal[of "v"],
        frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"],
        assumption+,
      frule_tac x = x in Vr_mem_f_mem[of  "v"], assumption+,
      frule_tac x = x in completion_val_eq[of "K'" "v" "v'"],
        assumption+)
apply (frule completion_subset[of "K'" "v" "v'"],
        assumption+,
       frule_tac c = x in subsetD[of "carrier K" "carrier K'"], assumption+,
       simp add:Corps.vp_mem_val_poss vp_mem_val_poss)
done

lemma (in Corps) val_v_completion:"[Corps K'; valuation K v; valuation K' v';
      x carrier K'; x 0'; Completion v' K K'] ==>
   f. (Cauchy v f) (N. (m. N < m v (f m) = v' x))"
apply (simp add:v_completion_def, erule conjE, (erule conjE)+)
 apply (rotate_tac -1, drule_tac x = x in bspec, assumption+,
        erule exE, erule conjE,
        subgoal_tac "N. m. N < m v (f m) = v' x", blast) 
    thm Corps.limit_val
 apply (frule_tac f = f and v = v' in  Corps.limit_val[of "K'" "x"],
        assumption+,
        unfold Cauchy_seq_def, frule conjunct1, fold Cauchy_seq_def) 
apply (rule allI, drule_tac x = j in spec,
       simp add:subfield_def, erule conjE, simp add:subsetD, assumption+)
 apply (simp add:Cauchy_seq_def)
done

lemma (in Corps) v_completion_v_limit:"[Corps K'; valuation K v;
      x carrier K; subfield K K'; Complete' K'; j. f j carrier K;
      valuation K' v'; xcarrier K. v x = v' x; lim' v' f x] ==> lim v f x"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Corps.field_is_ring[of K'], frule Ring.ring_is_ag[of "K'"],
       subgoal_tac "j. f j carrier K'",
       unfold subfield_def, frule conjunct2, fold subfield_def, erule conjE)
apply (frule subsetD[of "carrier K" "carrier K'" "x"], assumption+,
       simp add:limit_diff_val[of "x" "f"],
       subgoal_tac "n. f n ±' -a' x = f n ± -a x")
 apply (rule allI)
 apply (simp add:limit_def)
 apply (rotate_tac 6, drule_tac x = N in spec,
        erule exE)
 apply (subgoal_tac "n>M. an N v'(f n ± -a x)",
        subgoal_tac "n. (v' (f n ± -a x) = v (f n ± -a x))", simp, blast)
 apply (rule allI)
 apply (frule_tac x = "f n ± -a x" in bspec,
        rule aGroup.ag_pOp_closed, assumption+, simp,
        rule aGroup.ag_mOp_closed, assumption+) apply simp
 apply (rule allI, rule impI)
 apply (frule_tac v = v' and n = "an N" and x = "f n ± -a x" in 
         Corps.n_value_x_1[of K'], assumption+, simp, simp)
 apply (frule_tac v = v' and x = "f n ± -a x" in Corps.n_val_le_val[of K'],
         assumption+) 
 apply (cut_tac x = "f n" and y = "-a x" in aGroup.ag_pOp_closed, assumption,
        simp, rule aGroup.ag_mOp_closed, assumption+, simp add:subsetD)
 apply (subst Corps.val_pos_n_val_pos[of K' v'], assumption+)
   apply (cut_tac x = "f n" and y = "-a x" in aGroup.ag_pOp_closed, assumption,
        simp, rule aGroup.ag_mOp_closed, assumption+, simp add:subsetD)
apply (rule_tac i = 0 and j = "an N" and k = "n_val K' v' (f n ± -a x)" in 
       ale_trans, simp+, rule allI)
 apply (subst subfield_pOp[of K'], assumption+, simp+,
        rule aGroup.ag_mOp_closed, assumption+)
 apply (simp add:subfield_mOp[of K'])
 apply (cut_tac subfield_sub[of K'], simp add:subsetD, assumption+)
done
    
lemma (in Corps) Vr_idmap_aHom:"[Corps K'; valuation K v; valuation K' v';
      subfield K K'; xcarrier K. v x = v' x] ==>
                              IVr K v) aHom (Vr K v) (Vr K' v')"
apply (simp add:aHom_def)
apply (subgoal_tac "IVr K v) carrier (Vr K v) carrier (Vr K' v')")
apply simp
apply (rule conjI)
 apply (simp add:idmap_def)
apply (rule ballI)+
 apply (frule Vr_ring[of "v"],
        frule Ring.ring_is_ag[of "Vr K v"],
        frule Corps.Vr_ring[of "K'" "v'"], assumption+,
        frule Ring.ring_is_ag[of "Vr K' v'"]) 
 apply (frule_tac x = a and y = b in aGroup.ag_pOp_closed[of "Vr K v"],
               assumption+,
        frule_tac x = a in funcset_mem[of "IVr K v)" 
        "carrier (Vr K v)" "carrier (Vr K' v')"], assumption+,
        frule_tac x = b in funcset_mem[of "IVr K v)" 
        "carrier (Vr K v)" "carrier (Vr K' v')"], assumption+,
        frule_tac x = "(IVr K v)) a" and y = "(IVr K v)) b" in 
        aGroup.ag_pOp_closed[of "Vr K' v'"], assumption+, 
        simp add:Vr_pOp_f_pOp)
 apply (simp add:idmap_def, simp add:subfield_def, erule conjE,
        simp add:rHom_def, frule conjunct1,
        thin_tac "I aHom K K'
           (xcarrier K. ycarrier K. I (x r y) = I x r' I y)
           I 1r = 1r'")
  apply (simp add:Corps.Vr_pOp_f_pOp[of K' v'])
  apply (frule_tac x = a in Vr_mem_f_mem[of v], assumption+,
         frule_tac x = b in Vr_mem_f_mem[of v], assumption+)
  apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of K],
         frule Corps.field_is_ring[of K'], frule Ring.ring_is_ag[of K']) 
  apply (frule_tac a = a and b = b in aHom_add[of K K' "I"], assumption+,
         frule_tac x = a and y = b in aGroup.ag_pOp_closed[of K], assumption+,
         simp add:idmap_def)
apply (rule Pi_I,
       drule_tac x = x in bspec, simp add:Vr_mem_f_mem)
apply (simp add:idmap_def)
 apply (frule_tac x1 = x in val_pos_mem_Vr[THEN sym, of v],
         simp add:Vr_mem_f_mem, simp)
 apply (subst Corps.val_pos_mem_Vr[THEN sym, of K' v'], assumption+,
        frule_tac x = x in Vr_mem_f_mem[of v], assumption+,
        frule subfield_sub[of K'], simp add:subsetD)
 apply assumption
done

lemma amult_pos_pos:"0 a ==> 0 a * an N"
apply (case_tac "N = 0", simp add:an_0)
 apply (case_tac "a = ", simp) 
 apply (frule apos_neq_minf[of a])
 apply (subst ant_tna[THEN sym, of a], simp)
 apply (subst amult_0_r, simp)
apply (case_tac "a = ", simp add:an_def) 
 apply (frule apos_neq_minf[of a])
 apply (subst ant_tna[THEN sym, of a], simp)
 apply (case_tac "a = 0", simp)
 apply (simp add:ant_0 an_def amult_0_l)
apply (cut_tac amult_pos1[of "tna a" "an N"]) 
 apply (simp add:ant_tna)
 apply (rule_tac ale_trans[of 0 "an N" "a * an N"], simp+)
 apply (frule ale_neq_less[of 0 a], rule not_sym, assumption)
 apply (subst aless_zless[THEN sym, of 0 "tna a"], simp add:ant_tna ant_0)
 apply simp
done

lemma (in Corps) Cauchy_down:"[Corps K'; valuation K v; valuation K' v';
  subfield K K'; xcarrier K. v x = v' x; j. f j carrier K; Cauchy' v' f]
  ==> Cauchy v f" 
apply (simp add:Cauchy_seq_def, rule allI, erule conjE) 
apply (rotate_tac -1, drule_tac 
  x = "na (Lv K v) * N" in spec,
  erule exE,
  subgoal_tac "n m. M < n M < m
      f n ± (-a (f m)) vp K vVr K v) (an N)", blast)
 apply (simp add:amult_an_an) apply (simp add:an_na_Lv)
 apply ((rule allI)+, rule impI, erule conjE) apply (
      rotate_tac -3, drule_tac x = n in spec,
      rotate_tac -1, drule_tac x = m in spec,
      simp)
 apply (rotate_tac 7,
        frule_tac x = n in spec,
        drule_tac x = m in spec)
 apply (simp add:subfield_mOp[THEN sym],
        cut_tac field_is_ring, frule Ring.ring_is_ag[of K],
        frule_tac x = "f m" in aGroup.ag_mOp_closed[of K], assumption+)
 apply (simp add:subfield_pOp[THEN sym])
 apply (frule_tac x = "f n" and y = "-a f m" in aGroup.ag_pOp_closed, 
        assumption+,
        frule subfield_sub[of K'],
        frule_tac c = "f n ± -a f m" in subsetD[of "carrier K" "carrier K'"], 
        assumption+)
 apply (frule Lv_pos[of v],
        frule aless_imp_le[of 0 "Lv K v"])
 apply (frule_tac N = N in amult_pos_pos[of "Lv K v"])
 apply (frule_tac n = "(Lv K v) * an N" and x = "f n ± -a f m" in 
        Corps.n_value_x_1[of K' v'], assumption+)
 apply (frule_tac x = "f n ± -a f m" in Corps.n_val_le_val[of K' v'],
        assumption+,
        frule_tac j = "Lv K v * an N" and k = "n_val K' v' (f n ± -a f m)" in
         ale_trans[of 0], assumption+, simp add:Corps.val_pos_n_val_pos)
 apply (frule_tac i = "Lv K v * an N" and j = "n_val K' v' (f n ± -a f m)" 
        and k = "v' (f n ± -a f m)" in ale_trans, assumption+,
        thin_tac "n_val K' v' (f n ± -a f m) v' (f n ± -a f m)",
        thin_tac "Lv K v * an N n_val K' v' (f n ± -a f m)")
 apply (rotate_tac 1,
        drule_tac x = "f n ± -a f m" in bspec, assumption,
        rotate_tac -1, drule sym, simp)
 apply (frule_tac v1 = v and x1 = "f n ± -a f m" in n_val[THEN sym],
        assumption)
 apply simp
 apply (simp only:amult_commute[of _ "Lv K v"])
apply (frule Lv_z[of v], erule exE)
 
apply (cut_tac w = z and x = "an N" and y = "n_val K v (f n ± -a f m)" in
       amult_pos_mono_l,
       cut_tac m = 0 and n = z in aless_zless, simp add:ant_0)
 apply simp
 apply (rule_tac x="f n ± -a (f m)" and n = "an N" in n_value_x_2[of v], 
        assumption+) 
 apply (subst val_pos_mem_Vr[THEN sym, of v], assumption+)
 apply (subst val_pos_n_val_pos[of v], assumption+)
 apply (rule_tac j = "an N" and k = "n_val K v (f n ± -a f m)" in 
        ale_trans[of 0], simp, assumption+)
 apply simp
done

lemma (in Corps) Cauchy_up:"[Corps K'; valuation K v; valuation K' v';
      Completion v' K K'; CauchyK v f] ==> CauchyK' v' f" 
apply (simp add:Cauchy_seq_def,
       erule conjE,
       rule conjI, unfold v_completion_def, frule conjunct1,
       fold v_completion_def, rule allI, frule subfield_sub[of K'])
apply (simp add:subsetD) 

apply (rule allI)
apply (rotate_tac -1, drule_tac x = "na (Lv K' v') * N" 
      in spec, erule exE) 
apply (subgoal_tac "n m. M < n M < m
         f n ±' (-a' (f m)) vp K' v'Vr K' v') (an N)", blast,
       (rule allI)+, rule impI, erule conjE)
apply (rotate_tac -3, drule_tac x = n in spec,
       rotate_tac -1
       drule_tac x = m in spec, simp,
       frule_tac x = n in spec,
       drule_tac x = m in spec)
 apply(unfold v_completion_def, frule conjunct1, fold v_completion_def,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule_tac x = "f m" in aGroup.ag_mOp_closed[of "K"], assumption+,
       frule_tac x = "f n" and y = "-a (f m)" in aGroup.ag_pOp_closed[of "K"],
       assumption+)
 apply (simp add:amult_an_an) apply (simp add:Corps.an_na_Lv)
apply (simp add:subfield_mOp, simp add:subfield_pOp) apply (
       frule_tac x = "f n ±' -a' f m" and n = "(Lv K' v') * (an N)"
       in n_value_x_1[of v]) (*apply (
  thin_tac "f n \<plusminus>' (-\<^sub>a' (f m)) \<in> vp K v\<^bsup>(Vr K v) ( (Lv K' v') * (an N))\<^esup>",
   simp add:v_completion_def, (erule conjE)+) *)
 
apply (frule Corps.Lv_pos[of "K'" "v'"], assumption+, 
       frule Corps.Lv_z[of "K'" "v'"],
       assumption, erule exE, simp, 
       cut_tac n = N in an_nat_pos,
       frule_tac w1 = z and x1 = 0 and y1 = "an N" in 
             amult_pos_mono_l[THEN sym], simp, simp add:amult_0_r)
apply assumption
apply (frule_tac x = "f n ±' -a' f m " in n_val_le_val[of v],
        assumption+)
apply (subst n_val[THEN sym, of "v"], assumption+)
apply (frule Lv_pos[of "v"], frule Lv_z[of v], erule exE, simp)
apply (frule Corps.Lv_pos[of "K'" "v'"], assumption+, 
       frule Corps.Lv_z[of "K'" "v'"],   assumption, erule exE, simp, 
       cut_tac n = N in an_nat_pos,
       frule_tac w1 = za and x1 = 0 and y1 = "an N" in 
             amult_pos_mono_l[THEN sym], simp, simp add:amult_0_r)
apply (frule_tac j = "ant za * an N" and k = "n_val K v (f n ±' -a' (f m))"
       in ale_trans[of "0"], assumption+)
apply (frule_tac w1 = z and x1 = 0 and y1 = "n_val K v ( f n ±' -a' (f m))"
       in amult_pos_mono_r[THEN sym], simp, simp add:amult_0_l)
apply (frule_tac i = "Lv K' v' * an N" and j ="n_val K v ( f n ±' -a' (f m))"
       and k = "v ( f n ±' -a' (f m))" in ale_trans, assumption+)
apply (thin_tac "f n ±' -a' (f m) vp K v(Vr K v) (Lv K' v') * (an N)",
       thin_tac "Lv K' v' * an N n_val K v ( f n ±' -a' (f m))",
       thin_tac "n_val K v ( f n ±' -a' (f m)) v ( f n ±' -a' (f m))")

apply (simp add:v_completion_def, (erule conjE)+)
 apply (thin_tac "xcarrier K. v x = v' x",
        thin_tac "xcarrier K'. f. CauchyK v f limK' v' f x")
 apply (frule subfield_sub[of K'],
        frule_tac c = "f n ±' -a' (f m)" in 
                  subsetD[of "carrier K" "carrier K'"], assumption+)
apply (simp add:Corps.n_val[THEN sym, of "K'" "v'"])
apply (simp add:amult_commute[of _ "Lv K' v'"])
apply (frule Corps.Lv_pos[of "K'" "v'"], assumption, 
       frule Corps.Lv_z[of "K'" "v'"], assumption+, erule exE, simp)
apply (simp add:amult_pos_mono_l)

apply (rule_tac x = "f n ±' -a' (f m)" and n = "an N" in 
       Corps.n_value_x_2[of "K'" "v'"], assumption+)
apply (cut_tac n = N in an_nat_pos)
 apply (frule_tac j = "an N" and k = "n_val K' v' (f n ±' -a' (f m))" in 
        ale_trans[of "0"], assumption+)
 apply (simp add:Corps.val_pos_n_val_pos[THEN sym, of "K'" "v'"])
 apply (simp add:Corps.val_pos_mem_Vr) apply assumption apply simp
done

lemma max_gtTr:"(n::nat) < max (Suc n) (Suc m) m < max (Suc n) (Suc m)"
by (simp add:max_def)

lemma (in Corps) completion_approx:"[Corps K'; valuation K v; valuation K' v';
      Completion v' K K'; x carrier (Vr K' v')] ==>
               ycarrier (Vr K v). (y ±' -a' x) (vp K' v')"
(** show an element y near by x is included in (Vr K v) **) 
apply (frule Corps.Vr_mem_f_mem [of "K'" "v'" "x"], assumption+,
       frule Corps.val_pos_mem_Vr[THEN sym, of "K'" "v'" "x"], assumption+,
       simp add:v_completion_def, (erule conjE)+,
       rotate_tac -1, drule_tac x = x in bspec, assumption+, 
       erule exE, erule conjE)
apply (unfold Cauchy_seq_def, frule conjunct1, fold Cauchy_seq_def)
apply (case_tac "x = 0'"
       simp, frule Corps.field_is_ring[of "K'"], 
       frule Ring.ring_is_ag[of "K'"],
       subgoal_tac " 0' carrier (Vr K v)",
       subgoal_tac " (0' ±' -a' 0') vp K' v'", blast,
       frule aGroup.ag_inc_zero[of "K'"], simp add:aGroup.ag_r_inv1,
       simp add:Corps.Vr_0_f_0[THEN sym, of "K'" "v'"],
       frule Corps.Vr_ring[of "K'" "v'"], assumption+,
       frule Corps.vp_ideal[of "K'" "v'"], assumption+,
       simp add:Ring.ideal_zero,
       simp add:subfield_zero[THEN sym, of  "K'"],
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_inc_zero[of "K"],
       simp add:Vr_0_f_0[THEN sym, of "v"],
       frule Vr_ring[of "v"],simp add:Ring.ring_zero)
      apply (frule_tac f = f in Corps.limit_val[of "K'" "x" _ "v'"], 
                         assumption+)
      apply (rule allI, rotate_tac -2, frule_tac x = j in spec,
             frule subfield_sub[of K'], simp add:subsetD, assumption+)
apply (erule exE)
 apply (simp add:limit_def,
        frule Corps.Vr_ring[of K' v'], assumption+,
        rotate_tac 10,
              drule_tac x = "Suc 0" in spec, erule exE,
       rotate_tac 1,
              frule_tac x = N and y = M in two_inequalities, assumption+,
              thin_tac "n>N. v' (f n) = v' x",
              thin_tac "n>M. f n ±' -a' x vp K' v'(Vr K' v') (an (Suc 0))")
       apply (frule Corps.vp_ideal[of K' v'], assumption+,
              simp add:Ring.r_apow_Suc[of "Vr K' v'" "vp K' v'"])
       apply (drule_tac x = "N + M + 1" in spec, simp,
              drule_tac x = "N + M + 1" in spec, simp,
              erule conjE)
 apply (drule_tac x = "f (Suc (N + M))" in bspec, assumption+)
 apply simp 
 apply (cut_tac x = "f (Suc (N + M))" in val_pos_mem_Vr[of v], assumption+)
 apply simp apply blast
done

lemma (in Corps) res_v_completion_surj:"[ Corps K'; valuation K v;
      valuation K' v'; Completion v' K K'] ==>
      surjecVr K v),(qring (Vr K' v') (vp K' v'))
            (compos (Vr K v) (pj (Vr K' v') (vp K' v')) (IVr K v)))"
apply (frule Vr_ring[of "v"], 
       frule Ring.ring_is_ag[of "Vr K v"],
       frule Corps.Vr_ring[of "K'" "v'"], assumption+,
       frule Ring.ring_is_ag[of "Vr K' v'"],
       frule Ring.ring_is_ag[of "Vr K v"])
apply (frule Corps.vp_ideal[of "K'" "v'"], assumption+, 
       frule Ring.qring_ring[of "Vr K' v'" "vp K' v'"], assumption+)
apply (simp add:surjec_def)
apply (frule aHom_compos[of "Vr K v" "Vr K' v'" 
      "qring (Vr K' v') (vp K' v')" "IVr K v)" 
      "pj (Vr K' v') (vp K' v')"], assumption+, simp add:Ring.ring_is_ag)
apply (rule Vr_idmap_aHom, assumption+) apply (simp add:completion_subfield,
      simp add:v_completion_def) apply (
      frule pj_Hom[of "Vr K' v'" "vp K' v'"], assumption+) apply ( 
      simp add:rHom_def, simp)
apply (rule surj_to_test)
 apply (simp add:aHom_def)
apply (rule ballI) 
 apply (thin_tac "Ring (Vr K' v' /r vp K' v')",
  thin_tac "compos (Vr K v) (pj (Vr K' v') (vp K' v')) (IVr K v))
               aHom (Vr K v) (Vr K' v' /r vp K' v')")
 apply (simp add:Ring.qring_carrier)
 apply (erule bexE)
 apply (frule_tac x = a in completion_approx[of "K'" "v" "v'"], 
       assumption+, erule bexE)
 apply (subgoal_tac "compos (Vr K v) (pj (Vr K' v')
                     (vp K' v')) ((IVr K v))) y = b", blast)
 apply (simp add:compos_def compose_def idmap_def)
 apply (frule completion_Vring_sub[of "K'" "v" "v'"], assumption+)
 apply (frule_tac c = y in subsetD[of "carrier (Vr K v)" "carrier (Vr K' v')"],
         assumption+)
 apply (frule_tac x = y in pj_mem[of "Vr K' v'" "vp K' v'"], assumption+, simp,
        thin_tac "pj (Vr K' v') (vp K' v') y = y Vr K' v') (vp K' v')")
 apply (rotate_tac -5, frule sym, thin_tac "a Vr K' v') (vp K' v') = b"
       simp)
 apply (rule_tac b1 = y and a1 = a in Ring.ar_coset_same1[THEN sym, 
        of "Vr K' v'" "vp K' v'"], assumption+)
 apply (frule Ring.ring_is_ag[of "Vr K' v'"], 
        frule_tac x = a in aGroup.ag_mOp_closed[of "Vr K' v'"],
        assumption+)
 apply (simp add:Corps.Vr_mOp_f_mOp, simp add:Corps.Vr_pOp_f_pOp)
done

lemma (in Corps) res_v_completion_ker:"[Corps K'; valuation K v;
      valuation K' v'; Completion v' K K'] ==>
  kerVr K v), (qring (Vr K' v') (vp K' v'))
  (compos (Vr K v) (pj (Vr K' v') (vp K' v')) (IVr K v))) = vp K v"
apply (rule equalityI)
 apply (rule subsetI)
 apply (simp add:ker_def, (erule conjE)+)
 apply (frule Corps.Vr_ring[of "K'" "v'"], assumption+,
        frule Corps.vp_ideal[of "K'" "v'"], assumption+,
        frule Ring.qring_ring[of "Vr K' v'" "vp K' v'"], assumption+,
        simp add:Ring.qring_zero)
 apply (simp add:compos_def, simp add:compose_def, simp add:idmap_def)
 apply (frule completion_Vring_sub[of "K'" "v" "v'"], assumption+)
 apply (frule_tac c = x in subsetD[of "carrier (Vr K v)" "carrier (Vr K' v')"],
        assumption+)
 apply (simp add:pj_mem)
 apply (frule_tac a = x in Ring.qring_zero_1[of "Vr K' v'" _  "vp K' v'"], 
        assumption+)
 apply (subst vp_mem_val_poss[of v], assumption+) 
 apply (simp add:Vr_mem_f_mem)
 apply (frule_tac x = x in Corps.vp_mem_val_poss[of "K'" "v'"],
        assumption+, simp add:Corps.Vr_mem_f_mem, simp)
apply (frule_tac x = x in Vr_mem_f_mem[of v], assumption+)
 apply (frule_tac x = x in completion_val_eq[of "K'" "v" "v'"],
         assumption+, simp)
apply (rule subsetI)
 apply (simp add:ker_def)
 apply (frule Vr_ring[of  "v"])
 apply (frule vp_ideal[of "v"])
 apply (frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"],
         assumption+, simp)
 apply (frule Corps.Vr_ring[of "K'" "v'"], assumption+,
        frule Corps.vp_ideal[of "K'" "v'"], assumption+, 
        simp add:Ring.qring_zero)
 apply (simp add:compos_def compose_def idmap_def)
 apply (frule completion_Vring_sub[of "K'" "v" "v'"],
        assumption+, frule_tac c = x in subsetD[of "carrier (Vr K v)"
        "carrier (Vr K' v')"], assumption+)
 apply (simp add:pj_mem)
 apply (frule completion_vpr_sub[of "K'" "v" "v'"], assumption+,
        frule_tac c = x in subsetD[of "vp K v" "vp K' v'"], assumption+)
 apply (simp add:Ring.ar_coset_same4[of "Vr K' v'" "vp K' v'"])
done 

lemma (in Corps) completion_res_qring_isom:"[Corps K'; valuation K v;
  valuation K' v'; Completion v' K K'] ==>
   r_isom ((Vr K v) /r (vp K v)) ((Vr K' v') /r (vp K' v'))"
apply (subst r_isom_def)
apply (frule res_v_completion_surj[of "K'" "v" "v'"], assumption+)
apply (frule Vr_ring[of "v"],
       frule Corps.Vr_ring[of "K'" "v'"], assumption+,
       frule Corps.vp_ideal[of "K'" "v'"], assumption+,
       frule Ring.qring_ring[of "Vr K' v'" "vp K' v'"], assumption+)
apply (frule rHom_compos[of "Vr K v" "Vr K' v'" "(Vr K' v' /r vp K' v')" 
       "(IVr K v))" "pj (Vr K' v') (vp K' v')"], assumption+)
apply (simp add:completion_idmap_rHom)
apply (simp add:pj_Hom) 
apply (frule surjec_ind_bijec [of "Vr K v" "(Vr K' v' /r vp K' v')" 
      "compos (Vr K v) (pj (Vr K' v') (vp K' v')) (IVr K v))"], assumption+)
apply (frule ind_hom_rhom[of "Vr K v" "(Vr K' v' /r vp K' v')" 
       "compos (Vr K v) (pj (Vr K' v') (vp K' v')) (IVr K v))"], assumption+)
apply (simp add:res_v_completion_ker) apply blast
done

textexpansion of x in a complete field K, with normal valuation v. Here
  suppose t is an element of K satisfying the equation v t = 1.


definition
  Kxa :: "[_, 'b ==> ant, 'b] ==> 'b set" where
  "Kxa K v x = {y. kcarrier (Vr K v). y = x r k}"
    (**  x *\<^sub>r carrier (Vr K v) **)

primrec 
  partial_sum :: "[('b, 'm) Ring_scheme, 'b, 'b ==> ant, 'b]
                                   ==> nat ==> 'b"
        ((5psum_ _ _ _ _) [96,96,96,96,97]96)
where
  psum_0: "psumK x v t 0 = (csrp_fn (Vr K v) (vp K v)
     (pj (Vr K v) (vp K v) (x r t(tna (v x))))) r (ttna (v x)))"
| psum_Suc: "psumK x v t (Suc n) = (psumK x v t n) ±
  ((csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v)
   ((x ± -a (psumK x v t n)) r (t (tna (v x) + int (Suc n)))))) r
         (ttna (v x) + int (Suc n))))" 

definition
  expand_coeff :: "[_ , 'b ==> ant, 'b, 'b]
                      ==> nat ==> 'b"
                   ((5ecf _ _ _ _) [96,96,96,96,97]96where
  "ecf v t x n = (if n = 0 then csrp_fn (Vr K v) (vp K v)
     (pj (Vr K v) (vp K v) (x r t-(tna (v x)))))
     else csrp_fn (Vr K v) (vp K v) (pj (Vr K v)
  (vp K v) ((x ± -a (psumK x v t (n - 1))) r (t- (tna (v x) + int n))))))" 

definition
  expand_term :: "[_, 'b ==> ant, 'b, 'b]
                      ==> nat ==> 'b"
                   ((5etm_ _ _ _ _) [96,96,96,96,97]96where
        
  "etm v t x n = (ecf v t x n)r (ttna (v x) + int n))"



(*** Let O be the valuation ring with respect to the valuation v and let P
be the maximal ideal of O. Let j be the value of x (\<in> O), and  a\<^sub>0 be an 
element of the complete set of representatives such that a\<^sub>0 = x t\<^sup>-\<^sup>j mod P.
 We see that (a\<^sub>0 - x t\<^sup>-\<^sup>j)/t is an element of O, and then we choose a\<^sub>1 an 
element of the complete set of representatives which is equal to (a\<^sub>0 - x t\<^sup>-\<^sup>j)/tmodulo P. We see x - (a\<^sub>0t\<^sup>j + a\<^sub>1t\<^bsup>(j+1)\<^esup> + \<dots> + a\<^sub>st\<^bsup>(j+s)\<^esup>) \<in> (t\<^bsup>(j+s+1)\<^esup>). 
"psum G a i K v t x s" is the partial sum a\<^sub>0t\<^sup>j + a\<^sub>1t\<^bsup>(j+1)\<^esup> + \<dots> + a\<^sub>st\<^bsup>(j+s)\<^esup> ***)
  

lemma (in Corps) Kxa_val_ge:"[valuation K v; t carrier K; v t = 1]
 ==> Kxa K v (t) = {x. x carrier K (ant j) (v x)}"
apply (frule val1_neq_0[of v t], assumption+)
apply (cut_tac field_is_ring) 
apply (rule equalityI)
 apply (rule subsetI,
        simp add:Kxa_def, erule bexE,
        frule_tac x = k in Vr_mem_f_mem[of "v"], assumption+,
        frule npowf_mem[of "t" "j"], simp, 
        simp add:Ring.ring_tOp_closed)
 apply (simp add:val_t2p) apply (simp add:val_exp[THEN sym]) 
 apply (simp add:val_pos_mem_Vr[THEN sym, of "v"])
 apply (frule_tac x = 0 and y = "v k" in aadd_le_mono[of _ _ "ant j"])
 apply (simp add:aadd_0_l aadd_commute)
apply (rule subsetI, simp, erule conjE)
 apply (simp add:Kxa_def)
 apply (case_tac "x = 0")
 apply (frule Vr_ring[of "v"], 
        frule Ring.ring_zero[of "Vr K v"],
        simp add:Vr_0_f_0,
        frule_tac x1 = "t" in Ring.ring_times_x_0[THEN sym, of "K"],
        simp add:npowf_mem, blast)
 apply (frule val_exp[of "v" "t" "j"], assumption+, simp) 
 apply (frule field_potent_nonzero1[of "t" "j"], 
        frule npowf_mem[of "t" "j"], assumption+)
 apply (frule_tac y = "v x" in ale_diff_pos[of "v (t)"], 
        simp add:diff_ant_def)
apply (cut_tac npowf_mem[of t j]) 
 defer 
 apply assumption apply simp
apply (frule value_of_inv[THEN sym, of "v" "t"], assumption+) 
 
 apply (cut_tac invf_closed1[of "t"], simp, erule conjE)
 apply (frule_tac x1 = x in val_t2p[THEN sym, of "v" _ "(t)<hyphen>K"], 
        assumption+, simp)
 apply (frule_tac x = "(t)<hyphen>K" and y = x in Ring.ring_tOp_closed[of "K"], 
          assumption+)
 apply (simp add:Ring.ring_tOp_commute[of "K" _ "(t)<hyphen>K"])
 apply (frule_tac x = "((t)<hyphen>K) r x" in val_pos_mem_Vr[of v], assumption+, 
        simp)
 apply (frule_tac z = x in Ring.ring_tOp_assoc[of "K" "t" "(t)<hyphen>K"], 
         assumption+) 
 apply (simp add:Ring.ring_tOp_commute[of K "t" "(t)<hyphen> K"] linvf,
        simp add:Ring.ring_l_one, blast) 
 apply simp
done

lemma (in Corps) Kxa_pow_vpr:"[ valuation K v; t carrier K; v t = 1;
    (0::int) j] ==> Kxa K v (t) = (vp K v)Vr K v) (ant j)"
apply (frule val_surj_n_val[of v], blast) 
apply (simp add:Kxa_val_ge) 
apply (rule equalityI)
 apply (rule subsetI, simp, erule conjE)
 apply (rule_tac x = x in n_value_x_2[of "v" _ "(ant j)"],
            assumption+)
 apply (cut_tac ale_zle[THEN sym, of "0" "j"]) 
 apply (frule_tac a = "0 j" and b = "ant 0 ant j" in a_b_exchange,
         assumption+) 
 apply (thin_tac "(0 j) = (ant 0 ant j)", simp add:ant_0)
 apply (frule_tac k = "v x" in ale_trans[of "0" "ant j"], assumption+)
 apply (simp add:val_pos_mem_Vr) apply simp
 apply (simp only:ale_zle[THEN sym, of "0" "j"], simp add:ant_0)
apply (rule subsetI)
 apply simp 
 apply (frule_tac x = x in mem_vp_apow_mem_Vr[of "v" "ant j"]) 
 apply (simp only:ale_zle[THEN sym, of "0" "j"], simp add:ant_0) 
 apply assumption
apply (simp add:Vr_mem_f_mem[of "v"])
apply (frule_tac x = x in n_value_x_1[of "v" "ant j" _ ])
 apply (simp only:ale_zle[THEN sym, of "0" "j"], simp add:ant_0) 
 apply assumption apply simp
done  

lemma (in Corps) field_distribTr:"[a carrier K; b carrier K;
      x carrier K; x 0] ==> a ± (-a (b r x)) = (a r (x<hyphen>K) ± (-a b)) r x"
apply (cut_tac field_is_ring,
       cut_tac invf_closed1[of x], simp, erule conjE) apply (
       simp add:Ring.ring_inv1_1[of "K" "b" "x"],
       frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_mOp_closed[of "K" "b"], assumption+)
apply (frule Ring.ring_tOp_closed[of "K" "a" "x<hyphen>K"], assumption+,
       simp add:Ring.ring_distrib2, simp add:Ring.ring_tOp_assoc, 
       simp add:linvf,
       simp add:Ring.ring_r_one)
apply simp
done

lemma a0_le_1[simp]:"(0::ant) 1"
by (cut_tac a0_less_1, simp add:aless_imp_le)

lemma (in Corps) vp_mem_times_t:"[valuation K v; t carrier K; t 0;
       v t = 1; x vp K v] ==> acarrier (Vr K v). x = a r t" 
apply (frule Vr_ring[of v],
       frule vp_ideal[of v]) 
 apply (frule val_surj_n_val[of v], blast)
 apply (frule vp_mem_val_poss[of v x],
        frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"], 
        assumption+, simp add:Vr_mem_f_mem, simp) 
 apply (frule gt_a0_ge_1[of "v x"])
 apply (subgoal_tac "v t v x"
 apply (thin_tac "1 v x")
 apply (frule val_Rxa_gt_a_1[of "v" "t" "x"])
 apply (subst val_pos_mem_Vr[THEN sym, of "v" "t"], assumption+)
 apply simp 
 apply (simp add:vp_mem_Vr_mem) apply assumption+
 apply (simp add:Rxa_def, erule bexE) 
 apply (cut_tac a0_less_1) 
 apply (subgoal_tac "0 v t")
 apply (frule val_pos_mem_Vr[of "v" "t"], assumption+)
 apply (simp, simp add:Vr_tOp_f_tOp, blast, simp+)
done

lemma (in Corps) psum_diff_mem_Kxa:"[valuation K v; t carrier K;
      v t = 1; x carrier K; x 0] ==>
     (psumK x v t n) carrier K
     ( x ± (-a (psumK x v t n))) Kxa K v (t(tna (v x)) + (1 + int n)))"
apply (frule val1_neq_0[of v t], assumption+)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Vr_ring[of v], frule vp_ideal[of v])
apply (induct_tac n)
apply (subgoal_tac "x r (t tna (v x)) carrier (Vr K v)",
       rule conjI, simp, rule Ring.ring_tOp_closed[of "K"], assumption+,
       frule Ring.csrp_fn_mem[of "Vr K v" "vp K v" 
       "pj (Vr K v) (vp K v) (x r (t tna (v x)))"], 
       assumption+,
       simp add:pj_mem Ring.qring_carrier, blast,
       simp add:Vr_mem_f_mem, simp add:npowf_mem)
apply (simp, 
     frule npowf_mem[of "t" "tna (v x)"], assumption+,
     frule field_potent_nonzero1[of "t" "tna (v x)"], assumption+,
     subst field_distribTr[of "x" _ "ttna (v x))"], assumption+,
     frule Ring.csrp_fn_mem[of "Vr K v" "vp K v" 
     "pj (Vr K v) (vp K v) (x r (t tna (v x)))"], 
     assumption+,
     simp add:pj_mem Ring.qring_carrier, blast, simp add:Vr_mem_f_mem,
     simp add:npowf_mem, assumption) 
apply (frule Ring.csrp_diff_in_vpr[of "Vr K v" "vp K v" 
       "x r ((ttna (v x)))<hyphen>K)"], assumption+) 
      apply (simp add:npowf_minus)
 
 apply (simp add:npowf_minus)
 apply (frule pj_Hom[of "Vr K v" "vp K v"], assumption+)
 apply (frule rHom_mem[of "pj (Vr K v) (vp K v)" "Vr K v" "Vr K v /r vp K v" 
        "x r (t tna (v x))"], assumption+)
 apply (frule Ring.csrp_fn_mem[of "Vr K v" "vp K v" 
         "pj (Vr K v) (vp K v) (x r (t tna (v x)))"], assumption+)
 apply (frule Ring.ring_is_ag[of "Vr K v"], 
        frule_tac x = "csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v)
       (x r (t tna (v x))))" in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp add:Vr_pOp_f_pOp) apply (simp add:Vr_mOp_f_mOp)
apply (frule_tac x = "x r (t tna (v x)) ± -a (csrp_fn (Vr K v) (vp K v)
      (pj (Vr K v) (vp K v) (x r (t tna (v x)))))" in 
      vp_mem_times_t[of "v" "t"], assumption+, erule bexE, simp)
apply (frule_tac x = a in Vr_mem_f_mem[of  "v"], assumption+)
apply (simp add:Ring.ring_tOp_assoc[of "K"])
 apply (simp add:npowf_exp_1_add[THEN sym, of "t" "tna (v x)"]) 
 apply (simp add:add.commute)
apply (simp add:Kxa_def) 
apply (frule npowf_mem[of "t" "1 + tna (v x)"], assumption+)
apply (simp add:Ring.ring_tOp_commute[of "K" _ "t1 + tna (v x))"])
 apply blast
 apply (frule npowf_mem[of  "t" "- tna (v x)"], assumption+)
 apply (frule Ring.ring_tOp_closed[of "K" "x" "t tna (v x)"], assumption+)
apply (subst val_pos_mem_Vr[THEN sym, of v], assumption+)
 apply (simp add:val_t2p) apply (simp add:val_exp[THEN sym, of "v" "t"])
 apply (simp add:aminus[THEN sym])
 apply (frule value_in_aug_inf[of "v" "x"], assumption+, 
        simp add:aug_inf_def)
 apply (frule val_nonzero_noninf[of "v" "x"], assumption+,
         simp add:ant_tna)
 apply (simp add:aadd_minus_r)

apply (erule conjE)
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (rule conjI)
 apply simp
 apply (rule aGroup.ag_pOp_closed, assumption+)
 apply (rule Ring.ring_tOp_closed[of "K"], assumption+)
 apply (simp add:Kxa_def, erule bexE, simp)
 apply (subst Ring.ring_tOp_commute, assumption+)
 apply (rule npowf_mem, assumption+) apply (simp add:Vr_mem_f_mem)
 apply (frule_tac n = "tna (v x) + (1 + int n)" in npowf_mem[of t ], 
        assumption,
        frule_tac n = "- tna (v x) + (-1 - int n)" in npowf_mem[of t ], 
        assumption,
        frule_tac x = k in Vr_mem_f_mem[of v], assumption+)
 apply (simp add:Ring.ring_tOp_assoc npowf_exp_add[THEN sym, of t])
  apply (simp add:field_npowf_exp_zero) 
  apply (simp add:Ring.ring_r_one)

 apply (frule pj_Hom[of "Vr K v" "vp K v"], assumption+)
 apply (frule_tac a = k in rHom_mem[of "pj (Vr K v) (vp K v)" "Vr K v" 
        "Vr K v /r vp K v"], assumption+)
 apply (frule_tac x = "pj (Vr K v) (vp K v) k" in Ring.csrp_fn_mem[of "Vr K v" 
        "vp K v"], assumption+)
 apply (simp add:Vr_mem_f_mem)
 apply (rule npowf_mem, assumption+)

apply (simp add:Kxa_def) apply (erule bexE, simp)
apply (frule_tac x = k in Vr_mem_f_mem[of "v"], assumption+)
apply (frule_tac n = "tna (v x) + (1 + int n)" in npowf_mem[of "t"], 
       assumption+)
apply (frule_tac n = "- tna (v x) + (- 1 - int n)" in npowf_mem[of "t"], 
       assumption+)
apply (frule_tac x = "ttna (v x) + (1 + int n))" and y = k in 
      Ring.ring_tOp_commute[of "K"], assumption+) apply simp
apply (simp add:Ring.ring_tOp_assoc, simp add:npowf_exp_add[THEN sym])
   apply (simp add:field_npowf_exp_zero) 
   apply (simp add:Ring.ring_r_one)
   apply (thin_tac "(ttna (v x) + (1 + int n))) r k =
            k r (ttna (v x) + (1 + int n)))")
apply (frule pj_Hom[of "Vr K v" "vp K v"], assumption+)
apply (frule_tac a = k in rHom_mem[of "pj (Vr K v) (vp K v)" "Vr K v" 
        "Vr K v /r vp K v"], assumption+)
 apply (frule_tac x = "pj (Vr K v) (vp K v) k" in Ring.csrp_fn_mem[of "Vr K v" 
        "vp K v"], assumption+)
 apply (frule_tac x = "csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v) k)" in 
        Vr_mem_f_mem[of v], assumption+)
 apply (frule_tac x = "csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v) k)" and
 y = "ttna (v x) + (1 + int n))" in Ring.ring_tOp_closed[of "K"], assumption+)
 apply (simp add:aGroup.ag_p_inv[of "K"])
 apply (frule_tac x = "psumK x v t n" in aGroup.ag_mOp_closed[of "K"], 
          assumption+)
 apply (frule_tac x = "(csrp_fn (Vr K v) (vp K v)(pj (Vr K v) (vp K v) k)) r
       (ttna (v x) + (1 + int n)))" in aGroup.ag_mOp_closed[of "K"], assumption+)
 apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+)
 apply simp
 apply (simp add:Ring.ring_inv1_1)
 apply (subst Ring.ring_distrib2[THEN sym, of "K"], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)
 apply (frule_tac x = k in  Ring.csrp_diff_in_vpr[of "Vr K v" "vp K v"]
     , assumption+)
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule_tac x = "csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v) k)" in 
        aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp add:Vr_pOp_f_pOp) apply (simp add:Vr_mOp_f_mOp)
 apply (frule_tac x = "k ± -a (csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v)
 k))" in vp_mem_times_t[of "v" "t"], assumption+, erule bexE, simp)
 apply (frule_tac x = a in Vr_mem_f_mem[of v], assumption+)
 apply (simp add:Ring.ring_tOp_assoc[of "K"])
 apply (simp add:npowf_exp_1_add[THEN sym, of "t"])
 apply (simp add:add.commute[of "2"])
 apply (simp add:add.assoc)
 apply (subst Ring.ring_tOp_commute, assumption+)
 apply (rule npowf_mem, assumption+) apply blast
done

lemma Suc_diff_int:"0 < n ==> int (n - Suc 0) = int n - 1" 
  by (cut_tac of_nat_Suc[of "n - Suc 0"], simp)

lemma (in Corps) ecf_mem:"[valuation K v; t carrier K; v t = 1;
      x carrier K; x 0 ] ==> ecf v t x n carrier K"
apply (frule val1_neq_0[of v t], assumption+)
apply (cut_tac field_is_ring,
       frule Vr_ring[of v], frule vp_ideal[of v])
apply (case_tac "n = 0")
 apply (simp add:expand_coeff_def)
 apply (rule Vr_mem_f_mem[of v], assumption+)
 apply (rule Ring.csrp_fn_mem, assumption+)
 apply (subgoal_tac "x r (t tna (v x)) carrier (Vr K v)")
 apply (simp add:pj_mem Ring.qring_carrier, blast)
apply (frule npowf_mem[of  "t" "- tna (v x)"], assumption+,
       subst val_pos_mem_Vr[THEN sym, of v "x r (t- tna(v x)))"], 
       assumption+,
       rule Ring.ring_tOp_closed, assumption+) 
apply (simp add:val_t2p,
       simp add:val_exp[THEN sym, of  "v" "t" "- tna (v x)"]) 
apply (frule value_in_aug_inf[of  "v" "x"], assumption+,
       simp add:aug_inf_def)
      apply (frule val_nonzero_noninf[of  "v" "x"], assumption+)
  apply (simp add:aminus[THEN sym], simp add:ant_tna)
  apply (simp add:aadd_minus_r)

apply (simp add:expand_coeff_def) 
apply (frule psum_diff_mem_Kxa[of  "v" "t" "x" "n - 1"],
                   assumption+, erule conjE)
apply (simp add:Kxa_def, erule bexE,
       frule_tac x = k in Vr_mem_f_mem[of v], assumption+,
     frule npowf_mem[of  "t" "tna (v x) + (1 + int (n - Suc 0))"], 
     assumption+,
   frule npowf_mem[of  "t" "-tna (v x) - int n"], assumption+)
  apply simp
apply(simp add:Ring.ring_tOp_commute[of "K" "ttna (v x) + (int n))"])
 apply (simp add:Ring.ring_tOp_assoc, simp add:npowf_exp_add[THEN sym])

 apply (simp add:npowf_def, simp add:Ring.ring_r_one)
apply (rule Vr_mem_f_mem, assumption+)
 apply (rule Ring.csrp_fn_mem, assumption+)
 apply (simp add:pj_mem Ring.qring_carrier, blast)
done

lemma (in Corps) etm_mem:"[valuation K v; t carrier K; v t = 1;
     x carrier K; x 0] ==> etm v t x n carrier K"
apply (frule val1_neq_0[of v t], assumption+)
apply (simp add:expand_term_def)
apply (cut_tac field_is_ring,
       rule Ring.ring_tOp_closed[of "K"], assumption)
apply (simp add:ecf_mem)
apply (simp add:npowf_mem)
done

lemma (in Corps) psum_sum_etm:"[valuation K v; t carrier K; v t = 1;
      x carrier K; x 0] ==>
 psum x v t n = nsum K (λj. (ecf v t x j)r (ttna (v x) + (int j)))) n" 
apply (frule val1_neq_0[of v t], assumption+)
apply (induct_tac "n")
 apply (simp add:expand_coeff_def)
apply (rotate_tac -1, drule sym)
apply simp
 apply (thin_tac e K (λj. ecf v t x j r ttna (v x) + int j)) n =
         psumK x v t n")
 apply (simp add:expand_coeff_def)
done

lemma zabs_pos:"0 (abs (z::int))"
by (simp add:zabs_def)

lemma abs_p_self_pos:"0 z + (abs (z::int))"
by (simp add:zabs_def)

lemma zadd_right_mono:"(i::int) j ==> i + k j + k"
by simp

theorem (in Corps) expansion_thm:"[valuation K v; t carrier K;
       v t = 1; x carrier K; x 0] ==> lim v (partial_sum K x v t) x" 
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (simp add:limit_def)
 apply (rule allI)
 apply (subgoal_tac "n. (N + na (Abs (v x))) < n
                     psum x v t n ± -a x vp K vVr K v) (an N)")
 apply blast
apply (rule allI, rule impI)
apply (frule_tac n = n in psum_diff_mem_Kxa[of "v" "t" "x"],
          assumption+, erule conjE) 
apply (frule_tac j = "tna (v x) + (1 + int n)" in  Kxa_val_ge[of "v" "t"], 
       assumption+)
 apply simp
 apply (thin_tac "Kxa K v (ttna (v x) + (1 + int n))) =
           {xa carrier K. ant (tna (v x) + (1 + int n)) v xa}")
 apply (erule conjE)
 apply (simp add:a_zpz[THEN sym])

apply (subgoal_tac "(an N) v (psumK x v t n ± -a x)")
 
 apply (frule value_in_aug_inf[of v x], assumption+,
       simp add:aug_inf_def)
      apply (frule val_nonzero_noninf[of v x], assumption+)
  apply (simp add:ant_tna)
 apply (frule val_surj_n_val[of v], blast)
apply (rule_tac x = "psum x v t n ± -a x" and n = "an N" in 
                     n_value_x_2[of  "v"], assumption+) 
apply (subst val_pos_mem_Vr[THEN sym, of v], assumption+)
apply (rule aGroup.ag_pOp_closed[of "K"], assumption+)
apply (simp add:aGroup.ag_mOp_closed)

apply (cut_tac n = N in an_nat_pos)
apply (rule_tac i = 0 and j = "an N" and k = "v (psumK x v t n ± -a x)" in 
       ale_trans, assumption+)
apply simp
apply simp

apply (frule_tac x1 = "x ± (-a psum x v t n)" in val_minus_eq[THEN sym,
      of v], assumption+, simp,
      thin_tac "v ( x ± -a psumK x v t n) = v (-a ( x ± -a psumK x v t n))")
 apply (frule_tac x = "psumK x v t n" in aGroup.ag_mOp_closed[of "K"],
        assumption+, simp add:aGroup.ag_p_inv, simp add:aGroup.ag_inv_inv)
 apply (frule aGroup.ag_mOp_closed[of "K" "x"], assumption+)
 apply (simp add:aGroup.ag_pOp_commute[of "K" "-a x"])

apply (cut_tac Abs_pos[of "v x"])
apply (frule val_nonzero_z[of v x], assumption+, erule exE, simp) 
apply (simp add:na_def) 
apply (cut_tac aneg_less[THEN sym, of "0" "Abs (v x)"], simp)
apply (frule val_nonzero_noninf[of v x], assumption+)
apply (simp add:tna_ant)
apply (simp only:ant_1[THEN sym], simp del:ant_1 add:a_zpz)
apply (simp add:add.assoc[THEN sym])
apply (cut_tac m1 = "N + nat z" and n1 = n in of_nat_less_iff [where ?'a = int, THEN sym], simp)
apply (frule_tac a = "int N + abs z" and b = "int n" and c = "z + 1" in 
       add_strict_right_mono, simp only:add.commute)
apply (simp only:add.assoc[of _ "1"])
apply (simp only:add.assoc[THEN sym, of "1"])
apply (simp only:add.commute[of "1"])
apply (simp only:add.assoc[of _ "1"])
apply (cut_tac ?a1 = z and ?b1 = "abs z" and ?c1 = "1 + int N" in 
       add.assoc[THEN sym])
apply (thin_tac "z + int N < int n")
apply (frule_tac a = "z + (z + (1 + int N))" and b = "z + z + (1 + int N)" and c = "int n + (z + 1)" in ineq_conv1, assumption+)
apply (thin_tac "z + (z + (1 + int N)) < int n + (z + 1)",
       thin_tac "z + (z + (1 + int N)) = z + z + (1 + int N)",
       thin_tac "N + nat z < n")
apply (cut_tac z = z in abs_p_self_pos)
apply (frule_tac i = 0 and j = "z + abs z" and k = "1 + int N" in 
        zadd_right_mono) 
apply (simp only:add_0)
apply (frule_tac i = "1 + int N" and j = "z + z + (1 + int N)" and 
       k = "int n + (z + 1)" in zle_zless_trans, assumption+) 
apply (thin_tac "z + z + (1 + int N) < int n + (z + 1)",
       thin_tac "0 z + z",
       thin_tac "1 + int N z + z + (1 + int N)")
apply (cut_tac m1 = "1 + int N" and n1 = "int n + (z + 1)" in 
       aless_zless[THEN sym], simp)

apply (frule_tac x = "ant (1 + int N)" and y = "ant (int n + (z + 1))"
       and z = "v ( psumK x v t n ± -a x)" in aless_le_trans, assumption+)
apply (thin_tac "ant (1 + int N) < ant (int n + (z + 1))")

apply (simp add:a_zpz[THEN sym])
apply (frule_tac x = "1 + ant (int N)" and y = "v ( psumK x v t n ± -a x)" in 
       aless_imp_le, thin_tac "1 + ant (int N) < v ( psumK x v t n ± -a x)")
apply (cut_tac a0_less_1, frule aless_imp_le[of "0" "1"])
apply (frule_tac b = "ant (int N)" in aadd_pos_le[of "1"])
apply (subst an_def)
apply (rule_tac i = "ant (int N)" and j = "1 + ant (int N)" and 
       k = "v ( psumK x v t n ± -a x)" in ale_trans, assumption+)
done

subsection "Hensel's theorem"

definition
(*** Cauchy sequence of polynomials in (Vr K v)[X] ***)
  pol_Cauchy_seq :: "[('b, 'm) Ring_scheme, 'b, _, 'b ==> ant,
         nat ==> 'b] ==> bool" ((5PCauchy_ _ _ _ _) [90,90,90,90,91]90where
  "PCauchy X K v F (n. (F n) carrier R)
    (d. (n. deg R (Vr K v) X (F n) (an d)))
    (N. M. (n m. M < n M < m
        P_mod R (Vr K v) X ((vp K v)Vr K v) (an N)) (F n ± -a (F m))))"

definition
  pol_limit :: "[('b, 'm) Ring_scheme, 'b, _, 'b ==> ant,
             nat ==> 'b, 'b] ==> bool" 
             ((6Plimit_ _ _ _ _ _) [90,90,90,90,90,91]90where
  "Plimit X K v F p (n. (F n) carrier R)
    (N. M. (m. M < m
        P_mod R (Vr K v) X ((vp K v)Vr K v) (an N)) ((F m) ± -a p)))"

definition
  Pseql :: "[('b, 'm) Ring_scheme, 'b, _, 'b ==> ant, nat,
             nat ==> 'b] ==> nat ==> 'b" 
            ((6Pseql _ _ _ _ _) [90,90,90,90,90,91]90where
  "Pseql X K v d F = (λn. (ldeg_p R (Vr K v) X d (F n)))"

   (** deg R (Vr K v) X (F n) \<le> an (Suc d) **)

definition
  Pseqh :: "[('b, 'm) Ring_scheme, 'b, _, 'b ==> ant, nat, nat ==> 'b] ==>
        nat ==> 'b" 
           ((6Pseqh_ _ _ _ _ _) [90,90,90,90,90,91]90where
  "Pseqh X K v d F = (λn. (hdeg_p R (Vr K v) X (Suc d) (F n)))"

    (** deg R (Vr K v) X (F n) \<le> an (Suc d) **)

lemma an_neq_minf[simp]:"n. - an n"
apply (rule allI)
apply (simp add:an_def) apply (rule not_sym) apply simp
done

lemma an_neq_minf1[simp]:"n. an n -" 
apply (rule allI) apply (simp add:an_def)
done

lemma (in Corps) Pseql_mem:"[valuation K v; PolynRg R (Vr K v) X;
      F n carrier R; n. deg R (Vr K v) X (F n) an (Suc d)] ==>
                     (Pseql X K v d F) n carrier R"
apply (frule PolynRg.is_Ring)
apply (simp add:Pseql_def)
apply (frule Vr_ring[of "v"], 
       rule PolynRg.ldeg_p_mem, assumption+, simp)
done

lemma (in Corps) Pseqh_mem:"[valuation K v; PolynRg R (Vr K v) X;
      F n carrier R; n. deg R (Vr K v) X (F n) an (Suc d)] ==>
                     (Pseqh X K v d F) n carrier R"
apply (frule PolynRg.is_Ring)
apply (frule Vr_ring[of "v"]) 
apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
apply (simp del:npow_suc add:Pseqh_def)
apply (rule PolynRg.hdeg_p_mem, assumption+, simp)
done

lemma (in Corps) PCauchy_lTr:"[valuation K v; PolynRg R (Vr K v) X;
    p carrier R; deg R (Vr K v) X p an (Suc d);
    P_mod R (Vr K v) X (vp K vVr K v) (an N)) p] ==>
    P_mod R (Vr K v) X (vp K vVr K v) (an N)) (ldeg_p R (Vr K v) X d p)"
apply (frule PolynRg.is_Ring)
apply (simp add:ldeg_p_def)
apply (frule Vr_ring[of v])
apply (frule PolynRg.scf_d_pol[of "R" "Vr K v" "X" "p" "Suc d"], assumption+,
       (erule conjE)+)
apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp)
apply (frule PolynRg.P_mod_mod[THEN sym, of R "Vr K v" X "vp K v(Vr K v) (an N)"
       p "scf_d R (Vr K v) X p (Suc d)"], assumption+, simp)
apply (subst PolynRg.polyn_expr_short[of R "Vr K v" X 
             "scf_d R (Vr K v) X p (Suc d)" d], assumption+, simp)
apply (subst PolynRg.P_mod_mod[THEN sym, of R "Vr K v" X "vp K v(Vr K v) (an N)"
       "polyn_expr R X d (d, snd (scf_d R (Vr K v) X p (Suc d)))" 
       "(d, snd (scf_d R (Vr K v) X p (Suc d)))"], assumption+)
apply (subst PolynRg.polyn_expr_short[THEN sym], simp+,
       simp add:PolynRg.polyn_mem)
apply (subst pol_coeff_def, rule allI, rule impI, 
       simp add:PolynRg.pol_coeff_mem)
apply simp+
done

lemma (in Corps) PCauchy_hTr:"[valuation K v; PolynRg R (Vr K v) X;
      p carrier R; deg R (Vr K v) X p an (Suc d);
      P_mod R (Vr K v) X (vp K vVr K v) (an N)) p]
  ==> P_mod R (Vr K v) X (vp K vVr K v) (an N)) (hdeg_p R (Vr K v) X (Suc d) p)"
apply (frule PolynRg.is_Ring)
apply (cut_tac Vr_ring[of v])
apply (frule PolynRg.scf_d_pol[of R "Vr K v" X p "Suc d"], assumption+)
apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp)
apply (frule PolynRg.P_mod_mod[THEN sym, of "R" "Vr K v" "X" 
       "vp K v(Vr K v) (an N)" p "scf_d R (Vr K v) X p (Suc d)"], assumption+,
       simp+)
apply (subst hdeg_p_def) 
apply (subst PolynRg.monomial_P_mod_mod[THEN sym, of "R" "Vr K v" "X" 
       "vp K v(Vr K v) (an N)" "snd (scf_d R (Vr K v) X p (Suc d)) (Suc d)" 
       "(snd (scf_d R (Vr K v) X p (Suc d)) (Suc d)) r (X^ (Suc d))" 
       "Suc d"], 
       assumption+)
apply (rule PolynRg.pol_coeff_mem[of R "Vr K v" X 
       "scf_d R (Vr K v) X p (Suc d)" "Suc d"], assumption+, simp+)
done
 
lemma (in Corps) v_ldeg_p_pOp:"[valuation K v; PolynRg R (Vr K v) X;
      p carrier R; q carrier R; deg R (Vr K v) X p an (Suc d);
      deg R (Vr K v) X q an (Suc d)] ==>
      (ldeg_p R (Vr K v) X d p) ± (ldeg_p R (Vr K v) X d q) =
                              ldeg_p R (Vr K v) X d (p ± q)"
by (simp add:PolynRg.ldeg_p_pOp[of R "Vr K v" X p q d]) 

lemma (in Corps) v_hdeg_p_pOp:"[valuation K v; PolynRg R (Vr K v) X;
      p carrier R; q carrier R; deg R (Vr K v) X p an (Suc d);
      deg R (Vr K v) X q an (Suc d)] ==> (hdeg_p R (Vr K v) X (Suc d) p) ±
      (hdeg_p R (Vr K v) X (Suc d) q) = hdeg_p R (Vr K v) X (Suc d) (p ± q)"
by (simp add:PolynRg.hdeg_p_pOp[of R "Vr K v" X p q d])

lemma (in Corps) v_ldeg_p_mOp:"[valuation K v; PolynRg R (Vr K v) X;
       p carrier R;deg R (Vr K v) X p an (Suc d)] ==>
       -a (ldeg_p R (Vr K v) X d p) = ldeg_p R (Vr K v) X d (-a p)"
by (simp add:PolynRg.ldeg_p_mOp)


lemma (in Corps) v_hdeg_p_mOp:"[valuation K v; PolynRg R (Vr K v) X;
    p carrier R;deg R (Vr K v) X p an (Suc d)] ==>
   -a (hdeg_p R (Vr K v) X (Suc d) p) = hdeg_p R (Vr K v) X (Suc d) (-a p)"
by (simp add:PolynRg.hdeg_p_mOp)

lemma (in Corps) PCauchy_lPCauchy:"[valuation K v; PolynRg R (Vr K v) X;
      n. F n carrier R; n. deg R (Vr K v) X (F n) an (Suc d);
      P_mod R (Vr K v) X (vp K vVr K v) (an N)) (F n ± -a (F m))]
      ==> P_mod R (Vr K v) X (vp K vVr K v) (an N))
                     (((Pseql X K v d F) n) ± -a ((Pseql X K v d F) m))"
apply (frule PolynRg.is_Ring)
apply (cut_tac Vr_ring[of v],
       frule Ring.ring_is_ag[of "R"],
       frule PolynRg.subring[of "R" "Vr K v" "X"])
apply (simp add:Pseql_def)
apply (subst v_ldeg_p_mOp[of "v" "R" "X" _ "d"], assumption+,
       simp, simp)
apply (subst v_ldeg_p_pOp[of v R X "F n" "-a (F m)"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp, simp,
       simp add:PolynRg.deg_minus_eq1)
apply (rule PCauchy_lTr[of v R X "F n ± -a (F m)" "d" "N"],
       assumption+,
       rule aGroup.ag_pOp_closed[of "R" "F n" "-a (F m)"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption+, simp)
apply (frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "F m"], simp)
apply (rule PolynRg.polyn_deg_add4[of "R" "Vr K v" "X" "F n" 
       "-a (F m)" "Suc d"], assumption+, simp,
       rule aGroup.ag_mOp_closed, assumption, simp+)
done

lemma (in Corps) PCauchy_hPCauchy:"[valuation K v; PolynRg R (Vr K v) X;
      n. F n carrier R; n. deg R (Vr K v) X (F n) an (Suc d);
      P_mod R (Vr K v) X (vp K vVr K v) (an N)) (F n ± -a (F m))]
      ==> P_mod R (Vr K v) X (vp K vVr K v) (an N))
                     (((Pseqh X K v d F) n) ± -a ((Pseqh X K v d F) m))"
apply (frule PolynRg.is_Ring)
apply (frule Vr_ring[of v], frule Ring.ring_is_ag[of "R"],
       frule PolynRg.subring[of "R" "Vr K v" "X"], 
       frule vp_apow_ideal[of v "an N"], simp) 

apply (simp add:Pseqh_def,
       subst v_hdeg_p_mOp[of v R X "F m" "d"], assumption+,
       simp+)

apply (subst v_hdeg_p_pOp[of v R X "F n" "-a (F m)"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp, simp,
       frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "F m"],
       simp+ )
apply (frule PCauchy_hTr[of "v" "R" "X" "F n ± -a (F m)" "d" "N"],
    assumption+,
    rule aGroup.ag_pOp_closed[of "R" "F n" "-a (F m)"], assumption+,
    simp, rule aGroup.ag_mOp_closed, assumption+, simp)
apply (frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "F m"], simp+)
apply (rule PolynRg.polyn_deg_add4[of "R" "Vr K v" "X" "F n" "-a (F m)" 
       "Suc d"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp+)
done

(** Don't forget  t_vp_apow  ***)
 
lemma (in Corps) Pseq_decompos:"[valuation K v; PolynRg R (Vr K v) X;
      F n carrier R; deg R (Vr K v) X (F n) an (Suc d)]
      ==> F n = ((Pseql X K v d F) n) ± ((Pseqh X K v d F) n)"
apply (frule PolynRg.is_Ring)
apply (simp del:npow_suc add:Pseql_def Pseqh_def)
apply (frule Vr_ring[of v])
apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
apply (rule PolynRg.decompos_p[of "R" "Vr K v" "X" "F n" "d"], assumption+)
done

lemma (in Corps) deg_0_const:"[valuation K v; PolynRg R (Vr K v) X;
      p carrier R; deg R (Vr K v) X p 0] ==> p carrier (Vr K v)"
apply (frule Vr_ring[of v])
apply (frule PolynRg.subring)
apply (frule PolynRg.is_Ring)
apply (case_tac "p = 0", simp,
       simp add:Ring.Subring_zero_ring_zero[THEN sym],
       simp add:Ring.ring_zero)
apply (subst PolynRg.pol_of_deg0[THEN sym, of "R" "Vr K v" "X" "p"], 
        assumption+)
apply (simp add:PolynRg.deg_an, simp only:an_0[THEN sym])
apply (simp only:ale_nat_le[of "deg_n R (Vr K v) X p" "0"])
done

lemma (in Corps) monomial_P_limt:"[valuation K v; Complete K;
     PolynRg R (Vr K v) X; n. f n carrier (Vr K v);
     n. F n = (f n) r (X^ d); N. M. n m. M < n M < m
     P_mod R (Vr K v) X (vp K vVr K v) (an N)) (F n ± -a (F m))] ==>
        bcarrier (Vr K v). PlimitR X K v F (b r (X^ d))"
apply (frule PolynRg.is_Ring)
apply (frule Vr_ring[of v])
apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
apply simp

apply (subgoal_tac "CauchyK v f")
 apply (simp add:v_complete_def)
 apply (drule_tac a = f in forall_spec)
 apply (thin_tac "N. M. n m. M < n M < m
        P_mod R (Vr K v) X (vp K vVr K v) (an N))
        ((f n) r (X^ d) ± -a (f m) r (X^ d))", assumption)
 apply (erule exE, erule conjE)
 apply (subgoal_tac "b carrier (Vr K v)")
 apply (subgoal_tac "PlimitR X K v F (b r (X^ d))", blast)
 
(******* b \<in> carrier (Vr K v) ***********)
apply (simp add:pol_limit_def)
apply (rule conjI)
 apply (rule allI)
 apply (rule Ring.ring_tOp_closed[of "R"], assumption)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (rule Ring.mem_subring_mem_ring[of "R" "Vr K v"], assumption+) 
 apply simp
 
 apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
 apply (simp add:Ring.npClose)
apply (thin_tac "n. F n = f n r X^ d"
apply (simp add:limit_def)
 apply (rule allI)
(* apply (simp add:t_vp_apow[of "K" "v" "t"]) *) 
 apply (rotate_tac -2, drule_tac x = N in spec) 
 apply (erule exE)
 apply (subgoal_tac "n> M. P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                   ((f n)r (X^ d) ± -a (b r (X^ d)))", blast) 
 apply (rule allI, rule impI)
 apply (rotate_tac -2, drule_tac x = n in spec, simp)
 apply (drule_tac x = n in spec)

apply (frule_tac x = "f n" in Ring.mem_subring_mem_ring[of "R" "Vr K v"], 
       assumption+,
       frule_tac x = b in Ring.mem_subring_mem_ring[of "R" "Vr K v"], 
       assumption+)
apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
 apply (frule Ring.npClose[of "R" "X" "d"], assumption+)
 apply (simp add:Ring.ring_inv1_1)
 apply (frule Ring.ring_is_ag[of "R"],
        frule_tac x = b in aGroup.ag_mOp_closed[of "R"], assumption+)
 apply (subst Ring.ring_distrib2[THEN sym, of "R" "X^ d"], assumption+)

 apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp) 
 apply (frule_tac I = "vp K v(Vr K v) (an N)" and c = "f n ± -a b" and 
        p = "(f n ± -a b) r (X^ d)" in  
        PolynRg.monomial_P_mod_mod[of "R" "Vr K v" "X" _ _ _ "d"], assumption+)
 apply (simp add:Ring.Subring_minus_ring_minus[THEN sym])
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule_tac x = b in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp only:Ring.Subring_pOp_ring_pOp[THEN sym])
 apply (rule aGroup.ag_pOp_closed, assumption+) apply simp
 apply (frule_tac I1 = "vp K v(Vr K v) (an N)" and c1 = "f n ± -a b" and 
     p1 = "(f n ± -a b) r (X^ d)" in PolynRg.monomial_P_mod_mod[THEN sym, 
     of "R" "Vr K v" "X" _ _ _ "d"], assumption+)
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule_tac x = b in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp only:Ring.Subring_minus_ring_minus[THEN sym])
 apply (simp only:Ring.Subring_pOp_ring_pOp[THEN sym])
 apply (rule aGroup.ag_pOp_closed, assumption+) apply simp apply simp
 apply (simp only:Vr_mOp_f_mOp[THEN sym])
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule_tac x = b in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp add:Vr_pOp_f_pOp[THEN sym])
 apply (simp add:Ring.Subring_pOp_ring_pOp)
 apply (simp add:Ring.Subring_minus_ring_minus)

 apply (case_tac "b = 0", simp add:Vr_0_f_0[THEN sym], 
        simp add:Ring.ring_zero)
 apply (frule_tac b = b in limit_val[of  _ "f" "v"], assumption+,
        rule allI,
        frule_tac x = j in spec, simp add:Vr_mem_f_mem,
        assumption+, erule exE)
 apply (thin_tac "n. F n = f n r X^ d",
        thin_tac "N. M. n m. M < n M < m
                         P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                          (f n r X^ d ± -a f m r X^ d)")  
 apply (rotate_tac -1, drule_tac x = "Suc N" in spec, simp)
 apply (drule_tac x = "Suc N" in spec)
 apply (frule_tac x1 = "f (Suc N)" in val_pos_mem_Vr[THEN sym, of v],
        simp add:Vr_mem_f_mem, simp, simp add:val_pos_mem_Vr[of v]) 

apply (simp add:Cauchy_seq_def)
 apply (simp add:Vr_mem_f_mem)
 apply (rule allI)
 apply (rotate_tac -3, frule_tac x = N in spec)

 apply (thin_tac "n. F n = f n r X^ d")
 (*apply (simp add:t_vp_apow[of "K" "v" "t"]) *) 
 apply (frule_tac n = "an N" in vp_apow_ideal[of "v"], simp)
 apply (drule_tac x = N in spec, erule exE) 
 apply (subgoal_tac "n m. M < n M < m
                      f n ± -a (f m) vp K v(Vr K v) (an N)", blast)
 apply (rule allI)+
 apply (rule impI, erule conjE)
 apply (frule_tac I = "vp K v(Vr K v) (an N)" and c = "f n ± -a (f m)" and 
   p = "(f n ± -a (f m)) r (X^ d)" in
   PolynRg.monomial_P_mod_mod[of "R" "Vr K v" "X" _ _ _ "d"], assumption+)
 
 apply (frule_tac x = n in spec,
        drule_tac x = m in spec)
 apply (frule Ring.ring_is_ag[of "Vr K v"],
        simp add:Vr_mOp_f_mOp[THEN sym],
        frule_tac x = "f m" in aGroup.ag_mOp_closed[of "Vr K v"], assumption+,
        simp add:Vr_pOp_f_pOp[THEN sym])
 apply (rule aGroup.ag_pOp_closed, assumption+, simp)
 apply simp 
 apply (thin_tac "(f n ± -a f m vp K v(Vr K v) (an N)) =
        P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) ((f n ± -a f m) r X^ d)")
 apply (rotate_tac -3, drule_tac x = n in spec,
        rotate_tac -1, drule_tac x = m in spec, simp)
 apply (frule_tac x = n in spec,
        drule_tac x = m in spec)
 apply (frule_tac x = "f n" in Ring.mem_subring_mem_ring[of R "Vr K v"],
         assumption+,
        frule_tac x = "f m" in Ring.mem_subring_mem_ring[of R "Vr K v"],
         assumption+,
        frule Ring.ring_is_ag[of R],
        frule_tac x = "f m" in aGroup.ag_mOp_closed[of R], assumption+,
        frule PolynRg.X_mem_R[of R "Vr K v" X],
        frule Ring.npClose[of R X d], assumption)
 apply (simp add:Ring.ring_inv1_1[of R],
        frule_tac y1 = "f n" and z1 = "-a f m" in Ring.ring_distrib2[
        THEN sym, of R "X^ d"], assumption+, simp,
        thin_tac "f n r X^ d ± (-a f m) r X^ d =
                                           (f n ± -a f m) r X^ d")
 apply (simp only:Ring.Subring_minus_ring_minus[THEN sym,of R "Vr K v"])
 apply (frule Ring.subring_Ring[of R "Vr K v"], assumption,
        frule Ring.ring_is_ag[of "Vr K v"],
        frule_tac x = "f m" in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp add:Ring.Subring_pOp_ring_pOp[THEN sym, of R "Vr K v"],
        simp add:Vr_pOp_f_pOp, simp add:Vr_mOp_f_mOp)
done

lemma (in Corps) mPlimit_uniqueTr:"[valuation K v;
     PolynRg R (Vr K v) X; n. f n carrier (Vr K v);
     n. F n = (f n) r (X^ d); c carrier (Vr K v);
     PlimitR X K v F (c r (X^ d))] ==> limK v f c"
apply (frule PolynRg.is_Ring,
       simp add:pol_limit_def limit_def,
       rule allI,
       erule conjE,
       rotate_tac -1, drule_tac x = N in spec,
       erule exE)
apply (subgoal_tac "n. M < n f n ± -a c vp K v(Vr K v) (an N)", blast)
apply (rule allI, rule impI,
       rotate_tac -2, drule_tac x = n in spec, simp,
       drule_tac x = n in spec,
       drule_tac x = n in spec,
       thin_tac "n. f n r X^ d carrier R")
apply (frule Vr_ring[of v],
       frule PolynRg.X_mem_R[of "R" "Vr K v" "X"],
       frule Ring.npClose[of "R" "X" "d"], assumption+,
       frule PolynRg.subring[of "R" "Vr K v" "X"])
apply (frule_tac x = c in Ring.mem_subring_mem_ring[of "R" "Vr K v"],
       assumption+,
      frule_tac x = "f n" in Ring.mem_subring_mem_ring[of "R" "Vr K v"],
       assumption+)
apply (simp add:Ring.ring_inv1_1,
       frule Ring.ring_is_ag[of "R"],
       frule aGroup.ag_mOp_closed[of "R" "c"], assumption+)
apply (simp add:Ring.ring_distrib2[THEN sym, of "R" "X^ d" _ "-a c"],
       simp add:Ring.Subring_minus_ring_minus[THEN sym],
       frule Ring.ring_is_ag[of "Vr K v"],
       frule aGroup.ag_mOp_closed[of "Vr K v" "c"], assumption+)
apply (simp add:Ring.Subring_pOp_ring_pOp[THEN sym],
       frule_tac x = "f n" in aGroup.ag_pOp_closed[of "Vr K v" _
        "-aVr K v) c"], assumption+,
       frule_tac n = "an N" in vp_apow_ideal[of "v"], simp,
       frule_tac I1 = "vp K v(Vr K v) (an N)" and
        c1 = "f n ±Vr K v) -aVr K v) c" and p1 = "(f n ±Vr K v) -aVr K v) c)
       r (X^ d)" in PolynRg.monomial_P_mod_mod[THEN sym, of R "Vr K v"
        X _ _ _ d], assumption+, simp, simp)
 apply (simp add:Vr_pOp_f_pOp, simp add:Vr_mOp_f_mOp)
done

lemma (in Corps) mono_P_limt_unique:"[valuation K v;
  PolynRg R (Vr K v) X; n. f n carrier (Vr K v);
  n. F n = (f n) r (X^ d); b carrier (Vr K v); c carrier (Vr K v);
  PlimitR X K v F (b r (X^ d)); PlimitR X K v F (c r (X^ d))] ==>
        b r (X^ d) = c r (X^ d)"
apply (frule PolynRg.is_Ring)
apply (frule_tac mPlimit_uniqueTr[of v R X f F d b], assumption+,
       frule_tac mPlimit_uniqueTr[of v R X f F d c], assumption+)
apply (frule Vr_ring[of v],
       frule PolynRg.subring[of "R" "Vr K v" "X"],
       frule Vr_mem_f_mem[of v b], assumption+,
       frule Vr_mem_f_mem[of v c], assumption+,
       frule limit_unique[of b f v c])
apply (rule allI, simp add:Vr_mem_f_mem, assumption+, simp)
done

lemma (in Corps) Plimit_deg:"[valuation K v; PolynRg R (Vr K v) X;
  n. F n carrier R; n. deg R (Vr K v) X (F n) (an d);
  p carrier R; PlimitR X K v F p] ==> deg R (Vr K v) X p (an d)"
apply (frule PolynRg.is_Ring, frule Vr_ring[of v])
apply (case_tac "p = 0", simp add:deg_def)
apply (rule contrapos_pp, simp+,
       simp add:aneg_le,
       frule PolynRg.s_cf_expr[of R "Vr K v" X p], assumption+, (erule conjE)+,
       frule PolynRg.s_cf_deg[of R "Vr K v" X p], assumption+,
       frule PolynRg.pol_coeff_mem[of R "Vr K v" X "s_cf R (Vr K v) X p"
        "fst (s_cf R (Vr K v) X p)"], assumption+, simp,
       frule Vr_mem_f_mem[of v "snd (s_cf R (Vr K v) X p)
            (fst (s_cf R (Vr K v) X p))"], assumption+)
(* show the value of the leading coefficient is noninf *)
apply (frule val_nonzero_noninf[of "v"
       "snd (s_cf R (Vr K v) X p) (fst (s_cf R (Vr K v) X p))"], assumption,
       simp add:Vr_0_f_0,
       frule val_pos_mem_Vr[THEN sym, of v "snd (s_cf R (Vr K v) X p)
         (fst (s_cf R (Vr K v) X p))"], assumption+, simp,
       frule value_in_aug_inf[of "v" "snd (s_cf R (Vr K v) X p)
          (fst (s_cf R (Vr K v) X p))"], assumption+,
       cut_tac mem_ant[of "v (snd (s_cf R (Vr K v) X p)
       (fst (s_cf R (Vr K v) X p)))"], simp add:aug_inf_def,
       erule exE, simp, simp only:ant_0[THEN sym], simp only:ale_zle,
       frule_tac z = z in zpos_nat, erule exE, simp,
       thin_tac "z = int n")

(* show that the leading coefficient of p shoule be 0. contradiction *)
apply (simp add:pol_limit_def)
apply (rotate_tac 5, drule_tac x = "Suc n" in spec)
apply (erule exE)
apply (rotate_tac -1,
       drule_tac x = "Suc M" in spec, simp del:npow_suc,
       drule_tac x = "Suc M" in spec,
       drule_tac x = "Suc M" in spec)

  (**** Only formula manipulation to obtain
        P_mod R (Vr K v) X (vp K vVr K v an (Suc n))
         (polyn_expr R X (fst (s_cf R (Vr K v) X p))
           (add_cf (Vr K v) f
             (fst (s_cf R (Vr K v) X p),
              λj. -a K v snd (s_cf R (Vr K v) X p) j))) *****)
apply (frule PolynRg.polyn_minus[of R "Vr K v" X "s_cf R (Vr K v) X p"
       "fst (s_cf R (Vr K v) X p)"], assumption+, simp,
   frule PolynRg.minus_pol_coeff[of R "Vr K v" X "s_cf R (Vr K v) X p"],
        assumption+, drule sym,
   frule_tac x = "deg R (Vr K v) X (F (Suc M))" in ale_less_trans[of _
       "an d" "deg R (Vr K v) X p"], assumption+,
   frule_tac p = "F (Suc M)" and d = "deg_n R (Vr K v) X p" in
            PolynRg.pol_expr_edeg[of "R" "Vr K v" "X"], assumption+,
   frule_tac x = "deg R (Vr K v) X (F (Suc M))" and
         y = "deg R (Vr K v) X p" in aless_imp_le,
      subst PolynRg.deg_an[THEN sym, of "R" "Vr K v" "X" "p"], assumption+,
      erule exE, (erule conjE)+,
   frule_tac c = f in PolynRg.polyn_add1[of "R" "Vr K v" "X" _
    "(fst (s_cf R (Vr K v) X p), λj. -a K v snd (s_cf R (Vr K v) X p) j)"],
    assumption+, simp,
   thin_tac "-a p = polyn_expr R X (fst (s_cf R (Vr K v) X p))
    (fst (s_cf R (Vr K v) X p), λj. -a K v snd (s_cf R (Vr K v) X p) j)",
   thin_tac "polyn_expr R X (fst (s_cf R (Vr K v) X p))
             (s_cf R (Vr K v) X p) = p",
   thin_tac "F (Suc M) = polyn_expr R X (fst (s_cf R (Vr K v) X p)) f",
   thin_tac "polyn_expr R X (fst (s_cf R (Vr K v) X p)) f ±
       polyn_expr R X (fst (s_cf R (Vr K v) X p))
        (fst (s_cf R (Vr K v) X p), λj. -a K v snd (s_cf R (Vr K v) X p) j) =
       polyn_expr R X (fst (s_cf R (Vr K v) X p)) (add_cf (Vr K v) f
       (fst (s_cf R (Vr K v) X p), λj. -a K v snd (s_cf R (Vr K v) X p) j))")

(** apply P_mod_mod to obtain a condition of coefficients **) 
 apply (frule_tac n = "an (Suc n)" in vp_apow_ideal[of "v"], simp,
   frule_tac p1 = "polyn_expr R X (fst (s_cf R (Vr K v) X p))(add_cf (Vr K v) f
   (fst (s_cf R (Vr K v) X p), λj. -a K v snd (s_cf R (Vr K v) X p) j))" and
  I1= "vp K v(Vr K v) (an (Suc n))" and c1 = "add_cf (Vr K v) f (fst
   (s_cf R (Vr K v) X p), λj. -a K v snd (s_cf R (Vr K v) X p) j)" in
  PolynRg.P_mod_mod[THEN sym, of R "Vr K v" X], assumption+,
  rule PolynRg.polyn_mem[of R "Vr K v" X], assumption+,
  rule PolynRg.add_cf_pol_coeff[of R "Vr K v" X], assumption+,
  simp add:PolynRg.add_cf_len,
  rule PolynRg.add_cf_pol_coeff[of R "Vr K v" X], assumption+,
  simp add:PolynRg.add_cf_len,
  simp add:PolynRg.add_cf_len)
 apply (drule_tac x = "fst (s_cf R (Vr K v) X p)" in spec, simp,
        thin_tac "P_mod R (Vr K v) X (vp K v(Vr K v) (an (Suc n)))
         (polyn_expr R X (fst (s_cf R (Vr K v) X p)) (add_cf (Vr K v) f
      (fst (s_cf R (Vr K v) X p), λj. -a K v snd (s_cf R (Vr K v) X p) j)))",
      simp add:add_cf_def)
 (**** we obtained snd (add_cf (Vr K v) f (fst (s_cf R (Vr K v) X p),
     λj. -a K v snd (s_cf R (Vr K v) X p) j)) (fst (s_cf R (Vr K v) X p))
            vp K vVr K v an (Suc n) ***)
 apply (frule_tac p = "polyn_expr R X (fst (s_cf R (Vr K v) X p)) f" and
       c = f and j = "fst f" in PolynRg.pol_len_gt_deg[of R "Vr K v" X],
       assumption+, simp, drule sym, simp add:PolynRg.deg_an) apply simp
 apply (rotate_tac -4, drule sym, simp)
 apply (frule Ring.ring_is_ag[of "Vr K v"],
        frule_tac x = "snd (s_cf R (Vr K v) X p) (fst f)" in
        aGroup.ag_mOp_closed[of "Vr K v"], assumption+,
        simp add:aGroup.ag_l_zero)
 apply (frule_tac I = "vp K v(Vr K v) (an (Suc n))" and
        x = "-a K v snd (s_cf R (Vr K v) X p) (fst f)" in
        Ring.ideal_inv1_closed[of "Vr K v"], assumption+)
 apply (simp add:aGroup.ag_inv_inv)
 apply (frule_tac n = "an (Suc n)" and x = "snd (s_cf R (Vr K v) X p) (fst f)"
         in n_value_x_1[of v], simp+)
 apply (frule_tac x = "snd (s_cf R (Vr K v) X p) (fst f)" in
         n_val_le_val[of v], assumption+, simp add:ant_int)
 apply (drule_tac i = "an (Suc n)" and
        j = "n_val K v (snd (s_cf R (Vr K v) X p) (fst f))" and
        k = "v (snd (s_cf R (Vr K v) X p) (fst f))" in ale_trans,
        assumption+)
 apply (simp add:ant_int ale_natle)
done

lemma (in Corps) Plimit_deg1:"[valuation K v; Ring R; PolynRg R (Vr K v) X;
  n. F n carrier R; n. deg R (Vr K v) X (F n) ad;
  p carrier R; PlimitR X K v F p] ==> deg R (Vr K v) X p ad"
apply (frule Vr_ring[of v])
apply (case_tac "n. F n = 0")
apply (frule Plimit_deg[of v R X F 0 p], assumption+,
       rule allI, simp add:deg_def, assumption+)
apply (case_tac "p = 0", simp add:deg_def,
       frule PolynRg.nonzero_deg_pos[of R "Vr K v" X p], assumption+,
       simp,
       frule PolynRg.pols_const[of "R" "Vr K v" "X" "p"], assumption+,
       simp,
       frule PolynRg.pols_const[of "R" "Vr K v" "X" "p"], assumption+,
       simp add:ale_refl)
 apply (subgoal_tac "p = 0", simp)
 apply (thin_tac "p 0")
 apply (rule contrapos_pp, simp+)

apply (frule n_val_valuation[of v])
apply (frule val_nonzero_z[of "n_val K v" "p"])
 apply (simp add:Vr_mem_f_mem)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (simp only:Ring.Subring_zero_ring_zero[THEN sym, of "R" "Vr K v"])
 apply (simp add:Vr_0_f_0, erule exE)
 apply (frule val_pos_mem_Vr[THEN sym, of "v" "p"])
 apply (simp add:Vr_mem_f_mem, simp)
 apply (frule val_pos_n_val_pos[of "v" "p"])
 apply (simp add:Vr_mem_f_mem, simp)
 apply (simp add:ant_0[THEN sym])
apply (frule_tac z = z in zpos_nat, erule exE)
apply (unfold pol_limit_def, erule conjE)
 apply (rotate_tac -1, drule_tac x = "Suc n" in spec)
 apply (subgoal_tac "¬ (M. m. M < m
             P_mod R (Vr K v) X (vp K v(Vr K v) (an (Suc n))) ( F m ± -a p))")
 apply blast
 apply (thin_tac "M. m. M < m
           P_mod R (Vr K v) X (vp K v(Vr K v) (an (Suc n))) (F m ± -a p)")
 apply simp
 apply (subgoal_tac "M < (Suc M)
       ¬ P_mod R (Vr K v) X (vp K v(Vr K v) (an (Suc n))) (0 ± -a p)")
 apply blast
 apply simp
 apply (frule Ring.ring_is_ag[of "R"])
 apply (frule aGroup.ag_mOp_closed[of "R" "p"], assumption)
 apply (simp add:aGroup.ag_l_zero)
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule aGroup.ag_mOp_closed[of "Vr K v" "p"], assumption)
 apply (frule_tac n = "an (Suc n)" in vp_apow_ideal[of v], simp)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (simp add:Ring.Subring_minus_ring_minus[THEN sym, of "R" "Vr K v"])
 apply (simp add:PolynRg.P_mod_coeffTr[of "R" "Vr K v" "X" _ "-aVr K v) p"])
 apply (rule contrapos_pp, simp+)

 apply (frule_tac I = "vp K v(Vr K v) (an (Suc n))" in
        Ring.ideal_inv1_closed[of "Vr K v" _ "-aVr K v) p"], assumption+)
 apply (simp add:aGroup.ag_inv_inv)
 apply (frule_tac n = "an (Suc n)" in n_value_x_1[of "v" _ "p"], simp)
 apply assumption
 apply simp
 apply (simp add:ant_int, simp add:ale_natle)

apply (fold pol_limit_def)
apply (case_tac "ad = ", simp)
apply simp apply (erule exE)
apply (subgoal_tac "0 ad")
apply (frule Plimit_deg[of "v" "R" "X" "F" "na ad" "p"], assumption+)
 apply (simp add:an_na)+
apply (drule_tac x = n in spec,
       drule_tac x = n in spec)

apply (frule_tac p = "F n" in PolynRg.nonzero_deg_pos[of "R" "Vr K v" "X"],
           assumption+)
apply (rule_tac j = "deg R (Vr K v) X (F n)" in ale_trans[of "0" _ "ad"],
           assumption+)
done

lemma (in Corps) Plimit_ldeg:"[valuation K v; PolynRg R (Vr K v) X;
     n. F n carrier R; p carrier R;
     n. deg R (Vr K v) X (F n) an (Suc d);
      PlimitR X K v F p] ==> PlimitR X K v (PseqlR X K v d F)
                                             (ldeg_p R (Vr K v) X d p)"
apply (frule Vr_ring[of v], frule PolynRg.is_Ring,
       frule Ring.ring_is_ag[of "R"])
apply (frule Plimit_deg[of v R X F "Suc d" p], assumption+)
apply (simp add:Pseql_def, simp add:pol_limit_def)
apply (rule conjI, rule allI)
 apply (rule PolynRg.ldeg_p_mem, assumption+, simp+)
 apply (rule allI)
 apply (rotate_tac -5, drule_tac x = N in spec, erule exE)
 apply (subgoal_tac "m > M. P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
              (ldeg_p R (Vr K v) X d (F m) ± -a (ldeg_p R (Vr K v) X d p))",
        blast)
 apply (rule allI, rule impI)
 apply (rotate_tac -2,
        frule_tac x = m in spec,
        thin_tac "m. M < m
            P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) ( F m ± -a p)",
        simp)
 apply (subst v_ldeg_p_mOp[of v R X _ d], assumption+)
 apply (subst v_ldeg_p_pOp[of v R X _ "-a p"], assumption+)
 apply (simp, rule aGroup.ag_mOp_closed, assumption, simp, simp)
 apply (frule PolynRg.deg_minus_eq1 [THEN sym, of "R" "Vr K v" "X" "p"],
        assumption+)
 apply simp
apply (rule_tac p = "F m ± -a p" and N = N in PCauchy_lTr[of "v"
       "R" "X" _ "d" ], assumption+)
 apply (rule_tac x = "F m" in aGroup.ag_pOp_closed[of "R" _ "-a p"],
       assumption+)
 apply (simp, rule aGroup.ag_mOp_closed, assumption+)
apply (frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "p"], assumption+)
apply (rule PolynRg.polyn_deg_add4[of "R" "Vr K v" "X" _ "-a p" "Suc d"],
         assumption+)
  apply (simp, rule aGroup.ag_mOp_closed, assumption, simp+)
done

lemma (in Corps) Plimit_hdeg:"[valuation K v; PolynRg R (Vr K v) X;
     n. F n carrier R; n. deg R (Vr K v) X (F n) an (Suc d);
      p carrier R; PlimitR X K v F p] ==>
      PlimitR X K v (PseqhR X K v d F) (hdeg_p R (Vr K v) X (Suc d) p)"
apply (frule Vr_ring[of "v"], frule PolynRg.is_Ring,
       frule Ring.ring_is_ag[of "R"])
apply (frule Plimit_deg[of v R X F "Suc d" p], assumption+)
apply (simp add:Pseqh_def, simp add:pol_limit_def)
apply (rule conjI, rule allI)
 apply (rule PolynRg.hdeg_p_mem, assumption+, simp+)
 apply (rule allI)
 apply (rotate_tac -5, drule_tac x = N in spec)
 apply (erule exE)
 apply (subgoal_tac "m>M. P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
  (hdeg_p R (Vr K v) X (Suc d) (F m) ± -a (hdeg_p R (Vr K v) X (Suc d) p))",
    blast)
 apply (rule allI, rule impI)
 apply (rotate_tac -2,
        drule_tac x = m in spec, simp)
 apply (subst v_hdeg_p_mOp[of v R X _ d], assumption+)
 apply (subst v_hdeg_p_pOp[of v R X _ "-a p"], assumption+)
 apply (simp, rule aGroup.ag_mOp_closed, assumption, simp, simp)
 apply (frule PolynRg.deg_minus_eq1 [THEN sym, of R "Vr K v" X p], assumption+)
 apply simp
apply (rule_tac p = "F m ± -a p" and N = N in PCauchy_hTr[of v R X _ d ],
       assumption+)
 apply (rule_tac x = "F m" in aGroup.ag_pOp_closed[of R _ "-a p"],
        assumption+)
 apply (simp, rule aGroup.ag_mOp_closed, assumption+)
apply (frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "p"], assumption+)
apply (rule PolynRg.polyn_deg_add4[of "R" "Vr K v" "X" _ "-a p" "Suc d"],
         assumption+)
  apply (simp, rule aGroup.ag_mOp_closed, assumption, simp+)
done

lemma (in Corps) P_limit_uniqueTr:"[valuation K v; PolynRg R (Vr K v) X] ==>
 F. ((n. F n carrier R) (n. deg R (Vr K v) X (F n) (an d))
      (p1 p2. p1 carrier R p2 carrier R PlimitR X K v F p1
           PlimitR X K v F p2 p1 = p2))"
apply (frule PolynRg.is_Ring)
apply (induct_tac d)
apply (rule allI, rule impI, (rule allI)+, rule impI)
apply (erule conjE)+
apply (subgoal_tac "n. F n carrier (Vr K v)")
apply (frule Vr_ring[of "v"])
apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
apply (frule_tac f = F and F = F and d = 0 and b = p1 and c = p2 in
        mono_P_limt_unique[of v R X], assumption+)
apply (rule allI, drule_tac x = n in spec,
       simp add:Ring.ring_r_one)
apply (frule_tac F = F and p = p1 in Plimit_deg[of v R X _ 0],
       assumption+, simp add:deg_0_const,
       frule_tac F = F and p = p2 in Plimit_deg[of v R X _ 0],
       assumption+, simp add:deg_0_const)
apply (simp add:Ring.ring_r_one)+
apply (simp add:deg_0_const)

(******** case Suc d **********)
apply (rename_tac d)
apply (rule allI, rule impI)
apply (erule conjE)
apply ((rule allI)+, rule impI, (erule conjE)+)
apply (frule_tac F = F and p = p1 and d = d in Plimit_ldeg[of v R X],
                 assumption+,
       frule_tac F = F and p = p2 and d = d in Plimit_ldeg[of v R X],
                 assumption+,
       frule_tac F = F and p = p1 and d = d in Plimit_hdeg[of v R X],
                 assumption+,
       frule_tac F = F and p = p2 and d = d in Plimit_hdeg[of v R X],
                 assumption+)
apply (frule_tac a = "PseqlR X K v d F" in forall_spec)
 apply (rule conjI)
 apply (rule allI)
 apply (rule Pseql_mem, assumption+, simp)
 apply (rule allI, simp)
 apply (rule allI)
apply (subst Pseql_def)
 apply (rule_tac p = "F n" and d = d in PolynRg.deg_ldeg_p[of R "Vr K v" X],
                      assumption+) apply (simp add:Vr_ring)
 apply simp
 apply (thin_tac "F. (n. F n carrier R)
       (n. deg R (Vr K v) X (F n) an d)
         (p1 p2.
                p1 carrier R
                p2 carrier R
                PlimitR X K v F p1 PlimitR X K v F p2
                p1 = p2)")
apply (frule Vr_ring[of v])
apply (frule_tac F = F and d = "Suc d" and p = p1 in
                           Plimit_deg[of v R X], assumption+,
       frule_tac F = F and d = "Suc d" and p = p2 in
                           Plimit_deg[of v R X], assumption+)
apply (subgoal_tac "(ldeg_p R (Vr K v) X d p1) = (ldeg_p R (Vr K v) X d p2)")
apply (subgoal_tac "hdeg_p R (Vr K v) X (Suc d) p1 =
                                        hdeg_p R (Vr K v) X (Suc d) p2")

apply (frule_tac p = p1 and d = d in PolynRg.decompos_p[of "R" "Vr K v" "X"],
                        assumption+,
       frule_tac p = p2 and d = d in PolynRg.decompos_p[of "R" "Vr K v" "X"],
                        assumption+)
 apply simp
 apply (thin_tac "PlimitR X K v PseqlR X K v d F (ldeg_p R (Vr K v) X d p1)",
        thin_tac "PlimitR X K v PseqlR X K v d F (ldeg_p R (Vr K v) X d p2)",
        thin_tac "p1 p2. p1 carrier R p2 carrier R
           PlimitR X K v PseqlR X K v d F p1
           PlimitR X K v PseqlR X K v d F p2 p1 = p2")
 apply (simp only:hdeg_p_def)
 apply (rule_tac f = "λj. snd (scf_d R (Vr K v) X (F j) (Suc d)) (Suc d)"
    and F = "PseqhR X K v d F"
    and b = "(snd (scf_d R (Vr K v) X p1 (Suc d))) (Suc d)"
    and d = "Suc d" and c = "snd (scf_d R (Vr K v) X p2 (Suc d)) (Suc d)" in
        mono_P_limt_unique[of v R X], assumption+)
 apply (rule allI)
apply (frule_tac p = "F n" and d = "Suc d" in
                 PolynRg.scf_d_pol[of "R" "Vr K v" "X"])
 apply (simp del:npow_suc)+
 apply (frule_tac c = "scf_d R (Vr K v) X (F n) (Suc d)" and
        j = "Suc d" in PolynRg.pol_coeff_mem[of R "Vr K v" X])
 apply simp apply (simp del:npow_suc)+
 apply (rule allI)
apply (frule_tac c = "scf_d R (Vr K v) X (F n) (Suc d)" and
        j = "Suc d" in PolynRg.pol_coeff_mem[of R "Vr K v" X])
 apply (frule_tac p = "F n" and d = "Suc d" in PolynRg.scf_d_pol[of R
           "Vr K v" X], (simp del:npow_suc)+)
 apply (cut_tac p = "F n" and d = "Suc d" in PolynRg.scf_d_pol[of R
           "Vr K v" X], (simp del:npow_suc)+)
          
 apply (subst Pseqh_def) apply (simp only:hdeg_p_def)
apply (frule_tac p = p1 and d = "Suc d" in PolynRg.scf_d_pol[of R "Vr K v" X],
       assumption+)
 apply (rule_tac c = "scf_d R (Vr K v) X p1 (Suc d)" and
        j = "Suc d" in PolynRg.pol_coeff_mem[of R "Vr K v" X], assumption+,
   simp, simp)
apply (frule_tac p = p2 and d = "Suc d" in PolynRg.scf_d_pol[of R "Vr K v" X],
       assumption+)
 apply (rule_tac c = "scf_d R (Vr K v) X p2 (Suc d)" and
        j = "Suc d" in PolynRg.pol_coeff_mem[of R "Vr K v" X], assumption+,
   simp, simp) apply simp apply simp
 apply (rotate_tac -4,
        drule_tac x = "ldeg_p R (Vr K v) X d p1" in spec,
        rotate_tac -1,
        drule_tac x = "ldeg_p R (Vr K v) X d p2" in spec)
 apply (simp add:PolynRg.ldeg_p_mem)
done

lemma (in Corps) P_limit_unique:"[valuation K v; Complete K;
  PolynRg R (Vr K v) X; n. F n carrier R;
  n. deg R (Vr K v) X (F n) (an d); p1 carrier R; p2 carrier R;
  PlimitR X K v F p1; PlimitR X K v F p2] ==> p1 = p2"
apply (frule P_limit_uniqueTr[of "v" "R" "X" "d"], assumption+)
apply blast
done

lemma (in Corps) P_limitTr:"[valuation K v; Complete K; PolynRg R (Vr K v) X]
 ==> F. ((n. F n carrier R) (n. deg R (Vr K v) X (F n) (an d))
        (N. M. n m. M < n M < m
        P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (F n ± -a (F m)))
        (pcarrier R. PlimitR X K v F p))"
apply (frule PolynRg.is_Ring)
apply (frule Vr_ring[of v])
 apply (induct_tac d)

 apply simp
 apply (rule allI, rule impI, (erule conjE)+)
 apply (frule_tac F = F and f = F in monomial_P_limt[of v R X _ _ 0],
        assumption+)
 apply (rule allI)
 apply (rotate_tac 5, drule_tac x = n in spec)
 apply (simp add:deg_0_const)
 apply (rule allI)
  apply (drule_tac x = n in spec,
         thin_tac "n. deg R (Vr K v) X (F n) 0")
  apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"],
         frule PolynRg.is_Ring,
         simp add:Ring.ring_r_one, assumption)

 apply (erule bexE)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (cut_tac x = b in Ring.mem_subring_mem_ring[of "R" "Vr K v"])
  apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"], assumption+)
  apply (simp add:Ring.ring_r_one, blast)

(*********** case n ***************)
apply (rule allI, rule impI) apply (rename_tac d F)
apply (erule conjE)+
 apply (subgoal_tac "(n.(PseqlR X K v d F) n carrier R)
    (n. deg R (Vr K v) X ((PseqlR X K v d F) n) an d)
    (N. M. n m. M < n M < m
     P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
        ((PseqlR X K v d F) n ± -a ((PseqlR X K v d F) m)))")
 apply (frule_tac a = "PseqlR X K v d F" in forall_spec, assumption)
 apply (erule bexE)
 apply (thin_tac "F. (n. F n carrier R)
     (n. deg R (Vr K v) X (F n) an d)
     (N. M. n m. M < n M < m
        P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (F n ± -a (F m)))
        (pcarrier R. PlimitR X K v F p)",
     thin_tac "(n. (PseqlR X K v d F) n carrier R)
     (n. deg R (Vr K v) X ((PseqlR X K v d F) n) an d)
    (N. M. n m. M < n M < m P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
    ((PseqlR X K v d F) n ± -a ((PseqlR X K v d F) m)))")
 apply (subgoal_tac "N. M. n m. M < n M < m
                      P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                       ((Pseqh X K v d F) n ± -a ((Pseqh X K v d F) m))")
 apply (frule_tac f = "λj. snd (scf_d R (Vr K v) X (F j) (Suc d)) (Suc d)"
  and F = "PseqhR X K v d F" and d = "Suc d" in monomial_P_limt[of v R X],
       assumption+)
 apply (rule allI)
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec,
        frule_tac p = "F n" and d = "Suc d" in PolynRg.scf_d_pol[of R "Vr K v"
       "X"], assumption+, (erule conjE)+)
 apply (rule_tac c = "scf_d R (Vr K v) X (F n) (Suc d)" and j = "Suc d" in
        PolynRg.pol_coeff_mem[of R "Vr K v" X], assumption+)
 apply simp
 apply (rule allI)
  apply (thin_tac "N. M. n m. M < n M < m
         P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                       ( (PseqhR X K v d F) n ± -a ((PseqhR X K v d F) m))")
  apply (simp only:Pseqh_def hdeg_p_def, assumption, erule bexE)

apply (thin_tac "N. M. n m. M < n M < m
       P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (F n ± -a (F m))",
       thin_tac "N. M. n m. M < n M < m
               P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
               ((PseqhR X K v d F) n ± -a ((PseqhR X K v d F) m))")

apply (subgoal_tac "PlimitR X K v F (p ± b r (X^ (Suc d)))",
       subgoal_tac "p ± b r(X^ (Suc d)) carrier R", blast)

apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"],
       frule_tac n = "Suc d" in Ring.npClose[of "R" "X"], assumption+,
       frule Ring.ring_is_ag[of "R"],
       rule aGroup.ag_pOp_closed[of "R"], assumption+,
       rule Ring.ring_tOp_closed, assumption+)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"],
        simp add:Ring.mem_subring_mem_ring, assumption)

apply (simp del:npow_suc add:pol_limit_def,
       rule allI,
       subgoal_tac "n. F n = (PseqlR X K v d F) n ± ((PseqhR X K v d F) n)",
       simp del:npow_suc,
       subgoal_tac "m. (PseqlR X K v d F) m ± ((PseqhR X K v d F) m) ±
        -a (p ± (b r (X^ (Suc d)))) = (PseqlR X K v d F) m ± -a p ±
         ((PseqhR X K v d F) m ± -a (b r (X^ (Suc d))))",
       simp del:npow_suc)
 
apply (thin_tac "m. (Pseql X K v d F) m ± (PseqhR X K v d F) m ±
    -a (p ± b r X^ (Suc d)) = (Pseql X K v d F) m ± -a p ±
     ((PseqhR X K v d F) m ± -a b r X^ (Suc d))")
apply (erule conjE)+
apply (rotate_tac -3,
       drule_tac x = N in spec, erule exE)
apply (rotate_tac 1,
       drule_tac x = N in spec, erule exE)
apply (rename_tac d F p b N M1 M2)
apply (subgoal_tac "m. (max M1 M2) < m
           P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
           ((PseqlR X K v d F) m ± -a p ±
            ((PseqhR X K v d F) m ± -a (b r (X^ (Suc d)))))", blast)
apply (rule allI, rule impI)
apply (rotate_tac -2,
       drule_tac x = m in spec, simp del:npow_suc)
apply (erule conjE)
apply (rotate_tac -5,
       drule_tac x = m in spec, simp del:npow_suc)
 apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp del:npow_suc)
 apply (frule Ring.ring_is_ag[of "R"])
 apply (rule_tac I = "vp K v(Vr K v) (an N)" and
        p = "(PseqlR X K v d F) m ± -a p" and
        q = "(PseqhR X K v d F) m ± -a (b r (X^ (Suc d)))" in
        PolynRg.P_mod_add[of R "Vr K v" X], assumption+)

apply (rule aGroup.ag_pOp_closed, assumption+)
 apply (simp add:Pseql_mem, rule aGroup.ag_mOp_closed, assumption+)

 apply (rule aGroup.ag_pOp_closed[of "R"], assumption)
 apply (simp add:Pseqh_mem, rule aGroup.ag_mOp_closed, assumption)
 apply (rule Ring.ring_tOp_closed, assumption)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (simp add:Ring.mem_subring_mem_ring)
 apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
 apply (rule Ring.npClose, assumption+)

apply (rule allI)
 apply (thin_tac "n.(PseqlR X K v d F) n ±((PseqhR X K v d F) n) carrier R")
 apply (erule conjE)+
 apply (thin_tac "n. deg R (Vr K v) X
             ((Pseql X K v d F) n ± (PseqhR X K v d F) n) an (Suc d)")
 apply (thin_tac "N. M. m>M. P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                       ((Pseql X K v d F) m ± -a p)",
        thin_tac "N. M. m>M. P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                       ((PseqhR X K v d F) m ± -a b r X^ (Suc d))",
        thin_tac "n. F n = (PseqlR X K v d F) n ± ((PseqhR X K v d F) n)")
 apply (drule_tac x = m in spec,
        drule_tac x = m in spec)
 apply (subgoal_tac "b r X^ (Suc d) carrier R")
 apply (frule Ring.ring_is_ag[of "R"])
 apply (frule_tac x = p in aGroup.ag_mOp_closed[of "R"], assumption+)
 apply (subst aGroup.ag_pOp_assoc[of "R"], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption+)
 apply (frule_tac x1 = "-a p" and y1 = "(PseqhR X K v d F) m" and z1 =
  "-a (b r (X^ (Suc d)))" in aGroup.ag_pOp_assoc[THEN sym, of "R"],
  assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+, simp del:npow_suc)
 apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+,
        rule aGroup.ag_pOp_closed, assumption+)
 apply (subst aGroup.ag_add4_rel[of R], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)
 apply (subst aGroup.ag_p_inv[THEN sym, of R], assumption+, simp del:npow_suc)

 apply (rule Ring.ring_tOp_closed, assumption+,
        frule PolynRg.subring[of R "Vr K v" X],
        simp add:Ring.mem_subring_mem_ring,
        rule Ring.npClose, assumption+, simp add:PolynRg.X_mem_R)
apply (rule allI)
apply (rule_tac F = F and n = n and d = d in Pseq_decompos[of "v" "R" "X"],
       assumption+, simp, simp)
apply (rule allI)
apply (rotate_tac -3, drule_tac x = N in spec)
apply (erule exE)
 apply (subgoal_tac "n m. M < n M < m
                    P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                     ((PseqhR X K v d F) n ± -a ((PseqhR X K v d F) m))")
 apply blast
 apply ((rule allI)+, rule impI)
 apply (rotate_tac -2,
        drule_tac x = n in spec,
        rotate_tac -1,
        drule_tac x = m in spec,
        simp)
 
apply (simp only: Pseqh_def)
apply (subst v_hdeg_p_mOp[of "v" "R" "X"], assumption+)
 apply simp+

apply (frule Ring.ring_is_ag[of "R"])
apply (subst v_hdeg_p_pOp[of "v" "R" "X"], assumption+)
apply (simp, rule aGroup.ag_mOp_closed, assumption, simp, simp,
       frule_tac p1 = "F m" in PolynRg.deg_minus_eq1 [THEN sym, of R "Vr K v"
       X])
apply simp
apply (rotate_tac -1, frule sym,
       thin_tac "deg R (Vr K v) X (F m) = deg R (Vr K v) X (-a (F m))", simp)
apply (rule PCauchy_hTr[of v R X], assumption+)
apply (rule_tac x = "F n" and y = "-a (F m)" in aGroup.ag_pOp_closed[of "R"],
       assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption+, simp)
apply (frule_tac p = "F m" in PolynRg.deg_minus_eq1 [of R "Vr K v" X],
       simp,
       rule_tac p = "F n" and q = "-a (F m)" and n = "Suc d" in
       PolynRg.polyn_deg_add4[of "R" "Vr K v" "X"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp+)

apply (rule conjI, rule allI, rule Pseql_mem, assumption+, simp)
 apply (rule allI, simp)

apply (thin_tac "F. (n. F n carrier R)
      (n. deg R (Vr K v) X (F n) an d)
       (N. M. n m. M < n M < m
          P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (F n ± -a (F m)))
               (pcarrier R. PlimitR X K v F p)")

apply (rule conjI, rule allI)
 apply (subst Pseql_def)
 apply (rule_tac p = "F n" and d = d in PolynRg.deg_ldeg_p[of R "Vr K v" X],
        assumption+)
 apply simp+

apply (simp only: Pseql_def)
 apply (rule allI)
 apply (rotate_tac -1, drule_tac x = N in spec)
 apply (erule exE)
 apply (subgoal_tac "n m. M < n M < m
        P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
          (ldeg_p R (Vr K v) X d (F n) ± -a (ldeg_p R (Vr K v) X d (F m)))")
 apply blast
 apply ((rule allI)+, rule impI, erule conjE)
 apply (rotate_tac -3, drule_tac x = n in spec,
        rotate_tac -1, drule_tac x = m in spec, simp)

apply (subst v_ldeg_p_mOp[of v R X], assumption+, simp+)

apply (frule Ring.ring_is_ag[of "R"])
apply (subst v_ldeg_p_pOp[of v R X], assumption+, simp,
       rule aGroup.ag_mOp_closed, assumption, simp, simp,
       frule_tac p = "F m" in PolynRg.deg_minus_eq1[of R "Vr K v" X], simp)
apply simp
apply (rule PCauchy_lTr[of v R X], assumption+)
apply (rule_tac x = "F n" and y = "-a (F m)" in aGroup.ag_pOp_closed[of R],
       assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption+, simp)

apply (frule_tac p = "F m" in PolynRg.deg_minus_eq1[of R "Vr K v" X], simp,
       rule_tac p = "F n" and q = "-a (F m)" and n = "Suc d" in
       PolynRg.polyn_deg_add4[of "R" "Vr K v" "X"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp+)
done

lemma (in Corps) PCauchy_Plimit:"[valuation K v; Complete K;
      PolynRg R (Vr K v) X; PCauchy X K v F] ==>
        pcarrier R. Plimit X K v F p"
  by (metis P_limitTr pol_Cauchy_seq_def)

lemma (in Corps) P_limit_mult:"[valuation K v; PolynRg R (Vr K v) X;
  n. F n carrier R; n. G n carrier R; p1 carrier R; p2 carrier R;
  PlimitR X K v F p1; PlimitR X K v G p2] ==>
                  PlimitR X K v (λn. (F n) r (G n)) (p1 r p2)"
apply (frule Vr_ring[of v],
       frule PolynRg.is_Ring,
       frule Ring.ring_is_ag[of "R"])
apply (simp add:pol_limit_def)
apply (rule conjI)
apply (rule allI)
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec)

 apply (simp add:Ring.ring_tOp_closed[of "R"])

apply (rule allI)
 apply (rotate_tac 6,
        drule_tac x = N in spec,
        drule_tac x = N in spec)
 apply (erule exE, erule exE, rename_tac N M1 M2)
 apply (subgoal_tac "m. (max M1 M2) < m
          P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                     ((F m) r (G m) ± -a (p1 r p2))")
 apply blast
 
apply (rule allI, rule impI, simp, erule conjE)
 apply (rotate_tac -4,
        drule_tac x = m in spec,
        drule_tac x = m in spec, simp)
 apply (subgoal_tac "(F m) r (G m) ± -a p1 r p2 =
             ((F m) ± -a p1) r (G m) ± p1 r ((G m) ± -a p2)", simp)
 apply (frule_tac n = "an N" in vp_apow_ideal[of v])
 apply simp
 apply (rule_tac I = "vp K v(Vr K v) (an N)" and
        p = "((F m) ± -a p1) r (G m)" and q = "p1 r ((G m) ± -a p2)"
        in PolynRg.P_mod_add[of R "Vr K v" "X"],
         assumption+)
 apply (rule Ring.ring_tOp_closed[of "R"], assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption) apply simp
 apply (rule aGroup.ag_mOp_closed, assumption+) apply simp
 apply (rule Ring.ring_tOp_closed[of "R"], assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption) apply simp
  apply (rule aGroup.ag_mOp_closed, assumption+)
apply (frule Ring.whole_ideal[of "Vr K v"])
apply (frule_tac I = "vp K v(Vr K v) (an N)" and J = "carrier (Vr K v)" and
   p = "F m ± -a p1" and q = "G m" in PolynRg.P_mod_mult1[of R "Vr K v" X],
   assumption+,
   rule aGroup.ag_pOp_closed, assumption+, simp, rule aGroup.ag_mOp_closed,
      assumption+) apply simp apply assumption
apply (rotate_tac 8,
       drule_tac x = m in spec)
apply (case_tac "G m = 0", simp add:P_mod_def)
apply (frule_tac p = "G m" in PolynRg.s_cf_expr[of R "Vr K v" X], assumption+,
       (erule conjE)+)
thm PolynRg.P_mod_mod
apply (frule_tac I1 = "carrier (Vr K v)" and p1 = "G m" and
       c1 = "s_cf R (Vr K v) X (G m)" in PolynRg.P_mod_mod[THEN sym,
       of R "Vr K v" X], assumption+)
apply (simp,
      thin_tac "P_mod R (Vr K v) X (carrier (Vr K v)) (G m) =
        (jfst (s_cf R (Vr K v) X (G m)).
            snd (s_cf R (Vr K v) X (G m)) j carrier (Vr K v))")
apply (rule allI, rule impI)
 apply (simp add:PolynRg.pol_coeff_mem)
apply (simp add:Ring.idealprod_whole_r[of "Vr K v"])

apply (cut_tac I = "carrier (Vr K v)" and J = "vp K v(Vr K v) (an N)" and
      p = p1 and q = "G m ± -a p2" in PolynRg.P_mod_mult1[of R "Vr K v" X],
      assumption+)
apply (simp only: Ring.whole_ideal, assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+, simp, rule aGroup.ag_mOp_closed,
      assumption+)
apply (frule PolynRg.s_cf_expr0[of R "Vr K v" X p1], assumption+)
  thm PolynRg.P_mod_mod
apply (cut_tac I1 = "carrier (Vr K v)" and p1 = p1 and
       c1 = "s_cf R (Vr K v) X p1" in PolynRg.P_mod_mod[THEN sym,
        of R "Vr K v" X], assumption+)
apply (simp add:Ring.whole_ideal, assumption+)
apply (simp, simp, simp, (erule conjE)+,
       thin_tac "P_mod R (Vr K v) X (carrier (Vr K v)) p1 =
        (jfst (s_cf R (Vr K v) X p1).
            snd (s_cf R (Vr K v) X p1) j carrier (Vr K v))")
 apply (rule allI, rule impI)
 apply (simp add:PolynRg.pol_coeff_mem, assumption)
apply (simp add:Ring.idealprod_whole_l[of "Vr K v"])
apply (drule_tac x = m in spec,
       drule_tac x = m in spec)
apply (frule aGroup.ag_mOp_closed[of R p1], assumption,
       frule aGroup.ag_mOp_closed[of R p2], assumption )
apply (simp add:Ring.ring_distrib1 Ring.ring_distrib2)
 apply (subst aGroup.pOp_assocTr43[of R], assumption+,
        (rule Ring.ring_tOp_closed, assumption+)+)
 apply (simp add:Ring.ring_inv1_1[THEN sym],
        simp add:Ring.ring_inv1_2[THEN sym])
apply (frule_tac x = p1 and y = "G m" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = "F m" and y = "G m" in Ring.ring_tOp_closed, assumption+,
       simp add:aGroup.ag_l_inv1 aGroup.ag_r_zero)
done
       (** Hfst K v R X t S Y f g h m**)
definition
  Hfst :: "[_, 'b ==> ant, ('b, 'm1) Ring_scheme, 'b,'b, ('b set, 'm2) Ring_scheme, 'b set, 'b, 'b, 'b, nat] ==> 'b"
        ((11Hfst_ _ _ _ _ _ _ _ _ _ _) [67,67,67,67,67,67,67,67,67,67,68]67) where
  "Hfst v R X t S Y f g h m = fst (Hpr (Vr K v) X t S Y f g h m)"

definition
  Hsnd :: "[_, 'b ==> ant, ('b, 'm1) Ring_scheme, 'b,'b, ('b set, 'm2) Ring_scheme, 'b set, 'b, 'b, 'b, nat] ==> 'b"
        ((11Hsnd_ _ _ _ _ _ _ _ _ _ _) [67,67,67,67,67,67,67,67,67,67,68]67) where
 
  "Hsnd v R X t S Y f g h m = snd (Hpr (Vr K v) X t S Y f g h m)"

lemma (in Corps) Hensel_starter:"[valuation K v; Complete K;
    PolynRg R (Vr K v) X; PolynRg S ((Vr K v) /r (vp K v)) Y;
    t carrier (Vr K v); vp K v = (Vr K v) p t;
    f carrier R; f 0; g' carrier S; h' carrier S;
    0 < deg S ((Vr K v) /r (vp K v)) Y g';
    0 < deg S ((Vr K v) /r (vp K v)) Y h';
    ((erH R (Vr K v) X S ((Vr K v) /r (vp K v)) Y
             (pj (Vr K v) (vp K v))) f) = g' r h';
    rel_prime_pols S ((Vr K v) /r (vp K v)) Y g' h'] ==>
 g h. g 0 h 0 g carrier R h carrier R
  deg R (Vr K v) X g deg S ((Vr K v) /r ((Vr K v) p t)) Y
   (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y
   (pj (Vr K v) ((Vr K v) p t)) g) (deg R (Vr K v) X h +
    deg S ((Vr K v) /r ((Vr K v) p t)) Y (erH R (Vr K v) X S
     ((Vr K v) /r ((Vr K v) p t)) Y (pj (Vr K v) ((Vr K v) p t)) g)
     deg R (Vr K v) X f)
   (erH R (Vr K v) X S ((Vr K v) /r (vp K v)) Y
                            (pj (Vr K v) (vp K v))) g = g'
    (erH R (Vr K v) X S ((Vr K v) /r (vp K v)) Y
                            (pj (Vr K v) (vp K v))) h = h'
  0 < deg S ((Vr K v) /r ((Vr K v) p t)) Y
   (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y
   (pj (Vr K v) ((Vr K v) p t)) g)
  0 < deg S ((Vr K v) /r ((Vr K v) p t)) Y
    (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y
   (pj (Vr K v) ((Vr K v) p t)) h)
  rel_prime_pols S ((Vr K v) /r ((Vr K v) p t)) Y
    (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y
    (pj (Vr K v) ((Vr K v) p t)) g)
    (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y
    (pj (Vr K v) ((Vr K v) p t)) h)
 P_mod R (Vr K v) X ((Vr K v) p t) (f ± -a (g r h))"
apply (frule Vr_ring[of v],
       frule PolynRg.subring[of R "Vr K v" X],
       frule vp_maximal [of v], frule PolynRg.is_Ring,
       frule Ring.subring_Ring[of R "Vr K v"], assumption+,
       frule Ring.residue_field_cd[of "Vr K v" "vp K v"], assumption+,
       frule Corps.field_is_ring[of "Vr K v /r vp K v"],
       frule pj_Hom[of "Vr K v" "vp K v"], frule vp_ideal[of "v"],
       simp add:Ring.maximal_ideal_ideal)
apply (frule Corps.field_is_idom[of "(Vr K v) /r (vp K v)"],
       frule Vr_integral[of v], simp,
       frule Vr_mem_f_mem[of v t], assumption+)
apply (frule PolynRg.erH_inv[of R "Vr K v" X "Vr K v p t" S Y "g'"],
       assumption+, simp add:Ring.maximal_ideal_ideal,
       simp add:PolynRg.is_Ring, assumption+, erule bexE, erule conjE)
apply (frule PolynRg.erH_inv[of R "Vr K v" X "Vr K v p t" S Y "h'"],
       assumption+, simp add:Ring.maximal_ideal_ideal,
       simp add:PolynRg.is_Ring, assumption+, erule bexE, erule conjE)
apply (rename_tac g0 h0)
apply (subgoal_tac " g0 0 h0 0
  deg R (Vr K v) X g0
  deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
      (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
  deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y
      (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0) deg R (Vr K v) X f
    0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
      (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
   0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) h0)
   rel_prime_pols S (Vr K v /r (Vr K v p t)) Y
      (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0)
      (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) h0)
   P_mod R (Vr K v) X (Vr K v p t) (f ± -a g0 r h0)")
 apply (thin_tac "g' carrier S",
        thin_tac "h' carrier S",
        thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y g'",
        thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y h'",
        thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f = g' r h'",
        thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y g' h'",
        thin_tac "Corps (Vr K v /r (Vr K v p t))",
        thin_tac "Ring (Vr K v /r (Vr K v p t))",
        thin_tac "vp K v = Vr K v p t")
apply blast
apply (rule conjI)
 apply (thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y h'",
    thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f = g' r h'",
    thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y g' h'",
    thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) h0 = h'",
   thin_tac "deg R (Vr K v) X h0 deg S (Vr K v /r (Vr K v p t)) Y h'")
 apply (rule contrapos_pp, simp+)
 apply (simp add:PolynRg.erH_rHom_0[of R "Vr K v" X S
      "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)"])
 apply (rotate_tac -3, drule sym, simp add:deg_def)
  apply (drule aless_imp_le[of "0" "-"],
        cut_tac minf_le_any[of "0"],
        frule ale_antisym[of "0" "-"], simp only:ant_0[THEN sym], simp)

apply (rule conjI)
 apply (thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y g'",
    thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f = g' r h'",
    thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y g' h'",
    thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0 = g'",
   thin_tac "deg R (Vr K v) X h0 deg S (Vr K v /r (Vr K v p t)) Y h'")
 apply (rule contrapos_pp, simp+,
        simp add:PolynRg.erH_rHom_0[of R "Vr K v" X S
      "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)"])
 apply (rotate_tac -2, drule sym, simp add:deg_def)
 apply (frule aless_imp_le[of "0" "-"], thin_tac "0 < - ",
        cut_tac minf_le_any[of "0"],
        frule ale_antisym[of "0" "-"], simp only:ant_0[THEN sym], simp)

apply (frule_tac x = "deg R (Vr K v) X h0" and
       y = "deg S (Vr K v /r (Vr K v p t)) Y h'" and
       z = "deg S (Vr K v /r (Vr K v p t)) Y g'" in aadd_le_mono)
apply (simp add:PolynRg.deg_mult_pols1[THEN sym, of S
 "Vr K v /r (Vr K v p t)" Y "h'" "g'"])
 apply (frule PolynRg.is_Ring[of S "Vr K v /r (Vr K v p t)" Y],
        simp add:Ring.ring_tOp_commute[of S "h'" "g'"])
 apply (rotate_tac 11, drule sym)
 apply simp
apply (frule PolynRg.erH_rHom[of R "Vr K v" X S
      "(Vr K v) /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)"],
      assumption+)
apply (frule PolynRg.pHom_dec_deg[of R "Vr K v" X S "(Vr K v) /r (Vr K v p t)" Y "erH R (Vr K v) X S ((Vr K v) /r (Vr K v p t))
 Y (pj (Vr K v) (Vr K v p t))" "f"], assumption+)
apply (frule_tac i = "deg R (Vr K v) X h0 +
        deg S (Vr K v /r (Vr K v p t)) Y g'" in ale_trans[of _
        "deg S (Vr K v /r (Vr K v p t)) Y
           (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) f)" "deg R (Vr K v) X f"],
       assumption+) apply simp
apply (thin_tac "deg R (Vr K v) X h0 +
        deg S (Vr K v /r (Vr K v p t)) Y g' deg R (Vr K v) X f",
       thin_tac "deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) f) deg R (Vr K v) X f",
       thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y g'",
       thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y h'",
      thin_tac "deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y g'
        deg S (Vr K v /r (Vr K v p t)) Y
           (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) f)",
     thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y g' h'")
 apply (rotate_tac 12, drule sym)
 apply (drule sym)
 apply simp
apply (frule_tac x = g0 and y = h0 in Ring.ring_tOp_closed[of "R"],
       assumption+)
 apply (thin_tac "deg R (Vr K v) X h0 deg S (Vr K v /r (Vr K v p t)) Y
  (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) h0)",
       thin_tac "h' = erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) h0",
       thin_tac "g' = erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0",
       thin_tac "deg R (Vr K v) X g0 deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0)")
apply (subst PolynRg.P_mod_diff[THEN sym, of R "Vr K v" X "Vr K v p t"
       S Y f], assumption+) apply (simp add:Ring.maximal_ideal_ideal, assumption+)
apply (rotate_tac 12, drule sym)
apply (subst PolynRg.erH_mult[of R "Vr K v" X S "Vr K v /r (Vr K v p t)"
        Y], assumption+)
done

lemma aadd_plus_le_plus:"[ a (a'::ant); b b'] ==> a + b a' + b'"
  by (metis aadd_commute aadd_le_mono ale_trans)

lemma (in Corps) Hfst_PCauchy:"[valuation K v; Complete K;
  PolynRg R (Vr K v) X; PolynRg S (Vr K v /r (Vr K v p t)) Y; g0 carrier R;
  h0 carrier R; f carrier R; f 0; g0 0; h0 0;
  t carrier (Vr K v); vp K v = Vr K v p t;
  deg R (Vr K v) X g0 deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0);
  deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
         deg R (Vr K v) X f;
  0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0);
  0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) h0);
  rel_prime_pols S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
         (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
    (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                                    (pj (Vr K v) (Vr K v p t)) h0);

   erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
      (pj (Vr K v) (Vr K v p t)) f =
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                        (pj (Vr K v) (Vr K v p t)) g0 r
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                               (pj (Vr K v) (Vr K v p t)) h0] ==>
      PCauchyR X K v Hfst K v R X t S Y f g0 h0"
(*  P_mod begin*)
apply(frule Vr_integral[of v], frule vp_ideal[of v],
       frule Vr_ring, frule pj_Hom[of "Vr K v" "vp K v"], assumption+,
       simp add:PolynRg.erH_mult[THEN sym, of R "Vr K v" X S
          "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)" g0 h0],
       frule PolynRg.P_mod_diff[THEN sym, of R "Vr K v" X "Vr K v p t" S Y
        f "g0 r h0"], assumption+,
       frule PolynRg.is_Ring[of R], rule Ring.ring_tOp_closed,
       assumption+) (** P_mod done **)
apply (simp add:pol_Cauchy_seq_def, rule conjI)
 apply (rule allI)

apply (frule_tac t = t and g = g0 and h = h0 and m = n in
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f],
       rule Vr_integral[of v], assumption+, simp add:vp_gen_nonzero,
       drule sym, simp add:vp_maximal, assumption+)

apply (subst Hfst_def)
apply (rule cart_prod_fst, assumption)
apply (rule conjI)
apply (subgoal_tac "n. deg R (Vr K v) X (HfstK v R X t S Y f g0 h0 n)
                     an (deg_n R (Vr K v) X f)")
apply blast
apply (rule allI)
apply (frule Vr_integral[of v],
       frule_tac t = t and g = g0 and h = h0 and m = n in
       PolynRg.P_mod_diffxxx5_4[of R "Vr K v" X _ S Y f], assumption+,
       simp add:vp_gen_nonzero,
       drule sym, simp add:vp_maximal, assumption+)
apply (subst PolynRg.deg_an[THEN sym], (erule conjE)+, assumption+)
apply (simp add:Hfst_def, (erule conjE)+)
apply (frule_tac i = "deg R (Vr K v) X (fst (HprR (Vr K v) X t S Y f g0 h0 n))" and
      j = "deg R (Vr K v) X g0" and k = "deg S (Vr K v /r (Vr K v p t)) Y
            (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
              (pj (Vr K v) (Vr K v p t)) g0)" in ale_trans, assumption+,
       frule PolynRg.nonzero_deg_pos[of R "Vr K v" X h0], assumption+,
       frule_tac x = 0 and y = "deg R (Vr K v) X h0" and z = "deg S
  (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
      (pj (Vr K v) (Vr K v p t)) g0)" in aadd_le_mono, simp add:aadd_0_l)
apply (rule allI)
apply (subgoal_tac "n m. N < n N < m
  P_mod R (Vr K v) X (Vr K v p t(Vr K v) (an N))
     ( HfstK v R X t S Y f g0 h0 n ± -a (HfstK v R X t S Y f g0 h0 m))")
apply blast
apply ((rule allI)+, rule impI, (erule conjE)+,
       frule Vr_integral[of v], frule vp_gen_nonzero[of v t], assumption+,
       frule vp_maximal[of v])
apply (frule_tac t = t and g = g0 and h = h0 and m = n in
      PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
      assumption+,
      frule_tac t = t and g = g0 and h = h0 and m = m in
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
       assumption+,
      frule_tac t = t and g = g0 and h = h0 and m = N in
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
       assumption+,
      frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 m" in cart_prod_fst[of _
       "carrier R" "carrier R"],
       frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 N" in cart_prod_fst[of _
       "carrier R" "carrier R"],
      frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 n" in cart_prod_fst[of _
       "carrier R" "carrier R"],
       thin_tac "HprR (Vr K v) X t S Y f g0 h0 n carrier R × carrier R",
       thin_tac "HprR (Vr K v) X t S Y f g0 h0 m carrier R × carrier R")
apply (frule PolynRg.is_Ring)
apply (case_tac "N = 0", simp add:r_apow_def)
apply (rule_tac p = "HfstK v R X t S Y f g0 h0 n ±
               -a (HfstK v R X t S Y f g0 h0 m)" in
       PolynRg.P_mod_whole[of "R" "Vr K v" "X"], assumption+,
       frule Ring.ring_is_ag[of "R"], simp add:Hfst_def,
       rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed,
       assumption+)

apply (frule_tac t = t and g = g0 and h = h0 and m = N and n = "n - N" in
       PolynRg.P_mod_diffxxx5_3[of R "Vr K v" X _ S Y f], assumption+,
       simp+, (erule conjE)+,
       frule_tac t = t and g = g0 and h = h0 and m = N and n = "m - N" in
       PolynRg.P_mod_diffxxx5_3[of R "Vr K v" X _ S Y f], assumption+,
       simp, (erule conjE)+,
       thin_tac "P_mod R (Vr K v) X (Vr K v p (t^Vr K v) N)) (snd
     (HprR (Vr K v) X t S Y f g0 h0 N) ± -a (snd (HprR (Vr K v) X t S Y f g0 h0 n)))",
      thin_tac "P_mod R (Vr K v) X (Vr K v p (t^Vr K v) N)) (snd
    (HprR (Vr K v) X t S Y f g0 h0 N) ± -a (snd (HprR (Vr K v) X t S Y f g0 h0 m)))")
apply (frule Vr_ring[of v],
       simp only:Ring.principal_ideal_n_pow1[THEN sym],
       drule sym, simp, frule vp_ideal[of v],
       simp add:Ring.ring_pow_apow,
       frule_tac n = "an N" in vp_apow_ideal[of v], simp,
       frule Ring.ring_is_ag[of R],
       frule_tac x = "fst (HprR (Vr K v) X t S Y f g0 h0 n)" in
        aGroup.ag_mOp_closed[of R], assumption)
apply (frule_tac I = "vp K v(Vr K v) (an N)" and
      p = "(fst (HprR (Vr K v) X t S Y f g0 h0 N)) ±
      -a (fst (HprR (Vr K v) X t S Y f g0 h0 n))" in PolynRg.P_mod_minus[of R
     "Vr K v" X], assumption+)

apply (rule aGroup.ag_pOp_closed, assumption+,
       simp add:aGroup.ag_p_inv aGroup.ag_inv_inv)
 apply (frule Ring.ring_is_ag,
       frule_tac x = "-a fst (HprR (Vr K v) X t S Y f g0 h0 N)" and
       y = "fst (HprR (Vr K v) X t S Y f g0 h0 n)" in aGroup.ag_pOp_commute)
 apply(rule aGroup.ag_mOp_closed, assumption+, simp,
       thin_tac "-a fst (HprR (Vr K v) X t S Y f g0 h0 N) ±
       fst (HprR (Vr K v) X t S Y f g0 h0 n) = fst (HprR (Vr K v) X t S Y f g0 h0 n) ±
       -a fst (HprR (Vr K v) X t S Y f g0 h0 N)")
apply (frule_tac I = "vp K v(Vr K v) (an N)" and
       p = "fst (HprR (Vr K v) X t S Y f g0 h0 n) ±
          -a fst (HprR (Vr K v) X t S Y f g0 h0 N)" and
       q = "fst (HprR (Vr K v) X t S Y f g0 h0 N) ±
          -a fst (HprR (Vr K v) X t S Y f g0 h0 m)" in PolynRg.P_mod_add[of
          R "Vr K v" X], assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (frule_tac x = "fst (HprR (Vr K v) X t S Y f g0 h0 N)" in
       aGroup.ag_mOp_closed, assumption+,
       frule_tac x = "fst (HprR (Vr K v) X t S Y f g0 h0 m)" in
       aGroup.ag_mOp_closed, assumption+,
       simp add:aGroup.pOp_assocTr43[of R] aGroup.ag_l_inv1 aGroup.ag_r_zero)
apply (simp add:Hfst_def)
done

lemma (in Corps) Hsnd_PCauchy:"[valuation K v; Complete K;
  PolynRg R (Vr K v) X; PolynRg S (Vr K v /r (Vr K v p t)) Y; g0 carrier R;
  h0 carrier R; f carrier R; f 0; g0 0; h0 0;
  t carrier (Vr K v); vp K v = Vr K v p t;
  deg R (Vr K v) X g0 deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0);
  deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
         deg R (Vr K v) X f;
  0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0);
  0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) h0);
  rel_prime_pols S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
         (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
    (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                                    (pj (Vr K v) (Vr K v p t)) h0);
   erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
      (pj (Vr K v) (Vr K v p t)) f =
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                        (pj (Vr K v) (Vr K v p t)) g0 r
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                               (pj (Vr K v) (Vr K v p t)) h0] ==>
      PCauchyR X K v Hsnd K v R X t S Y f g0 h0"
(*  P_mod begin*)
apply(frule Vr_integral[of v], frule vp_ideal[of v],
       frule Vr_ring, frule pj_Hom[of "Vr K v" "vp K v"], assumption+,
       simp add:PolynRg.erH_mult[THEN sym, of R "Vr K v" X S
          "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)" g0 h0],
       frule PolynRg.P_mod_diff[THEN sym, of R "Vr K v" X "Vr K v p t" S Y
        f "g0 r h0"], assumption+,
       frule PolynRg.is_Ring[of R], rule Ring.ring_tOp_closed,
       assumption+) (** P_mod done **)
apply (simp add:pol_Cauchy_seq_def, rule conjI)
 apply (rule allI)

apply (frule_tac t = t and g = g0 and h = h0 and m = n in
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f],
       rule Vr_integral[of v], assumption+, simp add:vp_gen_nonzero,
       drule sym, simp add:vp_maximal, assumption+)

apply (subst Hsnd_def)
apply (rule cart_prod_snd, assumption)
apply (rule conjI)
apply (subgoal_tac "n. deg R (Vr K v) X (HsndK v R X t S Y f g0 h0 n)
                     an (deg_n R (Vr K v) X f)")
apply blast
apply (rule allI)
apply (frule Vr_integral[of v],
       frule_tac t = t and g = g0 and h = h0 and m = n in
       PolynRg.P_mod_diffxxx5_4[of R "Vr K v" X _ S Y f], assumption+,
       simp add:vp_gen_nonzero,
       drule sym, simp add:vp_maximal, assumption+)
apply (subst PolynRg.deg_an[THEN sym], (erule conjE)+, assumption+)

apply (simp add:Hsnd_def)
apply (rule allI)
apply (subgoal_tac "n m. N < n N < m
  P_mod R (Vr K v) X (Vr K v p t(Vr K v) (an N))
     ( HsndK v R X t S Y f g0 h0 n ± -a (HsndK v R X t S Y f g0 h0 m))")
apply blast
apply ((rule allI)+, rule impI, (erule conjE)+)
apply (frule Vr_integral[of v], frule vp_gen_nonzero[of v t], assumption+)
apply (frule vp_maximal[of v])
apply (frule_tac t = t and g = g0 and h = h0 and m = n in
      PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
      assumption+)
apply (frule_tac t = t and g = g0 and h = h0 and m = m in
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
       assumption+,
      frule_tac t = t and g = g0 and h = h0 and m = N in
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
       assumption+,
      frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 m" in cart_prod_snd[of _
       "carrier R" "carrier R"],
       frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 N" in cart_prod_snd[of _
       "carrier R" "carrier R"],
      frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 n" in cart_prod_snd[of _
       "carrier R" "carrier R"],
       thin_tac "HprR (Vr K v) X t S Y f g0 h0 n carrier R × carrier R",
       thin_tac "HprR (Vr K v) X t S Y f g0 h0 m carrier R × carrier R")
apply (frule PolynRg.is_Ring)
apply (case_tac "N = 0", simp add:r_apow_def)
apply (rule_tac p = "HsndK v R X t S Y f g0 h0 n ±
               -a (HsndK v R X t S Y f g0 h0 m)" in
       PolynRg.P_mod_whole[of "R" "Vr K v" "X"], assumption+,
       frule Ring.ring_is_ag[of "R"], simp add:Hsnd_def,
       rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed,
       assumption+)

apply (frule_tac t = t and g = g0 and h = h0 and m = N and n = "n - N" in
       PolynRg.P_mod_diffxxx5_3[of R "Vr K v" X _ S Y f], assumption+)
apply simp+
apply (erule conjE)+
apply (frule_tac t = t and g = g0 and h = h0 and m = N and n = "m - N" in
       PolynRg.P_mod_diffxxx5_3[of R "Vr K v" X _ S Y f], assumption+)
apply simp apply (erule conjE)+
apply (thin_tac "P_mod R (Vr K v) X (Vr K v p (t^Vr K v) N)) (fst
    (HprR (Vr K v) X t S Y f g0 h0 N) ± -a (fst (HprR (Vr K v) X t S Y f g0 h0 n)))",
      thin_tac "P_mod R (Vr K v) X (Vr K v p (t^Vr K v) N)) (fst
    (HprR (Vr K v) X t S Y f g0 h0 N) ± -a (fst (HprR (Vr K v) X t S Y f g0 h0 m)))")
apply (frule Vr_ring[of v])
apply (simp only:Ring.principal_ideal_n_pow1[THEN sym])
apply (drule sym, simp, frule vp_ideal[of v])
apply (simp add:Ring.ring_pow_apow,
      frule_tac n = "an N" in vp_apow_ideal[of v], simp,
      frule Ring.ring_is_ag[of R],
      frule_tac x = "snd (HprR (Vr K v) X t S Y f g0 h0 n)" in
        aGroup.ag_mOp_closed[of R], assumption)
apply (frule_tac I = "vp K v(Vr K v) (an N)" and
      p = "(snd (HprR (Vr K v) X t S Y f g0 h0 N)) ±
      -a (snd (HprR (Vr K v) X t S Y f g0 h0 n))" in PolynRg.P_mod_minus[of R
     "Vr K v" X], assumption+)

apply (rule aGroup.ag_pOp_closed, assumption+,
       simp add:aGroup.ag_p_inv aGroup.ag_inv_inv)
 apply (frule Ring.ring_is_ag,
       frule_tac x = "-a snd (HprR (Vr K v) X t S Y f g0 h0 N)" and
       y = "snd (HprR (Vr K v) X t S Y f g0 h0 n)" in aGroup.ag_pOp_commute)
 apply(rule aGroup.ag_mOp_closed, assumption+, simp,
       thin_tac "-a snd (HprR (Vr K v) X t S Y f g0 h0 N) ±
       snd (HprR (Vr K v) X t S Y f g0 h0 n) = snd (HprR (Vr K v) X t S Y f g0 h0 n) ±
       -a snd (HprR (Vr K v) X t S Y f g0 h0 N)")
apply (frule_tac I = "vp K v(Vr K v) (an N)" and
       p = "snd (HprR (Vr K v) X t S Y f g0 h0 n) ±
          -a snd (HprR (Vr K v) X t S Y f g0 h0 N)" and
       q = "snd (HprR (Vr K v) X t S Y f g0 h0 N) ±
          -a snd (HprR (Vr K v) X t S Y f g0 h0 m)" in PolynRg.P_mod_add[of
          R "Vr K v" X], assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (frule_tac x = "snd (HprR (Vr K v) X t S Y f g0 h0 N)" in
       aGroup.ag_mOp_closed, assumption+,
       frule_tac x = "snd (HprR (Vr K v) X t S Y f g0 h0 m)" in
       aGroup.ag_mOp_closed, assumption+,
       simp add:aGroup.pOp_assocTr43[of R] aGroup.ag_l_inv1 aGroup.ag_r_zero)
apply (simp add:Hsnd_def)
done

lemma (in Corps) H_Plimit_f:"[valuation K v; Complete K;
     t carrier (Vr K v); vp K v = Vr K v p t;
     PolynRg R (Vr K v) X; PolynRg S (Vr K v /r (Vr K v p t)) Y;
     f carrier R; f 0; g0 carrier R; h0 carrier R; g0 0;
     h0 0;
     0 < deg S (Vr K v /r (Vr K v p t)) Y
             (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) g0);
     0 < deg S (Vr K v /r (Vr K v p t)) Y
             (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) h0);
     deg R (Vr K v) X h0 +
        deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0) deg R (Vr K v) X f;
       
     rel_prime_pols S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                      (pj (Vr K v) (Vr K v p t)) g0)
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                       (pj (Vr K v) (Vr K v p t)) h0);
      
     erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f =
      erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0 r
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) h0;
      
        deg R (Vr K v) X g0
         deg S (Vr K v /r (Vr K v p t)) Y
           (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0);
      
      g carrier R; h carrier R;
        PlimitR X K v (Hfst K v R X t S Y f g0 h0) g;
        PlimitR X K v (Hsnd K v R X t S Y f g0 h0) h;
        PlimitR X K v (λn. (HfstK v R X t S Y f g0 h0 n) r
                            (HsndK v R X t S Y f g0 h0 n)) (g r h)]
       ==> PlimitR X K v (λn. (HfstK v R X t S Y f g0 h0 n) r
                              (HsndK v R X t S Y f g0 h0 n)) f"
apply(frule Vr_integral[of v], frule vp_ideal[of v],
       frule Vr_ring, frule pj_Hom[of "Vr K v" "vp K v"], assumption+,
       simp add:PolynRg.erH_mult[THEN sym, of R "Vr K v" X S
          "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)" g0 h0])
apply(frule PolynRg.P_mod_diff[of R "Vr K v" X "Vr K v p t" S Y
        f "g0 r h0"], assumption+,
       frule PolynRg.is_Ring[of R], rule Ring.ring_tOp_closed,
       assumption+, simp) (** P_mod done **)
apply (simp add:PolynRg.erH_mult[of R "Vr K v" X S
          "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)" g0 h0])
apply (frule PolynRg.is_Ring[of R])
apply (frule Hfst_PCauchy[of v R X S t Y g0 h0 f], assumption+,
       frule Hsnd_PCauchy[of v R X S t Y g0 h0 f], assumption+)
apply (subst pol_limit_def)
apply (rule conjI)
 apply (rule allI)
 apply (rule Ring.ring_tOp_closed, assumption)
 apply (simp add:pol_Cauchy_seq_def, simp add:pol_Cauchy_seq_def)
 apply (rule allI)
 apply (subgoal_tac "m>N. P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                   ((HfstK v R X t S Y f g0 h0 m) r (HsndK v R X t S Y f g0 h0 m)
                       ± -a f)")
apply blast

apply (rule allI, rule impI, frule Vr_integral[of v])
apply (frule_tac t = t and g = g0 and h = h0 and m = "m - Suc 0" in
       PolynRg.P_mod_diffxxx5_1[of R "Vr K v" X _ S Y], assumption+,
       simp add:vp_gen_nonzero[of v],
       frule vp_maximal[of v], simp, assumption+)
apply ((erule conjE)+, simp del:npow_suc Hpr_Suc)
apply (frule Ring.ring_is_ag[of "R"])
apply (thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y
       (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) g0)",
       thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y
             (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) h0)",
       thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0)
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) h0)",
       thin_tac "P_mod R (Vr K v) X (Vr K v p t) ( f ± -a g0 r h0)",
       thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f =
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0) r
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) h0)",
       thin_tac "deg R (Vr K v) X g0 deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0)",
       thin_tac "deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0) deg R (Vr K v) X f",
        thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) (fst (HprR (Vr K v) X t S Y f g0 h0 m)) =
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0",
       thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) (snd (HprR (Vr K v) X t S Y f g0 h0 m)) =
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) h0",
       thin_tac "deg R (Vr K v) X (fst (HprR (Vr K v) X t S Y f g0 h0 m))
         deg S (Vr K v /r (Vr K v p t)) Y
           (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0)",
       thin_tac "P_mod R (Vr K v) X (Vr K v p (t^Vr K v) m))
        ( fst (HprR (Vr K v) X t S Y f g0 h0 (m - Suc 0)) ±
             -a (fst (HprR (Vr K v) X t S Y f g0 h0 m)))",
       thin_tac "deg R (Vr K v) X (snd (HprR (Vr K v) X t S Y f g0 h0 m)) +
        deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0) deg R (Vr K v) X f",
       thin_tac "P_mod R (Vr K v) X (Vr K v p (t^Vr K v) m))
         (snd (HprR (Vr K v) X t S Y f g0 h0 (m - Suc 0)) ±
             -a (snd (HprR (Vr K v) X t S Y f g0 h0 m)))")
apply (case_tac "N = 0", simp add:r_apow_def)
apply (rule_tac p = "(HfstK v R X t S Y f g0 h0 m) r (HsndK v R X t S Y f g0 h0 m)
               ± -a f" in PolynRg.P_mod_whole[of R "Vr K v" X], assumption+)
apply (simp add:Hfst_def Hsnd_def)
apply (frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 m" in cart_prod_fst[of _ "carrier R" "carrier R"])
apply (frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 m" in cart_prod_snd[of _
       "carrier R" "carrier R"])
apply (frule Ring.ring_is_ag[of R],
       rule aGroup.ag_pOp_closed, assumption)
 apply (rule Ring.ring_tOp_closed, assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)

apply (frule_tac g = "f ± -a (fst (HprR (Vr K v) X t S Y f g0 h0 m)) r
       (snd (HprR (Vr K v) X t S Y f g0 h0 m))" and m = "N - Suc 0" and n = m in
       PolynRg.P_mod_n_m[of "R" "Vr K v" "X"], assumption+)
apply (frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 m" in cart_prod_fst[of _ "carrier R" "carrier R"],
       frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 m" in cart_prod_snd[of _ "carrier R" "carrier R"])

apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed,
       assumption)
apply (rule Ring.ring_tOp_closed, assumption+)
apply (subst Suc_le_mono[THEN sym], simp)
apply assumption
apply (simp del:npow_suc)
apply (simp only:Ring.principal_ideal_n_pow1[THEN sym, of "Vr K v"])
apply (cut_tac n = N in an_neq_inf)
apply (subgoal_tac "an N 0")
apply (subst r_apow_def, simp) apply (simp add:na_an)
apply (frule Ring.principal_ideal[of "Vr K v" t], assumption)
apply (frule_tac I = "Vr K v p t" and n = N in Ring.ideal_pow_ideal[of "Vr K v"], assumption+)
apply (frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 m" in cart_prod_fst[of _ "carrier R" "carrier R"],
       frule_tac x = "HprR (Vr K v) X t S Y f g0 h0 m" in cart_prod_snd[of _ "carrier R" "carrier R"])

apply (thin_tac "PCauchyR X K v Hfst K v R X t S Y f g0 h0",
       thin_tac "PCauchyR X K v Hsnd K v R X t S Y f g0 h0")
apply (simp add:Hfst_def Hsnd_def)
apply (frule_tac x = "fst (HprR (Vr K v) X t S Y f g0 h0 m)" and y = "snd (HprR (Vr K v) X t S Y f g0 h0 m)" in Ring.ring_tOp_closed[of "R"], assumption+)

apply (frule_tac x = "(fst (HprR (Vr K v) X t S Y f g0 h0 m)) r (snd (HprR (Vr K v) X t S Y f g0 h0 m))" in aGroup.ag_mOp_closed[of "R"], assumption+)
apply (frule_tac I = "Vr K v p t <diamondsuit>(Vr K v) N" and
       p = "f ± -a (fst (HprR (Vr K v) X t S Y f g0 h0 m)) r
        (snd (HprR (Vr K v) X t S Y f g0 h0 m))" in
       PolynRg.P_mod_minus[of R "Vr K v" X], assumption+)
apply (frule Ring.ring_is_ag[of "R"])
apply (rule aGroup.ag_pOp_closed, assumption+)
apply (simp add:aGroup.ag_p_inv, simp add:aGroup.ag_inv_inv,
       frule aGroup.ag_mOp_closed[of "R" "f"], assumption+)
apply (simp add:aGroup.ag_pOp_commute[of "R" "-a f"])
apply (subst an_0[THEN sym])
apply (subst aneq_natneq[of _ "0"], thin_tac "an N ", simp)
done

theorem (in Corps) Hensel:"[valuation K v; Complete K;
    PolynRg R (Vr K v) X; PolynRg S ((Vr K v) /r (vp K v)) Y;
    f carrier R; f 0; g' carrier S; h' carrier S;
    0 < deg S ((Vr K v) /r (vp K v)) Y g';
    0 < deg S ((Vr K v) /r (vp K v)) Y h';
    ((erH R (Vr K v) X S ((Vr K v) /r (vp K v)) Y
             (pj (Vr K v) (vp K v))) f) = g' r h';
    rel_prime_pols S ((Vr K v) /r (vp K v)) Y g' h'] ==>
  g h. g carrier R h carrier R
        deg R (Vr K v) X g deg S ((Vr K v) /r (vp K v)) Y g'
                  f = g r h"
apply (frule PolynRg.is_Ring[of R "Vr K v" X],
       frule PolynRg.is_Ring[of S "Vr K v /r vp K v" Y],
       frule vp_gen_t[of v], erule bexE,
       frule_tac t = t in vp_gen_nonzero[of v], assumption)
apply (frule_tac t = t in Hensel_starter[of v R X S Y _ f g' h'], assumption+)
apply ((erule exE)+, (erule conjE)+, rename_tac g0 h0)
apply (frule Vr_ring[of v], frule Vr_integral[of v])
apply (rotate_tac 22, drule sym, drule sym, simp)
apply (frule vp_maximal[of v], simp)
apply (frule_tac mx = "Vr K v p t" in Ring.residue_field_cd[of "Vr K v"],
                 assumption)
apply (frule_tac mx = "Vr K v p t" in Ring.maximal_ideal_ideal[of "Vr K v"],
          assumption)
apply (frule_tac I = "Vr K v p t" in Ring.qring_ring[of "Vr K v"],
       assumption+)
apply (frule_tac B = "Vr K v /r (Vr K v p t)" and h = "pj (Vr K v) (Vr K v p t)" in PolynRg.erH_rHom[of R "Vr K v" X S _ Y], assumption+)
 apply (simp add:pj_Hom)
apply (frule_tac ?g0.0 = g0 and ?h0.0 = h0 in Hfst_PCauchy[of v R X S _ Y _ _
       f], assumption+)
apply (frule_tac ?g0.0 = g0 and ?h0.0 = h0 in Hsnd_PCauchy[of v R X S _ Y _ _
       f], assumption+)
apply (frule_tac F = "λj. Hfst v R X t S Y f g0 h0 j" in PCauchy_Plimit[of v R X]
      , assumption+)
apply (frule_tac F = "λj. Hsnd v R X t S Y f g0 h0 j" in PCauchy_Plimit[of v R X]
, assumption+)
apply ((erule bexE)+, rename_tac g0 h0 g h)

apply (frule_tac F = "λj. Hfst v R X t S Y f g0 h0 j" and
        G = "λj. Hsnd v R X t S Y f g0 h0 j" and ?p1.0 = g and ?p2.0 = h
       in P_limit_mult[of v R X], assumption+, rule allI)

apply (simp add:pol_Cauchy_seq_def)
apply (simp add:pol_Cauchy_seq_def, assumption+)
apply (frule_tac t = t and ?g0.0 = g0 and ?h0.0 = h0 and g = g and h = h in
       H_Plimit_f[of v _ R X S Y f], assumption+)
apply (frule_tac F = "λn. (HfstK v R X t S Y f g0 h0 n) r (HsndK v R X t S Y f g0 h0 n)" and ?p1.0 = "g r h" and d = "na (deg R (Vr K v) X g0 + deg R (Vr K v) X f)" in P_limit_unique[of v R X _ _ _ f], assumption+)
apply (rule allI)
 apply (frule PolynRg.is_Ring[of R],
        rule Ring.ring_tOp_closed, assumption)
 apply (simp add:pol_Cauchy_seq_def)
 apply (simp add:pol_Cauchy_seq_def)
 apply (rule allI)
apply (thin_tac "PlimitR X K v (Hfst K v R X t S Y f g0 h0) g",
       thin_tac "PlimitR X K v (Hsnd K v R X t S Y f g0 h0) h",
       thin_tac "PlimitR X K v (λn. (HfstK v R X t S Y f g0 h0 n) r
                             (HsndK v R X t S Y f g0 h0 n)) (g r h)",
       thin_tac "PlimitR X K v (λn. (HfstK v R X t S Y f g0 h0 n) r
                             (HsndK v R X t S Y f g0 h0 n)) f")
apply (subst PolynRg.deg_mult_pols1[of R "Vr K v" X], assumption+)

 apply (simp add:pol_Cauchy_seq_def, simp add:pol_Cauchy_seq_def,
        thin_tac "g' = erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0",
        thin_tac "h' = erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) h0")
apply (subst PolynRg.deg_mult_pols1[THEN sym, of R "Vr K v" X], assumption+)
apply (simp add:pol_Cauchy_seq_def, simp add:pol_Cauchy_seq_def)

apply (frule_tac p1 = g0 in PolynRg.deg_mult_pols1[THEN sym, of R "Vr K v" X _ f], assumption+, simp)
apply (frule_tac x = g0 in Ring.ring_tOp_closed[of R _ f], assumption+)
apply (frule_tac p = "g0 r f" in PolynRg.nonzero_deg_pos[of R "Vr K v" X],
          assumption+)
apply (frule_tac p = "g0 r f" in PolynRg.deg_in_aug_minf[of R "Vr K v" X],
       assumption+, simp add:aug_minf_def,
       simp add:PolynRg.polyn_ring_integral[of R "Vr K v" X],
       simp add:Idomain.idom_tOp_nonzeros[of R _ f],
       frule_tac p = "g0 r f" in PolynRg.deg_noninf[of R "Vr K v" X],
       assumption+)
apply (simp add:an_na)
apply (subst PolynRg.deg_mult_pols1[of "R" "Vr K v" "X"], assumption+,
       simp add:pol_Cauchy_seq_def, simp add:pol_Cauchy_seq_def)
apply (frule_tac t = t and g = g0 and h = h0 and m = n in
       PolynRg.P_mod_diffxxx5_4[of R "Vr K v" X _ S Y f], assumption+)
apply (erule conjE)

apply (frule_tac a = "deg R (Vr K v) X (fst (HprR (Vr K v) X t S Y f g0 h0 n))" and a' = "deg R (Vr K v) X g0" and b = "deg R (Vr K v) X (snd (HprR (Vr K v) X t S Y f g0 h0 n))" and b' = "deg R (Vr K v) X f" in aadd_plus_le_plus, assumption+)
 apply simp
apply (simp add:Hfst_def Hsnd_def)

apply (rule Ring.ring_tOp_closed, assumption+)
 apply (rotate_tac -1, drule sym)
apply (frule_tac F = "λj. Hfst v R X t S Y f g0 h0 j" and p = g and ad = "deg S
 (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
  (pj (Vr K v) (Vr K v p t)) g0)" in Plimit_deg1[of v R X], assumption+,
  simp add:pol_Cauchy_seq_def)
apply (rule allI)
apply (frule_tac t = t and g = g0 and h = h0 and m = n in
      PolynRg.P_mod_diffxxx5_4[of R "Vr K v" X _ S Y f], assumption+,
      erule conjE)
apply (frule_tac i = "deg R (Vr K v) X (fst (HprR (Vr K v) X t S Y f g0 h0 n))" and
 j = "deg R (Vr K v) X g0" and k = "deg S (Vr K v /r (Vr K v p t)) Y
      (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) g0)" in ale_trans, assumption+)
 apply (subst Hfst_def, assumption+, blast)
done

end

Messung V0.5 in Prozent
C=95 H=99 G=96

¤ Dauer der Verarbeitung: 0.235 Sekunden  ¤

*© Formatika GbR, Deutschland






ehemaliges Applet des 4D-Würfels

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.