other
(in-package "ACL2")
other
(deflabel alist-defuns-section)
bindfunction
(defun bind (x y a) "The alist derived from A by binding X to Y." (declare (xargs :guard (and (alistp a) (eqlablep x)))) (cond ((endp a) (list (cons x y))) ((eql x (car (car a))) (cons (cons x y) (cdr a))) (t (cons (car a) (bind x y (cdr a))))))
bind-eqfunction
(defun bind-eq (x y a) "The alist derived from A by binding X to Y." (declare (xargs :guard (and (alistp a) (symbolp x)))) (cond ((endp a) (list (cons x y))) ((eq x (car (car a))) (cons (cons x y) (cdr a))) (t (cons (car a) (bind-eq x y (cdr a))))))
bind-equalfunction
(defun bind-equal (x y a) "The alist derived from A by binding X to Y." (declare (xargs :guard (alistp a))) (cond ((endp a) (list (cons x y))) ((equal x (car (car a))) (cons (cons x y) (cdr a))) (t (cons (car a) (bind-equal x y (cdr a))))))
bind-allfunction
(defun bind-all (keys vals a) "The alist whose domain is A's range, and whose range is A's domain." (declare (xargs :guard (and (true-listp vals) (eqlable-listp keys) (eqlable-alistp a)))) (cond ((endp keys) a) ((endp vals) a) (t (bind (car keys) (car vals) (bind-all (cdr keys) (cdr vals) a)))))
bind-all-eqfunction
(defun bind-all-eq (keys vals a) "The alist whose domain is A's range, and whose range is A's domain." (declare (xargs :guard (and (true-listp vals) (symbol-listp keys) (symbol-alistp a)))) (cond ((endp keys) a) ((endp vals) a) (t (bind-eq (car keys) (car vals) (bind-all-eq (cdr keys) (cdr vals) a)))))
bind-all-equalfunction
(defun bind-all-equal (keys vals a) "The alist whose domain is A's range, and whose range is A's domain." (declare (xargs :guard (and (true-listp keys) (true-listp vals) (alistp a)))) (cond ((endp keys) a) ((endp vals) a) (t (bind-equal (car keys) (car vals) (bind-all-equal (cdr keys) (cdr vals) a)))))
bindingfunction
(defun binding (x a) "The value bound to X in alist A." (declare (xargs :guard (and (alistp a) (or (eqlablep x) (eqlable-alistp a))))) (cdr (assoc x a)))
binding-eqfunction
(defun binding-eq (x a) "The value bound to X in alist A." (declare (xargs :guard (and (alistp a) (or (symbolp x) (symbol-alistp a))))) (cdr (assoc-eq x a)))
binding-equalfunction
(defun binding-equal (x a) "The value bound to X in alist A." (declare (xargs :guard (alistp a))) (cdr (assoc-equal x a)))
bound?function
(defun bound? (x a) "The value bound to X in alist A." (declare (xargs :guard (and (alistp a) (or (eqlablep x) (eqlable-alistp a))))) (consp (assoc x a)))
bound?-eqfunction
(defun bound?-eq (x a) "The value bound to X in alist A." (declare (xargs :guard (and (alistp a) (or (symbolp x) (symbol-alistp a))))) (consp (assoc-eq x a)))
bound?-equalfunction
(defun bound?-equal (x a) "The value bound to X in alist A." (declare (xargs :guard (alistp a))) (consp (assoc-equal x a)))
all-bound?function
(defun all-bound? (l a) "Are all elements of list L bound in alist A?" (declare (xargs :guard (and (true-listp l) (alistp a) (or (eqlable-listp l) (eqlable-alistp a))))) (cond ((endp l) t) (t (and (bound? (car l) a) (all-bound? (cdr l) a)))))
all-bound?-eqfunction
(defun all-bound?-eq (l a) "Are all elements of list L bound in alist A?" (declare (xargs :guard (and (true-listp l) (alistp a) (or (symbol-listp l) (symbol-alistp a))))) (cond ((endp l) t) (t (and (bound?-eq (car l) a) (all-bound?-eq (cdr l) a)))))
all-bound?-equalfunction
(defun all-bound?-equal (l a) "Are all elements of list L bound in alist A?" (declare (xargs :guard (and (true-listp l) (alistp a)))) (cond ((endp l) t) (t (and (bound?-equal (car l) a) (all-bound?-equal (cdr l) a)))))
all-bindingsfunction
(defun all-bindings (l a) "The list of bindings of elements of list L in alist A." (declare (xargs :guard (and (true-listp l) (alistp a) (or (eqlable-listp l) (eqlable-alistp a))))) (cond ((endp l) nil) ((bound? (car l) a) (cons (binding (car l) a) (all-bindings (cdr l) a))) (t (all-bindings (cdr l) a))))
all-bindings-eqfunction
(defun all-bindings-eq (l a) "The list of bindings of elements of list L in alist A." (declare (xargs :guard (and (true-listp l) (alistp a) (or (symbol-listp l) (symbol-alistp a))))) (cond ((endp l) nil) ((bound?-eq (car l) a) (cons (binding-eq (car l) a) (all-bindings-eq (cdr l) a))) (t (all-bindings-eq (cdr l) a))))
all-bindings-equalfunction
(defun all-bindings-equal (l a) "The list of bindings of elements of list L in alist A." (declare (xargs :guard (and (true-listp l) (alistp a)))) (cond ((endp l) nil) ((bound?-equal (car l) a) (cons (binding-equal (car l) a) (all-bindings-equal (cdr l) a))) (t (all-bindings-equal (cdr l) a))))
domainfunction
(defun domain (a) "The list of CARs of an alist." (declare (xargs :guard (alistp a))) (strip-cars a))
domain-restrictfunction
(defun domain-restrict (l a) "An alist containing only those pairs in A whose CAR is in L." (declare (xargs :guard (and (eqlable-listp l) (eqlable-alistp a)))) (cond ((endp a) nil) ((member (car (car a)) l) (cons (car a) (domain-restrict l (cdr a)))) (t (domain-restrict l (cdr a)))))
domain-restrict-eqfunction
(defun domain-restrict-eq (l a) "An alist containing only those pairs in A whose CAR is in L." (declare (xargs :guard (and (symbol-listp l) (symbol-alistp a)))) (cond ((endp a) nil) ((member-eq (car (car a)) l) (cons (car a) (domain-restrict-eq l (cdr a)))) (t (domain-restrict-eq l (cdr a)))))
domain-restrict-equalfunction
(defun domain-restrict-equal (l a) "An alist containing only those pairs in A whose CAR is in L." (declare (xargs :guard (and (true-listp l) (alistp a)))) (cond ((endp a) nil) ((member-equal (car (car a)) l) (cons (car a) (domain-restrict-equal l (cdr a)))) (t (domain-restrict-equal l (cdr a)))))
rangefunction
(defun range (a) "The list of CDRs of an alist." (declare (xargs :guard (alistp a))) (strip-cdrs a))
rembindfunction
(defun rembind (x a) "The alist derived from A by removing any binding of X." (declare (xargs :guard (and (alistp a) (or (eqlablep x) (eqlable-alistp a))))) (cond ((endp a) nil) ((eql x (car (car a))) (rembind x (cdr a))) (t (cons (car a) (rembind x (cdr a))))))
rembind-eqfunction
(defun rembind-eq (x a) "The alist derived from A by removing any binding of X." (declare (xargs :guard (and (alistp a) (or (symbolp x) (symbol-alistp a))))) (cond ((endp a) nil) ((eq x (car (car a))) (rembind-eq x (cdr a))) (t (cons (car a) (rembind-eq x (cdr a))))))
rembind-equalfunction
(defun rembind-equal (x a) "The alist derived from A by removing any binding of X." (declare (xargs :guard (alistp a))) (cond ((endp a) nil) ((equal x (car (car a))) (rembind-equal x (cdr a))) (t (cons (car a) (rembind-equal x (cdr a))))))
rembind-allfunction
(defun rembind-all (l a) (declare (xargs :guard (and (eqlable-listp l) (eqlable-alistp a)))) (cond ((endp l) a) (t (rembind (car l) (rembind-all (cdr l) a)))))
rembind-all-eqfunction
(defun rembind-all-eq (l a) (declare (xargs :guard (and (symbol-listp l) (symbol-alistp a)))) (cond ((endp l) a) (t (rembind-eq (car l) (rembind-all-eq (cdr l) a)))))
rembind-all-equalfunction
(defun rembind-all-equal (l a) (declare (xargs :guard (and (true-listp l) (alistp a)))) (cond ((endp l) a) (t (rembind-equal (car l) (rembind-all-equal (cdr l) a)))))
collect-boundfunction
(defun collect-bound (l a) "Collect the sublist of L bound in A." (declare (xargs :guard (and (eqlable-listp l) (eqlable-alistp a)))) (cond ((endp l) nil) ((bound? (car l) a) (cons (car l) (collect-bound (cdr l) a))) (t (collect-bound (cdr l) a))))
collect-bound-eqfunction
(defun collect-bound-eq (l a) "Collect the sublist of L bound in A." (declare (xargs :guard (and (symbol-listp l) (symbol-alistp a)))) (cond ((endp l) nil) ((bound?-eq (car l) a) (cons (car l) (collect-bound-eq (cdr l) a))) (t (collect-bound-eq (cdr l) a))))
collect-bound-equalfunction
(defun collect-bound-equal (l a) "Collect the sublist of L bound in A." (declare (xargs :guard (and (true-listp l) (alistp a)))) (cond ((endp l) nil) ((bound?-equal (car l) a) (cons (car l) (collect-bound-equal (cdr l) a))) (t (collect-bound-equal (cdr l) a))))
bind-pairsfunction
(defun bind-pairs (a1 a2) (declare (xargs :guard (and (eqlable-alistp a1) (eqlable-alistp a2)))) (cond ((endp a1) a2) (t (bind (caar a1) (cdar a1) (bind-pairs (cdr a1) a2)))))
bind-pairs-eqfunction
(defun bind-pairs-eq (a1 a2) (declare (xargs :guard (and (symbol-alistp a1) (symbol-alistp a2)))) (cond ((endp a1) a2) (t (bind-eq (caar a1) (cdar a1) (bind-pairs-eq (cdr a1) a2)))))
bind-pairs-equalfunction
(defun bind-pairs-equal (a1 a2) (declare (xargs :guard (and (alistp a1) (alistp a2)))) (cond ((endp a1) a2) (t (bind-equal (caar a1) (cdar a1) (bind-pairs-equal (cdr a1) a2)))))
alist-compose-domainfunction
(defun alist-compose-domain (dom a1 a2) "X is bound to Z in (ALIST-COMPOSE-DOMAIN DOM A1 A2) if X occurs in DOM, X is bound in A1, and there exists a Y such that (BINDING X A1) = Y, and (BINDING Y A2) = Z." (declare (xargs :guard (and (eqlable-listp dom) (eqlable-alistp a1) (eqlable-alistp a2)) :verify-guards nil)) (cond ((endp dom) nil) (t (let ((pair1 (assoc (car dom) a1))) (if pair1 (let ((pair2 (assoc (cdr pair1) a2))) (if pair2 (bind (car dom) (cdr pair2) (alist-compose-domain (cdr dom) a1 a2)) (alist-compose-domain (cdr dom) a1 a2))) (alist-compose-domain (cdr dom) a1 a2))))))
local
(local (defthm alistp-alist-compose-domain (implies (alistp a1) (alistp (alist-compose-domain dom a1 a2)))))
local
(local (defthm eqlable-alistp-alist-compose-domain (implies (and (eqlable-listp dom) (alistp a1)) (eqlable-alistp (alist-compose-domain dom a1 a2)))))
local
(local (defthm eqlable-alistp-bind (implies (and (eqlablep x) (eqlable-alistp a)) (eqlable-alistp (bind x y a)))))
local
(local (defthm assoc-consp-or-nil (implies (alistp a) (or (consp (assoc x a)) (equal (assoc x a) nil))) :rule-classes :type-prescription))
other
(verify-guards alist-compose-domain)
alist-composefunction
(defun alist-compose (a1 a2) "X is bound to Z in (ALIST-COMPOSE A1 A2) if X is bound in A1, and there exists a Y such that (BINDING X A1) = Y, and (BINDING Y A2) = Z." (declare (xargs :guard (and (eqlable-alistp a1) (eqlable-alistp a2)))) (alist-compose-domain (domain a1) a1 a2))
alist-compose-domain-eqfunction
(defun alist-compose-domain-eq (dom a1 a2) "X is bound to Z in (ALIST-COMPOSE-DOMAIN DOM A1 A2) if X occurs in DOM, X is bound in A1, and there exists a Y such that (BINDING X A1) = Y, and (BINDING Y A2) = Z." (declare (xargs :guard (and (symbol-listp dom) (symbol-alistp a1) (symbol-alistp a2)) :verify-guards nil)) (cond ((endp dom) nil) (t (let ((pair1 (assoc-eq (car dom) a1))) (if pair1 (let ((pair2 (assoc-eq (cdr pair1) a2))) (if pair2 (bind-eq (car dom) (cdr pair2) (alist-compose-domain-eq (cdr dom) a1 a2)) (alist-compose-domain-eq (cdr dom) a1 a2))) (alist-compose-domain-eq (cdr dom) a1 a2))))))
local
(local (defthm alistp-alist-compose-domain-eq (implies (alistp a1) (alistp (alist-compose-domain-eq dom a1 a2)))))
local
(local (defthm symbol-alistp-alist-compose-domain-eq (implies (and (symbol-listp dom) (alistp a1)) (symbol-alistp (alist-compose-domain-eq dom a1 a2)))))
local
(local (defthm symbol-alistp-bind-equal (implies (and (symbolp x) (symbol-alistp a)) (symbol-alistp (bind-equal x y a)))))
other
(verify-guards alist-compose-domain-eq)
alist-compose-eqfunction
(defun alist-compose-eq (a1 a2) "X is bound to Z in (ALIST-COMPOSE A1 A2) if X is bound in A1, and there exists a Y such that (BINDING X A1) = Y, and (BINDING Y A2) = Z." (declare (xargs :guard (and (symbol-alistp a1) (symbol-alistp a2)))) (alist-compose-domain-eq (domain a1) a1 a2))
alist-compose-domain-equalfunction
(defun alist-compose-domain-equal (dom a1 a2) "X is bound to Z in (ALIST-COMPOSE-DOMAIN DOM A1 A2) if X occurs in DOM, X is bound in A1, and there exists a Y such that (BINDING X A1) = Y, and (BINDING Y A2) = Z." (declare (xargs :guard (and (true-listp dom) (alistp a1) (alistp a2)) :verify-guards nil)) (cond ((endp dom) nil) (t (let ((pair1 (assoc-equal (car dom) a1))) (if pair1 (let ((pair2 (assoc-equal (cdr pair1) a2))) (if pair2 (bind-equal (car dom) (cdr pair2) (alist-compose-domain-equal (cdr dom) a1 a2)) (alist-compose-domain-equal (cdr dom) a1 a2))) (alist-compose-domain-equal (cdr dom) a1 a2))))))
local
(local (defthm alistp-alist-compose-domain-equal (implies (alistp a1) (alistp (alist-compose-domain-equal dom a1 a2)))))
local
(local (defthm assoc-equal-consp-or-nil (implies (alistp a) (or (consp (assoc-equal x a)) (equal (assoc-equal x a) nil))) :rule-classes :type-prescription))
alist-compose-equalfunction
(defun alist-compose-equal (a1 a2) "X is bound to Z in (ALIST-COMPOSE A1 A2) if X is bound in A1, and there exists a Y such that (BINDING X A1) = Y, and (BINDING Y A2) = Z." (declare (xargs :guard (and (alistp a1) (alistp a2)))) (alist-compose-domain-equal (domain a1) a1 a2))
other
(deftheory alist-defuns (set-difference-theories (current-theory :here) (current-theory 'alist-defuns-section)))