File: close-input-channel.lisp

package info (click to toggle)
acl2 3.1-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 36,712 kB
  • ctags: 38,396
  • sloc: lisp: 464,023; makefile: 5,470; sh: 86; csh: 47; cpp: 25; ansic: 22
file content (93 lines) | stat: -rw-r--r-- 3,956 bytes parent folder | download
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
;; Processing Unicode Files with ACL2
;; Copyright (C) 2005-2006 by Jared Davis <jared@cs.utexas.edu>
;;
;; This program is free software; you can redistribute it and/or modify it
;; under the terms of the GNU General Public License as published by the Free
;; Software Foundation; either version 2 of the License, or (at your option)
;; any later version.
;;
;; This program is distributed in the hope that it will be useful but WITHOUT
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
;; more details.
;;
;; You should have received a copy of the GNU General Public License along with
;; this program; if not, write to the Free Software Foundation, Inc., 59 Temple
;; Place - Suite 330, Boston, MA 02111-1307, USA.

(in-package "ACL2")

(local (include-book "update-state"))
(local (include-book "open-input-channels"))

(local (defthm assoc-eq-is-assoc-equal
         (equal (assoc-eq a x)
                (assoc-equal a x))))

(local (defthm update-read-files-state
  (implies (state-p1 state)
           (equal (state-p1 (update-read-files updates state))
                  (read-file-listp updates)))))

(local (defthm update-read-files-lemma
  (implies (read-files-p read-files)
           (equal (read-file-listp (cons entry read-files))
                  (read-file-listp1 entry)))))

(local (defthm some-header-part-is-string
  (implies (open-channel1 channel)
           (stringp (caddar channel)))))

(local (defthm some-header-part-is-integer
  (implies (open-channel1 channel)
           (integerp (cadddr (car channel))))))

(local (defthm really-ugly-lemma
  (implies (and (open-channel1 channel)
                (integerp clock)
                (member-equal type *file-types*))
           (read-file-listp1 
            (list (caddar channel) type (cadddr (car channel)) clock)))))

(local (defthm expand-file-clock-p
         (equal (file-clock-p x)
                (natp x))))

(local (defthm file-clock-natural
         (implies (state-p1 state)
                  (and (integerp (file-clock state))
                       (<= 0 (file-clock state))))
         :rule-classes :type-prescription
         :hints(("Goal" :expand (state-p1 state)))))


; I would just use the following lemma as the main theorem, instead of
; replacing it with close-input-channel-state below, but it does not seem to
; work to force the member-equal and open-input-channel-p1 hypotheses when the
; type is a free variable.  So, instead I prove the weirder-looking theorem
; that lets me force without free variables.

(local (defthm close-input-channel-state-lemma
         (implies (and (state-p1 state)
                       (member-equal type *file-types*)
                       (open-input-channel-p1 channel type state))
                  (state-p1 (close-input-channel channel state)))
         :hints(("Goal" :in-theory (disable statep-functions)
                 :use ((:instance state-p1 
                                  (x state))
                       (:instance state-p1 
                                  (x (close-input-channel channel state))))))))

(defthm close-input-channel-state
  (implies (and (force (state-p1 state))
                (force (or (open-input-channel-p1 channel :byte state)
                           (open-input-channel-p1 channel :character state)
                           (open-input-channel-p1 channel :object state))))
           (state-p1 (close-input-channel channel state)))
  :hints(("Goal" :in-theory (disable close-input-channel open-input-channel-p1
                                     state-p1)
          :use ((:instance close-input-channel-state-lemma (type :byte))
                (:instance close-input-channel-state-lemma (type :character))
                (:instance close-input-channel-state-lemma (type :object))))))

(in-theory (disable state-p1 open-input-channel-p1 close-input-channel))