data Nat : Set0
  where
    zero : Nat
    succ : Nat -> Nat

data NatHold : Nat -> Set0
  where
    natHold : (n : Nat) -> NatHold n

test : (x : Nat) -> NatHold x
test x with x
test x | zero with x
test x | zero | zero = natHold zero
test x | zero | succ a = natHold zero
test x | succ a with x
test x | succ a | zero = natHold (succ a)
test x | succ a | succ b = natHold (succ a)

これはなんかなー。

xがzero ∧ succ aみたいな事はそもそもありえない系だと思うのでぷるぷる

ななし

data Nat : Set0
  where
    zero : Nat
    succ : Nat -> Nat

data NatHold : Nat -> Set0
  where
    natHold : (n : Nat) -> NatHold n

g : Nat -> Nat
g x = zero

f : (x' : Nat) -> NatHold (g x')
f x with g x
... | zero = natHold zero
... | succ a = natHold (succ a)

こういう複合的に酷そうなものも存在する。これはpatternのカバレッジを全部書けっていうのも重なっている。

多分一度中を見てcase式の全組合せを掻き集めてそれら全てで型チェックするって感じなんだろうかなぁ・・・。