3
;; This book is mostly about universal closures. The theorem
4
;; prover operates on clauses (which contain free variables and
5
;; no quantifiers, and free variables are understood as being
6
;; universally quantified), and when proving soundness of various
7
;; things, we have to frequently add and remove universal quantifiers
8
;; to the top of a formula.
10
;; Some of this applies to existential quantifiers as well.
12
(include-book "variables")
13
(include-book "../../../../../ordinals/e0-ordinal")
14
(set-well-founded-relation e0-ord-<)
16
;;------------------------------------------
17
;; Function alls (vars f) tacks on a list of variables as universally
18
;; quantified variables.
21
(declare (xargs :guard (and (var-list vars) (wff f))))
24
(list 'all (car vars) (alls (cdr vars) f))))
26
(defthm alls-vars-f-wff
27
(implies (and (var-list vars)
31
(defthm subst-alls-commute
32
(implies (and (not (member-equal x vars))
34
(equal (subst-free (alls vars f) x e)
35
(alls vars (subst-free f x e)))))
37
(defthm remove-vars-alls
38
(implies (and (domain-term e)
40
(not (member-equal x a))
41
(not (remove-equal x (free-vars (alls a f)))))
42
(not (free-vars (alls a (subst-free f x e)))))
44
:use ((:instance vars-alls-free (f (alls a f)))))))
46
(defthm alls-preserves-closedness
47
(implies (not (free-vars f))
48
(not (free-vars (alls v f))))
53
(implies (and (consp vars)
55
(wfall (alls vars f))))
58
(implies (and (consp vars)
60
(wfquant (alls vars f))))
62
(defun remove-leading-alls (f)
63
(declare (xargs :guard (wff f)))
65
(remove-leading-alls (a2 f))
68
(defthm remove-leading-alls-preserves-wff
70
(wff (remove-leading-alls f))))
72
(defun leading-alls (f)
73
(declare (xargs :guard (wff f)))
75
(cons (a1 f) (leading-alls (a2 f)))
78
(defthm lead-alls-var-list
79
(var-list (leading-alls f)))
81
(defthm alls-lead-remove-f-is-f
82
(equal (alls (leading-alls f) (remove-leading-alls f)) f))
84
(defun remove-leading-quants (f)
85
(declare (xargs :guard (wff f)))
87
(remove-leading-quants (a2 f))
90
(defun leading-quants (f)
91
(declare (xargs :guard (wff f)))
93
(cons (a1 f) (leading-quants (a2 f)))
96
;;--------------------
98
(defthm leading-all-is-quantified-var
99
(implies (not (member-equal x (quantified-vars f)))
100
(not (member-equal x (leading-alls f)))))
102
(defthm setp-qvars-leading-alls
103
(implies (setp (quantified-vars f))
104
(setp (leading-alls f))))
106
(defthm varset-qvars-leading-alls
107
(implies (var-set (quantified-vars f))
108
(var-set (leading-alls f))))
111
;; Prove that the universal closure of a formula is closed.
112
;; First prove thw two key properties, then do a resolution
113
;; step to get the result in terms of member-equal, then
114
;; get it in the desired form.
116
(defthm alls-eliminates-free-vars
117
(implies (member-equal x vars)
118
(not (member-equal x (free-vars (alls vars f))))))
120
(defthm alls-doesnt-introduce-free-vars
121
(implies (not (member-equal x (free-vars f)))
122
(not (member-equal x (free-vars (alls vars f))))))
124
(defthm universal-closure-is-closed-almost-in-final-form
125
(not (member-equal x (free-vars (alls (free-vars f) f))))
127
:use ((:instance alls-eliminates-free-vars
128
(x x) (f f) (vars (free-vars f)))
129
(:instance alls-doesnt-introduce-free-vars
130
(x x) (f f) (vars (free-vars f))))
133
(defmacro universal-closure (f)
134
(list 'alls (list 'free-vars f) f))
136
(defthm universal-closure-is-closed
137
(not (free-vars (universal-closure f)))
139
:use ((:instance consp-has-member-equal
140
(x (free-vars (alls (free-vars f) f))))))))
142
;;-------------------------------------
143
;; Eval inductions on variables. These functions give useful induction
144
;; schemes for proving soundness theorems about universal closures,
145
;; in particular about formulas (alls vars f), with evaluation function xeval.
146
;; Think of the two arguments "vars f" as "(alls vars f)".
148
(defun var-induct (vars f dom i)
149
(declare (xargs :measure (cons (+ 1 (acl2-count vars)) (acl2-count dom))
150
:guard (and (var-list vars) (wff f)
151
(domain-term-list (fringe dom)))))
155
(var-induct (cdr vars) (subst-free f (car vars) dom) (domain i) i)
156
(cons (var-induct vars f (car dom) i)
157
(var-induct vars f (cdr dom) i)))))
159
;; This induction scheme goes through two formulas together.
161
(defun var-induct-2 (vars f g dom i)
162
(declare (xargs :measure (cons (+ 1 (acl2-count vars)) (acl2-count dom))
163
:guard (and (var-list vars) (wff f) (wff g)
164
(domain-term-list (fringe dom)))))
168
(var-induct-2 (cdr vars)
169
(subst-free f (car vars) dom)
170
(subst-free g (car vars) dom)
172
(cons (var-induct-2 vars f g (car dom) i)
173
(var-induct-2 vars f g (cdr dom) i)))))
175
;-------------------------
177
(defthm not-free-feval-same
178
(implies (and (variable-term x)
179
(not (member-equal x (free-vars f))))
180
(equal (feval-d (list 'all x f) dom i)
185
:in-theory (enable not-free-not-change-2))))
187
(defthm feval-alls-true
188
(implies (var-list vars)
189
(feval (alls vars 'true) i)))
191
(defthm feval-alls-false
192
(implies (var-list vars)
193
(not (feval (alls vars 'false) i))))