我正致力于在类型系统的Redex中构建模型,该类型系统也具有规范实现。我想使用redex-check来模拟测试我的模型与实际实现。
实现(使用适配器)可以采用我的抽象语法,因此我需要的是一种将模糊器生成的术语传递给实现的方法。有没有办法做到这一点?
答案 0 :(得分:3)
结果是redex-check
,当与apply-reduction-relation*
结合使用时,如果您可以为实际实施提供redex术语,或者将其转换为适合您的实现,则直接处理此问题。您的代码将如下所示:
(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*
返回所有可能减少的列表。如果您的模型是确定性的,那么这应该是长度为一的列表。 (您可以使用以下缩减关系来检查:
(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
的示例。