File: insert-text.lisp

package info (click to toggle)
acl2 8.6%2Bdfsg-3
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 1,138,276 kB
  • sloc: lisp: 17,818,294; java: 125,359; python: 28,122; javascript: 23,458; cpp: 18,851; ansic: 11,569; perl: 7,678; xml: 5,591; sh: 3,978; makefile: 3,840; ruby: 2,633; yacc: 1,126; ml: 763; awk: 295; csh: 233; lex: 197; php: 178; tcl: 49; asm: 23; haskell: 17
file content (79 lines) | stat: -rw-r--r-- 2,651 bytes parent folder | download | duplicates (4)
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
; Copyright (C) 2017, Regents of the University of Texas
; Written by Mihir Mehta
; License: A 3-clause BSD license.  See the LICENSE file distributed with ACL2.

(in-package "ACL2")

;  insert-list.lisp                                    Mihir Mehta

(local (include-book "file-system-lemmas"))

(defund
  insert-text (oldtext start text)
  (declare (xargs :guard (and (character-listp oldtext)
                              (natp start)
                              (stringp text))))
  (let*
      ((end (+ start (length text)))
       (newtext (append (make-character-list (take start oldtext))
                        (coerce text 'list)
                        (nthcdr end oldtext))))
    newtext))

(defthm
  insert-text-correctness-1
  (implies (and (character-listp oldtext)
                (natp start)
                (stringp text))
           (character-listp (insert-text oldtext start text)))
  :hints (("goal" :in-theory (enable insert-text))))

(defthm
  insert-text-correctness-2
  (implies
   (and (character-listp oldtext)
        (natp start)
        (stringp text))
   (equal
    (take (+ start (- start)
             (len (coerce text 'list)))
          (nthcdr start (insert-text oldtext start text)))
    (coerce text 'list)))
  :hints (("goal" :in-theory (enable insert-text)
           :use (:theorem (equal (+ start (- start)
                                    (len (coerce text 'list)))
                                 (len (coerce text 'list)))))))

(defthm insert-text-correctness-3
  (implies (and (character-listp oldtext)
                (stringp text)
                (natp start))
           (<= (+ start (len (coerce text 'list)))
               (len (insert-text oldtext start text))))
  :hints (("goal" :in-theory (enable insert-text)))
  :rule-classes :linear)

(defthmd
  len-of-insert-text
  (implies (and (character-listp oldtext)
                (stringp text)
                (natp start))
           (equal (len (insert-text oldtext start text))
                  (max (+ start (len (coerce text 'list)))
                       (len oldtext))))
  :hints (("goal" :do-not-induct t
           :expand (insert-text oldtext start text))))

(defthm
  insert-text-correctness-4
  (implies (and (character-listp oldtext)
                (stringp text)
                (natp start))
           (iff (consp (insert-text oldtext start text))
                (or (> start 0)
                    (> (len (coerce text 'list)) 0)
                    (consp oldtext))))
  :hints
  (("goal" :use len-of-insert-text)
   ("subgoal 4'''" :expand (len (insert-text nil 0 text)))
   ("subgoal 1'4'" :expand (len oldtext))))