Короткий приклад експоненціальної вартості висновку типу ML


11

Мені було звернуто увагу, що вартість виведення типу у такій функціональній мові, як OCaml, може бути дуже високою. Твердження полягає в тому, що існує послідовність виразів, така що для кожного виразу довжина відповідного типу є експоненціальною щодо довжини виразу.

Я розробив послідовність нижче. Моє запитання: чи знаєте ви послідовність з більш стислими виразами, яка досягає тих самих типів?

# fun a -> a;;
- : 'a -> 'a = <fun>
# fun b a -> b a;;
- : ('a -> 'b) -> 'a -> 'b = <fun>
# fun c b a -> c b (b a);;
- : (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c = <fun>
# fun d c b a -> d c b (c b (b a));;
- : ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'd
= <fun>
# fun e d c b a -> e d c b (d c b (c b (b a)));;
- : (((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
   ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'e
= <fun>
# fun f e d c b a -> f e d c b (e d c b (d c b (c b (b a))));;
- : ((((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
     (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
    ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'e -> 'f) ->
   (((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
   ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'f
= <fun>

Відповіді:


14

У цій відповіді я дотримуватимуся основного фрагмента мови мови з просто лямбда-численням та поліморфністю, що letслідує за Хіндлі-Мілнером . Повна мова OCaml має додаткові функції, такі як поліморфізм рядків (який, якщо я пригадую правильно, не змінює теоретичну складність, але з якою реальні програми, як правило, мають більші типи) та модульну систему (яка, якщо ти досить сильно тикаєш, може бути не -припинення у патологічних випадках із залученням абстрактних підписів).

Найгірша часова складність вирішення питання про те, чи є основна програма ML, є типом простого розміру програми. Класичні посилання на цей результат - [KTU90] та [M90]. Більш елементарне, але менш повне лікування наведено в роботі [S95].

Максимальний розмір типу типу основної програми ML є насправді вдвічі експоненціальним у розмірі програми. Якщо перевіряючий тип повинен надрукувати тип програми, то час може бути подвійно експоненціальним; її можна повернути до простого експоненціалу, визначивши абревіатури для повторних частин дерева. Це може відповідати обміну частинами дерева типів у реалізації.

Ваш приклад показує експоненціальне зростання типу. Однак зауважте, що можна представити тип лінійного розміру, використовуючи абревіатури для повторних частин типу. Це може відповідати обміну частинами дерева типів у реалізації. Наприклад:

# fun d c b a -> d c b (c b (b a));;
t2 -> t2
where t2 = (t1 -> 'b -> 'c) -> t1 -> 'a -> 'd
where t1 = 'a -> 'b

(x,x)xpairNΘ(2N)

# let pair x f = f x x;;
# let pairN x = pair (pair (pair … (pair x)…));;
'a -> tN
where tN = (tN-1 -> tN-1 -> 'bN) -> 'bN
…
where t2 = (t1 -> t1 -> 'b2) -> 'b2
where t1 = ('a -> 'a -> 'b1) -> 'b1

Вводячи вкладені поліморфні letвизначення, розмір типу знову збільшується експоненціально; на цей раз жоден обмін не може позбавити експонентного зростання.

# let pair x f = f x x;;
# let f1 x = pair x in
  let f2 x = f1 (f1 x) in
  let f3 x = f2 (f2 x) in
  fun z -> f3 (fun x -> x) z;;

Список літератури

[KTU90] Kfoury, J .; Тюрін; Уржичин, П. (1990). "Типізація ML залежить від закінчення часу". Конспекти лекцій з інформатики. CAAP '90 431: 206-220. [ Спрингер ] [ Google ]

[M90] Мейрсон, Гаррі Г. (1990). "Вирішення типізації ML є повним для детермінованого експоненціального часу". Праці 17-го симпозіуму ACM SIGPLAN-SIGACT з Принципів мов програмування. POPL '90 (ACM): 382–401. [ ACM ]

[P04] Бенджамін С. Пірс. Розширені теми у видах та мовах програмування. MIT Press, 2004. [ Amazon ]

[PR04] Франсуа Поттьє та Дідьє Ремі. "Сутність виводу типу ML". Глава 10 у [P04]. [ pdf ]

[S95] Михайло І. Шварцбах. Поліморфні умовиводи. БРІКС LS-95-3, червень 1995. пс


так що, в основному, "композиційний" характер виразів типу в поєднанні з висновком типу є коренем проблеми?
didierc

1
@didierc Я не розумію ваш коментар. Багато речей є композиційними. Певним чином, основна причина полягає в тому, що з основних операцій дублювання об'єкта (обмеження того, що два типи є однаковими) та з’єднання ( ->оператор) можна зробити експоненціальне зростання (дерево Фібоначчі).
Жил "ТАК - перестань бути злим"

Так, я думаю, що це я мав на увазі: алгебра типу є за визначенням композиційною (ви використовували у своїй відповіді терміни "скласти парну функцію", це, мабуть, там, де я підібрав слово), в тому сенсі, що вирази типу thaf побудовані з менші вирази та оператори, і кожен новий склад виразів масштабує розмір виразу принаймні на коефіцієнт 2 (при більш складних поліморфних типах - тріадічних і більше, коефіцієнт більший).
didierc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.