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)都是成对的 '(graph list-of-random-paths)

只要算法按预期工作,这就有用。然而,一旦它失败,就很难找出是哪个随机的路径让它失败了。

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 生成一个阶矩阵,例如 (链接:[0 1) (链接: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))))

`

这,如果我的 'tsp' 算法不正确,会指向一个矩阵和一条路径(长度 500),其中一个是反例。如果能直接得到矩阵和单个反例,那就更好了。

0

评论者:reiddraper

我仍然不确定使用嵌套属性将会看起来是什么样子。您能按照我想要的作为嵌套属性的方式编写代码吗?这将涉及至少两个forall。

0

评论者:maciej.jaskowski

当然可以!

我想写一些像这样的东西

`
(prop/for-all [(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报告)
...