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.

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!

Turing completeness

Czyli zdolność (języka programowania) do wyrażenia dowolnych obliczeń. Wystarczy sprowadzić go do Maszyny Turinga.

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ę)?

Odpowiedź

Nie mogę, jeśli język jest Turing-kompletny.

Sprytne kontrakty

"Jeśli dostanę 10ETH od A, automatycznie przeleję 11ETH do B".

 

W Ethereum pisane w Solidity.

Sprytne (?) kontrakty

Jak udowodnić, że program nie robi głupot?

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?

Słaba normalizacja i totalne programowanie

Umawiamy się, że:

  • pozwalamy tylko na prostą rekursję,
  • wszystkie funkcje muszą być totalne.

 

Problem stopu przestaje nas dotyczyć!

Simplicity

[...] Simplicity is finitarily complete, allowing the programming of all finite computations [...], it is Turing incomplete, disallowing unbounded loops and allowing for static analysis. 

Co nam to wszystko daje?

Możliwość udowodnienia, że program robi to, co chcemy.

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
  • ...

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".

Computability

By Piotr Moczurad

Computability

  • 182