[racket-dev] [plt] Push #23181: master branch updated

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Sat Aug 6 11:43:10 EDT 2011

1. I like Robby's mode suggestion. 

2. I prefer shorter keywords, e.g., define-judgment. 

3. Why is this in github and not in the docs? 


On Aug 5, 2011, at 9:56 PM, Robby Findler wrote:

> How about 
> 
>  #:mode (sum I I O)
> 
> for the mode spec where the #:mode keyword is optional but, if present must be followed by what looks like a use of the relation but with a
> Mode?
> 
> Robby
> 
> On Friday, August 5, 2011, Casey Klein <clklein at eecs.northwestern.edu> wrote:
> > On Fri, Aug 5, 2011 at 8:13 AM,  <clklein at racket-lang.org> wrote:
> >> clklein has updated `master' from 1a65678924 to 576272362b.
> >>  http://git.racket-lang.org/plt/1a65678924..576272362b
> >>
> >
> > This push adds a more general way to define relations in Redex,
> > currently under the name define-judgment-form. For those of you
> > familiar with the existing define-relation form, this new form lifts
> > the restriction that relations have no outputs when executed. In
> > particular, it lets you specify which positions are inputs and which
> > are outputs, and it statically checks that the outputs can be computed
> > from the inputs without "guessing" any intermediate values.
> >
> > Here's a simple example:
> >
> > (define-language nats
> >  (n z (s n)))
> >
> > (define-judgment-form nats
> >  mode : O O I
> >  sum ⊆ n × n × n
> >  [(sum z n n)]
> >  [(sum (s n_1) n_2 (s n_3))
> >   (sum n_1 n_2 n_3)])
> >
> >> (judgment-holds (sum (s (s z)) (s z) (s (s (s z)))))
> > true
> >> (judgment-holds (sum (s (s z)) (s z) (s (s z))))
> > false
> >> (judgment-holds (sum (s z) n (s (s z))) n)
> > `((s z))
> >> (judgment-holds (sum n_1 n_2 (s (s z))) (n_1 n_2))
> > `(((s (s z)) z) ((s z) (s z)) (z (s (s z))))
> >
> > I see three use cases:
> >
> > 1. Defining type systems in a way that supports mechanized
> > typesetting. Here's an example:
> >
> > https://gist.github.com/1128672
> >
> > There are still plenty of type systems Redex can't express, but the
> > new form gets a lot of low-hanging fruit.
> >
> > 2. Defining structural operational semantics in a way that supports
> > mechanized typesetting. Here's an example:
> >
> > https://gist.github.com/1128685
> >
> > Relations defined in this way don't work directly with traces. You can
> > embed them in reduction-relation, as the example demonstrates, but you
> > lose out on edge labels. It shouldn't be too difficult to rig up
> > something better, if this turns out to be important.
> >
> > 3. Defining relations using something like multi-valued metafunctions.
> > Here's an example in which (add1 e) may reduce to 0.
> >
> > https://gist.github.com/1128692
> >
> > Any feedback is welcome, but I'm especially interested in opinions on
> > two points:
> >
> > 1. Is there a better name than define-judgment-form? I would have
> > liked the name define-relation, if it weren't already taken. Is it OK
> > to overload it?
> >
> > 2. Should mode declarations use a different syntax? I tried to do
> > something in the paren-free style of define-relation contracts, but I
> > don't like the result -- partially because I personally like parens,
> > partially because it makes it harder to give good error messages.
> >
> > _________________________________________________
> >  For list-related administrative tasks:
> >  http://lists.racket-lang.org/listinfo/dev _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/dev/archive/attachments/20110806/65f50fe8/attachment.html>

Posted on the dev mailing list.