Agda-2.3.2.2: test/bugs/fixed/DotPattern.agda
module Bug where
data A : Set where
a : A
h : A -> A
h a = a
data B : A -> Set where
b : (x : A) -> B (h x)
data _==_ : {x₁ x₂ : A} -> B x₁ -> B x₂ -> Set where
eqb : {x : A} -> b x == b x
-- The problem here is that we get the constraint h x = h x, which when x is a
-- meta variable we don't solve. This constraint blocks the solution y := b x
-- and so we don't see that y should be dotted. Either explicitly dotting y or
-- binding x removes the problem.
bad : {x : A}{y : B x} -> y == y -> A
bad eqb = ?
-- bad .{h x} .{b x} (eqb {x}) = ? -- works
-- bad .{y = _} eqb = ? -- works
-- bad (eqb {_}) = ? -- works
-- The above example is solved by checking syntactic equality on blocked terms.
-- This doesn't work below:
infixl 70 _/_
infixl 50 _▻_
infix 40 _∋_ _⊢ _⇒_ _≛_ _≈∋_
mutual
data Ctxt : Set where
_▻_ : (Γ : Ctxt) -> Γ ⊢ -> Ctxt
data _⊢ : (Γ : Ctxt) -> Set where
✶ : {Γ : Ctxt} -> Γ ⊢
data _⇒_ : Ctxt -> Ctxt -> Set where
wk : {Γ : Ctxt} (σ : Γ ⊢) -> Γ ⇒ Γ ▻ σ
data _∋_ : (Γ : Ctxt) -> Γ ⊢ -> Set where
vz : {Γ : Ctxt} (τ : Γ ⊢) -> Γ ▻ τ ∋ τ / wk τ
_/_ : {Γ Δ : Ctxt} -> Γ ⊢ -> Γ ⇒ Δ -> Δ ⊢
✶ / ρ = ✶
data _≛_ : {Γ¹ Γ² : Ctxt} -> Γ¹ ⊢ -> Γ² ⊢ -> Set where
data _≈∋_ : {Γ¹ Γ² : Ctxt} {τ¹ : Γ¹ ⊢} {τ² : Γ² ⊢}
-> Γ¹ ∋ τ¹ -> Γ² ∋ τ² -> Set where
vzCong : {Γ¹ : Ctxt} {τ¹ : Γ¹ ⊢}
{Γ² : Ctxt} {τ² : Γ² ⊢}
-> τ¹ ≛ τ² -> vz τ¹ ≈∋ vz τ²
f : {Γ¹ : Ctxt} {σ¹ : Γ¹ ⊢} {v¹ : Γ¹ ∋ σ¹}
{Γ² : Ctxt} {σ² : Γ² ⊢} {v² : Γ² ∋ σ²}
{Γ³ : Ctxt} {σ³ : Γ³ ⊢} {v³ : Γ³ ∋ σ³}
-> v¹ ≈∋ v² -> v² ≈∋ v³ -> v¹ ≈∋ v³
f (vzCong eqσ¹²) (vzCong eqσ²³) = ?