File: alloy-support.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 (106 lines) | stat: -rw-r--r-- 3,060 bytes parent folder | download | duplicates (5)
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
;UTILITY forms for the Alloy Comparision.
 
(in-package "ACL2")
(include-book "std/osets/top" :dir :system)


;get macro
(defmacro g (k r)
  `(mget ,k ,r))

;set macro
(defmacro s (k v r)
  `(mset ,k ,v ,r))

(defun up-macro (pairs ans)
  (if (endp pairs)
      ans
    (up-macro (cddr pairs) `(s ,(car pairs)
                               ,(cadr pairs)
                               ,ans))))
(defmacro up (st &rest pairs)
  "do the update in the sequence of pairs"
  (up-macro pairs st))
(defmacro s- (A B)
  `(set::difference ,A ,B))
(defmacro s+ (A B)
  `(set::union ,A ,B))


(defthm non-nil-=>-not-empty
  (implies (and (set::setp v)
                (not (equal v nil)))
           (not (set::empty v)))
  :hints (("Goal" :in-theory (enable set::empty)))
  :rule-classes :forward-chaining)

(include-book "defexec/other-apps/records/records" :dir :system)

(defthm simple-record-lemma
  (implies (equal (mget a r) v)
           (equal (mset a v r) r)))

(defthm simpler-record-lemma
  (implies (not (mget a r))
           (equal (mset a nil r) r)))

(defun dom (R)
  ;R is a binary relation, gives its domain
  (strip-cars R))

;Let R be a binary relation A -> B where B has some overlap with A,
;let a in A, find all x in A, where a -^^-> x. Here i
;keeps track of members of domain of map not yet reached/seen from 
;a via R. At the worst a can reach every member of dom(R), therefore
;we set i initially as = cardinality of dom(R)
;seen is the members of dom(R) reach function has seen (first arg)
(include-book "ordinals/lexicographic-ordering-without-arithmetic" :dir :system)
(set-well-founded-relation l<)

(defuns
  (reach (a R i seen)
    (declare (xargs :measure (list (nfix i) (acl2-count a))))
    (if (zp i)
      (mv i seen)
      (let* ((bs (g a R))
             (bs (if (atom bs) (list bs) bs))
             (bs-not-seen (set::difference bs seen)))
        (if (consp bs-not-seen)
          (reach-lst bs-not-seen R (- i (len bs-not-seen)) 
                     (set::union bs-not-seen seen))
          (mv i seen)))))
  (reach-lst (as R i seen)
    (declare (xargs :measure (list (nfix i) (acl2-count as))))
    (if (endp as)
      (mv i seen)
      (mv-let (i1 seen1)
              (reach (car as) R i seen)
              (if (> (nfix i1) (nfix i)) ;not possible
                  (reach-lst (cdr as) R i seen1) 
                (reach-lst (cdr as) R i1 seen1)))))) 


(defun reachable (a R)
  (mv-let (i reached)
          (reach a R (len (dom R)) nil)
          (declare (ignore i))
          reached))

(defun delete-entries (map keys)
  (if (endp keys)
    map
    (if (g (car keys) map)
      (delete-entries (s (car keys) nil map) (cdr keys))
      (delete-entries map (cdr keys)))))

;jared's oset implementation
(defun set::non-empty-setp (x)
  (declare (xargs :guard t))
  (and (set::setp x)
       (not (set::empty x))))
(include-book "acl2s/defdata/top" :dir :system)
(defdata::register-data-constructor (SET::non-empty-setp SET::insert)
  ((acl2s::allp SET::head) (set::setp SET::tail))
  :proper nil
  :rule-classes nil)