Я пытаюсь написать тестовый код, чтобы проверить, действительно ли plusComm : (a : Nat) -> (b : Nat) -> a + b = b + a
доказывает a + b = b + a
на натуральных числах, то есть код не фальсифицирует код с использованием типизированных дырок, postulate
, believe_me
, assert_total
, и т.д.
В частности, если доказательство каким-то образом сфальсифицировано, я хочу, чтобы программа провалилась одним из трех способов:
- Ошибка компиляции
- Ошибка времени выполнения, например * 1013 выдаёт ошибку сегментации *
- Время выполнения бесконечного цикла
Если эти опции неосуществимы, я открыт для анализа исходного кода в качестве крайней меры (для моих целей это должно быть написано также в Idris). Я слышал о Language.Reflection
, но я не уверен, что это правильный инструмент здесь.
Приведенный ниже код - одна попытка, которая не удалась, потому что proofEval
даже не смотрит на фактическое переданное значение:
plusComm : (a : Nat) -> (b : Nat) -> a + b = b + a
plusComm a b = ?plusComm
proofEval : {a : ty} -> (a = b) -> ty
proofEval {a=a} _ = a
main : IO ()
main = do
putStrLn "Compiled Successfully!"
print (proofEval (plusComm 1 2))
Вышеуказанное при компиляции и запуске выдает следующий вывод и завершается без ошибок.
Compiled Successfully!
3