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

欢迎!请查阅 关于 页面以了解有关此页面的更多信息。

0
test.check
我使用 test.check 编写了一个用于搜索引擎的 AST(抽象语法树)生成器。它工作得相当好,但不知何故,递归生成器不会“垂直”压缩,而只会水平压缩。例如,假设这个 AST 失败了



{:op :and
 :args [{:op :and
         :args [{:op :term ...}
               {:op :term ...}
               {:op :term ...}]}]}



压缩后



{:op :and
 :args [{:op :and
         :args [{:op :term ...}]}]}



问题出在 `{:op :term}` 上,但不知何故 test.check 并不尝试移除递归的 `:and` 节点。不是什么大问题,但应该是一个很好的功能。

7 个答案

0

评论由:gfredericks

这是否使用了 {{gen/recursive-gen}}?

0

评论由:halgari

是的,我正在使用 recursive-gen。

0
_评论由:gfredericks_

这似乎是同一个问题?


(quick-check 10000
             (prop/for-all [tree (gen/recursive-gen gen/vector gen/large-integer)]
               (->> tree
                    (tree-seq coll? seq)
                    (not-any? #{4242}))))
;; =>
{:result false,
 :seed 1466641044276,
 :failing-size 151,
 :num-tests 3152,
 :fail [[[-250312923371676-2634403398808308]
         [-134580]
         1190117809715
         [1736827773692]
         [91379147228 281572852]
         []
         []
         [264322377680727]
         [-2-2005122340306]
         []
         []
         [2133414023]
         []
         [-7203148411369 2093087]
         [-1-1]
         [-350804570003194-24726]
         [-2145238760990835556]
         [-4410884650149229158 27914810]
         []
         [21126727]
         [816412492 102]
         [1]
         [-119-2132126120873]
         [50]
         [1590594626470485464-555554916273244]
         [4242 322325]]],
 :shrunk {:total-nodes-visited 57,
          :depth 11,
          :result false,
          ;; 应该缩小到 `4242`
          :smallest [[[4242]]]}}
0

评论由:gfredericks

我不敢肯定是否有干净的解决方案,但记下来:首先尝试将缩放到子树

0

评论由:gfredericks

如果 TCHECK-112 能够解决,也可能适用于这里。

0

评论由:gfredericks

我认为有一个脏解决方案,但勉强可以接受。

要缩小到子代,你需要知道 它们是什么,包括它们的缩放树。

实现这一点的一种方法是为 {{recursive-gen}} 将它传递给用户函数的生成器用某种仪器包装,该仪器记录生成器被调用的参数(或返回值),并在最终的缩放树中添加项目,试图首先直接缩小到这些值。

对这个方法的一个小的反对意见是,即使传递的生成器被调用,并不意味着生成的值实际上被使用了(例如,它们可能已被 {{such-that}} 过滤掉)。

然而,我认为这仅在最坏的情况下会导致可能的混淆,因为传递给用户函数的生成器生成的任何东西都是整个结构生成有效事物。所以将它缩减为不可行的,即使它与它 不相关

0
参考:https://clojure.atlassian.net/browse/TCHECK-110 (由 halgari 报告)
...