2024 年 Clojure 状态调查中分享您的想法!

欢迎!请参见关于页面了解该功能的更多信息。

0
test.check

包括添加对嵌套属性的支持,这将是有益的。以下是一个如何工作的示例

`
(defn exists?
[e coll]
(some #{e} coll))

(defn remove-elem
[e coll]
("remove" #{e} coll))

;; 这个测试应该失败,并且说明了嵌套属性的问题
(quick-check (for-all [v (gen/vector gen/int)]

           (for-all [e (elements v)]
             #(exists? e (remove-elem e v)))))

`

此要求支持具现属性,但目前尚未实现。

(链接:https://github.com/reiddraper/simple-check/issues/10 文本:原始问题 - GitHub #10)

12 个答案

0

由:maciej.jaskowski 评论

此问题的状态是什么?
在以下情况下,将该功能启用将非常有帮助:我想验证我的路径查找算法是否可以在给定的图 G 中找到最优解,因此我生成了图和大量随机路径,并检查所有随机路径是否都比算法找到的路径“更差”。

如果有嵌套的 for-all 就简单了。有没有什么替代方法?

0

由:reiddraper 评论

很抱歉缺少更新。嵌套属性在我这里仍处于“摇篮时光”。好消息是,它们很便利,您可以用 {{clojure.test.check.generators/bind}} 达到完全相同的效果。您可以在以下链接中看到 {{bind}} 如何使用(联系:https://github.com/clojure/test.check/blob/v0.5.8/doc/generator-examples.md#a-vector-and-a-random-element-from-it 文本:这里)。

0

由:maciej.jaskowski 评论

显然我还需要更多的提示,因为我(顺便说一下,使用 gen/bing)能生成的一切都是类似的 '(图 列表-随机路径)'

只要算法按预期工作,这就有用了。然而,一旦它失败,就很难弄清楚哪条随机路径失败了。

0

由:reiddraper 评论

你能告诉我如何编写具有嵌套属性的测试吗?也许然后我可以帮你将其重写为使用 {{bind}} 吗?

0

由:maciej.jaskowski 评论

太好了(图片:谢谢)

请,找到以下最重要的部分。

`
(defn gen-matrix-and-paths [size]

(gen/bind
  (gen-matrix gen/s-pos-int size)
  (fn [matrix]
    (let [ nodes (into [] (range (count matrix)))
           gen-perms (gen-permutations nodes)
           perms (distinct (gen/sample gen-perms 500)) ]
      (gen/tuple 
        (gen/return matrix) 
        (gen/return perms))))))

`

gen-matrix 生成一个行列式矩阵,例如:(link: [0 1) (link: 4 0)]
gen-permutations 对提供的向量化生成排列

0

由:reiddraper 评论

我困惑了。你在运行什么问题?你粘贴的代码使用了 {{bind}},而不是嵌套属性。

0

由:maciej.jaskowski 评论

好,但是现在我只能写点这样的东西

`
(prop/for-all [data (gen-matrix-and-paths 6)]
(let [ [matrix random-paths] data ]

 (not-worse-then-others? tsp matrix random-paths))))

`

这将指向矩阵和长500的路径向量,其中一个路径是反例。如果我能得到矩阵和单个反例会更好。

0

由:reiddraper 评论

我仍然不确定这看起来像嵌套属性。你能请按你所愿以嵌套属性的方式编写代码吗?这至少涉及两个 for-alls。

0

由:maciej.jaskowski 评论

当然!

我想写点这样的东西

`
(prop/for-all [matrix (gen-matrix 6)]
(prop/for-all [random-path (gen-random-path matrix)]

(<= (cost (tsp matrix)) (cost random-path))))

`

0

由:maciej.jaskowski 评论

ping!

0

由:reiddraper 评论

好的,让我们将其翻译为使用 {{gen/bind}}。与嵌套属性一样,{{bind}} 允许您创建依赖于另一个生成器 的生成器。例如,您的 {{gen-random-path}} 依赖于之前生成的 {{matrix}} 变量。因此,让我们编写一个生成器,它返回一个 {{matrix}} 和一个 {{random-path}}。

`
(def matrix-and-path
"返回一个二元组,包含 [matrix random-path]"
(gen/bind (gen-matrix 6)

        (fn [matrix]
           (gen/tuple (gen/return matrix) (gen-random-path matrix)))))

(prop/for-all [[matrix random-path] matrix-and-path]
(<= (cost (tsp matrix)) (cost random-path))
`

0
参考资料: https://clojure.atlassian.net/browse/TCHECK-7 (由 hypirion 报告)
...