Agda-2.3.2.2: test/succeed/LevelWithBug.agda
{-# OPTIONS --universe-polymorphism #-}
module LevelWithBug where
open import Common.Level
postulate
take : ∀ a → Set a → Set
a : Level
A : Set a
Goal : Set → Set
goal : ∀ X → Goal X
-- The meta got solved by Level (Max [Plus 0 (NeutralLevel a)]) which
-- didn't match the argument in the with expression which is simply a.
-- Now the level noise should go away when it's not useful.
foo : Goal (take _ A)
foo with take a A
... | z = goal z
-- Here's another more complicated one.
data List {a}(A : Set a) : Set a where
[] : List A
_∷_ : A → List A → List A
data _≡_ {a}{A : Set a}(x : A) : A → Set a where
refl : x ≡ x
{-# BUILTIN EQUALITY _≡_ #-}
{-# BUILTIN REFL refl #-}
-- Sums commute with Any (for a fixed list).
data Any {a p} {A : Set a}
(P : A → Set p) : List A → Set (a ⊔ p) where
there : ∀ {x xs} (pxs : Any P xs) → Any P (x ∷ xs)
amap : ∀ {a p q} {A : Set a} {P : A → Set p} → {Q : A → Set q} →
(∀ {x} → P x → Q x) → ∀ {xs} → Any P xs → Any Q xs
amap g (there pxs) = there (amap g pxs)
data _+_ {a b} (A : Set a) (B : Set b) : Set (a ⊔ b) where
inl : (x : A) → A + B
inr : (y : B) → A + B
smap : ∀ {a b c d} {A : Set a} {B : Set b} {C : Set c} {D : Set d} →
(A → C) → (B → D) → (A + B → C + D)
smap f g (inl x) = inl (f x)
smap f g (inr y) = inr (g y)
postulate
p q : Level
P : A → Set p
Q : A → Set q
to : ∀ xs → Any P xs + Any Q xs → Any (λ x → P x + Q x) xs
to xs (inl pxs) = amap inl pxs
to xs (inr pxs) = amap inr pxs
from : ∀ xs → Any (λ x → P x + Q x) xs → Any P xs + Any Q xs
from ._ (there p) = smap there there (from _ p)
-- Here the abstraction didn't work because a NeutralLevel was replaced
-- by an UnreducedLevel during abstraction.
fromto : ∀ xs (p : Any P xs + Any Q xs) → from xs (to xs p) ≡ p
fromto .(x ∷ xs) (inl (there {x}{xs} p)) rewrite fromto xs (inl p) = refl
fromto .(x ∷ xs) (inr (there {x}{xs} q)) rewrite fromto xs (inr q) = refl