Могут ли функции Haskell быть доказаны / проверены на моделях / верифицированы со свойствами корректности?

Продолжая идеи в: Существуют ли какие-либо доказуемые языки реального мира? < / а>

Не знаю, как вы, но мне надоело писать код, который я не могу гарантировать.

Задав вышеуказанный вопрос и получив феноменальный ответ (всем спасибо!), Я решил сузить круг поиска доказуемого, прагматичного подхода до Haskell. Я выбрал Haskell, потому что он действительно полезен (есть многие web фреймворки, написанные для него, это кажется хорошим тестом) И я думаю, что это достаточно строго, функционально, чтобы его можно было доказать, или, по крайней мере, разрешить проверку инвариантов.

Вот что я хочу (но не могу найти)

Мне нужна структура, которая может смотреть на функцию Haskell, добавлять, написанную на псудокоде:

add(a, b):
    return a + b

- и проверьте, сохраняются ли определенные инварианты для каждого состояния выполнения. Я бы предпочел какое-то формальное доказательство, однако я бы согласился на что-то вроде проверки моделей.
В этом примере неизменным будет то, что заданы значения a и b , возвращаемое значение всегда равно сумме a + b.

Это простой пример, но я не думаю, что такая структура невозможна. Конечно, будет верхний предел сложности функции, которую можно протестировать (10 строковых входов в функцию, безусловно, займет много времени!), Но это будет способствовать более тщательному проектированию функций и ничем не отличается от использования других формальных методы. Представьте, что вы используете Z или B, когда вы определяете переменные / наборы, вы чертовски уверены, что даете переменным минимально возможные диапазоны. Если ваш INT никогда не будет выше 100, убедитесь, что вы инициализировали его как таковой! Подобные методы и правильная декомпозиция проблемы должны, я думаю, позволить удовлетворительную проверку чисто функционального языка, такого как Haskell.

Я еще не очень разбираюсь в формальных методах или Haskell. Дайте мне знать, удалась ли моя идея, или, может быть, вы думаете, что haskell не подходит? Если вы предлагаете другой язык, убедитесь, что он прошел тест «has-a-web-framework», и обязательно прочтите оригинал вопрос :-)


person 0atman    schedule 02.11.2010    source источник
comment
Может, напишу свой?   -  person 0atman    schedule 02.11.2010
comment
просто подождите, пока ваша система не станет настолько большой, что вы больше не сможете этого гарантировать. Ваш лучший выбор для гарантии - это автоматические тесты и ручное тестирование.   -  person Steven    schedule 05.11.2010
comment
@ Стивен: Правда? Почему так? Если было доказано, что у фрагмента кода есть какое-то свойство, оно всегда будет иметь это свойство, независимо от того, с каким другим кодом он взаимодействует, и вы можете положиться на это свойство в других доказательствах. Доказательства можно использовать повторно и составить так, как это делают тесты, и за счет кодирования доказательств в системе типов нет шансов, что они рассинхронизируются с самим кодом.   -  person C. A. McCann    schedule 05.11.2010
comment
@ Стивен: Да, я согласен с camccann, мне не нужно проверять каждую комбинацию кирпичей в доме. А вот козочка хорошенькая!   -  person 0atman    schedule 05.11.2010
comment
это фрагмент кода, который интегрируется со многими другими фрагментами кода, которые вы также тестируете. не каждый разработчик захочет работать с каждым маленьким доказательством, которое у вас есть, прежде чем они попытаются интегрироваться с ним.   -  person Steven    schedule 07.11.2010
comment
@ Стивен: Они не обязаны, в том-то и дело! Если функция доказуемо верна для всех возможных входных данных, то единственное обязательство, необходимое для ее использования, - это предоставление аргументов соответствующего типа. Отсутствие необходимости беспокоиться о точках интеграции - вот почему доказательства с кодировкой типов являются композиционными. Знание того, что кусок кода гарантированно никогда не даст сбоев и не вызовет ошибок времени выполнения, - вот почему статическая типизация - это хорошо.   -  person C. A. McCann    schedule 07.11.2010
comment
извините, я просто не покупаю это как полезную функцию. с помощью тестирования вы можете подумать о том, что находится на своем месте и как это может сломаться, вместо того, чтобы сужать свой кругозор, заставляя ваш код работать только одним способом, без учета внешних влияний.   -  person Steven    schedule 08.11.2010
comment
@Steven: Лично я бы предпочел потратить немного больше времени на написание кода, который не может сломаться, вместо того, чтобы писать ненадежный код, а затем тратить время на написание тривиальных тестов и беспокоиться обо всем, что может пойти не так ... но каждому свое, полагаю!   -  person C. A. McCann    schedule 08.11.2010
comment
Спасибо за просмотр, ребята, выносите на форум :-)   -  person 0atman    schedule 08.11.2010
comment
это действительно зависит от того, пишете ли вы код, который является небольшим и самодостаточным (без io, без возможного сумасшедшего ввода пользователя). в более крупных случаях вы никогда не придумаете все, и ваше предположительно полное доказательство внезапно окажется неполным ... в любом случае, напишите мне, если вы хотите поболтать по электронной почте или что-то еще   -  person Steven    schedule 09.11.2010
comment
Может быть, здесь вам поможет Liquid Haskell?   -  person Cameron Martin    schedule 17.08.2014
comment
Я должен добавить, что из-за того, что «фреймворки» являются случаем монолитной эксклюзивности (антипаттерн разработки программного обеспечения), а на сцене веб-разработки доминируют, например, WhatWG (яркий пример с их «живым / изменчивым стандартом» оксюморон, который был основан на спагетти-коде браузера, а не на основе кода на чистом стандарте) и подобных высокомерных хаков, веб-фреймворки просто про воплощение непрофессионализма. Таким образом, хотя это определенно означает, что язык является «реальным миром», это также означает, что он уже заражен плохими разработчиками и их ядовитым мышлением.   -  person Evi1M4chine    schedule 30.08.2016
comment
Важное дополнение: какая польза от ваших корректур, если у вас нет доказательств для системы, в которой вы их пишете их? … → В конце концов, вы всегда будете сталкиваться с теоремой Гёделя о неполноте. … Итак, все, что у вас есть, - это немного более высокая статистическая вероятность правильности и огромное количество театральных доказательств / самообмана. (ср. «театр безопасности»)… → Я счел более разумным просто написать программу трижды, используя самые разные способы, которые только можно найти, и использовать их с избыточностью, например, с компьютерами в самолетах и ​​хранилищами RAID.   -  person Evi1M4chine    schedule 30.08.2016
comment
Да, я вижу, что это черепахи до упора!   -  person 0atman    schedule 30.08.2016
comment
Хотя я считаю доказанным, что ADA очень популярна в авиационной отрасли. Они очень осторожны, используют проверенный код с тройным резервированием. Полагаю, это хорошо для всех нас!   -  person 0atman    schedule 30.08.2016
comment
Я написал это: madsbuch.com/blog/proving-stuff-in-haskell может это поможет?   -  person Mads Buch    schedule 30.10.2016


Ответы (11)


Ну, с нескольких вещей для начала, раз уж вы выбираете путь Haskell:

  • Вы знакомы с перепиской Карри-Ховарда? Существуют системы, используемые для проверенных машиной доказательств, основанных на этом, которые во многих отношениях являются просто функциональными языками программирования с очень мощными системами типов.

  • Вы знакомы с областями абстрактной математики, которые предоставляют полезные концепции для анализа кода Haskell? Возникает много различных разновидностей алгебры и кое-что из теории категорий.

  • Имейте в виду, что в Haskell, как и во всех полных по Тьюрингу языках, всегда есть возможность неопределенности. В общем, гораздо труднее доказать, что что-то будет всегда истинным, чем доказать, что либо что-то будет истинным, либо будет зависеть от неопределенного значения.

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

Если вы хотите пойти еще дальше, если мне память не изменяет, помощник по доказательству Coq имеет "отрывок для Haskell », которая позволит вам доказать произвольные свойства критических функций, а затем превратить доказательства в код Haskell.

Для создания причудливой системы шрифтов непосредственно в Haskell, Олег Киселев является Великим Мастером. Вы можете найти на его сайте примеры изящных уловок, таких как полиморфные типы более высокого ранга для кодирования статических доказательств проверка границ массива.

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

Еще один шаг, который вы можете предпринять, опираясь на упрощенную проверку и хитрые приемы системы типов, - это использовать тот факт, что Haskell хорошо работает в качестве основного языка для встраивания доменные языки; сначала создайте тщательно ограниченный подъязык (в идеале, тот, который не является полным по Тьюрингу), полезные свойства которого вам будет легче доказать, а затем используйте программы в этом DSL, чтобы обеспечить ключевые элементы базовой функциональности в вашей общей программе. Например, вы можете доказать, что функция с двумя аргументами является ассоциативной, чтобы оправдать параллельное сокращение коллекции элементов с помощью этой функции (поскольку порядок применения функции не имеет значения, важен только порядок аргументов).


О, и последнее. Несколько советов по предотвращению ловушек, содержащихся в Haskell, которые могут саботировать код, который в противном случае был бы безопасен по конструкции: ваши заклятые враги здесь - общая рекурсия, IO монада и частичные функции:

  • Последнего относительно легко избежать: не пишите их и не используйте их. Убедитесь, что каждый набор шаблонов соответствует всем возможным случаям, и никогда не используйте error или undefined. Единственная сложность - избегать стандартных библиотечных функций, которые могут вызывать ошибки. Некоторые из них явно небезопасны, например fromJust :: Maybe a -> a или head :: [a] -> a, но другие могут быть более тонкими. Если вы обнаружите, что пишете функцию, которая действительно, действительно ничего не может сделать с некоторыми входными значениями, то вы позволяете кодировать недопустимые состояния по типу ввода, и вам нужно сначала исправить это.

  • Второго легко избежать на поверхностном уровне, разбросав материал по разным чистым функциям, которые затем используются из выражения IO. Лучше, насколько это возможно, переместить всю программу в чистый код, чтобы ее можно было оценивать независимо от всего, кроме фактического ввода-вывода. Это в основном становится сложным только тогда, когда вам нужна рекурсия, управляемая внешним вводом, что подводит меня к последнему пункту:

  • Слова к мудрым: Обоснованная рекурсия и продуктивная рекурсия. Всегда проверяйте, что рекурсивные функции либо переходят от некоторой начальной точки к известному базовому случаю, либо генерируют серию элементов по запросу. В чистом коде самый простой способ сделать это - рекурсивно свернуть конечную структуру данных (например, вместо функции, вызывающей себя напрямую при увеличении счетчика до некоторого максимума, создайте список, содержащий диапазон значений счетчика, и сверните его. ) или рекурсивно генерировать ленивую структуру данных (например, список прогрессивных приближений к некоторому значению), при этом тщательно никогда не смешивая их напрямую (например, не просто «найдите первый элемент в потоке, удовлетворяющий некоторому условию»; это может не Вместо этого возьмите значения из потока до некоторой максимальной глубины, затем выполните поиск по конечному списку, соответствующим образом обрабатывая ненайденный случай).

  • Комбинируя последние два элемента, для тех частей, где вам действительно нужна IO с общей рекурсией, попробуйте построить программу как инкрементные компоненты, а затем сконденсируйте все неудобные части в единую «драйверную» функцию. Например, вы можете написать цикл событий графического интерфейса пользователя с чистой функцией, такой как mainLoop :: UIState -> Events -> UIState, тестом выхода, например, quitMessage :: Events -> Bool, функцией для получения ожидающих событий getEvents :: IO Events и функцией обновления updateUI :: UIState -> IO (), а затем фактически запустить это с помощью обобщенной функции, такой как runLoopIO :: (b -> a -> b) -> b -> IO a -> (b -> IO ()) -> IO (). Это сохраняет сложные части по-настоящему чистыми, позволяя вам запускать всю программу с помощью сценария событий и проверять результирующее состояние пользовательского интерфейса, в то же время изолируя неудобные рекурсивные части ввода-вывода в единую абстрактную функцию, которую легко понять и которая часто неизбежно будет правильной. с помощью параметричности.

person C. A. McCann    schedule 02.11.2010
comment
Спасибо, как вы думаете, можно ли напрямую проверить модель Haskell? - person 0atman; 02.11.2010
comment
@Oatman: В общем случае, насколько это возможно, проверять модели на любом языке программирования. Многие методы, которые можно использовать для сокращения или упрощения исследуемого пространства состояний, в Haskell просты или автоматичны из-за чистоты и безопасности типов. Однако мышление в терминах переходов между состояниями может быть здесь контрпродуктивным. - person C. A. McCann; 02.11.2010
comment
@Oatman: На самом деле, главное преимущество Haskell для этой цели - это то, сколько вы можете сделать без необходимости внешних инструментов. Просто избегайте IO, общей рекурсии и частичных функций везде, где это возможно (что для большинства программ почти везде, с небольшими усилиями). - person C. A. McCann; 02.11.2010
comment
@camccann: Мне нравится идея, ориентированная на предметную область. Диалект Haskell, созданный для доказательства! Придется ли мне заняться этим или, насколько вам известно, уже была проделана работа над чем-то подобным? - person 0atman; 02.11.2010
comment
@Oatman: Господи, программисты на Haskell любят правильность программы. Вы можете найти маленькие фрагменты подобных вещей повсюду; например, весь смысл монады IO состоит в том, чтобы обеспечить гарантированное упорядочение побочных эффектов, несмотря на ленивую оценку, не позволяя чистому коду наблюдать какие-либо примеси. Но для более подробного примера взгляните на ImProve на Hackage. - person C. A. McCann; 02.11.2010
comment
В Coq действительно есть отрывок для функции Haskell - person Tom Crockett; 03.11.2010

Вероятно, наиболее близким к тому, о чем вы просите, является Haskabelle, инструмент, который поставляется с помощником проверки Isabelle, который может переводить файлы Haskell в теории Изабель и позволяет вам доказывать многое о них. Насколько я понимаю, этот инструмент разработан в рамках проекта HOL - ML - Haskell и страница документации содержит некоторую информацию о лежащей в основе теории.

Я не очень хорошо знаком с этим проектом и не очень много знаю о том, что с ним было сделано. Но я знаю, что Брайан Хаффман экспериментировал с этими вещами, просмотрите его статьи и переговоры, они должны содержать соответствующий материал.

person svenningsson    schedule 02.11.2010
comment
Спасибо, я проверю, хотя я действительно ищу способ проверки модели на чистом языке. Перевод с более формального языка на Haskell не оптимален для общего использования. - person 0atman; 03.11.2010
comment
Нет, все наоборот. Haskell переведен на Isabelle. Это все еще может быть неоптимальным, но, вероятно, лучше для ваших целей, чем подход Coq для создания Haskell. - person svenningsson; 03.11.2010
comment
Ой ой ой! Извините, я неправильно прочитал ваш ответ. Хм, это необычно и полезнее! - person 0atman; 03.11.2010

Я не уверен, действительно ли то, о чем вы просите, делает вас счастливым. :-)

Проверка моделей на языке общего назначения невозможна, поскольку для практического применения модели должны быть специфичными для предметной области. Из-за теоремы Гёделя о неполноте просто не существует метода автоматического поиска доказательств в достаточно выразительной логике.

Это означает, что вы должны сами написать доказательства, поэтому возникает вопрос, стоит ли потраченное время. Конечно, эти усилия создают нечто очень ценное, а именно уверенность в правильности вашей программы. Вопрос не в том, обязательно ли это, а в том, стоит ли потраченное время слишком дорого. Суть доказательств в том, что, хотя у вас может быть «интуитивное» понимание того, что ваша программа правильна, часто очень формализовать это понимание в качестве доказательства очень сложно. Проблема с интуитивным пониманием заключается в том, что оно очень подвержено случайным ошибкам (опечаткам и другим глупым ошибкам). Это основная дилемма написания правильных программ.

Итак, исследование правильности программ - это все, чтобы упростить формализацию доказательств и автоматическую проверку их правильности. Программирование - неотъемлемая часть «простоты формализации»; очень важно писать программы в стиле, о котором легко рассуждать. В настоящее время у нас есть следующий спектр:

  • Императивный язык, такой как C, C ++, Fortran, Python: здесь очень сложно что-либо формализовать. Модульные тесты и общие рассуждения - единственный способ получить хоть какую-то уверенность. Статическая типизация выявляет только тривиальные ошибки (что намного лучше, чем не ловить их!).

  • Чисто функциональные языки, такие как Haskell, ML: система выразительных типов помогает выявлять нетривиальные ошибки и ошибки. Я бы сказал, что ручная проверка правильности практична для фрагментов длиной до 200 строк. (Например, я сделал пробу для своего рабочего пакета.) Quickcheck - это дешевая замена формализованным доказательствам.

  • Языки с зависимой типизацией и помощники по проверке, такие как Agda, Epigram, Coq: проверка правильности всей программы возможна благодаря автоматизированной помощи с формализацией и обнаружением доказательств. Однако нагрузка по-прежнему высока.

На мой взгляд, наиболее подходящим местом для написания правильных программ является чисто функциональное программирование. Если жизнь зависит от правильности вашей программы, вам лучше перейти на уровень выше и использовать помощника по проверке.

person Heinrich Apfelmus    schedule 02.11.2010
comment
Если вы ошибаетесь педантом, вы, вероятно, имеете в виду отсутствие эффективного метода, поскольку можно было бы просто исчерпывающе перечислить и протестировать последовательно более длинные доказательства, возможно, с учетом некоторого увеличения количества топлива, чтобы избежать ошибок :-) - person sclv; 02.11.2010
comment
@sclv: А вот способ решения проблемы с остановкой: просто запустите программу на неопределенное время и подождите, чтобы увидеть, не остановится ли она когда-нибудь. Как узнать, когда перестать перечислять доказательства? Короче говоря, вы можете искать доказательства таким образом, но вы не можете отличить отсутствие доказательства от того, что доказательство не найдено (пока). - person C. A. McCann; 02.11.2010
comment
Я выбрал подходящее определение метода, которое уже включает вопросы эффективности. ;-) - person Heinrich Apfelmus; 02.11.2010
comment
Кроме того, библиотека Haskell SmallCheck будет тщательно проверьте свойство на наличие диапазона значений на Enum. Очень практично для одноразовых (без пересчета для каждой сборки) подтверждения некоторых свойств Enum. - person recursion.ninja; 23.06.2014

Похоже, вам нужен ESC / Haskell: http://research.microsoft.com/en-us/um/people/simonpj/papers/verify/index.htm

Да, и у Agda теперь есть веб-фреймворк (по крайней мере, доказательство концепции): http://www.reddit.com/r/haskell/comments/d8dck/lemmachine_a_web_framework_in_agda/

person sclv    schedule 02.11.2010
comment
ESC / Haskell выглядит хорошо, хотя реализация является теоретической и немного ограниченной, судя по моему беглому просмотру статьи. Однако отличный ресурс - спасибо! - person 0atman; 02.11.2010
comment
Есть идеи, когда ESC / Haskell будет доступен в ghc? - person dan_waterworth; 09.01.2011
comment
@dan_waterworth - К сожалению, я не знаю никаких планов в этом направлении. - person sclv; 09.01.2011
comment
позор, я действительно мог бы использовать это для проекта, над которым я работаю. Спасибо за ответ. - person dan_waterworth; 09.01.2011

Вы смотрели quickcheck? Он может предложить кое-что из того, что вам нужно.

http://www.haskell.org/haskellwiki/Introduction_to_QuickCheck

person Jonno_FTW    schedule 02.11.2010
comment
Да, я думаю, это выглядит фантастически и определенно станет для меня основой для дальнейших исследований. - person 0atman; 02.11.2010
comment
smallcheck также - smallcheck похож на quickcheck, но фокусируется на исчерпывающем тестировании небольших случаев для настраиваемого понятия small. - person mokus; 02.11.2010
comment
Я вспоминаю, что где-то видел пакет, который автоматически создавал бы тесты быстрой проверки на основе алгебраических свойств, например, формулировка закона распределения для двух функций, производила бы проверки, которые f x (g y z) всегда равны g (f x y) (f x z). - person C. A. McCann; 02.11.2010
comment
Также обратите внимание на Lazy Smallcheck, который использует ленивую оценку Haskell. - person Robin Green; 10.06.2012

Ваш, казалось бы, простой пример add (a, b) на самом деле сложно проверить - с плавающей запятой, переполнение, потеря значимости, прерывания, проверяется ли компилятор, проверено ли оборудование и т. Д.

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

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

Full Hume
  Full recursion
PR−Hume
  Primitive Recursive functions
Template−Hume
  Predefined higher−order functions
  Inductive data structures
  Inductive  Non−recursive first−order functions
FSM−Hume
  Non−recursive data structures
HW−Hume
  No functions
  Non−recursive data structures

Конечно, сегодня самый популярный метод доказательства свойств программ - это модульное тестирование, которое дает сильные теоремы, но эти теоремы излишне конкретны. «Типы, считающиеся вредными», Пирс, слайд 66

person ja.    schedule 03.11.2010
comment
Арифметика может быть проблемой. Теоретически, зная размер всех результатов, в том числе промежуточных, можно давать гарантии. Практически многие вычисления для этого не поддаются. Без целых чисел произвольного размера доказать арифметическую правильность сложно. Для чисел с плавающей запятой рассмотрите docs.sun.com/source/806-3568/ ncg_goldberg.html (Что должен знать каждый компьютерный ученый о плавающей запятой), и это после того, как многие очень умные люди попытались сделать операции с плавающей запятой управляемой. - person David Thornley; 04.11.2010

Взгляните на Zeno. Цитата из вики-страницы:

Zeno - это автоматизированная система проверки свойств программы на Haskell; разработан в Имперском колледже Лондона Уильямом Соннексом, Софией Дроссопулу и Сьюзен Эйзенбах. Он направлен на решение общей проблемы равенства между двумя терминами Haskell для любого входного значения.

Многие инструменты проверки программ, доступные сегодня, относятся к разряду модельных проверок; способен очень быстро проходить через очень большое, но ограниченное пространство поиска. Они хорошо подходят для задач с большим описанием, но без рекурсивных типов данных. Zeno, с другой стороны, предназначен для индуктивного доказательства свойств в бесконечном пространстве поиска, но только для тех, которые имеют небольшую и простую спецификацию.

person Petr    schedule 17.10.2012

Конечно, можно формально доказать некоторые свойства программ на Haskell. Мне пришлось сделать это на экзамене FP: учитывая два выражения, докажите, что они обозначают одну и ту же функцию. В целом это невозможно сделать, поскольку Haskell является полным по Тьюрингу, поэтому любой механический испытатель должен быть либо помощником доказательства (полуавтоматическим с руководством пользователя), либо средством проверки моделей.

В этом направлении были попытки, см., Например, P-logic: проверка свойств для программ Haskell или Доказательство правильности функциональных программ с помощью Mizar. Обе статьи представляют собой научные статьи, описывающие методы в большей степени, чем реализации.

person Fred Foo    schedule 02.11.2010
comment
Хочу добавить, что на экзамене я по крайней мере чувствовал себя механиком для доказательства теорем;) - person Fred Foo; 02.11.2010
comment
Ой, второй результат в Google для mizar haskell - ЭТО ТАК ВОПРОС !! 1 :-( - person 0atman; 02.11.2010
comment
Это был быстрый пробег через Google и CiteseerX. Эта статья Мицара была опубликована в академическом журнале, хотя и не очень популярном. - person Fred Foo; 02.11.2010
comment
@Oatman: Это мало что значит. У Stack Overflow есть сумасшедший гугл-сок. Вопросы на нишевые темы могут легко превзойти первоисточники. - person C. A. McCann; 02.11.2010
comment
Совершенно верно, ребята, но информации о mizar очень мало, а не о ранее существовавшем пакете, на который я надеялся. Я добавлю это в свой список для чтения! - person 0atman; 02.11.2010

Недавние усилия MSR Cambridge: http://research.microsoft.com/en-us/um/people/simonpj/papers/verify/hcc-popl.pdf

person rsinha    schedule 16.08.2012

Инструмент AProVE (по крайней мере) способен доказать прекращение работы программ Haskell, что является частью доказательства правильность. Дополнительную информацию можно найти в этом документе (более короткая версия).

Кроме того, вас могут заинтересовать Зависимые типы. Здесь система типов расширена и используется, чтобы сделать неправильные программы невозможными.

person C-Otto    schedule 17.10.2012

Вы можете использовать инструмент hs-to-coq для преобразования Haskell в основном автоматически в Coq, а затем использовать вся мощь помощника доказательства Coq для проверки вашего кода Haskell. См. Документы https://arxiv.org/abs/1803.06960 и https://arxiv.org/abs/1711.09286 для получения дополнительной информации.

person Joachim Breitner    schedule 24.03.2018