;; an emp-rec is a list of name, office, extension
;; where name is a symbol, office a string, ext a number

;; make-emprec : symbol string number -> emprec
;; creates a new emprec
(defun make-emprec (name office ext)
  (cons name (cons office (cons ext nil))))

;; get-name : emprec -> symbol
;; extracts the name from an emprec
(defun get-name (emprec) (car emprec))

;; get-office : emprec -> string
;; extracts the office from an emprec
(defun get-office (emprec) (cadr emprec))

;; get-extension : emprec -> number
;; extracts the extension from an emprec
(defun get-extension (emprec) (caddr emprec))

;; add-emprec : symbol string number empdb -> empdb
;; creates a new database containing old database and new employee
(defun add-emprec (name office ext db)
  (cons (make-emprec name office ext) db))

;; lookup-ext : symbol empdb -> number or false
;; returns extension for named person in database, or false
;;    if person not in database
(defun lookup-ext (name db)
  (cond ((null db) nil)
	((equal (get-name (car db)) name) (get-extension (car db)))
	(t (lookup-ext name (cdr db)))))

;; used-offices : emp-db -> list of string
;; extracts list of all offices appearing in emp-db.  May contain duplicates
;;   if multiple employees share an office
(defun used-offices (db)
  (cond ((null db) nil)
	(t (cons (get-office (car db)) (used-offices (cdr db))))))

;; if add employee, lookup-ext returns added phone number
(defthm lookup-ext-after-add-thm
  (equal (lookup-ext name (add-emprec name office ext db)) ext))

;; the used offices list is the same length as the database
(defthm used-office-db-length-thm
  (equal (length (used-offices db)) (length db)))
   

