flang компилятор доказывает, что программа не зациклится 0.6.2 GitHub

Синтез из спецификации упирается в 75 узлов дерева — и медианная функция нашей библиотеки ровно этого размера

Внешняя проверка к a-signature-does-not-determine-a-function: если бы наша спецификация всё-таки определяла функцию, синтезировал бы её кто-нибудь? Ответ — функцию да, библиотеку нет, и потолок известен с точностью до десятков узлов.

Рекорд за десять лет назван авторами прямо. Myth (PLDI 2015): «to our knowledge fvs_large is the largest example of a fully synthesized recursive function in the literature at 75 AST nodes»; остальные 43 задачи — 15–30 узлов (pdf). Synquid (PLDI 2016): самая большая рекурсивная программа — 69 узлов (arXiv). SuSLik (POPL 2019) — 10–58 узлов, Cypress (PLDI 2021) — максимум 35 операторов и 1304 секунды на удаление корня из дерева поиска. Absynthe (PLDI 2023), самая свежая работа этого рода: максимум в таблице — 14 узлов при пределе в 600 секунд, и там же сказано почему: «a larger program takes much longer to synthesize, due to combinatorial increase in the number of terms being searched».

Наш замер: медианное тело функции flang/stdlib/59 токенов (code-cannot-be-derived-from-its-hash). Единицы разные — узлы дерева и токены, — но порядок один. Медианная функция нашей библиотеки стоит ровно на рекорде десятилетия. Не «немного не дотягиваем»: одна такая функция — это предел области, а в библиотеке их 208.

Отношение спеки к телу у них перевёрнуто, и это добивает наш довод 0,28. Я мерил, что спека втрое короче тела, и оговаривал: это оттого, что спека у нас не определяющая. Вот подтверждение снаружи, в узлах дерева, из таблицы самого Synquid: балансировка красно-чёрного дерева — спека 144, код 137; поворот AVL — спека 107, код 91. У SuSLik для поворотов дерева поиска спека вдесятеро больше программы. Авторы Synquid признают это в тексте: «Even though specification sizes for some benchmarks are comparable with the size of the synthesized code…».

И спека обязана быть «под синтезатор». Когда чужие люди написали семантически равносильные спеки к тем же задачам, Synquid решил 22 из 45, и две неверно, — 44 % правильных (Burst, POPL 2022): «Synquid is only able to successfully synthesize programs from highly stylized specifications… coming up with specifications that are Synquid-friendly is a highly non-trivial task» (pdf).

Смежные области дают тот же порядок.

Самое красноречивое — что область покинули. У Поликарповой, автора Synquid, после 2022 года ни одной работы по чистому синтезу из уточняющих типов: babble, CCLemma, HYSYNTH (с подсказкой от языковой модели), Laurel. То же в EPFL: Stainless синтеза не делает, а строка «Leon остаётся основным проектом по синтезу» заморожена на 2016 годе.

И общее место, ради которого всё это искалось — обзор Гулвани, Полозова и Сингха (2017): «The deductive synthesis approaches assumed a complete formal specification of the desired user intent was provided, which in many cases proved to be as complicated as writing the program itself» (pdf). Резче всех сказал Солар-Лезама: «the only way to completely and unambiguously characterize a program is by writing down the program itself».

Чем подтверждено. Два независимых разбора внешних источников 2026-08-18; ссылки построчно выше, числа взяты из таблиц самих работ. Сошлись порознь: 69 узлов и 246 узлов у Synquid, «спека 144 против кода 137», 10–58 узлов и десятикратная спека у SuSLik, закрытие соревнования SyGuS, 40,8 % и 17,4 % у молотков, «tens of seconds… to overnight» у fiat-crypto, «10 to 20 lines» у Narcissus, отказ MoSSKit на переходе от списка к словарю. Наши 59 токенов — замер на этой машине, описан в code-cannot-be-derived-from-its-hash.

Чем ограничено.

Связано: a-signature-does-not-determine-a-function, code-cannot-be-derived-from-its-hash, a-ratchet-instead-of-derivation, derivation-works-where-the-domain-was-narrowed-on-purpose, zakony-kak-ukazatel, the-bottleneck-is-rule-strength