CS1101S

Lecture 10: Symbolic Data

14 September 2012

Martin Henz

Overview

Reading: SICP 2.2.2, 2.3

Recap: Signal processing view of lists

Producers: list

Filters

Mappers: Reviewing map

Accumulators

Definition of accumulate

function accumulate(op,initial,sequence) {
    if (is_empty_list(sequence)) {
      return initial;
    } else {
	return op(head(sequence),
                  accumulate(op,initial,
                             tail(sequence)));
    }
}

Example of Signal Processing

var squares = build_list(10, square);
var even_squares = filter(is_even, squares);
var half_even_squares 
= map(function(x) { return x / 2; },
      even_squares);
var result = accumulate(plus, 0, half_even_squares);

Example: Permutations

Strategy

Example

flatmap

function flatmap(proc, xss) {
    return accumulate(append,
                      [],
                      map(proc, xss);
}

Recap: Strategy

Permutations

function permutations(s) {
   if (is_empty_list(s)) {
      return list([]);
   } else {
      return flatmap(function(x) {
                        return map(function(p) {
                                      return pair(x,p);
                                   },
                                   permutations(remove(x,s)));
                     },
                     s);
}  }

Overview

Reading: SICP 2.2.2, 2.3

Revisiting strings

Revisiting strings

Revisiting strings

Revisiting member

function member(v, xs){
    if (is_empty_list(xs)) {
	return [];
    } else {
	if (v === head(xs)) {
	    return xs;
	} else {
	    return member(v, tail(xs));
	}
    }
}

Overview

Reading: SICP 2.2.2, 2.3

Symbolic differentiation

The rules

Symbolic representation of functions

is_variable(e): Is e a variable?
is_same_variable(v1, v2): Are v1 and v2 the same variable?
is_sum(e): Is e a sum?
addend(e): Addend of the sum e
augend(e): Augend of the sum e
make_sum(a1, a2): Construct the sum of a1 and a2
is_product(e): Is e a product?
multiplier(e): Multiplier of the product e
multiplicand(e): Multiplicand of the product e
make_product(m1, m2): Construct product of m1 and m2

Symbolic differentiation

The rules

Definition of deriv

function deriv(exp,variable) {
   if (is_number(exp)) {
      return 0;
   } else if (is_variable(exp)) {
      return (is_same_variable(exp,variable)) ? 1 : 0;
   } else if (is_sum(exp)) {
      return make_sum(deriv(addend(exp),variable),
                      deriv(augend(exp),variable));
   } else if (is_product(exp)) {
      return make_sum(make_product(multiplier(exp),
                                   deriv(multiplicand(exp),variable)),
                      make_product(deriv(multiplier(exp),variable),
                                   multiplicand(exp)));
   } else {
      return "unknown expression type: " + exp);
}

Examples

We use (nested) lists to represent functions

//  d x+y / d x
deriv(list("+","x","y"),"x")  

//  d (0 x + 1 y) / d x
deriv(list("+", list("*", "x",0), 
                list("*", 1 ,"y")), 
      "x")          

Simplifying formulas: make_sum


function make_sum(a1,a2) {
   if (is_number_equal(a1, 0)) {
      return a2;
   } else if (is_number_equal(a2, 0)) {
      return a1;
   } else if (is_number(a1) && 
            is_number(a2)) {
      return a1 + a2;
   } else {
      return list("+",a1,a2);
}  }

Simplifying formulas: make_product

function make_product(m1,m2) {
   if (is_number_equal(m1,0) || is_number_equal(m2,0))
      return 0;
   else if (is_number_equal(m1,1))
      return m2;
   else if (is_number_equal(m2,1))
      return m1;
   else if (is_number(m1) && is_number(m2))
      return m1 * m2;
   else
      return list("*",m1,m2);
}

Summary

Reading: SICP 2.2.2, 2.3

/

#