clojure.test.check 生成两个整数,一个比一个小
clojure.test.check generate two ints, one less than the other
我想写一个 属性 如下所示:
(prop/for-all [x (gen/nat)
y (gen/nat)]
(= (g x y) (f x y)))
然而,属性 仅在 x > y
时成立。表达此 属性 的先决条件的正确方法是什么? (更好的是,我如何编写这个 属性 使得 y
生成为小于 x
的自然数?)
您可以生成 y
和一个中间数 dy
,然后将 x
计算为 (+ y dy)
。
使用 clojure.test.check.generators/nat
生成 dy
确保它是非负的——无需在用户代码中应用绝对值。如果 x
需要严格大于 – 且不等于 – y
,请使用 clojure.test.check.generators/pos-int
生成 dy
。
我相信这将倾向于将两个数字更接近的情况视为 "simpler" 以产生最少的失败案例。这似乎对许多情况很有用 属性 – 你必须判断它是否适合你的情况。
您可以独立生成 x
和 y
并使用拒绝抽样 – clojure.test.check.generators/such-that
允许您 "filter" 基础生成器生成的值使用您选择的谓词。
当您要查找的案例以非常低的概率生成时,这不是一个好方法,但在所有案例的 ~½ 中,x
将大于 y
,所以这里应该没问题。
您可以按照 Mike 的建议使用 clojure.test.check.generators/bind
。我建议将它与 clojure.test.check.generators/choose
结合使用以生成正数 x
,然后生成 [0…x-1] 范围内的 y
,可能采用以下方式:
(prop/for-all [[x y] (gen/bind gen/nat
(fn [v]
(gen/tuple
(gen/return (inc v))
(gen/choose 0 v))))]
(> x y))
您可以使用绑定函数创建一个依赖于先前值的生成器。我确定必须有一种更简洁的方法来执行此操作。
(def always-greater-than
(gen/bind gen/nat
(fn [v] (gen/tuple (gen/return (inc v))
(gen/fmap #(mod % (inc v)) gen/nat)))))
示例输出:
(gen/sample always-greater-than)
([1 0] [2 0] [1 0] [3 0] [1 0] [6 4] [7 6] [2 0] [3 2] [6 4])
我想写一个 属性 如下所示:
(prop/for-all [x (gen/nat)
y (gen/nat)]
(= (g x y) (f x y)))
然而,属性 仅在 x > y
时成立。表达此 属性 的先决条件的正确方法是什么? (更好的是,我如何编写这个 属性 使得 y
生成为小于 x
的自然数?)
您可以生成
y
和一个中间数dy
,然后将x
计算为(+ y dy)
。使用
clojure.test.check.generators/nat
生成dy
确保它是非负的——无需在用户代码中应用绝对值。如果x
需要严格大于 – 且不等于 –y
,请使用clojure.test.check.generators/pos-int
生成dy
。我相信这将倾向于将两个数字更接近的情况视为 "simpler" 以产生最少的失败案例。这似乎对许多情况很有用 属性 – 你必须判断它是否适合你的情况。
您可以独立生成
x
和y
并使用拒绝抽样 –clojure.test.check.generators/such-that
允许您 "filter" 基础生成器生成的值使用您选择的谓词。当您要查找的案例以非常低的概率生成时,这不是一个好方法,但在所有案例的 ~½ 中,
x
将大于y
,所以这里应该没问题。您可以按照 Mike 的建议使用
clojure.test.check.generators/bind
。我建议将它与clojure.test.check.generators/choose
结合使用以生成正数x
,然后生成 [0…x-1] 范围内的y
,可能采用以下方式:(prop/for-all [[x y] (gen/bind gen/nat (fn [v] (gen/tuple (gen/return (inc v)) (gen/choose 0 v))))] (> x y))
您可以使用绑定函数创建一个依赖于先前值的生成器。我确定必须有一种更简洁的方法来执行此操作。
(def always-greater-than
(gen/bind gen/nat
(fn [v] (gen/tuple (gen/return (inc v))
(gen/fmap #(mod % (inc v)) gen/nat)))))
示例输出:
(gen/sample always-greater-than)
([1 0] [2 0] [1 0] [3 0] [1 0] [6 4] [7 6] [2 0] [3 2] [6 4])