Major Section: QUANTIFIERS
See quantifiers-using-defun-sk for the context of this example.
(in-package "ACL2")
; We prove that if every member A of each of two lists satisfies the
; predicate (P A), then this holds of their append; and, conversely.
; Here is a solution using explicit quantification.
(defstub p (x) t)
(defun-sk forall-p (x)
(forall a (implies (member a x)
(p a))))
; The defun-sk above introduces the following axioms. The idea is that
; (FORALL-P-WITNESS X) picks a counterexample to (forall-p x) if there is one.
; (DEFUN FORALL-P (X)
; (LET ((A (FORALL-P-WITNESS X)))
; (IMPLIES (MEMBER A X) (P A))))
;
; (DEFTHM FORALL-P-NECC
; (IMPLIES (NOT (IMPLIES (MEMBER A X) (P A)))
; (NOT (FORALL-P X)))
; :HINTS (("Goal" :USE FORALL-P-WITNESS)))
; The following lemma seems critical.
(defthm member-append
(iff (member a (append x1 x2))
(or (member a x1) (member a x2))))
; The proof of forall-p-append seems to go out to lunch, so we break into
; directions as shown below.
(defthm forall-p-append-forward
(implies (forall-p (append x1 x2))
(and (forall-p x1) (forall-p x2)))
:hints (("Goal" ; ``should'' disable forall-p-necc, but no need
:use
((:instance forall-p-necc
(x (append x1 x2))
(a (forall-p-witness x1)))
(:instance forall-p-necc
(x (append x1 x2))
(a (forall-p-witness x2)))))))
(defthm forall-p-append-reverse
(implies (and (forall-p x1) (forall-p x2))
(forall-p (append x1 x2)))
:hints (("Goal"
:use
((:instance forall-p-necc
(x x1)
(a (forall-p-witness (append x1 x2))))
(:instance forall-p-necc
(x x2)
(a (forall-p-witness (append x1 x2))))))))
(defthm forall-p-append
(equal (forall-p (append x1 x2))
(and (forall-p x1) (forall-p x2)))
:hints (("Goal" :use (forall-p-append-forward
forall-p-append-reverse))))