/cht/ – chat


a237ba237b4adbdbd4fa29abf1f646fdcf40a – ``chat''

@685d68bca73a4d028981fa214f05f065 Anonymous 2015-03-13 22:54:05
test message
@d56a48976ec94842bef40ce077856d71 fulmar 2022-02-03 08:42:24
Тогда можно избавиться от абстракции:
t := F          константа
  | (t -> t)    стрелка
  | (t t)       аппликация
  | x           переменные

Но как тогда определить что такое свободная/связанная переменная?
Имеем (∀x. t) = (x -> t). Значит переменная x в терме t связанная если t имеет вид (t1 -> t2) где t1 редуцируется в x.
@9e47dbfbdac54b7db353d02f98bccc52 fulmar 2022-02-03 08:50:58
Да, охуенно получается.
@0def34547cae46b5a0374369f2b35a90 fulmar 2022-02-03 09:03:08
Примеры вычислений:
(x -> x -> x) F
= (F -> F)

(x -> x -> x) F F
= (F -> F) F
= F

Т.е. когда есть переменная слева от стрелки, то совершается подстановка, а иначе происходит редукция стрелок.
@838dbb9c801d41f59b10e85b2e830c2c fulmar 2022-02-03 09:45:38
Evaluation rules (t → s means that t evaluates to s):
t1 → t1'
--------------------          (E-App1)
 (t1 t2) → (t1' t2)


      t2 → t2'
--------------------          (E-App2)
 (t1 t2) → (t1 t2')


          t1 → x
--------------------------    (E-AppArr1)
 ((t1 -> t2) s) → [s↦x]t2


 t1 ↛ x    t1 → s    t3 → s 
----------------------------  (E-AppArr2)
    ((t1 -> t2) t3) → t2
@efc56bfd509a46c180cd2a9453cd4bcc fulmar 2022-02-03 10:27:49
Не, хуйня, просто одно обозначение на другое поменяли.
@7ea582afec2e4ed499b1f43860c48972 fulmar 2022-02-03 14:17:03
@f1d50@f1d503d4f5dc4ac4a454dcc5ce19b3fb Брутфорс решение:
fn find-fastest-equivalent-program(f, inputs, max-mem) {
    let mut fastest = none;
    let mut best-avg-time = infinity;
    foreach (g in all-programs(max-mem)) {
        if let some(g-avg-time) = find-avg-time(f, g, inputs) {
            if g-avg-time < best-avg-time {
                fastest = some(g);
                best-avg-time = g-avg-time;
            }
        }
    }
    fastest
}
fn find-avg-time(f, g, inputs) {
    let mut g-avg-time = 0;
    foreach (x in inputs) {
        let (time, res) = eval(g, x);
        if res != f(x) { return none; }
        g-avg-time += time / inputs.count;
    }
    some(g-avg-time)
}

Но это хуйня полнейшая, которую невозможно применить на практике.
@e2e6b4366d414349b8e0225ef22fbd4d fulmar 2022-02-03 14:28:43
Наверное для любых двух эквивалентных программ f и g должен существовать набор каких-то элементарных преобразований такой, что применив все эти преобразования к программе f (к её тексту, например) мы получим g. Это гипотеза. Причем преобразования должны быть непрерывными, т.е. после каждого шага преобразования мы должны получать эквивалентную программу.
@3bd868f8ac1a449c920de4a370b497d5 fulmar 2022-02-03 14:31:09
Такой набор преобразований можно назавать путём из f в g. Если такой путь существует, то значит программы эквалентны. И наоборот.
@468773f70c85485183e73f96ea883ce4 fulmar 2022-02-03 14:34:13
Найти бы эти элементарные преобразования...
@5f6f0d2bd04a48e0afcaf7741e781f9e fulmar 2022-02-03 14:36:26
Ну η-reduction (λx.f x = f if x is not a free variable of f) очевидно подходит.
@0875c7ba714949c1a4fdbd7ef15a2a41 fulmar 2022-02-03 14:36:43
А что ещё?
@52b5821833a64a8eb7da42b97cb9dbcf fulmar 2022-02-03 14:57:51
По сути, это то же самое, что и доказательство теорем. Доказательство импликации A -> B это тоже путь из А в B.
@5f105efae89e427290a9919f018990dd fulmar 2022-02-03 15:03:19
@e2e6b@e2e6b4366d414349b8e0225ef22fbd4d эту гипотезу доказать бы. Но сначала нужно определиться о каких преобразованиях идёт речь.
@2e7461ecf4c24afe99ef2ce6c6f21c28 fulmar 2022-02-03 15:06:48
Если бы ещё каждое такое преобразование уменьшало среднее время, то было бы вообще хорошо.
@cc57af75565b4c98b5e3c26a884a65ca fulmar 2022-02-03 15:11:56
Ещё одно преобразование: если в коде есть повторение вызова функции ...f(x)...f(x)..., то очевидно это можно улучшить вычислив результат один раз и сохранив в переменную.
@3b43fed85fdb4aaf9607fbfb73d2ca7e fulmar 2022-02-03 15:38:28
@7ea58@7ea582afec2e4ed499b1f43860c48972 ещё дополнительный параметр max-len нужен (максимальная длина программы) иначе оно найдёт ту, которая состоит тупо из пар (x, f(x)) для всех x.
@4dbaf31b355048d7a58d471cd1ecdcfa fulmar 2022-02-04 03:20:21
@1f3e37d12c034e2280d8a5e3eecbdf6f fulmar 2022-02-04 03:22:14
Кстати такую хуйню просто можно на уровне линтера запретить.
@0f0fbbf8456c4bc485588504c06c6c4a fulmar 2022-02-04 03:27:30
У каждой программы f есть эквивалентная ей программа вида:
fn g(x) {
    match x {
        x1 -> y1,
        x2 -> y2,
        ...
        xn -> yn,
    }
}

такая что для любого x из конечного можества inputs верно, что f(x) = g(x).
@cc34541ff4bf4b889df17bedd8e4a730 fulmar 2022-02-04 03:27:55
Если из любой эквивалентной программы существует путь в любую другую эквивалентную программу, то значит должен существовать путь из g в любую эквивалентную ей программу. Значит чтобы придумать необходимые преобразования, нужно подумать как программу g можно преобразовывать.
@5b3c75635757402683f2331f9f84e7c8 fulmar 2022-02-04 03:28:10
Если там есть какой-то очевидный паттерн, то её можно сделать короче. Например, если y1 = y2 = ... = yn = x, то тогда её можно сократить до fn g(x) { x }. Можно конечно и увеличить длину g добавив ненужные пары.
@40e7da7aca91480dbfd9fff7113c0e9b fulmar 2022-02-04 03:31:24
Кстати, получается, что если прога f2 медленнее проги f1, то значит путь из f1 в f2 не может существовать через улучшающее преобрзование, только через ухудшающее.
@3a805bd7d827449dac388da12285cb81 fulmar 2022-02-04 03:34:56
Но возникает вопрос, верно ли, что из любой программы f существует путь состоящий только из улучшающих преобразований в любую другую эквивалетную ей и лучшую программу g? Или может оказаться, что мы застранянем в каком-то локальном минимуме и придётся обратно возвращаться?
@9e8aa442ed9d4d3fa6c9820c59ec362d fulmar 2022-02-04 04:07:06
@3a805@3a805bd7d827449dac388da12285cb81 нет, это не верно. Да, будут локальные минимумы. Потому что f можно улучшить через такое преобразование:
fn g(x) {
    match x {
        x1 -> y1,
        _ -> f(x),
    }
}

если в f вычисление f(x1) было медленнее чем g(x1). Таким образом мы размотаем функцию, дойдём до максимльной разрешённой длины и застрянем. Дальше придётся откатывать эти "улучшения", а это будут ухудшающие преобразования.
@f6b2ccf623024cfcac0bce533cfcbaeb fulmar 2022-02-04 04:15:15
Улучшающие преобразования можно разделить на два вида - те, которые увеличивают длину программы и те, которые её уменьшают.
@72e805a447b24e96ae74f21a2b694423 fulmar 2022-02-04 04:17:31
Тогда @3a805@3a805bd7d827449dac388da12285cb81 можно переформулировать заменим "улучшающих преобразований" на "улучшающих сокращающих преобразований".
@40ded822ab9b4cf0810d9e2a7249ddd9 fulmar 2022-02-04 04:26:11
Но сначала всё таки надо понять верна ли гипотеза @e2e6b@e2e6b4366d414349b8e0225ef22fbd4d
@13a852f535904f6c8d07e6e88847406f fulmar 2022-02-04 04:36:01
Она говорит о том, что если для программы f каждый элемент её класса эквивалетности представить в виде вершин графа, а ребра - это преобразования, то тогда этот граф связный.
@17574e41b52b47ea8524a4f8109aa6a9 fulmar 2022-02-04 04:37:50
Но есть дополнительные ограничения по памяти и длине.
@be3d65999a594bd59212d2ab550558fe fulmar 2022-02-04 04:51:17
Ладно, для начала хотя бы без ограничений понять бы.
@efc46ff7bad649b7be429929fec5e265 fulmar 2022-02-04 04:52:16
Единственное только уточнение ещё - это то, что эквивалентность рассматривается только на заданном конечном множестве входов. Обязательно конечном.
@c1196305c8de400f8ef93fe6c54f7def fulmar 2022-02-04 04:54:46
Понятно, что каждую программу можно размотать в программу вида @0f0fb@0f0fbbf8456c4bc485588504c06c6c4a Т.е. по крайней мере в эту программу точно есть путь.
@00bd1fbd9117410fb6846fec25c92ffb fulmar 2022-02-04 04:56:18
Ну и раз так, то значит есть и обратный путь из неё в любую другую эквивалентную программу. Значит гипотеза (без ограничений) точно верна.
@9cac42955b704d03a18e68b190465061 fulmar 2022-02-04 04:56:30
Но так не интересно.
@c22f0878fab34422b2c9e112ce05100f fulmar 2022-02-04 04:59:19
На практике мы не можем разматывать проги в @0f0fb@0f0fbbf8456c4bc485588504c06c6c4a
@f941c08cc7f54ae889ddea8157820c00 fulmar 2022-02-04 05:01:09
Т.е. на практике невозможно через неё прокладывать каждый путь.
@0643c3dc59a04112a492a8f82b661ca7 fulmar 2022-02-04 05:11:33
Но если добавить ограничения, то непонятно всё становится. Да, при каких-то ограничениях возможно граф будет связным. Если ограничения слишком жёсткие, то не будет.
@0ab6ca00532246c2baf050ab0a8d1ff9 fulmar 2022-02-04 05:27:32
В классе эквивалетности [f] программы f: X -> Y на конечном подмножестве I ⊆ X можно ввести линейное отношение порядка. Для любых программ g и h из этого класса отношение g <= h верно тогда и только тогда когда среднее время выполнения программы g на каждом входе из I меньше либо рано среднему времени выполнения программы h на тех же входах.
@e48e073551d1498082cb1bd6e5e08fac fulmar 2022-02-04 05:29:46
Рефлексивность очевидна. Транзитивность тоже.
@6d0005dd6bc1454f8e3d9f6331025a6b fulmar 2022-02-04 05:30:09
Тотальность тоже.
@c93b1278219d4c9a8b7cb47457e5c5c9 fulmar 2022-02-04 05:32:37
А вот антисимметричность не выполняется - может быть две разные эквивалентные программы с одинаковым средним временем. Значит всё-таки не линейное отношение.
@31cf62e487e54f7ebc2925852d7ec0c3 fulmar 2022-02-04 05:36:36
Значит это предпорядок.
@75ab2cd1e15b4d2a9819f09f10704c47 fulmar 2022-02-04 05:39:02
Total preorder.
@4709775ce2364d86b2c7dc01bfaaa04e fulmar 2022-02-04 05:55:44
Для total preorder существует линейный порядок на фактормножестве.
@ea0627995f014afb92a91cad995187aa fulmar 2022-02-04 06:06:16
Теперь допустим, что из множества [f] убрали все программы, которые используют больше чем max-mem памяти, а также те длина которых больше max-len.
@af80cd0212234550b416b8a646f98803 fulmar 2022-02-04 06:44:53
Определение преобразования (первый блин). Преобразование t - это программа, которая для любой программы f возвращает элемент g из множества [f].
@dcd1493adb9444348d74080a3368a876 fulmar 2022-02-04 06:47:44
Улучшающее преобразование t - это такое преобразование, что t(f) <= f верно для любого f.
@a820a2b2b061484bbbe22fc2bc5ea36c fulmar 2022-02-04 07:05:17
Вопрос: существует ли множество T = {t1, t2, ..., tn} улучшающих преобразований такое, что для любой программы f существует набор (q1, q2, ..., qm), где каждый qi - это элемент T, такой, что программа q1(q2(...qm(f)...)) <= g для любого g из [f].
@0f5d66fe0ef54204acb1cf4707b13192 fulmar 2022-02-04 07:09:17
Очевидно, что да. В качестве t1 можно взять программу @7ea58@7ea582afec2e4ed499b1f43860c48972, n = 1, q1 = t1, m = 1.
@bb891f3f05314f0bbf25b2ff777a4e62 fulmar 2022-02-04 07:11:31
Да, поэтому первый блин комом. Нужно менять определение @af80c@af80cd0212234550b416b8a646f98803
@910e5889f81d4d8db93f791e7cfa2062 fulmar 2022-02-04 07:13:15
Интуитивно, преобразованием программы - это небольшое изменение текста программы за какое-то реалистичное не очень большое время. Но как это сформулировать формально?
@f8d7ffc0ce8e47ad8a7759e284a025c7 fulmar 2022-02-04 07:39:59
Преобразование не обязательно инъективно. Например, преобразование, которое удаляет неиспользуемую переменную. В разных программах может быть в разных местах неиспользуемая переменная и может оказаться, что после преобразования программы будут равны, но исходные программы - нет.
@2368d9d59e9540bdbed8d99777345002 fulmar 2022-02-04 07:55:41
Нужно наверное определиться с моделью вычислений. Так наверное будет проще.
@713ae9a1846f4a759f82e8e1f47bb9a3 fulmar 2022-02-04 07:58:05
Тьюринг машина с конечной лентой и автодетектом зацикливания, в принципе, подходит. Но это неудобная модель и слишком оторванная от реальности.
@5b43d8c88e86494a863c8b302dee338e fulmar 2022-02-04 07:59:38
Можно рассмотреть DFA, но для реальный программ они будут огроебенными из-за огромного количества стейтов.
@e338ce9ac9524e2689544a2c6b90ec64 fulmar 2022-02-04 08:39:12
Хотелось бы модель вычислений без мутабельности.
@0902a4bded36403f8b12be29c3d8a415 fulmar 2022-02-04 10:40:46
В лямбда исчислении я не представляю как ограничение памяти ввести.
@760d1c0709c143598ef3b08f2b441934 fulmar 2022-02-04 10:42:22
По сути, потребление памяти можно наверное измерять как максимальная длина терма в процессе вычисления.
@c227002376084968823672a64f3942f0 fulmar 2022-02-04 10:43:59
Ну да, в принципе, а что ещё надо? Ничего.
@85acff7e451e4021976f057e9a61c789 fulmar 2022-02-04 10:45:05
Но у лямбда исчисления ебанутая семантика, с ней сложно будет.
@e53aebdd49054987b60898c0aec054b7 fulmar 2022-02-04 10:46:22
Конкатенативщина остаётся только.
@2ada80abc7e84bf587f15339b7391d5a fulmar 2022-02-04 10:58:40
Но это та же хуйня по сути, поэтому всё равно.
@90f49819270c4992a63111dd3c927fd5 fulmar 2022-02-05 03:20:07
@85acf@85acff7e451e4021976f057e9a61c789 Лямбда исчисление надо брать, короче.
@659c02b073d94bceafd9d77185b76222 fulmar 2022-02-05 03:40:32
Определение длины терма:
|x| = 1
|(t1 t2)| = |t1| + |t2|
|(\x. t)| = |t| + 1

Длина терма равна количеству переменных в терме.
@817570f2ed544a8f81cc75d2fe0deca6 fulmar 2022-02-05 04:25:36
Функция - это лямбда абстракция без свободных переменных. Значение - это функция.
Пусть f - функция, I - какое-то множество значений. Если для любого x из I после каждого шага вычисления (beta редукции) терма (f x) длина получающегося терма не превышает какого-то значения L, то будем говорить, что функция f на множестве I использует не более чем L памяти.
@19f9282878e24b13a589aeaca7d2d833 fulmar 2022-02-05 04:47:08
Будем говорить, что терм t находится в L-beta нормальной форме если |t| <= L и либо в t нет beta-редексов, либо редукцию любого бета-редекса в t приводит к увеличению длины терма.
@afe2eebc2f5843559009294a7e838047 fulmar 2022-02-05 04:49:40
@19f92@19f9282878e24b13a589aeaca7d2d833 к увеличению длины терма, которая больше L.
@009c48f5f897487089e0839282f9465c fulmar 2022-02-05 04:54:48
Нет, лучше так не определять нормальную форму потому что она будет не уникальной.
@cb795f064743453bb0dd943b1dfc2c99 fulmar 2022-02-05 04:58:14
Надо вот так. Будем говорить, что терм t находится в L-beta нормальной форме если |t| <= L и в t нет beta-редексов.
@a24d86a1e6f04aae9e9052c024529db7 fulmar 2022-02-05 05:03:04
Аналогично, терм t находится в L-beta-eta нормальной форме если он в L-бета нормальной форме и в нём нет eta-редексов.
@5f896cd27c134581962b156fb6933713 fulmar 2022-02-05 05:42:45
Для любых двух термов t и s отношение равенства t = s означает, что с помощью alpha-конверсии, beta и eta редукций их можно преобразовать к одному и тому же терму.
Для любых двух функций f, g и множества значений I отношение эквивалентности f ~ g означает, что (f x) = (g x) для любого x из I.
@5dd2ec5a2af049459a3ef52b5acedf2b fulmar 2022-02-05 05:56:04
Для данного L, время вычисления time(t) терма t - это количество шагов (beta-редукций) вычисления этого терма до L-beta-нормальной формы (если её нет, то время вычисления считается бесконечным).
@3ee5984d63d74b8596fbec89efb98b70 fulmar 2022-02-05 07:53:53
@5dd2e@5dd2ec5a2af049459a3ef52b5acedf2b Нет, неправильно. Вычисление этого терма до значения, а не нормальной формы.
@df9284c88dae4428a42ec78030d61cd2 fulmar 2022-02-05 07:58:14
Время вычисления time(t) терма t - это количество шагов (beta-редукций) вычисления этого терма до значения.
@0bc051f8ff62456582f2d9cdf1f19e5d fulmar 2022-02-05 08:10:32
Преобразование терма [s->x]q в терм ((\x. q) s) называется gamma-преобразованием. Это обратное к beta-редукции преобразование.
@909796d5419249cb87638e0ba615b39b fulmar 2022-02-05 08:14:46
Преобразование терма f в терм (\x. f x), где x не является свободной переменной терма f, называется delta-преобразование. Это обратное к eta-преобразование.
@701497ac1a23497984a04399d69d4682 fulmar 2022-02-05 16:17:26
@bb891@bb891f3f05314f0bbf25b2ff777a4e62 Нет, определение верное, вопрос поставлен неправильно.
@bfa829effea54cd18c70bf75adc1dbc9 fulmar 2022-02-05 16:21:29
LT-преобразование - это преобразование p такое, что |p| <= L и для любой программы |f| <= L, time(p f) <= T.
@d987ed43fb9d4a8e8ded67a9969860eb fulmar 2022-02-05 16:57:37
Вопрос состоит в том чтобы найти нужные улучшающие (наверное лучше говорить не ухудшающие) преобразования чтобы выполнялось @a820a@a820a2b2b061484bbbe22fc2bc5ea36c
@ef86e6ac415a486886390fc489f1d9ea fulmar 2022-02-06 07:51:53
Вангую скоро будет мода на культурность.
@45f0a4c043f249f289d2e5ec2016172b fulmar 2022-02-06 09:43:21
@d987e@d987ed43fb9d4a8e8ded67a9969860eb Надо разбивать функции на классы по сложности и решить проблему оптимизации функций сначала для самого простого класса функций.
@2ac7569a0d1e40e4b22ec375b7a17533 fulmar 2022-02-07 06:14:35
Хотя нет, Бордобус - я понял о чём это. Это кто-то из израиля.
@246e52e566c54c17b25bde72f4c661f8 fulmar 2022-02-07 11:54:22
@45f0a@45f0a4c043f249f289d2e5ec2016172b Можно выделить класс функций С0(L) - это функции, которые не используют рекурсию (в том числе и другие рекурсивные функции) и длина которых не превышает L.
@1398191aca7142a28a3a124993a9ad78 fulmar 2022-02-07 11:54:40
Функции класса С0(L) могут вызывать друг друга, но только уже определенные функции (чтобы не было рекурсии).
Т.е. если построить граф зависимостей функций, то это будет DAG. Зависимые функции в этом классе можно инлайнить.
@5ed8b85a23a441e7b69e278f378e251f fulmar 2022-02-07 11:55:23
Есть 4 способа избавиться от if p { t } else { s } на входах I:
- если t = s, то if можно заменить просто на t
- если t = f(X) и s = g(X) и f ~ g, то будет f(X) если f <= g или g(X) если g <= f
- если p истинно на всех входах I, то будет t
- если p ложно на всех входах I, то будет s
@b010ff46cf154096adadb87d773bb762 fulmar 2022-02-07 11:58:33
Есть только один спобоб избавиться от let x = t; - только если x не используется.
@5393b3f9bc81433a9d8dbbc2fa2f87f9 fulmar 2022-02-07 19:55:34
@5ed8b@5ed8b85a23a441e7b69e278f378e251f Ещё два случая возможны. p может не зависеть от входных переменны и тогда можно его заранее высчитать и подменить if на t либо s. И ещё может быть, что s = t когда p = true/false, например, if x == 5 { 5 } else { x }. Вот тепереь вроде бы всё.
@3a7d38f79b144cd8bd6a798cb09ae28c fulmar 2022-02-09 05:37:37
Всё-таки лямбда исчисление неудобная модель для рассуждений.
@5c95560b919842e59646f421c0e79055 fulmar 2022-02-09 05:38:20
Лучше вот такая модель вычислений.
Есть натуральные числа: 0, 1, 2, ...
Есть функция инкрементирующая число: succ.
Есть функция сравнения чисел: ==.
Есть условное выражение: if 1 == 3 { 4 } else { 5 }.
Есть булевы значения: 0 - ложь, любое другое число - истина.
Eсть определение функций: fn foo(x, y) { if x == 5 { x } else { succ(y) } }.
Есть определение переменных внутри функции: let x = succ(5);.
Каждая функция числовая, т.е. на вход берёт n чисел и возвращает одно число.
Разрешается рекурсивный вызов определяемой функции.
Внутри функции разрешается вызывать ранее определённые функции.
@ce46499652cb40bcb47a7579fe9cfb0c fulmar 2022-02-09 05:38:28
Она тьюринг полная.
@6e7f22713a62481ea72eac009ea2067a fulmar 2022-02-09 05:41:15
Логиские операторы !, &&, ||, -> легко определяются через if'ы, остальные операторы сравнения чисел <=, !=, <, >, >= тоже легко определить.
@a6c50a00f05b48c4ab993ee007a277d8 fulmar 2022-02-09 05:43:21
Для определения <= нужна рекурсия. Поэтому лучше взять его за основной оператор, а не ==. Тогда == и остальные операторы можно определить через <= без рекурсии.
@88781100e28d482fa74171e727e1039a fulmar 2022-02-09 05:49:49
Каррирования нет, частичного применения нет, функций высшего порядка нет.
@4e6f064c3fdb447894a3c160f48812d3 fulmar 2022-02-09 05:50:20
Очень простая и удобная модель.
@8188dd9593234b87ac8fac231bbf8a56 fulmar 2022-02-09 06:20:43
Класс C1(L) - это все рекурсивные функции длины не больше L, которые могут вызывать функции из C0(L).
Класс C2(L) - это все не рекурсивные функции длины не больше L, которые могут вызывать функции из C1(L).
Класс C3(L) - это все рекурсивные функции длины не больше L, которые могут вызывать функции из C1(L) либо C2(L).
Класс C4(L) - это все не рекурсивные функции длины не больше L, которые могут вызывать функции из C3(L).
Класс C3(L) - это все рекурсивные функции длины не больше L, которые могут вызывать функции из C3(L) либо C4(L).
И т.д.
@95f753af97a54f96980aa4116b5a6f9e fulmar 2022-02-09 06:23:00
Cn(L), где n = 2k - 1 или n = 2k, k - это количество вложенных рекурсий.
@c710fa94772b4122a914b2195af4aca5 fulmar 2022-02-09 06:23:35
@8188d@8188dd9593234b87ac8fac231bbf8a56 *С5
@9ab65d2d935a4036843f3a2bad2a0e06 fulmar 2022-02-09 10:20:07
Помню у меня в детстве часто было, что я одно и то же место воспринимал очень по разному в разное время. Будто это вообще разные места. Сейчас такое происходит очень редко.
@3e105c5dbf894d58817fdda760be48c4 fulmar 2022-02-09 10:27:00
Может такое происходит потому что ты просто физически мелкий?
@7bae160c772e4e3387184b7180445946 fulmar 2022-02-10 05:19:23
Интересно, что имликация выражается через <= и если рассмотреть все функции из C0, которые могут использовать только оператор <= и входные переменные, то это будут все логические высказывания исчисления высказываний. И чтобы понять как можно ускорить такую программу, нужно понять как можно сократить логические выражение, а это значит найти какие его части всегда истинны/ложны при любом значении зависящих переменных, а это эквивалетно решению SAT. Прикольно.