185 похожих чатов

Но это же не связано с изначальным утверждением, что язык

с ограничениями в виде той же системы типов обязательно не позволяет выразить какие-то вполне корректные программы, выразимые, не будь этих ограничений.

Или я не понимаю вашу логику?

23 ответов

24 просмотра

Не могу сказать связано или не связано, зато точно могу ответить что "язык с ограничениями в виде той же системы типов обязательно не позволяет выразить какие-то вполне корректные программы, выразимые, не будь этих ограничений". Это свойство называется "полнота" (aka completeness). Если система типов (или любая другая система ограничений) полна, это значит, что можно написать все корректные программы. Среди динамических (runtime) систем ограничений/проверок/мониторов встречаются полные, среди статических — нет. Во всяком случае таких чтобы sound and complete не встречается. Зато среди SAST-систем подавляющее большинство (все промышленные, КМК) — и unsound, и incomplete.

Konstantin-Romanov Автор вопроса
Alexander Chichigin
Не могу сказать связано или не связано, зато точно...

А можно пример "полной динамической системы"? Насколько я понимаю, даже типичный ассемблер не полный.

Konstantin Romanov
А можно пример "полной динамической системы"? Наск...

Я имел в виду "динамические мониторы", которые в рантайме следят. В известном смысле, таким монитором можно считать ОС, и она полна в некотором смысле. Помнится, бывают мониторы, полные по отношению к некоторому классу ошибок многопоточности.

Alexander Chichigin
Не могу сказать связано или не связано, зато точно...

> Если система типов (или любая другая система ограничений) полна, это значит, что можно написать все корректные программы. Не понял: корректные программы с какой точки зрения? А если не полна?

Антонидзе Кучпилип
> Если система типов (или любая другая система огр...

С той самой, которую Вы читали у Пирса: https://t.me/symboliclogic/7354 Грубо говоря, не зацикливаются, не бросают исключений, не выполняют "недопустимых операций". А если не полна, то забракует часть корректных программ.

Alexander Chichigin
С той самой, которую Вы читали у Пирса: https://t....

То есть не полная система может забраковать программы, даже те которые удовлетворяют ограничениям которые накладываются этой системой?

Антонидзе Кучпилип
То есть не полная система может забраковать програ...

Нет. Ограничения (синтаксические) накладываются системой типов или ещё чем. А корректность определяется runtime поведением программы. Очевидно, что система ограничений пропускает все программы, которые удовлетворяют её ограничениям. Но это ничего не говорит (само по себе) про корректность runtime-поведения этих программ. Про связь с корректностью говорят теоремы soundness and completeness.

Антонидзе Кучпилип
То есть не полная система может забраковать програ...

Те, которые удовлетворяют, она забраковать не может, по определению. Может она корректные программы, которые не удовлетворяют.

TOV_MULTIMASSO
Те, которые удовлетворяют, она забраковать не може...

Вот не понятно: как программы могут быть корректными если они не удовлетворяют ограничениям. Опять таки, корректные с какой точки зрения? Блин, я чего-то недопонимаю, но не могу понять что именно🤪

Антонидзе Кучпилип
Вот не понятно: как программы могут быть корректны...

Функции g f = (f 1, f "foo") невозможно приписать тип в рамках Rank1 системы. Но возможно в хаскелле со всключённым RankNTypes g :: (forall x. x -> x) -> (Int, String) g f = (f 1, f "foo") где forall n . type - это аналог генерика. Rank1 разрешает генерик-аргументам объявляться только для всей функции разом, а RankN - для любой части её сигнатуры. Например, g :: forall x. (x -> x) -> (Int, String) g f = (f 1, f "foo") не скомпилируется, потому что тайпчекер будучи внутри forall x заменит x -> x на x0 -> x0, т.е., освежит переменную типа и не сможет найти решение, так как x0 ~ Int, x0 ~ String. В варианте с внутренним forall тайпчерек заменит x два раза: x -> x -> x0 -> x0 и x -> x -> x1 -> x1 и будет удовлетворён набором констрейнтов x0 ~ Int, x1 ~ String.

Konstantin-Romanov Автор вопроса
Антонидзе Кучпилип
Вот не понятно: как программы могут быть корректны...

Ну вы нормы ГТО удовлетворяете? А полезным человеком являетесь.

> Пирс написал, что корректные программы (в лямбда-исчислении) — это те, которые редуцируются в значения. Вот после этой фразы у меня почти сложилась картинка. Напоследок, маленький вопрос: "Недопустимые операции" это например какие?

Антонидзе Кучпилип
> Пирс написал, что корректные программы (в лямбда...

В лямбда-исчислении это все те, для которых нет правил редукции. "В жизни" — всё то самое, что вызывает "системную ошибку" или "необрабатываемое исключение": division by zero, null pointer dereference, out-of-bounds access и далее по списку.

Дежурное напоминание, что зацикливание (бесконечное) сюда тоже относится (строго говоря).

Alexander Chichigin
В лямбда-исчислении это все те, для которых нет пр...

мне кажется, это скорее про бесконечные циклы

Alexander Chichigin
Дежурное напоминание, что зацикливание (бесконечно...

Ну вообще, скорее нет, обычно все таки разделяют safety и liveness свойства, бесконечные циклы это про liveness как раз

Evgenii Moiseenko
Ну вообще, скорее нет, обычно все таки разделяют s...

Смотря где разделяют. В другом месте разделяют partial correctness и total correctness примерно по той же линии. Но мое мнение -- что "по честному" зацикливание тоже нужно считать за проблему. По крайней мере там, где зацикливание не было преднамеренным. А это на практике -- везде, потому что нужен аккуратный shutdown всего по пинку.

Konstantin-Romanov Автор вопроса

Нет, посылкой WM_EXIT или какого-то подобного сообщения, по которому этот бесконечный цикл заканчивается.

Konstantin Romanov
Нет, посылкой WM_EXIT или какого-то подобного сооб...

> бесконечный цикл > заканчивается Ну, что и требовалось доказать. 😂

Konstantin-Romanov Автор вопроса
Alexander Chichigin
> бесконечный цикл > заканчивается Ну, что и треб...

Это вы про то, что в подлунном мире всё преходяще?

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта