比较模型与 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
的示例
我正致力于在类型系统的 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
的示例