Я пытаюсь использовать гетерогенное равенство для доказательства утверждений, включающих этот индексированный тип данных:
data Counter : ℕ → Set where
cut : (i j : ℕ) → Counter (suc i + j)
Я смог написать свои доказательства, используя Relation.Binary.HeterogenousEquality.≅-Reasoning
, но только при условии следующего свойства конгруэнтности:
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′]
(если вам интересно, вот некоторые не относящиеся к делу сведения: Устранение subst для доказательства равенства)
data Counter (n : ℕ) : Set where cut : (i j : ℕ) → (i+j+1=n : suc (i + j) ≡ n) → Counter n
- person Cactus   schedule 17.02.2012