src/HOL/SPARK/Examples/Liseq/Longest_Increasing_Subsequence.thy
changeset 72302 d7d90ed4c74e
parent 69605 a96320074298
equal deleted inserted replaced
72301:c5d1a01d2d6c 72302:d7d90ed4c74e
   233       proof (rule liseq'_expand)
   233       proof (rule liseq'_expand)
   234         fix "is"
   234         fix "is"
   235         assume H: "liseq' xs j = card is" "is \<in> iseq xs (Suc j)"
   235         assume H: "liseq' xs j = card is" "is \<in> iseq xs (Suc j)"
   236           "finite is" "Max is = j" "is \<noteq> {}"
   236           "finite is" "Max is = j" "is \<noteq> {}"
   237         from H j have "card is + 1 = card (is \<union> {i})"
   237         from H j have "card is + 1 = card (is \<union> {i})"
   238           by (simp add: card_insert max_notin)
   238           by (simp add: card.insert_remove max_notin)
   239         moreover {
   239         moreover {
   240           from H j have "xs (Max is) \<le> xs i" by simp
   240           from H j have "xs (Max is) \<le> xs i" by simp
   241           moreover from \<open>j < i\<close> have "Suc j \<le> i" by simp
   241           moreover from \<open>j < i\<close> have "Suc j \<le> i" by simp
   242           with \<open>is \<in> iseq xs (Suc j)\<close> have "is \<in> iseq xs i"
   242           with \<open>is \<in> iseq xs (Suc j)\<close> have "is \<in> iseq xs i"
   243             by (rule iseq_mono)
   243             by (rule iseq_mono)
   365   apply (rule_tac xs=xs and i=j in liseq_expand)
   365   apply (rule_tac xs=xs and i=j in liseq_expand)
   366   apply simp
   366   apply simp
   367   apply (rule_tac xs=xs and i=i in liseq'_expand)
   367   apply (rule_tac xs=xs and i=i in liseq'_expand)
   368   apply simp
   368   apply simp
   369   apply (rule_tac js="isa \<union> {j}" in liseq_eq [symmetric])
   369   apply (rule_tac js="isa \<union> {j}" in liseq_eq [symmetric])
   370   apply (simp add: card_insert card_Diff_singleton_if max_notin)
   370   apply (simp add: card.insert_remove card_Diff_singleton_if max_notin)
   371   apply (rule iseq_insert)
   371   apply (rule iseq_insert)
   372   apply simp
   372   apply simp
   373   apply (erule iseq_mono)
   373   apply (erule iseq_mono)
   374   apply simp
   374   apply simp
   375   apply (case_tac "j = Max js'")
   375   apply (case_tac "j = Max js'")
   386   apply (simp add: less_eq_Suc_le [symmetric])
   386   apply (simp add: less_eq_Suc_le [symmetric])
   387   apply (rule Max_diff)
   387   apply (rule Max_diff)
   388   apply simp
   388   apply simp
   389   apply (rule le_diff_iff [THEN iffD1, of 1])
   389   apply (rule le_diff_iff [THEN iffD1, of 1])
   390   apply (simp add: card_0_eq [symmetric] del: card_0_eq)
   390   apply (simp add: card_0_eq [symmetric] del: card_0_eq)
   391   apply (simp add: card_insert)
   391   apply (simp add: card.insert_remove)
   392   apply (subgoal_tac "card (js' - {j}) = card js' - 1")
   392   apply (subgoal_tac "card (js' - {j}) = card js' - 1")
   393   apply (simp add: card_insert card_Diff_singleton_if max_notin)
   393   apply (simp add: card.insert_remove card_Diff_singleton_if max_notin)
   394   apply (frule_tac A=js' in Max_in)
   394   apply (frule_tac A=js' in Max_in)
   395   apply assumption
   395   apply assumption
   396   apply (simp add: card_Diff_singleton_if)
   396   apply (simp add: card_Diff_singleton_if)
   397   apply (drule_tac js=js' in iseq_butlast)
   397   apply (drule_tac js=js' in iseq_butlast)
   398   apply assumption
   398   apply assumption
   409   apply (rule_tac xs=xs and i=j in liseq_expand)
   409   apply (rule_tac xs=xs and i=j in liseq_expand)
   410   apply simp
   410   apply simp
   411   apply (rule_tac xs=xs and i=i in liseq'_expand)
   411   apply (rule_tac xs=xs and i=i in liseq'_expand)
   412   apply simp
   412   apply simp
   413   apply (rule_tac js="isa \<union> {j}" in liseq'_eq [symmetric])
   413   apply (rule_tac js="isa \<union> {j}" in liseq'_eq [symmetric])
   414   apply (simp add: card_insert card_Diff_singleton_if max_notin)
   414   apply (simp add: card.insert_remove card_Diff_singleton_if max_notin)
   415   apply (rule iseq_insert)
   415   apply (rule iseq_insert)
   416   apply simp
   416   apply simp
   417   apply (erule iseq_mono)
   417   apply (erule iseq_mono)
   418   apply simp
   418   apply simp
   419   apply simp
   419   apply simp
   432   apply (simp add: less_eq_Suc_le [symmetric])
   432   apply (simp add: less_eq_Suc_le [symmetric])
   433   apply (rule Max_diff)
   433   apply (rule Max_diff)
   434   apply simp
   434   apply simp
   435   apply (rule le_diff_iff [THEN iffD1, of 1])
   435   apply (rule le_diff_iff [THEN iffD1, of 1])
   436   apply (simp add: card_0_eq [symmetric] del: card_0_eq)
   436   apply (simp add: card_0_eq [symmetric] del: card_0_eq)
   437   apply (simp add: card_insert)
   437   apply (simp add: card.insert_remove)
   438   apply (subgoal_tac "card (js' - {j}) = card js' - 1")
   438   apply (subgoal_tac "card (js' - {j}) = card js' - 1")
   439   apply (simp add: card_insert card_Diff_singleton_if max_notin)
   439   apply (simp add: card.insert_remove card_Diff_singleton_if max_notin)
   440   apply (frule_tac A=js' in Max_in)
   440   apply (frule_tac A=js' in Max_in)
   441   apply assumption
   441   apply assumption
   442   apply (simp add: card_Diff_singleton_if)
   442   apply (simp add: card_Diff_singleton_if)
   443   done
   443   done
   444 
   444