abbreviation (input)
plussublist2 :: "'a list ==> ('a ==> 'b ==> 'c) ==> 'b list ==> 'c list"
(‹(_ /[⊔_] _)› [65, 0, 66] 65) where "x [⊔f] y == x [⊔] y" (*>*)
primrec coalesce :: "'a err list ==> 'a list err" where "coalesce [] = OK[]"
| "coalesce (ex#exs) = Err.sup (#) ex (coalesce exs)"
definition sl :: "nat ==> 'a sl ==> 'a list sl" where "sl n = (λ(A,r,f). (list n A, le r, map2 f))"
definition sup :: "('a ==> 'b ==> 'c err) ==> 'a list ==> 'b list ==> 'c list err" where "sup f = (λxs ys. if size xs = size ys then coalesce(xs [⊔] ys) else Err)"
definition upto_esl :: "nat ==> 'a esl ==> 'a list esl" where "upto_esl m = (λ(A,r,f). (Union{list n A |n. n ≤ m}, le r, sup f))"
lemmas [simp] = set_update_subsetI
lemma unfold_lesub_list: "xs [⊑] ys = Listn.le r xs ys" (*<*) by (simp add: lesub_def) (*>*)
lemma le_list_appendI: "a [⊑] b ==> c [⊑] d ==> a@c [⊑] b@d" (*<*) apply (unfold Listn.le_def lesub_def) apply (rule list_all2_appendI, assumption+) done (*>*)
lemma le_listI: assumes"length a = length b" assumes"∧n. n < length a ==> a!n ⊑r b!n" shows"a [⊑] b" (*<*) proof - from assms have"list_all2 r a b" by (simp add: list_all2_all_nthI lesub_def) thenshow ?thesis by (simp add: Listn.le_def lesub_def) qed (*>*)
lemma listI: "[ size xs = n; set xs ⊆ A ]==> xs ∈ list n A" (*<*) apply (unfold list_def) apply blast done (*>*)
(* FIXME: remove simp *) lemma listE_length [simp]: "xs ∈ list n A ==> size xs = n" (*<*) apply (unfold list_def) apply blast done (*>*)
lemma less_lengthI: "[ xs ∈ list n A; p < n ]==> p < size xs" (*<*) by simp (*>*)
lemma listE_set [simp]: "xs ∈ list n A ==> set xs ⊆ A" (*<*) apply (unfold list_def) apply blast done (*>*)
lemma list_0 [simp]: "list 0 A = {[]}" (*<*) apply (unfold list_def) apply auto done (*>*)
lemma in_list_Suc_iff: "(xs ∈ list (Suc n) A) = (∃y∈A. ∃ys ∈ list n A. xs = y#ys)" (*<*) apply (unfold list_def) apply (case_tac "xs") apply auto done (*>*)
lemma Cons_in_list_Suc [iff]: "(x#xs ∈ list (Suc n) A) = (x∈A ∧ xs ∈ list n A)" (*<*) apply (simp add: in_list_Suc_iff) done (*>*)
lemma nth_in [rule_format, simp]: "∀i n. size xs = n ⟶ set xs ⊆ A ⟶ i < n ⟶ (xs!i) ∈ A" (*<*) apply (induct "xs") apply simp apply (simp add: nth_Cons split: nat.split) done (*>*)
lemma listE_nth_in: "[ xs ∈ list n A; i < n ]==> xs!i ∈ A" (*<*) by auto (*>*)
lemma listn_Cons_Suc [elim!]: "l#xs ∈ list n A ==> (∧n'. n = Suc n' ==> l ∈ A ==> xs ∈ list n' A ==> P) ==> P" (*<*) by (cases n) auto (*>*)
lemma listn_appendE [elim!]: "a@b ∈ list n A ==> (∧n1 n2. n=n1+n2 ==> a ∈ list n1 A ==> b ∈ list n2 A ==> P) ==> P" (*<*) proof - have"∧n. a@b ∈ list n A ==>∃n1 n2. n=n1+n2 ∧ a ∈ list n1 A ∧ b ∈ list n2 A"
(is"∧n. ?list a n ==>∃n1 n2. ?P a n n1 n2") proof (induct a) fix n assume"?list [] n" hence"?P [] n 0 n"by simp thus"∃n1 n2. ?P [] n n1 n2"by fast next fix n l ls assume"?list (l#ls) n" thenobtain n' where n: "n = Suc n'""l ∈ A"and n': "ls@b ∈ list n' A"by fastforce assume"∧n. ls @ b ∈ list n A ==>∃n1 n2. n = n1 + n2 ∧ ls ∈ list n1 A ∧ b ∈ list n2 A" from this and n' have"∃n1 n2. n' = n1 + n2 ∧ ls ∈ list n1 A ∧ b ∈ list n2 A" . thenobtain n1 n2 where"n' = n1 + n2""ls ∈ list n1 A""b ∈ list n2 A"by fast with n have"?P (l#ls) n (n1+1) n2"by simp thus"∃n1 n2. ?P (l#ls) n n1 n2"by fastforce qed moreover assume"a@b ∈ list n A""∧n1 n2. n=n1+n2 ==> a ∈ list n1 A ==> b ∈ list n2 A ==> P" ultimately show ?thesis by blast qed (*>*)
lemma listt_update_in_list [simp, intro!]: "[ xs ∈ list n A; x∈A ]==> xs[i := x] ∈ list n A" (*<*) apply (unfold list_def) apply simp done (*>*)
lemma list_appendI [intro?]: "[ a ∈ list n A; b ∈ list m A ]==> a @ b ∈ list (n+m) A" (*<*) by (unfold list_def) auto (*>*)
lemma list_map [simp]: "(map f xs ∈ list (size xs) A) = (f ` set xs ⊆ A)" (*<*) by (unfold list_def) simp (*>*)
lemma list_replicateI [intro]: "x ∈ A ==> replicate n x ∈ list n A" (*<*) by (induct n) auto (*>*)
lemma Listn_sl_aux: assumes"Semilat A r f"shows"semilat (Listn.sl n (A,r,f))" (*<*) proof - interpret Semilat A r f by fact show ?thesis apply (unfold Listn.sl_def) apply (simp (no_asm) only: semilat_Def split_conv) apply (rule conjI) apply simp apply (rule conjI) apply (simp only: closedI closed_listI) apply (simp (no_asm) only: list_def) apply (simp (no_asm_simp) add: plus_list_ub1 plus_list_ub2 plus_list_lub) done qed (*>*)
lemma Listn_sl: "semilat L ==> semilat (Listn.sl n L)" (*<*) apply (cases L) apply simp apply (drule Semilat.intro) by (simp add: Listn_sl_aux split_tupled_all) (*>*)
lemma coalesce_in_err_list [rule_format]: "∀xes. xes ∈ list n (err A) ⟶ coalesce xes ∈ err(list n A)" (*<*) apply (induct n) apply simp apply clarify apply (simp add: in_list_Suc_iff) apply clarify apply (simp (no_asm) add: plussub_def Err.sup_def lift2_def split: err.split) apply force done (*>*)
lemma lem: "∧x xs. x ⊔#) xs = x#xs" (*<*) by (simp add: plussub_def) (*>*)
lemma coalesce_eq_OK1_D [rule_format]: "semilat(err A, Err.le r, lift2 f) ==> ∀xs. xs ∈ list n A ⟶ (∀ys. ys ∈ list n A ⟶ (∀zs. coalesce (xs [⊔] ys) = OK zs ⟶ xs [⊑] zs))" (*<*) apply (induct n) apply simp apply clarify apply (simp add: in_list_Suc_iff) apply clarify apply (simp split: err.split_asm add: lem Err.sup_def lift2_def) apply (force simp add: semilat_le_err_OK1) done (*>*)
lemma coalesce_eq_OK2_D [rule_format]: "semilat(err A, Err.le r, lift2 f) ==> ∀xs. xs ∈ list n A ⟶ (∀ys. ys ∈ list n A ⟶ (∀zs. coalesce (xs [⊔] ys) = OK zs ⟶ ys [⊑] zs))" (*<*) apply (induct n) apply simp apply clarify apply (simp add: in_list_Suc_iff) apply clarify apply (simp split: err.split_asm add: lem Err.sup_def lift2_def) apply (force simp add: semilat_le_err_OK2) done (*>*)
lemma lift2_le_ub: "[ semilat(err A, Err.le r, lift2 f); x∈A; y∈A; x ⊔f y = OK z; u∈A; x ⊑r u; y ⊑r u ]==> z ⊑r u" (*<*) apply (unfold semilat_Def plussub_def err_def') apply (simp add: lift2_def) apply clarify apply (rotate_tac -3) apply (erule thin_rl) apply (erule thin_rl) apply force done (*>*)
lemma coalesce_eq_OK_ub_D [rule_format]: "semilat(err A, Err.le r, lift2 f) ==> ∀xs. xs ∈ list n A ⟶ (∀ys. ys ∈ list n A ⟶ (∀zs us. coalesce (xs [⊔] ys) = OK zs ∧ xs [⊑] us ∧ ys [⊑] us ∧ us ∈ list n A ⟶ zs [⊑] us))" (*<*) apply (induct n) apply simp apply clarify apply (simp add: in_list_Suc_iff) apply clarify apply (simp (no_asm_use) split: err.split_asm add: lem Err.sup_def lift2_def) apply clarify apply (rule conjI) apply (blast intro: lift2_le_ub) apply blast done (*>*)
lemma lift2_eq_ErrD: "[ x ⊔f y = Err; semilat(err A, Err.le r, lift2 f); x∈A; y∈A ] ==>¬(∃u∈A. x ⊑r u ∧ y ⊑r u)" (*<*) by (simp add: OK_plus_OK_eq_Err_conv [THEN iffD1]) (*>*)
lemma coalesce_eq_Err_D [rule_format]: "[ semilat(err A, Err.le r, lift2 f) ] ==>∀xs. xs ∈ list n A ⟶ (∀ys. ys ∈ list n A ⟶ coalesce (xs [⊔] ys) = Err ⟶ ¬(∃zs ∈ list n A. xs [⊑] zs ∧ ys [⊑] zs))" (*<*) apply (induct n) apply simp apply clarify apply (simp add: in_list_Suc_iff) apply clarify apply (simp split: err.split_asm add: lem Err.sup_def lift2_def) apply (blast dest: lift2_eq_ErrD) done (*>*)
lemma closed_err_lift2_conv: "closed (err A) (lift2 f) = (∀x∈A. ∀y∈A. x ⊔f y ∈ err A)" (*<*) apply (unfold closed_def) apply (simp add: err_def') done (*>*)
lemma closed_map2_list [rule_format]: "closed (err A) (lift2 f) ==> ∀xs. xs ∈ list n A ⟶ (∀ys. ys ∈ list n A ⟶ map2 f xs ys ∈ list n (err A))" (*<*) apply (induct n) apply simp apply clarify apply (simp add: in_list_Suc_iff) apply clarify apply (simp add: plussub_def closed_err_lift2_conv) done (*>*)
lemma closed_lift2_sup: "closed (err A) (lift2 f) ==> closed (err (list n A)) (lift2 (sup f))" (*<*) by (fastforce simp add: closed_def plussub_def sup_def lift2_def
coalesce_in_err_list closed_map2_list
split: err.split) (*>*)
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.