diff -r 143f58bb34f9 -r 0909deb8059b src/HOL/SPARK/Examples/Liseq/Longest_Increasing_Subsequence.thy --- a/src/HOL/SPARK/Examples/Liseq/Longest_Increasing_Subsequence.thy Thu May 26 16:57:14 2016 +0200 +++ b/src/HOL/SPARK/Examples/Liseq/Longest_Increasing_Subsequence.thy Thu May 26 17:51:22 2016 +0200 @@ -7,24 +7,24 @@ imports "../../SPARK" begin -text {* +text \ Set of all increasing subsequences in a prefix of an array -*} +\ definition iseq :: "(nat \ 'a::linorder) \ nat \ nat set set" where "iseq xs l = {is. (\i\is. i < l) \ (\i\is. \j\is. i \ j \ xs i \ xs j)}" -text {* +text \ Length of longest increasing subsequence in a prefix of an array -*} +\ definition liseq :: "(nat \ 'a::linorder) \ nat \ nat" where "liseq xs i = Max (card ` iseq xs i)" -text {* +text \ Length of longest increasing subsequence ending at a particular position -*} +\ definition liseq' :: "(nat \ 'a::linorder) \ nat \ nat" where "liseq' xs i = Max (card ` (iseq xs (Suc i) \ {is. Max is = i}))" @@ -238,8 +238,8 @@ by (simp add: card_insert max_notin) moreover { from H j have "xs (Max is) \ xs i" by simp - moreover from `j < i` have "Suc j \ i" by simp - with `is \ iseq xs (Suc j)` have "is \ iseq xs i" + moreover from \j < i\ have "Suc j \ i" by simp + with \is \ iseq xs (Suc j)\ have "is \ iseq xs i" by (rule iseq_mono) ultimately have "is \ {i} \ iseq xs (Suc i)" by (rule iseq_insert) @@ -269,52 +269,52 @@ then have "1 < card is" by simp then have "Max (is - {Max is}) < Max is" by (rule Max_diff) - from `is \ iseq xs (Suc i)` `1 < card is` + from \is \ iseq xs (Suc i)\ \1 < card is\ have "xs (Max (is - {Max is})) \ xs (Max is)" by (rule iseq_nth) have "card is - 1 = liseq' xs (Max (is - {i}))" proof (rule liseq'_eq) - from `Max is = i` [symmetric] `finite is` `is \ {}` + from \Max is = i\ [symmetric] \finite is\ \is \ {}\ show "card is - 1 = card (is - {i})" by simp next - from `is \ iseq xs (Suc i)` `Max is = i` [symmetric] + from \is \ iseq xs (Suc i)\ \Max is = i\ [symmetric] show "is - {i} \ iseq xs (Suc (Max (is - {i})))" by simp (rule iseq_diff) next - from `1 < card is` + from \1 < card is\ show "is - {i} \ {}" by (rule diff_nonempty) next fix js assume "js \ iseq xs (Suc (Max (is - {i})))" "Max js = Max (is - {i})" "finite js" "js \ {}" - from `xs (Max (is - {Max is})) \ xs (Max is)` - `Max js = Max (is - {i})` `Max is = i` + from \xs (Max (is - {Max is})) \ xs (Max is)\ + \Max js = Max (is - {i})\ \Max is = i\ have "xs (Max js) \ xs i" by simp - moreover from `Max is = i` `Max (is - {Max is}) < Max is` + moreover from \Max is = i\ \Max (is - {Max is}) < Max is\ have "Suc (Max (is - {i})) \ i" by simp - with `js \ iseq xs (Suc (Max (is - {i})))` + with \js \ iseq xs (Suc (Max (is - {i})))\ have "js \ iseq xs i" by (rule iseq_mono) ultimately have "js \ {i} \ iseq xs (Suc i)" by (rule iseq_insert) - moreover from `js \ {}` `finite js` `Max js = Max (is - {i})` - `Max is = i` [symmetric] `Max (is - {Max is}) < Max is` + moreover from \js \ {}\ \finite js\ \Max js = Max (is - {i})\ + \Max is = i\ [symmetric] \Max (is - {Max is}) < Max is\ have "Max (js \ {i}) = i" by simp ultimately have "card (js \ {i}) \ card is" by (rule R) - moreover from `Max is = i` [symmetric] `finite js` - `Max (is - {Max is}) < Max is` `Max js = Max (is - {i})` + moreover from \Max is = i\ [symmetric] \finite js\ + \Max (is - {Max is}) < Max is\ \Max js = Max (is - {i})\ have "i \ js" by (simp add: max_notin) - with `finite js` + with \finite js\ have "card (js \ {i}) = card ((js \ {i}) - {i}) + 1" by simp ultimately show "card js \ card (is - {i})" - using `i \ js` `Max is = i` [symmetric] `is \ {}` `finite is` + using \i \ js\ \Max is = i\ [symmetric] \is \ {}\ \finite is\ by simp qed simp - with H `Max (is - {Max is}) < Max is` - `xs (Max (is - {Max is})) \ xs (Max is)` + with H \Max (is - {Max is}) < Max is\ + \xs (Max (is - {Max is})) \ xs (Max is)\ show ?thesis by auto qed qed @@ -515,7 +515,7 @@ done -text {* Proof functions *} +text \Proof functions\ abbreviation (input) "arr_conv a \ (\n. a (int n))" @@ -539,7 +539,7 @@ max_ext = "max_ext' :: (int \ int) \ int \ int \ int" -text {* The verification conditions *} +text \The verification conditions\ spark_open "liseq/liseq_length"