Я пытаюсь использовать разнородное равенство доказать заявления с участием индексированного типа данных:Конгруэнтности для гетерогенного равенства
data Counter : ℕ → Set where
cut : (i j : ℕ) → Counter (suc i + j)
Я был в состоянии написать свои доказательства с помощью Relation.Binary.HeterogenousEquality.≅-рассуждению, но только предположив следующее свойство: конгруэнтность
Counter-cong : ∀ {n n′} {k : Counter n} {k′ : Counter n′} →
{A : ℕ → Set} → (f : ∀{n} → Counter n → A n) →
k ≅ k′ → f k ≅ f k′
Counter-cong f k≅k′ = {!!}
Однако, я не могу матч узор на k≅k′
быть refl
, не получая следующее сообщение об ошибке от типа проверки:
Refuse to solve heterogeneous constraint
k : Counter n =?= k′ : Counter n′
и если я попытаюсь проанализировать случай на k≅k′
(т. с помощью C-c C-c
из интерфейса Emacs), чтобы убедиться, что все неявные аргументы правильно подобраны с учетом их ограничений, налагаемых refl
, я получаю
Cannot decide whether there should be a case for the constructor
refl, since the unification gets stuck on unifying the
inferred indices
[{.Level.zero}, {Counter n}, k]
with the expected indices
[{.Level.zero}, {Counter n′}, k′]
(если вы заинтересованы, вот некоторые несвойственных фон: Eliminating subst to prove equality)
Как обходной путь, в настоящее время я использую параметризованный тип вместо проиндексированного и вместо него несут доказательство: 'data Counter (n: ℕ): Установить, где cut: (ij: ℕ) → (i + j + 1 = n: suc (i + j) ≡ n) → Counter n' – Cactus