Racket PLT Redex:参数化语言定义

Racket PLT Redex:参数化语言定义,racket,formal-semantics,plt-redex,Racket,Formal Semantics,Plt Redex,这是一个困扰我一段时间的问题,我想知道这里是否有人可以帮助我 我有一个名为lambdaLVar的语言的PLT-Redex模型,它或多或少是一种花园式的非类型lambda演算,但通过包含“晶格变量”或lvar的存储进行了扩展。LVar是一个变量,其值只能随时间增加,其中“增加”的含义由语言用户指定的偏序集(也称为晶格)给出。因此,lambdaLVar实际上是一个语言家族——用一个晶格实例化它,就得到了一种语言;用不同的格子,你会得到另一个。你可以看看代码;重要的东西在里面 在lambdaLVar的

这是一个困扰我一段时间的问题,我想知道这里是否有人可以帮助我

我有一个名为lambdaLVar的语言的PLT-Redex模型,它或多或少是一种花园式的非类型lambda演算,但通过包含“晶格变量”或lvar的存储进行了扩展。LVar是一个变量,其值只能随时间增加,其中“增加”的含义由语言用户指定的偏序集(也称为晶格)给出。因此,lambdaLVar实际上是一个语言家族——用一个晶格实例化它,就得到了一种语言;用不同的格子,你会得到另一个。你可以看看代码;重要的东西在里面

在lambdaLVar的纸上定义中,语言定义由用户指定的晶格参数化。很长一段时间以来,我一直想在Redex模型中进行同样的参数化,但到目前为止,我还没有弄清楚如何进行。部分问题在于语言的语法取决于用户如何实例化晶格:晶格的元素成为语法中的终端。我不知道如何在Redex中表达一种语法,这种语法在格上是抽象的


同时,我试图使lambdaLVar.rkt尽可能模块化。该文件中定义的语言专门用于一个特定的晶格:使用
max
作为最小上界(lub)运算的自然数。(或者,相当于,
排序的自然数,我问了Racket用户邮件列表;线程开始了。总结一下由此产生的讨论:在今天的Redex中,答案是,无法以我想要的方式参数化语言定义。但是,在将来的Redex版本中,这应该是可能的带有模块系统的ex,目前正在工作中

尝试使用Redex现有的扩展表单也不起作用(
定义扩展语言
扩展缩减关系
,等等)正如我在这里尝试的那样,因为——正如我所发现的——原始的元函数不会被过渡地重新解释以使用扩展的语言。但是模块系统显然也会有帮助,因为它允许你将元函数、判断形式和归约关系打包在一起,同时扩展t哼哼(见讨论)

因此,现在的答案确实是,编写一个Redex生成宏。类似这样的操作:

(define-syntax-rule (define-lambdaLVar-language name lub-op lattice-values ...)
  (begin
    ;; Entire original Redex model goes here, with `natural` replaced with
    ;; `lattice-values ...`, and instances of `...` replaced with `(... ...)`
))
然后你可以用,例如,实例化特定的格:

(define-lambdaLVar-language lambdaLVar-nat max natural)
我希望Redex能很快得到模块,但与此同时,它似乎工作得很好

> (program-test-suite nats-slow-rr)
(define-syntax-rule (define-lambdaLVar-language name lub-op lattice-values ...)
  (begin
    ;; Entire original Redex model goes here, with `natural` replaced with
    ;; `lattice-values ...`, and instances of `...` replaced with `(... ...)`
))
(define-lambdaLVar-language lambdaLVar-nat max natural)