Agda-2.3.2.2: test/fail/IrrelevantLevelHurkens.agda
-- {-# OPTIONS -v tc.meta.assign:15 #-}
-- Ulf, 2011-10-04
-- I still don't quite believe in irrelevant levels. In part because I just proved ⊥:
module IrrelevantLevelHurkens where
open import Imports.Level
data _≡_ {a}{A : Set a}(x : A) : A → Set where
refl : x ≡ x
data Irr .(i : Level)(A : Set i) : Set where
irr : Irr i A
data Unit : Set where
unit : Unit
unirr : ∀ .i (A : Set i) → Irr i A → Unit
unirr i A irr = unit
↓_ : ∀ .{i} → Set i → Set
foo : ∀ .{i}{A : Set i}(x : Irr i A) → unirr i A x ≡ unirr zero (↓ A) _
↓ A = _
foo xs = refl
{- Andreas, 2011-10-04 Irrelevant Levels do not harmonize with solving
type of meta = .{.i : Level} (A : Set .i) → Set
solving _39 := λ {.i} A → A
term _38 xs := xs
passed occursCheck
type of meta = ..{i : Level} {A : Set i} (x : Irr .(i) A) →
Irr .(zero) (↓ A)
solving _38 := λ {i} {A} x → x
The solutions x and A for the two holes do not type check, if entered manually.
The solver would need to re-type-check to make sure solutions are correct.
For now, just do not supply --experimental-irrelevance flag.
-}
⊥′ : Set
⊥′ = ↓ ((A : Set) → A)
¬_ : Set → Set
¬ A = A → ⊥′
P : Set → Set
P A = ↓ (A → Set)
U : Set
U = ↓ ((X : Set) → (P (P X) → X) → P (P X))
τ : P (P U) → U
τ t = λ X f p → t λ x → p (f (x X f))
σ : U → P (P U)
σ s pu = s U (λ t → τ t) pu
Δ : P U
Δ = λ y → ¬ ((p : P U) → σ y p → p (τ (σ y)))
Ω : U
Ω X t px = τ (λ p → (x : U) → σ x p → p x) X t px
D : Set
D = (p : P U) → σ Ω p → p (τ (σ Ω))
lem₁ : (p : P U) → ((x : U) → σ x p → p x) → p Ω
lem₁ p H1 = H1 Ω λ x → H1 (τ (σ x))
lem₂ : ¬ D
lem₂ d A = lem₁ Δ (λ x H2 H3 → H3 Δ H2 λ p → H3 λ y → p (τ (σ y))) d A
lem₃ : D
lem₃ p = lem₁ λ y → p (τ (σ y))
loop : ⊥′
loop = λ A → lem₂ lem₃ A
data ⊥ : Set where
false : ⊥
false = loop ⊥