On the other hand, when you say "v = x + y" that expresses a
relationship between v, x, and y, and that constraint can be solved
for any of those variables. So it is just as likely that this gets
rewritten (by the equation solver) into "x = v - y" and then into "x
is v - y". Or it could be solved for y as well. The equals sign only
expresses a relationship, not assignment.
You can create any rules you want to express the empty list. You
could create a nullary operator called "nil" if you want, or something
else. It isn't built-in to Bertrand. A reasonable thing to do would
be to create a library for dealing with lists. For example, a list
could just be a comma-separated list of other things, i.e., "1, 2, 3".
Often, when you write rules for this kind of thing, you don't need a
representation for the empty list, since you have one rule that
matches a (comma separated) list and another rule that matches a
single element of the list. See the factorial rule for an example.
--wm
The bops library defines the outfix operator [ ] to be "don't
evaluate", which I've never used. If you want to use [ ] as an
operator (like, for lists), just remove the definition in bops, or
change it to a prefix operator "noeval" or something like that.
--wm