Thank you Rich! Op di 31 mei 2016 om 19:12 schreef Rich Hickey <richhic...@gmail.com>:
> You are not labeling your preds, so ::not-predicate is taken as the label > for ::and-predicate etc. > > Also, tuples are not labeled: > > (require '[clojure.spec :as s]) > (require '[clojure.spec.gen :as gen]) > > (s/def ::atom string?) > > (s/def ::predicate (s/or > :not ::not-predicate > :and ::and-predicate > :or ::or-predicate > :atom ::atom)) > > (s/def ::and-predicate (s/cat :pred #{:and} :args (s/+ ::predicate))) > (s/def ::or-predicate (s/cat :pred #{:or} :args (s/+ ::predicate))) > (s/def ::not-predicate (s/tuple #{:not} ::predicate)) > > user=> (prn (take 5 (gen/sample (s/gen ::predicate)))) > ([:not [:not (:or "")]] "L" [:not (:and (:and (:and "" (:or "tQ" "s" ""))) > [:not [:not "T"]])] "19f" [:not "8lC”]) > > spec works the same under the hood as what Gary showed, e.g. s/or turns > into gen/one-of etc. > > Rich > > > On May 31, 2016, at 11:32 AM, Jeroen van Dijk < > jeroentjevand...@gmail.com> wrote: > > > > Hi Gary, > > > > Thanks for the feedback. I've tried it with test.check itself and I get > better results (see below). So I'm guessing clojure.spec needs different > input or it works differently underneath. > > > > Thanks, > > Jeroen > > > > (require '[clojure.test.check :as tc]) > > (require '[clojure.test.check.generators :as gen]) > > (require '[clojure.test.check.properties :as prop]) > > > > (def gen-atom (gen/elements (mapcat (juxt (partial str "f_a") > > (partial str "t_a")) (range > 10)))) > > > > (def gen-atom (gen/elements (mapcat (juxt (partial str "f_a") > > (partial str "t_a")) (range > 10)))) > > > > (defn gen-cat > > "Returns a generator of a sequence catenated from results of > > gens, each of which should generate something sequential." > > [& gens] > > (gen/fmap #(vec (apply concat %)) > > (apply gen/tuple gens))) > > > > (def compound (fn [inner-gen] > > (gen/one-of [(gen-cat (gen/elements [[:not]]) (gen/tuple > inner-gen)) > > (gen-cat (gen/elements [[:or]]) (gen/tuple > inner-gen) (gen/not-empty (gen/list inner-gen))) > > (gen-cat (gen/elements [[:and]]) (gen/tuple > inner-gen) (gen/not-empty (gen/list inner-gen)))]))) > > (def gen-predicate (gen/recursive-gen compound gen-atom)) > > > > ([:or [:and [:or "t_a3" "f_a5"] [:and "t_a5" "t_a6"]] [:or [:not "t_a5"] > [:not "t_a1"]]] [:and [:and [:and "f_a4" "f_a4" "f_a9"] [:or "f_a2" > "t_a5"]] [:and [:not "f_a3"] [:not "f_a1"]]] [:or "t_a5" "f_a6" "t_a7" > "t_a3"] [:not [:and [:and [:not [:not "t_a5"]] [:and [:or "t_a4" "f_a7"] > [:not "t_a2"] [:not "f_a6"] [:and "t_a5" "t_a4"] [:or "t_a8" "f_a0"]] [:not > [:or "f_a8" "f_a2"]]] [:or [:or [:not "f_a0"] [:or "t_a9" "t_a7"]] [:not > [:or "t_a5" "f_a6" "f_a1"]]] [:not [:and [:and "t_a0" "t_a3"] [:or "f_a2" > "t_a5"]]]]] [:or [:not [:and [:or [:not "f_a1"] [:and "f_a0" "t_a8"]] [:not > [:not "t_a7"]] [:or [:or "f_a1" "f_a8" "f_a7"] [:and "f_a9" "t_a2"]]]] > [:not [:or [:or [:not "t_a7"] [:not "t_a8"]] [:or [:and "t_a3" "t_a0"] > [:not "t_a6"]]]] [:not [:and [:and [:and "f_a9" "t_a7"] [:and "f_a6" > "f_a9"] [:or "f_a9" "t_a0" "t_a8"]] [:and [:not "f_a4"] [:or "t_a3" "f_a4"] > [:or "t_a3" "f_a3"]]]]]) > > > > On Tue, May 31, 2016 at 3:14 AM, Gary Fredericks < > fredericksg...@gmail.com> wrote: > > At a glance, this is probably the normal increasing-size behavior of > test.check, and the bias should only be present for the first few samples. > E.g., if you do a (take 1000 (gen/sample ...)), it should be more uniform. > > > > Whether it's a real problem depends on how you're running your tests. I > haven't yet looked into whether clojure.spec provides some default way of > running test.check properties, so I'm not sure about that. But as long as > you're running "enough" tests, e.g. >100, it should be fine. > > > > > > On Monday, May 30, 2016 at 4:05:52 PM UTC-5, Jeroen van Dijk wrote: > > I'm trying to generate logical predicates in order to test a function > that should return the predicate in DNF. The generation seems to be biased > towards one of the predicates. What am I doing wrong? > > > > (require '[clojure.spec :as s]) > > (require '[clojure.spec.gen :as gen]) > > > > (s/def ::atom string?) > > > > (s/def ::predicate (s/or > > ::not-predicate > > ::and-predicate > > ::or-predicate > > ::atom)) > > > > (s/def ::and-predicate (s/cat :pred #{:and} :args (s/+ ::predicate))) > > (s/def ::or-predicate (s/cat :pred #{:or} :args (s/+ ::predicate))) > > (s/def ::not-predicate (s/tuple :pred #{:not} ::predicate)) > > > > (prn (take 5 (gen/sample (s/gen ::predicate)))) > > ;;=> > > ((:and (:and "")) "" "X" "G" (:and "yd" (:and "c" "" (:and "F" (:and "" > "8" "Hb" "U0d")) "C") (:and (:and "1" "e" (:and "ME01" "w" "Y4" "" "P4") > "J4m4" "8") "Q7c" "") (:and (:and (:and "" "dG"))) "gw5")) > > > > > > No :or's or :not's here. If I change the order of s/or above the bias > changes. What's a better approach? > > > > Thanks, > > Jeroen > > > > > > -- > > You received this message because you are subscribed to the Google > > Groups "Clojure" group. > > To post to this group, send email to clojure@googlegroups.com > > Note that posts from new members are moderated - please be patient with > your first post. > > To unsubscribe from this group, send email to > > clojure+unsubscr...@googlegroups.com > > For more options, visit this group at > > http://groups.google.com/group/clojure?hl=en > > --- > > You received this message because you are subscribed to the Google > Groups "Clojure" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to clojure+unsubscr...@googlegroups.com. > > For more options, visit https://groups.google.com/d/optout. > > > > > > -- > > You received this message because you are subscribed to the Google > > Groups "Clojure" group. > > To post to this group, send email to clojure@googlegroups.com > > Note that posts from new members are moderated - please be patient with > your first post. > > To unsubscribe from this group, send email to > > clojure+unsubscr...@googlegroups.com > > For more options, visit this group at > > http://groups.google.com/group/clojure?hl=en > > --- > > You received this message because you are subscribed to the Google > Groups "Clojure" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to clojure+unsubscr...@googlegroups.com. > > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.