other
(in-package "ACL2")
include-book
(include-book "std/util/defines" :dir :system)
local
(local (include-book "std/lists/sets" :dir :system))
local
(local (defthm member-of-union (iff (member x (union-eq a b)) (or (member x a) (member x b)))))
local
(local (defthm union-eq-associative (equal (union-eq (union-eq a b) c) (union-eq a (union-eq b c)))))
other
(defines simple-term-vars-acc (define simple-term-vars-acc ((x pseudo-termp) (acc symbol-listp)) :returns (vars symbol-listp :hyp (symbol-listp acc)) :verify-guards nil (cond ((atom x) (if (and x (mbt (symbolp x))) (add-to-set-eq x acc) acc)) ((eq (car x) 'quote) acc) (t (simple-term-vars-lst-acc (cdr x) acc)))) (define simple-term-vars-lst-acc ((x pseudo-term-listp) (acc symbol-listp)) :returns (vars symbol-listp :hyp (symbol-listp acc)) (if (atom x) acc (simple-term-vars-lst-acc (cdr x) (simple-term-vars-acc (car x) acc)))) /// (verify-guards simple-term-vars-acc))
other
(defines simple-term-vars :verify-guards nil :flag-local nil (define simple-term-vars ((x pseudo-termp)) :returns (vars symbol-listp) (mbe :logic (cond ((atom x) (and x (mbt (symbolp x)) (list x))) ((eq (car x) 'quote) nil) (t (simple-term-vars-lst (cdr x)))) :exec (simple-term-vars-acc x nil))) (define simple-term-vars-lst ((x pseudo-term-listp)) :returns (vars symbol-listp) (mbe :logic (if (atom x) nil (union-eq (simple-term-vars-lst (cdr x)) (simple-term-vars (car x)))) :exec (simple-term-vars-lst-acc x nil))) /// (local (defun-sk simple-term-vars-acc-is-simple-term-vars-sk (x) (forall acc (equal (simple-term-vars-acc x acc) (union-eq (simple-term-vars x) acc))) :rewrite :direct)) (local (defun-sk simple-term-vars-lst-acc-is-simple-term-vars-lst-sk (x) (forall acc (equal (simple-term-vars-lst-acc x acc) (union-eq (simple-term-vars-lst x) acc))) :rewrite :direct)) (local (in-theory (disable simple-term-vars-acc-is-simple-term-vars-sk simple-term-vars-lst-acc-is-simple-term-vars-lst-sk))) (local (defthm-simple-term-vars-flag (defthm simple-term-vars-acc-is-simple-term-vars-lemma (simple-term-vars-acc-is-simple-term-vars-sk x) :hints ((and stable-under-simplificationp `(:expand (,(CAR (LAST CLAUSE)) (simple-term-vars x) (:free (acc) (simple-term-vars-acc x acc)) (:free (acc) (simple-term-vars-acc nil acc)))))) :flag simple-term-vars :rule-classes nil) (defthm simple-term-vars-lst-acc-is-simple-term-vars-lst-lemma (simple-term-vars-lst-acc-is-simple-term-vars-lst-sk x) :hints ((and stable-under-simplificationp `(:expand (,(CAR (LAST CLAUSE)) (simple-term-vars-lst x) (:free (acc) (simple-term-vars-lst-acc x acc)))))) :flag simple-term-vars-lst :rule-classes nil))) (defthm simple-term-vars-acc-is-simple-term-vars (equal (simple-term-vars-acc x acc) (union-eq (simple-term-vars x) acc)) :hints (("goal" :use simple-term-vars-acc-is-simple-term-vars-lemma))) (defthm simple-term-vars-lst-acc-is-simple-term-vars-lst (equal (simple-term-vars-lst-acc x acc) (union-eq (simple-term-vars-lst x) acc)) :hints (("goal" :use simple-term-vars-lst-acc-is-simple-term-vars-lst-lemma))) (defthm simple-term-vars-lst-of-atom (implies (not (consp x)) (equal (simple-term-vars-lst x) nil)) :rule-classes ((:rewrite :backchain-limit-lst 0))) (defthm-simple-term-vars-flag (defthm true-listp-of-simple-term-vars (true-listp (simple-term-vars x)) :hints ((and stable-under-simplificationp '(:expand ((simple-term-vars x))))) :flag simple-term-vars :rule-classes :type-prescription) (defthm true-listp-of-simple-term-vars-lst (true-listp (simple-term-vars-lst x)) :hints ((and stable-under-simplificationp '(:expand ((simple-term-vars-lst x))))) :flag simple-term-vars-lst :rule-classes :type-prescription)) (local (defthm union-eq-nil (implies (true-listp x) (equal (union-eq x nil) x)))) (verify-guards simple-term-vars) (defthm-simple-term-vars-flag (defthm simple-term-vars-nonnil (not (member nil (simple-term-vars x))) :hints ((and stable-under-simplificationp '(:expand ((simple-term-vars x))))) :flag simple-term-vars) (defthm simple-term-vars-lst-nonnil (not (member nil (simple-term-vars-lst x))) :hints ((and stable-under-simplificationp '(:expand ((simple-term-vars-lst x))))) :flag simple-term-vars-lst)))
other
(defines simple-free-vars-acc (define simple-free-vars-acc ((x pseudo-termp) (bound-vars symbol-listp) (acc symbol-listp)) :returns (vars symbol-listp :hyp :guard) :verify-guards nil (cond ((atom x) (if (and x (mbt (symbolp x)) (not (member-eq x bound-vars))) (add-to-set-eq x acc) acc)) ((eq (car x) 'quote) acc) (t (simple-free-vars-lst-acc (cdr x) bound-vars acc)))) (define simple-free-vars-lst-acc ((x pseudo-term-listp) (bound-vars symbol-listp) (acc symbol-listp)) :returns (vars symbol-listp :hyp :guard) (if (atom x) acc (simple-free-vars-lst-acc (cdr x) bound-vars (simple-free-vars-acc (car x) bound-vars acc)))) /// (verify-guards simple-free-vars-acc))
other
(defines simple-free-vars :verify-guards nil :flag-local nil (define simple-free-vars ((x pseudo-termp) (bound-vars symbol-listp)) :returns (vars symbol-listp :hyp :guard) (mbe :logic (cond ((atom x) (and x (mbt (symbolp x)) (not (member-eq x bound-vars)) (list x))) ((null x) nil) ((eq (car x) 'quote) nil) (t (simple-free-vars-lst (cdr x) bound-vars))) :exec (simple-free-vars-acc x bound-vars nil))) (define simple-free-vars-lst ((x pseudo-term-listp) (bound-vars symbol-listp)) :returns (vars symbol-listp :hyp :guard) (mbe :logic (if (atom x) nil (union-eq (simple-free-vars-lst (cdr x) bound-vars) (simple-free-vars (car x) bound-vars))) :exec (simple-free-vars-lst-acc x bound-vars nil))) /// (local (defun-sk simple-free-vars-acc-is-simple-free-vars-sk (x bound-vars) (forall acc (equal (simple-free-vars-acc x bound-vars acc) (union-eq (simple-free-vars x bound-vars) acc))) :rewrite :direct)) (local (defun-sk simple-free-vars-lst-acc-is-simple-free-vars-lst-sk (x bound-vars) (forall acc (equal (simple-free-vars-lst-acc x bound-vars acc) (union-eq (simple-free-vars-lst x bound-vars) acc))) :rewrite :direct)) (local (in-theory (disable simple-free-vars-acc-is-simple-free-vars-sk simple-free-vars-lst-acc-is-simple-free-vars-lst-sk))) (local (defthm-simple-free-vars-flag (defthm simple-free-vars-acc-is-simple-free-vars-lemma (simple-free-vars-acc-is-simple-free-vars-sk x bound-vars) :hints ((and stable-under-simplificationp `(:expand (,(CAR (LAST CLAUSE)) (simple-free-vars x bound-vars) (:free (acc) (simple-free-vars-acc x bound-vars acc)) (:free (acc) (simple-free-vars-acc nil bound-vars acc)))))) :flag simple-free-vars :rule-classes nil) (defthm simple-free-vars-lst-acc-is-simple-free-vars-lst-lemma (simple-free-vars-lst-acc-is-simple-free-vars-lst-sk x bound-vars) :hints ((and stable-under-simplificationp `(:expand (,(CAR (LAST CLAUSE)) (simple-free-vars-lst x bound-vars) (:free (acc) (simple-free-vars-lst-acc x bound-vars acc)))))) :flag simple-free-vars-lst :rule-classes nil))) (defthm simple-free-vars-acc-is-simple-free-vars (equal (simple-free-vars-acc x bound-vars acc) (union-eq (simple-free-vars x bound-vars) acc)) :hints (("goal" :use simple-free-vars-acc-is-simple-free-vars-lemma))) (defthm simple-free-vars-lst-acc-is-simple-free-vars-lst (equal (simple-free-vars-lst-acc x bound-vars acc) (union-eq (simple-free-vars-lst x bound-vars) acc)) :hints (("goal" :use simple-free-vars-lst-acc-is-simple-free-vars-lst-lemma))) (defthm-simple-free-vars-flag (defthm true-listp-of-simple-free-vars (true-listp (simple-free-vars x bound-vars)) :hints ((and stable-under-simplificationp '(:expand ((simple-free-vars x bound-vars))))) :flag simple-free-vars :rule-classes :type-prescription) (defthm true-listp-of-simple-free-vars-lst (true-listp (simple-free-vars-lst x bound-vars)) :hints ((and stable-under-simplificationp '(:expand ((simple-free-vars-lst x bound-vars))))) :flag simple-free-vars-lst :rule-classes :type-prescription)) (local (defthm union-equal-nil (implies (true-listp x) (equal (union-equal x nil) x)))) (verify-guards simple-free-vars) (defthm-simple-free-vars-flag (defthm simple-free-vars-in-terms-of-simple-term-vars (equal (simple-free-vars x bound-vars) (set-difference-eq (simple-term-vars x) bound-vars)) :hints ('(:expand ((simple-term-vars x)))) :flag simple-free-vars) (defthm simple-free-vars-lst-in-terms-of-simple-term-vars (equal (simple-free-vars-lst x bound-vars) (set-difference-eq (simple-term-vars-lst x) bound-vars)) :hints ('(:expand ((simple-term-vars-lst x)))) :flag simple-free-vars-lst)))