Александр Грызлов
Программист-исследователь
IMDEA Software Institute
Peredelanoconf
25/01/2025
От программ к сложным системам
Равенства, порядки и вычисления
может быть
тривиально однозначным:
A = A 5+2 = 7
структурным:
{1,2,3} = {3,1,2}
неочевидным:
quicksort(xs) = mergesort(xs)
А "вложено в" или "предшествует" B
A ≤ B ⇔ ∃X,B = A+X
A и B могут быть преобразованы друг в друга
A=B ⇔ A ≤ B ≤ A
Идея порядка вездесуща
в программировании и математике:
A → B ~ A ≤ B
aka Бёма-Якопини (1966)
Любую программу можно разбить на 3 управляющие структуры:
1. последовательное выполнение
2. ветвление
3. цикл
Программа накапливает информацию, двигаясь вперед по переходам и производя ветвления
Циклы (или рекурсия) дают нам автоматизацию, но и делают рассуждения о программах сложнее
Можем ли мы всегда гарантировать что программа не впадает в бесконечный цикл?
Нет! Задача остановки, Тьюринг (1936)
Математически вычисление программы с циклом эквивалентно нахождению неподвижной точки
f
aka Кнастера-Тарского (1955)
Если f "не теряет" информацию (монотонна)
и порядок не имеет "петель",
то неподвижная точка существует всегда
Заменив "естественный" порядок программы на "хорошее" приближение, мы можем узнать свойства программы, не запуская её целиком
Игрушечный язык с if, рекурсией и целыми числами:
fact(x) =
if lte(x, 1) then 1
else x * fact(x - 1)
Порядок его значений: ⊥ ≤ ... -1 ≤ 0 ≤ 1 ≤ ...
Сгруппируем их по знаку:
Ключевой компонент оптимизирующих компиляторов и инструментов верификации
Aвтоматизация мышления
Ричард Саттон, основатель обучения с подкреплением:
Главный урок, который можно извлечь из 70 лет исследований в сфере ИИ, состоит в том, что общие методы, максимально использующие вычисления, в конечном итоге оказываются наиболее эффективными, причем с большим отрывом. Главной причиной этого является закон Мура, а точнее, его обобщение о продолжающемся экспоненциальном падении стоимости единицы вычислений.
нет "потерянных точек"
мы всегда можем найти объект множества
по его описанию
(X → Bool) → X
aka Тихонова (1935)
p :: String -> Bool
p x = x == "password"
selectChar :: Ord r => J r Char
selectChar p = maxWith p ['a'..'z']
eightchars :: Ord r => [J r Char]
eightchars = replicate 8 selectChar
product :: [J r a] -> J r [a]
$ product eightchars p
> "password"Классическая поисковая проблема:
булевая выполнимость (SATisfiability)
P ⇒ (Q ∧ ¬ R) P ∧ ¬ P
P ← true
Q ← true
R ← false
aka Кука-Левина (1971-73)
задача SAT NP-полна
(т.е., в общем случае не может быть решена кроме как полным перебором)
Булевая выполнимость удобна как фундамент
A ≤ B ⇔ ∃X,B = A+Xget / set){-@ elemAt :: xs:[a]
-> { i:Int | 0 <= i && i < len xs }
-> a @-}
elemAt :: [a] -> Int -> a
elemAt (x : _) 0 = x
elemAt (_ : xs) i = elemAt xs (i-1)От программ к сложным системам
Классическая сфера применения моделей - распределенные процессы и проектирование железа
Для программ со сложными спецификациями уже не хватает обычных порядков, нужна дополнительная структура
5 ≤ 7 единственным образом
"abba" → 2 ?
"abba" → IO 2 ??
Категории
Сложные системы
часто двунаправлены!
aka Фонга-Спивака-Туйераса (2017)
backpropagation может применяться в более широком контексте, чем только к нейронным сетям
Кибернетика aka теория управления
"программы", находящиеся во взаимодействии со внешними объектами
2 ключевых аспекта:
составные игры
максимизация выигрыша