尝试用 redex 定义一种小型语言
Trying to define a small language with redex
我正在关注 Redex 的 amb tutorial,同时,为类型化算术表达式构建模型,如 Pierce 的类型和编程语言中所见。
我已经为这种小语言定义了语法和类型系统,但我很难定义它的小步骤语义。在解决问题之前,让我先介绍一下我目前的定义。
首先,我定义了语言的语法。
(define-language ty-exp
[E (ttrue)
(ffalse)
(zero)
(suc E)
(ppred E)
(iszero E)
(iff E E E)]
[T (nat)
(bool)])
接下来,我毫无问题地定义了类型系统。
(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-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))
使用这个设置,我试图为这种语言定义操作语义。
在 Pierce 的书中,这样的语义(没有求值上下文)如下:
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)))
球拍returns报错如下:
reduction-relation: relation not defined for (iif (iszero (zero)) (ttrue) (ffalse))
当然,我在做一些愚蠢的事情,但我不知道是什么。有人可以帮我解决这个问题吗?
在运行程序之后,我看到了问题所在。
尝试:
(traces red (term (iff (iszero (zero)) (ttrue) (ffalse))))
在
(define-language ty-exp
[E (ttrue)
(ffalse)
(zero)
(suc E)
(ppred E)
(iszero E)
(iff E E E)]
[T (nat)
(bool)])
ttrue
、ffalse
和 zero
两边有括号。
我正在关注 Redex 的 amb tutorial,同时,为类型化算术表达式构建模型,如 Pierce 的类型和编程语言中所见。
我已经为这种小语言定义了语法和类型系统,但我很难定义它的小步骤语义。在解决问题之前,让我先介绍一下我目前的定义。
首先,我定义了语言的语法。
(define-language ty-exp
[E (ttrue)
(ffalse)
(zero)
(suc E)
(ppred E)
(iszero E)
(iff E E E)]
[T (nat)
(bool)])
接下来,我毫无问题地定义了类型系统。
(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-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))
使用这个设置,我试图为这种语言定义操作语义。 在 Pierce 的书中,这样的语义(没有求值上下文)如下:
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)))
球拍returns报错如下:
reduction-relation: relation not defined for (iif (iszero (zero)) (ttrue) (ffalse))
当然,我在做一些愚蠢的事情,但我不知道是什么。有人可以帮我解决这个问题吗?
在运行程序之后,我看到了问题所在。
尝试:
(traces red (term (iff (iszero (zero)) (ttrue) (ffalse))))
在
(define-language ty-exp
[E (ttrue)
(ffalse)
(zero)
(suc E)
(ppred E)
(iszero E)
(iff E E E)]
[T (nat)
(bool)])
ttrue
、ffalse
和 zero
两边有括号。