3
(defun syn::len (n list)
4
(declare (type (integer 0 *) n))
5
(acl2::if (acl2::consp list)
6
(acl2::if (zp n) acl2::nil
7
(len (1- n) (acl2::cdr list)))
8
(acl2::and (acl2::null list) (= n 0))))
12
(syntaxp (acl2::quotep n))
14
(acl2::if (acl2::consp list)
15
(acl2::if (zp n) acl2::nil
16
(len (1- n) (acl2::cdr list)))
17
(acl2::and (acl2::null list) (= n 0))))))
20
(declare (type (integer 0 *) n))
21
(acl2::and (acl2::consp l)
24
(nth (+ -1 n) (acl2::cdr l)))))
28
(syntaxp (acl2::quotep n))
30
(acl2::and (acl2::consp l)
33
(nth (+ -1 n) (acl2::cdr l)))))))
35
(defthm len-implies-true-listp
39
:rule-classes (:forward-chaining))
41
(defthm len-implies-acl2-len
44
(equal (acl2::len list) n))
45
:rule-classes (:linear :forward-chaining))
47
(defun syn::consp (term)
48
(declare (type t term))
51
(equal (acl2::car term) 'acl2::cons)))
53
(defun syn::cons (a b)
54
(declare (type t a b))
57
(defun syn::car (term)
58
(declare (type (satisfies syn::consp) term))
61
(defun syn::cdr (term)
62
(declare (type (satisfies syn::consp) term))
66
(defthm cons-reconstruction
69
(equal (syn::cons (syn::car term) (syn::cdr term))
72
(defun syn::quotep (term)
73
(declare (type t term))
74
(acl2::and (len 2 term)
75
(equal (acl2::car term) 'acl2::quote)))
77
(defun syn::enquote (term)
78
(declare (type t term))
81
(defun syn::dequote (term)
82
(declare (type (satisfies syn::quotep) term))
86
(defthm quote-reconstruction
89
(equal (syn::enquote (syn::dequote term))
92
(defmacro syn::arg (n term)
95
(defun syn::appendp (term)
96
(declare (type t term))
97
(acl2::and (syn::len 3 term)
98
(equal (acl2::car term) 'binary-append)))
100
(defun syn::append (x y)
101
(declare (type t x y))
102
`(acl2::binary-append ,x ,y))
105
(defthm append-reconstruction
108
(equal (syn::append (syn::arg 1 term) (syn::arg 2 term))
111
(defun syn::ifp (term)
112
(declare (type t term))
113
(acl2::and (syn::len 4 term)
114
(equal (acl2::car term) 'acl2::if)))
116
(defun syn::if (a b c)
117
(declare (type t a b c))
118
`(acl2::if ,a ,b ,c))
121
(defthm if-reconstruction
124
(equal (syn::if (syn::arg 1 term) (syn::arg 2 term) (syn::arg 3 term))
128
(declare (xargs :verify-guards t))
129
`(syn::quote acl2::nil))
133
(equal x (syn::nil)))
136
(declare (xargs :verify-guards t))
139
(defun syn::conjoin (x y)
140
(declare (type t x y))
142
((acl2::not (acl2::and x y))
144
((acl2::equal y (syn::true))
146
((acl2::equal x (syn::true))
149
(syn::if x y (syn::nil)))))
151
(defun syn::and-fn (args)
152
(declare (type t args))
153
(acl2::if (acl2::consp args)
154
`(syn::conjoin ,(acl2::car args) ,(syn::and-fn (acl2::cdr args)))
157
(defmacro syn::and (&rest args)
160
(defun syn::funcall (fn args term)
161
(declare (type (integer 0 *) args))
162
(acl2::and (syn::len (1+ args) term)
163
(equal (acl2::car term) fn)))
165
(defmacro syn::apply (fn &rest args)
168
(defevaluator eval eval-list
173
(acl2::binary-append x y)
177
(defmacro extend-eval (name fns)
178
`(defevaluator ,name ,(symbol-fns::suffix name '-list)
183
(acl2::binary-append x y)
188
(defun syn::consp-rec (x)
193
(or (syn::consp-rec (syn::arg 1 x))
194
(syn::consp-rec (syn::arg 2 x))))
196
(acl2::consp (syn::dequote x)))
200
(defthm consp-rec-implies-consp
202
(syn::consp-rec term)
203
(acl2::consp (syn::eval term a))))
205
(defun free-var-bindings (w1 w2 term)
206
(declare (type symbol w1 w2))
207
(acl2::let ((list (symbol-fns::collect-variables term)))
208
(symbol-fns::join-lists (symbol-fns::map-symbol-list-to-package list w1)
209
(symbol-fns::map-symbol-list-to-package list w2))))
211
(defmacro defevthm (ev name thm &rest key-args)
212
`(defthm ,(symbol-fns::prefix ev '- name)
214
:hints (("Goal" :use (:functional-instance
216
,@(free-var-bindings name ev thm))
218
(syn::eval-list ,(symbol-fns::suffix ev '-list)))))
222
(defevthm ev1 foo-bar