building and reasoning about DFAs

- structural induction
- inductively defined sets
- inductively defined functions
- proofs by structural induction

When building a DFA, it is helpful to write down a condition associated with each state. For example, suppose we wanted to build a machine that recognizes strings starting with "11". We might build the machine to the right (click for LaTeX source):

How does this machine work? Well, we know that if processing *x* ends in state *q*_{1}, then *x* must be the empty string. Similarly, the only string that gets to *q*_{2} is "1". Similarly, any string that starts with "0" or "10" ends in *q*_{4}; so in order to get to state *q*_{3}, the string must start with "11".

When building an automaton, associate a fact with each state. You can then check that each transition is correct by assuming that the string without the last character satisfies the property correspoinding to the start of the transition, and then proving that the string *with* the last character satisfies the property of the target of the transition.

An inductively defined set is a set where the elements are constructed by a finite number of applications of a given set of rules.

Examples:

- the set N of natural numbers is the set of elements defined by the following rules:
- 0 ∈ N
- If
*n*∈ N then*S**n*∈ N.

thus the elements of N are {0,

*S*0,*S**S*0,*S**S**S*0, …}.*S*stands for successor. You can then define 1 as*S*0, 2 as*S**S*0, and so on. - the set Σ
^{ * }of strings with characters in Σ is defined by*ε*∈ Σ^{ * }- If
*a*∈ Σ and*x*∈ Σ^{ * }then*x**a*∈ Σ^{ * }.

thus the elements of Σ

^{ * }are {*ε*,*ε*0,*ε*1,*ε*00,*ε*01, …,*ε*1010101, …}. we usually leave off the*ε*at the beginning of strings of length 1 or more. - the set
*T*of binary trees with integers in the nodes is given by the rules- the empty tree (, written
*n**i**l*) is a tree - if
*t*_{1}and*t*_{2}are trees, then , written*n**o**d**e*(*a*,*t*_{1},*t*_{2})) is a tree.

thus the elements of

*T*are things like the picture to the right (click for tex), which might be written textually as*n**o**d**e*(3,*n**o**d**e*(0,*n**i**l*,*n**i**l*),*n**o**d**e*(1,*n**o**d**e*(2,*n**i**l*,*n**i**l*),*n**i**l*)) - the empty tree (, written

Compact way of writing down inductively defined sets: BNF (Backus Naur Form)

Only the name of the set and the rules are written down; they are separated by a "::=", and the rules are separated by vertical bar (∣).

Examples (from above):

*n*∈ N: : = 0 ∣*S**n**x*∈ Σ^{ * }: : =*ε*∣*x**a**a*∈ Σ*t*∈*T*: : =*n**i**l*∣*n**o**d**e*(*a*,*t*_{1},*t*_{2})*a*∈*Z*(basic mathematical expresssions)

*e*∈*E*: : =*n*∣*e*_{1}+*e*_{2}∣*e*_{1}**e*_{2}∣ −*e*∣*e*_{1}/*e*_{2}

*n*∈*Z*

Here, the variables to the left of the ∈ indicate *metavariables*. When the same characters appear in the rules on the right-hand side of the : : = , they indicate an arbitrary element of the set being defined. For example, the *e*_{1} and *e*_{2} in the *e*_{1} + *e*_{2} rule could be arbitrary elements of the set *E*, but + is just the symbol + .

If *X* is an inductively defined set, you can define a function from *X* to *Y* by defining the function on each of the types of elements of *X*; i.e. for each of the rules. In the inductive rules (i.e. the ones containing the metavariable being defined), you can assume the function is already defined on the subterms.

Examples:

*a**d**d*2: N→N is given by*a**d**d*2: 0↦*S**S*0 and*a**d**d*2:*S**n*↦*S*(*a**d**d*2(*n*)).*p**l**u**s*: N × N→N given by*p**l**u**s*: (0,*n*)↦*n*and*p**l**u**s*: (*S**n*,*n*ʹ)↦*S*(*p**l**u**s*(*n*,*n*ʹ)). Note that we don't need to use induction on both of the inputs.*δ̂*:*Q*× Σ^{ * }→*Q*

If *X* is an inductively defined set, then you can prove statements of the form ∀ *x* ∈ *X*, *P*(*x*) by giving a separate proof for each rule. For the inductive/recursive rules (i.e. the ones containing metavariables), you can assume that *P* holds on all subexpressions of *x*.

Examples:

Proof that

*M*is correct (see homework solutions) can be simplified using structural inductionA proof by structural induction on the natural numbers as defined above is the same thing as a proof by weak induction. You must prove

*P*(0) and also prove*P*(*S**n*) assuming*P*(*n*).