| author | paulson <lp15@cam.ac.uk> | 
| Tue, 10 May 2016 11:56:23 +0100 | |
| changeset 63077 | 844725394a37 | 
| parent 62390 | 842917225d56 | 
| child 63432 | ba7901e94e7b | 
| permissions | -rw-r--r-- | 
| 33265 | 1 | (* Title: HOL/Predicate_Compile.thy | 
| 2 | Author: Stefan Berghofer, Lukas Bulwahn, Florian Haftmann, TU Muenchen | |
| 3 | *) | |
| 33250 
5c2af18a3237
including the predicate compiler in HOL-Main; added RandomPredicate monad to Quickcheck
 bulwahn parents: diff
changeset | 4 | |
| 60758 | 5 | section \<open>A compiler for predicates defined by introduction rules\<close> | 
| 33250 
5c2af18a3237
including the predicate compiler in HOL-Main; added RandomPredicate monad to Quickcheck
 bulwahn parents: diff
changeset | 6 | |
| 
5c2af18a3237
including the predicate compiler in HOL-Main; added RandomPredicate monad to Quickcheck
 bulwahn parents: diff
changeset | 7 | theory Predicate_Compile | 
| 51126 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 haftmann parents: 
50055diff
changeset | 8 | imports Random_Sequence Quickcheck_Exhaustive | 
| 46950 
d0181abdbdac
declare command keywords via theory header, including strict checking outside Pure;
 wenzelm parents: 
46664diff
changeset | 9 | keywords "code_pred" :: thy_goal and "values" :: diag | 
| 33250 
5c2af18a3237
including the predicate compiler in HOL-Main; added RandomPredicate monad to Quickcheck
 bulwahn parents: diff
changeset | 10 | begin | 
| 
5c2af18a3237
including the predicate compiler in HOL-Main; added RandomPredicate monad to Quickcheck
 bulwahn parents: diff
changeset | 11 | |
| 48891 | 12 | ML_file "Tools/Predicate_Compile/predicate_compile_aux.ML" | 
| 13 | ML_file "Tools/Predicate_Compile/predicate_compile_compilations.ML" | |
| 14 | ML_file "Tools/Predicate_Compile/core_data.ML" | |
| 15 | ML_file "Tools/Predicate_Compile/mode_inference.ML" | |
| 16 | ML_file "Tools/Predicate_Compile/predicate_compile_proof.ML" | |
| 17 | ML_file "Tools/Predicate_Compile/predicate_compile_core.ML" | |
| 18 | ML_file "Tools/Predicate_Compile/predicate_compile_data.ML" | |
| 19 | ML_file "Tools/Predicate_Compile/predicate_compile_fun.ML" | |
| 20 | ML_file "Tools/Predicate_Compile/predicate_compile_pred.ML" | |
| 21 | ML_file "Tools/Predicate_Compile/predicate_compile_specialisation.ML" | |
| 22 | ML_file "Tools/Predicate_Compile/predicate_compile.ML" | |
| 23 | ||
| 33250 
5c2af18a3237
including the predicate compiler in HOL-Main; added RandomPredicate monad to Quickcheck
 bulwahn parents: diff
changeset | 24 | |
| 60758 | 25 | subsection \<open>Set membership as a generator predicate\<close> | 
| 52023 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 26 | |
| 60758 | 27 | text \<open> | 
| 52023 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 28 | Introduce a new constant for membership to allow | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 29 | fine-grained control in code equations. | 
| 60758 | 30 | \<close> | 
| 52023 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 31 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 32 | definition contains :: "'a set => 'a => bool" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 33 | where "contains A x \<longleftrightarrow> x : A" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 34 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 35 | definition contains_pred :: "'a set => 'a => unit Predicate.pred" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 36 | where "contains_pred A x = (if x : A then Predicate.single () else bot)" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 37 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 38 | lemma pred_of_setE: | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 39 | assumes "Predicate.eval (pred_of_set A) x" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 40 | obtains "contains A x" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 41 | using assms by(simp add: contains_def) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 42 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 43 | lemma pred_of_setI: "contains A x ==> Predicate.eval (pred_of_set A) x" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 44 | by(simp add: contains_def) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 45 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 46 | lemma pred_of_set_eq: "pred_of_set \<equiv> \<lambda>A. Predicate.Pred (contains A)" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 47 | by(simp add: contains_def[abs_def] pred_of_set_def o_def) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 48 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 49 | lemma containsI: "x \<in> A ==> contains A x" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 50 | by(simp add: contains_def) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 51 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 52 | lemma containsE: assumes "contains A x" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 53 | obtains A' x' where "A = A'" "x = x'" "x : A" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 54 | using assms by(simp add: contains_def) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 55 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 56 | lemma contains_predI: "contains A x ==> Predicate.eval (contains_pred A x) ()" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 57 | by(simp add: contains_pred_def contains_def) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 58 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 59 | lemma contains_predE: | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 60 | assumes "Predicate.eval (contains_pred A x) y" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 61 | obtains "contains A x" | 
| 62390 | 62 | using assms by(simp add: contains_pred_def contains_def split: if_split_asm) | 
| 52023 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 63 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 64 | lemma contains_pred_eq: "contains_pred \<equiv> \<lambda>A x. Predicate.Pred (\<lambda>y. contains A x)" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 65 | by(rule eq_reflection)(auto simp add: contains_pred_def fun_eq_iff contains_def intro: pred_eqI) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 66 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 67 | lemma contains_pred_notI: | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 68 | "\<not> contains A x ==> Predicate.eval (Predicate.not_pred (contains_pred A x)) ()" | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 69 | by(simp add: contains_pred_def contains_def not_pred_eq) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 70 | |
| 60758 | 71 | setup \<open> | 
| 52023 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 72 | let | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 73 | val Fun = Predicate_Compile_Aux.Fun | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 74 | val Input = Predicate_Compile_Aux.Input | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 75 | val Output = Predicate_Compile_Aux.Output | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 76 | val Bool = Predicate_Compile_Aux.Bool | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 77 | val io = Fun (Input, Fun (Output, Bool)) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 78 | val ii = Fun (Input, Fun (Input, Bool)) | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 79 | in | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 80 | Core_Data.PredData.map (Graph.new_node | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 81 |     (@{const_name contains}, 
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 82 |      Core_Data.PredData {
 | 
| 55543 | 83 | pos = Position.thread_data (), | 
| 52023 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 84 |        intros = [(NONE, @{thm containsI})], 
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 85 |        elim = SOME @{thm containsE}, 
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 86 | preprocessed = true, | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 87 | function_names = [(Predicate_Compile_Aux.Pred, | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 88 |          [(io, @{const_name pred_of_set}), (ii, @{const_name contains_pred})])], 
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 89 | predfun_data = [ | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 90 |          (io, Core_Data.PredfunData {
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 91 |             elim = @{thm pred_of_setE}, intro = @{thm pred_of_setI},
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 92 |             neg_intro = NONE, definition = @{thm pred_of_set_eq}
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 93 | }), | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 94 |          (ii, Core_Data.PredfunData {
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 95 |             elim = @{thm contains_predE}, intro = @{thm contains_predI}, 
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 96 |             neg_intro = SOME @{thm contains_pred_notI}, definition = @{thm contains_pred_eq}
 | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 97 | })], | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 98 | needs_random = []})) | 
| 34948 
2d5f2a9f7601
refactoring the predicate compiler; adding theories for Sequences; adding retrieval to Spec_Rules; adding timing to Quickcheck
 bulwahn parents: 
33265diff
changeset | 99 | end | 
| 60758 | 100 | \<close> | 
| 52023 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 101 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 102 | hide_const (open) contains contains_pred | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 103 | hide_fact (open) pred_of_setE pred_of_setI pred_of_set_eq | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 104 | containsI containsE contains_predI contains_predE contains_pred_eq contains_pred_notI | 
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 105 | |
| 
b477be38a7bb
setup for set membership as a predicate for code_pred
 Andreas Lochbihler parents: 
51126diff
changeset | 106 | end |