[Openmcl-devel] inverse function
Tobias C. Rittweiler
tcr at freebits.de
Sat Feb 13 04:49:39 PST 2010
Taoufik Dachraoui <taoufik at mazeboard.com> writes:
> Dear,
>
> Does someone know if there is any work done to generate an inverse of any
> given lisp function (if possible).
>
> Example:
>
>> (defun f (x) (+ x 1))
>> (f 2)
> 3
>> (funcall (inverse #'f) 3)
> 2
>> (funcall (inverse #'f) (f 5))
> 5
>
> This example is very simple and serves only to describe my needs; I would
> like to use the inverse function
> for complex lisp defined functions.
>
> Thank you for your help
(defun inverse (f domain)
(let ((table (make-hash-table :test #'eql)))
(funcall domain
#'(lambda (x)
(let ((y (funcall f x)))
(setf (gethash y table) x))))
#'(lambda (y)
(values (gethash y table)))))
(defun integers (from to)
#'(lambda (fn)
(loop for i from from to to do (funcall fn i))))
CL-USER> (defun f (x) (1+ x))
F
CL-USER> (defvar *f^-1* (inverse 'f (integers 0 1000)))
*F^-1*
CL-USER> (funcall *f^-1* 3)
2
CL-USER> (funcall *f^-1* (f 5))
5
-T.
More information about the Openmcl-devel
mailing list