# Exam 2 Review ## February 25th, 2020 - Professor Peng (who shall henceforth be dubbed "Professor Peng-uin" in my screaming imagination) has entered the lecture hall with a mere 2 minutes to spare - Today's plan is to do a quick review for your upcoming test: - DFA, NFA, equivalence - Regular languages and operations - Pumping Lemma - We have a test THIS THURSDAY, i.e. 2 days from now - PLEASE study if you know what's good for you! - There'll be a lot of pumping lemma questions, and it should be a similar format to the 1st test - "If you don't understand pumping lemma and are asking questions like 'why can't we specify the value of p?', you're gonna lose 8 to 10 points on the test, so go to office hours NOW. I don't mean to scare you, but the TAs are VERY SPECIFIC about pumping lemma mistakes" - "One thing we noticed on the homeworks: do NOT use 'let' if you can help it, since it's inherently ambiguous; you need to specify if you mean 'for all X, let...' or if you just mean 'there exists some...'" - Even if you got full points on the homework, try to be careful and look at how we do things on the class solutions; some TAs give people the benefit of the doubt when your proof is ambiguous, while other TAs won't and'll mark you off - Annoyingly, I got points off on my homework because you have to EXPLICITLY list all state transitions in a DFA (i.e. you can't use the "unmarked transitions count as rejections" shorthand like we did for TMs) -------------------------------------------------------------------------------- - The main thing we did in these last 3-4 weeks was to take away the tape from our Turing Machine, and then to see what we could do with a plain ol' state machine - ALL of this revolved around finite automata, where we have a set of states and EVERY step we read a character off the input string and move to the right until we get to the end of the string - We need to have a transition defined for EVERY state/input combination in our DFA to have it be valid (no "free" rejection states like for TMs; we have to explicitly create a self-looping rejection state if we want to do something like that in DFAs) - We also have to consume the ENTIRE input string before accepting/rejecting the string (we can't stop in the middle of the string, like TMs) - NFAs, non-deterministic finite automata, make things a little more flexible since we CAN have the same input go to multiple different states - This means it IS okay to have missing states for an NFA, since the transition function is now a power set: $$ P(Q) \times (\Sigma \cup \epsilon) \implies P(Q) $$ - ...meaning we CAN have the empty set as a transition - So, mapping an NFA where we just initially go to some state, and then have to transform it to a DFA (by taking every subset of state combinations), we'd end up going to an accepting state, then a self-looping reject state for everything else! --->q0_accept --->q0_accept---{0,1}--->emptySet(self-loop) - Here, the empty set is implicitly there in our NFA as an output state; we just have to represent it explicitly in a DFA! - Remember, $\epsilon$ is an empty string but it's STILL a string (and therefore a set of size 1), while the empty set has a size of 0 and nothing inside it - although it can be counted as a state - For NFAs, we also mentioned something called the "epsilon closure" ($\epsilon-closure$); this is the set of states we can reach from a given state in an NFA WITHOUT consuming any inputs (this INCLUDES the node itself) - Then, we went to regular expressions/languages - One thing we weren't very careful about is that we can apply regular languages to DFAs! - for instance, let's say we have a DFA that recognizes L1 and another DFA that recognizes L2; how can we recognize the union of L1 and L2? - To do this, we basically want to run 2 DFAs simultaneously, where we apply the L1 and L2 transition independently to the same character - Then, at the end, our accepting states will be if EITHER DFA ends in an accepting state - Finally, let's look at an example of converting an NFA to a DFA (this example is on page 53 of the textbook, figure 1.36) - Formally, to do this conversion, you'd write out all the states in your NFA, then the power set: all possible subsets of them (INCLUDING the empty set); these subsets will be the states of your DFA - If a transition doesn't exist in a state for some input, it goes to the empty set - Epsilon transitions enlarge the set of states we could end up in - If there are no transitions to/from a given state, then we can just ignore it in our DFA! - "I won't get to finish this example, but I'd highly encourage everyone to look at it and make sure they understand it" - Alright, good luck on the test! See you Thursday!