Obliczalność i złożoność
Na co to komu?
W planach:
- Programowanie funkcyjne
- Sprytne kontrakty
- Kompilatory
- Dużo GIF-ów
Alonso Church
Funkcje nie muszą mieć nazw, żeby opisać dowolne obliczenia.
![](https://media1.giphy.com/media/13sfSbipN53nKE/giphy.gif)
Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
fib = lambda f: lambda n: 0 if n == 0 else (1 if n == 1 else f(n-1) + f(n-2))
>>> [Y(fib)(i) for i in range(10)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Alan Turing
1. Teoretyczny model dla dowolnych obliczeń, podobny do obecnych komputerów.
2. To to samo, co rachunek lambda!
![](https://media2.giphy.com/media/mOCoFRVfkW8eI/giphy.gif)
Turing completeness
Czyli zdolność (języka programowania) do wyrażenia dowolnych obliczeń. Wystarczy sprowadzić go do Maszyny Turinga.
![](https://media1.giphy.com/media/ekGlzwJJN8aTiJKwoQ/giphy.gif)
Wrócimy do tego.
Pytanie
Czy patrząc na program, mogę powiedzieć, czy się nigdy nie "zawiesi" (np. wpadając w nieskończoną pętlę)?
![](https://media0.giphy.com/media/WrgAGkGrh0MD1Z2gkO/giphy.gif)
Odpowiedź
Nie mogę, jeśli język jest Turing-kompletny.
![](https://media2.giphy.com/media/eKrgVyZ7zLvJrgZNZn/giphy.gif)
Sprytne kontrakty
"Jeśli dostanę 10ETH od A, automatycznie przeleję 11ETH do B".
W Ethereum pisane w Solidity.
![](https://media2.giphy.com/media/fRNx3wgqr0Iww/giphy.gif)
Sprytne (?) kontrakty
Jak udowodnić, że program nie robi głupot?
![](https://media2.giphy.com/media/ehdpfwOSbIKtO/giphy.gif)
Propositions as types
Typy to twierdzenia, programy to dowody.
Potrzeba "fajnych" typów, które potrafią powiedzieć np. "biorę wektor dł. N, wektor dł. M i zwracam wektor dł. (M+N)". W kodzie:
app : Vect n a -> Vect m a -> Vect (n + m) a
app Nil ys = ys
app (x :: xs) ys = x :: app xs ys
STOP! Hammertime.
Patrząc na taki "fajny" program mogę powiedzieć:
- czy robi to, co chcę?
- czy nie wpada w nieskończoną pętlę?
Jak to zrobić, mając na uwadze Problem Stopu?
![](https://media1.giphy.com/media/WnCAPfflyfZjG/giphy.gif)
Słaba normalizacja i totalne programowanie
Umawiamy się, że:
- pozwalamy tylko na prostą rekursję,
- wszystkie funkcje muszą być totalne.
Problem stopu przestaje nas dotyczyć!
![](https://media3.giphy.com/media/3o72F3cxcGkgh394d2/giphy.gif)
Simplicity
[...] Simplicity is finitarily complete, allowing the programming of all finite computations [...], it is Turing incomplete, disallowing unbounded loops and allowing for static analysis.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/883620/images/6239845/simplicity.jpg)
Co nam to wszystko daje?
Możliwość udowodnienia, że program robi to, co chcemy.
Dobre początki: http://learnyouanagda.liamoc.net/pages/introduction.html
Możliwość automatycznego generowania testów!
Możliwość przeczytania wielu wspaniałych książek/artykułów i błyszczenia w towarzystwie.
Przykładowo:
- Pierce: Types and Programming Languages
- Wadler: Theorems for Free
- Wadler: Propositions as Types
*porada, jak znaleźć towarzystwo, któremu to imponuje, jest poza zakresem wykładu
Kto tego potrzebuje?
- banki
- fundusze inwestycyjne
- giełdy
- kryptoplatformy do kryptowalut
- ...
![](https://media1.giphy.com/media/wRcYZizlynpNS/giphy.gif)
Podsumowanie
Znając teorię mnogości, logikę, teorię typów, obliczalności, kategorii, etc. można korzystać z ich synergii i wykorzystać to do bycia "programistą 10x".
![](https://s3.amazonaws.com/media-p.slid.es/uploads/883620/images/6239911/haskell.png)
Computability
By Piotr Moczurad
Computability
- 182