# HG changeset patch # User bulwahn # Date 1269876634 -7200 # Node ID 7516568bebeb4260b8c35796a4273a3fb9f60767 # Parent a5e7574d8214aa92308551134de90d2f2a9fd1ec adding new depth-limited and new random monad for the predicate compiler diff -r a5e7574d8214 -r 7516568bebeb src/HOL/New_DSequence.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/New_DSequence.thy Mon Mar 29 17:30:34 2010 +0200 @@ -0,0 +1,95 @@ + +(* Author: Lukas Bulwahn, TU Muenchen *) + +header {* Depth-Limited Sequences with failure element *} + +theory New_DSequence +imports Random_Sequence +begin + +section {* Positive Depth-Limited Sequence *} + +types 'a pos_dseq = "code_numeral => 'a Lazy_Sequence.lazy_sequence" + +definition pos_empty :: "'a pos_dseq" +where + "pos_empty = (%i. Lazy_Sequence.empty)" + +definition pos_single :: "'a => 'a pos_dseq" +where + "pos_single x = (%i. Lazy_Sequence.single x)" + +definition pos_bind :: "'a pos_dseq => ('a => 'b pos_dseq) => 'b pos_dseq" +where + "pos_bind x f = (%i. + if i = 0 then + Lazy_Sequence.empty + else + Lazy_Sequence.bind (x (i - 1)) (%a. f a i))" + +definition pos_union :: "'a pos_dseq => 'a pos_dseq => 'a pos_dseq" +where + "pos_union xq yq = (%i. Lazy_Sequence.append (xq i) (yq i))" + +definition pos_if_seq :: "bool => unit pos_dseq" +where + "pos_if_seq b = (if b then pos_single () else pos_empty)" + +definition pos_map :: "('a => 'b) => 'a pos_dseq => 'b pos_dseq" +where + "pos_map f xq = (%i. Lazy_Sequence.map f (xq i))" + +section {* Negative Depth-Limited Sequence *} + +types 'a neg_dseq = "code_numeral => 'a Lazy_Sequence.hit_bound_lazy_sequence" + +definition neg_empty :: "'a neg_dseq" +where + "neg_empty = (%i. Lazy_Sequence.empty)" + +definition neg_single :: "'a => 'a neg_dseq" +where + "neg_single x = (%i. Lazy_Sequence.hb_single x)" + +definition neg_bind :: "'a neg_dseq => ('a => 'b neg_dseq) => 'b neg_dseq" +where + "neg_bind x f = (%i. + if i = 0 then + Lazy_Sequence.hit_bound + else + hb_bind (x (i - 1)) (%a. f a i))" + +definition neg_union :: "'a neg_dseq => 'a neg_dseq => 'a neg_dseq" +where + "neg_union x y = (%i. Lazy_Sequence.append (x i) (y i))" + +definition neg_if_seq :: "bool => unit neg_dseq" +where + "neg_if_seq b = (if b then neg_single () else neg_empty)" + +definition neg_map :: "('a => 'b) => 'a neg_dseq => 'b neg_dseq" +where + "neg_map f xq = (%i. Lazy_Sequence.hb_map f (xq i))" + +section {* Negation *} + +definition pos_not_seq :: "unit neg_dseq => unit pos_dseq" +where + "pos_not_seq xq = (%i. Lazy_Sequence.hb_not_seq (xq i))" + +definition neg_not_seq :: "unit pos_dseq => unit neg_dseq" +where + "neg_not_seq x = (%i. case Lazy_Sequence.yield (x i) of + None => Lazy_Sequence.hb_single () + | Some ((), xq) => Lazy_Sequence.empty)" + +hide (open) type pos_dseq neg_dseq + +hide (open) const + pos_empty pos_single pos_bind pos_union pos_if_seq pos_not_seq + neg_empty neg_single neg_bind neg_union neg_if_seq neg_not_seq +hide (open) fact + pos_empty_def pos_single_def pos_bind_def pos_union_def pos_if_seq_def pos_not_seq_def pos_map_def + neg_empty_def neg_single_def neg_bind_def neg_union_def neg_if_seq_def neg_not_seq_def neg_map_def + +end diff -r a5e7574d8214 -r 7516568bebeb src/HOL/New_Random_Sequence.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/New_Random_Sequence.thy Mon Mar 29 17:30:34 2010 +0200 @@ -0,0 +1,97 @@ + +(* Author: Lukas Bulwahn, TU Muenchen *) + +theory New_Random_Sequence +imports Quickcheck New_DSequence +begin + +types 'a pos_random_dseq = "code_numeral \ code_numeral \ Random.seed \ 'a New_DSequence.pos_dseq" +types 'a neg_random_dseq = "code_numeral \ code_numeral \ Random.seed \ 'a New_DSequence.neg_dseq" + +definition pos_empty :: "'a pos_random_dseq" +where + "pos_empty = (%nrandom size seed. New_DSequence.pos_empty)" + +definition pos_single :: "'a => 'a pos_random_dseq" +where + "pos_single x = (%nrandom size seed. New_DSequence.pos_single x)" + +definition pos_bind :: "'a pos_random_dseq => ('a \ 'b pos_random_dseq) \ 'b pos_random_dseq" +where + "pos_bind R f = (\nrandom size seed. New_DSequence.pos_bind (R nrandom size seed) (%a. f a nrandom size seed))" + +definition pos_union :: "'a pos_random_dseq => 'a pos_random_dseq => 'a pos_random_dseq" +where + "pos_union R1 R2 = (\nrandom size seed. New_DSequence.pos_union (R1 nrandom size seed) (R2 nrandom size seed))" + +definition pos_if_random_dseq :: "bool => unit pos_random_dseq" +where + "pos_if_random_dseq b = (if b then pos_single () else pos_empty)" + +definition pos_not_random_dseq :: "unit neg_random_dseq => unit pos_random_dseq" +where + "pos_not_random_dseq R = (\nrandom size seed. New_DSequence.pos_not_seq (R nrandom size seed))" + +fun iter :: "(code_numeral * code_numeral => ('a * (unit => term)) * code_numeral * code_numeral) => code_numeral => code_numeral * code_numeral => 'a Lazy_Sequence.lazy_sequence" +where + "iter random nrandom seed = + (if nrandom = 0 then Lazy_Sequence.empty else Lazy_Sequence.Lazy_Sequence (%u. let ((x, _), seed') = random seed in Some (x, iter random (nrandom - 1) seed')))" + +definition Random :: "(code_numeral \ Random.seed \ (('a \ (unit \ term)) \ Random.seed)) \ 'a pos_random_dseq" +where + "Random g = (%nrandom size seed depth. iter (g size) nrandom seed)" + +definition pos_map :: "('a => 'b) => 'a pos_random_dseq => 'b pos_random_dseq" +where + "pos_map f P = pos_bind P (pos_single o f)" + + +definition neg_empty :: "'a neg_random_dseq" +where + "neg_empty = (%nrandom size seed. New_DSequence.neg_empty)" + +definition neg_single :: "'a => 'a neg_random_dseq" +where + "neg_single x = (%nrandom size seed. New_DSequence.neg_single x)" + +definition neg_bind :: "'a neg_random_dseq => ('a \ 'b neg_random_dseq) \ 'b neg_random_dseq" +where + "neg_bind R f = (\nrandom size seed. New_DSequence.neg_bind (R nrandom size seed) (%a. f a nrandom size seed))" + +definition neg_union :: "'a neg_random_dseq => 'a neg_random_dseq => 'a neg_random_dseq" +where + "neg_union R1 R2 = (\nrandom size seed. New_DSequence.neg_union (R1 nrandom size seed) (R2 nrandom size seed))" + +definition neg_if_random_dseq :: "bool => unit neg_random_dseq" +where + "neg_if_random_dseq b = (if b then neg_single () else neg_empty)" + +definition neg_not_random_dseq :: "unit pos_random_dseq => unit neg_random_dseq" +where + "neg_not_random_dseq R = (\nrandom size seed. New_DSequence.neg_not_seq (R nrandom size seed))" +(* +fun iter :: "(code_numeral * code_numeral => ('a * (unit => term)) * code_numeral * code_numeral) => code_numeral => code_numeral * code_numeral => 'a Lazy_Sequence.lazy_sequence" +where + "iter random nrandom seed = + (if nrandom = 0 then Lazy_Sequence.empty else Lazy_Sequence.Lazy_Sequence (%u. let ((x, _), seed') = random seed in Some (x, iter random (nrandom - 1) seed')))" + +definition Random :: "(code_numeral \ Random.seed \ (('a \ (unit \ term)) \ Random.seed)) \ 'a pos_random_dseq" +where + "Random g = (%nrandom size seed depth. iter (g size) nrandom seed)" +*) +definition neg_map :: "('a => 'b) => 'a neg_random_dseq => 'b neg_random_dseq" +where + "neg_map f P = neg_bind P (neg_single o f)" +(* +hide const DSequence.empty DSequence.single DSequence.eval + DSequence.map_seq DSequence.bind DSequence.union DSequence.if_seq DSequence.not_seq + DSequence.map +*) + +hide (open) const pos_empty pos_single pos_bind pos_union pos_if_random_dseq pos_not_random_dseq iter Random pos_map + neg_empty neg_single neg_bind neg_union neg_if_random_dseq neg_not_random_dseq neg_map +hide type New_DSequence.pos_dseq New_DSequence.neg_dseq pos_random_dseq neg_random_dseq +(* FIXME: hide facts *) +(*hide (open) fact empty_def single_def bind_def union_def if_random_dseq_def not_random_dseq_def Random.simps map_def*) + +end \ No newline at end of file