Agda-2.3.2.2: examples/outdated-and-incorrect/FunctionsInIndices.agda
module FunctionsInIndices where
open import Prelude
open import Eq
data Tree (a : Set) : ℕ -> Set where
leaf : a -> Tree a 1
node : forall n₁ n₂ -> Tree a n₁ -> Tree a n₂ -> Tree a (n₁ + n₂)
-- This does not work:
-- leftmost : forall {a} n -> Tree a (suc n) -> a
-- leftmost .0 (leaf x) = x
-- leftmost .n₂ (node zero (suc n₂) l r) = leftmost l
-- leftmost .(n₁ + n₂) (node (suc n₁) n₂ l r) = leftmost l
module Workaround1 where
private
T : Set -> ℕ -> Set
T a zero = ⊤
T a (suc n) = a
leftmost' : forall {a n} -> Tree a n -> T a n
leftmost' (leaf x) = x
leftmost' (node zero zero l r) = tt
leftmost' (node zero (suc n₂) l r) = leftmost' r
leftmost' (node (suc n₁) n₂ l r) = leftmost' l
leftmost : forall {a n} -> Tree a (suc n) -> a
leftmost = leftmost'
module Workaround2 where
private
leftmost' : forall {a n m} -> Tree a m -> m ≡ suc n -> a
leftmost' (leaf x) _ = x
leftmost' (node zero (suc n₂) l r) _ = leftmost' r refl
leftmost' (node (suc n₁) n₂ l r) _ = leftmost' l refl
leftmost : forall {a n} -> Tree a (suc n) -> a
leftmost t = leftmost' t refl