racket - Redex 不匹配

标签 racket plt-redex

定义语义的常见方法是(例如):

return v if [some other condition]
otherwise, return error

例如,考虑

(define-language simple-dispatch
   (e ::= v (+ e e))
   (v ::= number string)
   (res ::= e err)
   (E ::= hole (+ E e) (+ v E)))

然后我们可以定义约简关系

(define s-> (reduction-relation simple-dispatch
  #:domain res
  (--> (in-hole E (+ number_1 number_2))
       (in-hole E ,(+ number_1 number_2)))
  (--> (in-hole E (+ any any))
       err)))

这是执行此操作的自然方法,因为它避免了为 3 个失败情况(数字字符串、字符串数字、字符串字符串)中的每一个编写单独的匹配器。然而,它会产生这样的运行问题:

(apply-reduction-relation s-> (term (+ 2 2)))

(正确地)表明它可以让您减少错误或数字 4。有没有办法制作一个“异常(exception)”模式,以避免检查所有组成情况?

最佳答案

您想要在这里使用的是 side-conditionredex-match? 的组合。扩展你的约简关系可以得到:

(define s-> (reduction-relation simple-dispatch
  #:domain res
  (--> (in-hole E (+ number_1 number_2))
       (in-hole E ,(+ (term number_1) (term number_2))))
  (--> (in-hole E (+ any_1 any_2))
       err
       (side-condition
        (not (redex-match? simple-dispatch
                           (+ number number)
                           (term (+ any_1 any_2))))))))

这只是说,只要第一个规则不正确,你就可以采用第二个规则,这是论文隐含的意思,只是没有在图中明确地画出来。 (请注意,您可以使用 side-condition/hidden 使其在渲染图形时不绘制侧面条件)。

您可以使用此方法来扩展至您想要禁止的任意数量的模式。

关于racket - Redex 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37105258/

相关文章:

racket - 在 Racket 中解压一个条目到内存

racket - PLT-Redex 可以对这些特征进行建模吗?

racket - Reduction-relation 的 in-hole 可能以多种不同的方式匹配一个孔

Scheme 帮助——如何调用一个函数

lisp - 如何制作 Racket 阅读器宏以将一个字符的任何实例转换为另外两个字符?

lisp - 为什么 andmap 在这种情况下返回#t?

functional-programming - 如何在 PLT Redex 中实现等递归类型?

racket - redex 术语中取消引用的省略号

Racket、PLT Redex、测试-->E 不存在

functional-programming - 如何加载库以支持 R5RS 语言(DrScheme)中的哈希表?