Up to index of Isabelle/HOL/HOL-Complex/CSP
theory Infra_list(*-------------------------------------------* | CSP-Prover on Isabelle2004 | | November 2004 | | June 2005 (modified) | | July 2005 (modified) | | | | CSP-Prover on Isabelle2005 | | October 2005 (modified) | | | | Yoshinao Isobe (AIST JAPAN) | *-------------------------------------------*) theory Infra_list imports Infra_nat begin (***************************************************** Small lemmas for List *****************************************************) (*** list of the empty set ***) consts Emptyset_list :: "nat => 'a set list" ("{}::_" [1000] 1000 ) primrec "{}::0 = []" "{}::(Suc n) = {} # {}::n" lemma not_emptyset_EX: "A ~= {} = (EX a. a:A)" by (auto) lemma one_list_decompo: "([a] = s @ t) = ((s =[] & t = [a]) | (s = [a] & t = []))" by (induct_tac s, auto) lemma list_nil_or_unnil: "ALL t. (t = []) | (EX a s. t = a # s)" apply (intro allI) by (induct_tac t, auto) lemma list_last_nil_or_unnil: "ALL t. (t = []) | (EX s a. t =s @ [a])" apply (intro allI) by (induct_tac t, auto) (*** unnil ***) lemma unnil_ex_ALL: "ALL s. s ~= [] --> (EX a. a : set s)" apply (rule allI) apply (induct_tac s) apply (auto) done lemma unnil_ex: "s ~= [] ==> (EX a. a : set s)" by (simp add: unnil_ex_ALL) (*** nil ***) lemma emptyset_to_nil: "({} = set t) = (t = [])" by (auto) lemma nil_to_emptyset: "(X = set []) = (X = {})" by (auto) (****** butlast ******) lemma notin_butlast_decompo: "e ~: set (butlast (s @ t)) = ((e ~: set s & e ~: set (butlast t)) | (e ~: set (butlast s) & t = []))" apply (induct_tac s) by (auto) lemma in_butlast_decompo: "e : set (butlast (s @ t)) = ((e : set s | e : set (butlast t)) & (e : set (butlast s) | t ~= []))" apply (induct_tac s) by (auto) lemma butlast_subseteq : "set (butlast s) <= set s" apply (induct_tac s) by (auto) (*** length s = 1 ***) lemma list_length_one: "(length s = Suc 0) = (EX a. s =[a])" apply (induct_tac s) by (auto) (****** list app app ******) (*** lm ***) lemma list_app_app_only_if: "ALL s1 s2 t1 t2. (s1 @ s2 = t1 @ t2) --> ((EX u. s1 = t1 @ u & t2 = u @ s2) | (EX u. t1 = s1 @ u & s2 = u @ t2) )" apply (rule allI) apply (induct_tac s1) apply (intro allI impI) apply (rule disjI2) apply (rule_tac x="t1" in exI) apply (simp) (* step *) apply (intro allI impI) apply (insert list_nil_or_unnil) apply (rotate_tac -1) apply (drule_tac x="t1" in spec) apply (erule disjE) (* t1 = [] *) apply (simp) (* t1 ~= [] *) apply (elim exE) apply (simp) done (*** list app app ***) lemma list_app_app: "(s1 @ s2 = t1 @ t2) = ((EX u. s1 = t1 @ u & t2 = u @ s2) | (EX u. t1 = s1 @ u & s2 = u @ t2))" apply (rule iffI) apply (simp add: list_app_app_only_if) apply (auto) done (*** list app [a] ***) lemma list_app_decompo_one: "(s @ t = [a]) = ((s = [a] & t = []) | (s = [] & t = [a]))" apply (induct_tac s) by (auto) (*** map ***) lemma divide_map_fst_ALL: "ALL ss s2 s1. map fst (ss::('a * 'b) list) = s1 @ s2 --> (EX (ss1::('a * 'b) list) (ss2::('a * 'b) list). ss = ss1 @ ss2 & map fst ss1 = s1 & map fst ss2 = s2)" apply (rule allI) apply (rule allI) apply (induct_tac s2) apply (simp_all) apply (intro allI impI) apply (drule_tac x="s1 @ [a]" in spec) apply (simp) apply (elim conjE exE) apply (insert list_last_nil_or_unnil) apply (drule_tac x="ss1" in spec) apply (erule disjE) apply (simp) apply (elim conjE exE) apply (simp) apply (rule_tac x="s" in exI, simp) by (auto) lemma divide_map_fst: "map fst (ss::('a * 'b) list) = s1 @ s2 ==> (EX (ss1::('a * 'b) list) (ss2::('a * 'b) list). ss = ss1 @ ss2 & map fst ss1 = s1 & map fst ss2 = s2)" by (simp add: divide_map_fst_ALL) (*** zip ***) lemma map_fst_zip_eq_lm: "ALL t. length s <= length t --> map fst (zip s t) = s" apply (induct_tac s) apply (simp_all) apply (intro allI impI) apply (insert list_nil_or_unnil) apply (rotate_tac -1) apply (drule_tac x="t" in spec) by (auto) lemma map_fst_zip_eq: "length s <= length t ==> map fst (zip s t) = s" by (simp add: map_fst_zip_eq_lm) lemma fst_set_zip_eq_lm: "ALL t. length s <= length t --> fst ` set (zip s t) = set s" apply (induct_tac s) apply (simp_all) apply (intro allI impI) apply (insert list_nil_or_unnil) apply (rotate_tac -1) apply (drule_tac x="t" in spec) apply (erule disjE, simp) apply (elim conjE exE, simp) done lemma fst_set_zip_eq: "length s <= length t ==> fst ` set (zip s t) = set s" by (simp add: fst_set_zip_eq_lm) lemma zip_map_fst_snd: "zip (map fst s) (map snd s) = s" apply (induct_tac s) by (auto) lemma set_nth: "(a : set s) = (EX i. i < length s & a = s!i)" apply (induct_tac s) apply (simp_all) apply (rule iffI) (* => *) apply (force) (* <= *) apply (elim conjE exE) apply (drule sym) apply (simp) apply (insert nat_zero_or_Suc) apply (drule_tac x="i" in spec) apply (erule disjE, simp) apply (elim exE, simp) done lemma nth_pair_zip_in_ALL: "ALL s t i. (length s = length t & i < length t) --> (s!i,t!i) : set (zip s t)" apply (rule allI) apply (induct_tac s) apply (auto) apply (insert list_nil_or_unnil) apply (rotate_tac -1) apply (drule_tac x="t" in spec) apply (erule disjE, simp) apply (elim conjE exE, simp) apply (insert nat_zero_or_Suc) apply (drule_tac x="i" in spec) apply (erule disjE, simp) apply (elim conjE exE, simp) done lemma nth_pair_zip_in: "[| length s = length t ; i < length t |] ==> (s!i,t!i) : set (zip s t)" by (simp add: nth_pair_zip_in_ALL) (*** emptyset list ***) lemma length_Emptyset_list[simp]: "length({}::n) = n" apply (induct_tac n) by (simp_all) end
lemma not_emptyset_EX:
(A ≠ {}) = (∃a. a ∈ A)
lemma one_list_decompo:
([a] = s @ t) = (s = [] ∧ t = [a] ∨ s = [a] ∧ t = [])
lemma list_nil_or_unnil:
∀t. t = [] ∨ (∃a s. t = a # s)
lemma list_last_nil_or_unnil:
∀t. t = [] ∨ (∃s a. t = s @ [a])
lemma unnil_ex_ALL:
∀s. s ≠ [] --> (∃a. a ∈ set s)
lemma unnil_ex:
s ≠ [] ==> ∃a. a ∈ set s
lemma emptyset_to_nil:
({} = set t) = (t = [])
lemma nil_to_emptyset:
(X = set []) = (X = {})
lemma notin_butlast_decompo:
(e ∉ set (butlast (s @ t))) = (e ∉ set s ∧ e ∉ set (butlast t) ∨ e ∉ set (butlast s) ∧ t = [])
lemma in_butlast_decompo:
(e ∈ set (butlast (s @ t))) = ((e ∈ set s ∨ e ∈ set (butlast t)) ∧ (e ∈ set (butlast s) ∨ t ≠ []))
lemma butlast_subseteq:
set (butlast s) ⊆ set s
lemma list_length_one:
(length s = Suc 0) = (∃a. s = [a])
lemma list_app_app_only_if:
∀s1 s2 t1 t2. s1 @ s2 = t1 @ t2 --> (∃u. s1 = t1 @ u ∧ t2 = u @ s2) ∨ (∃u. t1 = s1 @ u ∧ s2 = u @ t2)
lemma list_app_app:
(s1.0 @ s2.0 = t1.0 @ t2.0) = ((∃u. s1.0 = t1.0 @ u ∧ t2.0 = u @ s2.0) ∨ (∃u. t1.0 = s1.0 @ u ∧ s2.0 = u @ t2.0))
lemma list_app_decompo_one:
(s @ t = [a]) = (s = [a] ∧ t = [] ∨ s = [] ∧ t = [a])
lemma divide_map_fst_ALL:
∀ss s2 s1. map fst ss = s1 @ s2 --> (∃ss1 ss2. ss = ss1 @ ss2 ∧ map fst ss1 = s1 ∧ map fst ss2 = s2)
lemma divide_map_fst:
map fst ss = s1.0 @ s2.0 ==> ∃ss1 ss2. ss = ss1 @ ss2 ∧ map fst ss1 = s1.0 ∧ map fst ss2 = s2.0
lemma map_fst_zip_eq_lm:
∀t. length s ≤ length t --> map fst (zip s t) = s
lemma map_fst_zip_eq:
length s ≤ length t ==> map fst (zip s t) = s
lemma fst_set_zip_eq_lm:
∀t. length s ≤ length t --> fst ` set (zip s t) = set s
lemma fst_set_zip_eq:
length s ≤ length t ==> fst ` set (zip s t) = set s
lemma zip_map_fst_snd:
zip (map fst s) (map snd s) = s
lemma set_nth:
(a ∈ set s) = (∃i<length s. a = s ! i)
lemma nth_pair_zip_in_ALL:
∀s t i. length s = length t ∧ i < length t --> (s ! i, t ! i) ∈ set (zip s t)
lemma nth_pair_zip_in:
[| length s = length t; i < length t |] ==> (s ! i, t ! i) ∈ set (zip s t)
lemma length_Emptyset_list:
length {}::n = n