An Agda proof of the Church-Rosser theorem for a simply typed lambda calculus with general recursion.

## root

```
An Agda proof of the Church-Rosser theorem for a simply typed lambda calculus
with general recursion. I have checked it with Agda-2.4.2.2 and
stdlib-2.4.2.3.
I wanted to use a lambda calculus with general recursion because I wanted to be
sure that I could not "cheat" in my proof of the Church-Rosser theorem by using
strong normalization to lift local confluence to global confluence. I added
general recursion to the simply typed lambda calculus (STLC) by adding fixpoints
of types for arbitrary (invariant) type functors. This give both recursive
types and allows one to define a fixpoint combinator.
The STLC itself has no polymorphism, but one can use the polymorphism in Agda to
define terms polymorphically. This allows one to simulate rank-1 polymorphism.
A simple, normal-order lambda calculus interpreter is also defined.
The proof of the Church-Rosser theorem very loosely follows the proof described
in "Church-Rosser Made Easy" by Dexter Kozen (DOI 10.3233/FI-2010-206). I
define a type of terms with some subset of beta-redexes marked. Redexes can be
marked in various "colours". I defined a bottom-up traversal to reduce those
marked redexes for a subset of colours. This traversal eliminates marked
redexes of those colours. Redexes of other colours are tracked and may be
duplicated (or eliminated) by substitution. The key lemma
(STLC.Marked.marked-reduce-twice) says that when you eliminate a subset of
coloured redexes this way, and then eliminate the rest of the colours, the
resulting term is the same as if you eliminated all marked redexes in a single
pass.
src/STLC:
Types.agda - Definition of types and type substitution for the STLC
Terms.agda - Definition of terms and term substitution for the STLC
Beta.agda - Definition of the "reduces to" relation on terms.
Normalize.agda - A normal order STLC interpreter
Marked.agda - Definition of terms with marked beta-redexes and bottom-up
reduction of marked redexs.
ChurchRosser.agda - The Church-Rosser theorem.
Disclaimer: This is not an official Google product (experimental or otherwise),
it is just code that happens to be owned by Google.
```