Construct NPDA's for Various Languages
For language (a):
One can use a stack to keep track of the number of 'a's, 'b's, and 'c's. Transitions in the NPDA will depend on the current symbol and top symbol of the stack. For example, pushing 'a' onto the stack when reading an 'a'.
For language (b):
Similar to (a), utilizing the stack approach but with different transitions. For example, pushing 'a' onto the stack when reading an 'a' and popping 'a' from the stack when reading a 'b'.
For language (c):
Two stacks are used to keep track of 'a's and 'b's. Transitions depend on the current symbol and top symbol of the stacks. For example, pushing 'a' onto the 'a' stack when reading an 'a'.
For language (d):
A non-deterministic approach is taken with two branches to keep track of the first and second half of the input string. For instance, pushing 'a' onto the stack on both branches. NPDA should end in accepting states simultaneously.