06.03.2017 Views

Mathematics for Computer Science

e9ck2Ar

e9ck2Ar

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

“mcs” — 2017/3/3 — 11:21 — page 204 — #212<br />

204<br />

Chapter 7<br />

Recursive Data Types<br />

Definition 7.1.1. Let A be a nonempty set called an alphabet, whose elements are<br />

referred to as characters (also called letters, symbols, or digits). The recursive data<br />

type A of strings over alphabet A is defined as follows:<br />

Base case: the empty string is in A .<br />

Constructor case: If a 2 A and s 2 A , then the pair ha; si 2 A .<br />

So f0; 1g are the binary strings.<br />

The usual way to treat binary strings is as sequences of 0’s and 1’s. For example,<br />

we have identified the length-4 binary string 1011 as a sequence of bits, the 4-tuple<br />

.1; 0; 1; 1/. But according to the recursive Definition 7.1.1, this string would be<br />

represented by nested pairs, namely<br />

h1; h0; h1; h1; iiii :<br />

These nested pairs are definitely cumbersome and may also seem bizarre, but they<br />

actually reflect the way that such lists of characters would be represented in programming<br />

languages like Scheme or Python, where ha; si would correspond to<br />

cons.a; s/.<br />

Notice that we haven’t said exactly how the empty string is represented. It really<br />

doesn’t matter, as long as we can recognize the empty string and not confuse it with<br />

any nonempty string.<br />

Continuing the recursive approach, let’s define the length of a string.<br />

Definition 7.1.2. The length jsj of a string s is defined recursively based on Definition<br />

7.1.1.<br />

Base case: jj WWD 0.<br />

Constructor case: j ha; si j WWD 1 C jsj.<br />

This definition of length follows a standard pattern: functions on recursive data<br />

types can be defined recursively using the same cases as the data type definition.<br />

Specifically, to define a function f on a recursive data type, define the value of f<br />

<strong>for</strong> the base cases of the data type definition, then define the value of f in each<br />

constructor case in terms of the values of f on the component data items.<br />

Let’s do another example: the concatenation s t of the strings s and t is the<br />

string consisting of the letters of s followed by the letters of t. This is a perfectly<br />

clear mathematical definition of concatenation (except maybe <strong>for</strong> what to do<br />

with the empty string), and in terms of Scheme/Python lists, s t would be the list<br />

append.s; t/. Here’s a recursive definition of concatenation.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!