Допустим, мы хотим доказать, что ослабление верхней границы Data.Fin
не меняет значение числа.Интуитивно понятный способ заявить это:
weakenEq : (num : Fin n) -> num = weaken num
Давайте теперь сгенерируем определенное ... Держись!Давайте немного подумаем об этом утверждении.num
и weaken num
имеют разные типы .Можем ли мы заявить о равенстве в этом случае?
Документация по =
предполагает, что мы можем попытаться сделать это, но мы могли бы вместо этого использовать ~=~
.Ну, во всяком случае, давайте продолжим и создадим определение и разделение регистра, в результате чего
weakenEq : (num : Fin n) -> num = weaken num
weakenEq FZ = ?weakenEq_rhs_1
weakenEq (FS x) = ?weakenEq_rhs_2
Цель в дыре weakenEq_rhs_1
равна FZ = FZ
, что все еще имеет смысл с точки зрения ценности,Таким образом, мы оптимистично заменим дыру на Refl
, но потерпим неудачу:
When checking right hand side of weakenEq with expected type
FZ = weaken FZ
Unifying k and S k would lead to infinite value
Несколько загадочное сообщение об ошибке, поэтому нам интересно, действительно ли это связано с различными типами.
В любом случае, давайте попробуем еще раз, но теперь с ~=~
вместо =
.К сожалению, ошибка все та же.
Итак, как можно заявить и доказать, что weaken x
не меняет значение x
?Это действительно имеет смысл?Что мне делать, если это часть большого доказательства, где я могу захотеть rewrite
a Vect n (Fin k)
с Vect n (Fin (S k))
, полученным map
ping weaken
по сравнению с исходным вектором?