从还原关系中调用判断

时间:2016-05-05 19:01:53

标签: racket plt-redex

我正在努力定义一种具有强制类型和子类型的语言,如下所示:

(define-language base 
  (t ::= int any) 
  (e ::= number (cast t e)) 
  #| stuff ... |#)

然后我在其上定义以下判断表:

(define-judgment-form base
   #:mode (<: I I)
   #:contract (<: t t)
   [------ 
    (<: t t)]
   [------ 
    (<: int any)])

现在,在我的缩减关系中,我想写类似

的东西
(define b-> (reduction-relation base
    (--> (cast t v)
         v
         (where-judgment-holds (<: (typeof v) t)))))

我们假设(typeof v)返回值v的类型。据我所知,Redex库中没有像where-judgment-holds这样的东西,虽然我可以使用unquote解决它,但如果Redex中内置了一些东西会很好。

1 个答案:

答案 0 :(得分:3)

您实际需要的内容名为judgment-holds,它可以在您的示例中使用where-judgment-holds的确切位置:

(define b-> (reduction-relation base
    (--> (cast t v)
         v
         (judgment-holds (<: (typeof v) t)))))