# Mr Andrew Lewis-Smith

Email: a.lewis-smith@qmul.ac.uk

Room Number: Peter Landin, CS 438

## Teaching

### Automata and Formal Languages (*Undergraduate*)

Automata and formal languages are fundamental concepts in Computer Science. Automata are abstract machines that are used for representing computational processes in a mathematically precise fashion. Moreover, any device interacting with the outside world, whether a simple program or a complex system, requires well-defined, formal input and output languages. We will study automata and their relationship with formal languages and grammars.

### Computability, Complexity and Algorithms (*Undergraduate*)

A theoretical course, which concerned with the theoretical core of Computer Science. The course covers some of the most successful algorithms as well as some of the most central decision problems. A large part of the course will focus on the NP versus P problem as well as other famous unsolved problem in Computer Science. To understand this problem we consider the issue of how one programming problem can be disguised as another apparently very different problem. This idea is very important in designing algorithms and plays a crucial role in the theory of NP-completeness.

### Computer Systems and Networks (*Undergraduate*)

This module provides you with a basic understanding of how a computer works and how programs are executed by the CPU at the machine level. As an introduction to computer architecture and systems software, this module presents the concepts needed to understand typical computers at the level of their ';machine-code'; instruction set. It covers Boolean algebra rules and terminology as well as logic gates. The module also examines the use of bits, bytes and data formats to represent integers, text and programs as well as looking at the conventional von Neumann computer architecture (CPU, registers, memory). Assembly language programming and system software are introduced.

### Functional Programming (*Postgraduate*)

Practical introduction to functional programming for students with good programming ability but no prior knowledge of FP

### Logic and Discrete Structures (*Undergraduate*)

The module consists of two parts, each of fundamental importance for any serious approach to Computer Science: Logic and Discrete Structures. Logic has been called the Calculus of Computer Science. It plays a very important role in computer architecture (logic gates), software engineering (specification and verification), programming languages (semantics, logic programming), databases (relational algebra and SQL the standard computer language for accessing and manipulating databases), artificial intelligence (automatic theorem proving), algorithms (complexity and expressiveness), and theory of computation (general notions of computability). Computer scientists use Discrete Mathematics to think about their subject and to communicate their ideas independently of particular computers and programs. They expect other computer scientists to be fluent in the language and methods of Discrete Mathematics. In the module we consider Propositional logic as well as Predicate Calculus. We will treat Propositional Logic and Predicate Calculus as formal systems. You will learn how to produce and annotate formal proofs. As application we will briefly consider the programming language Prolog. This module will also cover a variety of standard representations, operations, properties, constructions and applications associated with selected structures from Discrete Mathematics (sets, relations, functions, directed graphs, orders).