(*-------------------------------------------*
| CSP-Prover on Isabelle2004 |
| November 2004 |
| |
| CSP-Prover on Isabelle2005 |
| October 2005 (modified) |
| March 2006 (modified) |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory Norm_seq = CMS:
(*****************************************************************
1. Definition of Normarized sequences
2. Properties of Normarized sequences
3. How to transform each Cauchy sequence to NF
4. The same limit between xs and NF(xs)
*****************************************************************)
consts
normal :: "'a::ms infinite_seq => bool"
Nset :: "'a::ms infinite_seq => real => nat set"
Nmin :: "'a::ms infinite_seq => real => nat"
NF :: "'a::ms infinite_seq => 'a::ms infinite_seq"
defs
normal_def :
"normal xs == ALL (n::nat) (m::nat).
distance(xs n, xs m) <= (1/2)^(min n m)"
Nset_def :
"Nset xs delta ==
{N. ALL n m. (N <= m & N <= n) --> distance(xs n, xs m) <= delta}"
Nmin_def :
"Nmin xs delta == MIN (Nset xs delta)"
NF_def :
"NF xs == (%n. xs (Nmin xs ((1/2)^n)))"
(********************************************************************
Normalization
********************************************************************)
(*** normalized sequence --> Cauchy sequence ***)
lemma normal_cauchy: "normal xs ==> cauchy xs"
apply (simp add: cauchy_def)
apply (intro allI impI)
apply (subgoal_tac "EX n. (1/2) ^ n < delta")
apply (erule exE)
apply (rule_tac x="n" in exI)
apply (intro allI impI)
apply (simp add: normal_def)
apply (drule_tac x="i" in spec)
apply (drule_tac x="j" in spec)
apply (subgoal_tac "((1::real) / 2) ^ min i j <= (1 / 2) ^ n")
apply (simp)
apply (case_tac "i <= j")
apply (simp add: min_def power_decreasing)
apply (simp add: min_def power_decreasing)
apply (simp add: pow_convergence)
done
declare realpow_Suc [simp del]
lemma normal_Limit:
"[| normal xs ; xs convergeTo y |]
==> distance(xs (Suc n), y) < (1/2)^n"
apply (simp add: convergeTo_def)
apply (drule_tac x="(1/2)^(Suc n)" in spec)
apply (simp)
apply (erule exE)
apply (rename_tac N)
apply (case_tac "N <= Suc n")
apply (drule_tac x="Suc n" in spec)
apply (simp add: symmetry_ms)
apply (subgoal_tac "((1::real) / 2) ^ Suc n <= (1 / 2) ^ n")
apply (simp)
apply (simp add: power_decreasing)
(* else (i.e. Suc n < N *)
apply (drule_tac x="N" in spec)
apply (simp)
apply (insert triangle_inequality_ms)
apply (drule_tac x="xs (Suc n)" in spec)
apply (drule_tac x="xs N" in spec)
apply (drule_tac x="y" in spec)
apply (simp add: normal_def)
apply (drule_tac x="Suc n" in spec)
apply (drule_tac x="N" in spec)
apply (simp add: symmetry_ms)
apply (simp add: min_def)
apply (simp add: realpow_Suc)
done
declare realpow_Suc [simp]
(********************************************************************
Nmin
********************************************************************)
(*** Nmin exists ***)
lemma Nmin_exists:
"[| 0 < delta ; cauchy xs |] ==> EX N. N isMIN (Nset xs delta)"
apply (simp add: cauchy_def)
apply (drule_tac x="delta" in spec)
apply (simp)
apply (erule exE)
apply (rule EX_MIN_nat)
apply (simp add: Nset_def)
apply (rule_tac x="n" in exI)
apply (intro allI impI)
apply (drule_tac x="na" in spec)
apply (drule_tac x="m" in spec)
by (simp)
lemma Nset_hasMIN:
"[| 0 < delta ; cauchy xs |] ==> (Nset xs delta) hasMIN"
apply (simp add: hasMIN_def)
apply (rule Nmin_exists)
by (simp)
(*** Nmin unique ***)
lemma Nmin_unique:
"[| N isMIN (Nset xs delta) ; M isMIN (Nset xs delta) |] ==> N = M"
by (simp add: MIN_unique)
(*-----------------------*
| the Nmin |
*-----------------------*)
lemma Nset_to_Nmin :
"[| 0 < delta ; cauchy xs |]
==> (N isMIN (Nset xs delta)) = (Nmin xs delta = N)"
apply (simp add: Nmin_def)
apply (rule iffI)
apply (simp add: MIN_def Nset_hasMIN)
apply (rule the_equality)
apply (simp)
apply (simp add: Nmin_unique)
by (simp add: MIN_iff Nset_hasMIN)
lemmas Nmin_to_Nset = Nset_to_Nmin[THEN sym]
lemma Nmin_to_Nset_sym :
"[| 0 < delta ; cauchy xs |]
==> (N = Nmin xs delta) = (N isMIN (Nset xs delta))"
by (auto simp add: Nset_to_Nmin)
lemmas Nmin_iff = Nmin_to_Nset Nmin_to_Nset_sym
(*-----------------------*
| property |
*-----------------------*)
lemma Nmin_cauchy_lm:
"[| 0 < delta ; cauchy xs ; Nmin xs delta = N |]
==> (ALL n m. (N <= m & N <= n) --> distance(xs n, xs m) <= delta)"
by (simp add: Nmin_iff Nset_def isMIN_def)
lemma Nmin_cauchy:
"[| 0 < delta ; cauchy xs ; Nmin xs delta <= m ; Nmin xs delta <= n |]
==> distance(xs n, xs m) <= delta"
by (simp add: Nmin_cauchy_lm)
(*-----------------------*
| min_number_cauchy |
*-----------------------*)
(*** Nmin order (check) ***)
lemma min_number_cauchy_lm:
"[| 0 < delta1 ; delta1 <= delta2 ; cauchy xs |]
==> Nset xs delta1 <= Nset xs delta2"
apply (simp add: Nset_def)
apply (rule subsetI)
apply (simp)
apply (intro allI impI)
apply (drule_tac x="n" in spec)
apply (drule_tac x="m" in spec)
by (simp)
(*** Nmin order ***)
lemma min_number_cauchy:
"[| 0 < delta1 ; delta1 <= delta2 ; cauchy xs ;
Nmin xs delta1 = N1 ; Nmin xs delta2 = N2 |]
==> N2 <= N1"
apply (simp add: Nmin_iff)
by (simp add: isMIN_subset min_number_cauchy_lm)
(*** Nmin order half ***)
lemma min_number_cauchy_half:
"[| n <= m ; cauchy xs ; Nmin xs ((1/2)^n) = N1 ; Nmin xs ((1/2)^m) = N2 |]
==> N1 <= N2"
apply (rule min_number_cauchy)
by (simp_all add: power_decreasing)
(*------------------------*
| normal_form_seq_normal |
*------------------------*)
lemma normal_form_seq_normal: "cauchy xs ==> normal (NF(xs))"
apply (simp add: normal_def NF_def)
apply (intro allI)
apply (case_tac "n <= m")
apply (simp add: min_def)
apply (rule Nmin_cauchy, simp_all)
apply (rule min_number_cauchy_half, simp_all)
(* else *)
apply (simp add: min_def)
apply (rule Nmin_cauchy, simp_all)
apply (rule min_number_cauchy_half, simp_all)
done
(*----------------------------*
| normal_form_seq_same_Limit |
*----------------------------*)
(*** only if part ***)
lemma normal_form_seq_same_Limit_only_if:
"[| cauchy xs ; xs convergeTo y |] ==> NF(xs) convergeTo y"
apply (simp add: convergeTo_def)
apply (intro allI impI)
apply (drule_tac x="eps/2" in spec)
apply (simp)
apply (erule exE)
apply (subgoal_tac "EX n. (1 / 2) ^ n < eps/2")
apply (erule exE)
apply (rename_tac eps N M)
apply (rule_tac x="M" in exI)
apply (intro allI impI)
apply (case_tac "N <= Nmin xs ((1/2)^m)")
apply (drule_tac x="Nmin xs ((1/2)^m)" in spec)
apply (simp add: NF_def)
(* else *)
apply (insert triangle_inequality_ms)
apply (drule_tac x="y" in spec)
apply (drule_tac x="xs N" in spec)
apply (drule_tac x="(NF xs) m" in spec)
apply (drule_tac x="N" in spec)
apply (simp add: NF_def)
apply (subgoal_tac "distance (xs N, xs (Nmin xs ((1 / 2) ^ m))) <= (1 / 2) ^ m")
apply (subgoal_tac "((1::real) / 2) ^ m <= (1 / 2) ^ M")
apply (simp)
apply (simp add: power_decreasing)
apply (rule Nmin_cauchy)
apply (simp, simp, simp, simp)
apply (rule pow_convergence)
apply (simp_all)
done
(*** if part ***)
lemma normal_form_seq_same_Limit_if:
"[| cauchy xs ; NF (xs) convergeTo y |] ==> xs convergeTo y"
apply (simp add: convergeTo_def)
apply (intro allI impI)
apply (drule_tac x="eps/2" in spec)
apply (simp)
apply (erule exE)
apply (subgoal_tac "EX n. (1 / 2) ^ n < eps/2")
apply (erule exE)
apply (rename_tac eps N M)
apply (rule_tac x="Nmin xs ((1/2)^(max N M))" in exI)
apply (intro allI impI)
apply (insert triangle_inequality_ms)
apply (drule_tac x="y" in spec)
apply (drule_tac x="xs (Nmin xs ((1/2)^(max N M)))" in spec)
apply (drule_tac x="xs m" in spec)
apply (drule_tac x="max N M" in spec)
apply (simp add: le_maxI1)
apply (simp add: NF_def)
(* *)
apply (subgoal_tac
"distance(xs (Nmin xs ((1 / 2) ^ max N M)), xs m) <= (1 / 2) ^ max N M")
apply (subgoal_tac "((1::real) / 2) ^ max N M <= (1 / 2) ^ M")
apply (simp)
apply (simp add: max_def power_decreasing)
apply (rule Nmin_cauchy)
apply (simp, simp, simp, simp)
apply (rule pow_convergence)
apply (simp_all)
done
(*** iff ***)
lemma normal_form_seq_same_Limit:
"cauchy xs ==> xs convergeTo y = NF(xs) convergeTo y"
apply (rule iffI)
apply (simp add: normal_form_seq_same_Limit_only_if)
apply (simp add: normal_form_seq_same_Limit_if)
done
end
lemma normal_cauchy:
normal xs ==> cauchy xs
lemma normal_Limit:
[| normal xs; xs convergeTo y |] ==> distance (xs (Suc n), y) < (1 / 2) ^ n
lemma Nmin_exists:
[| 0 < delta; cauchy xs |] ==> ∃N. N isMIN Nset xs delta
lemma Nset_hasMIN:
[| 0 < delta; cauchy xs |] ==> (Nset xs delta) hasMIN
lemma Nmin_unique:
[| N isMIN Nset xs delta; M isMIN Nset xs delta |] ==> N = M
lemma Nset_to_Nmin:
[| 0 < delta; cauchy xs |] ==> N isMIN Nset xs delta = (Nmin xs delta = N)
lemmas Nmin_to_Nset:
[| 0 < delta1; cauchy xs1 |] ==> (Nmin xs1 delta1 = N1) = N1 isMIN Nset xs1 delta1
lemmas Nmin_to_Nset:
[| 0 < delta1; cauchy xs1 |] ==> (Nmin xs1 delta1 = N1) = N1 isMIN Nset xs1 delta1
lemma Nmin_to_Nset_sym:
[| 0 < delta; cauchy xs |] ==> (N = Nmin xs delta) = N isMIN Nset xs delta
lemmas Nmin_iff:
[| 0 < delta1; cauchy xs1 |] ==> (Nmin xs1 delta1 = N1) = N1 isMIN Nset xs1 delta1
[| 0 < delta; cauchy xs |] ==> (N = Nmin xs delta) = N isMIN Nset xs delta
lemmas Nmin_iff:
[| 0 < delta1; cauchy xs1 |] ==> (Nmin xs1 delta1 = N1) = N1 isMIN Nset xs1 delta1
[| 0 < delta; cauchy xs |] ==> (N = Nmin xs delta) = N isMIN Nset xs delta
lemma Nmin_cauchy_lm:
[| 0 < delta; cauchy xs; Nmin xs delta = N |] ==> ∀n m. N ≤ m ∧ N ≤ n --> distance (xs n, xs m) ≤ delta
lemma Nmin_cauchy:
[| 0 < delta; cauchy xs; Nmin xs delta ≤ m; Nmin xs delta ≤ n |] ==> distance (xs n, xs m) ≤ delta
lemma min_number_cauchy_lm:
[| 0 < delta1.0; delta1.0 ≤ delta2.0; cauchy xs |] ==> Nset xs delta1.0 ⊆ Nset xs delta2.0
lemma min_number_cauchy:
[| 0 < delta1.0; delta1.0 ≤ delta2.0; cauchy xs; Nmin xs delta1.0 = N1.0; Nmin xs delta2.0 = N2.0 |] ==> N2.0 ≤ N1.0
lemma min_number_cauchy_half:
[| n ≤ m; cauchy xs; Nmin xs ((1 / 2) ^ n) = N1.0; Nmin xs ((1 / 2) ^ m) = N2.0 |] ==> N1.0 ≤ N2.0
lemma normal_form_seq_normal:
cauchy xs ==> normal (NF xs)
lemma normal_form_seq_same_Limit_only_if:
[| cauchy xs; xs convergeTo y |] ==> NF xs convergeTo y
lemma normal_form_seq_same_Limit_if:
[| cauchy xs; NF xs convergeTo y |] ==> xs convergeTo y
lemma normal_form_seq_same_Limit:
cauchy xs ==> xs convergeTo y = NF xs convergeTo y