Estoy tratando de utilizar la igualdad heterogéneo para probar las declaraciones que implican este tipo de datos indexada:congruencia por la igualdad heterogéneo
data Counter : ℕ → Set where
cut : (i j : ℕ) → Counter (suc i + j)
yo era capaz de escribir mis pruebas usando Relation.Binary.HeterogenousEquality.≅-Razonamiento, pero sólo asumiendo la propiedad siguiente congruencia:
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′ = {!!}
sin embargo, no puede coincidir con el patrón en k≅k′
siendo refl
sin obtener el siguiente mensaje de error desde el comprobador de tipos:
Refuse to solve heterogeneous constraint
k : Counter n =?= k′ : Counter n′
y si trato de hacer un análisis de caso en k≅k′
(es decir mediante el uso de C-c C-c
de la interfaz de Emacs) para asegurarse de que todos los argumentos implícitos están correctamente emparejados con respecto a sus limitaciones impuestas por el refl
, consigo
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′]
(si está interesado, aquí hay algunos no relevante antecedentes: Eliminating subst to prove equality)
Como solución, actualmente estoy usando un tipo parametrizado en lugar de uno indexado, y llevo una prueba en su lugar: 'Contador de datos (n: ℕ): Establecido donde corte: (ij: ℕ) → (i + j + 1 = n: suc (i + j) ≡ n) → Contador n' – Cactus