在使用PLT-Redex测试语义时,仅生成良好类型的术语

时间:2017-08-16 20:42:48

标签: racket semantics plt-redex

我是球拍的新手,我对使用redex特别感兴趣。我已经为Pierce的类型和编程语言书中的类型算术表达式做了一个小模型。代码位于以下要点:https://gist.github.com/rodrigogribeiro/e0fd3e1e3ff017b614dcfeee9f9154e0

当我尝试测试进度和保存等属性时,我想检查测试覆盖了多少代码,因此我运行了以下内容,如amb教程:

(let ([c (make-coverage red)])
     (parameterize ([relation-coverage (list c)])
     (check-reduction-relation
      red
      (λ (E) (progress-holds? E)))
      (covered-cases c)))

但是,它会返回

'(("E-if-false" . 0) ("E-if-true" . 0) ("E-iszero-suc" . 0) 
  ("E-iszero-zero" . 0) ("E-pred-suc" . 0) ("E-pred-zero" . 0))

这意味着没有执行语义规则,对吧?我认为问题是球拍产生的随机术语并不一定是好的打字。

我的问题:有没有办法指定如何只生成良好类型的术语?

1 个答案:

答案 0 :(得分:1)

经过一些尝试并重做这个小练习后,我得到了一个合理的解决方案(完整的代码位于以下gist)。仅生成类型良好的术语的要点是使用#:satisfying子句约束redex生成器,如下面的progress属性测试:

(define (progress)
  (let ([c (make-coverage eval-tyexp)])
    (parameterize ([relation-coverage (list c)])
        (redex-check TyExp 
               #:satisfying (types e t) 
               (progress-holds? (term e)))
        (covered-cases c))))

#:satisfying (types e t)表示只应考虑判断e成立的表达式types e t