# Finite Automata
***(AKA: Finite State Machine)***

Mechanism and abstraction used behind regular grammars.

Usually has its state represented using nodes and edges.

Regular grammar:
```
S -> bA
A -> epsilon
```
Equivalent to: `\b\`

State transition:

--label--> : Transition symbol 
O          : State Symbol
(o)        : Accepting State
->O.Start  : Starting State (State transition to Start)

Ex:

->O.*Start* --*transition*--> (o).*Accepting*

*ε* - Epsilon (Empty String)
`I will be spelling it out as I do not enjoy single glyth representation`

Two main types of Finite Automtata :

FA w/ output
* Moore machine
* Mealy machine

FA w/o output
* DFA - Deterministic
* NFA - Non-deterministic
* epsilon-NFA - (Epsilon Transition) special case

NFA : Non-deterministic FA - Allos transition on the same symbol to
different states

```
	a->o
   /
->o.1---b-->o
   \
	a->o 
```

epsilon-NFA : Extension of NFA that allows *epsilon* transitions

```
	a--->o---epsi--->(o)
   /		 	    /
->o----b-->epsi--->o
   \
	a-->o--epsi-->(o)
```

DFA : A state machine which forbids multiple transitions on the same symbol, and *epsilon* transitions

```
	a--->o
   /
->o----b-->o
```

Use case:

Implementation Transformations:
```RegExp -> epsilon-NFA -> ... -> DFA```

## Formal Definition:

Non-deterministic finite automata is a tuple of five elements:
* All possible states
* Alphabet
* Transition Function
* Starting State
* Set of accepting states

NFA = ( States, Alphabet, TransitionFunction, StartingState, AcceptingStates )

NFA = ( Q, Σ, Δ, q0, F )
