Racket 扩展约化关系

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

在看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-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))
请注意,这在一些旧版本中不起作用

当然,有用信息的两个来源是