# Computer Science and Philosophy core 1

In the first year of the Computer Science and Philosophy Science degree, students spend 50% of their time on courses selected from the core of the Computer Science degree, and 50% of their time on core Philosophy courses. There is no choice of courses in the first year.

## Computer Science courses

### Functional Programming

This is a first course in programming. You will use of a programming language called Haskell, which allows programs to be viewed as mathematical functions. This makes the language very powerful, so that we can easily construct programs that would be difficult or very large in other languages. An important theme of the course is how to apply mathematical reasoning to programs, so as to prove that a program performs its task correctly, or to derive it by algebraic manipulation from a simpler but less efficient program for the same problem. You gain hands-on experience of programming through two lab exercises: the first one aims to make you acquainted with the mechanics of writing Haskell programs, and the second one tackles a more challenging programming task of simulating the world of an imaginary animal. This demonstration shows you more about this problem.

### Design and Analysis of Algorithms

In this course you will learn about the basics of algorithms, the methods of solving problems by computer, and data structures - the means by which information is represented and manipulated inside a computer. Building on the experience with Haskell from Functional Programming, the course covers the principles of algorithm design, analysis of the performance of algorithms, and the fundamental ideas in the design of efficient data structures. The emphasis is on choosing appropriate data structures for a problem domain and designing correct and effective algorithms to operate on these data structures in solving the problem. You will learn to apply these ideas in practice through a lab exercise.

### Imperative Programming

In these courses you will apply lessons you learnt in Functional Programming to the design of programs written in a more conventional way. By studying a sequence of programming examples, each a useful software tool in its own right, you will learn to construct programs in a systematic way, structuring them as a collection of modules with well-defined interfaces. These courses also cover informally the method of invariants for understanding and reasoning about programs that contain loops. You will conclude with the study of a larger programming example, such as a graphical program for finding the best route for driving between specified towns in the UK.. Through lab exercises, you will learn to create, debug and maintain programs of a non-trivial but moderate size. The second part of the course introduces the ideas of Object Oriented Programming: abstract data types and data encapsulation; interfaces and polymorphism; and generics and collection classes. In lab sessions, you will work to develop and enhance your own text editor, supporting incremental search and multi-level undo.

### Discrete Mathematics

This course will provide you with the vocabulary of concepts that is needed to understand in mathematical terms the problems that computer systems are designed to solve, and to analyse proposed solutions for their correctness and efficiency. Specifications of computer systems can be expressed formally in terms of sets, relations and functions, and the correctness of programs that implement these specifications is often proved using the techniques of mathematical logic, including reasoning based on mathematical induction. This reasoning may involve the mathematical properties of permutations, orderings, and other similar concepts. Finally, analysis of the efficiency of programs may involve solution of recurrence relations, combinatorial calculations, and the use of asymptotic approximations. All these ideas will be introduced to you in this course.

### Probability

An understanding of random phenomena is becoming increasingly important in today's world within social and political sciences, finance, life sciences and many other fields. The aim of this introduction to probability is to develop the concept of chance in a mathematical framework.

### Introduction to Proof Systems

The course is an introduction to logic and proof systems. You will develop skills of using formal logic to express and prove useful properties of mathematical structures and more generally in constructing rigorous proofs and manipulating formal notation. You will be exposed to basic logic topics, including proof systems, resolution, satisfiability, compactness, Skolemisation, and Herbrand models.

## Philosophy courses

### General Philosophy

This course gives an introduction to central topics in epistemology and metaphysics, while also providing some relevant historical background to modern debates. Topics covered are Knowledge, Scepticism, Perception, Primary and Secondary Qualities, Induction, Mind and Body, Personal Identity, and Free Will.

### Elements of Deductive Logic

An introduction to logic which is normally taught over two terms, going significantly deeper than the comparable introduction given to students of Classics, PPE etc. Logic plays a central role in Computer Science as well as technical Philosophy, and this course provides a solid foundation for later work in both.

### Turing on Computability and Intelligence

A bridging course - designed specially for students of Computer Science and Philosophy devoted to Alan Turing's two seminal contributions to modern thought. It will start by exploring the ideas in his pioneering paper of 1936, which introduced the celebrated "Turing Machine" as the first (and still influential) model of computing. Then it will move on to his controversial paper of 1950, in which he proposed the "Turing Test" as a criterion of machine intelligence. Both parts of the course will be taught in small classes with the aid of computer models, giving ample opportunity for experimentation and discussion.