deniok: (typed lambda)
deniok ([personal profile] deniok) wrote2013-06-24 06:14 pm

Читая Джо Уэллса

Знаете ли вы, чем замечателен этот λ-терм?
λv.(λy.λz.v(yy)(yz))(λx.(λa.λb.a)x(x(xv)v))(λw.ww)
Он нормализуем, его нормальная форма
λv.v(λx.x)(λw.ww)
Более того он нормализуем сильно, то есть независимо от редукционной стратегии. Однако ему нельзя приписать никакого типа, даже в полной версии System F.

Первый такой терм придумали P. Giannini, F. Honsell и S. Ronchi Della Rocca из Миланского университета в 1987 году. А этот я взял из статьи J. B. Wells, Typability and Type Checking in System F Are Equivalent and Undecidable (1998).

[identity profile] deni-ok.livejournal.com 2013-06-27 06:52 am (UTC)(link)
Уже в анализе v(yy)(yz) вижу сужение возможностей. Если тип y полиморфный, то типы аргументов v могут и не совпадать:
> :set -XRankNTypes
> :set -XScopedTypeVariables
> :t \v (y :: forall a. a -> a) z -> v (y y) (y z)
\v (y :: forall a. a -> a) z -> v (y y) (y z)
  :: ((a -> a) -> a1 -> t) -> (forall a2. a2 -> a2) -> a1 -> t

[identity profile] kodt-rsdn.livejournal.com 2013-06-27 07:23 am (UTC)(link)
Почему y :: forall a.a->a, а не forall a.a->b?
Он же может что угодно вернуть.

[identity profile] deni-ok.livejournal.com 2013-06-27 07:34 am (UTC)(link)
Тогда уж forall a b. a -> b

[identity profile] kodt-rsdn.livejournal.com 2013-06-30 12:17 pm (UTC)(link)
Ненене. forall a b означает, что на входе чёрте-что и на выходе такая же непредсказуемая фигня. Причём эта фигня зависит даже не от типа аргумента, а от его значений, то есть, динамика в полный рост.

forall a . a -> b - функция всеядная (void*, если по-сишному), а на выходе что-то определённое.
Что именно определённое - это предстоит решить выводителю типов...

[identity profile] deni-ok.livejournal.com 2013-06-30 12:29 pm (UTC)(link)
Это уже какое-то ограничение на System F. В ней можно и так, и сяк пробовать - важно, чтобы в результате типизации всех подтермов вышли согласованными по аппликациям.

[identity profile] kodt-rsdn.livejournal.com 2013-06-30 12:31 pm (UTC)(link)
Попробовать-то можно, просто зачем заранее пессимизировать?