Продолжая идеи из: Есть ли доказуемые языки в реальном мире?
Я не знаю о вас, но я устал писать код, который я не могу гарантировать.
После того, как вы задали вышеупомянутый вопрос и получили феноменальный ответ (спасибо всем!), я решил сузить свой поиск доказуемого, прагматичного подхода к Haskell. Я выбрал Haskell, потому что он действительно полезен (есть many web фреймворки, написанные для него, это кажется хорошим эталоном) И Я думаю, что он достаточно строг, функционально, что он может быть доказуемым или, по крайней мере, разрешить тестирование инвариантов.
Здесь я хочу (и не смог найти)
Я хочу фреймворк, который может смотреть на функцию Haskell, добавлять, писать в psudocode:
add(a, b):
return a + b
- и проверьте, сохраняются ли определенные инварианты над каждым состоянием выполнения. Я бы предпочел для некоторых формальных доказательств, однако я бы согласился на что-то вроде проверки модели.
В этом примере инвариантным было бы то, что при заданных значениях a и b возвращаемое значение всегда равно сумме a + b.
Это простой пример, но я не считаю невозможным существование такой структуры. Разумеется, был бы верхний предел сложности функции, которая могла бы быть проверена (10 строковых входов в функцию, безусловно, занимали бы много времени!), Но это будет способствовать более тщательному проектированию функций и ничем не отличается от использования других формальных методы. Представьте, что вы используете Z или B, когда вы определяете переменные/наборы, вы чертовски уверены, что вы даете переменным наименьшие возможные диапазоны. Если ваш INT никогда не будет выше 100, убедитесь, что вы его инициализируете как таковое! Подобные методы и надлежащая декомпозиция задач должны - я думаю, - допускать удовлетворительную проверку чисто функционального языка, такого как Haskell.
Я еще не очень опытен формальными методами или Haskell. Дайте мне знать, если моя идея звуковая, или, может быть, вы думаете, что haskell не подходит? Если вы предлагаете другой язык, убедитесь, что он прошел тест "has-a-web-framework" и прочитайте оригинал question: -)