--  [CU1] Implementing a SAT-Solver in a Functional Programming Language-
-Description:  
-  SAT-solver search for satisfying assignments of boolean formulas. Although this 
-  is a computationally hard problem (NP-complete), 
-  modern SAT-solvers routinely solve boolean formulas with 100,000 and more variables. 
-  Application areas of SAT-solver are manifold: they range from hardware verification to 
-  Sudoku solvers (see here). 
-  Every 2 years there is a competition of the best SAT-solvers in the world. -
-
-  Most SAT-solvers are written in C. The aim of this project is to design and implement 
-  a SAT-solver in a functional programming language (preferably 
-  ML, but 
-  Haskell, 
-  Scala,
-  OCaml, ... are also OK). Starting point is 
-  the open source SAT-solver MiniSat (available here). 
-  The long-term hope is that your implementation becomes part of the interactive theorem prover 
-  Isabelle. For this
-  the SAT-solver needs to be implemented in ML. -
-
-  Tasks: Understand MiniSat, design and code a SAT-solver in ML, 
-  empirical evaluation and tuning of your code. -
-
-  Literature: A good starting point for reading about SAT-solving is the handbook
-  article here.
-  MiniSat is explained here and
-  here. The standard reference for ML is
-  here (I can lend you my copy 
-  of this book for the duration of the project). The best free implementation of ML is 
-  PolyML.
-   -
-
-  [CU2] A Compiler for System F-
-Description: 
-  System F is a mini programming language, 
-  which is often used to study the theory behind programming languages, but is also used as 
-  a core-language of functional programming languages (for example 
-  Haskell). The language is small
-  enough to implement in a reasonable amount of time a compiler to an
-  idealised assembly language (preferably 
-  TAL) or an abstract machine.
-  This has been explained in full detail in a PhD-thesis by  Louis-Julien Guillemette
-  (available in English here). He used Haskell
-  as his implementation language. Other choices are possible.
-   -
-
-  Tasks:
-  Read the relevant literature and implement the various components of a compiler
-  (parser, intermediate languages, simulator for the idealised assembly language).
-  This project is for a good student with an interest in programming languages,
-  who can also translate abstract ideas into code. If it is too difficult, the project can
-  be easily scaled down to the 
-  simply-typed 
-  lambda calculus (which is simpler than
-  System F) or to cover only some components of the compiler.
-   -
-
-  Literature:
-  The PhD-thesis by  Louis-Julien Guillemette is required reading. A shorter
-  paper about this subject is available here.
-  A good starting point for TAL is here.
-  There is a lot of literature about compilers 
-  (for example this book -
-  I can lend you my copy for the duration of the project). A very good overview article
-  about implementing compilers by 
-  Laurie Tratt is 
-  here.
-   -
-
-  [CU3] Sorting Suffixes-  
-Description: Given a string, take all its suffixes, and sort them.
-  This is often called suffix 
-  array sorting. It sound simple, but there are some difficulties. 
-  The naive algorithm would generate all suffix strings and sort them
-  using a standard sorting algorithm, for example 
-  quicksort. 
-  The problem is that
-  this algorithm is not optimal for suffix sorting: it does not take into account that you sort
-  suffixes and it also takes a quadratic amount of space. This is a 
-  huge problem if you have to sort strings of several Megabytes or even Gigabytes,
-  as happens often in biotech and DNA data mining. Suffix sorting is also a crucial operation for the 
-  Burrows-Wheeler transform
-  on which the data compression algorithm of the popular 
-  bzip2
-  program is based.
-   -
-
-  There are more efficient algorithms for suffix sorting, for example 
-  here and 
-  here. 
-  However the most space efficient algorithm for suffix sorting  
-  (here) 
-  is horrendously complicated. Your task would be to understand it, and then implement it.
-   -  
-
-  Tasks:
-  Start by reading the literature about suffix sorting. Then work through the
-  12-page paper 
-  explaining the horrendously complicated algorithm and implement it.
-  Time permitting the work can include an implementation of the Burrows-Wheeler 
-  data compression. This project is for a good student, who likes to study in-depth 
-  algorithms. The project can be carried out in almost all programming languages,
-  including C, Java, Scala, ML, Haskell and so on.
-   -
-
-  Literature: A good starting point for reading about suffix sorting is the 
-  book by Crochemore. 
-  Another good introduction is 
-  here, 
-  which gives also good pointers for why efficient suffix sorting
-  is practically relevant.
-  Two simple algorithms are described
-  here. The main literature is the 12-page
-  article about in-place
-  suffix sorting. The Burrows-Wheeler data compression is described 
-  here.
-   -
-
-  [CU4] Simplification with Equivalence Relations in the Isabelle Theorem Prover-
-  Description:
-  In this project you have to extend the simplifier of the 
-  Isabelle theorem prover.  
-  The simplifier is an important reasoning tool of this theorem prover: it 
-  replaces a term by another term that can be proved to be equal to it. However, 
-  currently the simplifier only rewrites terms according to equalities. 
-  Assuming ≈ is an equivalence relation, the simplifier should also be able 
-  to rewrite terms according to ≈. Since equivalence relations occur 
-  frequently in automated reasoning, this extension would make the simplifier 
-  more powerful and useful. The hope is that your code can go into the
-  code base of Isabelle.
-   -
-
-  Tasks:	
-  Read the paper
-  about rewriting with equivalence relations. Get familiar with parts of the 
-  implementation of Isabelle (I will be of much help as I can). Implement
-  the extension. This project is suitable for a student with a bit of math background.
-  It requires knowledge of the functional programming language ML, which
-  however can be learned quickly provided you have already written code
-  in another functional programming language.
-   -
-
-  Literature: A good starting point for reading about rewriting modulo equivalences 
-  is the paper here, 
-  which uses the ACL2 theorem prover. The implementation of the Isabelle theorem
-  prover is described in much detail in this 
-  programming tutorial.
-  The standard reference for ML is
-  here (I can lend you my copy 
-  of this book for the duration of the project).
-   -
-
-
- [CU5] Lexing and Parsing with Derivatives-
-- 
-  Description:
-  Lexing and parsing are usually done using automated tools, like 
-  lex and 
-  yacc. The problem 
-  with them is that they "work when they work", but if they do not, then they are
-  black boxes
-  which are difficult to debug and change. They are really quite 
-  clumsy to the point that Might and Darais wrote a paper titled 
-  "Yacc is dead". - 
-- 
-  There is a simple algorithm for regular expression matching (that is lexing).
-  This algorithm was introduced by 
-  Brzozowski 
-  in 1964. It is based on the notion of derivatives of regular expressions and 
-  has proved useful 
-  for practical lexing. Last year the notion of derivatives was extended by 
-  Might et al
-  to context free grammars 
-  and parsing.
-   -  
-- 
-  Tasks: Get familiar with the two algorithms and implement them. Regular
-  expression matching is relatively simple; parsing with derivatives is the 
-  harder part. Therefore you should empirically evaluate this part and
-  tune your implementation. The project can be carried out in almost all programming 
-  languages, including C, Java, Scala, ML, Haskell and so on.
-   -
-- 
-  Literature: This 
-  paper 
-  gives a modern introduction to derivative based lexing. Derivative-based
-  parsing is explained here
-  and here.
-  A proposal for derivative PEG-parsing is 
-  here. The mailing
-  list about PEGs is here.
-   -
-
-  [CU6] Equivalence Checking of Regular Expressions using the Method by Antimirov and Mosses-
-
-  Description: 
-  Solving the problem of deciding equivalence of regular expressions can be used
-  to decide a number of problems in automated reasoning. Therefore one likes to
-  have a method for equivalence checking that is as fast as possible. There have
-  been a number of algorithms proposed in the past, but one based on a method
-  by Antimirov and Mosses seems relatively simple and easy to implement.
-   -  
-
-  Tasks:
-  The task is to implement the algorithm by Antimirov and Mosses and compare it to
-  other methods. Hopefully the algorithm can be tuned to be faster than other
-  methods. The project can be carried out in almost all programming languages, but
-  as usual functional programming languages such Scala, ML, Haskell have an edge
-  for this kind of problems.
-   -
-
-  Literature:
-  Central to this project are the papers here
-  and here.
-  Other methods have been described, for example, 
-  here.
-  A relatively complicated method, based on automata, is described 
-  here.
-   -
-
-  [CU7] Game-Playing Engine for Five-In-A-Row on a Large Board-
-
-  Literature:
-  There is a web-page with various pointers to computer players
-  here. There are
-  also some good books about computer players, for example:
-   
-  | Artificial Intelligence: A Modern Approach by S. Russel and P. Norvig, Prentice Hall, 2003 
-  (a standard textbook about search strategies).
- |  -| Principles of Artificial Intelligence by N. J. Nilsson, Springer Verlag, 1980 
-  (a standard textbook about search strategies).
- |  -
-| Computer Game-Playing: Theory and Practice by M. Bramer, Ellis Horwood Ltd, 1983
-  (considers techniques used for programming a variety of games: Chess, Go, Scrabble, Billiards, 
-   Othello, etc; includes theoretical issues about game searching).
- |  -| Chips Challenging Champions: Games, Computers and Artificial Intelligence by
-  J. Schaeffer and H.J. van den Herik, North Holland, 2002.
- |  -| -  Artificial Intelligence for Games by I. Millington and J. Funge, Morgan Kaufmann, 2009.
- |  -| -  Computer Gamesmanship: The Complete Guide to Creating and Structuring Intelligent Games Programs 
-  by D.N.L. Levy, Simon and Schuster, 1983.
- |  -
 -  
-
-
- [CU8] Webserver for a Revision Control System-
-- 
-    Modern revision control systems are
-    mercurial and
-    git.
-   -
-- 
-    Task: Build a webserver for a revision control system 
-    that allows user management. 
-   -
-
-