other
(in-package "ACL2")
encapsulate
(encapsulate nil (logic) (partial-encapsulate (((constrained-to-df *) => * :formals (x) :guard (rationalp x))) nil (local (defun constrained-to-df (x) (declare (ignore x)) 0)) (defthm rationalp-constrained-to-df (rationalp (constrained-to-df x)) :rule-classes :type-prescription) (defthm constrained-to-df-idempotent (equal (constrained-to-df (constrained-to-df x)) (constrained-to-df x))) (defthm to-df-minus (implies (and (rationalp x) (equal (constrained-to-df x) x)) (equal (constrained-to-df (- x)) (- x)))) (defthm constrained-to-df-default (implies (not (rationalp x)) (equal (constrained-to-df x) 0))) (defthm constrained-to-df-0 (equal (constrained-to-df 0) 0)) (defthm constrained-to-df-monotonicity (implies (and (<= x y) (rationalp x) (rationalp y)) (<= (constrained-to-df x) (constrained-to-df y))) :rule-classes (:linear :rewrite))))
to-dffunction
(defun to-df (x) (declare (xargs :guard (rationalp x) :mode :logic)) (constrained-to-df x))
rationalp-to-dftheorem
(defthm rationalp-to-df (rationalp (to-df x)) :rule-classes :type-prescription)
to-df-idempotenttheorem
(defthm to-df-idempotent (equal (to-df (to-df x)) (to-df x)))
to-df-defaulttheorem
(defthm to-df-default (implies (not (rationalp x)) (equal (to-df x) 0)))
to-df-monotonicitytheorem
(defthm to-df-monotonicity (implies (and (<= x y) (rationalp x) (rationalp y)) (<= (to-df x) (to-df y))) :rule-classes (:linear :rewrite))
dfpfunction
(defun dfp (x) (declare (xargs :guard t :mode :logic)) (and (rationalp x) (= (to-df x) x)))
to-dfpfunction
(defun to-dfp (x) (declare (xargs :guard (rationalp x) :mode :logic)) (from-df (to-df x)))
dfp-implies-rationalptheorem
(defthm dfp-implies-rationalp (implies (dfp x) (rationalp x)) :rule-classes :compound-recognizer)
dfp-implies-to-df-is-identitytheorem
(defthm dfp-implies-to-df-is-identity (implies (dfp x) (equal (to-df x) x)) :rule-classes (:forward-chaining :rewrite))
encapsulate
(encapsulate nil (logic) (partial-encapsulate (((df-round *) => * :formals (x) :guard (rationalp x))) nil (local (defun df-round (x) (constrained-to-df x))) (defthm rationalp-df-round (rationalp (df-round x)) :rule-classes :type-prescription) (defthm dfp-df-round (dfp (df-round r))) (defthm df-round-is-identity-for-dfp (implies (dfp r) (equal (df-round r) r))) (defthm df-round-monotonicity (implies (and (<= x y) (rationalp x) (rationalp y)) (<= (df-round x) (df-round y))) :rule-classes (:linear :rewrite))))
df-round-idempotenttheorem
(defthm df-round-idempotent (equal (df-round (df-round x)) (df-round x)))
encapsulate
(encapsulate nil (logic) (partial-encapsulate (((constrained-df-rationalize *) => * :formals (x) :guard (dfp x))) (constrained-to-df) (local (defun constrained-df-rationalize (x) (if (dfp x) x 0))) (defthm rationalp-constrained-df-rationalize (rationalp (constrained-df-rationalize x)) :rule-classes :type-prescription) (defthm to-df-of-constrained-df-rationalize (implies (dfp x) (equal (to-df (constrained-df-rationalize x)) x)))))
binary-df+function
(defun binary-df+ (x y) (declare (xargs :mode :logic :guard (and (dfp x) (dfp y)))) (df-round (+ x y)))
unary-df-function
(defun unary-df- (x) (declare (xargs :mode :logic :guard (dfp x))) (df-round (- x)))
dfp-minustheorem
(defthm dfp-minus (implies (dfp x) (dfp (- x))) :hints (("Goal" :in-theory (enable dfp to-df))))
unary-df/function
(defun unary-df/ (x) (declare (xargs :mode :logic :guard (and (dfp x) (not (= x 0))))) (df-round (/ x)))
binary-df*function
(defun binary-df* (x y) (declare (xargs :mode :logic :guard (and (dfp x) (dfp y)))) (df-round (* x y)))
binary-df/function
(defun binary-df/ (x y) (declare (xargs :mode :logic :guard (and (dfp x) (dfp y) (not (= y 0))))) (df-round (/ x y)))
*df-basic-primitives*constant
(defconst *df-basic-primitives* '((from-df (:df) (nil)) (to-df (nil) (:df)) (df-string (:df) (nil)) (binary-df+ (:df :df) (:df)) (binary-df* (:df :df) (:df)) (binary-df/ (:df :df) (:df)) (unary-df- (:df) (:df)) (unary-df/ (:df) (:df))))
install-df-basic-primitives-1function
(defun install-df-basic-primitives-1 (alist wrld) (declare (xargs :mode :program)) (cond ((endp alist) wrld) (t (install-df-basic-primitives-1 (cdr alist) (let* ((tuple (car alist)) (fn (car tuple)) (stobjs-in (cadr tuple)) (stobjs-out (caddr tuple))) (putprop fn 'stobjs-in stobjs-in (putprop fn 'stobjs-out stobjs-out wrld)))))))