将模型与Redex中的实现进行比较

时间:2015-10-19 17:27:36

标签: racket plt-redex

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

实现(使用适配器)可以采用我的抽象语法,因此我需要的是一种将模糊器生成的术语传递给实现的方法。有没有办法做到这一点?

1 个答案:

答案 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的示例。