История изменений
Исправление AndreyKl, (текущая версия) :
Порождение такой правильной типизации эквивалентно порождению правильного алгоритма,
гм, ну нет
Вот пример. Скажем, задача, написать SMT-solver (https://ru.wikipedia.org/wiki/Задача_выполнимости_формул_в_теориях).
Если говорить кратко, есть список булевских переменных (пусть для простоты [a,b,c]
). Ну и есть формула, ну пусть a || (b && c)
. Пусть нужно определить, есть ли такой набор значений для переменных a, b и c
, на котором формула приобретает истиное значение. Или же для всех наборов формула ложна.
В таком случае тип для нашей функции solve
принимающий на вход формулу f
и список переменных xs
будет какой-то такой (на Coq).
Definition solve (xs : list bool) (f : formula) : {truth | formulaDenote truth f} + {forall truth, ~~formulaDenote truth f}
Здесь
+
это тип суммы, т.е. логическое или
. {truth | formulaDenote truth f}
- читается как «Существует переменная truth
такая что formulaDenote truth f
- истина». {forall truth, ~~formulaDenote truth f}
- читается как «Для всех (возможных) наборов переменных truth
выражение formulaDenote truth f
- ложь» (~~
- отрицание). truth
здесь список переменных. formulaDenote
вычисляет формулу f
на наборе переменных truth
.Т.е. по русски «либо существует такой набор переменных
truth
на котором формула f
вычисляется в истину, либо для всех наборов переменных формула f
возвращает ложь.»Ну и да, т.к. кок - язык тотальный, то компилятор гарантирует что функция вернёт именно значение этого типа. Т.е. одно из двух.
Но всё таки написать тип - дело ну может 10 минут в данном случае. Алгоритм написать - это уже не так просто.
кто сказал, что она правильная?
думаю, очевидно
Кстати monk, возвращаясь к дискуссии(Зависимые типы, жидкие типы. Что лучше? (комментарий)): а вот такое утверждение на «жидких типах» напишется? (я думаю вряд ли)
Исправление AndreyKl, :
Порождение такой правильной типизации эквивалентно порождению правильного алгоритма,
гм, ну нет
Вот пример. Скажем, задача, написать SMT-solver (https://ru.wikipedia.org/wiki/Задача_выполнимости_формул_в_теориях).
Если говорить кратко, есть список булевских переменных (пусть для простоты [a,b,c]
). Ну и есть формула, ну пусть a || (b && c)
. Пусть нужно определить, есть ли такой набор значений для переменных a, b и c
, на котором формула приобретает истиное значение. Или же для всех наборов формула ложна.
В таком случае тип для нашей функции solve
принимающий на вход формулу f
и список переменных xs
будет какой-то такой (на Coq).
Definition solve (xs : list bool) (f : formula) : {truth | formulaDenote truth f} + {forall truth, ~~formulaDenote truth f}
Здесь
+
это тип суммы, т.е. логическое или
. {truth | formulaDenote truth f}
- читается как «Существует переменная truth
такая что formulaDenote truth f
- истина». {forall truth, ~~formulaDenote truth f}
- читается как «Для всех (возможных) наборов переменных truth
выражение formulaDenote truth f
- ложь» (~~
- отрицание). truth
здесь список переменных. formulaDenote
вычисляет формулу f
на наборе переменных truth
.Т.е. по русски «либо существует такой набор переменных
truth
на котором формула f
вычисляется в истину, либо для всех наборов переменных формула f
возвращает ложь.»Ну и да, т.к. кок - язык тотальный, то компилятор гарантирует что функция вернёт именно значение этого типа. Т.е. одно из двух.
Но всё таки написать тип - дело ну может 10 минут в данном случае. Алгоритм написать - это уже не так просто.
кто сказал, что она правильная?
думаю, очевидно
Кстати monk, возвращаясь к дискуссии: а вот такое утверждение на «жидких типах» напишется? (я думаю вряд ли)
Исправление AndreyKl, :
Порождение такой правильной типизации эквивалентно порождению правильного алгоритма,
гм, ну нет
Вот пример. Скажем, задача, написать SMT-solver (https://ru.wikipedia.org/wiki/Задача_выполнимости_формул_в_теориях).
Если говорить кратко, есть список булевских переменных (пусть для простоты [a,b,c]
). Ну и есть формула, ну пусть a || (b && c)
. Пусть нужно определить, есть ли такой набор значений для переменных a, b и c
, на котором формула приобретает истиное значение. Или же для всех наборов формула ложна.
В таком случае тип для нашей функции solve
принимающий на вход формул f
и список xs
будет какой-то такой (на Coq).
Definition solve (xs : list bool) (f : formula) : {truth | formulaDenote truth f} + {forall truth, ~~formulaDenote truth f}
Здесь
+
это тип суммы, т.е. логическое или
. {truth | formulaDenote truth f}
- читается как «Существует переменная truth
такая что formulaDenote truth f
- истина». {forall truth, ~~formulaDenote truth f}
- читается как «Для всех (возможных) наборов переменных truth
выражение formulaDenote truth f
- ложь» (~~
- отрицание). truth
здесь список переменных. formulaDenote
вычисляет формулу f
на наборе переменных truth
.Т.е. по русски «либо существует такой набор переменных
truth
на котором формула f
вычисляется в истину, либо для всех наборов переменных формула f
возвращает ложь.»Ну и да, т.к. кок - язык тотальный, то компилятор гарантирует что функция вернёт именно значение этого типа. Т.е. одно из двух.
Но всё таки написать тип - дело ну может 10 минут в данном случае. Алгоритм написать - это уже не так просто.
кто сказал, что она правильная?
думаю, очевидно
Кстати monk, возвращаясь к дискуссии: а вот такое утверждение на «жидких типах» напишется? (я думаю вряд ли)
Исправление AndreyKl, :
Порождение такой правильной типизации эквивалентно порождению правильного алгоритма,
гм, ну нет
Вот пример. Скажем, задача, написать SMT-solver (https://ru.wikipedia.org/wiki/Задача_выполнимости_формул_в_теориях).
Если говорить кратко, есть список булевских переменных (пусть для простоты [a,b,c]
). Ну и есть формула, ну пусть a || (b && c)
. Пусть нужно определить, есть ли такой набор значений для переменных a, b и c
, на котором формула приобретает истиное значение. Или же для всех наборов формула ложна.
В таком случае тип для нашей функции solve
принимающий на вход формул f
и список xs
будет какой-то такой (на Coq).
Definition solve (xs : list bool) (f : formula) : {truth | formulaDenote truth f} + {forall truth, ~~formulaDenote truth f}
Здесь
+
это тип суммы, т.е. логическое или
. {truth | formulaDenote truth f}
- читается как «Существует переменная truth
такая что formulaDenote truth f
- истина». {forall truth, ~~formulaDenote truth f}
- читается как «Для всех (возможных) наборов переменных truth
выражение formulaDenote truth f
- ложь» (~~
- отрицание). truth
здесь список переменных.Т.е. по русски «либо существует такой набор переменных
truth
на котором формула f
вычисляется в истину, либо для всех наборов переменных формула f
возвращает ложь.»Ну и да, т.к. кок - язык тотальный, то компилятор гарантирует что функция вернёт именно значение этого типа. Т.е. одно из двух.
Но всё таки написать тип - дело ну может 10 минут в данном случае. Алгоритм написать - это уже не так просто.
кто сказал, что она правильная?
думаю, очевидно
Кстати monk, возвращаясь к дискуссии: а вот такое утверждение на «жидких типах» напишется? (я думаю вряд ли)
Исправление AndreyKl, :
Порождение такой правильной типизации эквивалентно порождению правильного алгоритма,
гм, ну нет
Вот пример. Скажем, задача, написать SMT-solver (https://ru.wikipedia.org/wiki/Задача_выполнимости_формул_в_теориях).
Если говорить кратко, есть список булевских переменных (пусть для простоты [a,b,c]
). Ну и есть формула, ну пусть a || (b && c)
. Пусть нужно определить, есть ли такой набор значений для переменных a, b и c
, на котором формула приобретает истиное значение. Или же для всех наборов формула ложна.
В таком случае тип для нашей функции solve
принимающий на вход формул f
и список xs
будет какой-то такой (на Coq).
Definition solve (xs : list bool) (f : formula) : {truth | formulaDenote truth f} + {forall truth, ~~formulaDenote truth f}
Здесь
+
это тип суммы, т.е. логическое или
. {truth | formulaDenote truth f}
- читается как «Существует переменная truth
такая что formulaDenote truth f
- истина». {forall truth, ~~formulaDenote truth f}
- читается как «Для всех (возможных) переменных truth
formulaDenote truth f
- ложь» (~~
- отрицание). truth
здесь список переменных.Т.е. по русски «либо существует такой набор переменных
truth
на котором формула f
вычисляется в истину, либо для всех наборов переменных формула f
возвращает ложь.»Ну и да, т.к. кок - язык тотальный, то компилятор гарантирует что функция вернёт именно значение этого типа. Т.е. одно из двух.
Но всё таки написать тип - дело ну может 10 минут в данном случае. Алгоритм написать - это уже не так просто.
кто сказал, что она правильная?
думаю, очевидно
Кстати monk, возвращаясь к дискуссии: а вот такое утверждение на «жидких типах» напишется? (я думаю вряд ли)
Исправление AndreyKl, :
Порождение такой правильной типизации эквивалентно порождению правильного алгоритма,
гм, ну нет
Вот пример. Скажем, задача, написать SMT-solver (https://ru.wikipedia.org/wiki/Задача_выполнимости_формул_в_теориях).
Если говорить кратко, есть список булевских переменных (пусть для простоты [a,b,c]
). Ну и есть формула, ну пусть a || (b && c)
. Пусть нужно определить, есть ли такой набор значений для переменных a, b и c
, на котором формула приобретает истиное значение. Или же для всех наборов формула ложна.
В таком случае тип для нашей функции solve
принимающий на вход формул f
и список xs
будет какой-то такой (на Coq).
Definition solve (xs : list bool) (f : formula) : {truth | formulaDenote truth f} + {forall truth, ~~formulaDenote truth f}
Здесь
+
это тип суммы, т.е. логическое или
. {truth | formulaDenote truth f}
- читается как «Существует переменная truth
такая что formulaDenote truth f
- истина». {forall truth, ~~formulaDenote truth f}
- читается как «Для всех (возможных) переменных truth
formulaDenote truth f
- ложь» (~~
- отрицание). truth
здесь список переменных.Т.е. по русски «либо существует такой набор переменных
truth
на котором формула f
вычисляется в истину, либо для всех наборов переменных формула f
возвращает ложь.»Ну и да, т.к. кок - язык тотальный, то компилятор гарантирует что функция вернёт именно значение этого типа. Т.е. одно из двух.
Но всё таки написать тип - дело ну может 10 минут в данном случае. Алгоритм написать - это уже не так просто.
Кстати monk, возвращаясь к дискуссии: а вот такое утверждение на «жидких типах» напишется? (я думаю вряд ли)
Исходная версия AndreyKl, :
Порождение такой правильной типизации эквивалентно порождению правильного алгоритма,
гм, ну нет
Вот пример. Скажем, задача, написать SMT-solver (https://ru.wikipedia.org/wiki/Задача_выполнимости_формул_в_теориях).
Если говорить кратко, есть список булевских переменных (пусть для простоты [a,b,c]
). Ну и есть формула, ну пусть a || (b && c)
. Пусть нужно определить, есть ли такой набор значений для переменных a, b и c
, на котором формула приобретает истиное значение. Или же для всех наборов формула ложна.
В таком случае тип для нашей функции solve
принимающий на вход формул f
и список xs
будет какой-то такой (на Coq).
Definition solve (xs : list bool) (f : formula) : {truth | formulaDenote truth f} + {forall truth, ~~formulaDenote truth f}
Здесь
+
это тип суммы, т.е. логическое или
. {truth | formulaDenote truth f}
- читается как «Существует переменная truth
такая что formulaDenote truth f
- истина». {forall truth, ~~formulaDenote truth f}
- читается как «Для всех (возможных) переменных truth
formulaDenote truth f
- ложь» (~~
- отрицание). truth
здесь список переменных.Т.е. по русски «либо существует такой набор переменных
truth
на котором формула f
вычисляется в истину, либо для всех наборов переменных формула f
возвращает ложь.»Ну и да, т.к. кок - язык тотальный, то компилятор гарантирует что функция вернёт именно значение этого типа. Т.е. одно из двух.
Но всё таки написать тип - дело ну может 10 минут в данном случае. Алгоритм написать - это уже не так просто.