比较模型与 Redex 中的实现

Compare model to implementation in Redex

我正致力于在类型系统的 Redex 中构建一个模型,该模型也具有规范的实现。我想使用 redex-check 来模糊测试我的模型与实际实现。

实现(带有适配器)可以采用我的抽象语法,所以我需要的是一种将模糊器生成的术语传递给实现的方法。有办法吗?

事实证明,如果您可以为您的实际实施提供 redex 条款,或者将它们转换为适合您的实施,那么 redex-check, when combined with apply-reduction-relation* 会直接处理此问题。您的代码将如下所示:

(redex-check λv e
             (equal? (implementation (convert (term e)))
                     (first (apply-reduction-relation* red (term e)))))

其中 implementation 是您的实现,red 是您的模型使用的归约关系,convert 将术语转换为您的实现可以处理的内容。另外 λv 是您的语言,e 是您希望测试的语言中的术语。

first 只是因为 apply-reduction-relation* returns 列出了所有可能的归约。如果您的模型是确定性的,那么这应该是一个长度为 1 的列表。 (您可以使用以下归约关系来检查:

(redex-check λv e
             (let ([result (apply-reduction-relation* red (term e))])
               (and (= (length result) 1)
                    (equal? (implementation (convert (term e)))
                            (first result)))))

您可以在 on the redex home page.

教程中查看另一个如何使用 redex-check 的示例