Always be nervous when code assumes some sequence
is non-empty. Can you create a symbol that will cause
Making <- a macro is cute but not very useful. It means there's no easy to load a set of rules stored in a variable.
This function would be better if it were data-driven, with a table
linking symbols to proof procedures. That way new special logical
forms could be added without editing the basic definition of
Using union on the CAR and CDR is CONSful. Look at the definition of pattern-variables in ddr.lisp for a more efficient approach.
The value returned for a variable with binding is not a very satisfactory if the variable is bound to another variable. See replace-variables in ddr.lisp for an recursive solution that gets to the bottom of a value chain, if possible.