/usr/share/acl2-6.5/books/misc/bash.lisp is in acl2-books-source 6.5-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 | ; Copyright (C) 2013, Regents of the University of Texas
; Written by Matt Kaufmann (original date October, 2006)
; License: A 3-clause BSD license. See the LICENSE file distributed with ACL2.
; NOTE: This book includes community book xdoc/top, and was created on top of
; separate book bash-bsd.lisp because xdoc/top had a GPL license. That is no
; longer the case, but for simplicity we keep both books as is. (Perhaps
; someone will want to eliminate bash-bsd.lisp.)
(in-package "ACL2")
(include-book "xdoc/top" :dir :system)
(include-book "bash-bsd")
(defxdoc bash
:parents
(proof-automation)
:short "
<tt>Bash</tt> is a tool that simplifies a term, producing a list of
simplified terms such that if all output terms are theorems, then so is the
input term."
:long "
<p>This utility is defined in community book <tt>\"misc/bash.lisp\"</tt>. If
you submit <tt>(bash term)</tt> then roughly speaking, the result is a list of
goals produced by ACL2's simplification process. That is, ACL2 might
reasonably be expected to produce these goals when simplifying <tt>term</tt>
during a proof attempt. In particular, if the result is <tt>nil</tt>, then
<tt>term</tt> is a theorem. More accurately: <tt>(bash term)</tt> returns an
<see topic=\"@(url ERROR-TRIPLES)\">error triple</see>, <tt>(mv nil val
state)</tt>, where <tt>val</tt> is a list of terms, in
untranslated (user-level) form, whose provability implies the provability of
the input term. If ACL2 cannot simplify the input term (e.g., if there is a
translation error), then it prints a warning and returns <tt>(mv nil input-term
state)</tt>.</p>
<p>For a related utility, see @(see bash-term-to-dnf).</p>
<h3>Examples</h3>
<p>First we execute:
@({(include-book \"misc/bash\" :dir :system)})
Then:
@({
ACL2 !>(bash (equal (append x y) (append (car (cons x a)) z)))
Goal'
((EQUAL (APPEND X Y) (APPEND X Z)))
ACL2 !>(set-gag-mode nil) ; optional; turns off printing of goal names
<state>
ACL2 !>(bash (equal (append x y) (append (car (cons x a)) z)))
((EQUAL (APPEND X Y) (APPEND X Z)))
ACL2 !>(bash (equal (car (cons x y)) x))
NIL
ACL2 !>(bash (implies (true-listp x) (equal (append x y) zzz))
:hints ((\"Goal\" :expand ((true-listp x)
(true-listp (cdr x))
(append x y)))))
((EQUAL Y ZZZ)
(IMPLIES (AND (CONSP X)
(CONSP (CDR X))
(TRUE-LISTP (CDDR X)))
(EQUAL (LIST* (CAR X)
(CADR X)
(APPEND (CDDR X) Y))
ZZZ))
(IMPLIES (AND (CONSP X) (NOT (CDR X)))
(EQUAL (CONS (CAR X) Y) ZZZ)))
ACL2 !>(bash (equal x y))
ACL2 Warning [bash] in BASH: Unable to simplify the input term.
((EQUAL X Y))
ACL2 !>(bash (equal x))
ACL2 Warning [bash] in BASH: Unable to simplify the input term because
an error occurred. Try setting the verbose flag to t in order to see
what is going on.
((EQUAL X))
ACL2 !>(bash (equal x) :verbose t)
ACL2 Error in BASH: EQUAL takes 2 arguments but in the call (EQUAL X)
it is given 1 argument. The formal parameters list for EQUAL is (X Y).
ACL2 Warning [bash] in BASH: Unable to simplify the input term because
an error occurred.
((EQUAL X))
ACL2 !>
})</p>
<p>Here is how we might use this tool to simplify hypotheses. First execute:
@({
(defstub p1 (x) t)
(defstub p2 (x) t)
(defun p3 (x) (if (atom x) (p2 x) (p1 (car x))))
(include-book
\"misc/bash\" :dir :system)
})
Then:
@({
ACL2 !>(bash (implies (and (p1 x) (p3 x))
(hide aaa)))
((IMPLIES (AND (P1 X) (CONSP X) (P1 (CAR X)))
(HIDE AAA))
(IMPLIES (AND (P1 X) (NOT (CONSP X)) (P2 X))
(HIDE AAA)))
ACL2 !>
})</p>
<h3>More details</h3>
<p>This utility is similar to the @(see proof-checker)'s <tt>bash</tt> command,
but for use in the top-level loop. The input term can have user-level syntax;
it need not be translated. The output is an error triple <tt>(mv nil termlist
state)</tt> such that either <tt>termlist</tt> is a one-element list containing
the input term, or else <tt>termlist</tt> is a list of term such that if each
term in this list is a theorem, then the input term is a theorem. In practice,
these terms are produced by calling the prover with non-simplification
processes --- <tt>generalize</tt>, <tt>eliminate-destructors</tt>,
<tt>fertilize</tt> (heuristic use of equalities), and
<tt>eliminate-irrelevance</tt>, as well as induction --- turned off, and with
forcing rounds skipped (at least the first 15 of them). A keyword argument,
<tt>:hints</tt>, can specify @(see hints) using their usual syntax, as with
@(see defthm). The other keyword argument, <tt>:verbose</tt>, is <tt>nil</tt>
by default, to suppress output; use a non-<tt>nil</tt> value if you want
output, including the proof attempt. The keyword values are not evaluated, so
for example <tt>:hints</tt> could be of the form <tt>((\"Goal\" ...))</tt> but
not <tt>'((\"Goal\" ...))</tt>.</p>
<p>We conclude with an note on the use of @(see hints) that may be important if
you use computed hints (see @(see computed-hints)). Consider the following
example, supplied courtesy of Harsh Raju Chamarthi.
@({
(defun drop (n l)
(if (zp n)
l
(drop (1- n) (cdr l))))
(include-book \"misc/bash\" :dir :system)
; Occur-fn returns the term that has fn has its function symbol.
(mutual-recursion
(defun occur-fn (fn term2)
(cond ((variablep term2) nil)
((fquotep term2) nil)
(t (or (and (eq fn (ffn-symb term2)) term2)
(occur-fn-lst fn (fargs term2))))))
(defun occur-fn-lst (fn args2)
(cond ((endp args2) nil)
(t (or (occur-fn fn (car args2))
(occur-fn-lst fn (cdr args2)))))))
; Doesn't work as you might expect (see below):
(bash (drop 3 x)
:verbose t
:hints ((if (occur-fn-lst 'drop clause)
`(:computed-hint-replacement
t
:expand
(,(occur-fn-lst 'drop clause)))
nil)))
})
The preceding call of <tt>bash</tt>, at the end of the displayed list of forms
above, causes the theorem prover to use destructor elimination, even though
that proof process is presumably turned off by <tt>bash</tt>. What happened?
The problem is that the user-supplied hints are put in front of the hints
generated by <tt>bash</tt> to form the full list of hints given to the prover,
which cases the <tt>:do-not</tt> hint on \"Goal\" to be ignored. Here is a
solution.
@({
(bash (drop 3 x)
:verbose t
:hints ((if (occur-fn-lst 'drop clause)
`(:computed-hint-replacement
t
:do-not-induct :bash
:do-not (set-difference-eq *do-not-processes*
'(preprocess simplify))
:expand (,(occur-fn-lst 'drop clause)))
'(:do-not-induct
:bash
:do-not
(set-difference-eq *do-not-processes*
'(preprocess simplify))))))
})</p>")
(defxdoc bash-term-to-dnf
:parents
(proof-automation)
:short "
<tt>Bash-term-to-dnf</tt> is a tool that simplifies a term, producing a list of
clauses such that if all output clauses are theorems, then so is the input
term."
:long "
<p>This utility is defined in community book <tt>\"misc/bash.lisp\"</tt>. We
assume here familiarity with the @('bash') tool defined in that book, focusing
below on how the present tool differs from that one.</p>
<p>If you submit <tt>(bash-term-to-dnf term)</tt> then the result is a list of
goals produced by ACL2's simplification process, much as for the result of
<tt>(bash term)</tt>; see @('bash'). However, unlike <tt>bash</tt>,
<tt>bash-term-to-dnf</tt> returns a list of <i>clauses</i>, where each clause
is a list of terms that represents the disjunction of those terms, and the list
of clauses is implicitly conjoined.</p>
<p>Again: For a related utility, see @('bash').</p>
<h3>Example</h3>
<p>First we execute:
@({(include-book \"misc/bash\" :dir :system)})
Then:
@({
ACL2 !>(bash-term-to-dnf
'(implies (true-listp x) (equal (append x y) zzz))
'((\"Goal\" :expand ((true-listp x)
(true-listp (cdr x))
(append x y))))
nil t state)
(((EQUAL Y ZZZ))
((NOT (CONSP X))
(NOT (CONSP (CDR X)))
(NOT (TRUE-LISTP (CDDR X)))
(EQUAL (LIST* (CAR X)
(CADR X)
(APPEND (CDDR X) Y))
ZZZ))
((NOT (CONSP X))
(CDR X)
(EQUAL (CONS (CAR X) Y) ZZZ)))
ACL2 !>
})</p>
<h3>General Form:</h3>
<p>@({(bash-term-to-dnf form hints verbose untranslate-flg state)})
returns a list of clauses, each of which is a list of terms, where:
<ul>
<li><tt>form</tt> is a user-level (untranslated) term;</li>
<li><tt>hints</tt>, if supplied, is a @(see hints) structure (as for
@('defthm'));</li>
<li><tt>verbose</tt> is <tt>nil</tt> by default, in which case output is
inhibited; on the other extreme, if <tt>verbose</tt> is <tt>:all</tt> then a
warning is printed when no simplification takes place; and</li>
<li><tt>untranslate-flg</tt> is <tt>nil</tt> by default, in which case each
term in each returned clause is a term in internal (translated) form and
otherwise, each such term is in user-level (untranslated) form;</li>
</ul>
If each returned clause (viewed as a disjunction) is a theorem, then the input
<tt>form</tt> is a theorem.</p>"
)
|