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

Racket 使用PLT Redex测试语义时仅生成类型良好的术语,racket,semantics,plt-redex,Racket,Semantics,Plt Redex,我是个新手,对使用redex特别感兴趣。我在皮尔斯的《类型和编程语言》一书中为类型化算术表达式建立了一个小模型。该守则的要点如下: 当我尝试测试progress和preservation等属性时,我想检查测试覆盖了多少代码,因此我运行了以下内容,如amb教程中所述: (let ([c (make-coverage red)]) (parameterize ([relation-coverage (list c)]) (check-reduction-relation

我是个新手,对使用redex特别感兴趣。我在皮尔斯的《类型和编程语言》一书中为类型化算术表达式建立了一个小模型。该守则的要点如下:

当我尝试测试progress和preservation等属性时,我想检查测试覆盖了多少代码,因此我运行了以下内容,如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))
这意味着语义规则永远不会被执行,对吗?我认为问题在于racket生成的随机项不一定类型正确


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

经过一些尝试和重复这个小练习,我得到了一个合理的解决方案(完整的代码如下所示)。仅生成类型良好的术语的要点是使用
#:满足
子句约束redex生成器,如下面的
进度
属性测试:

(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))))
:successing(type et)
表示只应考虑判断
type et
成立的表达式
e