subsection \<open>Defining the size of values\<close>
hide_const size
class size = fixes size :: "'a => nat"
instantiation int :: size begin
definition size_int :: "int => nat" where "size_int n = nat (abs n)"
instance ..
end
instantiation natural :: size begin
definition size_natural :: "natural => nat" where "size_natural = nat_of_natural"
instance ..
end
instantiation nat :: size begin
definition size_nat :: "nat => nat" where "size_nat n = n"
instance ..
end
instantiation list :: (size) size begin
primrec size_list :: "'a list => nat" where "size [] = 1"
| "size (x # xs) = max (size x) (size xs) + 1"
instance ..
end
subsection \<open>Completeness\<close>
class complete = exhaustive + size + assumes
complete: "(\ v. size v \ n \ is_some (f v)) \ is_some (exhaustive_class.exhaustive f (natural_of_nat n))"
lemma complete_imp1: "size (v :: 'a :: complete) \ n \ is_some (f v) \ is_some (exhaustive_class.exhaustive f (natural_of_nat n))" by (metis complete)
lemma complete_imp2: assumes"is_some (exhaustive_class.exhaustive f (natural_of_nat n))" obtains v where"size (v :: 'a :: complete) \ n" "is_some (f v)" using assms by (metis complete)
subsubsection \<open>Instance Proofs\<close>
declare exhaustive_int'.simps [simp del]
lemma complete_exhaustive': "(\ i. j <= i & i <= k & is_some (f i)) \ is_some (Quickcheck_Exhaustive.exhaustive_int' f k j)" proof (induct rule: Quickcheck_Exhaustive.exhaustive_int'.induct[of _ f k j]) case (1 f d i) show ?case proof (cases "f i") case None from this 1 show ?thesis unfolding exhaustive_int'.simps[of _ _ i] Quickcheck_Exhaustive.orelse_def apply (auto simp add: add1_zle_eq dest: less_imp_le) apply auto done next case Some from this show ?thesis unfolding exhaustive_int'.simps[of _ _ i] Quickcheck_Exhaustive.orelse_def by auto qed qed
instance int :: complete proof fix n f show"(\v. size (v :: int) \ n \ is_some (f v)) = is_some (exhaustive_class.exhaustive f (natural_of_nat n))" unfolding exhaustive_int_def complete_exhaustive'[symmetric] apply auto apply (rule_tac x="v"in exI) unfolding size_int_def by (metis abs_le_iff minus_le_iff nat_le_iff)+ qed
declare exhaustive_natural'.simps[simp del]
lemma complete_natural': "(\n. j \ n \ n \ k \ is_some (f n)) =
is_some (Quickcheck_Exhaustive.exhaustive_natural' f k j)" proof (induct rule: exhaustive_natural'.induct[of _ f k j]) case (1 f k j) show"(\n\j. n \ k \ is_some (f n)) = is_some (Quickcheck_Exhaustive.exhaustive_natural' f k j)" unfolding exhaustive_natural'.simps [of f k j] Quickcheck_Exhaustive.orelse_def apply (auto split: option.split) apply (auto simp add: less_eq_natural_def less_natural_def 1 [symmetric] dest: Suc_leD) apply (metis is_some.simps(2) natural_eqI not_less_eq_eq order_antisym) done qed
instance natural :: complete proof fix n f show"(\v. size (v :: natural) \ n \ is_some (f v)) \ is_some (exhaustive_class.exhaustive f (natural_of_nat n))" unfolding exhaustive_natural_def complete_natural' [symmetric] by (auto simp add: size_natural_def less_eq_natural_def) qed
instance nat :: complete proof fix n f show"(\v. size (v :: nat) \ n \ is_some (f v)) \ is_some (exhaustive_class.exhaustive f (natural_of_nat n))" unfolding exhaustive_nat_def complete[of n "%x. f (nat_of_natural x)", symmetric] apply auto apply (rule_tac x="natural_of_nat v"in exI) apply (auto simp add: size_natural_def size_nat_def) done qed
instance list :: (complete) complete proof fix n f show"(\ v. size (v :: 'a list) \ n \ is_some (f (v :: 'a list))) \ is_some (exhaustive_class.exhaustive f (natural_of_nat n))" proof (induct n arbitrary: f) case 0
{ fix v have"size (v :: 'a list) > 0"by (induct v) auto } from this show ?caseby (simp add: list.exhaustive_list.simps) next case (Suc n) show ?case proof assume"\v. Completeness.size_class.size v \ Suc n \ is_some (f v)" thenobtain v where v: "size v \ Suc n" "is_some (f v)" by blast show"is_some (exhaustive_class.exhaustive f (natural_of_nat (Suc n)))" proof (cases "v") case Nil from this v show ?thesis unfolding list.exhaustive_list.simps[of _ "natural_of_nat (Suc n)"] Quickcheck_Exhaustive.orelse_def by (auto split: option.split simp add: less_natural_def) next case (Cons v' vs') from Cons v have size_v': "Completeness.size_class.size v'\<le> n" and"Completeness.size_class.size vs' \ n" by auto from Suc v Cons this have"is_some (exhaustive_class.exhaustive (\xs. f (v' # xs)) (natural_of_nat n))" by metis from complete_imp1[OF size_v', of "%x. (exhaustive_class.exhaustive (\xs. f (x # xs)) (natural_of_nat n))", OF this] show ?thesis unfolding list.exhaustive_list.simps[of _ "natural_of_nat (Suc n)"] Quickcheck_Exhaustive.orelse_def by (auto split: option.split simp add: less_natural_def) qed next assume is_some: "is_some (exhaustive_class.exhaustive f (natural_of_nat (Suc n)))" show"\v. size v \ Suc n \ is_some (f v)" proof (cases "f []") case Some thenshow ?thesis by (metis Suc_eq_plus1 is_some.simps(1) le_add2 size_list.simps(1)) next case None with is_some have "is_some (exhaustive_class.exhaustive (\x. exhaustive_class.exhaustive (\xs. f (x # xs)) (natural_of_nat n)) (natural_of_nat n))" unfolding list.exhaustive_list.simps[of _ "natural_of_nat (Suc n)"] Quickcheck_Exhaustive.orelse_def by (simp add: less_natural_def) thenobtain v' where
v: "size v' \ n" "is_some (exhaustive_class.exhaustive (\xs. f (v' # xs)) (natural_of_nat n))" by (rule complete_imp2) with Suc[of "%xs. f (v' # xs)"] obtain vs' where vs': "size vs' \ n" "is_some (f (v' # vs'))" by metis with v have"size (v' # vs') \ Suc n" by auto with vs' v show ?thesis by metis qed qed qed qed
end
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.