7
PATH=/projects/hvg/SULFA/linux-bin:$PATH
9
/projects/hvg/SULFA/acl2/saved_acl2
13
;(include-book "/projects/hvg/SULFA/books/sat/sat")
14
;(include-book "/projects/hvg/SULFA/books/sat/sat-setup")
15
;(include-book "/projects/hvg/SULFA/books/clause-processors/sat-clause-processor")
21
(append (rv (cdr x)) (list (car x)))))
29
(usepath (cdr p) (nth (car p) x))))
32
(getprop (car x) 'recursivep nil 'current-acl2-world (w state)))
35
; find the left innermost recursive term in x
36
; returns (path err state)
38
(defun find-rec (x state)
41
(mv-let (p err state) (find-rec-l (cdr x) 1 state)
47
(defun find-rec-l (x n state)
50
(mv-let (p err state) (find-rec (car x) state)
52
(find-rec-l (cdr x) (1+ n) state)
53
(mv (cons n p) nil state))))))
58
(if (equal (car (cadr (car x)))
63
(defun getdef (x state)
65
(getprop (car x) 'lemmas nil 'current-acl2-world (w state)))
74
(defun bind (pat tgt b)
75
(let ((a (assoc pat b)))
77
(if (equal (cadr a) tgt)
80
(mv (cons (list pat tgt) b) nil))))
85
(if (equal x (caar l))
96
(inst-l (cdr tm) bind)))))
97
(defun inst-l (tm bind)
100
(cons (inst (car tm) bind)
101
(inst-l (cdr tm) bind)))))
103
(defun inst-ll (l bind)
106
(cons (inst-l (car l) bind)
107
(inst-ll (cdr l) bind))))
116
(defun pmatch (pat tgt b)
119
(mv b (not (equal pat tgt)))
120
(mv-let (b err) (bind pat tgt b)
124
(if (or (not (consp tgt))
125
(not (eq (car pat) (car tgt))))
127
(if (equal (car pat) 'quote)
128
(mv b (not (equal (cadr pat) (cadr tgt))))
129
(pmatch-l (cdr pat) (cdr tgt) b)))))
130
(defun pmatch-l (pat tgt b)
132
(if (eq pat tgt) (mv b nil) (mv nil t))
135
(mv-let (b1 err) (pmatch (car pat) (car tgt) b)
138
(pmatch-l (cdr pat) (cdr tgt) b1)))))))
140
(defun rwrite (tm rl)
143
(mv-let (bind err) (pmatch lhs tm nil)
146
(mv (inst rhs bind) nil)))))
148
(defun add-disj (d x)
152
(list (cons d (caar x)) (cadar x))
153
(add-disj d (cdr x)))))
156
(defun contains-call (rl x)
159
(if (member-eq (car x) rl)
161
(contains-call-l rl (cdr x)))))
162
(defun contains-call-l (rl x)
165
(or (contains-call rl (car x))
166
(contains-call-l rl (cdr x))))))
168
; we assume x is the body of a recursive function which
169
; is composed of an if tree with terms at the leaves
170
; rl is the list of recursive functions for this
172
(defun get-cases1 (x rl)
174
(mv (list (list nil x)) 1)
175
(if (equal (car x) 'if)
176
(mv-let (c b) (get-cases1 (caddr x) rl)
177
(mv-let (c2 b2) (get-cases1 (cadddr x) rl)
179
(mv (append (add-disj (cadr x) c2)
180
(add-disj `(not ,(cadr x)) c))
182
(mv (append (add-disj `(not ,(cadr x)) c)
183
(add-disj (cadr x) c2))
185
(mv (list (list nil x)) (if (contains-call rl x) 0 1)))))
187
(defun get-cases (x rl)
188
(mv-let (c b) (get-cases1 x rl) (declare (ignore b))
192
(defun decidable (x state)
197
(decidable-l (cdr x) state))))
198
(defun decidable-l (x state)
202
(decidable (car x) state)
203
(decidable-l (cdr x) state)))))
206
(defun replace-at (p nt x)
211
(update-nth (car p) (replace-at (cdr p) nt (nth (car p) x)) x))))
214
; l is a list of tuples (c r) where c is a clause and r is the new value
215
; for x at p under that clause
216
; we create a new clause that replaces r at p in x for each tuple
217
(defun new-clauses (p l x)
221
(append (caar l) (replace-at p (cadar l) x))
222
(new-clauses p (cdr l) x))))
227
(defun refute (x depth sat::$sat state)
228
(declare (xargs :stobjs sat::$sat :mode :program))
229
(if (decidable-l x state)
230
(acl2::sat x nil sat::$sat state)
232
(mv nil nil sat::$sat state)
233
(mv-let (p err state) (find-rec-l x 0 state) (declare (ignore err))
234
(mv-let (def state) (getdef (usepath p x) state)
235
(mv-let (x2 err) (rwrite (usepath p x) def) (declare (ignore err))
236
(let ((rn (recp (usepath p x) state)))
237
(let ((xl (get-cases x2 rn)))
238
(refute-l (new-clauses p xl x) (1- depth) sat::$sat state)))))))))
239
(defun refute-l (x depth sat::$sat state)
240
(declare (xargs :stobjs sat::$sat :mode :program))
242
(mv nil nil sat::$sat state)
243
(mv-let (r nop sat::$sat state)
244
(refute (car x) depth sat::$sat state) (declare (ignore nop))
246
(mv r nil sat::$sat state)
247
(refute-l (cdr x) depth sat::$sat state))))))
253
(defun refute4 (x depth sat::$sat state)
254
(declare (xargs :stobjs sat::$sat :mode :program))
255
(let ((nop (cw "~x0~%" x))) (declare (ignore nop))
256
(refute x depth sat::$sat state)))
261
(defun refute5 (x depth state)
262
(declare (xargs :mode :program))
263
(if (decidable-l x state)
264
(mv-let (err r state) (bash-term-to-dnf2 `(or ,@x) nil nil state) (declare (ignore err))
268
(mv-let (p err state) (find-rec-l x 0 state) (declare (ignore err))
269
(mv-let (def state) (getdef (usepath p x) state)
270
(mv-let (x2 err) (rwrite (usepath p x) def) (declare (ignore err))
271
(let ((rn (recp (usepath p x) state)))
272
(let ((xl (get-cases x2 rn)))
273
(refute5-l (new-clauses p xl x) (1- depth) state)))))))))
274
(defun refute5-l (x depth state)
275
(declare (xargs :mode :program))
278
(mv-let (r nop state)
279
(refute5 (car x) depth state) (declare (ignore nop))
282
(refute5-l (cdr x) depth state))))))
284
(defun refute6 (x depth state)
285
(declare (xargs :mode :program))
286
(let ((nop (cw "~x0~%" x))) (declare (ignore nop))
287
(refute5 x depth state)))
290
`(let ((nop (cw "~%ATTEMPTING TO REFUTE~%~%~x0~%~%" ',x))) (declare (ignore nop))
291
(mv-let (err r state)
292
(refute5 (list ',x) 6 state)
295
(let ((nop (cw "CEX~%~%~x0~%~%REFUTED~%" err))) (declare (ignore nop))
297
(let ((nop (cw "NO CEX FOUND~%"))) (declare (ignore nop))
298
(mv nil nil state))))))