[n]IN = InN = Nand
[n]IN : TThe latter is because [n]: (T->T)->(T->T), hence [n] I: (T->T), and therefore ([n]I)N : T.
Note: this part is exactly what does not hold in the system of Curry: x is not obliged to have a specific type T and therefore we can assume different types for x, thus obtaining different types for \x.N.
\x1x2...xn. x N1N2...NkHowever, since we have only one -> in the type, n must be 1, and x must be x1 because it can't be free. Moreover, k must be 0 because if we apply x1 to any term then the type of x1 cannot be simply alpha. In conclusion, the term must be \x1. x1, which is I.
(\x. case(x,\x.Omega,I))(inl [false]) -> (\x. case(x,\x.Omega,I))(inl [false]) -> ... ----- ----- (\x. case(x,\x.Omega,I))(inl [false]) -> case(inl [false],\x.Omega,I) -> case(inl [false],\x.Omega,I) -> ... ------------------------------------- ----- ----- (\x. case(x,\x.Omega,I))(inl [false]) -> case(inl [false],\x.Omega,I) -> Omega -> Omega -> ... ------------------------------------ ---------------------------- ----- -----
(\x. case(x,\x.Omega,Y)(inr [false]) -> (\x. case(x,\x.Omega,Y)(inr [false]) -> ... ----- -----and a normalizing reduction sequence
(\x. case(x,\x.Omega,Y)(inr [false]) -> case(inr [false],\x.Omega,Y) ------------------------------------ ---------------------------- -> (\z.[false](zz))(\z.[false](zz)) ----------- -> (\zy.y)(\z.[false](zz)) ----------------------- -> \y.y (normal form)Note: By mistake the original term in this question was (\x. case(x,\x.Omega,Y)(inr [true]). This term is not normalizing.
G |- M: A + B G |- N: A -> C G |- P: B -> C +elim --------------------------------------------------- G |- case(M, N, P) : C