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.
(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"]]]]])