
Inductive families and pattern matching

  Pattern matching only if we can figure out which constructors are
  allowed (by first order unification).
  Meaning constructor targets and scrutinee should be indexed by
  constructor patterns.

  Allow repeated variables in patterns as long as the type checker can
  figure out that they have to be equal anyway.
  
  No: Force the user call equal things by the same name.

  Not allowed:

    f : (n : Nat) -> Vec A n -> ...
    f n (cons m x xs) = ...

  Allowed

    f (s m) (cons m x xs) = ...

  Issues: what about (m is hidden)

      f n (x::xs) = ...

    Not allowed.

  When can we translate to Core?

  Completeness: the dot notation

      f 0 tt = e
      f (s n) .

    You can leave out clauses if the missing cases immediately lead to an
    empty type.

      -- corresponds to pattern matching on the Even
      f : (n : Nat) -> Even n -> X
      f 0 even0		     = a
      -- missing case for (s 0). Even (s 0) is decidably empty.
      f (s (s n)) (evenSS n) = b

      -- pattern matching on the number and then the Even
      f 0 even0		     = a
      f (s 0) .
      f (s (s n)) (evenSS n) = b

vim: sts=2 sw=2 tw=75
