定义语义的常用方法是(例如):
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.有没有办法制作一个"除了"避免必须检查所有组成案件的模式?
答案 0 :(得分:3)
您要在此处使用的是side-condition
和redex-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
使其在渲染图形时不绘制边条件。)
您可以使用此方法扩展到您想要禁止的任意数量的模式。