The syntax for <pattern> is:
<pattern> ==> Matches:
<atom> the <atom>.
| (kwote <atom>) any expression eq? to <atom>.
| (and <pat1> ... <patn>) if all of <pati> match.
| (or <pat1> ... ...<patn>) if any of <pat1> through <patn> matches.
| (not <pat>) if <pat> doesn't match.
| (? <predicate>) if <predicate> is true.
| (<pat1> ... <patn>) a list of n elements. Here, ... is a
meta-character denoting a finite repetition
of patterns.
| <pat> ... a (possibly empty) repetition
of <pat> in a list.
| #(<pat> ... <patn>) a vector of n elements.
| ?<id> anything, and binds id as a variable.
| ?- anything.
| ??- any (possibly empty) repetition of anything
in a list.
| ???- any end of list.
Remark: and, or, not, check and kwote must be
quoted in order to be treated as literals. This is the only justification
for having the kwote pattern since, by convention, any atom which is
not a keyword is quoted.
?- matches any s-expr
a matches the atom 'a.
?a matches any expression, and binds the variable a to
this expression.
(? integer?) matches any integer
(a (a b)) matches the only list '(a (a b)).
???- can only appear at the end of a list, and always succeeds.
For instance, (a ???-) is equivalent to (a . ?-).
??- matches any sequence of anything:
(a ??- b) matches any list whose car is a and last
car is b.
(a ...) matches any list of a's, possibly empty.
(?x ?x) matches any list of length 2 whose car is
eq to its cadr
((and (not a) ?x) ?x) matches any list of length 2 whose
car is not eq to 'a but is eq to its cadr
#(?- ?- ???-) matches any vector whose length is at least 2.
Remark: ??- and ... patterns can not appear
inside a vector, where you should use ???-: For example,
#(a ??- b) or #(a...) are invalid patterns, whereas
#(a ???-) is valid and matches any vector whose first element
is the atom a.