Chapter 1.

Preliminaries
A preliminary step for an abstraction is to introduce a proper notation that will symbolically represent the objects in which we are interest. In particular, we will see that formal languages heavily rely on such symbolic representations. In this chapter we begin with introducing such notational convention. To follow the discussions presented in this book, we need the capacity for logical reasoning, which will in turn be enhanced through the course. Often the book leaves out the routine and tedious details of a proof that can be completed by following one of the conventional proof techniques, such as proof by induction. This doesn’t mean that proofs can be ignored. Thus, this chapter presents an overview of proof techniques with easy examples and helps the reader build confidence in validating and presenting his or her own proofs. Studying this chapter, the reader will see that “acquired proof-phobia” is curable.

1.1 Notation 2 Symbols, Strings, Composite symbols Sets and set operations 1.2 Propositions and logical connectives 6 1.3 Proof techniques 10 Proof by contrapositive, Proof by cases, Proof by contradiction Proof by example, Proof by generalization Proof by induction, Proof by pigeonhole principle Proof by counting, Diagonalization technique Rumination 22 Exercises 26

1

Preliminary

1.1 Notation
In this book, with no further explanation, we shall use the following notation. • The leading English alphabet letters, a, b, c, .…, will be used as symbols to denote an object. • A string is a finite sequence of symbols, for which we shall use the trailing English alphabet, .., u, v, w, x, y, z. • For two strings x and y, xy denotes the concatenated string of x and y. • Epsilon (ε ) denotes the null string, which, for any string x, has the property ε x = xε = x. • For a string x, by |x| we denote the length of x, i.e., the number of symbols in x. • For a string x, x0 = ε , xi+1 = xxi, and xR denotes the reverse of the string x. Example: (ab)3 = ababab, (ab)0 = ε , (abcd)R = dcba. • We shall use capital letters to denote the sets.

2

Notation

Preliminary

• Composite symbols: To show the constituent entities that a symbol represent,
composite symbols are used in addition to the conventional superscript, subscript, and primed notation. A composite symbol is represented by a finite number of symbols listed in the brackets as follows. [a, b], [1, A, 5], [a, qi, (c, d)] Notice that we can always substitute a single symbol for a composite symbol, if needed.

• Set specification: There are two ways to specify the sets; in curly brackets, either by
explicitly showing all the members or by describing the set properties. (a) Explicit. Examples: A = {2, 8}, Σ = {a, b, c} In particular, the empty (or null) set is denoted by Φ. (b) By set properties of the form { x | property list of x}. Examples: A = {n | n is a even number} = { 2, 4, 6, . . . }, B = {xxR | x is a binary string } = {00, 11, 0110, 1001, 1111, . .}, C = {anbncn | n ≥ 0} = {ε , abc, aabbcc, aaabbbccc, . . . }
3

Preliminary Set operations • Operations on the sets of strings: Let A = {aa, ab, abc) and B = {aa, bc}. (a) union(∪) : A ∪ B = {aa, ab, bc, abc}, A ∪ Φ = A (b) intersection( ∩) : A ∩ B = { aa }, A ∩ Φ = Φ (c) subtraction(− : A – B = { ab, abc} ) (d) exclusive or (⊕) : A ⊕ B = {ab, abc, bc} (e) product : AB = { aaaa, aabc, abaa, abbc, abcaa, abcbc} AΦ = ΦA = Φ (f) complement : Let U be the universal set, i.e., the set of all possible elements. Then the complement of set A, denoted by A is A=U–A (g) DeMorgan’s law: A ∪ B = A ∩ B A∩B=A∪B

4

Set operations

Preliminary

(h) Closure (star, or Kleene closure): For a set A, define A0 = {ε }, and for i > 1, Ai = AAi-1 . The closure of the set A is defined as follows. A = i∪ 0(Ai) = A0 ∪ A1 ∪ A2 . . . . =
*

The closure A* is the set of all strings that we can get by picking arbitrary number of strings in A (you are allowed to pick the same string arbitrary number of times) and concatenating them in any order. For example, for the binary alphabet Σ , the closure Σ * = {0, 1}* is the set of all binary strings including the null string ε . If Σ is the English alphabet, Σ * is the set of ε and all strings over the alphabet Σ . Every closure contains the null string ε . Kleene plus, A+, denotes the closure without ε , i.e., A+ = A* - {ε }. (i) For a set A the power set, denoted by 2A, is the set of all subsets of A. Example: Let A = {a, b, c}. Then, 2A = {Φ, {a}, {b}, {c}, {a, b}, {b, c}, {a, c}, {a, b, c}}
5

Preliminary

1.2 Propositions and Logical Connectives
A proposition is a declarative statement that can be either true or false. By combining propositions using the logical connectives, such as and, or, and not, which are symbolically denoted by ∧ ∨ and ¬, respectively, we can form another , , proposition. Let p and q be two propositions. The three compound propositions p ∧ q, p ∨ q, and ¬p, respectively, have the truth values defined by the truth tables as shown below. p
T T F F

q
T F T F

p ∧q
T F F F

p
T T F F

q
T F T F

p ∧q
T T T F

p
T F

¬p
F T

6

Propositions

Preliminary

Another commonly used logical connective is the conditional (or if-then), denoted by the symbol →. The truth table for the proposition p → q (read if p, then q) is defined as shown below. Notice that the truth tables for p → q and ¬p ∨q are identical. Thus p → q is a short notation for the proposition ¬p ∨q. Notice that though we use the term conditional, implying an antecedentconsequent relation, this conditional connective does not necessarily carry such relational meaning. p q p → q ¬p ∨q
T T F F T F T F T F T T T F T T

For example, let p be “Elephants fly,” and q be “The earth is flat.” By the definition, the compound statement p → q is (vacuously) true, with no regard to the truth values of statement q, and without extending to their meanings.
7

Propositions p
T T F F

Preliminary q
T F T F

p → q ¬p ∨q
T F T T T F T T

There are several ways of reading the conditional statement p → q. Among others are the following. (Notice that in (c) the order of p and q are reversed.) (a) if p, then q (b) p only if q (c) q if p (d) if p holds, q follows

The biconditional connective of two propositions p and q, denoted by p ↔ q, is the short notation for the compound statement (p → q) ∧(p ← q). Often this proposition is shortly written as “p iff q”, and read “p if and only if q” or “if p then q, and conversely.” We usually prove p ↔ q by proving each of the two parts: p → q (called the “only if part”), and p ← q (called the “if part”).
8

Propositions

Preliminary

Often we come across a problem that asks us to justify a statement of the form “p implies q” (denoted by p ⇒q), meaning that q is true in each case in which p is true. Notice that the statement p ⇒q, in particular, refers to the first row of the truth table of the proposition p → q . In other words, if p → q is true whenever p is true, we say p implies q. The implication p ⇒q is not a proposition, which would have a truth value, but an assertion about the relationship of two propositions. If p ⇒ q and p ⇐ q, we write p ⇔ q and say that p and q are equivalent. Consider the truth tables of p → q, ¬p ∨q and ¬q → ¬p, which are all identical, as shown below. Clearly, we have (p → q) ↔ (¬p ∨q) ↔ (¬q → ¬p) for every pair of values of p and q. Since ¬p ∨q and ¬q → ¬p are true for every case in which p → q is true and vice versa, we can also say (p → q) ⇔ (¬p ∨q ) ⇔ (¬q → ¬p). p
T T F F

q
T F T F

p → q ¬p ∨q ¬q → ¬p
T F T T T F T T T F T T
9

Preliminary

1.3 Proof Techniques
A proof is a convincing argument that a statement is true. Therefore, the statement to be proven must be a proposition that can be either true or false. Usually it involves a statement of the form p → q. In this case the proof must show that p → q is true. Since, if p is false, p → q is vacuously true (i.e., has no meaning), the proof is only concerned with every case in which p is true. In other words the proof justifies the implication p ⇒ q. A theorem is a statement that has been proven true. However, we do not call every statement proven true a theorem. We reserve the use of the word theorem only for important statements of interest. Occasionally we prove statements to use in the proof of other more important statements. We call such statements lemmas. Sometimes when we have proven a theorem, we can easily show that a further statement is true. Such statements are called corollaries of the theorem. Now, we are ready for a quick overview of some important proof techniques.

10

Proof techniques

Preliminary

1. Proof by contrapositive: To prove p ⇒ q, we use the following equivalence. ( p → q ) ⇔ ( ¬q → ¬p) Example: Let p and q be, respectively, the statements “it rained” and “the lawn is wet.” Then instead of proving that p → q (i.e., “if it rained, then the lawn is wet”) is true, we can prove that ¬q → ¬p (i.e., “if the lawn is not wet, it did not rain”) is true. 2. Proof by cases: When p is a compound statement, we prove p ⇒ q by considering the truth values of each component of p. Example: Suppose that p = p1 ∨p2 ∨p3. Using the equivalence ((p1 ∨p2 ∨p3) → q) ⇔ ((p1 → q) ∨ (p2 → q) ∨(p3 → q)), we prove p ⇒q by justifying either (p1 ⇒ q), (p2 ⇒ q), or (p3 ⇒ q).

11

Proof techniques

Preliminary

3. Proof by contradiction: This proof technique shows that if p ⇒ q does not hold, i.e., the statement p → q is false, then it contradicts some statement, possibly including p, that we know to be true. Recall that the implication p ⇒ q presupposes that p is true. So, if we can show that p is false from the supposition that p → q is false, we also have a contradiction. Example: Suppose that the statement “everyone who studies automata and formal languages gets a good job” is a proven fact. Let p be the statement “Tom failed to get a good job,” and let q be the statement “Tom did not study the automata and formal languages.” To justify the statement p ⇒ q (i.e., p→ q is true), we suppose that p→ q is false, and show that it contradicts to the above fact. Recall that (p → q) ⇔ (¬p ∨q). If p → q is false, ¬p ∨q must be false. It follows that both ¬p and q should be false, i.e., (p ∧¬q) is true, implying that Tom failed to get a good job and he studied the automata and formal languages. This contradicts to the proven fact that everybody, who studied the automata and formal languages, gets a good job. The proof by contradiction is quite popular in computer science. We will see more interesting examples in other chapters.
12

Proof techniques

Preliminary

4. Dealing with quantified statements: Occasionally a statement contains free variables bound to a phrase “for all”, “for every”, or “there exists” in the following forms. (1) “for all (or for every) x, . . . .” (denoted by ∀x …)

(2) “there exists (or there is) x . . .” (denoted by ∃ x …)
The phrases “for all” and “there exists” are, respectively, called the universal quantifier and the existential quantifier. (a) Proof by example: Let ∃ x [p(x)] denote a statement with the existential quantification bound to variable x. To prove such statements are true it is enough to show an example. Example: We can justify the statement “Among the students who took this course, there exists a student who got a grade of A” by showing a student, say Mary, who got an A from the course.

13

Proof techniques

Preliminary

(b) Proof by generalization: We apply this technique to justify a statement of the form ∀x [p(x)]. If the domain of the variable x is small, we may examine the statement for each case of x. Otherwise, we need to come up with a generalization, possibly using other proven facts. Example: Suppose that we want to justify the statement “all the students who take the language course are from abroad.” If possible, it is a good strategy to find some information, like the curriculum of the school, showing that only foreign students are admitted to the course, for example, to learn English as their second language. Notice that if you want to disprove a statement of the form ∀x [P(x)] (or the form ∃ x [p(x)]), you may use the same strategy (i.e., to show an example against the statement, called counter example) as for proving a statement of the form ∃ x [p(x)] (respectively, ∀x [P(x)] ).

14

Proof techniques

Preliminary

5. Proof by induction: This is a quite effective proof technique for justifying a statement that claims a generalization over all integers n ≥ n0, i.e., a statement of the form ∀ n ≥ n0 [ p(n) ]. The statement may explicitly describe the involvement of the natural numbers, as the following example, or it may be implicit (as we shall see in other examples). ∀ n ≥ 0 [ ∑ i=0 i = n(n+1) /2 ] The proof is carried out in three steps: (1) basis, (2) induction hypothesis, and (3) induction. In step (1), we show that p(n) is true for n0, the lower bound. In step (2) we suppose that for every natural number m < n, p(m) is true, and finally in step (3) we show that p(m + 1) is true.
Applicant Bloopers Interviewer: "Do you think you can handle a variety of tasks?" Applicant: "I should say so. I've had nine totally different jobs in the past five months." The stern faced Personnel Officer told an applicant that they needed an individual who is totally responsible. "I sure qualify then." replied the applicant. "Everywhere I've worked, whenever something went wrong, I was responsible." - Jim Break Time
n

15

Proof techniques Example: Prove that ∀ n ≥ 0 [ ∑ i=0 i = n(n+1) /2 ].
n n

Preliminary

Proof. (1) Basis (n = 0): we show that for n = 0, the equality ∑ i=0 i = n(n+1) /2 holds. The left side of the equation is ( ∑ Obviously, the statement is true.
0 i= 0

i) = 0, and the right side is 0(0 + 1)/ 2 = 0.
m i= 0

(2) Induction hypothesis: suppose that ∀ m < n, [ ∑

i = m(m+1) /2].
n

(3) Induction: we show that for n = m+1, the equality ∑ i=0 i = (n)(n+1) /2 holds. The left side of the equation is ∑ i=0 i = ∑ induction hypothesis, ∑ ∑
m i= 0 m i= 0 n m1 + i= 0

i=∑

m i= 0

i + (m+1). Since by the

i = m (m+1)/2, we get the right side as follows.

i + (m+1) = m(m+1)/2 + (m+1) = m(m+1)/2 + (m+1) = (m+1)(m+2)/2 = n(n+1)/2

In the rumination section at the end of this chapter, we discuss this proof technique further with another example.

16

Proof techniques

Preliminary

6. Constructive proof and non-constructive proof: Constructive proof is another name for proof by example, which is used for proving a statement of the form ∃ x [p(x)]. The technique shows a specific value for x that makes p(x) true. A nonconstructive proof shows indirectly that such a value for x must exist by using other facts. Example: Prove that ∃ n [ n is a prime number and n > 2]. Constructive proof: 5 is a prime number greater than 2. Non-constructive proof: It is proven that every natural number is a product of two prime numbers. If there is no prime number greater than 2, then every number must be equal to 2i, because 2 is the only prime number by the assumption. However, there are natural numbers (e.g., 5) that are not a power of 2. This contradicts to the proven fact that every natural number is a product of two prime numbers.

17

Proof techniques

Preliminary

7. Proof by the pigeonhole principle: The pigeonhole principle says that if m letters are distributed among n < m pigeonholes, there must be at least one pigeonhole that contains more than one letter.

1

2

n

.....
1 2 ... m

The pigeonhole principle appears intuitively obvious. But an intuition by itself cannot be a proof. We need a sound logical argument for the proof. This principle can be proved by the proof by induction technique. We will show this in the rumination section at the end of this chapter.

18

Proof techniques

Preliminary

Application example: Using the pigeonhole principle, show that in a directed graph with n nodes, any path of length greater than or equal to n involves a cycle. Proof: Let n be the number of nodes of the graph. We know that on any path of the graph, the number of nodes visited is greater than the path length, i.e., the number of edges. (Notice that we count the starting node of a path as visited.) Let the nodes of the graph correspond to pigeonholes and visiting a node corresponds to putting a letter in it (see the figure below). If the path length is greater than or equal to n, then more than n nodes are visited. In view of the pigeonholes, this implies that we are putting m (> n) letters into the n pigeonholes. According to the principle, there is a pigeonhole (i.e., a node) containing more than one letter (i.e., visited more than once). This implies that the path contains a cycle.

19

Proof techniques

Preliminary

8. Proof by counting: Many theorems are involved with the number of entities that satisfy certain property. One way to prove such a theorem is by figuring out the number or its range that satisfies the theorem. (The technique does not necessarily count. The name is somewhat misleading.) Example: Prove that ∀n > 0 [it is impossible to put all the binary numbers of length n in the rows and columns of n × n bit (0/1) matrix]. 1 1 0 1 0 1 0 1 1 0 1 1 Proof: We prove the statement in two cases: (1) when n > 2, and (2) when n = 1 or 2. Case (1), when n > 2: There are 2n binary numbers of length n, and the total number of columns and rows is 2n. Since 2n > 2n, for every n > 2, the statement is true. Case (2), when n = 1 or 2: We leave the proof as an exercise for the reader.

20

Proof techniques

Preliminary

8. Diagonalization Technique: Given a set of lists, this technique shows how to construct a list that is not in the set. This is a powerful tool for proving certain properties of formal languages presented in Chapters 15. Example: Given an n × n bit matrix M, for some n > 0, construct a binary number of length n which does not appear in any row or column of M. Answer: Let mii be the entry at the i-th row and i-th column of M. Construct the following binary number v, v = m11 m22 ….mnn , where mii is the complement of mii . Clearly, v does not appear in any row or column of M. This is true, because for any i, the number appearing in the i-th row or column contains a number whose ith bit is mii , which is the complement of the i-th bit of v.

21

Preliminary Rumination (1): Conditional connective and implication
Note that the truth table of the conditional connective (if-then) is not the antecedent-consequent (or cause-effect) relationship, but a logical definition. It is, however, very useful template to use for deducing a proposition (i.e., consequent) from another (i.e., antecedent), only if they are related. Otherwise, we will end up with a nonsense. For example, let p be the statement “I watch TV” and q be “Our soccer team wins.” Then, by simple manipulations, we get the following. (p ∨¬p) ∨(q ∨¬q) = (¬p ∨q) ∨(¬q ∨p) Since (p ∨¬p) ∨(q ∨¬q) is true, either (¬p ∨q) or (¬q ∨p) must be true, i.e., (p → q) is true, or (q → p) is true. A verbal interpretation of this last symbolic statement would be as follows. “It is true that if I watch TV, then our soccer team wins, or if our soccer team wins, then I watch TV.”

p
T T F F

q
T F T F

p→q
T F T T

22

Preliminary Rumination (2): Proof by induction
Proof by induction is a powerful technique for proving a statement is true for all integers n ≥ n0, i.e., a proposition with a universal quantification of the form ∀n ≥ n0 [p(x)]. The statement one is to prove may clearly show the lower bound n0 and the integer variable n, as in the mathematical equation presented in this chapter as an example. However, occasionally we come across statements that do not explicitly describe those numbers. We should figure them out before applying the technique. When the statement is presented in a mathematical formula, this proof technique works so routinely that we may fail to comprehend the underlying logical basis involved in the proof. To understand why the technique works, consider, as an analogy, how we walk up a stairway. To walk up to the next floor at the n-th stair, we must go to the bottom (i.e., 0-th stair) of the stairway. Then we repeat the step going from i-th stair to (i+1)-th stair. In other words, to walk up to n-th stair, (1) we must be able to get to the bottom of the stairway, and (2) if we are up on an i-th stair, for any i (0 ≤ i < n ), (3) we must be able to move up to (i+1)-th stair. The proof by induction logically works the same way. By the basis step, (1) it shows that the statement is true for the lower bound n0 of the quantified variable n. By the induction hypothesis, (2) we suppose that the statement is true for all m (n0 ≤ m < n), and by the induction step, (3) we show the statement is true for m + 1. Notice that because the statement is true for n0 (by the basis step), it is also true for n0 + 1 by the induction step. Since it is true for n0 + 1, it is also true for n0 + 2, and so on. We can claim that the statement is true for all n ≥ n0. (Sometimes the proof is described in two steps with the hypothesis included in the induction step.) The next slide shows how the “walking up a stairway” and the proof by induction correspond.

23

Rumination: Proof by Induction

Preliminary

Prove that ∀ n ≥ 0 [ ∑

n i= 0

i = n(n+1) /2 ]

n

A N I

(3) Induction step: for n = m+1, show that m ∑ i=0 i = n(n+1) /2. (2) Hypothesis: ∀ m < n, suppose that ∑
m i= 0 n

2 1 0

3

i = m(m+1) /2.
0 i= 0

(1) Basis (when n = 0): ∑ It is true for n = 0. 0 + 1 + 2 + . . . .. . . m(m+1)/2 + m

i = 0 and n(n+1)/ 2 = 0.

+ (m+1)

+ (m+1) = (m+1)(m+2)/2 = n(n+1)/2
24

Rumination: Proof by Induction

Preliminary

As another application example of the proof by induction technique, here we will justify the pigeonhole principle, which is repeated below. Pigeonhole Principle: Suppose that there are n pigeonholes and m (> n) letters. If we distribute all the letters (in any way) into the pigeonholes, there will be at least one pigeonhole that contains more than one letter. Proof: (1) Basis: The pigeonhole principle makes sense when there is at least one pigeonhole. Hence the lower bound n0 = 1. In this case, if we put all the m > 1 letters in the pigeonhole, that pigeonhole clearly contains more than one letter. The principle is true. (2) Hypothesis: Suppose that for some number of pigeonholes n’ < n, the principle is true. (3) Induction: We prove that the principle is true for n’+1 pigeonholes and m (> n’+1) letters. As shown in the figure bellow, we examine the problem divided into two cases depending on the number of letters contained in one particular pigeonhole, say hole n’+1. (a) When pigeonhole n’+1 has one or no letter: In the remaining n’ pigeonholes at least m - 1 > n’ letters are distributed. According to the induction hypothesis, among the n’ pigeonholes there is at least one pigeonhole that contains more than one letter. The principle is true. (b) When pigeonhole n’+1 has two or more letters: Obviously this pigeonhole has more than one letter. Again, the principle is true. 1 2 n’ n’+1

.....
1 2 m

25

Exercises

Preliminary

1.1 What does each of the following expressions denote? If your answer is a finite set, show all the members. If it is infinite, use set property notation. (a) a5 (b) |aba7b| (c) |ε | (d) xR, where x = abab (e) AB, where A = {a, b, c}, B = {aaaa, bbbb, cccc}

(f) A*BA*, where A and B are the sets shown in part (e) above. 1.2 Among the strings given in (1) – (7) below, identify all the members that belong to each of the following sets. (a) {xyxR | x ∈ {a, b, c}*, y ∈ ccc } (b) {xx | x ∈ {a, b, c}* }

(c) {x | x ∈ {a, b, c}* and in x the number of a’s is strictly greater than the number of b’. } ∩ {aibj | i, j > 0 } (d) ({a, b, c}* - ({aibj | i > j > 0 } ∪ {aibj | 0 < i < j })) ∩ {aibj | i, j > 0 } (1) aaaabbbb (2) aaaa (3) aaaacccaaaa (4) bbbaaaa (5) abcccccba (6) aaaaab (7) abaaba 1.3 For the sets of strings given below, show the result of each of the following set operations. Write your answer in set property notation. Try to make it as simple as possible. (a) L0∪ L4 (b) L0 ∩ L1 (c) L3 ∩ L5 (d) (L2 - L1) ∩ L4 (e) L0L5

L0 = {cibjak | i, j, k > 0, j = k } L2 = {a, b, c}* L4 = { cibjak | i,j,k ≥ 0 }

L1 = { cibjak | i, j, k ≥ 0, i = j } L3 = {xxR | x ∈ {a, b, c}* } L5 = {cibjck | i,j,k ≥ 0 }

26

Exercises
1.4 Show that the following statement is true for a pair of integers a and b. a = b if and only if a ≥ b and a ≤ b.

Preliminary

1.5 Prove that for all positive integers n ≤ 2, it is impossible to put all binary numbers of length n in the n rows and n columns of n × n bit matrix. 1.6 Let G be a directed graph with n ≥ 2 nodes, with each node labeled with either 1 or 2. Let P12 be a path in G which starts at a node with label 1 and ends in a node with label 2. An edge is said “good” if it links two nodes with different labels (i.e., 1 → 2 or 2 → 1). (The figure below shows a path with 7 good edges.) Prove that in any path P12 the number of good edges is always odd. 6 1 2 5 1 1 2 4 9 2 1 3 2 8 2 7 A path P12 1 2 2 1 2 1 2 2 1 2 7 good edges

1

1.7 Let’s change the definition of good edges (in problem 1.6) the other way around, i.e., an edge is “good” if it links two nodes with the same label. Can you claim the same property on the number of good edges? Justify your answer.

27

Exercises
1.8 Using the pigeonhole principle we proved that the following statement is true. [ In a directed graph with n nodes, any path of length greater than or equal to n involves a cycle. ]

Preliminary

Here, we want to justify the statement using the proof-by-induction technique. Answer each of the following questions. (1) What is the basis of the statement? In particular, identify the lower bound (n0). Show that the statement is true for the lower bound. (2) Write the induction hypothesis. (3) For the argument in the induction step, you may use the figures below, each showing a typical case of a path whose length is greater than or equal to n. Figures (a) – (c) are the cases where there is a node which the path does not go through, and figure (d) is the case where the path goes through every node. Complete this step answering the following questions. (i) How can you argue that in cases (a), (b) and (c), the path involves a cycle? (Hint: use the hypothesis.) (ii) Why does the path involve a cycle in case (d)?

(a)

(b)

(c)

(d)

28

Sign up to vote on this title
UsefulNot useful