Продължавайки от идеите в: Има ли доказуеми езици от реалния свят?
Не знам за вас, но на мен писна ми да пиша код, който не мога да гарантирам.
След като зададох горния въпрос и получих феноменален отговор (Благодаря на всички!), реших да стесня търсенето си за доказуем, прагматичен подход към Haskell. Избрах Haskell, защото всъщност е полезен (има много уеб рамки, написани за него, това изглежда добър показател) И мисля, че е достатъчно строг, функционално, за да може да бъде доказуем, или поне позволяват тестване на инварианти.
Ето какво искам (и не можах да намеря)
Искам рамка, която може да разглежда функция на Haskell, добавяне, написана на псевдокод:
add(a, b):
return a + b
- и проверете дали определени инварианти се задържат над всяко състояние на изпълнение. Бих предпочел някакво формално доказателство, но бих се задоволил с нещо като модел-проверка.
В този пример инвариантът би бил дадените стойности a и b em>, върнатата стойност винаги е сумата a+b.
Това е прост пример, но не мисля, че е невъзможно да съществува такава рамка. Със сигурност ще има горна граница на сложността на функция, която може да бъде тествана (10 входа на низ към функция със сигурност ще отнеме много време!), но това ще насърчи по-внимателен дизайн на функциите и не е по-различно от използването на други формални методи. Представете си, че използвате Z или B, когато дефинирате променливи/множества, вие сте сигурни, че давате на променливите възможно най-малките диапазони. Ако вашият INT никога няма да бъде над 100, уверете се, че сте го инициализирали като такъв! Техники като тези и правилната декомпозиция на проблема трябва - според мен - да позволят задоволителна проверка на чисто функционален език като Haskell.
Все още нямам много опит с формални методи или Haskell. Кажете ми дали идеята ми е добра или може би смятате, че haskell не е подходящ? Ако предложите различен език, моля, уверете се, че преминава теста „has-a-web-framework“ и прочетете оригинала въпрос :-)