SOLUTION-TO-SIMPLE-EXAMPLE.html -- ACL2 Version 6.3

### SOLUTION-TO-SIMPLE-EXAMPLE

solution to a simple example

    Major Section:  ANNOTATED-ACL2-SCRIPTS

To see a statement of the problem solved below, see annotated-acl2-scripts (in particular the end of that topic).

Here is a sequence of ACL2 events that illustrates the use of ACL2 to make definitions and prove theorems. We will introduce the notion of the fringe of a tree, as well as the notion of a leaf of a tree, and then prove that the members of the fringe are exactly the leaves.

We begin by defining the fringe of a tree, where we identify trees simply as cons structures, with atoms at the leaves. The definition is recursive, breaking into two cases. If `x` is a cons, then the `fringe` of `x` is obtained by appending together the `fringe`s of the `car` and `cdr` (left and right child) of `x`. Otherwise, `x` is an atom and its `fringe` is the one-element list containing only `x`.

      (defun fringe (x)
        (if (consp x)
            (append (fringe (car x))
                    (fringe (cdr x)))
          (list x)))

Now that `fringe` has been defined, let us proceed by defining the notion of an atom appearing as a ``leaf'', with the goal of proving that the leaves of a tree are exactly the members of its `fringe`.

      (defun leaf-p (atm x)
        (if (consp x)
            (or (leaf-p atm (car x))
                (leaf-p atm (cdr x)))
          (equal atm x)))

The main theorem is now as follows. Note that the rewrite rule below uses the equivalence relation `iff` (see equivalence) rather than `equal`, since `member` returns the tail of the given list that begins with the indicated member, rather than returning a Boolean. (Use `:pe member` to see the definition of `member`.)

      (defthm leaf-p-iff-member-fringe
        (iff (leaf-p atm x)
             (member-equal atm (fringe x))))