Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket 试图用redex定义一种小型语言_Racket_Semantics_Plt Redex - Fatal编程技术网

Racket 试图用redex定义一种小型语言

Racket 试图用redex定义一种小型语言,racket,semantics,plt-redex,Racket,Semantics,Plt Redex,我正在遵循for Redex,同时为类型化算术表达式构建一个模型,正如在Pierce的类型和编程语言中所发现的那样 我已经为这种小型语言定义了语法和类型系统,但是我很难定义它的小步语义。在我讨论这些问题之前,让我先介绍一下我到目前为止得到的定义 首先,我定义了该语言的语法 (define-language ty-exp [E (ttrue) (ffalse) (zero) (suc E) (ppred E) (iszero E)

我正在遵循for Redex,同时为类型化算术表达式构建一个模型,正如在Pierce的类型和编程语言中所发现的那样

我已经为这种小型语言定义了语法和类型系统,但是我很难定义它的小步语义。在我讨论这些问题之前,让我先介绍一下我到目前为止得到的定义

首先,我定义了该语言的语法

(define-language ty-exp
  [E  (ttrue)
      (ffalse)
      (zero)
      (suc E)
      (ppred E)
      (iszero E)
      (iff E E E)]
  [T (nat)
     (bool)])
(define-extended-language ty-exp-ctx-val ty-exp
  (C (suc C)
     (ppred C)
     (iszero C)
     (iff C E E)
     hole)
  (NV (zero)
      (suc NV))
  (BV (ttrue)
      (ffalse))
  (V  (NV)
      (BV)))
接下来,我毫无问题地定义了类型系统

(define-judgment-form ty-exp
  #:mode (types I O)
  #:contract (types E T)

  [
   ----------------------"T-zero"
    (types (zero) (nat))
  ]

  [
   -------------------------- "T-false"
     (types (ffalse) (bool))
  ]

  [
   -------------------------- "T-true"
     (types (ttrue) (bool))
  ]

  [
     (types E (nat))
   -------------------------- "T-suc"
     (types (suc E) (nat))
  ]

  [
     (types E (nat))
   -------------------------- "T-pred"
     (types (ppred E) (nat))
  ]

  [
     (types E (nat))
   -------------------------- "T-iszero"
     (types (iszero E) (bool))
  ]

  [
   (types E_1 (bool))
   (types E_2 T_1)
   (types E_3 T_1)
   -------------------------- "T-iff"
   (types (iff E_1 E_2 E_3) (T_1))
  ]
)
据我所知,我们需要使用评估上下文定义语义。所以我的下一步是为语言定义这样的上下文和值

(define-language ty-exp
  [E  (ttrue)
      (ffalse)
      (zero)
      (suc E)
      (ppred E)
      (iszero E)
      (iff E E E)]
  [T (nat)
     (bool)])
(define-extended-language ty-exp-ctx-val ty-exp
  (C (suc C)
     (ppred C)
     (iszero C)
     (iff C E E)
     hole)
  (NV (zero)
      (suc NV))
  (BV (ttrue)
      (ffalse))
  (V  (NV)
      (BV)))
非终结符
C
表示上下文,
NV
表示数值,
BV
表示布尔值,
V
表示值。使用值的定义,我定义了一个函数,用于测试表达式是否为值

(define v? (redex-match ty-exp-ctx-val V))
使用这个设置,我试图为这种语言定义操作语义。 在皮尔斯的书中,此类语义(无评估上下文)如下所示:

e --> e'
---------------- (E-suc)
suc e --> suc e'

------------------ (E-pred-zero)
pred zero --> zero

      NV e
------------------- (E-pred-succ)
pred (suc e) --> e

e --> e'
------------------- (E-pred)
pred e --> pred e'


-------------------- (E-iszero-zero)
iszero zero --> true

NV e
------------------------ (E-iszero-succ)
iszero (suc e) --> false


e --> e'
-------------------------(E-iszero)
iszero e --> iszero e'

---------------------- (E-if-true)
if true e e' --> e

-----------------------(E-if-false)
if false e e' --> e'

e --> e'
-----------------------(E-if)
if e e1 e2 --> if e' e1 e2
为了使用评估上下文来表达这种语义,我删除了规则
E-suc
E-pred
E-izero
E-if
,并定义了一个用于单步执行的规则 表达式上下文:

e --> e'
--------------(E-context)
E[e] --> E[e']
据我所知,我们不需要在redex中表示这样的上下文规则。所以 我已将该语言的语义定义为:

(define red
  (reduction-relation
   ty-exp-ctx-val
   #:domain E
   (--> (in-hole C (iff (ttrue) E_1 E_2))
        (in-hole C E_1)
        "E-if-true")
   (--> (in-hole C (iff (ffalse) E_1 E_2))
        (in-hole C E_2)
        "E-if-false")
   (--> (in-hole C (iszero (zero)))
        (in-hole C (ttrue))
        "E-iszero-zero")
   (--> (in-hole C (iszero (suc (E))))
        (in-hole C (ffalse))
        (side-condition (v? (term E)))
        "E-iszero-suc")
   (--> (in-hole C (ppred (zero)))
        (in-hole C (zero))
        "E-pred-zero")
   (--> (in-hole C (ppred (suc (E))))
        (in-hole C (E))
        (side-condition (v? (term E)))
        "E-pred-suc")
 ))
现在,问题来了:当我试图执行

(traces red (term (iif (iszero zero) ttrue ffalse)))
Racket返回以下错误消息:

 reduction-relation: relation not defined for (iif (iszero (zero)) (ttrue) (ffalse))

当然,我在做一些傻事,但我不知道是什么。有人能帮我吗?

运行程序后,我知道问题出在哪里了

尝试:


t真
ffalse
zero
周围有括号,谢谢!但是,我不同意你的评论。我如何陈述像“(iszero)”这样的条件,使其变为真或假?更改了答案。