Course Outcomes

### Use Mathematical Structures to Solve Programming Problems

- Understand and be conversant with basic discrete mathematical structures (finite state machines, regular expressions, grammars, propositional calculus, proof techniques, predicate calculus, sets, relations, functions, graphs).
- Write complex programs by using mathematical concepts as the basis for solving programming problems (finite state machines for lexical analysis; grammars for parsing; propositional and predicate calculus for logic programming; sets and algebras for relational databases; algebras, graphs, and topological sorting for optimizing datalog query processing).
- Incrementally build sophisticated programs by a systematic design process based on discrete mathematics.
- Design a solution for a programming problem and justify the design as one that is maintainable and extendable by other programmers who understand and are conversant with discrete mathematical structures.

### Write Code From Diverse Program Components

Demonstrate ability to build large programs by writing and integrating code from a diverse spectrum of program components.