# HG changeset patch # User haftmann # Date 1242398356 -7200 # Node ID dae7be64d61476f88ab565ae57501031be91e127 # Parent ced8171602837304b205a20e12857efe0bb42841 hide names in theory Random diff -r ced817160283 -r dae7be64d614 src/HOL/Extraction/Higman.thy --- a/src/HOL/Extraction/Higman.thy Fri May 15 16:39:16 2009 +0200 +++ b/src/HOL/Extraction/Higman.thy Fri May 15 16:39:16 2009 +0200 @@ -349,9 +349,9 @@ end -function mk_word_aux :: "nat \ seed \ letter list \ seed" where +function mk_word_aux :: "nat \ Random.seed \ letter list \ Random.seed" where "mk_word_aux k = (do - i \ range 10; + i \ Random.range 10; (if i > 7 \ k > 2 \ k > 1000 then return [] else do let l = (if i mod 2 = 0 then A else B); @@ -362,10 +362,10 @@ by pat_completeness auto termination by (relation "measure ((op -) 1001)") auto -definition mk_word :: "seed \ letter list \ seed" where +definition mk_word :: "Random.seed \ letter list \ Random.seed" where "mk_word = mk_word_aux 0" -primrec mk_word_s :: "nat \ seed \ letter list \ seed" where +primrec mk_word_s :: "nat \ Random.seed \ letter list \ Random.seed" where "mk_word_s 0 = mk_word" | "mk_word_s (Suc n) = (do _ \ mk_word; diff -r ced817160283 -r dae7be64d614 src/HOL/Library/Random.thy --- a/src/HOL/Library/Random.thy Fri May 15 16:39:16 2009 +0200 +++ b/src/HOL/Library/Random.thy Fri May 15 16:39:16 2009 +0200 @@ -87,6 +87,32 @@ by (simp add: scomp_apply split_beta select_def) qed +primrec pick :: "(index \ 'a) list \ index \ 'a" where + "pick (x # xs) i = (if i < fst x then snd x else pick xs (i - fst x))" + +lemma pick_member: + "i < listsum (map fst xs) \ pick xs i \ set (map snd xs)" + by (induct xs arbitrary: i) simp_all + +lemma pick_drop_zero: + "pick (filter (\(k, _). k > 0) xs) = pick xs" + by (induct xs) (auto simp add: expand_fun_eq) + +definition select_weight :: "(index \ 'a) list \ seed \ 'a \ seed" where + "select_weight xs = range (listsum (map fst xs)) + o\ (\k. Pair (pick xs k))" + +lemma select_weight_member: + assumes "0 < listsum (map fst xs)" + shows "fst (select_weight xs s) \ set (map snd xs)" +proof - + from range assms + have "fst (range (listsum (map fst xs)) s) < listsum (map fst xs)" . + with pick_member + have "pick xs (fst (range (listsum (map fst xs)) s)) \ set (map snd xs)" . + then show ?thesis by (simp add: select_weight_def scomp_def split_def) +qed + definition select_default :: "index \ 'a \ 'a \ seed \ 'a \ seed" where [code del]: "select_default k x y = range k o\ (\l. Pair (if l + 1 < k then x else y))" @@ -140,6 +166,10 @@ end; *} +hide (open) type seed +hide (open) const inc_shift minus_shift log "next" seed_invariant split_seed + iterate range select pick select_weight select_default + no_notation fcomp (infixl "o>" 60) no_notation scomp (infixl "o\" 60)