natElim : (p : Nat -> Type) -> p Z -> ((k : Nat) -> p k -> p (S k)) ->
          (x : Nat) -> p x

natElim2 : (p : Nat -> Type) -> p Z -> ((k : Nat) -> p k -> p (S k)) ->
           (x : Nat) -> p x
natElim2 p x f Z = x
natElim2 p x f (S k) = ?foo

listElim : (p : List a -> Type) ->
           (mnil : p []) ->
           (mcons : (x : _) -> (xs : List a) -> p xs -> p (x :: xs)) ->
           (xs : List a) -> p xs
