Section 3 : functions ===================== This short section is an introduction to "abstract" functions in Lean. We've seen functions from the naturals to the reals, but here we'll be talking about functions between types ``X`` and ``Y``. Lean is a functional programming language, and functional programmers realised a long time ago that brackets which mathematicians put into their work are often not necessary. If ``f : X → Y`` and ``x : X`` then write ``f x`` in Lean instead of ``f(x)`` (which doesn't actually work in Lean at all). Brackets can be used -- but you have to leave a space (so ``f (x)``) and they are optional anyway. Be warned though -- functions in Lean are *greedy*: they will eat the next thing they see. For example ``f n + 1`` means ``(f n) + 1`` and not ``f (n + 1)``. If you want ``f (n+1)`` then you need to use the brackets. Similarly, composite of functions ``f : X → Y`` and ``g : Y → Z`` evaluated at ``x : X`` needs to be written ``g (f x)`` otherwise ``g`` would eat ``f`` and then choke because ``f`` doesn't have the right type. The problem sheets ------------------ For the first sheet you should be able to get away with what you already know. In the second one I explain how to make types with finitely many terms, and how to make functions from these types. In the last sheet I show how to use these to make counterexamples to various assertions about injective and surjective functions.