Every time I define a language in PLT redex, I need to manually define a (capture-avoiding) substitution function. For example, this model isn't finished because subst isn't defined:
#lang racket/base
(require redex/reduction-semantics)
(define-language Λ
[V ::= x (λ x M)]
[M ::= (M M) V]
[C ::= hole (V C) (C M)]
[x ::= variable-not-otherwise-mentioned])
(define -->β
(reduction-relation Λ
[--> (in-hole C ((λ x M) V))
(in-hole C (subst M x V))]))
But the definition of subst is obvious. Can PLT redex handle substitution automatically?
Yes! Just describe your language's binding structure with a
#:binding-formsdeclaration.Here's a similar model with capture-avoiding substitution via the
substitutefunction:Alphabetic equivalence comes for free too, see
alpha-equivalent?(Thank you Paul Stansifer!)