【问题标题】:Redex Does Not MatchRedex 不匹配
【发布时间】:2016-09-03 11:13:44
【问题描述】:

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

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。有没有办法制作“例外”模式,避免检查所有构成案例?

【问题讨论】:

  • 什...什么...哇...我...以为我知道 Racket 但是...这是一些Agda / Prolog 的东西就在这里。 :o

标签: racket plt-redex


【解决方案1】:

您想在这里使用的是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 使其在渲染图形时不绘制侧面条件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多