{-# OPTIONS --no-positivity-check #-}
module Yablo where
open import Data.Nat
open import Data.Empty
<-reduce : ∀ {k n} → suc n < k → n < k
<-reduce (s≤s (s≤s z≤n)) = s≤s z≤n
<-reduce (s≤s (s≤s (s≤s sn<k))) = s≤s (<-reduce (s≤s (s≤s sn<k)))
≤-refl : ∀ n → n ≤ n
≤-refl zero = z≤n
≤-refl (suc n) = s≤s (≤-refl n)
data Yablo (n : ℕ) : Set where
yy : (∀ k → n < k → Yablo k → ⊥) → Yablo n
step1 : ∀ n → Yablo n → Yablo (suc n)
step1 n (yy inner0) = yy inner1 where
inner1 : (k : ℕ) → suc n < k → Yablo k → ⊥
inner1 k sn<k yk = inner0 k (<-reduce sn<k) yk
step2 : ∀ n → Yablo n → Yablo (suc n) → ⊥
step2 n (yy inner0) = inner0 (suc n) (s≤s (≤-refl n))
step3 : ∀ n → Yablo n → ⊥
step3 n yn = (step2 n yn) (step1 n yn)
step4 : Yablo 0
step4 = yy inner0 where
inner0 : (k : ℕ) → 0 < k → Yablo k → ⊥
inner0 k 0<k yk = step3 k yk
paradox : ⊥
paradox = step3 0 step4