;;; ;;; This file contains the data access functions for ;;; the "algebraic expressions" symbolic data domain as ;;; described in chapter 2 of the text. ;;; ;;; ------------------------------------- ;;; The recognizers. ;;; constant-p[expr] = numberp[expr] variable-p[expr] = symbolp[expr] negation-p[expr] = [listp[expr] --> [endp[rest[rest[expr]]] --> eq[first[expr]; "-"]; otherwise --> F]; otherwise --> F] unary-math-p[expr; prefix] = [listp[expr] --> [endp[rest[rest[expr]]] --> eq[first[expr]; prefix]; otherwise --> F]; otherwise --> F] exponential-p[expr] = unary-math-p[expr; "exp"] sine-p[expr] = unary-math-p[expr; "sin"] cosine-p[expr] = unary-math-p[expr; "cos"] dyadic-math-p[expr; infix-sym] = [listp[expr] --> [endp[rest[rest[expr]]] --> F; otherwise --> eq[second[expr]; infix-sym]]; otherwise --> F] product-p[expr] = dyadic-math-p[expr; "*"] quotient-p[expr] = dyadic-math-p[expr; "/"] sum-p[expr] = dyadic-math-p[expr; "+"] difference-p[expr] = dyadic-math-p[expr; "-"] power-p[expr] = dyadic-math-p[expr; "**"] ;;; ;;; The selectors. ;;; operand[expr] = second[expr] operand1[expr] = first[expr] operand2[expr] = third[expr] base[expr] = first[expr] exponent[expr] = third[expr] argument[expr] = second[expr] ;;; ;;; The constructors. ;;; make-negation[expr] = list2["-"; expr] make-product[expr1; expr2] = list3[expr1; "*"; expr2] make-quotient[expr1; expr2] = list3[expr1; "/"; expr2] make-sum[expr1; expr2] = list3[expr1; "+"; expr2] make-difference[expr1; expr2] = list3[expr1; "-"; expr2] make-power[expr1; expr2] = list3[expr1; "**"; expr2] make-exponential[expr] = list2["exp"; expr] make-sine[expr] = list2["sin"; expr] make-cosine[expr] = list2["cos"; expr] ;;; ;;; The converters. ;;; const-val[const-expr] = const-expr make-constant[numeric-atom] = numeric-atom var-name[variable] = variable make-variable[symbolic-atom] = symbolic-atom