Racket 扩展约化关系
在看PLT redex时,我想玩简化规则;所以我为布尔人定义了这个最小语言:Racket 扩展约化关系,racket,redex,Racket,Redex,在看PLT redex时,我想玩简化规则;所以我为布尔人定义了这个最小语言: (define-language B0 (b T F (not b))) 我想简化一系列的(not(not…),因此我扩展了语言来处理上下文,并定义了一个简化关系来简化not: (define-extended-language B1 B0 (C (not C) hole) (BV T F)) (define red0 (reduction-relation B1 (--> (in
(define-language B0
(b T F (not b)))
我想简化一系列的(not(not…)
,因此我扩展了语言来处理上下文,并定义了一个简化关系来简化not
:
(define-extended-language B1 B0
(C (not C) hole)
(BV T F))
(define red0
(reduction-relation
B1
(--> (in-hole C (not T)) (in-hole C F))
(--> (in-hole C (not F)) (in-hole C T))))
现在我想将我的语言扩展到布尔方程,并允许在方程的每一侧进行简化,因此我定义:
(define-extended-language B2 B1
(E (= C b) (= b C)))
希望:
(define red1
(extend-reduction-relation red0 B2))
我会做的。
但是没有:red1
可以减少(不是(不是(不是F);)
但不是(=(不是T)F))
我在这里做的事情真的很傻吗?red1的问题是它只包含
red0
的规则,这些规则使用有限的上下文C
。要使其按预期工作,您可以添加修改为使用E
的旧规则,或者以某种方式使最终扩展上下文的名称为C
。一种不太乏味的方法可能是:
(define-language L)
(define R
(reduction-relation L
(--> (not T) F)
(--> (not F) T)))
(define-language LB
(b T F (not b))
(C (compatible-closure-context b)))
(define RB (context-closure R LB C))
(define-extended-language LBE LB
(e (= b b))
(C .... (compatible-closure-context e #:wrt b)))
(define RBE (extend-reduction-relation RB LBE))
请注意,这在一些旧版本中不起作用
当然,有用信息的两个来源是