Имея достаточно опыта в Haskell, я только недавно начал использовать Idris для доказательства теоремы. Это минимальный пример, который иллюстрирует проблему, с которой я столкнулся при попытке доказать довольно простые утверждения.Доказательства функций, зависящих от порядка их альтернатив
Рассмотрим мы имеем общую функцию test
:
total test : Integer -> Integer
test 1 = 1
test n = n
Конечно, мы видим, что функция может быть упрощена test n = n
, но давайте это доказать. Я просто собираюсь на все случаи:
total lemma_test : (n : Integer) -> test n = n
lemma_test 1 = Refl
lemma_test n = Refl
Но это не проверять тип:
Type mismatch between
n = n (Type of Refl) and
test n = n (Expected type)
Specifically:
Type mismatch between
n
and
test n
Таким образом, проблема, кажется, что Идрис не может сделать вывод для второго случая lemma_test
что n
не равно 1
и что также должен применяться второй случай test
.
Мы можем, конечно, попытаться явно перечислить все случаи, которые могут быть громоздким, или невозможно, как и в случае для Integer
с:
total lemma_test : (n : Integer) -> test n = n
lemma_test 1 = Refl
lemma_test 2 = Refl
lemma_test 3 = Refl
...
Есть ли способ доказать, что такие заявления для функций, которые не определены над конечным набором конструкторов данных, но вместо этого зависят от того, что сопоставление шаблонов работает сверху донизу, например test
в этом примере?
Возможно, существует довольно простое решение, которое я просто не вижу, учитывая, что подобные функции происходят довольно часто.
Информация, которая невозможна или, по крайней мере, трудно доказать что-то о совпадении шаблонов по умолчанию, очень полезна для меня, спасибо. Я думаю/надеюсь, что смогу приспособить свои конкретные проблемы к использованию разрешимого равенства, как вы предложили. –