theory Subarray imports Array Sublist begin definition subarray :: "nat => nat => ('a::heap) array => heap => 'a list" where "subarray n m a h ≡ sublist' n m (get_array a h)" lemma subarray_upd: "i ≥ m ==> subarray n m a (Heap.upd a i v h) = subarray n m a h" apply (simp add: subarray_def Heap.upd_def) apply (simp add: sublist'_update1) done lemma subarray_upd2: " i < n ==> subarray n m a (Heap.upd a i v h) = subarray n m a h" apply (simp add: subarray_def Heap.upd_def) apply (subst sublist'_update2) apply fastsimp apply simp done lemma subarray_upd3: "[| n ≤ i; i < m|] ==> subarray n m a (Heap.upd a i v h) = subarray n m a h[i - n := v]" unfolding subarray_def Heap.upd_def by (simp add: sublist'_update3) lemma subarray_Nil: "n ≥ m ==> subarray n m a h = []" by (simp add: subarray_def sublist'_Nil') lemma subarray_single: "[| n < Heap.length a h |] ==> subarray n (Suc n) a h = [get_array a h ! n]" by (simp add: subarray_def Heap.length_def sublist'_single) lemma length_subarray: "m ≤ Heap.length a h ==> List.length (subarray n m a h) = m - n" by (simp add: subarray_def Heap.length_def length_sublist') lemma length_subarray_0: "m ≤ Heap.length a h ==> List.length (subarray 0 m a h) = m" by (simp add: length_subarray) lemma subarray_nth_array_Cons: "[| i < Heap.length a h; i < j |] ==> (get_array a h ! i) # subarray (Suc i) j a h = subarray i j a h" unfolding Heap.length_def subarray_def by (simp add: sublist'_front) lemma subarray_nth_array_back: "[| i < j; j ≤ Heap.length a h|] ==> subarray i j a h = subarray i (j - 1) a h @ [get_array a h ! (j - 1)]" unfolding Heap.length_def subarray_def by (simp add: sublist'_back) lemma subarray_append: "[| i < j; j < k |] ==> subarray i j a h @ subarray j k a h = subarray i k a h" unfolding subarray_def by (simp add: sublist'_append) lemma subarray_all: "subarray 0 (Heap.length a h) a h = get_array a h" unfolding Heap.length_def subarray_def by (simp add: sublist'_all) lemma nth_subarray: "[| k < j - i; j ≤ Heap.length a h |] ==> subarray i j a h ! k = get_array a h ! (i + k)" unfolding Heap.length_def subarray_def by (simp add: nth_sublist') lemma subarray_eq_samelength_iff: "Heap.length a h = Heap.length a h' ==> (subarray i j a h = subarray i j a h') = (∀i'. i ≤ i' ∧ i' < j --> get_array a h ! i' = get_array a h' ! i')" unfolding Heap.length_def subarray_def by (rule sublist'_eq_samelength_iff) lemma all_in_set_subarray_conv: "(∀j. j ∈ set (subarray l r a h) --> P j) = (∀k. l ≤ k ∧ k < r ∧ k < Heap.length a h --> P (get_array a h ! k))" unfolding subarray_def Heap.length_def by (rule all_in_set_sublist'_conv) lemma ball_in_set_subarray_conv: "(∀j ∈ set (subarray l r a h). P j) = (∀k. l ≤ k ∧ k < r ∧ k < Heap.length a h --> P (get_array a h ! k))" unfolding subarray_def Heap.length_def by (rule ball_in_set_sublist'_conv) end