(defun size ()
(prog (n)
(setq n 0)
(mapob '(lambda (x)
(cond ((eq x 'size))
(t (setq n (add n (conses (get x 'expr))))))))
(return n>

(defun conses (x)
(cond ((atom x) 0)
(t (plus 1 (conses (car x)) (conses (cdr x>

(defun filter (list prop)
(mapcan '(lambda (x)
(cond ((apply1 prop x) (list x))))
	list>

; select fn in lisp:
(defun select1 fexpr (#l#)
(prog (#v#)
	(setq #v# (eval (car #l#)))
loop	(setq #l# (cdr #l#))
	(cond ((null (cdr #l#)) (return (apply 'progn (car #l#))))
		((equal #v# (eval (caar #l#)))
			(return (apply 'progn (cdar #l#))))
		(t (go loop>

(defun value nexpr (wff)
(prog (#vars# result)
	(setq result (eval wff))
	(mapc '(lambda (x) (rem x 'range)) #vars#)
	(return result>

(defun exists nexpr (var prop)
(prog ()
	(read-vars var)
	(mapc '(lambda (x)
			(set var x)
			(cond ((eval prop) (return t))))
		(get var 'range))
	(return nil>

(defun for-all nexpr (var prop)
(prog ()
	(read-vars var)
	(mapc '(lambda (x)
			(set var x)
			(cond ((not (eval prop)) (return nil)))
		(get var 'range))
	(return t>

(defun read-vars (var)
(setq #vars# (unionq (car #vars#) (list var)))
(cond ((get var 'range))
	(t (prin1 '"enter domain of")
		(prin1 var)
		(terpri)
		(put var 'range (read>
