请在 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
by

评论者:gfredericks

并不完全确定有干净解决方案,但记下:首先尝试缩减到子树

0
by

评论者:gfredericks

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

0
by

评论者:gfredericks

我认为这里有一套有些混乱但勉强可行的解决方案。

要缩减到子节点,你需要知道它们是什么,包括它们的缩减树。

一种方法是为{{recursive-gen}}提供一个包裹用户函数传递给它的生成器的一些工具,以记录生成器被调用的参数(或其返回值),然后向最终的缩减树中提前添加项,尝试首先直接缩减到这些值。

关于这种方法的微小反对意见是,仅因为调用了生成器,并不意味着实际使用了由这些调用生成的值(例如,它们可能已经被{{such-that}}过滤掉了)。

然而,我认为这只是在最坏的情况下可能出现的混淆,因为传递给用户函数的生成器产生的任何内容都是整个结构生成有效内容的东西。因此,即使它不相关,也不应该是不合法的进行缩减。

0
...