src/HOL/Imperative_HOL/ex/Imperative_Reverse.thy
changeset 37719 271ecd4fb9f9
parent 36176 3fe7e97ccca8
child 37771 1bec64044b5e
equal deleted inserted replaced
37718:3046ebbb43c0 37719:271ecd4fb9f9
    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'")
    67   qed
    67   qed
    68 qed
    68 qed
    69 
    69 
    70 lemma rev_length:
    70 lemma rev_length:
    71   assumes "crel (rev a i j) h h' r"
    71   assumes "crel (rev a i j) h h' r"
    72   shows "Heap.length a h = Heap.length a h'"
    72   shows "Array.length a h = Array.length a h'"
    73 using assms
    73 using assms
    74 proof (induct a i j arbitrary: h h' rule: rev.induct)
    74 proof (induct a i j arbitrary: h h' rule: rev.induct)
    75   case (1 a i j h h'')
    75   case (1 a i j h h'')
    76   thus ?case
    76   thus ?case
    77   proof (cases "i < j")
    77   proof (cases "i < j")
    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