Я пытаюсь написать тестовый код, чтобы проверить, действительно ли plusComm : (a : Nat) -> (b : Nat) -> a + b = b + a
доказывает a + b = b + a
на натуральных числах, то есть код не подделывает их, используя типизированные отверстия, postulate
, believe_me
, assert_total
и т. д.
В частности, если доказательство каким-то образом сфальсифицировано, я хочу, чтобы программа потерпела неудачу одним из трех способов:
- Ошибка компиляции
- Ошибка времени выполнения, например. сегментация
- Бесконечный цикл во время выполнения
Если эти варианты неосуществимы, я открыт для анализа исходного кода в качестве крайней меры (для моих целей это также должно быть написано на 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