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