;;; -*- Mode:LISP; Package:USER; Base:10; Readtable:ZL -*- (defun to-b (n) (cond ((zerop n) nil) ((evenp n) (cons 'y (to-b (floor n 2)))) ('else (cons 'x (to-b (floor n 2)))))) (defun b-to (l) (cond ((null l) 0) ((eq (car l) 'x) (1+ (* 2 (b-to (cdr l))))) ((eq (car l) 'y) (* 2 (b-to (cdr l)))))) ;; (b-diff a ()) = a ;; (b-diff (cons 'y a) (cons 'y b)) = (cons 'y (b-diff a b)) ;; (b-diff (cons 'y a) (cons 'x b)) = (cons 'x (b-diff (b-diff a '(x)) b)) ;; (b-diff (cons 'x a) (cons 'y b)) = (cons 'x (b-diff a b)) ;; (b-diff (cons 'x a) (cons 'x b)) = (cons 'y (b-diff a b)) (defun b-diff (a b) (cond ((null b) a) ((and (eq (car a) 'y) (eq (car b) 'y)) (cons 'y (b-diff (cdr a) (cdr b)))) ((and (eq (car a) 'y) (eq (car b) 'x)) (cons 'x (b-diff (b-diff (cdr a) '(x)) (cdr b)))) ((and (eq (car a) 'x) (eq (car b) 'y)) (cons 'x (b-diff (cdr a) (cdr b)))) ((and (eq (car a) 'x) (eq (car b) 'x)) (cons 'y (b-diff (cdr a) (cdr b))))))