35 shows "get_array a h' ! k = (if k = i then get_array a h ! j |
35 shows "get_array a h' ! k = (if k = i then get_array a h ! j |
36 else if k = j then get_array a h ! i |
36 else if k = j then get_array a h ! i |
37 else get_array a h ! k)" |
37 else get_array a h ! k)" |
38 using assms unfolding swap.simps |
38 using assms unfolding swap.simps |
39 by (elim crel_elim_all) |
39 by (elim crel_elim_all) |
40 (auto simp: Heap.length_def) |
40 (auto simp: length_def) |
41 |
41 |
42 lemma rev_pointwise: assumes "crel (rev a i j) h h' r" |
42 lemma rev_pointwise: assumes "crel (rev a i j) h h' r" |
43 shows "get_array a h' ! k = (if k < i then get_array a h ! k |
43 shows "get_array a h' ! k = (if k < i then get_array a h ! k |
44 else if j < k then get_array a h ! k |
44 else if j < k then get_array a h ! k |
45 else get_array a h ! (j - (k - i)))" (is "?P a i j h h'") |
45 else get_array a h ! (j - (k - i)))" (is "?P a i j h h'") |
91 by (auto elim: crel_elim_all) |
91 by (auto elim: crel_elim_all) |
92 qed |
92 qed |
93 qed |
93 qed |
94 |
94 |
95 lemma rev2_rev': assumes "crel (rev a i j) h h' u" |
95 lemma rev2_rev': assumes "crel (rev a i j) h h' u" |
96 assumes "j < Heap.length a h" |
96 assumes "j < Array.length a h" |
97 shows "subarray i (j + 1) a h' = List.rev (subarray i (j + 1) a h)" |
97 shows "subarray i (j + 1) a h' = List.rev (subarray i (j + 1) a h)" |
98 proof - |
98 proof - |
99 { |
99 { |
100 fix k |
100 fix k |
101 assume "k < Suc j - i" |
101 assume "k < Suc j - i" |
102 with rev_pointwise[OF assms(1)] have "get_array a h' ! (i + k) = get_array a h ! (j - k)" |
102 with rev_pointwise[OF assms(1)] have "get_array a h' ! (i + k) = get_array a h ! (j - k)" |
103 by auto |
103 by auto |
104 } |
104 } |
105 with assms(2) rev_length[OF assms(1)] show ?thesis |
105 with assms(2) rev_length[OF assms(1)] show ?thesis |
106 unfolding subarray_def Heap.length_def |
106 unfolding subarray_def Array.length_def |
107 by (auto simp add: length_sublist' rev_nth min_def nth_sublist' intro!: nth_equalityI) |
107 by (auto simp add: length_sublist' rev_nth min_def nth_sublist' intro!: nth_equalityI) |
108 qed |
108 qed |
109 |
109 |
110 lemma rev2_rev: |
110 lemma rev2_rev: |
111 assumes "crel (rev a 0 (Heap.length a h - 1)) h h' u" |
111 assumes "crel (rev a 0 (Array.length a h - 1)) h h' u" |
112 shows "get_array a h' = List.rev (get_array a h)" |
112 shows "get_array a h' = List.rev (get_array a h)" |
113 using rev2_rev'[OF assms] rev_length[OF assms] assms |
113 using rev2_rev'[OF assms] rev_length[OF assms] assms |
114 by (cases "Heap.length a h = 0", auto simp add: Heap.length_def |
114 by (cases "Array.length a h = 0", auto simp add: Array.length_def |
115 subarray_def sublist'_all rev.simps[where j=0] elim!: crel_elim_all) |
115 subarray_def sublist'_all rev.simps[where j=0] elim!: crel_elim_all) |
116 (drule sym[of "List.length (get_array a h)"], simp) |
116 (drule sym[of "List.length (get_array a h)"], simp) |
117 |
117 |
118 end |
118 end |