diff --git a/.flangrc b/.flangrc index 2b06a626a..d93c1e18f 100644 --- a/.flangrc +++ b/.flangrc @@ -48,19 +48,19 @@ script.target-words:check = bootstrap/flang io flang/scripts/target-words.fscrip script.file-extensions:check = bootstrap/flang io scripts/guards/file-extensions.fscript --на-веру script.kernel-forgeries:check = bootstrap/flang run-script seed:freshness --what kernel-forgeries:check >&2 && bootstrap/flang io flang/scripts/kernel-forgeries.fscript --plan 'Подделки остаются недоказанными' --на-веру script.axioms:check = bootstrap/flang io flang/scripts/kernel-forgeries.fscript --plan 'Аксиом ноль' --на-веру -script.proof-record:check = bootstrap/flang run-script seed:freshness --what proof-record:check >&2 && sh flang/proof/forgeries/run.sh +script.proof-record:check = bootstrap/flang run-script seed:freshness --what proof-record:check >&2 && bootstrap/flang io flang/proof/forgeries/run.fscript --max-steps 4000000000 --timeout 14400000 script.record-source:check = bootstrap/flang io scripts/guards/record-follows-its-source.fscript --plan Проверка script.record-source:forgery = bootstrap/flang io scripts/guards/record-follows-its-source.fscript --plan Подлог script.checker:check = bootstrap/flang io flang/proof/checker/tests/run.fscript --max-steps 4000000000 --timeout 600000 script.translation:check = sh flang/translation/run.sh -script.proved-share:check = sh flang/proof/corpus-share.sh --набор корпус +script.proved-share:check = bootstrap/flang io flang/proof/share-measure.fscript --max-steps 4000000000 --timeout 900000 -- --set corpus script.proved-share:forgery = bootstrap/flang io flang/proof/share-ledger-forgery.fscript --max-steps 4000000000 --timeout 900000 script.kernel-verdict:check = bootstrap/flang io flang/proof/kernel-verdict.fscript --max-steps 4000000000 --timeout 900000 script.kernel-verdict:forgery = bootstrap/flang io flang/proof/kernel-verdict-forgery.fscript --max-steps 4000000000 --timeout 900000 script.proof-records:freshness = bootstrap/flang io flang/proof/records-nesting.fscript --max-steps 4000000000 --timeout 900000 script.provability = bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 -script.share:replay = sh flang/proof/corpus-share.sh --проигрыванием -script.share:forgery = sh flang/proof/corpus-share.sh --проигрыванием --самопроверка +script.share:replay = bootstrap/flang io flang/proof/replay-share.fscript --max-steps 4000000000 --timeout 900000 +script.share:forgery = bootstrap/flang io flang/proof/replay-share.fscript --max-steps 4000000000 --timeout 900000 -- --forgery script.child-timeout:check = bootstrap/flang io scripts/guards/child-timeout.fscript --timeout 120000 script.conc-link:emit = bootstrap/flang io scripts/targets/conc-link-emit.fscript --на-веру script.release:check = bootstrap/flang io scripts/guards/release-guard.fscript --на-веру diff --git a/.github/workflows/binary.yml b/.github/workflows/binary.yml index 7d51f27c6..caed090c7 100644 --- a/.github/workflows/binary.yml +++ b/.github/workflows/binary.yml @@ -394,9 +394,9 @@ jobs: # # Счётчиков долга в дереве было три — раздел «Вне языка» в docs/ROADMAP.md, # docs/javascript-inventory.md и числа сайта, — и все три считали ОДИН - # язык: JavaScript. Оболочка (54 файлов, 11512 строк), HTML, CSS, пробы на - # СНЯТО 2026-09-17 файлов *.sh = 54 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-17) - # СНЯТО 2026-09-17 строк-в *.sh = 11512 (задача 1400: девять проб на подлог и две честные под правила Н6 и О9 прибавили 42 строки в flang/proof/checker/tests/run.sh) (задача 1416: четырнадцать объявлений ярлыков заведены в скриптах и зов «Сбора» — в хуке; до них 23372, снято 2026-09-17) (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 23980, снято 2026-09-22) (ADR-0046: довод в шапках двух сторожей имён — сперва почему flang/proof не судится, потом почему вошёл в область — прибавил 9 строк; до него 23971, снято 2026-09-17) + # язык: JavaScript. Оболочка (52 файлов, 9762 строк), HTML, CSS, пробы на + # СНЯТО 2026-09-17 файлов *.sh = 52 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-17) + # СНЯТО 2026-09-17 строк-в *.sh = 9762 (задача 1400: девять проб на подлог и две честные под правила Н6 и О9 прибавили 42 строки в flang/proof/checker/tests/run.sh) (задача 1416: четырнадцать объявлений ярлыков заведены в скриптах и зов «Сбора» — в хуке; до них 23372, снято 2026-09-17) (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 23980, снято 2026-09-22) (ADR-0046: довод в шапках двух сторожей имён — сперва почему flang/proof не судится, потом почему вошёл в область — прибавил 9 строк; до него 23971, снято 2026-09-17) # C, Python, awk и Erlang не считались нигде и ни в одной проверке. Долг, # которого никто не считает, не убывает: его не видно ни в отчёте, ни в # ленте, и растёт он молча. @@ -407,9 +407,9 @@ jobs: # оболочке или на Python останавливает работу в тот же день. # # Замер на этом дереве: 17,7 с и 471 МБ, двоичному хватает `git` и `wc`. - # Предел шагов поднят с умолчания (10 млн): опись обходит 196 файлов и + # Предел шагов поднят с умолчания (10 млн): опись обходит 194 файлов и # семнадцать языков, и в умолчание не укладывается. - # СНЯТО 2026-09-17 файлов *.sh,*.c,*.h,*.py,*.html,*.css,*.awk,*.erl,*.js,*.mjs,*.java,*.cs,*.ex,*.exs,*.go,*.rs,*.lua,*.vim,*.rb,*.cpp,*.cc,*.hpp,*.hh,ярлык,packaging/asdf/bin/download,packaging/asdf/bin/install,packaging/asdf/bin/list-all,.githooks/pre-push = 196 (задача 5821: семь проверок scripts/** стали планами; до них 251, снято 2026-09-27) (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 256, снято 2026-09-17) + # СНЯТО 2026-09-17 файлов *.sh,*.c,*.h,*.py,*.html,*.css,*.awk,*.erl,*.js,*.mjs,*.java,*.cs,*.ex,*.exs,*.go,*.rs,*.lua,*.vim,*.rb,*.cpp,*.cc,*.hpp,*.hh,ярлык,packaging/asdf/bin/download,packaging/asdf/bin/install,packaging/asdf/bin/list-all,.githooks/pre-push = 194 (задача 5821: семь проверок scripts/** стали планами; до них 251, снято 2026-09-27) (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 256, снято 2026-09-17) # # СКОЛЬКО ИЗ ЭТИХ ПЯТИДЕСЯТИ МИЛЛИОНОВ УХОДИТ, замер 29 августа 2026. # Меряно перебором самого предела: при 10 500 000 опись умирает @@ -1467,7 +1467,9 @@ jobs: env: FLANG_TMP: ${{ runner.temp }} - name: Check corpus ledger - run: sh flang/proof/corpus-share.sh --набор корпус + run: bootstrap/flang io flang/proof/share-measure.fscript --max-steps 4000000000 --timeout 900000 -- --set corpus + env: + FLANG_TMP: ${{ runner.temp }} # ── СЛИЧИТЕЛЬ ПЕРЕВОДА: ПРОТОКОЛ ПЕЧАТНИКА ПЕРЕИГРЫВАЕТСЯ НА C ────────────── # diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0993cbde..e6d34647a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -206,8 +206,8 @@ jobs: # 31 августа 2026 в дереве нашлось 31 место в 14 файлах, где записанное рукой # число разошлось с тем, что лежит рядом: `docs/tree-inventory.md` считала # `seed-parses-sources-guard.sh` в 83 строки при 195, оболочку — в 66 файлов - # при 71 тогдашних — сегодня их 54; - # СНЯТО 2026-09-17 файлов *.sh = 54 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-21) `flang/cat/SPEC.md` обещала восемнадцать поручений при 22; + # при 71 тогдашних — сегодня их 52; + # СНЯТО 2026-09-17 файлов *.sh = 52 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-21) `flang/cat/SPEC.md` обещала восемнадцать поручений при 22; # `flang/PLAN.md` — пять вариантов «Поручение» при 22. Каждое из этих чисел # было ВЕРНО В ДЕНЬ ЗАПИСИ и солгало назавтра, и сторожа не было ни на одном. # diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 82fac7f45..ea0eca8ae 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -59,8 +59,8 @@ Haskell. flang целится в одно: язык, на котором и до ### Этап 1 (ЗАКРЫТ 18 сентября 2026). Независимый проверяющий переигрывает ВСЁ в собственных записях компилятора **Снято 18 сентября 2026** (ветка `a/5190-seed-reprint-0-7-20` над `main` `d366fc8f2`, -сверщик собран заново из исходника): `sh flang/proof/corpus-share.sh --набор корпус ---проигрыванием` → **650 из 650 = 100,00 %**; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → **ДОКАЗУЕМ**, +сверщик собран заново из исходника): `bootstrap/flang io +flang/proof/replay-share.fscript` → **650 из 650 = 100,00 %**; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → **ДОКАЗУЕМ**, код 0. Разбивка числителя печатается прибором: на слово ядра — посылок и утверждений 0, шагов 0; снято калькулятором, а не игрой, — 0. Знаменатель 650 — это все 672 обязательства набора за вычетом 22 мест четырёх записей, которые сверщик отверг целиком и которые манифест @@ -100,7 +100,7 @@ Haskell. flang целится в одно: язык, на котором и до рода в принципе переигрывается — а переиграется ли он у вас, говорит только прогон проверяющего на вашей паре «исходник + запись». -**Чем проверяется.** `corpus-share.sh --проигрыванием` печатает +**Чем проверяется.** `replay-share.fscript` печатает «на слово ядра: посылок и утверждений 0; шагов 0; снято калькулятором 0», а `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` по-прежнему ДОКАЗУЕМ. @@ -510,7 +510,7 @@ make -C bootstrap -j8 собрать комп ./bootstrap/flang --version версия собранного двоичного bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000 четыре покрытия порознь, с датой и SHA bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 ДОКАЗУЕМ / НЕ ДОКАЗУЕМ по четырём числам, ≈18 с -sh flang/proof/corpus-share.sh --проигрыванием из чего сложена доля первого покрытия +bootstrap/flang io flang/proof/replay-share.fscript из чего сложена доля первого покрытия bootstrap/flang io flang/proof/records-nesting.fscript записи — то, что печатает СОБРАННЫЙ двоичный bootstrap/flang run-script checker:check пробы на подлог у независимого проверяющего ./bootstrap/flang check --proof ФАЙЛ отчёт о доказательствах файла diff --git a/docs/flang/proof/forgeries.md b/docs/flang/proof/forgeries.md index 481812007..bc329aff7 100644 --- a/docs/flang/proof/forgeries.md +++ b/docs/flang/proof/forgeries.md @@ -32,7 +32,7 @@ | читатель | что берёт | |---|---| | `flang/proof/checker/tests/run.sh` | класс каждой записи корпуса и ожидаемый по нему код | -| `flang/proof/corpus-share.sh` | какие места вынести из знаменателя доли | +| `flang/proof/replay-share.fscript` | какие места вынести из знаменателя доли | | `scripts/provability.fscript` | проверки 3 и 4 вердикта: набор пойман целиком и не усох | Запись корпуса с именем `poddelka-*` или `forgery-*`, которой нет в манифесте, diff --git a/docs/flang/proof/known-soundness-violations.md b/docs/flang/proof/known-soundness-violations.md index 889dfde63..0e331be68 100644 --- a/docs/flang/proof/known-soundness-violations.md +++ b/docs/flang/proof/known-soundness-violations.md @@ -24,7 +24,7 @@ в которой доказанным не числится ничего. Код успеха читается как «доказано», а проверено в такой записи ноль мест; отличить можно только по тексту вывода. Сколько таких записей в корпусе, печатает -`sh flang/proof/corpus-share.sh --набор корпус`. +`bootstrap/flang io flang/proof/share-measure.fscript -- --set corpus`. ## `theorem-hypothesis-not-discharged` — открыто diff --git a/docs/flang/proof/ratchets.md b/docs/flang/proof/ratchets.md index 1475f1366..4c5e05ab3 100644 --- a/docs/flang/proof/ratchets.md +++ b/docs/flang/proof/ratchets.md @@ -14,7 +14,7 @@ | `checker-code-lines` | строк кода в `flang/proof/checker/checker.c` без комментариев и пустых | замер не больше числа | `flang/proof/tables-guard.fscript`, проверка С-6 | | `checker-primitives` | имён в массиве `ПРИМИТИВЫ[]` проверяющей программы | замер равен числу | там же | -`flang/proof/corpus-share.sh` печатает `forgeries` и `forgery-numerator` рядом со +`flang/proof/replay-share.fscript` печатает `forgeries` и `forgery-numerator` рядом со своим замером, чтобы просадку было видно там же, где число. ## Что делает вердикт при нарушении diff --git a/docs/four-coverages.md b/docs/four-coverages.md index 84d3772d4..802ca424e 100644 --- a/docs/four-coverages.md +++ b/docs/four-coverages.md @@ -27,7 +27,7 @@ bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 90000 а не принял на слово у ядра. Записи лежат готовыми в `flang/proof/checker/tests/records/corpus/` — по одной на программу-образец, всего 91. -Снимается: `sh flang/proof/corpus-share.sh --проигрыванием`. +Снимается: `bootstrap/flang io flang/proof/replay-share.fscript`. **Что это даёт сказать.** Что у этого набора записей слово «доказано» в отчёте компилятора не опирается на веру компилятору: вторая программа, в которой нет ни строки компилятора, прошла те же diff --git a/docs/javascript-inventory.md b/docs/javascript-inventory.md index b5862f0e3..d094b039e 100644 --- a/docs/javascript-inventory.md +++ b/docs/javascript-inventory.md @@ -67,8 +67,8 @@ JavaScript стало 55, строк 29 733; в трёх каталогах о Эта опись считает ОДИН язык. Остальные шестнадцать — оболочка, C, C++, Python, HTML, CSS, awk, Erlang, Java, C#, Elixir, Go, Rust, Lua, vimscript, Ruby — -считает [`tree-inventory.md`](tree-inventory.md) (26 сентября 2026: 196 файлов вне flang, - +считает [`tree-inventory.md`](tree-inventory.md) (26 сентября 2026: 194 файлов вне flang, + долг вне JavaScript — **97 файлов, 18 427 строк при потолке 63**: храповик красен, разбор — задачи 4838 и 7405). Там же названы 569 строк JavaScript, лежащих ВНУТРИ файлов `.html`: счёт по именам файлов их не видит, и diff --git a/docs/road-to-one-hundred-measured.md b/docs/road-to-one-hundred-measured.md index 108263011..6759c9264 100644 --- a/docs/road-to-one-hundred-measured.md +++ b/docs/road-to-one-hundred-measured.md @@ -69,7 +69,7 @@ ## 0. Откуда 134 и как они названы поимённо ``` -sh flang/proof/corpus-share.sh --проигрыванием +bootstrap/flang io flang/proof/replay-share.fscript ЧИСЛИТЕЛЬ 517 = ходами/тотальностью 390 + по существу 93 + узлы 34 ЗНАМЕНАТЕЛЬ 651 доля = 517 / 651 = 79.42 % порог 95 %: НЕТ на слово ядра: посылок и утверждений 109; шагов 17; снято вычислением 8 diff --git a/docs/tree-inventory.md b/docs/tree-inventory.md index 7ea6c9908..319384a65 100644 --- a/docs/tree-inventory.md +++ b/docs/tree-inventory.md @@ -1,5 +1,5 @@ -# Опись дерева по языкам: 196 файлов вне flang, долг вне JavaScript — 93 при потолке 63 - +# Опись дерева по языкам: 194 файлов вне flang, долг вне JavaScript — 93 при потолке 63 + ⚠ **ХРАПОВИК ДОЛГА КРАСЕН, и заголовок это теперь говорит.** Прогон `bootstrap/flang run-script inventory:languages` **5 сентября 2026** отвечает кодом 1: «ДОЛГ ВНЕ @@ -76,7 +76,7 @@ $ bootstrap/flang io scripts/guards/tree-inventory.fscript --max-steps 50000000 | язык | файлов | строк | долг файлов | долг строк | |---|---:|---:|---:|---:| -| оболочка | 60 | 11 829 | 54 | 7 379 | +| оболочка | 58 | 10 079 | 52 | 5 629 | | C | 37 | 870 683 | 0 | 0 | | C++ | 1 | 404 | 0 | 0 | | Python | 5 | 2 906 | 0 | 0 | diff --git a/docs/what-provability-gives-today.md b/docs/what-provability-gives-today.md index c31b14c78..c6c7606d3 100644 --- a/docs/what-provability-gives-today.md +++ b/docs/what-provability-gives-today.md @@ -128,7 +128,7 @@ Not expressible — there is no place to write it: ``` bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ (18 September 2026) -sh flang/proof/corpus-share.sh --проигрыванием +bootstrap/flang io flang/proof/replay-share.fscript → доля-проигрыванием = 650 / 650 = 100.00 % на слово ядра: посылок и утверждений 0; шагов 0; снято калькулятором 0 ``` diff --git a/docs/what-provability-gives-today.ru.md b/docs/what-provability-gives-today.ru.md index ec71821f0..6c3263a9d 100644 --- a/docs/what-provability-gives-today.ru.md +++ b/docs/what-provability-gives-today.ru.md @@ -182,7 +182,7 @@ $ make -C flang/proof/checker && flang/proof/checker/сверщик заказ.f ``` bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ (18 сентября 2026, ≈13 с) -sh flang/proof/corpus-share.sh --проигрыванием +bootstrap/flang io flang/proof/replay-share.fscript → доля-проигрыванием = 650 / 650 = 100.00 % на слово ядра: посылок и утверждений 0; шагов 0; снято калькулятором 0 ``` diff --git a/flang/proof/corpus-share.sh b/flang/proof/corpus-share.sh deleted file mode 100755 index 36d882400..000000000 --- a/flang/proof/corpus-share.sh +++ /dev/null @@ -1,1637 +0,0 @@ -#!/bin/sh -# ЛИНЕЙКА Г4 — «доля корпуса, проверенная независимым чекером». -# -# Гейт Г4 спрашивает долю, а доля есть дробь, и у дроби есть ЗНАМЕНАТЕЛЬ. -# Знаменателей в дереве два, и они отличаются вдвое: -# -# набор «корпус» — 86 готовых записей flang/proof/checker/tests/records/corpus -# (43 исходника из flang/proof/examples, 35 из -# flang/test/fixtures, 8 из flang/proof/map); -# набор «примеры» — 43 записи, которые ядро печатает из flang/proof/examples -# (файлов там 45, на двух печать отказывает). -# -# Линейка НЕ выбирает между ними. Она меряет ОБА одним прибором и печатает оба -# числа рядом, каждое со своим знаменателем. Выбор — за человеком; линейка -# нужна ровно затем, чтобы выбор был дешёвым, а не чтобы его подменить. -# -# Звать: -# sh flang/proof/corpus-share.sh --набор корпус # 86 готовых записей -# sh flang/proof/corpus-share.sh --набор примеры # 43, печатает ядром -# sh flang/proof/corpus-share.sh --набор КАТАЛОГ # любой каталог с *.record -# sh flang/proof/corpus-share.sh --оба # корпус и примеры рядом -# sh flang/proof/corpus-share.sh --самопроверка # десять проб на сам прибор -# Ключи: -# --разбор ФАЙЛ положить построчный разбор (TSV) в ФАЙЛ -# --корень ПУТЬ корень дерева (по умолчанию — два уровня вверх от скрипта) -# --коммит X из какого коммита строить ведомость (по умолчанию HEAD) -# --ведомость Ф взять готовую ведомость из файла, а не строить из коммита -# --выписать-ведомость Ф положить построенную ведомость в файл -# -# ЦЕНА ЗАМЕРА, И ГДЕ ОНА ЛЕЖИТ. Прогон чекера по 86 записям — единицы секунд. -# Дорога не проверка, а ПЕЧАТЬ: сборка ядра (`make -C bootstrap`, один файл в -# 707 тысяч строк, серийная LTO-сшивка) идёт минуты, и без неё набор «примеры» -# не собрать. Поэтому набор «корпус» меряется всегда и мгновенно, а «примеры» — -# только когда двоичный уже собран. Замер одной записи «за 12–20 минут» — это -# замер сборки, отнесённый на одну запись. -# -# ЧТО МЕРЯЕТСЯ. Чекер даёт четыре исхода: 0 ПРОВЕРЕНО, 1 НЕ СОШЛОСЬ, -# 3 НЕ ПРОВЕРЕНО, 2 кривой вызов. Коды 2, 3 и всё, что больше 3 (126, 127, -# 128+N — оболочка и сигналы), — НЕ приговоры, и линейка считает их ОТДЕЛЬНО. -# Свалить их в «не прошло» значило бы записать молчание прибора в вину записи. -# -# ДВА ПРОГОНА НА КАЖДУЮ ЗАПИСЬ, и в этом весь смысл линейки: -# «как есть» — чекер зовётся двумя доводами, как зовёт его оснастка; -# «с отпечатком» — тем же чекером, но sha256 исходника подан ТРЕТЬИМ доводом, -# и берётся он ИЗ ВЕДОМОСТИ КОММИТА, а не из проверяемой -# записи: проверяемое не заверяет само себя. -# -# ВЕДОМОСТЬ: ДЕЛО НАЗЫВАЕТ ДЕРЕВО, А НЕ ПОДСУДИМЫЙ (задача 4820). -# До 5 сентября 2026 линейка брала путь исходника из строки «исходник» самой -# проверяемой записи и снимала отпечаток с того, на что запись показала. -# Отпечаток при этом был честный — и в этом была вся беда: подсудимый выбирал -# себе дело. Прогон, показавший изъян: строка «исходник» переписана на -# нетронутую копию вне коммита, а файл дерева `corpus-natural.flang` заменён -# ложью (`минус` вместо `плюс`). Ядро на файле дерева — код 1 с контрпримером -# «нарушено свойство «сумма пары неотрицательна»»; линейка — Р0 «ПРОВЕРЕНО», -# и общий счёт не дрогнул: 28 из 86 и до, и после. -# -# Теперь дело называет дерево. Ведомость строится ИЗ КОММИТА -# (`git archive` + `sha256sum`, ни одна запись при этом не читается) и держит -# отпечаток каждого `*.flang` и `*.record` дерева. На каждую запись линейка: -# 1. ищет названный ею путь В ВЕДОМОСТИ — нет там, значит дела нет: Р5; -# 2. сличает файл рабочего дерева с отпечатком коммита — разошлись: Р5; -# 3. подаёт чекеру третьим доводом отпечаток ИЗ ВЕДОМОСТИ; -# 4. если сама запись лежит внутри дерева — требует того же и от неё. -# Р5 — «не берусь»: это не приговор записи, а отказ судить дело, за которое -# дерево не отвечает. Р5 больше нуля роняет прогон кодом 1. -# -# ЧЕГО ВЕДОМОСТЬ НЕ ЗАКРЫВАЕТ, И ЭТО НЕ ЧИНИТСЯ ВЕДОМОСТЬЮ ВООБЩЕ (задача 2390). -# Подделыватель, который ПРОВЁЛ свой файл в коммит вместе с записью, попадёт в -# ведомость честно, отпечаток сойдётся, и линейка его пропустит. Ведомость -# закрывает подмену дела, а не приём в дерево. -# -# Довод, почему это НЕ чинится усилением ведомости, показан прогоном, а не -# рассуждением. Подделка задачи 2390: к честному исходнику дописана функция с -# ЛОЖНЫМ постусловием, а в запись добавлено утверждение о ней с вердиктом «нет -# вердикта». В ЗАПИСИ ПРИ ЭТОМ НЕТ НИ ОДНОГО ЛОЖНОГО ПОЛЯ: путь верен, строк и -# знаков верны, оба многочлена верны, отпечаток256 верен, «нет вердикта» — -# правда. Ядро на файле: код 1, «постусловие «…» ЛОЖНО, и контрпример назван». -# Чекер: код 0 «ПРОВЕРЕНО». Линейка: Р0, Р5 ноль, код 0. -# -# Ведомость удостоверяет «файл такой, каким его положили», а не «положенное -# истинно», и первое здесь ПРАВДА. Ловить такое нечем, кроме одного: ядро -# обязано судить сам файл. Вопрос переходит из «что проверяет чекер» в «кто и -# когда обязан прогнать ядро» — и на это заведён план `kernel-verdict.fscript`. -# -# ПРИГОВОР ЯДРА — ОХРАНА ОДНОСТОРОННЯЯ, и это сказано вслух. Код 1 ядра есть -# ОПРОВЕРЖЕНИЕ с названным контрпримером; код 0 ядра доверия не прибавляет -# ничему. Поэтому правило «запись не считается проверенной, если ядро сам файл -# отвергает» умеет только СНИМАТЬ сертификаты и не умеет их выдавать — круга -# «подсудимый заверяет сам себя» здесь нет. Сертификат после правки значит -# «запись сверена И ядро файла не опровергает», и большего не значит: файл с -# ложью, которую ядро не ловит, пройдёт обе двери, и это остаток другой породы. -# -# ПОЧЕМУ НА ОБОЛОЧКЕ, А НЕ НА FLANG. Ведомость обязана строиться там, где -# компилятора нет и не должно быть: работа CI `proof-checker` заведена без -# `make -C bootstrap` нарочно — ответ о записи, полученный тем же двоичным, о -# котором спрашивают, ничего не стоит. Ведомость на flang потребовала бы -# `bootstrap/flang`, то есть ровно того слова, которое мы отказываемся брать. -# Второй прогон отвечает на вопрос «каким станет числитель, если снять первый -# разряд помех — нехватку строки «отпечаток256»». Это ЗАМЕР, а не оценка: -# чекер ставит признак криптопривязки от поданного доводом отпечатка ровно так -# же, как от строки в записи (checker.c, main → sverit, ветка `if (zhdyom)`). -# -# РАЗРЯДЫ ПОМЕХ. Код 0 чекер даёт ровно при двух условиях сразу (checker.c, -# ветвление вердикта): привязка криптографическая И мест «на слово ядра» ноль. -# Отсюда разряды, и они взаимоисключающи: -# Р0 — принято кодом 0; -# Р1 — мешает ТОЛЬКО нехватка «отпечаток256»; мест на слово ядра нет; -# Р2 — то же плюс места на слово ядра; -# Р3 — найдено противоречие (код 1); -# Р4 — не приговор (код 2 либо больше 3). -# Внутри Р2 линейка называет породы мест — своим разбором текста записи, а не -# переписыванием чисел чекера (checker.c: bez_teoremy → na_slovo++; -# posylki_na_slovo → na_slovo; sverit_shagi → shagov_na_slovo): -# П1 «доказано», а теоремы в записи нет — на утверждение; -# П2 посылка с названным правилом и без ходов — на посылку; -# П3 шаг «по примеру», «по свойству», «по закону» — на шаг; -# П5 шаг с ЛЮБЫМ иным обоснованием (сегодня «по предположению») — на шаг. -# Ряды номеров у ПОРОД и у ПРОБ самопроверки независимы и совпадают случайно: -# порода П5 — про шаги, проба П5 — про отпечаток доводом. Общего у них ничего. -# -# ПОЧЕМУ П5 — ОТДЕЛЬНАЯ ПОРОДА, А НЕ ХВОСТ П3. У П3 есть путь в «проверено по -# существу» (привязка `пример строка N`, `свойство строка N`), и потому у неё -# есть что вычитать. У П5 такого пути нет вовсе: сверщик её обоснование не -# проигрывает и кладёт место в долг безусловно. Сложить их в одну породу -# значило бы обещать вычет, которого не бывает. -# -# ТОЖДЕСТВО ОДНО, А НЕ ДВА, И ЭТО ПРАВКА 6 СЕНТЯБРЯ 2026 (7104/7102). Прежде -# их было два — отдельно посылочные места, отдельно шаговые: -# П1+П2 минус снятое = «на слово: посылок и утверждений»; -# П3 минус «по примеру по существу» = «на слово: шагов». -# Держались они, пока снятое приёмом было только посылочным. Работник 7104 -# закрыл рецепт накрутки, и проигранный узел вердикта стал снимать со слова -# ТАКЖЕ шаги своей теоремы, печатая их тем же одним числом «снято со слова -# ядра мест». Разложить это число обратно на посылочное и шаговое нечем — -# значит и сличать надо общей суммой мест: -# -# П1 + П2 + ВСЕ шаги = «на слово: посылок и утв.» + «на слово: шагов» -# + снято + «по примеру по существу» -# + «по свойству по существу» -# -# Слева — все места, какие видит текст записи; справа — куда чекер их разложил. -# Замер на своде пяти веток: сходится на всех 86, тогда как два прежних -# тождества расходились на 16, и `precondition` показывала это чище всех — -# поле чекера «шагов» 3 при старой П3, равной нулю. -# Слагаемое «по свойству» до 7102 не бралось вовсе: в корпусе таких снятий -# было ноль, и тождество сходилось случайно. -# Расхождение печатается словом РАСХОЖДЕНИЕ и роняет прогон кодом 1: два прибора -# на одном числе — это проверка, а один прибор — это мнение. -# -# П4 значение «по объявлению да|нет» — считается ОТДЕЛЬНОЙ строкой (9616-Б), но -# В ТОЖДЕСТВО НЕ ВХОДИТ. Маршрут «по объявлению» всегда без теоремы, значит -# место уже подписано текстовым П1 («доказано»+«теоремы нет») — своего -# слагаемого у П4 нет, сложить его с П1 значило бы посчитать одно и то же место -# дважды (первая редакция 9616-Б так и ошиблась: безусловная прибавка роняла -# код 0→3 на 11 записях, где `перепиской`/`разбором_цели` уже проиграли ту же -# цель другим приёмом). byType-значение чекер не проверяет ничем — читать его -# нечем (второй сводитель, см. sverit_obyavlenie); П4 лишь считает, сколько -# таких строк есть, для видимости. -# ЕДИНИЦА ДОЛИ. Гейт спрашивает про УТВЕРЖДЕНИЯ, а не про записи, и эти два -# счёта отвечают по-разному до противоположности. Поэтому печатаются оба: доля -# записей и доля утверждений. Знаменатель по утверждениям — поле чекера -# «Числятся доказанными» (записи, где доказанным не числится ничего, в -# знаменатель идти не за чем). Числитель — сумма того же поля по записям, -# принятым кодом 0. -set -u -LC_ALL=C.UTF-8; export LC_ALL - -self=$0 -root=$(CDPATH= cd -- "$(dirname -- "$self")/../.." && pwd) -nabor=""; dump=""; oba=0; selftest=0; proigr=0 -kommit=HEAD; vedfile=""; vedout="" - -while [ $# -gt 0 ]; do - case $1 in - --набор) nabor=${2:-}; shift 2 ;; - --разбор) dump=${2:-}; shift 2 ;; - --корень) root=${2:-}; shift 2 ;; - --коммит) kommit=${2:-}; shift 2 ;; - --ведомость) vedfile=${2:-}; shift 2 ;; - --выписать-ведомость) vedout=${2:-}; shift 2 ;; - --оба) oba=1; shift ;; - --самопроверка) selftest=1; shift ;; - # Ш5: доля-ПРОИГРЫВАНИЕМ — иной вопрос, чем разряды помех Р0–Р5 этой линейки. - # Не «сошлась ли запись кодом 0», а «сколько обязательств корпуса РЕАЛЬНО - # проиграно заново записанными ходами». Числитель — «сведений проиграно - # заново» (сведения ПЛЮС тотальность); знаменатель — ВСЕ обязательства - # корпуса (проигранные ПЛЮС непроигранные: места на слово ядра и обязательства - # записей, которые чекер отверг). Ниже, в блоке `proigr`, это разобрано. - --проигрыванием) proigr=1; shift ;; - *) echo "линейка не знает ключа «$1»" >&2 - echo "ключи: --набор {корпус|примеры|КАТАЛОГ} --оба --разбор ФАЙЛ --корень ПУТЬ --самопроверка" >&2 - echo " --коммит X --ведомость Ф --выписать-ведомость Ф" >&2 - echo " --проигрыванием" >&2 - exit 2 ;; - esac -done - -checker=$root/flang/proof/checker/сверщик -[ -x "$checker" ] || { echo "нет чекера $checker — собрать: make -C flang/proof/checker" >&2; exit 2; } -[ "$root/flang/proof/checker/checker.c" -nt "$checker" ] && { echo "чекер $checker старше checker.c — пересобрать: make -C flang/proof/checker" >&2; exit 2; } - -tmp=${TMPDIR:-/tmp}/доля-корпуса.$$ -mkdir -p "$tmp" || exit 2 -trap 'rm -rf "$tmp"' 0 2 3 15 - -# ════════════════════════════════════════════════════════════════════════════ -# Ш5: РЕЖИМ --проигрыванием — ДОЛЯ-ПРОИГРЫВАНИЕМ, иной вопрос, чем разряды Р0–Р5. -# ════════════════════════════════════════════════════════════════════════════ -# Разряды выше меряют «сошлась ли запись кодом 0». Но код 0 чекер даёт и там, где -# узел вердикта СПОСЧИТАН калькулятором (`перепиской`/`разбором_цели`), а не -# проигран записанными ходами (дыра Г7). Гейт Г4/Г7 спрашивает другое: сколько -# РЕАЛЬНО проиграно заново. Этого прибора в дереве не было — и `provability.fscript`, -# проверка 2, честно держала долю за 0: «нечем мерить». Здесь — то, чем мерить. -# -# ЧЕСТНЫЙ ЧИСЛИТЕЛЬ. Чекер печатает НЕСКОЛЬКО разных счетов одного корпуса: -# · «сведений проиграно заново N (ходов проверено K)» — растёт ТОЛЬКО когда у -# утверждения есть записанные ходы и переигрыватель их прогнал (checker.c, -# ветка `est_hody`: `s->сведений += p.proigrano`), А ТАКЖЕ на каждый блок -# тотальности, который проигран (checker.c, сверить_тотальность: `s->сведений++`). -# Калькулятор сюда не пишет; -# · «Узлов вердикта «разбором по случаям» проиграно заново M (снято со слова ядра -# мест U)» — СТРУКТУРНЫЙ ПЕРЕИГРЫШ УЗЛОВ ТОТАЛЬНОСТИ (checker.c `проиграть_узел`, -# носитель segment, тело «если/то/иначе»; `проиграть_узел_algebra`, носитель -# algebra, тело «разбор/случай»). Ходов у шага индукции в записи НЕТ: запись даёт -# СХЕМУ (принцип: тип, переменная, носитель, шаг; посылки: вариант и имя правила -# ядра «неотрицательность по построению»), а сверщик читает ТЕЛО ФУНКЦИИ из -# исходника и сам выводит ту же схему закрытой грамматикой того же правила: -# дно — замкнутый литерал, на котором цель держится; спуск — сумма -# неотрицательного по построению (литерал ≥ 0, довод типа «нат», допущение -# индукции = вызов ровно на «по минус шаг» либо от имени, связанного случаем, -# «если» — ОБЕИМИ ветвями, один шаг развёртки плоского помощника) либо -# произведение строго положительного и конечного довода на допущение. -# Вычислитель (`знач_моё`/`оценить_терм`/`половина_закрыта`) НЕ зовётся ни прямо, -# ни транзитивно (замер 7 сентября 2026: замыкание вызовов 64 функции, -# пересечение с вычислителем пусто); единственная «арифметика» — сравнение двух -# литералов. Это проверка ПО СУЩЕСТВУ, независимая от ядра, того же рода, что -# «по примеру», — потому В ЧИСЛИТЕЛЕ, но ОТДЕЛЬНОЙ строкой: это не ходы и не -# сертификат тотальности, сливать её с ними нельзя. Решение владельца 7 сентября -# 2026: «структурный переигрыш = засчитать». -# ДВЕ ОГОВОРКИ, чтобы число читали верно. (1) Часть мест этой строки — не посылки, -# а ШАГИ теорем «по предположению» (Ч7104, checker.c у `s->узлов_мест += -# моих_не_проигрываемых`: узел прочёл тело и сверил дно со спуском — ровно то, на -# что ссылается шаг; на корпусе 7 сентября 2026 — 12 мест из 34). (2) Узел, у -# которого ВСЕ посылки закрыты шагами автора (правило «»), «проигрывается» -# вакуумно — ни один случай не читается; мест он не снимает (0), но в «узлов M» -# входит (four-words, traffic-light). -# ГРАНИЦА ПРИЁМА. Булева ветка `проиграть_узел_algebra` (цель не «результат не -# меньше 0», замыкание `половина_закрыта` — это ВЫЧИСЛИТЕЛЬ) кладёт снятое в ТУ ЖЕ -# строку сводки. С задачи 6127 сверщик печатает её ОТДЕЛЬНЫМ полем «из них -# булевой веткой снято мест B», и линейка вычитает B из U (оно остаётся в -# «снято калькулятором»); на корпусе 8 сентября 2026 B = 0 на всех 86 записях; -# · «Узлов «тождество…» / «разбор цели…» проиграно заново …» — ДРУГОЙ путь: -# перепиской/разбором_цели СЧИТАЮТ цель, ходов в записи нет. Место снято -# ВЫЧИСЛЕНИЕМ, не игрой — в числитель НЕ идёт. -# Пример: abilities.record — «сведений проиграно заново 0», но «тождество… -# проиграно заново 6»: шесть мест сняты калькулятором, ни одного честной игрой. -# Числитель — s.сведений («реально проиграно заново»: сведения ПЛЮС тотальность) -# ПЛЮС узлы тотальности U ПЛЮС шаги «по примеру»/«по свойству», проверенные по -# существу. Запись, которую чекер ОТВЕРГ (код 1 «НЕ СОШЛОСЬ») либо не смог позвать -# (код 2), в числитель не даёт ничего: проиграно заново записанными ходами — ноль, -# доверия ядру — ноль. -# -# доля-проигрыванием = (Σ «сведений проиграно заново» + Σ узлов U + Σ по существу) -# / Σ «всех обязательств» -# -# ★ ПОЧЕМУ ЗНАМЕНАТЕЛЬ БЫЛ ЗАВЫШЕН ВВЕРХ (правка Ш5, сентябрь 2026). Прежде и -# числитель, и знаменатель снимались с ОДНОЙ строки сводки чекера, а сводку эту -# печатают лишь записи с кодом 0 (ПРОВЕРЕНО) и 3 (НЕ ПРОВЕРЕНО). Записи, которые -# чекер ОТВЕРГ кодом 1 «НЕ СОШЛОСЬ» (в корпусе их 22 из 86), печатают одну строку -# отказа без сводки — регэксп по ним не срабатывал, и `[ -n "$fields" ] || continue` -# ВЫБРАСЫВАЛ такую запись целиком, из ОБЕИХ частей дроби. Их обязательства (по -# шапкам — 129 «утверждений») пропадали из знаменателя, и он выходил 230 вместо -# 359. Вдобавок числитель уже включал тотальность (+1 за блок), а знаменатель -# считал только «утверждений» — популяции расходились. Обе беды — в одном: доля -# завышалась, потому что недоказанное молча выпадало из знаменателя. -# -# ★ ЧЕСТНЫЙ ЗНАМЕНАТЕЛЬ = ВСЕ обязательства корпуса, ни одно не выпадает: -# · запись, за которую чекер ПОРУЧИЛСЯ (код 0 либо 3): полный разбор МЕСТ из -# сводки — проиграно (сведений) ПЛЮС непроиграно (на слово ядра: посылок и -# утверждений + шагов; ПЛЮС снятое калькулятором: тождество/разбор; ПЛЮС -# проверенное по существу: узлы тотальности, «по примеру», «по свойству» — -# эти в числителе, но место есть место, в знаменателе они тоже). Разряды -# покрывают КАЖДОЕ место записи без дыр и без нахлёста (checker.c: каждое -# место идёт ровно одной веткой). Место, посчитанное калькулятором, а не -# проигранное ходами, идёт в знаменатель непроигранным — в этом весь смысл -# линейки; перекладка узлов в числитель знаменателя не двигает; -# · запись, которую чекер ОТВЕРГ (код 1) либо не позвал (код 2): сводки нет, -# разбора мест не добыть. Тогда обязательства берутся из ШАПКИ записи -# («утверждений» ПЛЮС «тотальностей») — шапка есть у каждой записи, и её же -# формат чекер сам сверяет. Всё это идёт в знаменатель непроигранным, а в -# числитель — ноль. Так отвергнутая запись ТЯНЕТ ДОЛЮ ВНИЗ, а не выпадает. -# -# ★ СУЖЕНИЕ ЗНАМЕНАТЕЛЯ НА НЕДОСТИЖИМЫЕ МЕСТА (ADR-0023, Ш3, вариант «средний»). -# Из знаменателя уходит РОВНО ОДНА порода мест — НЕДОСТИЖИМЫЕ. Недостижимо -# место записи, которую чекер ОТВЕРГ ЦЕЛИКОМ (код 1 «НЕ СОШЛОСЬ») и которую -# манифест набора `flang/proof/forgeries/manifest.tsv` объявил классом -# «лжёт-запись». Такое место в числитель не попадает НИКОГДА: сводки у -# отвергнутой записи нет, проиграно заново ноль — и ноль этот от работы не -# зависит. Пока такие места лежали в знаменателе, 100 % было недостижимо в -# принципе, а порог 95 % брался «конвертацией» того, что конвертировать нечем. -# -# ДВА ПРИЗНАКА, А НЕ ОДИН, И ЭТО ГЛАВНАЯ ЗАЩИТА ОТ НАКРУТКИ. Признак первый — -# ИЗМЕРЕННЫЙ: чекер отверг запись здесь и сейчас. Признак второй — ОБЪЯВЛЕННЫЙ: -# строка манифеста под храповиком. Порознь каждый из них — дыра: по одному лишь -# замеру из знаменателя выпадала бы всякая испорченная запись (порча РАСТИЛА бы -# долю — рецепт накрутки, отвергнутый ADR-0023 §8-Д), по одному лишь объявлению -# долю растила бы правка манифеста. Вместе они требуют СРАЗУ и порчи, и явной -# строки в объявленном списке, объяснённой в коммите. -# -# БАЛАНС ВМЕСТО ПРОЦЕНТОВ. Сужение принимается не по красивому числу, а по -# сходящемуся балансу, и он печатается: сузившийся знаменатель ПЛЮС вынесенные -# места обязаны дать прежний. Отдельно сличаются два числа: обязательства ВСЕХ -# отвергнутых записей и обязательства тех из них, что объявлены манифестом. -# Разошлись — значит чекер отверг запись, которой в манифесте нет: печатается -# РАСХОЖДЕНИЕ и линейка падает кодом 1. Молча вынести чужое сужение не может. -# -# ПОРОГ Г4 = 95 % — печатается для чтения; сам гейт держит `provability.fscript`. -# -# МАНИФЕСТ НАБОРА: путь и как читается. Столбцы TSV — исходник, запись, класс; -# первая строка — заголовок столбцов. -NABOR_TSV=$root/flang/proof/forgeries/manifest.tsv -# Класс записи по манифесту: печатает «record-lies», «program-lies» либо пусто. -# Ищется по ИМЕНИ ФАЙЛА записи, а не по приставке в нём: имя тут — ключ строки -# объявленного списка, и решает список, а не то, как файл назван. -klass_nabora() { # имя файла записи - [ -f "$NABOR_TSV" ] || return 0 - awk -F'\t' -v b="$1" ' - NR > 1 && NF >= 3 { - n = split($2, ch, "/") - if (ch[n] == b) { print $3; exit } - }' "$NABOR_TSV" -} -proigrat_dolyu() { # каталог; печатает 27 полей: ЧИСЛ ЗНАМ ЗАПИСЕЙ ПОРУЧ ОТВЕРГ ХОДОВ НЕСУТ НСЛ НСШ СНЯТО ПРИМ СВОЙ ОБЪЯВ ЗНАМ-ОТВЕРГ УЗЛЫ БУЛЕВО НЕДОСТ НАБ-ЗАП НАБ-ЧИСЛ НАБ-ЗНАМ НАБ-ЛЗ НАБ-ЛЗ-ОТВ НАБ-ЛЗ-ПРИН0 ВЫВОДЫ СНЯТ-ЧИСЛ СНЯТ-ЗНАМ СНЯТ-НЕДОСТ - dir=$1 - files=$(find "$dir" -name '*.record' | sort) - [ -n "$files" ] || { echo "в «$dir» нет ни одной записи" >&2; return 2; } - chisl=0; znam=0; zapisey=0; poruch=0; otverg=0; hod_v=0; nesut=0 - nsl_v=0; nsh_v=0; snyato_v=0; prim_v=0; svoy_v=0; obyav=0; znam_otv=0; uzly_v=0; bulevo_v=0; vyvody_v=0 - nedost=0; nab_zap=0; nab_chisl=0; nab_znam=0; nab_lz=0; nab_lz_otv=0; nab_lz_prin0=0 - # ADR-0038 §3.3, задача 6438: снятия предусловий — ВТОРАЯ доля рядом с прежней. - # Знаменатель: блоки снятия записи плюс места вызова у записей прежнего вида - # (без единого блока — сверщик называет их числом «без блока»); числитель — - # блоки, переигранные заново. У отвергнутой записи блоки берутся по тексту. - sn_ch=0; sn_zn=0; sn_nedost=0 - for z in $files; do - zapisey=$((zapisey+1)) - kl=$(klass_nabora "$(basename "$z")") - [ -n "$kl" ] && nab_zap=$((nab_zap+1)) - [ "$kl" = "record-lies" ] && nab_lz=$((nab_lz+1)) - # Обязательства, ОБЪЯВЛЕННЫЕ записью, берутся из ШАПКИ, а не из вывода чекера: - # шапка есть у КАЖДОЙ записи, что бы чекер ни ответил, и её формат чекер сам - # и сверяет. Через шапку ни одна запись не выпадает из знаменателя. - utv_h=$(grep -a -m1 '^утверждений ' "$z" | sed 's/^утверждений //'); utv_h=${utv_h:-0} - tot_h=$(grep -a -m1 '^тотальностей ' "$z" | sed 's/^тотальностей //'); tot_h=${tot_h:-0} - sn_h=$(grep -ac '^снятие «' "$z"); sn_h=${sn_h:-0} - z_ob=$(grep -ac '^ по объявлению ' "$z" 2>/dev/null); obyav=$((obyav+${z_ob:-0})) - decl=$(grep -a -m1 '^исходник ' "$z" | cut -d' ' -f2-) - src=$root/$decl - # Код чекера берётся БЕЗ конвейера (переменная, потом $?), чтобы $? нёс код - # сверщика, а не последней трубы. - if [ -f "$src" ]; then v=$("$checker" "$src" "$z" 2>&1); kod=$? - else v=""; kod=2; fi - if [ "$kod" -ne 0 ] && [ "$kod" -ne 3 ]; then - # НЕ СОШЛОСЬ (код 1) / кривой вызов либо нет исходника (код 2): чекер ни - # одного обязательства не заверил и сводки не печатает. Числитель 0, а - # объявленные шапкой обязательства идут в знаменатель непроигранными. - otverg=$((otverg+1)); znam_otv=$((znam_otv+utv_h+tot_h)) - [ "$kl" = "record-lies" ] && nab_lz_otv=$((nab_lz_otv+1)) - if [ "$kl" = "record-lies" ]; then - # НЕДОСТИЖИМО: чекер отверг запись целиком (замер) И манифест объявил её - # классом «лжёт-запись» (объявление). Обязательства в знаменатель НЕ идут. - nedost=$((nedost+utv_h+tot_h)); sn_nedost=$((sn_nedost+sn_h)) - else - sn_zn=$((sn_zn+sn_h)) - # Отвергнута, но манифестом не объявлена: место остаётся в знаменателе и - # тянет долю вниз, а сличение ниже назовёт РАСХОЖДЕНИЕ. - znam=$((znam+utv_h+tot_h)) - fi - [ -n "$kl" ] && nab_znam=$((nab_znam+utv_h+tot_h)) - continue - fi - [ "$kl" = "record-lies" ] && [ "$kod" -eq 0 ] && nab_lz_prin0=$((nab_lz_prin0+1)) - poruch=$((poruch+1)) - # Поля берутся якорными sed'ами по «НА СЛОВО ЯДРА:», как их берёт izmerit ниже; - # «снято со слова ядра мест» встречается трижды (узлы/тождество/разбор) — все - # три складываются, иначе первое снятие молча пропало бы (правка Ч365). - sved=$(printf '%s\n' "$v" | sed -n 's/.*сведений проиграно заново \([0-9]*\) (ходов проверено [0-9]*)\..*/\1/p'); sved=${sved:-0} - hod=$(printf '%s\n' "$v" | sed -n 's/.*сведений проиграно заново [0-9]* (ходов проверено \([0-9]*\))\..*/\1/p'); hod=${hod:-0} - nsl=$(printf '%s\n' "$v" | sed -n 's/.*НА СЛОВО ЯДРА: посылок и утверждений \([0-9]*\), шагов [0-9]*\..*/\1/p'); nsl=${nsl:-0} - nsh=$(printf '%s\n' "$v" | sed -n 's/.*НА СЛОВО ЯДРА: посылок и утверждений [0-9]*, шагов \([0-9]*\)\..*/\1/p'); nsh=${nsh:-0} - snyato=$(printf '%s\n' "$v" | grep -ao 'снято со слова ядра мест [0-9]*' | sed 's/.* //' | awk '{s+=$1} END{print s+0}') - # СТРУКТУРНЫЙ ПЕРЕИГРЫШ УЗЛОВ ТОТАЛЬНОСТИ — ПЕРВАЯ из трёх строк «снято…» (узлы - # «разбором по случаям», checker.c `проиграть_узел`/`проиграть_узел_algebra`). Это НЕ - # калькулятор (см. шапку выше): вычитается из «снято калькулятором» и идёт в числитель - # отдельной строкой. Из трёх «снято…» берётся ровно эта — по якорю её собственной - # строки сводки, а не по порядку. - uzly=$(printf '%s\n' "$v" | sed -n 's/.*Узлов вердикта «разбором по случаям» проиграно заново [0-9]* (снято со слова ядра мест \([0-9]*\)).*/\1/p'); uzly=${uzly:-0} - # 6127: булева ветка того же узла — вычислитель, не структура: её поле вычитается - # из U и остаётся в «снято калькулятором». - bulevo=$(printf '%s\n' "$v" | sed -n 's/.*из них булевой веткой снято мест \([0-9]*\),.*/\1/p'); bulevo=${bulevo:-0} - uzly=$((uzly-bulevo)); bulevo_v=$((bulevo_v+bulevo)) - snyato=$((snyato-uzly)) - # 6131: ПЕРЕИГРЫШ ЗАПИСАННОГО ВЫВОДА ФАКТА О ТИПЕ — ещё одна строка «снято…», и - # она тоже НЕ калькулятор. Сверщик читает вывод по шагу и каждый шаг сверяет с - # исходником и с прежними шагами; ядру на слово при этом не верится ни разу. - # Берётся по якорю СВОЕЙ строки сводки, как берётся `uzly`, и вычитается из - # общей суммы «снято…», чтобы место не считалось дважды. На записях БЕЗ блока - # вывода число это ноль, и доля от правки не двигается ни на место (замер: - # 517 из 651 до и после). - vyvody=$(printf '%s\n' "$v" | sed -n 's/.*Выводов факта о типе проиграно заново [0-9]* (снято со слова ядра мест \([0-9]*\)).*/\1/p'); vyvody=${vyvody:-0} - snyato=$((snyato-vyvody)) - snt=$(printf '%s\n' "$v" | sed -n 's/.*Снятий предусловий \([0-9]*\): проиграно заново \([0-9]*\), на слове ядра [0-9]*; мест вызова без блока снятия \([0-9]*\)\..*/\1 \2 \3/p') - set -- ${snt:-0 0 0}; sn_ch=$((sn_ch+$2)); sn_zn=$((sn_zn+$1+$3)) - prim=$(printf '%s\n' "$v" | sed -n 's/.*Шагов по примеру проверено по существу \([0-9]*\)\..*/\1/p'); prim=${prim:-0} - svoy=$(printf '%s\n' "$v" | sed -n 's/.*Шагов по свойству проверено по существу \([0-9]*\)\..*/\1/p'); svoy=${svoy:-0} - # `uzly` в знаменателе там же, где был (внутри прежнего `snyato`): знаменатель от - # перекладки не двигается ни на место, растёт только числитель. - notrep=$((nsl+nsh+snyato+prim+svoy+uzly+vyvody)) - if [ -n "$kl" ]; then - # ЧИСЛИТЕЛЬ НАБОРА — честные половины подделочных файлов, проигранные - # заново. Тот же счёт, что у корпуса (ходы/тотальность + по существу + - # узлы), но сложенный только по строкам манифеста: под храповиком стоит - # он, а не число строк, потому что файл можно оставить в списке, а его - # честную половину тихо перестать проигрывать. - nab_chisl=$((nab_chisl+sved+prim+svoy+uzly+vyvody)); nab_znam=$((nab_znam+sved+notrep)) - fi - chisl=$((chisl+sved)); znam=$((znam+sved+notrep)); hod_v=$((hod_v+hod)); uzly_v=$((uzly_v+uzly)) - nsl_v=$((nsl_v+nsl)); nsh_v=$((nsh_v+nsh)); snyato_v=$((snyato_v+snyato)) - prim_v=$((prim_v+prim)); svoy_v=$((svoy_v+svoy)); vyvody_v=$((vyvody_v+vyvody)) - [ "$sved" -gt 0 ] && nesut=$((nesut+1)) - done - printf '%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n' \ - "$chisl" "$znam" "$zapisey" "$poruch" "$otverg" "$hod_v" "$nesut" \ - "$nsl_v" "$nsh_v" "$snyato_v" "$prim_v" "$svoy_v" "$obyav" "$znam_otv" "$uzly_v" "$bulevo_v" \ - "$nedost" "$nab_zap" "$nab_chisl" "$nab_znam" "$nab_lz" "$nab_lz_otv" "$nab_lz_prin0" "$vyvody_v" \ - "$sn_ch" "$sn_zn" "$sn_nedost" -} - -if [ "$proigr" -eq 1 ]; then - korpus_pr=${nabor:+$root/flang/proof/checker/tests/records/$nabor} - [ -n "$korpus_pr" ] || korpus_pr=$root/flang/proof/checker/tests/records/corpus - - # ── ПРОБА (--самопроверка): подделка обязана уронить И ЧИСЛИТЕЛЬ, И ДОЛЮ ────── - # Берём первую запись корпуса, несущую проигранные ходы, снимаем у копии строки - # ходов — и требуем, чтобы упал числитель, а с ним и доля. Не упало — прибор - # держал бы долю на снятых ходах, то есть мерил бы вердикт, а не игру. Это КОД 1. - # Знаменатель при снятии ходов не должен схлопнуться: снятые сведения переходят - # из проигранного в непроигранное (на слово ядра либо шапку отвергнутой записи), - # то есть остаются в знаменателе — доля падает за счёт числителя, а не подгонкой - # знаменателя. Ровно это и стерегла бы прежняя дыра: если отвергнутая запись - # выпадает из знаменателя, снятие ходов уронило бы и его, и доля не дрогнула бы. - if [ "$selftest" -eq 1 ]; then - # Носитель пробы — запись, чей числитель РЕАЛЬНО держится на ходах: снятие - # строк ходов у копии обязано его уронить. Одного `сведений > 0` мало — - # тотальность тоже растит `сведений` (+1 за блок), а ходов в ней нет, снимать - # у неё нечего. Поэтому носитель выбирается прогоном: берётся первая запись, - # у которой снятие ходов действительно роняет `сведений`. - nositel="" - for z in $(find "$korpus_pr" -name '*.record' | sort); do - decl=$(grep -a -m1 '^исходник ' "$z" | cut -d' ' -f2-) - [ -f "$root/$decl" ] || continue - sv=$("$checker" "$root/$decl" "$z" 2>&1 | sed -n 's/.*сведений проиграно заново \([0-9]*\) (ходов.*/\1/p'); sv=${sv:-0} - [ "$sv" -gt 0 ] || continue - mut=$tmp/носитель-проба.record; grep -av '^ ход ' "$z" > "$mut" - sv2=$("$checker" "$root/$decl" "$mut" 2>&1 | sed -n 's/.*сведений проиграно заново \([0-9]*\) (ходов.*/\1/p'); sv2=${sv2:-0} - [ "$sv2" -lt "$sv" ] && { nositel=$z; break; } - done - [ -n "$nositel" ] || { echo "проба не построена: в корпусе нет записи, чей числитель держится на ходах" >&2; exit 2; } - d1=$tmp/честно; d2=$tmp/подделка; mkdir -p "$d1" "$d2" - cp "$nositel" "$d1/carrier.record" - grep -av '^ ход ' "$nositel" > "$d2/carrier.record" - # Числитель пробы — ТОТ ЖЕ, что у линейки ниже: ходы/тотальность ПЛЮС узлы - # (15-е поле). Иначе проба мерила бы не ту дробь, что печатается. - set -- $(proigrat_dolyu "$d1"); ch1=$(($1+${15})); zn1=$2 - set -- $(proigrat_dolyu "$d2"); ch2=$(($1+${15})); zn2=$2 - do1=$(awk -v a="$ch1" -v b="$zn1" 'BEGIN{ printf "%.2f", (b>0)?100*a/b:0 }') - do2=$(awk -v a="$ch2" -v b="$zn2" 'BEGIN{ printf "%.2f", (b>0)?100*a/b:0 }') - padenie=$(awk -v x="$do2" -v y="$do1" 'BEGIN{ print (x&2 - exit 1 - fi - - # ── ЗАМЕР ПО КОРПУСУ ─────────────────────────────────────────────────────── - # Код функции берётся БЕЗ конвейера (переменная, потом $?), чтобы отказ - # (пустой каталог) ронял прибор, а не проходил пустой строкой. - itog_pr=$(proigrat_dolyu "$korpus_pr"); kod_pr=$? - [ "$kod_pr" -eq 0 ] && [ -n "$itog_pr" ] || exit 2 - set -- $itog_pr - CHISL=$1; ZNAM=$2; ZAPISEY=$3; PORUCH=$4; OTVERG=$5; HODOV=$6; NESUT=$7 - NSL=$8; NSH=$9; shift 9; SNYATO=$1; PRIM=$2; SVOY=$3; OBYAV=$4; ZNAM_OTV=$5; UZLY=$6; BULEVO=$7 - NEDOST=$8; NAB_ZAP=$9; shift 9; NAB_CHISL=$1; NAB_ZNAM=$2; NAB_LZ=$3; NAB_LZ_OTV=$4; NAB_LZ_PRIN0=$5 - VYVODY=$6; SN_CH=$7; SN_ZN=$8; SN_NEDOST=$9 - POROG_G4=95 - # ЧИСЛИТЕЛЬ = независимо проверенное чекером: проиграно ходами/тотальностью (CHISL) - # ПЛЮС проверено ПО СУЩЕСТВУ вычислением — шаги «по примеру»/«по свойству» (SUSCH). - # И то, и другое — проверка чекером, не «на слово ядра»: балансовое уравнение выше - # ставит «по существу» среди проверенного, а прежде числитель его терял. Сторож - # честности checker.c:2410: неверная оценка ТОЛЬКО мешает пройти, соврать «сошлось» - # ею нельзя — потому кредит по существу соунден. Печать даёт разбивку числителя. - SUSCH=$((PRIM+SVOY)) - # ПЛЮС структурный переигрыш узлов тотальности (UZLY): сверщик прочёл ТЕЛО ФУНКЦИИ и - # сам сверил дно со спуском (шапка выше, «структурный переигрыш»). Вычислитель не - # зовётся, ядру на слово не верится — третья строка числителя, отдельно от ходов. - # ПЛЮС переигранные выводы факта о типе (VYVODY, задача 6131): сверщик прочёл вывод - # по шагу и каждый шаг сверил с исходником и с прежними шагами — пятая строка - # числителя, отдельно от узлов. - CHISL_V=$((CHISL+SUSCH+UZLY+VYVODY)) - dolya=$(awk -v a="$CHISL_V" -v b="$ZNAM" 'BEGIN{ if (b>0) printf "%.2f", 100*a/b; else printf "—" }') - dobral=$(awk -v a="$CHISL_V" -v b="$ZNAM" -v p="$POROG_G4" 'BEGIN{ print (b>0 && 100*a/b >= p) ? "ДА" : "НЕТ" }') - neprov=$((NSL+NSH+SNYATO)) - ZNAM_POLNY=$((ZNAM+NEDOST)) - # Строк данных в манифесте — сколько подделок объявлено. Заголовок не в счёт. - NAB_VSEGO=0 - [ -f "$NABOR_TSV" ] && NAB_VSEGO=$(awk -F'\t' 'NR > 1 && NF >= 3 {n++} END{print n+0}' "$NABOR_TSV") - # Храповик печатается рядом с числом, чтобы просадку было видно там же, где - # число, а не только в вердикте. - HRAP_P="—"; HRAP_CH="—" - HRAP_F=$root/flang/proof/ratchets.txt - if [ -f "$HRAP_F" ]; then - HRAP_P=$(awk '$1 == "forgeries" {print $2; exit}' "$HRAP_F"); HRAP_P=${HRAP_P:-—} - HRAP_CH=$(awk '$1 == "forgery-numerator" {print $2; exit}' "$HRAP_F"); HRAP_CH=${HRAP_CH:-—} - fi - # Провенанс печатается ПЕРЕД числами: доля, снятая на правленом дереве или - # отставшим двоичным, — другое число, и по одному проценту этого не видно. - provenance=$("$root/bootstrap/flang" io "$root/scripts/report-provenance.fscript" --plan Report 2>/dev/null \ - | sed -n 's/^{"plan":"Report","result":"\(.*\)","orders":[0-9]*,"log":.*$/\1/p') - if [ -n "$provenance" ]; then - printf '%b\n\n' "$provenance" - else - printf '%s\n%s\n\n' "── чем и на чём снято ──" "шапка не снята: план scripts/report-provenance.fscript исполнить нечем — нет bootstrap/flang" - fi - echo "═══ ДОЛЯ-ПРОИГРЫВАНИЕМ по корпусу ═══" - echo "каталог записей $korpus_pr" - echo "записей в наборе $ZAPISEY (чекер поручился $PORUCH, отверг либо не позвал $OTVERG)" - echo - echo "ЧИСЛИТЕЛЬ — Σ независимо проверенного чекером (ходами/тотальностью + по существу + узлы): $CHISL_V" - echo " ├ проиграно ходами/тотальностью: $CHISL" - echo " ├ проверено по существу вычислением («по примеру»/«по свойству»): $SUSCH" - echo " ├ структурный переигрыш узлов тотальности (дно/спуск по телу функции): $UZLY" - echo " └ переигранные выводы факта о типе (по шагу на правило): $VYVODY" - echo "ЗНАМЕНАТЕЛЬ — Σ обязательств корпуса за вычетом недостижимых: $ZNAM" - echo "доля-проигрыванием = $CHISL_V / $ZNAM = ${dolya} %" - # ADR-0038 §3.3: вторая доля — с предусловиями — стоит РЯДОМ, пока две не - # сойдутся; порог Г4 держит прежнюю до пересъёмки записей печатью ядра. - dolya_sn=$(awk -v a="$((CHISL_V+SN_CH))" -v b="$((ZNAM+SN_ZN))" 'BEGIN{ if (b>0) printf "%.2f", 100*a/b; else printf "—" }') - echo "доля с предусловиями = $((CHISL_V+SN_CH)) / $((ZNAM+SN_ZN)) = ${dolya_sn} % (снятий в знаменателе $SN_ZN, переиграно $SN_CH, вынесено недостижимых $SN_NEDOST)" - echo - echo "-- из чего сложен знаменатель --" - echo "проверено чекером (в числителе) $CHISL_V" - echo "не проверено у поручённых записей (на слово + калькулятор) $neprov" - echo "обязательства отвергнутых записей (по шапкам) $ZNAM_OTV" - echo " из них ВЫНЕСЕНО из знаменателя как недостижимые $NEDOST" - echo " из них осталось в знаменателе $((ZNAM_OTV-NEDOST))" - echo - echo "-- вынесенные из знаменателя места: сколько и почему --" - echo "исключено мест $NEDOST" - echo "почему: чекер отверг эти записи ЦЕЛИКОМ (код 1 «НЕ СОШЛОСЬ») и манифест" - echo " $NABOR_TSV объявил их классом «лжёт-запись»." - echo " Сводки у отвергнутой записи нет, проиграно заново ноль — и ноль" - echo " этот от работы не зависит: место недостижимо, а не открыто." - echo "записей вынесено $NAB_LZ_OTV из $NAB_LZ объявленных классом «лжёт-запись»" - echo - echo "-- баланс знаменателя (принимается по нему, а не по процентам) --" - echo "знаменатель после сужения $ZNAM" - echo "вынесено недостижимых мест $NEDOST" - echo "прежний знаменатель (все обязательства корпуса) $ZNAM_POLNY" - bal="СОШЁЛСЯ"; beda_bal=0 - [ "$((ZNAM+NEDOST))" -eq "$ZNAM_POLNY" ] || { bal="РАСХОЖДЕНИЕ"; beda_bal=1; } - echo "сходится: $ZNAM + $NEDOST = $ZNAM_POLNY — $bal" - if [ "$ZNAM_OTV" -ne "$NEDOST" ]; then - echo "РАСХОЖДЕНИЕ: у отвергнутых записей обязательств $ZNAM_OTV, а объявлено" - echo " манифестом недостижимыми $NEDOST. Чекер отверг запись, которой в наборе" - echo " нет: либо её надо завести строкой манифеста, либо чинить саму запись." - beda_bal=1 - fi - echo - echo "-- набор подделок (ADR-0023): доля без него не печатается --" - echo "поймано $NAB_ZAP из $NAB_VSEGO (манифест $NABOR_TSV, храповик $HRAP_P)" - echo " класс «лжёт-запись»: отвергнуто $NAB_LZ_OTV из $NAB_LZ, принято кодом 0 — $NAB_LZ_PRIN0" - echo " честные половины подделочных файлов: числитель набора $NAB_CHISL (храповик $HRAP_CH)" - echo " обязательств у набора всего $NAB_ZNAM" - echo - echo "-- не проверенное у поручённых записей, поимённо --" - echo "на слово ядра: посылок и утверждений $NSL" - echo "на слово ядра: шагов $NSH" - echo "снято калькулятором (тождество/разбор), не игрой $SNYATO" - echo " из них булевой веткой узла «разбором по случаям» $BULEVO" - echo - echo "-- прочая поддержка --" - echo "ходов проверено, всего $HODOV" - echo "записей несут хоть один проигранный ход $NESUT" - echo "строк «по объявлению» в записях (композиция) $OBYAV" - echo - echo "порог Г4 = ${POROG_G4} %; добрала ли доля порога: $dobral" - [ "$beda_bal" -eq 0 ] || exit 1 - exit 0 -fi - -# ── ВЕДОМОСТЬ ДЕРЕВА: отпечатки из КОММИТА, ни одной прочитанной записи ────── -# Строка ведомости: sha256 путь от корня дерева. Берётся содержимое -# коммита (`git archive`), а не файлы рабочего дерева: файл на диске -# подделыватель правит, содержимое коммита — нет. -# -# Через `git archive | tar`, а не `git ls-tree` + `git cat-file` на файл: -# замер на этом дереве — 0,28 с против 3,6 с, и `ls-tree --name-only` вдобавок -# ЭКРАНИРУЕТ кириллические пути кавычками, отчего отбор по `*.record` терял их -# молча (745 файлов вместо 1256). -ved=$tmp/ведомость.tsv -sdelat_vedomost() { - if [ -n "$vedfile" ]; then - [ -f "$vedfile" ] || { echo "ведомости нет: $vedfile" >&2; return 2; } - ved=$vedfile; return 0 - fi - git -C "$root" rev-parse --verify -q "$kommit^{commit}" >/dev/null 2>&1 || { - echo "ведомость не построена: «$kommit» не коммит дерева «$root»." >&2 - echo "готовую ведомость можно подать ключом --ведомость ФАЙЛ" >&2 - return 2; } - d=$tmp/дерево; mkdir -p "$d" || return 2 - git -C "$root" archive "$kommit" -- '*.flang' '*.record' 2>/dev/null | tar -x -C "$d" || { - echo "ведомость не построена: git archive «$kommit» не отдал дерево" >&2; return 2; } - ( cd "$d" && find . -type f -print0 | LC_ALL=C sort -z | xargs -0 sha256sum ) \ - | sed 's| \./|\t|' > "$ved" || return 2 - # sha256sum помечает косой чертой имена с `\` и переводом строки и экранирует - # их. Снять пометку значило бы записать в ведомость НЕ ТОТ путь и молча; такое - # дерево линейка не судит вовсе. - if /usr/bin/grep -aq '^\\' "$ved"; then - echo "ведомость не построена: в коммите есть имя с косой чертой или переводом строки" >&2 - return 2; fi - [ -s "$ved" ] || { echo "ведомость пуста: в коммите «$kommit» нет ни одного *.flang" >&2; return 2; } - return 0 -} - -# Отпечаток пути ПО ВЕДОМОСТИ. Пусто — значит дела в дереве нет. -v_sha() { awk -F'\t' -v p="$1" '$2==p{print $1; exit}' "$ved"; } - -sdelat_vedomost || exit 2 -[ -n "$vedout" ] && cp "$ved" "$vedout" -vedstrok=$(wc -l < "$ved" | tr -d ' ') -vedimya=${vedfile:-"коммит $(git -C "$root" rev-parse --short "$kommit" 2>/dev/null || echo "$kommit")"} - -# ── столбец вердикта: РОВНО ОДНА строка, чего бы чекер ни напечатал ───────── -# ЗАЧЕМ ЭТО ОТДЕЛЬНОЙ РУЧКОЙ. Вердикт чекера НЕ ВСЕГДА одна строка: при непустом -# «НЕ ВЗЯЛСЯ» (checker.c, main) впереди идёт своя строка, и таких приёмов у -# чекера будет только больше. Прежде столбец брался как `cut -c1-64` прямо с -# многострочного вывода — и перевод строки уезжал ВНУТРЬ поля TSV. Одна запись -# рассыпалась на две, `записей в наборе` тихо росло (86 → 92 на замере Ч363, -# 86 → 87 на одном мутанте), знаменатель «по ЗАПИСЯМ» врал, и НИ ОДНА проба на -# это не краснела: прибор считал не то и молчал. -# Здесь вывод СНАЧАЛА сплющивается в одну строку и лишь потом режется по длине; -# режется он `substr`, а не `cut -c`, потому что `cut -c` считает БАЙТЫ и рвёт -# кириллицу посреди знака (`cut -c1-3` от «абвгд» даёт полтора знака). -odna_stroka() { - awk '{ s = (NR == 1 ? $0 : s " " $0) } - END { gsub(/\t/, " ", s); printf "%s", substr(s, 1, 64) }' -} - -# ── СУММА ЧИСЕЛ ПО МЕТКЕ: ОДИН КОНВЕЙЕР НА ВСЕ МЕСТА ──────────────────────── -# Приёмов, снимающих места со слова ядра, у чекера уже три, и меток, по которым -# линейка складывает его числа, две. Прежде конвейер был написан ТРИЖДЫ: дважды -# в замере и в третий раз внутри пробы П7 — своим текстом, по выдуманной -# строке. Правка настоящего конвейера пробу не красила: она сторожила копию. -# Теперь текст один, и П7 зовёт именно его — на настоящем выводе чекера. -# Число берётся последним словом найденного куска: метка кончается числом, и -# `sed 's/.* //'` режет по последнему пробелу, не зная про её слова ничего. -summa_po_metke() { # метка; текст — на входе - /usr/bin/grep -ao "$1 [0-9]*" | sed 's/.* //' | awk '{ s += $1 } END { print s + 0 }' -} - -# ── породы мест «на слово ядра»: счёт по тексту записи ─────────────────────── -# Второй прибор на те же числа. Зеркалит checker.c, но читает запись сам. -porody() { - awk ' - function trim(s){ sub(/^[ \t]+/,"",s); sub(/[ \t]+$/,"",s); return s } - function yol(s,n, a,b){ n=n+1; split(s,a,"«"); split(a[n],b,"»"); return b[1] } - function w(s,n, a){ split(trim(s),a," "); return a[n] } - function tail(s,n, a,i,r){ split(trim(s),a," "); r="" - for(i=n+1;i<=length(a);i++) r=(r==""?a[i]:r" "a[i]); return r } - BEGIN{ p1=0; p2=0; p3=0; p4=0; pv=0; inb=0 } - { - l=trim($0) - if (l ~ /^утверждение «/) { inb=1; verd=""; notheorem=0; rule=0; hody=0; debt=0 - prav=0; sled=0; obyav=0; posy=0; uh=0; next } - if (!inb) next - if (l == "конец утверждения") { - if (rule && !hody) debt++ - p2 += debt - # ХОДЫ ПОД ПОСТУСЛОВИЕМ (8 сентября 2026). Блок «ход цель … ход конец», - # стоящий под самим утверждением (до первой посылки), — это ходы, - # которые сверщик ПРОИГРЫВАЕТ («ходов проверено N» в вердикте), и - # место после них на слове ядра не стоит: чекер его не считает ни в - # «на слово», ни в «снято». Текст записи при этом говорит - # «доказано» + «теоремы нет», и старое зеркало клало такое место в - # П1 — на 9 записях корпуса (binder-wall-map, boundaries, corpus-hof, - # forms, poddelka-dlina, poddelka-slovo-o-dokazannosti, - # poddelka-snyatie-storozha, substantive, types) левая сторона - # тождества была больше правой ровно на число таких блоков. Ходы под - # ПОСЫЛКОЙ зеркало вычитало и раньше (`rule && !hody`); здесь — то же - # для постусловия. Считается отдельной породой `hd`, чтобы число не - # пропадало из разбора: место проиграно, а не снято приёмом. - if (notheorem && verd == "доказано") { if (uh) hd++; else p1++ } - # ПРИМЕТА СНЯТОГО ВЕРДИКТА (задача 7102). Разряд Р0 решают два счётчика - # чекера, а оба они растут ТОЛЬКО у утверждения с вердиктом «доказано» - # (checker.c, bez_teoremy: `else if (dokazano) s->na_slovo++`). Значит - # запись переводится из Р2 в Р0 не доводом, а вычёркиванием слова - # «доказано» — и оба прибора линейки падают синхронно, потому что - # текстовый счёт пород читает то же слово. Ловится это не счётом, а - # СТРОЕНИЕМ блока: следы разбора — «правило «…»», «по объявлению …», - # «следовательно доказано …» — печать ядра кладёт только там, где - # вердикт «доказано». Замер 6 сентября 2026: на 251 записи дерева - # (1029 утверждений) таких мест НОЛЬ, значит примета чиста и краснеет - # только на подделке. Полного закрытия она не даёт: подделыватель - # снимет и эти строки — тогда остаётся один свидетель, печать ядра - # (`records-nesting.fscript`), и её цену надо называть отдельно. - if (verd != "доказано" && (prav || obyav || sled)) pv++ - inb=0; next - } - if (l ~ /^вердикт /) verd = w(l,2) - if (l == "теоремы нет") notheorem = 1 - if (l ~ /^посылка /) { - posy = 1 - if (rule && !hody) debt++ - rule = (yol(l,3) != "") ? 1 : 0 - hody = 0 - } - if (l == "ход конец") { hody = 1; if (!posy) uh = 1 } - # П4: значение «по объявлению да|нет» — вывод изъятия, которое сверщик - # не переигрывает (checker.c: sverit_obyavlenie, врезка про Ч27). Зеркалит - # `if (*po) s->na_slovo++` буквально: одна строка — одно место, парой с - # «правило» или нет — сверщик считает его на слово в обоих случаях, и - # текстовый счёт обязан считать так же, иначе сойдётся не всегда. - if (l ~ /^по объявлению /) { p4++; obyav=1 } - # Следы разбора, которые печать кладёт только под вердикт «доказано»: - # они и держат примету снятого вердикта выше. - if (l ~ /^правило «/) prav = 1 - if (l ~ /^следовательно доказано/) sled = 1 - if (l ~ /^шаг /) { - # ШАГИ СЧИТАЮТСЯ ВСЕ, А НЕ ТРИ ЗНАКОМЫХ ИМЕНИ (7104/7102). До 6 сентября - # 2026 у чекера была цепочка `по примеру` → `по свойству` → `по закону`, - # и шаг с ЛЮБЫМ четвёртым обоснованием (в корпусе это «по предположению», - # 25 мест) не попадал ни в одну ветвь: ни проверен, ни положен в долг. - # Через эту дыру шёл рабочий рецепт накрутки Г4 — пять дописанных строк - # переводили запись из Р2 в Р0, не проиграв ничего. Работник 7104 закрыл - # её ветвью `else`, которая ловит любое обоснование, и счёт чекера - # «на слово ядра — шагов» перестал зависеть от списка имён. Текстовое - # зеркало обязано было поехать следом, иначе тождество двух приборов - # рушится на честной записи: у `precondition` поле чекера «шагов» 3, а - # старая П3 давала 0. Поэтому шаги считаются ВСЕ (`vsh`), а три знакомых - # имени остаются подсчётом внутри — для разбивки, а не для тождества. - vsh++ - o = tail(l,5) - if (o ~ /^по примеру/) { p3++; pr++ } - if (o ~ /^по свойству/) { p3++; sv++ } - if (o ~ /^по закону/) { p3++; zk++ } - } - } - END{ printf "%d %d %d %d %d %d %d %d %d %d\n", p1, p2, p3, pr+0, sv+0, zk+0, p4, pv, vsh+0, hd+0 } - ' "$1" -} - -# ── КТО ВПРАВЕ ЛЕЖАТЬ В ЧИСЛИТЕЛЕ ПУСТЫМ (задача 7102) ────────────────────── -# Чекер даёт код 0 и записи, в которой доказанным не числится НИЧЕГО, и говорит -# об этом открытым текстом: «ПРОВЕРЕНО ВПУСТУЮ — запись сошлась с исходником, -# но доказанным в ней не числится ничего» (checker.c:4580). Линейка до 6 -# сентября 2026 читала только код возврата и клала такую запись в числитель Г4 -# наравне с доказанной. Замер: из 49 записей Р0 таких 16, то есть треть -# числителя; в наборе «примеры» — 3 из 26. Чекер здесь ЧЕСТЕН, слепа была -# линейка — ровно наша порода: сторожат то, что умеют посчитать. -# -# Пустой числитель — не всегда беда. Пятнадцать из шестнадцати это записи -# ПОДДЕЛОЧНЫХ программ (`poddelka-*`, `forgery-*`): там ядро не доказывает -# ничего по делу, и «впустую» — правда. Поэтому правило не «пустых быть не -# должно», а «пустой в числителе вправе быть только названный поимённо». -# Список закрыт по тому же доводу, что и оговорки приговора ядра: открытый -# список — это способ увести любую запись из-под счёта одной строкой. -# Охрана двусторонняя: запись из списка, у которой доказанное появилось, тоже -# роняет прогон — значит список протух и его надо перечитать, а не подпереть. -PUSTO_V_CHISLITELE_ZAKONNO="corpus-brackets.record -forgery-binder-hides-the-condition.record -forgery-if-without-descent.record -krug-tuda-i-obratno.record -poddelka-element-po-nomeru.record -poddelka-istinnaya-vetv.record -poddelka-krug-pri-rabote.record -poddelka-lozhnaya-polovina.record -poddelka-mera-dliny-stroki.record -poddelka-porjadok-sosednih.record -poddelka-ravenstvo-v-tele-ne-dokazyvaet.record -poddelka-razdvoenie-diz.record -poddelka-refleksivnost.record -poddelka-slova-celey.record -poddelka-sortirovka-ne-ubyvaet.record -poddelka-vhozhdenie.record" - -# ── один набор: померить и напечатать ─────────────────────────────────────── -izmerit() { - name=$1; dir=$2; srcdir=$3 # srcdir: «из-записи» либо каталог исходников - # Четвёртый довод: действует ли поимённый список пустых. Он назван для двух - # наборов дерева и только для них — на чужом каталоге имена другие, и список - # там судил бы не то. Тогда число печатается, а прогон не роняется, и это - # сказано вслух: молчаливый пропуск читался бы как «пустых нет». - spisok=${4:-0} - files=$(find "$dir" -name '*.record' | sort) - [ -n "$files" ] || { echo "в «$dir» нет ни одной записи" >&2; return 2; } - - tab=$tmp/tab.tsv; : > "$tab" - razoshlos=0; primet=0; primet_gde=""; razbor_rashozhdeniy="" - - # Строка отказа: ровно 19 полей, как в оглавлении разбора (было 17 до П4, - # 18 до П5). Прежняя строка Р4 писала четырнадцать — «Р4» уезжал в столбец - # «по-свойству», а столбец разряда оставался ПУСТЫМ, и awk считал такие - # записи ни одним разрядом. В наборе «корпус» их не было ни одной, и промах - # ничем не краснел. - otkaz() { # разряд, вердикт - printf '%s\t%s\t126\t126\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\tнет\t%s\t0\t%s\t0\n' \ - "$nm" "$decl" "$1" "$2" >> "$tab" - } - - for z in $files; do - nm=$(basename "$z") - decl=$(grep -a -m1 '^исходник ' "$z" | cut -d' ' -f2-) - if [ "$srcdir" = "из-записи" ]; then src=$root/$decl - else src=$srcdir/$(basename "$decl"); fi - - # ── ДЕЛО НАЗЫВАЕТ ДЕРЕВО, А НЕ ЗАПИСЬ (4820) ──────────────────────────── - # Путь, названный записью, работает дальше только как КЛЮЧ поиска в - # ведомости. Нет ключа в ведомости — нет и дела: подсудимый не заводит себе - # дело сам. - rel=${src#"$root"/} - otp=$(v_sha "$rel") - if [ -z "$otp" ]; then - otkaz Р5 "не берусь: исходника «$rel» нет в ведомости коммита" - continue - fi - if [ ! -f "$src" ]; then - otkaz Р4 "исходника нет: $src" - continue - fi - # Файл дерева обязан быть тем же, что в коммите. Иначе судили бы правку - # подделывателя, а заверяли отпечатком коммита. - if [ "$(sha256sum "$src" | cut -d' ' -f1)" != "$otp" ]; then - otkaz Р5 "не берусь: файл «$rel» разошёлся с коммитом" - continue - fi - # Запись, лежащая ВНУТРИ дерева, обязана быть из дерева тоже: иначе - # подделыватель кладёт свою запись рядом с честными и она идёт в счёт. - # Записи из набора «примеры» печатаются во временный каталог вне дерева — - # там этой проверки нет, и это сказано вслух в вердикте набора. - case $z in - "$root"/*) - zrel=${z#"$root"/} - zved=$(v_sha "$zrel") - if [ -z "$zved" ] || [ "$zved" != "$(sha256sum "$z" | cut -d' ' -f1)" ]; then - otkaz Р5 "не берусь: записи «$zrel» нет в ведомости коммита либо она правлена" - continue - fi ;; - esac - - v=$("$checker" "$src" "$z" 2>&1); kod=$? - vd=$("$checker" "$src" "$z" "$otp" 2>&1); kodd=$? - - # Поля вердикта берутся числом из строки, которую чекер печатает сам. - fields=$(printf '%s\n' "$v" | sed -n 's/.*утверждений \([0-9]*\), шагов сверено с исходником \([0-9]*\), сведений проиграно заново \([0-9]*\) (ходов проверено \([0-9]*\))\. Числятся доказанными \([0-9]*\)\. НА СЛОВО ЯДРА: посылок и утверждений \([0-9]*\), шагов \([0-9]*\)\..*/\1 \2 \3 \4 \5 \6 \7/p') - if [ -z "$fields" ]; then utv=0; sver=0; sved=0; hod=0; dok=0; nsl=0; nsh=0 - else set -- $fields; utv=$1; sver=$2; sved=$3; hod=$4; dok=$5; nsl=$6; nsh=$7; fi - - # Ч363: чекер научился ПРОИГРЫВАТЬ узел вердикта «разбором по случаям» и - # называет числом, сколько мест он этим снял со слова ядра. Текстовый счёт - # пород от этого не меняется — меняется тождество, которым два прибора - # сличаются: П1+П2 минус снятое обязано сойтись с полем чекера. - # Ч365: приёмов, снимающих места, стало ДВА, и слагаемые СУММИРУЮТСЯ. Прежний - # `sed -n 's/.*снято … \([0-9]*\)).*/\1/p'` брал бы ПОСЛЕДНЕЕ вхождение — - # жадная точка съедала бы первое, и снятое первым приёмом молча пропадало бы - # из тождества двух приборов. Слагаемые берутся все и складываются; на это - # заведена проба П7. - # 9616-Б, ВТОРАЯ РЕДАКЦИЯ: П4 (строка «по объявлению») В ТОЖДЕСТВО НЕ - # ВХОДИТ, и первая редакция здесь ошиблась. По объявлению — маршрут БЕЗ - # теоремы, значит место уже подписано текстовым «доказано»+«теоремы нет» - # и лежит ВНУТРИ П1; своего слагаемого у него нет. Сверщик считает его - # ТЕМ ЖЕ +1, каким считал бы любое непроигранное bez_teoremy место - # (sverit_obyavlenie не копит счёт вовсе — она только читает строение; - # `else if (dokazano) s->na_slovo++` в bez_teoremy один на всех, «по - # объявлению» лишь называет причину, когда она есть). Первая редакция - # прибавляла П4 ПОВЕРХ П1 и платила дважды: на 11 записях корпуса (30 - # мест) это дало код 0→3 там, где `перепиской`/`разбором_цели` уже - # проиграли ту же цель другим приёмом — второй счёт за оплаченный долг. - # П4 остаётся в разборе ЧИСЛОМ (сколько строк, для видимости), но в - # тождество и в карту работ не входит: сложить его с П1 значило бы снова - # посчитать те же места. - snyato=$(printf '%s\n' "$v" | summa_po_metke 'снято со слова ядра мест') - [ -n "$snyato" ] || snyato=0 - # 8802: ТО ЖЕ САМОЕ ДЛЯ П3, и без этого линейка себе не верит. С привязкой - # `пример строка N` в строке шага (её печатает ядро, zapis.flang) сверщик - # проверяет шаг ПО СУЩЕСТВУ и со слова ядра его снимает — ровно так же, как - # Ч363/Ч365/Ч369 снимают места П1. Текстовый счёт пород этого не видит: - # порода у шага та же, а вот на слове ядра он больше не стоит. Пока записи - # корпуса печатались двоичным без привязки, обе стороны сходились сами - # собой; после перепечатки 18 записей из 86 разошлись, и разошлись ВЕРНО. - primerom=$(printf '%s\n' "$v" | summa_po_metke 'Шагов по примеру проверено по существу') - [ -n "$primerom" ] || primerom=0 - # 7102: то же для шагов «по свойству». Прежде это слагаемое не бралось вовсе - # и тождество держалось лишь потому, что в корпусе таких снятий было ноль: - # все четыре шага «по свойству» стояли на слове. Прибор, который сходится - # только пока слагаемое равно нулю, сходится случайно. - svoystvom=$(printf '%s\n' "$v" | summa_po_metke 'Шагов по свойству проверено по существу') - [ -n "$svoystvom" ] || svoystvom=0 - # 11 сентября 2026: чекер научился проигрывать ПО ТЕЛУ ФУНКЦИИ то, чего в - # записи нет ходами, — шаг «по предположению» у прямой теоремы (ячейка 5) и - # место без теоремы (замеры запаса №7/№8: `начало_от_вызванной`, - # `начало_по_телу`). Текст записи этого не видит: у шага порода та же, у - # места стоит «доказано» + «теоремы нет» без единого хода. Пока зеркало - # слагаемого не знало, линейка расходилась с чекером на трёх честных - # записях (four-words 5≠4, precondition 3≠2, - # nachalo-po-postroeniyu-chestnaya 3≠1). Обе метки чекера кончаются одними - # словами, и конвейер берёт их разом. - po_telu=$(printf '%s\n' "$v" | summa_po_metke 'проверено по телу функции') - [ -n "$po_telu" ] || po_telu=0 - set -- $(porody "$z"); p1=$1; p2=$2; p3=$3; pr=$4; sv=$5; zk=$6; p4=$7; pv=$8; vsh=$9; hd=${10} - # П5 — шаг, у которого нет ПУТИ в «проверено по существу»: сверщик его - # обоснование не проигрывает вовсе и кладёт в долг безусловно. Отдельная - # порода именно поэтому: у П3 вычитается снятое («по примеру», «по - # свойству»), а у П5 вычитать нечего и никогда не будет. - p5=$((vsh-p3)) - if [ "$pv" -gt 0 ]; then - primet=$((primet+pv)) - primet_gde="$primet_gde - $nm: мест $pv — утверждение без вердикта «доказано» несёт след разбора" - fi - soshlos=да - # ── ТОЖДЕСТВО ДВУХ ПРИБОРОВ: ОДНО, А НЕ ДВА (7102) ────────────────────── - # Раздельные тождества («П1+П2 минус снятое = посылки и утверждения», - # «П3 минус по-примеру = шаги») держались, пока снятое узлом было только - # посылочным. Правка 7104 это сломала по существу, а не по недосмотру: - # проигранный узел вердикта снимает со слова и ШАГИ своей теоремы - # (`checker.c`: `s->shagov_na_slovo -= моих_не_проигрываемых; - # s->узлов_мест += моих_не_проигрываемых`), а печатает их тем же одним - # числом «снято со слова ядра мест». Разложить это число обратно на - # посылочное и шаговое нечем — значит и сличать надо ОБЩЕЙ суммой мест: - # - # П1 + П2 + все шаги = на слово (посылок и утв.) + на слово (шагов) - # + снято + по примеру + по свойству - # + проверено по телу функции - # - # Слева — все места, какие видит текст записи; справа — куда чекер их - # разложил: часть в долг, часть снял приёмом, часть проверил по существу. - # Замер на своде 6 сентября 2026: сходится на всех 86 записях, тогда как - # два прежних тождества расходились на 16. - if [ "$kod" -eq 0 ] || [ "$kod" -eq 3 ]; then - # Места, проигранные ходами под постусловием (hd), стоят ВНЕ тождества с - # обеих сторон: текст их в П1 не кладёт, чекер — ни в долг, ни в снятое. - # Чтобы зеркало не вычитало их на слово, у чекера спрашивается след: - # есть такие блоки — обязано быть «ходов проверено» > 0. - if [ "$hd" -gt 0 ] && [ "$hod" -eq 0 ]; then - soshlos=нет; razoshlos=$((razoshlos+1)) - [ "$razoshlos" -le 12 ] && razbor_rashozhdeniy="$razbor_rashozhdeniy - $nm: ходов под постусловием $hd, а чекер ходов проверил 0 — зеркало вычло бы их со слова зря" - elif [ $((p1+p2+vsh)) -eq $((nsl+nsh+snyato+primerom+svoystvom+po_telu)) ]; then : - else - soshlos=нет; razoshlos=$((razoshlos+1)) - # ОБЕ СТОРОНЫ ПОИМЁННО, А НЕ ОДНО ЧИСЛО. Прежде расхождение печаталось - # счётом «разошлось N», и на поиск слагаемого уходил день: линейка - # знала ответ и молчала о нём. Числа кладутся сюда, а печатаются - # только при провале — зелёный прогон не растёт ни строкой. - [ "$razoshlos" -le 12 ] && razbor_rashozhdeniy="$razbor_rashozhdeniy - $nm: текст П1 $p1 + П2 $p2 + шагов $vsh = $((p1+p2+vsh)) (вне тождества: ходами $hd); чекер посылок $nsl + шагов $nsh + снято $snyato + по примеру $primerom + по свойству $svoystvom + по телу функции $po_telu = $((nsl+nsh+snyato+primerom+svoystvom+po_telu))" - fi - fi - - case $kod in - 0) razryad=Р0 ;; - 1) razryad=Р3 ;; - 3) if [ "$nsl" -eq 0 ] && [ "$nsh" -eq 0 ]; then razryad=Р1; else razryad=Р2; fi ;; - *) razryad=Р4 ;; - esac - - printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ - "$nm" "$decl" "$kod" "$kodd" "$utv" "$dok" "$nsl" "$nsh" "$p1" "$p2" "$p3" "$pr" "$sv" "$zk" "$soshlos" "$razryad" "$p4" \ - "$(printf '%s\n' "$v" | odna_stroka)" "$p5" "$hd" >> "$tab" - done - - if [ -n "$dump" ]; then - printf 'запись\tисходник\tкод\tкод-с-отпечатком\tутверждений\tдоказанными\tна-слово-посылок-и-утв\tна-слово-шагов\tП1\tП2\tП3\tпо-примеру\tпо-свойству\tпо-закону\tприборы-сошлись\tразряд\tП4\tвердикт\tП5\tходами-под-постусловием\n' > "$dump" - cat "$tab" >> "$dump" - fi - - # Имена записей набора подделок — по одному в строке, для awk-множества ниже. - nabor_imena=$tmp/набор-имена.txt - : > "$nabor_imena" - [ -f "$NABOR_TSV" ] && awk -F'\t' ' - NR > 1 && NF >= 3 { n = split($2, ch, "/"); print ch[n] }' "$NABOR_TSV" > "$nabor_imena" - awk -F'\t' -v nabor_f="$nabor_imena" -v nabor="$name" -v dir="$dir" -v razoshlos="$razoshlos" \ - -v vedimya="$vedimya" -v vedstrok="$vedstrok" ' - function dolya(n,d){ return d>0 ? sprintf("%.2f %%", 100*n/d) : "знаменатель ноль" } - BEGIN{ while ((getline stroka < nabor_f) > 0) if (stroka != "") nab_imena[stroka]=1 } - { vsego++ - kod[$3]++; kodd[$4]++ - utv+=$5; dok+=$6; nsl+=$7; nsh+=$8; p1+=$9; p2+=$10; p3+=$11 - razryad[$16]++; pr+=$12; sv+=$13; zk+=$14; p4+=$17; p5+=$19; hd+=$20 - # Карта работ спрашивает «что если снять породу МЕСТ», а места шагов — - # это П3 и П5 вместе: обе породы живут на одной строке записи и снимаются - # одной работой. Держать их в карте порознь значило бы обещать выбор, - # которого у чинящего нет. - nr++; ap1[nr]=$9; ap2[nr]=$10; ap3[nr]=$11+$19; ad[nr]=$6 - if ($3==0) { z0++; d0+=$6; if ($6+0==0) pusto++ } - if ($4==0) { zd0++; dd0+=$6 } - # НАБОР ПОДДЕЛОК — ПО МАНИФЕСТУ, А НЕ ПО ИМЕНИ ФАЙЛА (ADR-0023, Ш5). - # До 8 сентября 2026 здесь стояло `$2 ~ /poddelka|forgery|подделк/` — то - # есть подделку опознавала ПРИСТАВКА В ИМЕНИ исходника. Переименование - # файла двигало это число молча, и задача 4258 звала такое «самой дешёвой - # и самой незаметной в диффе накруткой». Теперь спрашивается объявленный - # список под храповиком: имя файла записи — лишь ключ его строки. - if (($1) in nab_imena) { podd++; if ($3==0) podd0++ } - } - END{ - printf "\n═══ НАБОР «%s» ═══\n", nabor - printf "каталог записей\t%s\n", dir - printf "записей в наборе\t%d\n", vsego - printf "ведомость дела\t%s\n", vedimya - printf "файлов в ведомости\t%d\n", vedstrok - printf "\n-- исходы чекера, как его зовёт оснастка (два довода) --\n" - printf "код 0 ПРОВЕРЕНО\t%d\n", kod[0]+0 - printf "код 1 НЕ СОШЛОСЬ\t%d\n", kod[1]+0 - printf "код 3 НЕ ПРОВЕРЕНО — не приговор\t%d\n", kod[3]+0 - printf "код 2 кривой вызов — не приговор\t%d\n", kod[2]+0 - n=0; for (k in kod) if (k+0!=0 && k+0!=1 && k+0!=2 && k+0!=3) n+=kod[k] - printf "коды больше 3 — не приговор\t%d\n", n - printf "\n-- тем же чекером, отпечаток подан третьим доводом --\n" - printf "код 0 ПРОВЕРЕНО\t%d\n", kodd[0]+0 - printf "код 1 НЕ СОШЛОСЬ\t%d\n", kodd[1]+0 - printf "код 3 НЕ ПРОВЕРЕНО\t%d\n", kodd[3]+0 - nd=0; for (k in kodd) if (k+0!=0 && k+0!=1 && k+0!=3) nd+=kodd[k] - printf "прочие коды — не приговор\t%d\n", nd - printf "\n-- ДОЛЯ Г4, знаменатель назван вместе с числителем --\n" - printf "по ЗАПИСЯМ, сегодня\t%d из %d\t%s\n", z0+0, vsego, dolya(z0+0,vsego) - # 7102: числитель, у которого доказанным не числится ничего. Чекер таким - # записям даёт код 0 и пишет «ПРОВЕРЕНО ВПУСТУЮ»; строка ниже — то же - # число, но на виду, а не в столбце вердикта разбора. - printf " из них ВПУСТУЮ, доказанным не числится ничего\t%d\n", pusto+0 - printf "по ЗАПИСЯМ, не считая пустых\t%d из %d\t%s\n", z0-pusto, vsego, dolya(z0-pusto,vsego) - # Дыра сидит РОВНО в счёте по записям, и это надо сказать там же, где - # печатается доля: по УТВЕРЖДЕНИЯМ пустая запись вносит ноль в числитель - # и потому ничего не искажает (73 из 242 и с ней, и без неё). Разойтись - # два счёта могут только здесь, и разошлись они на треть числителя. - printf " (по УТВЕРЖДЕНИЯМ пустые дают ноль и числа не двигают)\n" - # ЧЬИ ЭТО ЗАПИСИ. Набор «корпус» назван по каталогу, а не по породе - # программ: часть его заведена на исходники ПОДДЕЛОЧНЫХ программ, на - # которых стоят пробы чекера. Числа печатаются, чтобы «86 записей - # дерева» не читалось как «86 честных доказательств». - printf " записей набора подделок (манифест, не имя файла)\t%d\n", podd+0 - printf " из них в числителе\t%d\n", podd0+0 - printf "по ЗАПИСЯМ, снят разряд Р1\t%d из %d\t%s\n", zd0+0, vsego, dolya(zd0+0,vsego) - printf "по УТВЕРЖДЕНИЯМ, сегодня\t%d из %d\t%s\n", d0+0, dok, dolya(d0+0,dok) - printf "по УТВЕРЖДЕНИЯМ, снят разряд Р1\t%d из %d\t%s\n", dd0+0, dok, dolya(dd0+0,dok) - printf "\n-- разряды помех, по записям --\n" - printf "Р0 принято кодом 0\t%d\n", razryad["Р0"]+0 - printf "Р1 мешает только нехватка «отпечаток256»\t%d\n", razryad["Р1"]+0 - printf "Р2 то же плюс места на слово ядра\t%d\n", razryad["Р2"]+0 - printf "Р3 противоречие, код 1\t%d\n", razryad["Р3"]+0 - printf "Р4 не приговор\t%d\n", razryad["Р4"]+0 - printf "Р5 НЕ БЕРУСЬ: дело не из дерева\t%d\n", razryad["Р5"]+0 - printf "\n-- породы мест на слово ядра, по всему набору --\n" - printf "П1 «доказано», теоремы в записи нет\t%d\n", p1 - printf "П2 посылка с правилом и без ходов\t%d\n", p2 - printf "П3 шаг «по примеру»/«по свойству»/«по закону»\t%d\n", p3 - # П5 заведена 6 сентября 2026 вместе с правкой 7104: шаг, обоснование - # которого сверщик не проигрывает вовсе (в корпусе это «по - # предположению»). Порода отдельная не по вкусу, а по поведению: у П3 - # есть путь в «проверено по существу» и потому есть что вычитать, у П5 - # такого пути нет — её место в долге безусловно. - printf "П5 шаг, который сверщик не проигрывает вовсе\t%d\n", p5 - printf "П4 из них — значение «по объявлению» (внутри П1, не сверх)\t%d\n", p4 - printf "ходами под постусловием проиграно мест (не на слове, вне П1)\t%d\n", hd+0 - printf "чекер: на слово ядра — посылок и утверждений\t%d\n", nsl - printf "чекер: на слово ядра — шагов\t%d\n", nsh - printf " из П3: шаг «по примеру»\t%d\n", pr - printf " из П3: шаг «по свойству»\t%d\n", sv - printf " из П3: шаг «по закону»\t%d\n", zk - printf "сумма мест П1+П2+П3+П5\t%d\n", p1+p2+p3+p5 - printf "\n-- КАРТА РАБОТ: числитель, если снять Р1 и названные породы --\n" - # П4 сюда намеренно не входит: она лежит ВНУТРИ П1 (маршрут «по - # объявлению» — всегда без теоремы), а не рядом с ним, и сложить её в - # той же комбинаторике значило бы снова посчитать те же места П1. - printf "%-24s %8s %10s %12s\n", "снято сверх Р1", "записей", "утвержд.", "доля" - split("000 100 010 001 110 101 011 111", m, " ") - for (j=1; j<=8; j++) { - f1=substr(m[j],1,1); f2=substr(m[j],2,1); f3=substr(m[j],3,1) - zr=0; du=0 - for (i=1; i<=nr; i++) { - ok=1 - if (ap1[i]>0 && f1=="0") ok=0 - if (ap2[i]>0 && f2=="0") ok=0 - if (ap3[i]>0 && f3=="0") ok=0 - if (ok) { zr++; du+=ad[i] } - } - lab="" - if (f1=="1") lab=lab "П1 " - if (f2=="1") lab=lab "П2 " - if (f3=="1") lab=lab "П3+П5 " - if (lab=="") lab="— ничего " - printf "%-24s %8d %10d %11s\n", lab, zr, du, dolya(du,dok) - } - printf "\n-- сходимость двух приборов --\n" - printf "записей, где текстовый счёт разошёлся с чекером\t%d\n", razoshlos+0 - printf "утверждений в наборе всего\t%d\n", utv - printf "числятся доказанными — знаменатель по утверждениям\t%d\n", dok - if (razoshlos+0 > 0) { printf "\nРАСХОЖДЕНИЕ: линейка себе не верит\n"; exit 1 } - # Р5 — не «недочёт замера», а попытка судить дело, которого дерево не - # знает. Прибор, который об этом печатает число и остаётся зелёным, - # показывает ровно столько же, сколько его отсутствие. - if (razryad["Р5"]+0 > 0) { - printf "\nНЕ БЕРУСЬ: %d записей назвали исходником или собой не то, что лежит в коммите\n", razryad["Р5"] - exit 1 } - }' "$tab" - kod=$? - - if [ "$razoshlos" -gt 0 ] && [ -n "$razbor_rashozhdeniy" ]; then - printf '\nГДЕ ИМЕННО РАЗОШЛИСЬ ДВА ПРИБОРА (первые %s):%s\n' \ - "$([ "$razoshlos" -gt 12 ] && echo 12 || echo "$razoshlos")" "$razbor_rashozhdeniy" - printf 'Слева — места, какие видит текст записи; справа — куда их разложил чекер.\n' - printf 'Разошлось обычно потому, что чекер научился новому, а зеркало пород за ним не поехало.\n' - fi - - # ── СТОРОЖ 7102-А: ПУСТОЙ ЧИСЛИТЕЛЬ НАЗВАН ПОИМЁННО ─────────────────────── - printf '%s\n' "$PUSTO_V_CHISLITELE_ZAKONNO" > "$tmp/пусто-законно.txt" - bedy_p="" - while IFS=' ' read -r nm2 _ k2 _ _ d2 _; do - [ -n "${nm2:-}" ] || continue - if /usr/bin/grep -aqxF "$nm2" "$tmp/пусто-законно.txt"; then - if [ "$spisok" -eq 1 ] && { [ "$k2" != 0 ] || [ "$d2" -gt 0 ]; }; then - bedy_p="$bedy_p - СПИСОК ПРОТУХ (запись больше не пуста в числителе): $nm2 (код $k2, доказанными $d2)"; fi - continue; fi - [ "$k2" = 0 ] && [ "$d2" -eq 0 ] || continue - if [ "$spisok" -eq 1 ]; then - bedy_p="$bedy_p - ПУСТАЯ В ЧИСЛИТЕЛЕ, а поимённо не названа: $nm2" - else - bedy_p="$bedy_p - пустая в числителе (список на этот набор не заведён, прогон не роняется): $nm2"; fi - done < "$tab" - - # ── СТОРОЖ 7102-Б: СНЯТЫЙ ВЕРДИКТ ──────────────────────────────────────── - if [ "$primet" -gt 0 ]; then - printf '\nСНЯТЫЙ ВЕРДИКТ: мест %d — утверждение без «доказано» несёт след разбора\n' "$primet" - printf '%s\n' "$primet_gde" - printf 'Печать ядра такого не пишет: разбор кладётся только под «доказано».\n' - printf 'Скорее всего слово «доказано» вычеркнули, чтобы обнулить счёт «на слово ядра».\n' - kod=1 - fi - if [ -n "$bedy_p" ]; then - printf '\nЧИСЛИТЕЛЬ Г4 ВПУСТУЮ:%s\n' "$bedy_p" - if [ "$spisok" -eq 1 ]; then - printf 'Список законно пустых — в corpus-share.sh, PUSTO_V_CHISLITELE_ZAKONNO.\n' - kod=1 - fi - fi - return $kod -} - -# ── ПРОБА ПОРЧИ НА ДВУХ СТОРОЖЕЙ ЧИСЛИТЕЛЯ (задача 7102) ──────────────────── -# Оба сторожа сторожат одно: запись, ставшую ЛОЖНО-ЗЕЛЁНОЙ без единого нового -# довода. Перевести запись из Р2 в Р0 честно значит проиграть её места заново; -# нечестно — вычеркнуть из неё слово «доказано», потому что оба счётчика -# чекера растут только под ним. Проба строит обе подделки живьём и требует от -# линейки трёх ответов подряд: -# -# контроль честные записи корпуса — прогон зелёный -# подлог А вердикт и следы разбора сняты вместе — «ПУСТАЯ В ЧИСЛИТЕЛЕ», код 1 -# подлог Б снят только вердикт, следы на месте — «СНЯТЫЙ ВЕРДИКТ», код 1 -# -# Контроль обязателен по тому же доводу, что у пробы ведомости: без него -# красное по любой посторонней причине читалось бы как работа охраны. -# Подделыватель живёт целиком во временном каталоге, дерево не правится. -proba_snyatogo_verdikta() { - rab=$tmp/снятый-вердикт - ish_n=flang/proof/examples/corpus-natural.flang - ish_t=flang/proof/map/types.flang - zap_n=$root/flang/proof/checker/tests/records/corpus/corpus-natural.record - zap_t=$root/flang/proof/checker/tests/records/corpus/types.record - for f in "$root/$ish_n" "$root/$ish_t" "$zap_n" "$zap_t"; do - [ -f "$f" ] || { echo "ПОДЛОГ НЕ СОБРАЛСЯ: нет «$f» — поправить пробу, линейка ни при чём" >&2; return 1; } - done - - korp=flang/proof/checker/tests/records/corpus - for d in ч А Б; do - mkdir -p "$rab/$d/$korp" "$rab/$d/flang/proof/examples" "$rab/$d/flang/proof/map" \ - "$rab/$d/flang/proof/checker" || return 1 - cp "$checker" "$rab/$d/flang/proof/checker/сверщик" || return 1 - cp "$root/$ish_n" "$rab/$d/$ish_n" || return 1 - cp "$root/$ish_t" "$rab/$d/$ish_t" || return 1 - done - cp "$zap_n" "$rab/ч/$korp/corpus-natural.record" || return 1 - cp "$zap_t" "$rab/ч/$korp/types.record" || return 1 - - # А: вердикт снят ВМЕСТЕ со следами разбора — примета молчит, и поймать - # подделку может только пустой числитель. - snyat_vsyo() { - awk '{ if ($0 ~ /^[ \t]*вердикт доказано[ \t]*$/) { print " вердикт нет вердикта"; next } - if ($0 ~ /^[ \t]*правило «/) next - if ($0 ~ /^[ \t]*по объявлению /) next - if ($0 ~ /^[ \t]*следовательно доказано/) next - print }' "$1" > "$2" - } - # Б: снято ТОЛЬКО слово «доказано» — числитель не пуст, ловит примета. - snyat_verdikt() { - awk '{ if ($0 ~ /^[ \t]*вердикт доказано[ \t]*$/) { print " вердикт нет вердикта"; next } - print }' "$1" > "$2" - } - snyat_vsyo "$zap_n" "$rab/А/$korp/corpus-natural.record" || return 1 - cp "$zap_t" "$rab/А/$korp/types.record" || return 1 - cp "$zap_n" "$rab/Б/$korp/corpus-natural.record" || return 1 - snyat_verdikt "$zap_t" "$rab/Б/$korp/types.record" || return 1 - if cmp -s "$zap_n" "$rab/А/$korp/corpus-natural.record" || cmp -s "$zap_t" "$rab/Б/$korp/types.record"; then - echo "ПОДЛОГ НЕ СОБРАЛСЯ: строки «вердикт доказано» в записях корпуса больше нет — поправить пробу, линейка ни при чём" >&2 - return 1; fi - - vedom_kat() { - ( cd "$1" && find . -type f \( -name '*.flang' -o -name '*.record' \) -print0 \ - | LC_ALL=C sort -z | xargs -0 sha256sum ) | sed 's| \./|\t|' > "$2" - } - bad=0 - for d in ч А Б; do vedom_kat "$rab/$d" "$rab/$d.tsv" || return 1; done - - sh "$self" --корень "$rab/ч" --ведомость "$rab/ч.tsv" --набор корпус >"$rab/ч.out" 2>&1; k=$? - if [ "$k" -eq 0 ]; then echo "контроль: честные записи корпуса ЦЕЛА (код 0)" - else echo "контроль: честные записи корпуса ПРОВАЛ (код $k)"; bad=1; fi - - sh "$self" --корень "$rab/А" --ведомость "$rab/А.tsv" --набор корпус >"$rab/А.out" 2>&1; k=$? - if [ "$k" -eq 1 ] && /usr/bin/grep -aq 'ПУСТАЯ В ЧИСЛИТЕЛЕ' "$rab/А.out"; then - echo "подлог А: вердикт и следы сняты вместе ОТВЕРГНУТ (пустой числитель, код 1)" - else - echo "подлог А: вердикт и следы сняты вместе ПРОШЁЛ — охраны нет (код $k)"; bad=1; fi - - sh "$self" --корень "$rab/Б" --ведомость "$rab/Б.tsv" --набор корпус >"$rab/Б.out" 2>&1; k=$? - if [ "$k" -eq 1 ] && /usr/bin/grep -aq 'СНЯТЫЙ ВЕРДИКТ' "$rab/Б.out"; then - echo "подлог Б: снято только слово «доказано» ОТВЕРГНУТ (примета, код 1)" - else - echo "подлог Б: снято только слово «доказано» ПРОШЁЛ — охраны нет (код $k)"; bad=1; fi - - # ── ЧЕГО ЭТИ ДВА СТОРОЖА НЕ ЗАКРЫВАЮТ, И ЭТО ГОВОРИТСЯ ЧИСЛОМ ──────────── - # Подделыватель, снявший вердикт и следы у ЧАСТИ утверждений записи, не - # оставляет ни пустого числителя, ни приметы: строение блока законно, оба - # прибора линейки сходятся, отпечаток исходника цел, приговор ядра зелен — - # ядро судит ИСХОДНИК, а лгут в ЗАПИСИ. Свидетель здесь ровно один: печать - # ядра (`records-nesting.fscript`). Проба показывает дыру, а не закрывает её. - snyat_chast() { - awk 'BEGIN{ srezano=0 } - { if (srezano < 2 && $0 ~ /^[ \t]*вердикт доказано[ \t]*$/) { print " вердикт нет вердикта"; srezano++; next } - if (srezano > 0 && srezano <= 2 && ($0 ~ /^[ \t]*правило «/ || $0 ~ /^[ \t]*по объявлению /)) next - print }' "$1" > "$2" - } - mkdir -p "$rab/Д/$korp" "$rab/Д/flang/proof/examples" "$rab/Д/flang/proof/map" "$rab/Д/flang/proof/checker" || return 1 - cp "$checker" "$rab/Д/flang/proof/checker/сверщик" || return 1 - cp "$root/$ish_n" "$rab/Д/$ish_n" && cp "$root/$ish_t" "$rab/Д/$ish_t" || return 1 - cp "$zap_n" "$rab/Д/$korp/corpus-natural.record" || return 1 - snyat_chast "$zap_t" "$rab/Д/$korp/types.record" || return 1 - vedom_kat "$rab/Д" "$rab/Д.tsv" || return 1 - sh "$self" --корень "$rab/Д" --ведомость "$rab/Д.tsv" --набор корпус >"$rab/Д.out" 2>&1; k=$? - if [ "$k" -eq 0 ]; then - echo "дыра: вердикт снят у ЧАСТИ утверждений ПОКАЗАНА (оба сторожа молчат, код 0)" - else - echo "дыра: вердикт снят у ЧАСТИ утверждений НЕ ПОКАЗАНА (код $k) — подделка не собралась либо линейку правили"; bad=1; fi - - [ "$bad" -eq 0 ] && echo "проба на снятый вердикт: обе подделки отвергнуты, честные записи зелены, остаток назван" - return $bad -} - -# ── ПРОБА НА ПУСТОЙ ЧИСЛИТЕЛЬ (заказ надагента, 6 сентября 2026) ──────────── -# ИНВАРИАНТ: запись, засчитанная в числитель Г4 (разряд Р0), обязана иметь -# «доказанными» больше нуля. Линейка пустоту уже печатает числом, но печать — -# не сторож: ни одна проба самопроверки не спрашивала «а не пуста ли запись, -# которую мы засчитали», и через эту щель прошла накрутка 7116 — снятые в -# записях слова «вердикт доказано» растили мерку с 49 до 56, и не краснел никто. -# -# Три ответа подряд, и средний — единственный, ради которого проба заведена: -# контроль честная непустая запись Р0 — прогон зелёный -# подлог та же запись с обнулёнными вердиктами: Р0 при «доказанными 0», -# имя в поимённом списке не значится — прогон КРАСНЫЙ -# показ настоящая пустая запись корпуса — Р0 при «доказанными 0», но -# названа поимённо, и потому прогон зелёный ЗАКОННО -# Третий ответ печатается нарочно: он показывает, что инвариант нарушается в -# дереве шестнадцать раз, и каждый раз — по названному разрешению, а не молча. -# Число 53 из 86 и знаменатель 86 проба не трогает: решение, считать ли пустые, -# остаётся владельцу, а проба лишь не даёт добавить к ним семнадцатую тихо. -proba_pustogo_chislitelya() { - rab=$tmp/пустой-числитель - korp=flang/proof/checker/tests/records/corpus - zap_ch=$root/$korp/corpus-alphabet.record - zap_n=$root/$korp/corpus-natural.record - zap_p=$root/$korp/poddelka-refleksivnost.record - for f in "$zap_ch" "$zap_n" "$zap_p"; do - [ -f "$f" ] || { echo "ПРОБА НЕ СОБРАЛАСЬ: нет «$f»" >&2; return 1; } - done - ish_ch=$(grep -a -m1 '^исходник ' "$zap_ch" | cut -d' ' -f2-) - ish_n=$(grep -a -m1 '^исходник ' "$zap_n" | cut -d' ' -f2-) - ish_p=$(grep -a -m1 '^исходник ' "$zap_p" | cut -d' ' -f2-) - bad=0 - for d in ч п з; do - mkdir -p "$rab/$d/$korp" "$rab/$d/$(dirname "$ish_ch")" "$rab/$d/$(dirname "$ish_n")" \ - "$rab/$d/$(dirname "$ish_p")" "$rab/$d/flang/proof/checker" || return 1 - cp "$checker" "$rab/$d/flang/proof/checker/сверщик" || return 1 - cp "$root/$ish_ch" "$rab/$d/$ish_ch" || return 1 - cp "$root/$ish_n" "$rab/$d/$ish_n" || return 1 - cp "$root/$ish_p" "$rab/$d/$ish_p" || return 1 - done - cp "$zap_ch" "$rab/ч/$korp/corpus-alphabet.record" || return 1 - cp "$zap_p" "$rab/з/$korp/poddelka-refleksivnost.record" || return 1 - # ПОДЛОГ ДЕЛАЕТСЯ ТАК, ЧТОБЫ КРАСНЕЛ РОВНО ОДИН СТОРОЖ — ТОТ, КОТОРЫЙ - # СТОРОЖИТ ПУСТОТУ. Снять у записи слово «доказано» и оставить следы разбора - # мало: тогда краснеет ПРИМЕТА снятого вердикта, и проба зеленела бы даже - # с выключенным сторожем пустоты — проверено мутантом. Поэтому берётся - # запись, у которой утверждения идут БЕЗ теоремы (`corpus-natural`), и следы - # снимаются вместе с вердиктом: примета молчит, чекер по-прежнему даёт код 0, - # а доказанным не числится ничего. У записи с теоремами так нельзя — - # «следовательно доказано» входит в перечень строк, сличаемый с исходником, - # и её изъятие дало бы код 1 «НЕ СОШЛОСЬ» по постороннему поводу. - awk '{ if ($0 ~ /^[ \t]*вердикт доказано[ \t]*$/) { print " вердикт нет вердикта"; next } - if ($0 ~ /^[ \t]*правило «/ || $0 ~ /^[ \t]*по объявлению / || $0 ~ /^[ \t]*следовательно доказано/) next - print }' "$zap_n" > "$rab/п/$korp/corpus-natural.record" || return 1 - if cmp -s "$zap_n" "$rab/п/$korp/corpus-natural.record"; then - echo "ПРОБА НЕ СОБРАЛАСЬ: в «corpus-natural.record» больше нет «вердикт доказано»" >&2; return 1; fi - - vedom_p() { - ( cd "$1" && find . -type f \( -name '*.flang' -o -name '*.record' \) -print0 \ - | LC_ALL=C sort -z | xargs -0 sha256sum ) | sed 's| \./|\t|' > "$2" - } - # Инвариант читается ПО РАЗБОРУ, тем же TSV, каким линейка отвечает всем: - # запись разряда Р0 (столбец 16) с «доказанными» (столбец 6), равным нулю. - pustyh_v_r0() { awk -F'\t' 'NR>1 && $16=="Р0" && $6+0==0 {n++} END{print n+0}' "$1"; } - - for d in ч п з; do vedom_p "$rab/$d" "$rab/$d.tsv" || return 1; done - - sh "$self" --корень "$rab/ч" --ведомость "$rab/ч.tsv" --набор корпус \ - --разбор "$rab/ч.разбор" >"$rab/ч.out" 2>&1; k=$? - if [ "$k" -eq 0 ] && [ "$(pustyh_v_r0 "$rab/ч.разбор")" -eq 0 ]; then - echo "контроль: честная непустая запись в числителе ЦЕЛА (Р0, доказанными 7, код 0)" - else - echo "контроль: честная непустая запись в числителе ПРОВАЛ (код $k, пустых в Р0 $(pustyh_v_r0 "$rab/ч.разбор"))"; bad=1; fi - - sh "$self" --корень "$rab/п" --ведомость "$rab/п.tsv" --набор корпус \ - --разбор "$rab/п.разбор" >"$rab/п.out" 2>&1; k=$? - if [ "$k" -eq 1 ] && [ "$(pustyh_v_r0 "$rab/п.разбор")" -gt 0 ] \ - && /usr/bin/grep -aq 'ПУСТАЯ В ЧИСЛИТЕЛЕ' "$rab/п.out"; then - echo "подлог: пустая запись просочилась в числитель ОТВЕРГНУТ (Р0 при доказанными 0, код 1)" - else - echo "подлог: пустая запись просочилась в числитель ПРОШЁЛ — охраны нет (код $k, пустых в Р0 $(pustyh_v_r0 "$rab/п.разбор"))"; bad=1; fi - - sh "$self" --корень "$rab/з" --ведомость "$rab/з.tsv" --набор корпус \ - --разбор "$rab/з.разбор" >"$rab/з.out" 2>&1; k=$? - if [ "$k" -eq 0 ] && [ "$(pustyh_v_r0 "$rab/з.разбор")" -gt 0 ]; then - echo "показ: пустая, но названная поимённо ЗАКОННА (Р0 при доказанными 0, код 0)" - else - echo "показ: пустая, но названная поимённо ПРОВАЛ (код $k) — список разошёлся с корпусом"; bad=1; fi - - [ "$bad" -eq 0 ] && echo "проба на пустой числитель: незаявленная пустота красна, честная зелена, заявленная законна" - return $bad -} - -# ── ПЕЧАТЬ ЯДРА КАК ЕДИНСТВЕННЫЙ СВИДЕТЕЛЬ ЗАПИСИ (задача 7102) ───────────── -# Ведомость отвечает «тот ли это ФАЙЛ», приговор ядра — «не отвергает ли ядро -# ФАЙЛ». Ни один из них не спрашивает «то ли написано в ЗАПИСИ», а разряд Г4 -# считается по записи. Спрашивает это ровно один прибор дерева — `records-nesting.fscript`: -# он печатает запись ядром заново и сличает побайтово. Проба показывает, что он -# краснеет на той самой подделке, которую два дешёвых сторожа пропускают. -# ЦЕНА НАЗВАНА ЧИСЛОМ: на 86 записях корпуса — 47 секунд и собранный -# bootstrap/flang; в хуке перед пушем этого бюджета нет, в CI прибор сегодня не -# зовётся вовсе. Проба гоняет одну запись, чтобы уложиться в секунды. -proba_pechati_yadra() { - yadro=$root/bootstrap/flang - [ -x "$yadro" ] || { echo "нет двоичного ядра $yadro" >&2; return 2; } - rab=$tmp/печать-ядра - ish=flang/proof/map/types.flang - zap=$root/flang/proof/checker/tests/records/corpus/types.record - korp=flang/proof/checker/tests/records/corpus - [ -f "$root/$ish" ] && [ -f "$zap" ] \ - || { echo "ПОДЛОГ НЕ СОБРАЛСЯ: нет «$ish» или его записи — поправить пробу, линейка ни при чём" >&2; return 1; } - bad=0 - for d in ч п; do - mkdir -p "$rab/$d/$korp" "$rab/$d/flang/proof/map" "$rab/$d/flang/proof/checker" "$rab/$d/bootstrap" || return 1 - cp "$checker" "$rab/$d/flang/proof/checker/сверщик" || return 1 - cp "$root/$ish" "$rab/$d/$ish" || return 1 - ln -sf "$yadro" "$rab/$d/bootstrap/flang" || return 1 - done - cp "$zap" "$rab/ч/$korp/types.record" || return 1 - awk 'BEGIN{ srezano=0 } - { if (srezano < 2 && $0 ~ /^[ \t]*вердикт доказано[ \t]*$/) { print " вердикт нет вердикта"; srezano++; next } - if (srezano > 0 && srezano <= 2 && ($0 ~ /^[ \t]*правило «/ || $0 ~ /^[ \t]*по объявлению /)) next - print }' "$zap" > "$rab/п/$korp/types.record" || return 1 - if cmp -s "$zap" "$rab/п/$korp/types.record"; then - echo "ПОДЛОГ НЕ СОБРАЛСЯ: в «types.record» больше нет «вердикт доказано» — поправить пробу" >&2 - return 1; fi - vedom_k() { - ( cd "$1" && find . -type f \( -name '*.flang' -o -name '*.record' \) -print0 \ - | LC_ALL=C sort -z | xargs -0 sha256sum ) | sed 's| \./|\t|' > "$2" - } - vedom_k "$rab/ч" "$rab/ч.tsv" || return 1 - vedom_k "$rab/п" "$rab/п.tsv" || return 1 - - (cd "$root" && bootstrap/flang io flang/proof/records-nesting.fscript --max-steps 4000000000 --timeout 900000 -- --root "$rab/ч") >"$rab/ч.out" 2>&1; k=$? - if [ "$k" -eq 0 ]; then echo "контроль: честная запись против печати ядра ЦЕЛА (побайтово, код 0)" - else echo "контроль: честная запись против печати ядра ПРОВАЛ (код $k)"; bad=1; fi - - (cd "$root" && bootstrap/flang io flang/proof/records-nesting.fscript --max-steps 4000000000 --timeout 900000 -- --root "$rab/п") >"$rab/п.out" 2>&1; k=$? - if [ "$k" -eq 1 ] && /usr/bin/grep -aq 'РАЗОШЛАСЬ' "$rab/п.out"; then - echo "охрана: печать ядра на той же подделке ОТВЕРГНУТА (код 1)" - else - echo "охрана: печать ядра на той же подделке ПРОШЛА — охраны нет (код $k)"; bad=1; fi - - [ "$bad" -eq 0 ] && echo "проба на печать ядра: подделка записи отвергнута, честная запись зелена" - return $bad -} - -# ── самопроверка: тринадцать проб на сам прибор ───────────────────────────── -samoproverka() { - corp=$root/flang/proof/checker/tests/records/corpus - # ФЛАГ ЗОВЁТСЯ НЕ `bad`, И ЭТО НЕ ПРИДИРКА (7102). В оболочке переменные - # общие: вложенные пробы порчи (`proba_podloga`, `podlog_yadra` и обе новые) - # заводят свой счёт бед тем же именем `bad` и первой же строкой ставят его в - # ноль. Пока флаг звался так же, ЛЮБОЙ провал проб П1…П8 стирался следующей - # же вложенной пробой, и `--самопроверка` возвращала ноль с «ПРОВАЛ» на - # экране. Показано мутантом на дереве 251891a2: сломанная П3 печатает - # «ПРОВАЛ», код прогона — 0. Прибор, который печатает провал и остаётся - # зелёным, хуже отсутствующего: на него ссылаются. - beda_sam=0 - # П1. Породы не слепы: на записи с местами на слово счёт обязан быть не ноль. - set -- $(porody "$corp/abilities.record") - if [ $(($1+$2+$3)) -gt 0 ] - then echo "П1 счёт пород не слеп ЦЕЛА (П1=$1 П2=$2 П3=$3)" - else echo "П1 счёт пород не слеп ПРОВАЛ"; beda_sam=1; fi - # П2. Изъятие роняет счёт: убрали строки «теоремы нет» — П1 обязан упасть. - was=$(porody "$corp/abilities.record" | cut -d' ' -f1) - sed '/^[ \t]*теоремы нет[ \t]*$/d' "$corp/abilities.record" > "$tmp/без-теоремы.record" - now=$(porody "$tmp/без-теоремы.record" | cut -d' ' -f1) - if [ "$now" -lt "$was" ] - then echo "П2 изъятие роняет счёт ЦЕЛА ($was → $now)" - else echo "П2 изъятие роняет счёт ПРОВАЛ ($was → $now)"; beda_sam=1; fi - # П3. Отпечаток доводом — привязка, а не «ладно»: чужой даёт код 1. - z=$corp/corpus-factorial.record - s=$root/$(grep -a -m1 '^исходник ' "$z" | cut -d' ' -f2-) - "$checker" "$s" "$z" 0000000000000000000000000000000000000000000000000000000000000000 >/dev/null 2>&1 - k=$? - if [ "$k" -eq 1 ] - then echo "П3 чужой отпечаток отвергнут ЦЕЛА (код 1)" - else echo "П3 чужой отпечаток отвергнут ПРОВАЛ (код $k)"; beda_sam=1; fi - # П4. Не-приговор не путается с приговором: неизвестный ключ — код 2. - "$checker" --такого-ключа-нет "$s" "$z" >/dev/null 2>&1; k=$? - if [ "$k" -eq 2 ] - then echo "П4 кривой вызов — код 2 ЦЕЛА" - else echo "П4 кривой вызов — код 2 ПРОВАЛ (код $k)"; beda_sam=1; fi - # П5. ДВА ПУТИ ОДНОГО ОТПЕЧАТКА СХОДЯТСЯ, И НА ЭТОМ СТОИТ ВЕСЬ ОТВЕТ ПРО Р1. - # Линейка отвечает «каким станет числитель без разряда Р1», подавая - # отпечаток третьим доводом. Ответ годится, только если это то же самое, - # что строка «отпечаток256» в самой записи. Проба вписывает строку в - # КАЖДУЮ запись набора и сличает коды с прогоном «третьим доводом» - # запись за записью. Разошлись хоть на одной — ответ про Р1 недействителен. - corp2=$corp; raz=0; n5=0 - for z5 in "$corp2"/*.record; do - s5=$root/$(grep -a -m1 '^исходник ' "$z5" | cut -d' ' -f2) - [ -f "$s5" ] || continue - h5=$(sha256sum "$s5" | cut -d' ' -f1) - awk -v h="отпечаток256 $h5" 'BEGIN{d=0} {print} /^утверждений /{ if(!d){print h; d=1} }' "$z5" > "$tmp/с-256.record" - "$checker" "$s5" "$tmp/с-256.record" >/dev/null 2>&1; k1=$? - "$checker" "$s5" "$z5" "$h5" >/dev/null 2>&1; k2=$? - n5=$((n5+1)); [ "$k1" -eq "$k2" ] || raz=$((raz+1)) - done - if [ "$raz" -eq 0 ] && [ "$n5" -gt 0 ] - then echo "П5 строка «отпечаток256» = отпечаток доводом ЦЕЛА ($n5 записей, расхождений 0)" - else echo "П5 строка «отпечаток256» = отпечаток доводом ПРОВАЛ (записей $n5, расхождений $raz)"; beda_sam=1; fi - # П6. СТОЛБЕЦ ВЕРДИКТА НЕ РАССЫПАЕТ ЗАПИСЬ, и проба эта заведена по факту, а - # не на всякий случай: многострочный вердикт чекера («НЕ ВЗЯЛСЯ» своей - # строкой) молча превращал одну строку TSV в две и растил «записей в - # наборе» — 86 → 92 у Ч363, 86 → 87 на одном мутанте. Прибор, который - # считает не то и не краснеет, дороже прибора, который вовсе не считает. - # 7102: проба кормится НАСТОЯЩИМ выводом чекера, а не выдуманной - # двухстрочкой. Прежняя строка-образец была своей копией формата: смени - # сверщик способ печатать «НЕ ВЗЯЛСЯ» — образец останется прежним, проба - # зелёной, а столбец снова поедет. Теперь проба сперва требует, чтобы - # настоящий вердикт настоящей записи БЫЛ многострочным (перестал — - # сторожить нечего, и это провал, а не тишина), и только потом сплющивает. - z6=$corp/types.record - s6i=$root/$(grep -a -m1 '^исходник ' "$z6" | cut -d' ' -f2-) - v6=$("$checker" "$s6i" "$z6" 2>&1) - strok6=$(printf '%s\n' "$v6" | wc -l) - n6=$(printf '%s\n' "$v6" | odna_stroka | wc -l) - s6=$(printf '%s\n' "$v6" | odna_stroka) - if [ "$strok6" -lt 2 ] - then echo "П6 столбец вердикта — одна строка ПРОВАЛ (вердикт «$(basename "$z6")» больше не многострочен — сторожить нечего)"; beda_sam=1 - elif [ "$n6" -eq 0 ] && [ -n "$s6" ] - then echo "П6 столбец вердикта — одна строка ЦЕЛА (настоящий вердикт из $strok6 строк сплющен)" - else echo "П6 столбец вердикта — одна строка ПРОВАЛ (переводов строки $n6)"; beda_sam=1; fi - # П7. СНЯТЫЕ МЕСТА СКЛАДЫВАЮТСЯ ПО ВСЕМ ПРИЁМАМ. Приёмов, снимающих места со - # слова ядра, у чекера два (Ч363 «разбором по случаям», Ч365 «тождество - # после переписки допущением»), и будет больше. Довод тот же, что у П6: - # разбор, который берёт одно слагаемое вместо суммы, не краснеет — он тихо - # занижает снятое, и тождество «П1+П2 минус снятое = поле чекера» рушится - # на честной записи, выглядя находкой. - # 7102: проба ЗОВЁТ настоящий конвейер (`summa_po_metke`) и кормит его - # настоящим выводом чекера. Прежняя редакция писала конвейер ЗАНОВО своим - # текстом и гоняла по выдуманной строке: она сторожила копию, и правка - # настоящего конвейера её не красила. Ждать жёсткое число тоже нельзя — - # оно протухнет с первой же перепечаткой; поэтому сумма сверяется с - # независимым разбором тех же слагаемых и обязана быть БОЛЬШЕ каждого из - # них по отдельности. Так проба краснеет и на «взяли последнее», и на - # «взяли первое», и на «взяли наибольшее», не завися ни от одного числа. - z7=$corp/abilities.record - s7i=$root/$(grep -a -m1 '^исходник ' "$z7" | cut -d' ' -f2-) - v7=$("$checker" "$s7i" "$z7" 2>&1) - n7=$(printf '%s\n' "$v7" | summa_po_metke 'снято со слова ядра мест') - set -- $(printf '%s\n' "$v7" | /usr/bin/grep -ao 'снято со слова ядра мест [0-9]*' | sed 's/.* //') - sum7=0; max7=0; nenol7=0 - for x in "$@"; do - sum7=$((sum7+x)); [ "$x" -gt "$max7" ] && max7=$x - [ "$x" -gt 0 ] && nenol7=$((nenol7+1)) - done - if [ "$nenol7" -lt 2 ] - then echo "П7 снятые места складываются по всем приёмам ПРОВАЛ (у «$(basename "$z7")» ненулевое слагаемое одно — сторожить нечего)"; beda_sam=1 - elif [ "$n7" -eq "$sum7" ] && [ "$n7" -gt "$max7" ] - then echo "П7 снятые места складываются по всем приёмам ЦЕЛА (слагаемых $#: $*, сумма $n7 > наибольшего $max7)" - else echo "П7 снятые места складываются по всем приёмам ПРОВАЛ (сумма $n7, а слагаемые $*)"; beda_sam=1; fi - # П8. ВЕДОМОСТЬ ЧИТАЕТ ДЕРЕВО, А НЕ ЗАПИСИ. Три вопроса подряд: честный путь - # в ведомости есть; отпечаток в ней тот же, что у файла дерева; выдуманный - # путь не находится. Без третьего `v_sha` могла бы возвращать что угодно - # на что угодно, и разряд Р5 не встал бы никогда. - ish8=flang/proof/examples/corpus-natural.flang - v8=$(v_sha "$ish8"); f8=$(sha256sum "$root/$ish8" | cut -d' ' -f1) - n8=$(v_sha "свои/выдуманный.flang") - if [ -n "$v8" ] && [ "$v8" = "$f8" ] && [ -z "$n8" ] - then echo "П8 ведомость знает дерево и не знает выдуманного ЦЕЛА" - else echo "П8 ведомость знает дерево и не знает выдуманного ПРОВАЛ (в ведомости «$v8», у файла «$f8», выдуманный «$n8»)"; beda_sam=1; fi - # П9. ПРОБА ПОРЧИ НА САМУ ВЕДОМОСТЬ, целиком — тремя прогонами линейки. - if (cd "$root" && bootstrap/flang io flang/proof/share-ledger-forgery.fscript --max-steps 4000000000 --timeout 900000) >/dev/null 2>&1; then echo "П9 подлог отвергнут, честная запись зелена ЦЕЛА" - else echo "П9 подлог отвергнут, честная запись зелена ПРОВАЛ"; beda_sam=1; fi - # П10. ПРОБА ПОРЧИ НА ПРИГОВОР ЯДРА (задача 2390), целиком — тремя прогонами. - # Двоичного нет — проба НЕ ЗАСЧИТЫВАЕТСЯ ни в одну сторону, и об этом - # говорится вслух: молчаливый пропуск читался бы как зелёный. - if [ ! -x "$root/bootstrap/flang" ]; then - echo "П10 подлог, проведённый в коммит, ловится приговором ядра НЕ ЗВАЛАСЬ (нет bootstrap/flang)" - elif (cd "$root" && bootstrap/flang io flang/proof/kernel-verdict-forgery.fscript --max-steps 4000000000 --timeout 900000) >/dev/null 2>&1; then echo "П10 подлог, проведённый в коммит, ловится приговором ядра ЦЕЛА" - else echo "П10 подлог, проведённый в коммит, ловится приговором ядра ПРОВАЛ"; beda_sam=1; fi - # П11 и П12. ДВА СТОРОЖА ЛОЖНО-ЗЕЛЁНОЙ ЗАПИСИ, целиком — четырьмя прогонами - # линейки. До 6 сентября 2026 линейка на такую подделку не краснела - # ничем: запись переводилась из Р2 в Р0 вычёркиванием слова «доказано», - # оба её прибора падали синхронно (текстовый счёт читает то же слово), - # отпечаток исходника оставался цел, приговор ядра — зелен. Замер: - # подделка всех 86 записей корпуса растила долю с 49 из 86 до 56 из 86, - # расхождений 0, прогон код 0. - if proba_snyatogo_verdikta; then echo "П11/П12 ложно-зелёная запись отвергнута, честная зелена ЦЕЛА" - else echo "П11/П12 ложно-зелёная запись отвергнута, честная зелена ПРОВАЛ"; beda_sam=1; fi - # П14. ТОЖДЕСТВО СВЕРЯЕТСЯ ТАМ, ГДЕ РАБОТАЮТ ВСЕ ЕГО СЛАГАЕМЫЕ. В наборе - # «корпус» снятий «по свойству» ноль, и слагаемое `svoystvom` там не - # сторожит ничего: выброси его — прогон останется зелёным (проверено - # мутантом 6 сентября 2026). Прибор, у которого слагаемое проверяется - # только тем, что оно равно нулю, сходится случайно. Проба берёт две - # записи задачи 3455, где это слагаемое НЕ ноль, и требует от тождества - # сойтись на них; ноль на них значит, что сторожить снова нечем, и это - # провал, а не тишина. - kat14=$root/flang/proof/checker/tests/records/3455 - if [ ! -d "$kat14" ]; then - echo "П14 тождество сверено там, где слагаемые не нули ПРОВАЛ (нет каталога 3455)"; beda_sam=1 - else - sv14=0 - for z14 in "$kat14"/*.record; do - [ -f "$z14" ] || continue - s14=$root/$(grep -a -m1 '^исходник ' "$z14" | cut -d' ' -f2-) - [ -f "$s14" ] || continue - x14=$("$checker" "$s14" "$z14" 2>&1 | summa_po_metke 'Шагов по свойству проверено по существу') - sv14=$((sv14+x14)) - done - sh "$self" --корень "$root" --ведомость "$ved" --набор "$kat14" >"$tmp/п14.out" 2>&1; k14=$? - if [ "$sv14" -eq 0 ]; then - echo "П14 тождество сверено там, где слагаемые не нули ПРОВАЛ (в 3455 снятий «по свойству» больше нет — сторожить нечем)"; beda_sam=1 - elif [ "$k14" -eq 0 ] && /usr/bin/grep -aq 'разошёлся с чекером 0' "$tmp/п14.out"; then - echo "П14 тождество сверено там, где слагаемые не нули ЦЕЛА (снятий «по свойству» $sv14, расхождений 0)" - else - echo "П14 тождество сверено там, где слагаемые не нули ПРОВАЛ (код $k14)"; beda_sam=1 - fi - fi - # П15. ПУСТАЯ ЗАПИСЬ В ЧИСЛИТЕЛЕ Г4 — заказ надагента. Печать про пустоту у - # линейки уже была, сторожа не было: ни одна проба не спрашивала, не - # пуста ли засчитанная запись. - if proba_pustogo_chislitelya; then echo "П15 пустая запись в числителе Г4 краснит прогон ЦЕЛА" - else echo "П15 пустая запись в числителе Г4 краснит прогон ПРОВАЛ"; beda_sam=1; fi - # П13. ПЕЧАТЬ ЯДРА — ЕДИНСТВЕННЫЙ СВИДЕТЕЛЬ СОДЕРЖИМОГО ЗАПИСИ. Двоичного - # нет — проба НЕ ЗАСЧИТЫВАЕТСЯ ни в одну сторону, как и П10. - if [ ! -x "$root/bootstrap/flang" ]; then - echo "П13 подделка записи ловится печатью ядра НЕ ЗВАЛАСЬ (нет bootstrap/flang)" - elif proba_pechati_yadra; then echo "П13 подделка записи ловится печатью ядра ЦЕЛА" - else echo "П13 подделка записи ловится печатью ядра ПРОВАЛ"; beda_sam=1; fi - return $beda_sam -} - -if [ "$selftest" -eq 1 ]; then samoproverka; exit $?; fi - -pechat_primerov() { - yadro=$root/bootstrap/flang - [ -x "$yadro" ] || { echo "нет двоичного ядра $yadro — собрать: make -C bootstrap" >&2; return 2; } - out=$tmp/примеры; mkdir -p "$out" - n=0; otkaz=0; kto="" - for s in "$root"/flang/proof/examples/*.flang; do - b=$(basename "$s" .flang) - ( cd "$root" && "$yadro" check --proof --записать "$out/$b.record" "flang/proof/examples/$b.flang" ) >/dev/null 2>&1 - if [ -s "$out/$b.record" ]; then n=$((n+1)) - else otkaz=$((otkaz+1)); kto="$kto $b"; rm -f "$out/$b.record"; fi - done - { echo "примеров подано $(ls "$root"/flang/proof/examples/*.flang | wc -l)" - echo "записей напечатано $n" - echo "печать отказала $otkaz $kto"; } >&2 - echo "$out" -} - -if [ "$oba" -eq 1 ]; then - izmerit "корпус — 86 готовых записей дерева" "$root/flang/proof/checker/tests/records/corpus" из-записи 1 - k1=$? - [ -n "$dump" ] && dump=$dump.примеры - d=$(pechat_primerov) || exit 2 - izmerit "примеры — записи, напечатанные ядром" "$d" "$root/flang/proof/examples" 1 - k2=$? - exit $((k1+k2)) -fi - -case ${nabor:-} in - корпус) izmerit "корпус — 86 готовых записей дерева" "$root/flang/proof/checker/tests/records/corpus" из-записи 1 ;; - примеры) d=$(pechat_primerov) || exit 2 - izmerit "примеры — записи, напечатанные ядром" "$d" "$root/flang/proof/examples" 1 ;; - "") echo "назвать набор: --набор {корпус|примеры|КАТАЛОГ} либо --оба" >&2; exit 2 ;; - *) izmerit "каталог $nabor" "$nabor" из-записи ;; -esac -# короткая команда «proved-share:check» sh --набор корпус — дело чекеру называет дерево, а не проверяемая запись: путь исходника и его отпечаток берутся из описи коммита; запись, назвавшая исходником не то, что лежит в коммите, роняет прогон -# короткая команда «share:replay» sh --проигрыванием — проверка 2 доказуемости числом: доля-проигрыванием = Σ «сведений проиграно заново» / Σ «утверждений» по 86 записям набора программ. Мерит РЕАЛЬНО проигранное записанными ходами (числитель растёт только на честной игре, калькулятор perepiskoy/razborom_celi в него не пишет), а не «сошлась ли запись кодом 0», как разряды Р0–Р5 той же линейки. Сегодня мало и честно: ходы несёт лишь тождество С1–С5, маршрут «по объявлению»/композиция ходов не печатает и уходит в знаменатель на слово ядра -# короткая команда «share:forgery» sh --проигрыванием --самопроверка — проба по числу: у записи-носителя снимаются записанные ходы, и числитель обязан упасть — иначе прибор держал бы долю на снятых ходах и мерил бы вердикт, а не игру diff --git a/flang/proof/forgeries/run.fscript b/flang/proof/forgeries/run.fscript new file mode 100644 index 000000000..5ed5bce2e --- /dev/null +++ b/flang/proof/forgeries/run.fscript @@ -0,0 +1,581 @@ +модуль «Record forgeries» + использует «Rules» из "../../../scripts/rules.fscript" + использует «Inquiry» из "../../../scripts/inquiry.fscript" + использует «Reading» из "../../../scripts/reading.fscript" + использует «Tables» из "../../../scripts/tables.fscript" + использует «Paths» из "../../../scripts/paths.fscript" + использует «Plan output» из "../../../scripts/plan-output.fscript" + использует «Lists» только «Соединить списки» + +объект «Trial» + «index»: число + «title»: строка + «source»: строка + «written»: строка + «edit»: строка + «code»: строка + +объект «Edited» + «lines»: список строки + «seen»: число + +тотальная функция «Trials of» + принимает rows: список список строки + возвращает список «Trial» + пример «Rows of the table become numbered trials» + дано rows равно [["честная", "examples/a.flang", "examples/a.flang", "-", "0"], ["круг", "forgeries/c.flang", "forgeries/c.record", "-", "1"]] + ожидается [запись «Trial» с «index» равным 1 и «title» равным "честная" и «source» равным "examples/a.flang" и «written» равным "examples/a.flang" и «edit» равным "-" и «code» равным "0", запись «Trial» с «index» равным 2 и «title» равным "круг" и «source» равным "forgeries/c.flang" и «written» равным "forgeries/c.record" и «edit» равным "-" и «code» равным "1"] + свёртка rows начиная с (пустой список) как trials и row → добавить (запись «Trial» с «index» равным ((длина trials) плюс 1) и «title» равным («Cell» от 1 и row) и «source» равным («Cell» от 2 и row) и «written» равным («Cell» от 3 и row) и «edit» равным («Cell» от 4 и row) и «code» равным («Cell» от 5 и row)) к trials + +тотальная функция «Trials» + принимает answers: список «Answer» + возвращает список «Trial» + пример «No table gives no trials» + дано answers равно пустой список + ожидается пустой список + «Trials of» от («Rows» от («Output of» от "table" и answers)) + +тотальная функция «Is a program» + принимает path: строка + возвращает признак + пример «A program in any of the four spellings» + дано path равно "examples/a.фп" + ожидается да + пример «A record is not a program» + дано path равно "forgeries/circle.record" + ожидается нет + (длина (отфильтровать [".flang", ".fp", ".фп", ".фланг"] где ending → «Ends with» от path и ending)) больше 0 + +тотальная функция «Written programs» + принимает trials: список «Trial» + возвращает список строки + пример «Every program whose record the kernel writes is named once» + дано trials равно [запись «Trial» с «index» равным 1 и «title» равным "честная" и «source» равным "examples/a.flang" и «written» равным "examples/a.flang" и «edit» равным "-" и «code» равным "0", запись «Trial» с «index» равным 2 и «title» равным "чужой" и «source» равным "examples/b.flang" и «written» равным "examples/a.flang" и «edit» равным "-" и «code» равным "1", запись «Trial» с «index» равным 3 и «title» равным "круг" и «source» равным "forgeries/c.flang" и «written» равным "forgeries/c.record" и «edit» равным "-" и «code» равным "1"] + ожидается ["examples/a.flang"] + свёртка trials начиная с (пустой список) как named и trial → если (не («Is a program» от (trial.«written»))) или ((длина (отфильтровать named где program → program равен (trial.«written»))) больше 0) то named иначе (добавить (trial.«written») к named) + +тотальная функция «Binary» + принимает answers: список «Answer» + возвращает строка + пример «The built binary is taken when the environment names none» + дано answers равно пустой список + ожидается "../../../bootstrap/flang" + «Setting of» от "binary" и "../../../bootstrap/flang" и answers + +тотальная функция «Work» + принимает answers: список «Answer» + возвращает строка + пример «No directory was made yet» + дано answers равно пустой список + ожидается "" + «Made of» от "work" и answers + +тотальная функция «In tree» + принимает path: строка, answers: список «Answer» + возвращает строка + пример «A path of the table is counted from the proof directory» + дано path равно "examples/a.flang" + дано answers равно [запись «Answer» с «name» равным "here" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t/flang/proof/forgeries\n" и ошибки равным "")] + ожидается "/t/flang/proof/forgeries/../examples/a.flang" + соединить [(«First line» от («Output of» от "here" и answers)), "/../", path] по "" + +тотальная функция «Kernel record» + принимает program: строка, answers: список «Answer» + возвращает строка + пример «The record the kernel writes lies in the working directory» + дано program равно "examples/a.flang" + дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается "/w/a.flang.record" + соединить [(«Work» от answers), "/", («File name» от program), ".record"] по "" + +тотальная функция «Trial record» + принимает trial: «Trial», answers: список «Answer» + возвращает строка + пример «A record of the tree is taken as it lies» + дано trial равно запись «Trial» с «index» равным 3 и «title» равным "круг" и «source» равным "forgeries/c.flang" и «written» равным "forgeries/c.record" и «edit» равным "-" и «code» равным "1" + дано answers равно [запись «Answer» с «name» равным "here" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t/flang/proof/forgeries\n" и ошибки равным "")] + ожидается "/t/flang/proof/forgeries/../forgeries/c.record" + пример «An edited record has its own file» + дано trial равно запись «Trial» с «index» равным 2 и «title» равным "обруб" и «source» равным "examples/a.flang" и «written» равным "examples/a.flang" и «edit» равным "last-step-dropped" и «code» равным "1" + дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается "/w/trial-2.record" + пример «An untouched kernel record is shared» + дано trial равно запись «Trial» с «index» равным 1 и «title» равным "честная" и «source» равным "examples/a.flang" и «written» равным "examples/a.flang" и «edit» равным "-" и «code» равным "0" + дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается "/w/a.flang.record" + «Chosen» от [(«When» от (не («Is a program» от (trial.«written»))) и («In tree» от (trial.«written») и answers)), + («When» от ((trial.«edit») равен "-") и («Kernel record» от (trial.«written») и answers))] и (соединить [(«Work» от answers), "/trial-", (к строке (trial.«index»)), ".record"] по "") + +тотальная функция «Is a step» + принимает line: строка + возвращает признак + пример «An indented step» + дано line равно " шаг 1 строка 111 закрывающий по предположению" + ожидается да + пример «A line that only mentions a step» + дано line равно " ход 2 шаг назад" + ожидается нет + пример «An empty line» + дано line равно "" + ожидается нет + разбор (разделить line по "шаг ") + случай пусто + то нет + случай голова и хвост + то (пусто (соединить (разделить голова по " ") по "")) и притом ((длина хвост) больше 0) + +тотальная функция «Is an assumed step» + принимает line: строка + возвращает признак + пример «A step closed by the assumption» + дано line равно " шаг 1 строка 111 закрывающий по предположению" + ожидается да + пример «A step closed by a property» + дано line равно " шаг 1 строка 173 закрывающий по свойству «высота неотрицательна»" + ожидается нет + («Is a step» от line) и притом («Ends with» от line и " по предположению") + +тотальная функция «Another ground» + принимает line: строка + возвращает строка + пример «The assumption is replaced by a property the source does not name there» + дано line равно " шаг 1 строка 111 закрывающий по предположению" + ожидается " шаг 1 строка 111 закрывающий по свойству «высота неотрицательна»" + соединить [(подстрока line с 1 по ((длина line) минус (длина " по предположению"))), " по свойству «высота неотрицательна»"] по "" + +тотальная функция «Swapped step» + принимает text: строка + возвращает строка + пример «Only the first assumed step gets another ground» + дано text равно "цель\n шаг 1 по предположению\n шаг 2 по предположению\n" + ожидается "цель\n шаг 1 по свойству «высота неотрицательна»\n шаг 2 по предположению\n" + пример «A record without such a step stays as it is» + дано text равно "цель\n шаг 1 по примеру\n" + ожидается "цель\n шаг 1 по примеру\n" + соединить ((свёртка (разделить text по "\n") начиная с (запись «Edited» с «lines» равным (пустой список) и «seen» равным 0) как edited и line → если ((edited.«seen») равен 0) и притом («Is an assumed step» от line) то (запись «Edited» с «lines» равным (добавить («Another ground» от line) к (edited.«lines»)) и «seen» равным 1) иначе (запись «Edited» с «lines» равным (добавить line к (edited.«lines»)) и «seen» равным (edited.«seen»))).«lines») по "\n" + +тотальная функция «Last step dropped» + принимает text: строка + возвращает строка + пример «The last step leaves and the goal stays open» + дано text равно "цель\n шаг 1 по примеру\n шаг 2 по предположению\nконец\n" + ожидается "цель\n шаг 1 по примеру\nконец\n" + пример «A record without steps stays as it is» + дано text равно "цель\nконец\n" + ожидается "цель\nконец\n" + пусть lines равно (разделить text по "\n") + пусть steps равно (длина (отфильтровать lines где line → «Is a step» от line)) + соединить ((свёртка lines начиная с (запись «Edited» с «lines» равным (пустой список) и «seen» равным 0) как edited и line → если «Is a step» от line то (запись «Edited» с «lines» равным (если ((edited.«seen») плюс 1) равен steps то (edited.«lines») иначе (добавить line к (edited.«lines»))) и «seen» равным ((edited.«seen») плюс 1)) иначе (запись «Edited» с «lines» равным (добавить line к (edited.«lines»)) и «seen» равным (edited.«seen»))).«lines») по "\n" + +тотальная функция «Forged» + принимает edit: строка, text: строка + возвращает строка + пример «An unknown edit changes nothing» + дано edit равно "reversed" + дано text равно "цель\n" + ожидается "цель\n" + «Chosen» от [(«When» от (edit равен "swapped-step") и («Swapped step» от text)), + («When» от (edit равен "last-step-dropped") и («Last step dropped» от text))] и text + +тотальная функция «Setup» + возвращает список «Question» + пример «The table, the examples and the settings are asked first» + ожидается [запись «Question» с «name» равным "arguments" и «order» равным (вариант «Прочитать доводы»), запись «Question» с «name» равным "directory" и «order» равным (вариант «Прочитать переменную среды» с имя равным "PWD"), запись «Question» с «name» равным "table" и «order» равным (вариант «Прочитать файл» с путь равным "run.tsv"), запись «Question» с «name» равным "binary" и «order» равным (вариант «Прочитать переменную среды» с имя равным "FLANG_BIN"), запись «Question» с «name» равным "temporary" и «order» равным (вариант «Прочитать переменную среды» с имя равным "FLANG_TMP"), запись «Question» с «name» равным "catalogue" и «order» равным (вариант «Прочитать переменную среды» с имя равным "FORGERIES_EXAMPLES"), запись «Question» с «name» равным "here" и «order» равным (вариант «Запустить процесс» с программа равным "pwd" и аргументы равным пустой список)] + [(«Arguments» от "arguments"), («Environment» от "directory" и "PWD"), («Read» от "table" и "run.tsv"), («Environment» от "binary" и "FLANG_BIN"), («Environment» от "temporary" и "FLANG_TMP"), («Environment» от "catalogue" и "FORGERIES_EXAMPLES"), («Run» от "here" и "pwd" и (пустой список))] + +тотальная функция «Presence» + принимает answers: список «Answer» + возвращает список «Question» + пример «The binary is tested before it is called» + дано answers равно пустой список + ожидается [запись «Question» с «name» равным "binary present" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["-x", "../../../bootstrap/flang"]), запись «Question» с «name» равным "examples" и «order» равным (вариант «Перечислить каталог» с путь равным "../examples")] + [(«Run» от "binary present" и "test" и ["-x", («Binary» от answers)]), («List» от "examples" и («Setting of» от "catalogue" и "../examples" и answers))] + +тотальная функция «Making» + принимает answers: список «Answer» + возвращает список «Question» + пример «The working directory is made where temporary files live» + дано answers равно пустой список + ожидается [запись «Question» с «name» равным "work" и «order» равным (вариант «Завести временный каталог» с образец равным "/srv/tmp/forgeries.")] + [(«Temporary directory» от "work" и (соединить [(«Setting of» от "temporary" и "/srv/tmp" и answers), "/forgeries."] по ""))] + +тотальная функция «Record question» + принимает name: строка, program: строка, written: строка, answers: список «Answer» + возвращает «Question» + пример «The kernel is asked to write its proof down» + дано name равно "written a.flang" + дано program равно "/t/a.flang" + дано written равно "/w/a.flang.record" + дано answers равно пустой список + ожидается запись «Question» с «name» равным "written a.flang" и «order» равным (вариант «Запустить процесс» с программа равным "../../../bootstrap/flang" и аргументы равным ["check", "/t/a.flang", "--proof", "--записать", "/w/a.flang.record"]) + «Run» от name и («Binary» от answers) и ["check", program, "--proof", "--записать", written] + +тотальная функция «Writing» + принимает answers: список «Answer» + возвращает список «Question» + пример «No trials give nothing to write» + дано answers равно пустой список + ожидается пустой список + отобразить («Written programs» от («Trials» от answers)) как program → «Record question» от (соединить ["written ", program] по "") и («In tree» от program и answers) и («Kernel record» от program и answers) и answers + +тотальная функция «Reading records» + принимает answers: список «Answer» + возвращает список «Question» + пример «No trials give nothing to read» + дано answers равно пустой список + ожидается пустой список + отобразить («Written programs» от («Trials» от answers)) как program → «Read» от (соединить ["text ", program] по "") и («Kernel record» от program и answers) + +тотальная функция «Edited trials» + принимает answers: список «Answer» + возвращает список «Trial» + пример «No trials, none edited» + дано answers равно пустой список + ожидается пустой список + отфильтровать («Trials» от answers) где trial → («Is a program» от (trial.«written»)) и притом (не ((trial.«edit») равен "-")) + +тотальная функция «Text of» + принимает trial: «Trial», answers: список «Answer» + возвращает строка + пример «An unread record has no text» + дано trial равно запись «Trial» с «index» равным 2 и «title» равным "обруб" и «source» равным "examples/a.flang" и «written» равным "examples/a.flang" и «edit» равным "last-step-dropped" и «code» равным "1" + дано answers равно пустой список + ожидается "" + «Output of» от (соединить ["text ", (trial.«written»)] по "") и answers + +тотальная функция «Forging» + принимает answers: список «Answer» + возвращает список «Question» + пример «No trials give nothing to forge» + дано answers равно пустой список + ожидается пустой список + отобразить («Edited trials» от answers) как trial → «Write» от (соединить ["forged ", (к строке (trial.«index»))] по "") и («Trial record» от trial и answers) и («Forged» от (trial.«edit») и («Text of» от trial и answers)) + +тотальная функция «Another checker» + принимает answers: список «Answer» + возвращает список строки + пример «No argument leaves the checker of the tree» + дано answers равно пустой список + ожидается пустой список + пример «The first argument names another checker, from the directory of the caller» + дано answers равно [запись «Answer» с «name» равным "arguments" и «reply» равным (вариант «Доводы» с доводы равным ["other.flang"]), запись «Answer» с «name» равным "directory" и «reply» равным (вариант «Значение среды» с значение равным "/srv/tree")] + ожидается ["/srv/tree/other.flang"] + разбор («Given of» от "arguments" и answers) + случай пусто + то пустой список + случай голова и хвост + то [(«Absolute» от («Setting of» от "directory" и "." и answers) и голова)] + +тотальная функция «Check question» + принимает name: строка, source: строка, written: строка, answers: список «Answer» + возвращает «Question» + пример «The check plan is called with the two paths» + дано name равно "trial 1" + дано source равно "/t/a.flang" + дано written равно "/w/a.flang.record" + дано answers равно пустой список + ожидается запись «Question» с «name» равным "trial 1" и «order» равным (вариант «Запустить процесс» с программа равным "../../../bootstrap/flang" и аргументы равным ["io", "../check.fscript", "--timeout", "14400000", "--", "/t/a.flang", "/w/a.flang.record"]) + «Run» от name и («Binary» от answers) и («Соединить списки» от ["io", "../check.fscript", "--timeout", "14400000", "--", source, written] и («Another checker» от answers)) + +тотальная функция «Trying» + принимает answers: список «Answer» + возвращает список «Question» + пример «No trials give nothing to try» + дано answers равно пустой список + ожидается пустой список + отобразить («Trials» от answers) как trial → «Check question» от (соединить ["trial ", (к строке (trial.«index»))] по "") и («In tree» от (trial.«source») и answers) и («Trial record» от trial и answers) и answers + +тотальная функция «Catalogue» + принимает answers: список «Answer» + возвращает список строки + пример «No listing gives no programs» + дано answers равно пустой список + ожидается пустой список + «Gathered words» от (отобразить [".flang", ".fp", ".фп", ".фланг"] как ending → отфильтровать («Listed of» от "examples" и answers) где name → «Ends with» от name и ending) + +тотальная функция «Catalogue path» + принимает name: строка, answers: список «Answer» + возвращает строка + пример «A program of the catalogue of the tree» + дано name равно "a.flang" + дано answers равно [запись «Answer» с «name» равным "here" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t/flang/proof/forgeries\n" и ошибки равным "")] + ожидается "/t/flang/proof/forgeries/../examples/a.flang" + пусть named равно («Setting of» от "catalogue" и "" и answers) + если пусто named то («In tree» от (соединить ["examples/", name] по "") и answers) иначе (соединить [named, "/", name] по "") + +тотальная функция «Catalogue record» + принимает name: строка, answers: список «Answer» + возвращает строка + пример «A record of the catalogue lies in the working directory under its own name» + дано name равно "a.flang" + дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается "/w/catalogue-a.flang.record" + соединить [(«Work» от answers), "/catalogue-", name, ".record"] по "" + +тотальная функция «Catalogue writing» + принимает answers: список «Answer» + возвращает список «Question» + пример «No listing gives nothing to write» + дано answers равно пустой список + ожидается пустой список + отобразить («Catalogue» от answers) как name → «Record question» от (соединить ["catalogue record ", name] по "") и («Catalogue path» от name и answers) и («Catalogue record» от name и answers) и answers + +тотальная функция «Recorded» + принимает answers: список «Answer» + возвращает список строки + пример «No listing, nothing recorded» + дано answers равно пустой список + ожидается пустой список + отфильтровать («Catalogue» от answers) где name → («Exit code of» от (соединить ["catalogue record ", name] по "") и answers) равен 0 + +тотальная функция «Catalogue checking» + принимает answers: список «Answer» + возвращает список «Question» + пример «No records give nothing to check» + дано answers равно пустой список + ожидается пустой список + отобразить («Recorded» от answers) как name → «Check question» от (соединить ["catalogue check ", name] по "") и («Catalogue path» от name и answers) и («Catalogue record» от name и answers) и answers + +тотальная функция «Cleaning» + принимает answers: список «Answer» + возвращает список «Question» + пример «The working directory leaves with everything in it» + дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается [запись «Question» с «name» равным "cleaned" и «order» равным (вариант «Запустить процесс» с программа равным "rm" и аргументы равным ["-rf", "/w"])] + [(«Run» от "cleaned" и "rm" и ["-rf", («Work» от answers)])] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + пример «A stage outside the plan asks nothing» + дано stages равно 12 + дано answers равно пустой список + ожидается пустой список + разбор stages + случай 9 + то «Setup» + случай 8 + то «Presence» от answers + случай 7 + то «Making» от answers + случай 6 + то «Writing» от answers + случай 5 + то «Reading records» от answers + случай 4 + то «Forging» от answers + случай 3 + то «Trying» от answers + случай 2 + то «Catalogue writing» от answers + случай 1 + то «Catalogue checking» от answers + случай 0 + то «Cleaning» от answers + случай любое + то пустой список + +тотальная функция «Short» + принимает text: строка, limit: число + возвращает строка + пример «The first line of what was said» + дано text равно "one\ntwo" + дано limit равно 220 + ожидается "one" + пример «A long line is cut» + дано text равно "abcdef" + дано limit равно 3 + ожидается "abc" + пусть line равно («First line» от text) + если (длина line) больше limit то (подстрока line с 1 по limit) иначе line + +тотальная функция «Trial lines» + принимает trial: «Trial», code: число, said: строка + возвращает список строки + пример «The awaited code» + дано trial равно запись «Trial» с «index» равным 1 и «title» равным "честная" и «source» равным "examples/a.flang" и «written» равным "examples/a.flang" и «edit» равным "-" и «code» равным "0" + дано code равно 0 + дано said равно "сошлось: утверждений 4" + ожидается ["СОШЛОСЬ честная — код 0, как и ждали", " сошлось: утверждений 4"] + пример «Another code is a failure» + дано trial равно запись «Trial» с «index» равным 2 и «title» равным "обруб" и «source» равным "examples/a.flang" и «written» равным "examples/a.flang" и «edit» равным "last-step-dropped" и «code» равным "1" + дано code равно 0 + дано said равно "сошлось: утверждений 4" + ожидается ["ПРОВАЛ обруб — ждали код 1, получили 0", " сошлось: утверждений 4"] + [(если (к строке code) равен (trial.«code») то (соединить ["СОШЛОСЬ ", (trial.«title»), " — код ", (к строке code), ", как и ждали"] по "") иначе (соединить ["ПРОВАЛ ", (trial.«title»), " — ждали код ", (trial.«code»), ", получили ", (к строке code)] по "")), + (соединить [" ", («Short» от said и 220)] по "")] + +тотальная функция «Failed trials» + принимает answers: список «Answer» + возвращает число + пример «No trials, none failed» + дано answers равно пустой список + ожидается 0 + длина (отфильтровать («Trials» от answers) где trial → не ((к строке («Exit code of» от (соединить ["trial ", (к строке (trial.«index»))] по "") и answers)) равен (trial.«code»))) + +тотальная функция «Refused» + принимает answers: список «Answer» + возвращает список строки + пример «No records, none refused» + дано answers равно пустой список + ожидается пустой список + отфильтровать («Recorded» от answers) где name → не ((«Exit code of» от (соединить ["catalogue check ", name] по "") и answers) равен 0) + +тотальная функция «Catalogue line» + принимает name: строка, answers: список «Answer» + возвращает список строки + пример «A program the kernel did not record» + дано name равно "a.flang" + дано answers равно пустой список + ожидается ["записи нет у a.flang — check не прошёл"] + разбор («Catalogue outcome» от name и answers) + случай "unrecorded" + то [(соединить ["записи нет у ", name, " — check не прошёл"] по "")] + случай "refused" + то [(соединить ["ОТВЕРГНУТА честная запись ", name, ": ", («Short» от («Plan said by» от (соединить ["catalogue check ", name] по "") и answers) и 200)] по "")] + случай любое + то пустой список + +тотальная функция «Catalogue outcome» + принимает name: строка, answers: список «Answer» + возвращает строка + пример «Nothing recorded» + дано name равно "a.flang" + дано answers равно пустой список + ожидается "unrecorded" + «Chosen» от [(«When» от (не ((«Exit code of» от (соединить ["catalogue record ", name] по "") и answers) равен 0)) и "unrecorded"), + («When» от (не ((«Exit code of» от (соединить ["catalogue check ", name] по "") и answers) равен 0)) и "refused")] и "accepted" + +тотальная функция «Catalogue lines» + принимает answers: список «Answer» + возвращает список строки + пример «An empty catalogue is counted as empty» + дано answers равно пустой список + ожидается ["── весь каталог flang/proof/examples ──", "программ 0, записей 0, принято сверщиком 0"] + пусть recorded равно («Recorded» от answers) + «Соединить списки» от (приписать "── весь каталог flang/proof/examples ──" к («Gathered words» от (отобразить («Catalogue» от answers) как name → «Catalogue line» от name и answers))) и [(соединить ["программ ", (к строке (длина («Catalogue» от answers))), ", записей ", (к строке (длина recorded)), ", принято сверщиком ", (к строке ((длина recorded) минус (длина («Refused» от answers))))] по "")] + +тотальная функция «Written lines» + принимает answers: список «Answer» + возвращает список строки + пример «No trials, nothing written» + дано answers равно пустой список + ожидается пустой список + разбор («Trials» от answers) + случай пусто + то пустой список + случай голова и хвост + то приписать (соединить ["исходник честной половины: flang/proof/", ((голова).«source»)] по "") к (отобразить («Written programs» от («Trials» от answers)) как program → соединить ["записано доказательство: ", (к строке ((длина (разделить («Output of» от (соединить ["text ", program] по "") и answers) по "\n")) минус 1)), " строк"] по "") + +тотальная функция «Trouble» + принимает asked: строка, answers: список «Answer» + возвращает список строки + пример «A missing binary is a trouble» + дано asked равно "binary present" + дано answers равно [запись «Answer» с «name» равным "binary present" и «reply» равным (вариант «Процесс завершён» с код равным 1 и вывод равным "" и ошибки равным "")] + ожидается ["двоичного нет: ../../../bootstrap/flang"] + пример «A record the kernel did not write is a trouble» + дано asked равно "written examples/a.flang" + дано answers равно [запись «Answer» с «name» равным "written examples/a.flang" и «reply» равным (вариант «Процесс завершён» с код равным 1 и вывод равным "" и ошибки равным "")] + ожидается ["ядро не записало доказательства examples/a.flang (код 1)"] + пример «An answered question is no trouble» + дано asked равно "binary" + дано answers равно пустой список + ожидается пустой список + пусть failed равно (не ((«Exit code of» от asked и answers) равен 0)) + «Chosen» от [(«When» от ((asked равен "table") и притом failed) и (["таблицы нет: run.tsv"])), + («When» от ((asked равен "table") и притом ((длина («Trials» от answers)) равен 0)) и (["в run.tsv нет ни одной строки данных"])), + («When» от ((asked равен "binary present") и притом failed) и ([(соединить ["двоичного нет: ", («Binary» от answers)] по "")])), + («When» от ((asked равен "work") и притом (пусто («Work» от answers))) и ([(соединить ["рабочий каталог не заведён: ", («Errors of» от "work" и answers)] по "")])), + («When» от ((asked начинается с "written ") и притом failed) и ([(соединить ["ядро не записало доказательства ", («After» от "written " и asked), " (код ", (к строке («Exit code of» от asked и answers)), ")"] по "")])), + («When» от (asked начинается с "text ") и (отобразить (отфильтровать («Edited trials» от answers) где trial → ((соединить ["text ", (trial.«written»)] по "") равен asked) и притом ((«Forged» от (trial.«edit») и («Text of» от trial и answers)) равен («Text of» от trial и answers))) как trial → соединить ["«", (trial.«title»), "» не собралась: правка ", (trial.«edit»), " ничего не изменила в записи ", (trial.«written»)] по ""))] и (пустой список) + +тотальная функция «Troubles» + принимает answers: список «Answer» + возвращает список строки + пример «Nothing asked, no troubles» + дано answers равно пустой список + ожидается пустой список + «Gathered words» от (отобразить answers как answer → «Trouble» от (answer.«name») и answers) + +тотальная функция «Judged» + принимает lines: список строки, failed: число, refused: число, recorded: число, forged: число + возвращает «Продолжение» + пример «Every trial agreed and every honest record was accepted» + дано lines равно ["СОШЛОСЬ честная — код 0, как и ждали"] + дано failed равно 0 + дано refused равно 0 + дано recorded равно 49 + дано forged равно 4 + ожидается вариант «Конец работы» с значение равным "СОШЛОСЬ честная — код 0, как и ждали\n\nсошлось всё: честное принято (49 записей из 49), подделок отвергнуто 4" + пример «Failed trials and refused honest records are counted together» + дано lines равно ["ПРОВАЛ честная — ждали код 0, получили 1"] + дано failed равно 1 + дано refused равно 2 + дано recorded равно 49 + дано forged равно 4 + ожидается вариант «Провал» с код равным "FLANG_RECORD_FORGERIES" и сообщение равным "ПРОВАЛ честная — ждали код 0, получили 1\n\nопытов не сошлось: 3" + если (failed плюс refused) равен 0 + то вариант «Конец работы» с значение равным (соединить («Соединить списки» от lines и ["", (соединить ["сошлось всё: честное принято (", (к строке recorded), " записей из ", (к строке recorded), "), подделок отвергнуто ", (к строке forged)] по "")]) по "\n") + иначе вариант «Провал» с код равным "FLANG_RECORD_FORGERIES" и сообщение равным (соединить («Соединить списки» от lines и ["", (соединить ["опытов не сошлось: ", (к строке (failed плюс refused))] по "")]) по "\n") + +тотальная функция «Verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + пример «Nothing was asked, so nothing was measured» + дано answers равно пустой список + ожидается вариант «Не проверено» с код равным "FLANG_RECORD_FORGERIES_NOT_MEASURED" и сообщение равным "в run.tsv нет ни одной строки данных" + разбор («Troubles» от answers) + случай голова и хвост + то вариант «Не проверено» с код равным "FLANG_RECORD_FORGERIES_NOT_MEASURED" и сообщение равным голова + случай пусто + то если (длина («Trials» от answers)) равен 0 + то вариант «Не проверено» с код равным "FLANG_RECORD_FORGERIES_NOT_MEASURED" и сообщение равным "в run.tsv нет ни одной строки данных" + иначе «Judged» от («Gathered words» от [(«Written lines» от answers), [""], («Gathered words» от (отобразить («Trials» от answers) как trial → «Trial lines» от trial и («Exit code of» от (соединить ["trial ", (к строке (trial.«index»))] по "") и answers) и («Plan said by» от (соединить ["trial ", (к строке (trial.«index»))] по "") и answers))), [""], («Catalogue lines» от answers)]) и («Failed trials» от answers) и (длина («Refused» от answers)) и (длина («Recorded» от answers)) и (длина (отфильтровать («Trials» от answers) где trial → (trial.«code») равен "1")) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + пример «An empty queue at the last stage gives the verdict» + дано queue равно пустой список + дано stages равно 0 + дано answers равно пустой список + ожидается вариант «Не проверено» с код равным "FLANG_RECORD_FORGERIES_NOT_MEASURED" и сообщение равным "в run.tsv нет ни одной строки данных" + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Verdict» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + пример «Ten stages lie ahead» + ожидается запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 10 и «answers» равным пустой список + «Begin with» от 10 + +тотальная функция «Step» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + пример «A trouble before the working directory exists stops the plan at once» + дано inquiry равно запись «Inquiry» с «asked» равным "table" и «queue» равным пустой список и «stages» равным 9 и «answers» равным пустой список + дано reply равно вариант «Сбой» с код равным "FLANG_IO_READ" и сообщение равным "файл не прочитан" + ожидается вариант «Не проверено» с код равным "FLANG_RECORD_FORGERIES_NOT_MEASURED" и сообщение равным "таблицы нет: run.tsv" + пример «A trouble after it goes through the cleaning first» + дано inquiry равно запись «Inquiry» с «asked» равным "written examples/a.flang" и «queue» равным пустой список и «stages» равным 6 и «answers» равным [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + дано reply равно вариант «Процесс завершён» с код равным 1 и вывод равным "" и ошибки равным "" + ожидается вариант «Сделать» с поручение равным (вариант «Запустить процесс» с программа равным "rm" и аргументы равным ["-rf", "/w"]) и потом равным (запись «Inquiry» с «asked» равным "cleaned" и «queue» равным пустой список и «stages» равным 0 и «answers» равным [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w"), запись «Answer» с «name» равным "written examples/a.flang" и «reply» равным (вариант «Процесс завершён» с код равным 1 и вывод равным "" и ошибки равным "")]) + пусть answers равно («Heard» от inquiry и reply) + разбор («Trouble» от (inquiry.«asked») и answers) + случай пусто + то «Proceed» от (inquiry.«queue») и (inquiry.«stages») и answers + случай голова и хвост + то если пусто («Work» от answers) + то вариант «Не проверено» с код равным "FLANG_RECORD_FORGERIES_NOT_MEASURED" и сообщение равным голова + иначе «Proceed» от («Cleaning» от answers) и 0 и answers + +план «Forgeries» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Step» diff --git a/flang/proof/forgeries/run.sh b/flang/proof/forgeries/run.sh deleted file mode 100755 index c5fd0ea41..000000000 --- a/flang/proof/forgeries/run.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# ЧЕТЫРЕ ПОДДЕЛКИ И ЧЕСТНАЯ ПОЛОВИНА — настоящим прогоном, а не описанием. -# -# sh flang/proof/forgeries/run.sh -# код 0 — честное доказательство принято, все четыре подделки отвергнуты; -# код 1 — что-то из этого неверно, и оно названо строкой. -# -# ЧЕСТНАЯ ПОЛОВИНА ОБЯЗАТЕЛЬНА. Сверщик, отвергающий всё подряд, выглядел бы -# исправным на одних подделках; сверщик, принимающий всё подряд, хуже -# отсутствующего. Обе половины считаются здесь, и одна без другой ничего не -# значит. -# -# Имена переменных латиницей: ни dash, ни bash не принимают кириллицу в именах. -set -eu - -KOREN=$(CDPATH= cd -- "$(dirname -- "$0")/../../.." && pwd) -FLANG=${FLANG:-$KOREN/bootstrap/flang} -SVERIT=$KOREN/flang/proof/check.fscript -CHESTNYY=$KOREN/flang/proof/examples/body-forms.flang -CHUZHOY=$KOREN/flang/proof/examples/corpus-factorial.flang -KRUG=$KOREN/flang/proof/forgeries/circle.flang -KRUG_ZAPIS=$KOREN/flang/proof/forgeries/circle.record - -[ -x "$FLANG" ] || { echo "двоичного нет: $FLANG" >&2; exit 2; } - -RABOTA=$(mktemp -d -p "${FLANG_TMP:-/srv/tmp}" poddelki.XXXXXX) -trap 'rm -rf "$RABOTA"' EXIT INT TERM - -BAD=0 -say() { printf '%s\n' "$*"; } - -# Один опыт: имя, исходник, запись, ожидаемый код возврата сверщика. -sverit() { - imya=$1; ish=$2; zap=$3; zhdyom=$4 - vyvod=$("$FLANG" io "$SVERIT" --timeout 14400000 -- "$ish" "$zap" 2>&1) && kod=0 || kod=$? - if [ "$kod" -eq "$zhdyom" ]; then - say "СОШЛОСЬ $imya — код $kod, как и ждали" - else - say "ПРОВАЛ $imya — ждали код $zhdyom, получили $kod" - BAD=$((BAD + 1)) - fi - say " $(printf '%s' "$vyvod" | head -1 | cut -c1-220)" -} - -say "исходник честной половины: $CHESTNYY" -"$FLANG" check "$CHESTNYY" --proof --записать "$RABOTA/честная" > /dev/null -say "записано доказательство: $(wc -l < "$RABOTA/честная") строк" -say "" - -# ── честная половина ──────────────────────────────────────────────────────── -sverit "честная: настоящее доказательство настоящей программы" "$CHESTNYY" "$RABOTA/честная" 0 - -# ── подделка 1: подменённый шаг ───────────────────────────────────────────── -# Один шаг записи получает ЧУЖОЕ обоснование. В исходнике на той строке -# написано другое, и сверщик обязан это увидеть. -sed '0,/^\( *\)шаг \(.*\) по предположению$/s//\1шаг \2 по свойству «высота неотрицательна»/' \ - "$RABOTA/честная" > "$RABOTA/подменённый" -if cmp -s "$RABOTA/честная" "$RABOTA/подменённый"; then - say "подделка 1 не собралась: шага «по предположению» в записи нет" - exit 2 -fi -sverit "подделка 1: подменённый шаг" "$CHESTNYY" "$RABOTA/подменённый" 1 - -# ── подделка 2: доказательство не от той программы ────────────────────────── -sverit "подделка 2: верная запись подложена к другому исходнику" "$CHUZHOY" "$RABOTA/честная" 1 - -# ── подделка 3: обрублено, не дойдя до цели ───────────────────────────────── -# Из записи выброшен последний шаг: цель в этом случае не закрыта ничем. -grep -n '^ *шаг ' "$RABOTA/честная" | tail -1 | cut -d: -f1 > "$RABOTA/номер" -sed "$(cat "$RABOTA/номер")d" "$RABOTA/честная" > "$RABOTA/обрубленная" -sverit "подделка 3: обрубленное доказательство" "$CHESTNYY" "$RABOTA/обрубленная" 1 - -# ── подделка 4: круг ──────────────────────────────────────────────────────── -sverit "подделка 4: шаг обосновывает сам себя" "$KRUG" "$KRUG_ZAPIS" 1 - - -# ── честная половина ЦЕЛИКОМ: весь каталог примеров ───────────────────────── -# Одной честной программы мало: сверщик, принимающий ровно её, выглядел бы -# исправным. Здесь его спрашивают о КАЖДОЙ программе каталога, и число сошедшихся -# называется. Отвергнутая честная запись — такая же беда, как принятая подделка. -say "" -say "── весь каталог flang/proof/examples ──" -VSEGO=0; ZAPISEY=0; PRINYATO=0 -# Четыре равноправных расширения программы: `.flang`, `.fp`, `.фп`, `.фланг` (ADR-0016). -# Несовпавший образец оболочка оставляет собой — потому проверка на файл. -for f in "$KOREN"/flang/proof/examples/*.flang "$KOREN"/flang/proof/examples/*.fp "$KOREN"/flang/proof/examples/*.фп "$KOREN"/flang/proof/examples/*.фланг; do - [ -e "$f" ] || continue - VSEGO=$((VSEGO + 1)) - if "$FLANG" check "$f" --proof --записать "$RABOTA/подряд" > /dev/null 2>&1; then - ZAPISEY=$((ZAPISEY + 1)) - if vyvod=$("$FLANG" io "$SVERIT" --timeout 14400000 -- "$f" "$RABOTA/подряд" 2>&1); then - PRINYATO=$((PRINYATO + 1)) - else - say "ОТВЕРГНУТА честная запись $(basename "$f"): $(printf '%s' "$vyvod" | head -1 | cut -c1-200)" - BAD=$((BAD + 1)) - fi - else - say "записи нет у $(basename "$f") — check не прошёл" - fi -done -say "программ $VSEGO, записей $ZAPISEY, принято сверщиком $PRINYATO" - -say "" -if [ "$BAD" -eq 0 ]; then - say "сошлось всё: честное принято ($PRINYATO записей из $ZAPISEY), четыре подделки отвергнуты" - exit 0 -fi -say "опытов не сошлось: $BAD" -exit 1 -# короткая команда «proof-record:check» sh — записанное доказательство сверяется отдельной программой: честное принято, четыре подделки отвергнуты diff --git a/flang/proof/forgeries/run.tsv b/flang/proof/forgeries/run.tsv new file mode 100644 index 000000000..a00d598eb --- /dev/null +++ b/flang/proof/forgeries/run.tsv @@ -0,0 +1,6 @@ +name source record edit code +честная: настоящее доказательство настоящей программы examples/body-forms.flang examples/body-forms.flang - 0 +подделка 1: подменённый шаг examples/body-forms.flang examples/body-forms.flang swapped-step 1 +подделка 2: верная запись подложена к другому исходнику examples/corpus-factorial.flang examples/body-forms.flang - 1 +подделка 3: обрубленное доказательство examples/body-forms.flang examples/body-forms.flang last-step-dropped 1 +подделка 4: шаг обосновывает сам себя forgeries/circle.flang forgeries/circle.record - 1 diff --git a/flang/proof/kernel-verdict-forgery.fscript b/flang/proof/kernel-verdict-forgery.fscript index 95fd7260f..69fdd4317 100644 --- a/flang/proof/kernel-verdict-forgery.fscript +++ b/flang/proof/kernel-verdict-forgery.fscript @@ -214,8 +214,8 @@ пример «The share instrument measures one small tree» дано side равно "honest" дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] - ожидается запись «Question» с «name» равным "honest share" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "sh \"$0\" --корень \"$1\" --ведомость \"$2\" --набор \"$3\" --разбор \"$4\" > /dev/null 2>&1", "/flang/proof/corpus-share.sh", "/w/honest", "/w/honest.tsv", "/w/honest/records", "/w/honest.dump"]) - «Run» от (соединить [side, " share"] по "") и "sh" и ["-c", "sh \"$0\" --корень \"$1\" --ведомость \"$2\" --набор \"$3\" --разбор \"$4\" > /dev/null 2>&1", (соединить [(«Absolute root» от answers), "/flang/proof/corpus-share.sh"] по ""), («In work» от side и answers), («In work» от (соединить [side, ".tsv"] по "") и answers), («In work» от (соединить [side, "/records"] по "") и answers), («In work» от (соединить [side, ".dump"] по "") и answers)] + ожидается запись «Question» с «name» равным "honest share" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd \"$0\" && exec ./bootstrap/flang io flang/proof/share-measure.fscript --max-steps 4000000000 --timeout 900000 -- --root \"$1\" --ledger \"$2\" --set \"$3\" --dump \"$4\" > /dev/null 2>&1", "", "/w/honest", "/w/honest.tsv", "/w/honest/records", "/w/honest.dump"]) + «Run» от (соединить [side, " share"] по "") и "sh" и ["-c", "cd \"$0\" && exec ./bootstrap/flang io flang/proof/share-measure.fscript --max-steps 4000000000 --timeout 900000 -- --root \"$1\" --ledger \"$2\" --set \"$3\" --dump \"$4\" > /dev/null 2>&1", («Absolute root» от answers), («In work» от side и answers), («In work» от (соединить [side, ".tsv"] по "") и answers), («In work» от (соединить [side, "/records"] по "") и answers), («In work» от (соединить [side, ".dump"] по "") и answers)] тотальная функция «Verdict run» принимает side: строка, answers: список «Answer» diff --git a/flang/proof/replay-share.fscript b/flang/proof/replay-share.fscript new file mode 100644 index 000000000..46c02a94c --- /dev/null +++ b/flang/proof/replay-share.fscript @@ -0,0 +1,543 @@ +модуль «Replay share» + использует «Rules» из "../../scripts/rules.fscript" + использует «Inquiry» из "../../scripts/inquiry.fscript" + использует «Reading» из "../../scripts/reading.fscript" + использует «Tables» из "../../scripts/tables.fscript" + использует «Plan output» из "../../scripts/plan-output.fscript" + использует «Memory headroom» из "../../scripts/memory-headroom.fscript" только «Whole», «Rounded», «Two digits», «Hundredths» + использует «Checker probes» из "checker/tests/run.fscript" только «Provenance lines» + использует «Lists» только «Соединить списки» + +объект «Measured» + «name»: строка + «statements»: число + «totalities»: число + «discharges»: число + «declared»: число + «source»: строка + «code»: число + «said»: строка + +объект «Share» + «numerator»: число + «denominator»: число + «records»: число + «vouched»: число + «refused»: число + «moves»: число + «carrying»: число + «premises»: число + «steps»: число + «calculated»: число + «by example»: число + «by property»: число + «declared»: число + «refused denominator»: число + «nodes»: число + «boolean»: число + «unreachable»: число + «set records»: число + «set numerator»: число + «set denominator»: число + «lying»: число + «lying refused»: число + «lying accepted»: число + «facts»: число + «discharged numerator»: число + «discharged denominator»: число + «discharged unreachable»: число + +тотальная функция «Measure command» + возвращает строка + пример «Every record of a set is counted and checked» + ожидается "cd \"$0\" || exit 2; for z in $(find \"$1\" -name '*.record' | sort); do b=$(basename \"$z\"); d=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); u=$(grep -a -m1 '^утверждений ' \"$z\" | sed 's/^утверждений //'); t=$(grep -a -m1 '^тотальностей ' \"$z\" | sed 's/^тотальностей //'); s=$(grep -ac '^снятие «' \"$z\"); o=$(grep -ac '^ по объявлению ' \"$z\"); printf '\\036 record %s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \"$b\" \"${u:-0}\" \"${t:-0}\" \"$s\" \"$o\" \"$d\"; if [ -f \"$d\" ]; then ./flang/proof/checker/сверщик \"$PWD/$d\" \"$z\" 2>&1; k=$?; else k=2; fi; printf '\\n\\036 code %s\\n' \"$k\"; done > \"$2\"" + "cd \"$0\" || exit 2; for z in $(find \"$1\" -name '*.record' | sort); do b=$(basename \"$z\"); d=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); u=$(grep -a -m1 '^утверждений ' \"$z\" | sed 's/^утверждений //'); t=$(grep -a -m1 '^тотальностей ' \"$z\" | sed 's/^тотальностей //'); s=$(grep -ac '^снятие «' \"$z\"); o=$(grep -ac '^ по объявлению ' \"$z\"); printf '\\036 record %s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \"$b\" \"${u:-0}\" \"${t:-0}\" \"$s\" \"$o\" \"$d\"; if [ -f \"$d\" ]; then ./flang/proof/checker/сверщик \"$PWD/$d\" \"$z\" 2>&1; k=$?; else k=2; fi; printf '\\n\\036 code %s\\n' \"$k\"; done > \"$2\"" + +тотальная функция «Carrier command» + возвращает строка + пример «The first record whose numerator rests on its moves» + ожидается "cd \"$0\" || exit 2; n() { sed -n 's/.*сведений проиграно заново \\([0-9]*\\) (ходов.*/\\1/p'; }; for z in $(find \"$1\" -name '*.record' | sort); do d=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); [ -f \"$d\" ] || continue; a=$(./flang/proof/checker/сверщик \"$PWD/$d\" \"$z\" 2>&1 | n); a=${a:-0}; [ \"$a\" -gt 0 ] || continue; grep -av '^ ход ' \"$z\" > \"$2/probe.record\"; c=$(./flang/proof/checker/сверщик \"$PWD/$d\" \"$2/probe.record\" 2>&1 | n); c=${c:-0}; if [ \"$c\" -lt \"$a\" ]; then mkdir -p \"$2/honest\" \"$2/forged\" && cp \"$z\" \"$2/honest/carrier.record\" && grep -av '^ ход ' \"$z\" > \"$2/forged/carrier.record\" && basename \"$z\"; exit 0; fi; done; exit 1" + "cd \"$0\" || exit 2; n() { sed -n 's/.*сведений проиграно заново \\([0-9]*\\) (ходов.*/\\1/p'; }; for z in $(find \"$1\" -name '*.record' | sort); do d=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); [ -f \"$d\" ] || continue; a=$(./flang/proof/checker/сверщик \"$PWD/$d\" \"$z\" 2>&1 | n); a=${a:-0}; [ \"$a\" -gt 0 ] || continue; grep -av '^ ход ' \"$z\" > \"$2/probe.record\"; c=$(./flang/proof/checker/сверщик \"$PWD/$d\" \"$2/probe.record\" 2>&1 | n); c=${c:-0}; if [ \"$c\" -lt \"$a\" ]; then mkdir -p \"$2/honest\" \"$2/forged\" && cp \"$z\" \"$2/honest/carrier.record\" && grep -av '^ ход ' \"$z\" > \"$2/forged/carrier.record\" && basename \"$z\"; exit 0; fi; done; exit 1" + +тотальная функция «Measured of» + принимает chunk: строка + возвращает «Measured» + пример «A record with its counts and what the checker said» + дано chunk равно "a.record\t4\t1\t0\t2\tflang/a.flang\nПРОВЕРЕНО\n\n\u001e code 0\n" + ожидается запись «Measured» с «name» равным "a.record" и «statements» равным 4 и «totalities» равным 1 и «discharges» равным 0 и «declared» равным 2 и «source» равным "flang/a.flang" и «code» равным 0 и «said» равным "ПРОВЕРЕНО\n" + пусть halves равно (разделить chunk по "\n\u001e code ") + пусть head равно (разделить («Cell» от 1 и halves) по "\n") + пусть cells равно (разделить («Cell» от 1 и head) по "\t") + запись «Measured» с «name» равным («Cell» от 1 и cells) и «statements» равным («Count» от («Cell» от 2 и cells)) и «totalities» равным («Count» от («Cell» от 3 и cells)) и «discharges» равным («Count» от («Cell» от 4 и cells)) и «declared» равным («Count» от («Cell» от 5 и cells)) и «source» равным («Cell» от 6 и cells) и «code» равным («Count» от («Without blanks» от («Cell» от 2 и halves))) и «said» равным (соединить («Without first» от head) по "\n") + +тотальная функция «Without first» + принимает items: список строки + возвращает список строки + пример «The first line is dropped» + дано items равно ["1", "a", "b"] + ожидается ["a", "b"] + разбор items + случай голова и хвост + то хвост + случай пусто + то пустой список + +тотальная функция «Measured records» + принимает text: строка + возвращает список «Measured» + пример «Nothing measured» + дано text равно "" + ожидается пустой список + отобразить (отфильтровать (разделить text по "\u001e record ") где chunk → не (пусто chunk)) как chunk → «Measured of» от chunk + +тотальная функция «Digits after» + принимает mark: строка, text: строка + возвращает число + пример «The digits right after the mark» + дано mark равно "Шагов по примеру проверено по существу " + дано text равно "x. Шагов по примеру проверено по существу 12. y" + ожидается 12 + пример «No mark, naught» + дано mark равно "проиграно " + дано text равно "ничего" + ожидается 0 + пусть parts равно (разделить text по mark) + если (длина parts) меньше 2 то 0 иначе («Count» от («Leading digits» от (если (длина («Cell» от (длина parts) и parts)) больше 24 то (подстрока («Cell» от (длина parts) и parts) с 1 по 24) иначе («Cell» от (длина parts) и parts)))) + +тотальная функция «Sum after» + принимает mark: строка, text: строка + возвращает число + пример «Every occurrence is summed» + дано mark равно "снято со слова ядра мест " + дано text равно "снято со слова ядра мест 2; снято со слова ядра мест 3" + ожидается 5 + свёртка («Without first» от (разделить text по mark)) начиная с 0 как total и part → total плюс («Count» от («Leading digits» от (если (длина part) больше 24 то (подстрока part с 1 по 24) иначе part))) + +тотальная функция «Class of» + принимает name: строка, manifest: строка + возвращает строка + пример «The class the manifest gives a record» + дано name равно "x.record" + дано manifest равно "source\trecord\tclass\nflang/a.flang\tflang/r/x.record\trecord-lies\n" + ожидается "record-lies" + «Cell» от 1 и (отобразить (отфильтровать («Rows» от manifest) где row → («File name» от («Cell» от 2 и row)) равен name) как row → «Cell» от 3 и row) + +тотальная функция «File name» + принимает path: строка + возвращает строка + пример «The last part of a path» + дано path равно "flang/r/x.record" + ожидается "x.record" + «Cell» от (длина (разделить path по "/")) и (разделить path по "/") + +тотальная функция «Empty share» + возвращает «Share» + пример «Every count starts at naught» + ожидается запись «Share» с «numerator» равным 0 и «denominator» равным 0 и «records» равным 0 и «vouched» равным 0 и «refused» равным 0 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + запись «Share» с «numerator» равным 0 и «denominator» равным 0 и «records» равным 0 и «vouched» равным 0 и «refused» равным 0 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + +тотальная функция «Inner number» + принимает outer: строка, inner: строка, text: строка + возвращает число + пример «The number inside the brackets after a mark» + дано outer равно "Выводов факта о типе проиграно заново " + дано inner равно "(снято со слова ядра мест " + дано text равно "Выводов факта о типе проиграно заново 3 (снято со слова ядра мест 2)." + ожидается 2 + пусть parts равно (разделить text по outer) + если (длина parts) меньше 2 то 0 иначе («Digits after» от inner и («Cell» от 1 и (разделить («Cell» от (длина parts) и parts) по ")"))) + +тотальная функция «Added» + принимает share: «Share», measured: «Measured», manifest: строка + возвращает «Share» + пример «A refused record of a lying class leaves the denominator» + дано share равно запись «Share» с «numerator» равным 0 и «denominator» равным 0 и «records» равным 0 и «vouched» равным 0 и «refused» равным 0 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + дано measured равно запись «Measured» с «name» равным "x.record" и «statements» равным 2 и «totalities» равным 1 и «discharges» равным 1 и «declared» равным 0 и «source» равным "a.flang" и «code» равным 1 и «said» равным "" + дано manifest равно "source\trecord\tclass\na.flang\tr/x.record\trecord-lies\n" + ожидается запись «Share» с «numerator» равным 0 и «denominator» равным 0 и «records» равным 1 и «vouched» равным 0 и «refused» равным 1 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 3 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 3 и «set records» равным 1 и «set numerator» равным 0 и «set denominator» равным 3 и «lying» равным 1 и «lying refused» равным 1 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 1 + пусть kind равно («Class of» от (measured.«name») и manifest) + пусть lies равно (если kind равен "record-lies" то 1 иначе 0) + пусть inset равно (если пусто kind то 0 иначе 1) + пусть code равно (measured.«code») + если (code равен 0) или (code равен 3) + то «Vouched» от share и measured и lies и inset + иначе «Refused» от share и measured и lies и inset + +тотальная функция «Refused» + принимает share: «Share», measured: «Measured», lies: число, inset: число + возвращает «Share» + пример «An honest refused record stays in the denominator» + дано share равно запись «Share» с «numerator» равным 0 и «denominator» равным 0 и «records» равным 0 и «vouched» равным 0 и «refused» равным 0 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + дано measured равно запись «Measured» с «name» равным "x.record" и «statements» равным 2 и «totalities» равным 0 и «discharges» равным 1 и «declared» равным 1 и «source» равным "a.flang" и «code» равным 1 и «said» равным "" + дано lies равно 0 + дано inset равно 0 + ожидается запись «Share» с «numerator» равным 0 и «denominator» равным 2 и «records» равным 1 и «vouched» равным 0 и «refused» равным 1 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 1 и «refused denominator» равным 2 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 1 и «discharged unreachable» равным 0 + пусть owed равно ((measured.«statements») плюс (measured.«totalities»)) + запись «Share» с «numerator» равным (share.«numerator») и «denominator» равным ((share.«denominator») плюс (owed умножить на (1 минус lies))) и «records» равным ((share.«records») плюс 1) и «vouched» равным (share.«vouched») и «refused» равным ((share.«refused») плюс 1) и «moves» равным (share.«moves») и «carrying» равным (share.«carrying») и «premises» равным (share.«premises») и «steps» равным (share.«steps») и «calculated» равным (share.«calculated») и «by example» равным (share.«by example») и «by property» равным (share.«by property») и «declared» равным ((share.«declared») плюс (measured.«declared»)) и «refused denominator» равным ((share.«refused denominator») плюс owed) и «nodes» равным (share.«nodes») и «boolean» равным (share.«boolean») и «unreachable» равным ((share.«unreachable») плюс (owed умножить на lies)) и «set records» равным ((share.«set records») плюс inset) и «set numerator» равным (share.«set numerator») и «set denominator» равным ((share.«set denominator») плюс (owed умножить на inset)) и «lying» равным ((share.«lying») плюс lies) и «lying refused» равным ((share.«lying refused») плюс lies) и «lying accepted» равным (share.«lying accepted») и «facts» равным (share.«facts») и «discharged numerator» равным (share.«discharged numerator») и «discharged denominator» равным ((share.«discharged denominator») плюс ((measured.«discharges») умножить на (1 минус lies))) и «discharged unreachable» равным ((share.«discharged unreachable») плюс ((measured.«discharges») умножить на lies)) + +тотальная функция «Vouched» + принимает share: «Share», measured: «Measured», lies: число, inset: число + возвращает «Share» + пример «A vouched record adds what it replayed» + дано share равно запись «Share» с «numerator» равным 0 и «denominator» равным 0 и «records» равным 0 и «vouched» равным 0 и «refused» равным 0 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + дано measured равно запись «Measured» с «name» равным "x.record" и «statements» равным 2 и «totalities» равным 0 и «discharges» равным 0 и «declared» равным 0 и «source» равным "a.flang" и «code» равным 0 и «said» равным "сведений проиграно заново 3 (ходов проверено 5). НА СЛОВО ЯДРА: посылок и утверждений 1, шагов 2." + дано lies равно 0 + дано inset равно 0 + ожидается запись «Share» с «numerator» равным 3 и «denominator» равным 6 и «records» равным 1 и «vouched» равным 1 и «refused» равным 0 и «moves» равным 5 и «carrying» равным 1 и «premises» равным 1 и «steps» равным 2 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + пусть said равно (measured.«said») + пусть replayed равно («Digits after» от "сведений проиграно заново " и said) + пусть moves равно («Digits after» от "(ходов проверено " и said) + пусть premises равно («Digits after» от "НА СЛОВО ЯДРА: посылок и утверждений " и said) + пусть steps равно («Inner number» от "НА СЛОВО ЯДРА: посылок и утверждений " и ", шагов " и said) + пусть branchy равно («Digits after» от "из них булевой веткой снято мест " и said) + пусть nodal равно ((«Inner number» от "Узлов вердикта «разбором по случаям» проиграно заново " и "(снято со слова ядра мест " и said) минус branchy) + пусть facts равно («Inner number» от "Выводов факта о типе проиграно заново " и "(снято со слова ядра мест " и said) + пусть calculated равно (((«Sum after» от "снято со слова ядра мест " и said) минус nodal) минус facts) + пусть posed равно («Digits after» от "Снятий предусловий " и said) + пусть regained равно («Inner number» от "Снятий предусловий " и ": проиграно заново " и said) + пусть unpaid равно («Inner number» от "Снятий предусловий " и "мест вызова без блока снятия " и said) + пусть sampled равно («Digits after» от "Шагов по примеру проверено по существу " и said) + пусть propertied равно («Digits after» от "Шагов по свойству проверено по существу " и said) + пусть open равно ((((((premises плюс steps) плюс calculated) плюс sampled) плюс propertied) плюс nodal) плюс facts) + запись «Share» с «numerator» равным ((share.«numerator») плюс replayed) и «denominator» равным (((share.«denominator») плюс replayed) плюс open) и «records» равным ((share.«records») плюс 1) и «vouched» равным ((share.«vouched») плюс 1) и «refused» равным (share.«refused») и «moves» равным ((share.«moves») плюс moves) и «carrying» равным ((share.«carrying») плюс (если replayed больше 0 то 1 иначе 0)) и «premises» равным ((share.«premises») плюс premises) и «steps» равным ((share.«steps») плюс steps) и «calculated» равным ((share.«calculated») плюс calculated) и «by example» равным ((share.«by example») плюс sampled) и «by property» равным ((share.«by property») плюс propertied) и «declared» равным ((share.«declared») плюс (measured.«declared»)) и «refused denominator» равным (share.«refused denominator») и «nodes» равным ((share.«nodes») плюс nodal) и «boolean» равным ((share.«boolean») плюс branchy) и «unreachable» равным (share.«unreachable») и «set records» равным ((share.«set records») плюс inset) и «set numerator» равным ((share.«set numerator») плюс (((((replayed плюс sampled) плюс propertied) плюс nodal) плюс facts) умножить на inset)) и «set denominator» равным ((share.«set denominator») плюс ((replayed плюс open) умножить на inset)) и «lying» равным ((share.«lying») плюс lies) и «lying refused» равным (share.«lying refused») и «lying accepted» равным ((share.«lying accepted») плюс (если (measured.«code») равен 0 то lies иначе 0)) и «facts» равным ((share.«facts») плюс facts) и «discharged numerator» равным ((share.«discharged numerator») плюс regained) и «discharged denominator» равным (((share.«discharged denominator») плюс posed) плюс unpaid) и «discharged unreachable» равным (share.«discharged unreachable») + +тотальная функция «Percent» + принимает part: число, whole: число + возвращает строка + пример «Two decimals» + дано part равно 650 + дано whole равно 651 + ожидается "99.85" + пример «No whole, no share» + дано part равно 0 + дано whole равно 0 + ожидается "—" + если whole равен 0 то "—" иначе («Hundredths» от («Rounded» от ((part умножить на 10000) делить на whole))) + +тотальная функция «Report lines» + принимает t: «Share», path: строка, manifest: строка, listed: число, kept: строка, numerated: строка + возвращает список строки + пример «An empty set» + дано t равно запись «Share» с «numerator» равным 0 и «denominator» равным 0 и «records» равным 0 и «vouched» равным 0 и «refused» равным 0 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + дано path равно "/r" + дано manifest равно "/m" + дано listed равно 0 + дано kept равно "—" + дано numerated равно "—" + ожидается ["═══ ДОЛЯ-ПРОИГРЫВАНИЕМ по корпусу ═══", "каталог записей /r", "записей в наборе 0 (чекер поручился 0, отверг либо не позвал 0)", "", "ЧИСЛИТЕЛЬ — Σ независимо проверенного чекером (ходами/тотальностью + по существу + узлы): 0", " ├ проиграно ходами/тотальностью: 0", " ├ проверено по существу вычислением («по примеру»/«по свойству»): 0", " ├ структурный переигрыш узлов тотальности (дно/спуск по телу функции): 0", " └ переигранные выводы факта о типе (по шагу на правило): 0", "ЗНАМЕНАТЕЛЬ — Σ обязательств корпуса за вычетом недостижимых: 0", "доля-проигрыванием = 0 / 0 = — %", "доля с предусловиями = 0 / 0 = — % (снятий в знаменателе 0, переиграно 0, вынесено недостижимых 0)", "", "-- из чего сложен знаменатель --", "проверено чекером (в числителе) 0", "не проверено у поручённых записей (на слово + калькулятор) 0", "обязательства отвергнутых записей (по шапкам) 0", " из них ВЫНЕСЕНО из знаменателя как недостижимые 0", " из них осталось в знаменателе 0", "", "-- вынесенные из знаменателя места: сколько и почему --", "исключено мест 0", "почему: чекер отверг эти записи ЦЕЛИКОМ (код 1 «НЕ СОШЛОСЬ») и манифест", " /m объявил их классом «лжёт-запись».", " Сводки у отвергнутой записи нет, проиграно заново ноль — и ноль", " этот от работы не зависит: место недостижимо, а не открыто.", "записей вынесено 0 из 0 объявленных классом «лжёт-запись»", "", "-- баланс знаменателя (принимается по нему, а не по процентам) --", "знаменатель после сужения 0", "вынесено недостижимых мест 0", "прежний знаменатель (все обязательства корпуса) 0", "сходится: 0 + 0 = 0 — СОШЁЛСЯ", "", "-- набор подделок (ADR-0023): доля без него не печатается --", "поймано 0 из 0 (манифест /m, храповик —)", " класс «лжёт-запись»: отвергнуто 0 из 0, принято кодом 0 — 0", " честные половины подделочных файлов: числитель набора 0 (храповик —)", " обязательств у набора всего 0", "", "-- не проверенное у поручённых записей, поимённо --", "на слово ядра: посылок и утверждений 0", "на слово ядра: шагов 0", "снято калькулятором (тождество/разбор), не игрой 0", " из них булевой веткой узла «разбором по случаям» 0", "", "-- прочая поддержка --", "ходов проверено, всего 0", "записей несут хоть один проигранный ход 0", "строк «по объявлению» в записях (композиция) 0", "", "порог Г4 = 95 %; добрала ли доля порога: НЕТ"] + пусть numerator равно (((((t.«numerator») плюс (t.«by example»)) плюс (t.«by property»)) плюс (t.«nodes»)) плюс (t.«facts»)) + пусть balance равно "СОШЁЛСЯ" + пусть reached равно (если ((t.«denominator») больше 0) и притом ((numerator умножить на 100) не меньше ((t.«denominator») умножить на 95)) то "ДА" иначе "НЕТ") + «Соединить списки» от ["═══ ДОЛЯ-ПРОИГРЫВАНИЕМ по корпусу ═══", + (соединить ["каталог записей ", path] по ""), + (соединить ["записей в наборе ", (к строке (t.«records»)), " (чекер поручился ", (к строке (t.«vouched»)), ", отверг либо не позвал ", (к строке (t.«refused»)), ")"] по ""), + "", + (соединить ["ЧИСЛИТЕЛЬ — Σ независимо проверенного чекером (ходами/тотальностью + по существу + узлы): ", (к строке numerator)] по ""), + (соединить [" ├ проиграно ходами/тотальностью: ", (к строке (t.«numerator»))] по ""), + (соединить [" ├ проверено по существу вычислением («по примеру»/«по свойству»): ", (к строке ((t.«by example») плюс (t.«by property»)))] по ""), + (соединить [" ├ структурный переигрыш узлов тотальности (дно/спуск по телу функции): ", (к строке (t.«nodes»))] по ""), + (соединить [" └ переигранные выводы факта о типе (по шагу на правило): ", (к строке (t.«facts»))] по ""), + (соединить ["ЗНАМЕНАТЕЛЬ — Σ обязательств корпуса за вычетом недостижимых: ", (к строке (t.«denominator»))] по ""), + (соединить ["доля-проигрыванием = ", (к строке numerator), " / ", (к строке (t.«denominator»)), " = ", («Percent» от numerator и (t.«denominator»)), " %"] по ""), + (соединить ["доля с предусловиями = ", (к строке (numerator плюс (t.«discharged numerator»))), " / ", (к строке ((t.«denominator») плюс (t.«discharged denominator»))), " = ", («Percent» от (numerator плюс (t.«discharged numerator»)) и ((t.«denominator») плюс (t.«discharged denominator»))), " % (снятий в знаменателе ", (к строке (t.«discharged denominator»)), ", переиграно ", (к строке (t.«discharged numerator»)), ", вынесено недостижимых ", (к строке (t.«discharged unreachable»)), ")"] по ""), + "", + "-- из чего сложен знаменатель --", + (соединить ["проверено чекером (в числителе) ", (к строке numerator)] по ""), + (соединить ["не проверено у поручённых записей (на слово + калькулятор) ", (к строке (((t.«premises») плюс (t.«steps»)) плюс (t.«calculated»)))] по ""), + (соединить ["обязательства отвергнутых записей (по шапкам) ", (к строке (t.«refused denominator»))] по ""), + (соединить [" из них ВЫНЕСЕНО из знаменателя как недостижимые ", (к строке (t.«unreachable»))] по ""), + (соединить [" из них осталось в знаменателе ", (к строке ((t.«refused denominator») минус (t.«unreachable»)))] по ""), + "", + "-- вынесенные из знаменателя места: сколько и почему --", + (соединить ["исключено мест ", (к строке (t.«unreachable»))] по ""), + "почему: чекер отверг эти записи ЦЕЛИКОМ (код 1 «НЕ СОШЛОСЬ») и манифест", + (соединить [" ", manifest, " объявил их классом «лжёт-запись»."] по ""), + " Сводки у отвергнутой записи нет, проиграно заново ноль — и ноль", + " этот от работы не зависит: место недостижимо, а не открыто.", + (соединить ["записей вынесено ", (к строке (t.«lying refused»)), " из ", (к строке (t.«lying»)), " объявленных классом «лжёт-запись»"] по ""), + "", + "-- баланс знаменателя (принимается по нему, а не по процентам) --", + (соединить ["знаменатель после сужения ", (к строке (t.«denominator»))] по ""), + (соединить ["вынесено недостижимых мест ", (к строке (t.«unreachable»))] по ""), + (соединить ["прежний знаменатель (все обязательства корпуса) ", (к строке ((t.«denominator») плюс (t.«unreachable»)))] по ""), + (соединить ["сходится: ", (к строке (t.«denominator»)), " + ", (к строке (t.«unreachable»)), " = ", (к строке ((t.«denominator») плюс (t.«unreachable»))), " — ", balance] по "")] и («Соединить списки» от (если (t.«refused denominator») равен (t.«unreachable») то (пустой список) иначе [(соединить ["РАСХОЖДЕНИЕ: у отвергнутых записей обязательств ", (к строке (t.«refused denominator»)), ", а объявлено"] по ""), + (соединить [" манифестом недостижимыми ", (к строке (t.«unreachable»)), ". Чекер отверг запись, которой в наборе"] по ""), + " нет: либо её надо завести строкой манифеста, либо чинить саму запись."]) и ["", + "-- набор подделок (ADR-0023): доля без него не печатается --", + (соединить ["поймано ", (к строке (t.«set records»)), " из ", (к строке listed), " (манифест ", manifest, ", храповик ", kept, ")"] по ""), + (соединить [" класс «лжёт-запись»: отвергнуто ", (к строке (t.«lying refused»)), " из ", (к строке (t.«lying»)), ", принято кодом 0 — ", (к строке (t.«lying accepted»))] по ""), + (соединить [" честные половины подделочных файлов: числитель набора ", (к строке (t.«set numerator»)), " (храповик ", numerated, ")"] по ""), + (соединить [" обязательств у набора всего ", (к строке (t.«set denominator»))] по ""), + "", + "-- не проверенное у поручённых записей, поимённо --", + (соединить ["на слово ядра: посылок и утверждений ", (к строке (t.«premises»))] по ""), + (соединить ["на слово ядра: шагов ", (к строке (t.«steps»))] по ""), + (соединить ["снято калькулятором (тождество/разбор), не игрой ", (к строке (t.«calculated»))] по ""), + (соединить [" из них булевой веткой узла «разбором по случаям» ", (к строке (t.«boolean»))] по ""), + "", + "-- прочая поддержка --", + (соединить ["ходов проверено, всего ", (к строке (t.«moves»))] по ""), + (соединить ["записей несут хоть один проигранный ход ", (к строке (t.«carrying»))] по ""), + (соединить ["строк «по объявлению» в записях (композиция) ", (к строке (t.«declared»))] по ""), + "", + (соединить ["порог Г4 = ", "95", " %; добрала ли доля порога: ", reached] по "")]) + +тотальная функция «Root» + возвращает строка + пример «The tree lies two directories up» + ожидается "../.." + "../.." + +тотальная функция «Words given» + принимает answers: список «Answer» + возвращает список строки + пример «No arguments» + дано answers равно пустой список + ожидается пустой список + «Given of» от "arguments" и answers + +тотальная функция «Forging» + принимает answers: список «Answer» + возвращает признак + пример «Without the key the share is measured» + дано answers равно пустой список + ожидается нет + не (пусто (отфильтровать («Words given» от answers) где word → word равен "--forgery")) + +тотальная функция «Set name» + принимает answers: список «Answer» + возвращает строка + пример «The corpus unless another set is named» + дано answers равно пустой список + ожидается "corpus" + пусть named равно («Cell» от 1 и (отфильтровать («Words given» от answers) где word → не (word начинается с "--"))) + если пусто named то "corpus" иначе named + +тотальная функция «Absolute root» + принимает answers: список «Answer» + возвращает строка + пример «The root as the shell sees it» + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным "")] + ожидается "/t" + «First line» от («Output of» от "root" и answers) + +тотальная функция «Set path» + принимает answers: список «Answer» + возвращает строка + пример «The records of the corpus» + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным "")] + ожидается "/t/flang/proof/checker/tests/records/corpus" + соединить [(«Absolute root» от answers), "/flang/proof/checker/tests/records/", («Set name» от answers)] по "" + +тотальная функция «Work» + принимает answers: список «Answer» + возвращает строка + пример «No work directory yet» + дано answers равно пустой список + ожидается "" + «Made of» от "work" и answers + +тотальная функция «In work» + принимает name: строка, answers: список «Answer» + возвращает строка + пример «A file in the work directory» + дано name равно "measured.txt" + дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается "/w/measured.txt" + соединить [(«Work» от answers), "/", name] по "" + +тотальная функция «Measure» + принимает name: строка, directory: строка, written: строка + возвращает «Question» + пример «One set is measured into a file» + дано name равно "measured" + дано directory равно "/r" + дано written равно "/w/m.txt" + ожидается запись «Question» с «name» равным "measured" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd \"$0\" || exit 2; for z in $(find \"$1\" -name '*.record' | sort); do b=$(basename \"$z\"); d=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); u=$(grep -a -m1 '^утверждений ' \"$z\" | sed 's/^утверждений //'); t=$(grep -a -m1 '^тотальностей ' \"$z\" | sed 's/^тотальностей //'); s=$(grep -ac '^снятие «' \"$z\"); o=$(grep -ac '^ по объявлению ' \"$z\"); printf '\\036 record %s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \"$b\" \"${u:-0}\" \"${t:-0}\" \"$s\" \"$o\" \"$d\"; if [ -f \"$d\" ]; then ./flang/proof/checker/сверщик \"$PWD/$d\" \"$z\" 2>&1; k=$?; else k=2; fi; printf '\\n\\036 code %s\\n' \"$k\"; done > \"$2\"", "../..", "/r", "/w/m.txt"]) + «Run» от name и "sh" и ["-c", («Measure command»), («Root»), directory, written] + +тотальная функция «Setup» + возвращает список «Question» + пример «The arguments, the root, the manifest, the ratchets and the checker» + ожидается [запись «Question» с «name» равным "arguments" и «order» равным (вариант «Прочитать доводы»), запись «Question» с «name» равным "temporary" и «order» равным (вариант «Прочитать переменную среды» с имя равным "FLANG_TMP"), запись «Question» с «name» равным "root" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd ../.. && pwd"]), запись «Question» с «name» равным "manifest" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/forgeries/manifest.tsv"), запись «Question» с «name» равным "ratchets" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/ratchets.txt"), запись «Question» с «name» равным "checker present" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["-x", "../../flang/proof/checker/сверщик"]), запись «Question» с «name» равным "checker stale" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["../../flang/proof/checker/checker.c", "-nt", "../../flang/proof/checker/сверщик"])] + [(«Arguments» от "arguments"), («Environment» от "temporary" и "FLANG_TMP"), («Run» от "root" и "sh" и ["-c", "cd ../.. && pwd"]), («Read» от "manifest" и "../../flang/proof/forgeries/manifest.tsv"), («Read» от "ratchets" и "../../flang/proof/ratchets.txt"), («Run» от "checker present" и "test" и ["-x", "../../flang/proof/checker/сверщик"]), («Run» от "checker stale" и "test" и ["../../flang/proof/checker/checker.c", "-nt", "../../flang/proof/checker/сверщик"])] + +тотальная функция «Start» + принимает answers: список «Answer» + возвращает список «Question» + пример «A work directory» + дано answers равно пустой список + ожидается [запись «Question» с «name» равным "work" и «order» равным (вариант «Завести временный каталог» с образец равным "/srv/tmp/replay-share.")] + [(«Temporary directory» от "work" и (соединить [(«Setting of» от "temporary" и "/srv/tmp" и answers), "/replay-share."] по ""))] + +тотальная функция «First pass» + принимает answers: список «Answer» + возвращает список «Question» + пример «Nothing without a work directory» + дано answers равно пустой список + ожидается пустой список + «Chosen» от [(«When» от (пусто («Work» от answers)) и (пустой список)), + («When» от («Forging» от answers) и [(«Run» от "carrier" и "sh" и ["-c", («Carrier command»), («Root»), («Set path» от answers), («Work» от answers)])])] и [(«Run from» от "provenance" и («Root») и "bootstrap/flang" и ["io", "scripts/report-provenance.fscript", "--plan", "Report"]), («Measure» от "measured" и («Set path» от answers) и («In work» от "measured.txt" и answers)), («Read» от "measured text" и («In work» от "measured.txt" и answers))] + +тотальная функция «Second pass» + принимает answers: список «Answer» + возвращает список «Question» + пример «Nothing more without the key» + дано answers равно пустой список + ожидается пустой список + если («Forging» от answers) и притом ((«Exit code of» от "carrier" и answers) равен 0) + то [(«Measure» от "honest" и («In work» от "honest" и answers) и («In work» от "honest.txt" и answers)), («Measure» от "forged" и («In work» от "forged" и answers) и («In work» от "forged.txt" и answers)), («Read» от "honest text" и («In work» от "honest.txt" и answers)), («Read» от "forged text" и («In work» от "forged.txt" и answers))] + иначе пустой список + +тотальная функция «Cleaning» + принимает answers: список «Answer» + возвращает список «Question» + пример «No work directory, nothing to clean» + дано answers равно пустой список + ожидается пустой список + если пусто («Work» от answers) то пустой список иначе [(«Run» от "cleaned" и "rm" и ["-rf", («Work» от answers)])] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + пример «A stage outside the plan asks nothing» + дано stages равно 9 + дано answers равно пустой список + ожидается пустой список + разбор stages + случай 4 + то «Setup» + случай 3 + то «Start» от answers + случай 2 + то «First pass» от answers + случай 1 + то «Second pass» от answers + случай 0 + то «Cleaning» от answers + случай любое + то пустой список + +тотальная функция «Share of» + принимает text: строка, manifest: строка + возвращает «Share» + пример «Nothing measured» + дано text равно "" + дано manifest равно "" + ожидается запись «Share» с «numerator» равным 0 и «denominator» равным 0 и «records» равным 0 и «vouched» равным 0 и «refused» равным 0 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 0 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + свёртка («Measured records» от text) начиная с («Empty share») как share и measured → «Added» от share и measured и manifest + +тотальная функция «Ratchet» + принимает key: строка, text: строка + возвращает строка + пример «A number kept under its key» + дано key равно "forgeries" + дано text равно "forgeries 36\nforgery-numerator 155\n" + ожидается "36" + пример «No such key» + дано key равно "forgeries" + дано text равно "" + ожидается "—" + пусть found равно («Word» от 2 и («Beginning with» от (соединить [key, " "] по "") и («Lines» от text))) + если пусто found то "—" иначе found + +тотальная функция «Main verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + пример «An empty set is not a measure» + дано answers равно пустой список + ожидается вариант «Не проверено» с код равным "FLANG_REPLAY_SHARE_NOT_MEASURED" и сообщение равным "в «/flang/proof/checker/tests/records/corpus» нет ни одной записи" + пусть manifest равно («Output of» от "manifest" и answers) + пусть share равно («Share of» от («Output of» от "measured text" и answers) и manifest) + пусть listed равно (длина (отфильтровать («Rows» от manifest) где row → (длина row) не меньше 3)) + пусть lines равно («Соединить списки» от («Provenance lines» от answers) и («Report lines» от share и («Set path» от answers) и (соединить [(«Absolute root» от answers), "/flang/proof/forgeries/manifest.tsv"] по "") и listed и («Ratchet» от "forgeries" и («Output of» от "ratchets" и answers)) и («Ratchet» от "forgery-numerator" и («Output of» от "ratchets" и answers)))) + «Chosen» от [(«When» от ((share.«records») равен 0) и (вариант «Не проверено» с код равным "FLANG_REPLAY_SHARE_NOT_MEASURED" и сообщение равным (соединить ["в «", («Set path» от answers), "» нет ни одной записи"] по ""))), + («When» от (не ((share.«refused denominator») равен (share.«unreachable»))) и (вариант «Провал» с код равным "FLANG_REPLAY_SHARE" и сообщение равным (соединить lines по "\n")))] и (вариант «Конец работы» с значение равным (соединить lines по "\n")) + +тотальная функция «Probe share» + принимает share: «Share» + возвращает число + пример «Replayed and nodes count, in hundredths of a percent» + дано share равно запись «Share» с «numerator» равным 1 и «denominator» равным 4 и «records» равным 1 и «vouched» равным 1 и «refused» равным 0 и «moves» равным 0 и «carrying» равным 0 и «premises» равным 0 и «steps» равным 0 и «calculated» равным 0 и «by example» равным 0 и «by property» равным 0 и «declared» равным 0 и «refused denominator» равным 0 и «nodes» равным 1 и «boolean» равным 0 и «unreachable» равным 0 и «set records» равным 0 и «set numerator» равным 0 и «set denominator» равным 0 и «lying» равным 0 и «lying refused» равным 0 и «lying accepted» равным 0 и «facts» равным 0 и «discharged numerator» равным 0 и «discharged denominator» равным 0 и «discharged unreachable» равным 0 + ожидается 5000 + если (share.«denominator») больше 0 то («Rounded» от ((((share.«numerator») плюс (share.«nodes»)) умножить на 10000) делить на (share.«denominator»))) иначе 0 + +тотальная функция «Forgery verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + пример «No carrier, no probe» + дано answers равно пустой список + ожидается вариант «Не проверено» с код равным "FLANG_REPLAY_SHARE_NOT_MEASURED" и сообщение равным "проба не построена: в корпусе нет записи, чей числитель держится на ходах" + пусть manifest равно («Output of» от "manifest" и answers) + пусть honest равно («Share of» от («Output of» от "honest text" и answers) и manifest) + пусть forged равно («Share of» от («Output of» от "forged text" и answers) и manifest) + пусть kept равно ((honest.«numerator») плюс (honest.«nodes»)) + пусть dropped равно ((forged.«numerator») плюс (forged.«nodes»)) + пусть lines равно [(соединить ["ПРОБА доли-проигрыванием (носитель: ", («First line» от («Output of» от "carrier" и answers)), ")"] по ""), (соединить [" честная запись — проиграно заново ", (к строке kept), ", знаменатель ", (к строке (honest.«denominator»)), ", доля ", («Hundredths» от («Probe share» от honest)), " %"] по ""), (соединить [" подделка (ходы сняты) — проиграно заново ", (к строке dropped), ", знаменатель ", (к строке (forged.«denominator»)), ", доля ", («Hundredths» от («Probe share» от forged)), " %"] по "")] + «Chosen» от [(«When» от (не ((«Exit code of» от "carrier" и answers) равен 0)) и (вариант «Не проверено» с код равным "FLANG_REPLAY_SHARE_NOT_MEASURED" и сообщение равным "проба не построена: в корпусе нет записи, чей числитель держится на ходах")), + («When» от ((kept больше 0) и притом ((dropped меньше kept) и притом ((«Probe share» от forged) меньше («Probe share» от honest)))) и (вариант «Конец работы» с значение равным (соединить (добавить "ЦЕЛА: снятие ходов уронило и числитель, и долю — прибор мерит игру, а не вердикт" к lines) по "\n")))] и (вариант «Провал» с код равным "FLANG_REPLAY_SHARE_FORGERY" и сообщение равным (соединить (добавить "ПРОВАЛ: на подделке числитель либо доля не упали — прибор держит долю на снятых ходах" к lines) по "\n")) + +тотальная функция «Verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + пример «Without the key the share is judged» + дано answers равно пустой список + ожидается вариант «Не проверено» с код равным "FLANG_REPLAY_SHARE_NOT_MEASURED" и сообщение равным "в «/flang/proof/checker/tests/records/corpus» нет ни одной записи" + если «Forging» от answers то «Forgery verdict» от answers иначе «Main verdict» от answers + +тотальная функция «Obstacles» + принимает asked: строка, answers: список «Answer» + возвращает список строки + пример «No checker» + дано asked равно "checker present" + дано answers равно [запись «Answer» с «name» равным "checker present" и «reply» равным (вариант «Процесс завершён» с код равным 1 и вывод равным "" и ошибки равным "")] + ожидается ["нет чекера /flang/proof/checker/сверщик — собрать: make -C flang/proof/checker"] + пусть checker равно (соединить [(«Absolute root» от answers), "/flang/proof/checker/сверщик"] по "") + «Chosen» от [(«When» от ((asked равен "checker present") и притом (не ((«Exit code of» от asked и answers) равен 0))) и [(соединить ["нет чекера ", checker, " — собрать: make -C flang/proof/checker"] по "")]), + («When» от ((asked равен "checker stale") и притом ((«Exit code of» от asked и answers) равен 0)) и [(соединить ["чекер ", checker, " старше checker.c — пересобрать: make -C flang/proof/checker"] по "")]), + («When» от ((asked равен "work") и притом (пусто («Work» от answers))) и ["временный каталог не заведён"])] и (пустой список) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + пример «An empty queue at the last stage gives the verdict» + дано queue равно пустой список + дано stages равно 0 + дано answers равно пустой список + ожидается вариант «Не проверено» с код равным "FLANG_REPLAY_SHARE_NOT_MEASURED" и сообщение равным "в «/flang/proof/checker/tests/records/corpus» нет ни одной записи" + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Verdict» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + пример «Five stages lie ahead» + ожидается запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 5 и «answers» равным пустой список + «Begin with» от 5 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + пример «The first turn asks for the arguments» + дано inquiry равно запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 5 и «answers» равным пустой список + дано reply равно вариант «Пока ничего» + ожидается вариант «Сделать» с поручение равным (вариант «Прочитать доводы») и потом равным (запись «Inquiry» с «asked» равным "arguments" и «queue» равным [запись «Question» с «name» равным "temporary" и «order» равным (вариант «Прочитать переменную среды» с имя равным "FLANG_TMP"), запись «Question» с «name» равным "root" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd ../.. && pwd"]), запись «Question» с «name» равным "manifest" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/forgeries/manifest.tsv"), запись «Question» с «name» равным "ratchets" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/ratchets.txt"), запись «Question» с «name» равным "checker present" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["-x", "../../flang/proof/checker/сверщик"]), запись «Question» с «name» равным "checker stale" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["../../flang/proof/checker/checker.c", "-nt", "../../flang/proof/checker/сверщик"])] и «stages» равным 4 и «answers» равным пустой список) + пусть answers равно («Heard» от inquiry и reply) + разбор («Obstacles» от (inquiry.«asked») и answers) + случай голова и хвост + то если пусто («Work» от answers) + то вариант «Не проверено» с код равным "FLANG_REPLAY_SHARE_NOT_MEASURED" и сообщение равным голова + иначе вариант «Сделать» с поручение равным (вариант «Запустить процесс» с программа равным "rm" и аргументы равным ["-rf", («Work» от answers)]) и потом равным (запись «Inquiry» с «asked» равным (соединить ["stopped: ", голова] по "") и «queue» равным пустой список и «stages» равным 0 и «answers» равным answers) + случай пусто + то если (inquiry.«asked») начинается с "stopped: " + то вариант «Не проверено» с код равным "FLANG_REPLAY_SHARE_NOT_MEASURED" и сообщение равным («After» от "stopped: " и (inquiry.«asked»)) + иначе «Proceed» от (inquiry.«queue») и (inquiry.«stages») и answers + +план «Replay share» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/flang/proof/share-ledger-forgery.fscript b/flang/proof/share-ledger-forgery.fscript index 1a895d3db..8baf9411b 100644 --- a/flang/proof/share-ledger-forgery.fscript +++ b/flang/proof/share-ledger-forgery.fscript @@ -74,8 +74,8 @@ дано set равно "/w/honest" дано dump равно "/w/control.tsv" дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] - ожидается запись «Question» с «name» равным "control" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "sh \"$0\" --корень \"$1\" --ведомость \"$2\" --набор \"$3\" --разбор \"$4\" > /dev/null 2>&1", "/flang/proof/corpus-share.sh", "/t", "/w/ledger.tsv", "/w/honest", "/w/control.tsv"]) - «Run» от name и "sh" и ["-c", "sh \"$0\" --корень \"$1\" --ведомость \"$2\" --набор \"$3\" --разбор \"$4\" > /dev/null 2>&1", (соединить [(«Root» от answers), "/flang/proof/corpus-share.sh"] по ""), root, («In work» от "ledger.tsv" и answers), set, dump] + ожидается запись «Question» с «name» равным "control" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd \"$0\" && exec ./bootstrap/flang io flang/proof/share-measure.fscript --max-steps 4000000000 --timeout 900000 -- --root \"$1\" --ledger \"$2\" --set \"$3\" --dump \"$4\" > /dev/null 2>&1", "", "/t", "/w/ledger.tsv", "/w/honest", "/w/control.tsv"]) + «Run» от name и "sh" и ["-c", "cd \"$0\" && exec ./bootstrap/flang io flang/proof/share-measure.fscript --max-steps 4000000000 --timeout 900000 -- --root \"$1\" --ledger \"$2\" --set \"$3\" --dump \"$4\" > /dev/null 2>&1", («Root» от answers), root, («In work» от "ledger.tsv" и answers), set, dump] тотальная функция «Setup» возвращает список «Question» diff --git a/flang/proof/share-measure.fscript b/flang/proof/share-measure.fscript new file mode 100644 index 000000000..37a216d69 --- /dev/null +++ b/flang/proof/share-measure.fscript @@ -0,0 +1,969 @@ +модуль «Share measure» + использует «Rules» из "../../scripts/rules.fscript" + использует «Inquiry» из "../../scripts/inquiry.fscript" + использует «Reading» из "../../scripts/reading.fscript" + использует «Tables» из "../../scripts/tables.fscript" + использует «Memory headroom» из "../../scripts/memory-headroom.fscript" только «Whole», «Rounded», «Two digits», «Hundredths» + использует «Replay share» из "replay-share.fscript" только «Digits after», «Sum after», «Without first», «File name» + использует «Kernel verdict» из "kernel-verdict.fscript" только «Ledger command», «Key value», «Pick», «Picked» + использует «Lists» только «Соединить списки» + +объект «Kinds» + «inside»: признак + «verdict»: строка + «no theorem»: признак + «ruled»: признак + «moved»: признак + «debt»: число + «rule named»: признак + «therefore»: признак + «declared»: признак + «premised»: признак + «unpremised end»: признак + «p1»: число + «p2»: число + «p3»: число + «p4»: число + «stripped»: число + «steps»: число + «moves»: число + «by example»: число + «by property»: число + «by law»: число + +объект «Row» + «name»: строка + «source»: строка + «code»: число + «printed code»: число + «statements»: число + «proved»: число + «premises»: число + «steps»: число + «p1»: число + «p2»: число + «p3»: число + «by example»: число + «by property»: число + «by law»: число + «agreed»: строка + «class»: строка + «p4»: число + «said»: строка + «p5»: число + «moves»: число + «stripped»: число + «mismatch»: строка + «refusal»: признак + +тотальная функция «No kinds» + возвращает «Kinds» + пример «Every count starts at naught» + ожидается запись «Kinds» с «inside» равным нет и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + запись «Kinds» с «inside» равным нет и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + +тотальная функция «Trimmed» + принимает line: строка + возвращает строка + пример «Spaces and tabs at both ends go» + дано line равно " \t шаг 1 \t" + ожидается "шаг 1" + соединить («Words» от (соединить (разделить line по "\t") по " ")) по " " + +тотальная функция «Third named» + принимает line: строка + возвращает строка + пример «The third name in angle quotes» + дано line равно "посылка «а» «б» «правило»" + ожидается "правило" + пусть parts равно (разделить line по "«") + если (длина parts) меньше 4 то "" иначе («Cell» от 1 и (разделить («Cell» от 4 и parts) по "»")) + +тотальная функция «Step ground» + принимает line: строка + возвращает строка + пример «What closes a step» + дано line равно "шаг 1 строка 9 закрывающий по примеру «а»" + ожидается "по примеру «а»" + соединить («Without first» от («Without first» от («Without first» от («Without first» от («Without first» от («Words» от line)))))) по " " + +тотальная функция «Statement opened» + принимает kinds: «Kinds» + возвращает «Kinds» + пример «A new statement forgets the last one» + дано kinds равно запись «Kinds» с «inside» равным нет и «verdict» равным "доказано" и «no theorem» равным да и «ruled» равным да и «moved» равным да и «debt» равным 2 и «rule named» равным да и «therefore» равным да и «declared» равным да и «premised» равным да и «unpremised end» равным да и «p1» равным 1 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + ожидается запись «Kinds» с «inside» равным да и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 1 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + запись «Kinds» с «inside» равным да и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным (kinds.«p1») и «p2» равным (kinds.«p2») и «p3» равным (kinds.«p3») и «p4» равным (kinds.«p4») и «stripped» равным (kinds.«stripped») и «steps» равным (kinds.«steps») и «moves» равным (kinds.«moves») и «by example» равным (kinds.«by example») и «by property» равным (kinds.«by property») и «by law» равным (kinds.«by law») + +тотальная функция «Statement closed» + принимает kinds: «Kinds» + возвращает «Kinds» + пример «A proved statement without a theorem counts in the first kind» + дано kinds равно запись «Kinds» с «inside» равным да и «verdict» равным "доказано" и «no theorem» равным да и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + ожидается запись «Kinds» с «inside» равным нет и «verdict» равным "доказано" и «no theorem» равным да и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 1 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + пусть debt равно ((kinds.«debt») плюс (если (kinds.«ruled») и притом (не (kinds.«moved»)) то 1 иначе 0)) + пусть counted равно ((kinds.«no theorem») и притом ((kinds.«verdict») равен "доказано")) + пусть stripped равно ((не ((kinds.«verdict») равен "доказано")) и притом ((kinds.«rule named») или ((kinds.«declared») или (kinds.«therefore»)))) + запись «Kinds» с «inside» равным нет и «verdict» равным (kinds.«verdict») и «no theorem» равным (kinds.«no theorem») и «ruled» равным (kinds.«ruled») и «moved» равным (kinds.«moved») и «debt» равным debt и «rule named» равным (kinds.«rule named») и «therefore» равным (kinds.«therefore») и «declared» равным (kinds.«declared») и «premised» равным (kinds.«premised») и «unpremised end» равным (kinds.«unpremised end») и «p1» равным ((kinds.«p1») плюс (если counted и притом (не (kinds.«unpremised end»)) то 1 иначе 0)) и «p2» равным ((kinds.«p2») плюс debt) и «p3» равным (kinds.«p3») и «p4» равным (kinds.«p4») и «stripped» равным ((kinds.«stripped») плюс (если stripped то 1 иначе 0)) и «steps» равным (kinds.«steps») и «moves» равным ((kinds.«moves») плюс (если counted и притом (kinds.«unpremised end») то 1 иначе 0)) и «by example» равным (kinds.«by example») и «by property» равным (kinds.«by property») и «by law» равным (kinds.«by law») + +тотальная функция «Line seen» + принимает kinds: «Kinds», l: строка + возвращает «Kinds» + пример «A step closed by example» + дано kinds равно запись «Kinds» с «inside» равным да и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + дано l равно "шаг 1 строка 9 закрывающий по примеру «а»" + ожидается запись «Kinds» с «inside» равным да и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 1 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 1 и «moves» равным 0 и «by example» равным 1 и «by property» равным 0 и «by law» равным 0 + пусть premise равно (l начинается с "посылка ") + пусть ended равно (l равен "ход конец") + пусть declared равно (l начинается с "по объявлению ") + пусть step равно (l начинается с "шаг ") + пусть ground равно (если step то («Step ground» от l) иначе "") + пусть sampled равно (ground начинается с "по примеру") + пусть propertied равно (ground начинается с "по свойству") + пусть lawful равно (ground начинается с "по закону") + запись «Kinds» с «inside» равным да и «verdict» равным (если l начинается с "вердикт " то («Word» от 2 и l) иначе (kinds.«verdict»)) и «no theorem» равным ((kinds.«no theorem») или (l равен "теоремы нет")) и «ruled» равным (если premise то (не (пусто («Third named» от l))) иначе (kinds.«ruled»)) и «moved» равным (если premise то нет иначе ((kinds.«moved») или ended)) и «debt» равным ((kinds.«debt») плюс (если premise и притом ((kinds.«ruled») и притом (не (kinds.«moved»))) то 1 иначе 0)) и «rule named» равным ((kinds.«rule named») или (l начинается с "правило «")) и «therefore» равным ((kinds.«therefore») или (l начинается с "следовательно доказано")) и «declared» равным ((kinds.«declared») или declared) и «premised» равным ((kinds.«premised») или premise) и «unpremised end» равным ((kinds.«unpremised end») или (ended и притом (не ((kinds.«premised») или premise)))) и «p1» равным (kinds.«p1») и «p2» равным (kinds.«p2») и «p3» равным ((kinds.«p3») плюс (если (sampled или propertied) или lawful то 1 иначе 0)) и «p4» равным ((kinds.«p4») плюс (если declared то 1 иначе 0)) и «stripped» равным (kinds.«stripped») и «steps» равным ((kinds.«steps») плюс (если step то 1 иначе 0)) и «moves» равным (kinds.«moves») и «by example» равным ((kinds.«by example») плюс (если sampled то 1 иначе 0)) и «by property» равным ((kinds.«by property») плюс (если propertied то 1 иначе 0)) и «by law» равным ((kinds.«by law») плюс (если lawful то 1 иначе 0)) + +тотальная функция «Kind step» + принимает kinds: «Kinds», line: строка + возвращает «Kinds» + пример «Lines outside a statement count nothing» + дано kinds равно запись «Kinds» с «inside» равным нет и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + дано line равно "шаг 1 по примеру" + ожидается запись «Kinds» с «inside» равным нет и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + пусть l равно («Trimmed» от line) + разбор («Line role» от kinds и l) + случай "open" + то «Statement opened» от kinds + случай "close" + то «Statement closed» от kinds + случай "inside" + то «Line seen» от kinds и l + случай любое + то kinds + +тотальная функция «Line role» + принимает kinds: «Kinds», l: строка + возвращает строка + пример «The end of a statement» + дано kinds равно запись «Kinds» с «inside» равным да и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + дано l равно "конец утверждения" + ожидается "close" + «Chosen» от [(«When» от (l начинается с "утверждение «") и "open"), + («When» от (не (kinds.«inside»)) и "outside"), + («When» от (l равен "конец утверждения") и "close")] и "inside" + +тотальная функция «Kinds of» + принимает text: строка + возвращает «Kinds» + пример «A statement proved without a theorem, with a step by example» + дано text равно "утверждение «а»\n вердикт доказано\n теоремы нет\n шаг 1 строка 9 закрывающий по примеру «б»\nконец утверждения\n" + ожидается запись «Kinds» с «inside» равным нет и «verdict» равным "доказано" и «no theorem» равным да и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 1 и «p2» равным 0 и «p3» равным 1 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 1 и «moves» равным 0 и «by example» равным 1 и «by property» равным 0 и «by law» равным 0 + свёртка (разделить text по "\n") начиная с («No kinds») как kinds и line → «Kind step» от kinds и line + +тотальная функция «Allowed empty» + возвращает список строки + пример «Records allowed to sit empty in the numerator» + ожидается ["corpus-brackets.record", "forgery-binder-hides-the-condition.record", "forgery-if-without-descent.record", "krug-tuda-i-obratno.record", "poddelka-element-po-nomeru.record", "poddelka-istinnaya-vetv.record", "poddelka-krug-pri-rabote.record", "poddelka-lozhnaya-polovina.record", "poddelka-mera-dliny-stroki.record", "poddelka-porjadok-sosednih.record", "poddelka-ravenstvo-v-tele-ne-dokazyvaet.record", "poddelka-razdvoenie-diz.record", "poddelka-refleksivnost.record", "poddelka-slova-celey.record", "poddelka-sortirovka-ne-ubyvaet.record", "poddelka-vhozhdenie.record"] + ["corpus-brackets.record", "forgery-binder-hides-the-condition.record", "forgery-if-without-descent.record", "krug-tuda-i-obratno.record", "poddelka-element-po-nomeru.record", "poddelka-istinnaya-vetv.record", "poddelka-krug-pri-rabote.record", "poddelka-lozhnaya-polovina.record", "poddelka-mera-dliny-stroki.record", "poddelka-porjadok-sosednih.record", "poddelka-ravenstvo-v-tele-ne-dokazyvaet.record", "poddelka-razdvoenie-diz.record", "poddelka-refleksivnost.record", "poddelka-slova-celey.record", "poddelka-sortirovka-ne-ubyvaet.record", "poddelka-vhozhdenie.record"] + +тотальная функция «One line» + принимает said: строка + возвращает строка + пример «Lines are joined by spaces and cut to sixty-four signs» + дано said равно "a\tb\nc\n\n" + ожидается "a b c" + пусть kept равно («Stripped ends» от said) + пусть joined равно (соединить (разделить (соединить (разделить kept по "\n") по " ") по "\t") по " ") + если (длина joined) больше 64 то (подстрока joined с 1 по 64) иначе joined + +тотальная функция «Stripped ends» + принимает text: строка + возвращает строка + пример «Trailing line ends go, as a shell substitution drops them» + дано text равно "a\nb\n\n" + ожидается "a\nb" + пусть parts равно (разделить text по "\n") + пусть last равно (свёртка («Numbered» от parts) начиная с 0 как found и entry → если пусто («Cell» от 2 и entry) то found иначе («Count» от («Cell» от 1 и entry))) + соединить (отобразить (отфильтровать («Numbered» от parts) где entry → («Count» от («Cell» от 1 и entry)) не больше last) как entry → «Cell» от 2 и entry) по "\n" + +тотальная функция «Numbered» + принимает items: список строки + возвращает список список строки + пример «Numbered from one» + дано items равно ["а", "б"] + ожидается [["1", "а"], ["2", "б"]] + свёртка items начиная с (пустой список) как numbered и piece → добавить [(к строке ((длина numbered) плюс 1)), piece] к numbered + +тотальная функция «Summary line» + принимает said: строка + возвращает строка + пример «The line that counts what was checked» + дано said равно "ПРОВЕРЕНО\nутверждений 4, шагов сверено с исходником 2, сведений проиграно заново 1 (ходов проверено 3). Числятся доказанными 4. НА СЛОВО ЯДРА: посылок и утверждений 0, шагов 0.\n" + ожидается "утверждений 4, шагов сверено с исходником 2, сведений проиграно заново 1 (ходов проверено 3). Числятся доказанными 4. НА СЛОВО ЯДРА: посылок и утверждений 0, шагов 0." + «Cell» от 1 и (отфильтровать (разделить said по "\n") где line → (line содержит "утверждений ") и притом ((line содержит ", шагов сверено с исходником ") и притом ((line содержит "Числятся доказанными ") и притом (line содержит "НА СЛОВО ЯДРА: посылок и утверждений ")))) + +тотальная функция «Row of» + принимает name: строка, source: строка, class: строка, code: число, printed: число, said: строка, text: строка + возвращает «Row» + пример «A record the checker accepted» + дано name равно "a.record" + дано source равно "a.flang" + дано class равно "" + дано code равно 0 + дано printed равно 0 + дано said равно "ПРОВЕРЕНО\nутверждений 1, шагов сверено с исходником 0, сведений проиграно заново 0 (ходов проверено 0). Числятся доказанными 1. НА СЛОВО ЯДРА: посылок и утверждений 1, шагов 0.\n" + дано text равно "утверждение «а»\n вердикт доказано\n теоремы нет\nконец утверждения\n" + ожидается запись «Row» с «name» равным "a.record" и «source» равным "a.flang" и «code» равным 0 и «printed code» равным 0 и «statements» равным 1 и «proved» равным 1 и «premises» равным 1 и «steps» равным 0 и «p1» равным 1 и «p2» равным 0 и «p3» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 и «agreed» равным "да" и «class» равным "Р0" и «p4» равным 0 и «said» равным "ПРОВЕРЕНО утверждений 1, шагов сверено с исходником 0, сведений " и «p5» равным 0 и «moves» равным 0 и «stripped» равным 0 и «mismatch» равным "" и «refusal» равным нет + пусть summary равно («Summary line» от said) + пусть statements равно («Digits after» от "утверждений " и («Cell» от 1 и (разделить summary по ", шагов сверено"))) + пусть replayed равно («Digits after» от "сведений проиграно заново " и summary) + пусть moved равно («Digits after» от "(ходов проверено " и summary) + пусть proved равно («Digits after» от "Числятся доказанными " и summary) + пусть premises равно («Digits after» от "НА СЛОВО ЯДРА: посылок и утверждений " и summary) + пусть steps равно («Digits after» от ", шагов " и summary) + пусть removed равно («Sum after» от "снято со слова ядра мест " и said) + пусть sampled равно («Sum after» от "Шагов по примеру проверено по существу " и said) + пусть propertied равно («Sum after» от "Шагов по свойству проверено по существу " и said) + пусть bodied равно («Sum after» от "проверено по телу функции " и said) + пусть kinds равно («Kinds of» от text) + пусть seen равно (((kinds.«p1») плюс (kinds.«p2»)) плюс (kinds.«steps»)) + пусть counted равно (((((premises плюс steps) плюс removed) плюс sampled) плюс propertied) плюс bodied) + пусть verdict равно ((code равен 0) или (code равен 3)) + пусть mismatch равно («Mismatch» от verdict и name и kinds и moved и seen и counted и premises и steps и removed и sampled и propertied и bodied) + запись «Row» с «name» равным name и «source» равным source и «code» равным code и «printed code» равным printed и «statements» равным statements и «proved» равным proved и «premises» равным premises и «steps» равным steps и «p1» равным (kinds.«p1») и «p2» равным (kinds.«p2») и «p3» равным (kinds.«p3») и «by example» равным (kinds.«by example») и «by property» равным (kinds.«by property») и «by law» равным (kinds.«by law») и «agreed» равным (если пусто mismatch то "да" иначе "нет") и «class» равным («Class of code» от code и premises и steps) и «p4» равным (kinds.«p4») и «said» равным («One line» от said) и «p5» равным ((kinds.«steps») минус (kinds.«p3»)) и «moves» равным (kinds.«moves») и «stripped» равным (kinds.«stripped») и «mismatch» равным mismatch и «refusal» равным нет + +тотальная функция «Class of code» + принимает code: число, premises: число, steps: число + возвращает строка + пример «Not checked with nothing on the kernel word» + дано code равно 3 + дано premises равно 0 + дано steps равно 0 + ожидается "Р1" + «Chosen» от [(«When» от (code равен 0) и "Р0"), + («When» от (code равен 1) и "Р3"), + («When» от ((code равен 3) и притом ((premises равен 0) и притом (steps равен 0))) и "Р1"), + («When» от (code равен 3) и "Р2")] и "Р4" + +тотальная функция «Mismatch» + принимает verdict: признак, name: строка, kinds: «Kinds», moved: число, seen: число, counted: число, premises: число, steps: число, removed: число, sampled: число, propertied: число, bodied: число + возвращает строка + пример «Moves the checker never checked» + дано verdict равно да + дано name равно "a.record" + дано kinds равно запись «Kinds» с «inside» равным нет и «verdict» равным "" и «no theorem» равным нет и «ruled» равным нет и «moved» равным нет и «debt» равным 0 и «rule named» равным нет и «therefore» равным нет и «declared» равным нет и «premised» равным нет и «unpremised end» равным нет и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «p4» равным 0 и «stripped» равным 0 и «steps» равным 0 и «moves» равным 2 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 + дано moved равно 0 + дано seen равно 0 + дано counted равно 0 + дано premises равно 0 + дано steps равно 0 + дано removed равно 0 + дано sampled равно 0 + дано propertied равно 0 + дано bodied равно 0 + ожидается " a.record: ходов под постусловием 2, а чекер ходов проверил 0 — зеркало вычло бы их со слова зря" + «Chosen» от [(«When» от (не verdict) и ""), + («When» от (((kinds.«moves») больше 0) и притом (moved равен 0)) и (соединить [" ", name, ": ходов под постусловием ", (к строке (kinds.«moves»)), ", а чекер ходов проверил 0 — зеркало вычло бы их со слова зря"] по "")), + («When» от (seen равен counted) и "")] и (соединить [" ", name, ": текст П1 ", (к строке (kinds.«p1»)), " + П2 ", (к строке (kinds.«p2»)), " + шагов ", (к строке (kinds.«steps»)), " = ", (к строке seen), " (вне тождества: ходами ", (к строке (kinds.«moves»)), "); чекер посылок ", (к строке premises), " + шагов ", (к строке steps), " + снято ", (к строке removed), " + по примеру ", (к строке sampled), " + по свойству ", (к строке propertied), " + по телу функции ", (к строке bodied), " = ", (к строке counted)] по "") + +тотальная функция «Refusal row» + принимает name: строка, source: строка, class: строка, said: строка + возвращает «Row» + пример «A record the instrument will not judge» + дано name равно "a.record" + дано source равно "a.flang" + дано class равно "Р5" + дано said равно "не берусь" + ожидается запись «Row» с «name» равным "a.record" и «source» равным "a.flang" и «code» равным 126 и «printed code» равным 126 и «statements» равным 0 и «proved» равным 0 и «premises» равным 0 и «steps» равным 0 и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 и «agreed» равным "нет" и «class» равным "Р5" и «p4» равным 0 и «said» равным "не берусь" и «p5» равным 0 и «moves» равным 0 и «stripped» равным 0 и «mismatch» равным "" и «refusal» равным да + запись «Row» с «name» равным name и «source» равным source и «code» равным 126 и «printed code» равным 126 и «statements» равным 0 и «proved» равным 0 и «premises» равным 0 и «steps» равным 0 и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 и «agreed» равным "нет" и «class» равным class и «p4» равным 0 и «said» равным said и «p5» равным 0 и «moves» равным 0 и «stripped» равным 0 и «mismatch» равным "" и «refusal» равным да + +тотальная функция «Dump line» + принимает row: «Row» + возвращает строка + пример «A refusal has nineteen cells» + дано row равно запись «Row» с «name» равным "a.record" и «source» равным "a.flang" и «code» равным 126 и «printed code» равным 126 и «statements» равным 0 и «proved» равным 0 и «premises» равным 0 и «steps» равным 0 и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 и «agreed» равным "нет" и «class» равным "Р5" и «p4» равным 0 и «said» равным "не берусь" и «p5» равным 0 и «moves» равным 0 и «stripped» равным 0 и «mismatch» равным "" и «refusal» равным да + ожидается "a.record\ta.flang\t126\t126\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\tнет\tР5\t0\tне берусь\t0" + пусть cells равно [(row.«name»), (row.«source»), (к строке (row.«code»)), (к строке (row.«printed code»)), (к строке (row.«statements»)), (к строке (row.«proved»)), (к строке (row.«premises»)), (к строке (row.«steps»)), (к строке (row.«p1»)), (к строке (row.«p2»)), (к строке (row.«p3»)), (к строке (row.«by example»)), (к строке (row.«by property»)), (к строке (row.«by law»)), (row.«agreed»), (row.«class»), (к строке (row.«p4»)), (row.«said»), (к строке (row.«p5»))] + соединить (если row.«refusal» то cells иначе (добавить (к строке (row.«moves»)) к cells)) по "\t" + +тотальная функция «Share text» + принимает part: число, whole: число + возвращает строка + пример «Two decimals and a percent sign» + дано part равно 1 + дано whole равно 3 + ожидается "33.33 %" + пример «No whole» + дано part равно 0 + дано whole равно 0 + ожидается "знаменатель ноль" + если whole больше 0 то (соединить [(«Hundredths» от («Rounded» от ((part умножить на 10000) делить на whole))), " %"] по "") иначе "знаменатель ноль" + +тотальная функция «Padded» + принимает text: строка, width: число, left: признак + возвращает строка + пример «Padded on the right to a width» + дано text равно "ab" + дано width равно 4 + дано left равно нет + ожидается "ab " + пример «Padded on the left» + дано text равно "7" + дано width равно 3 + дано left равно да + ожидается " 7" + пусть room равно (width минус (длина text)) + пусть fill равно (если room больше 0 то (подстрока " " с 1 по room) иначе "") + если left то (соединить [fill, text] по "") иначе (соединить [text, fill] по "") + +тотальная функция «Count of class» + принимает rows: список «Row», class: строка + возвращает число + пример «Rows of one class» + дано rows равно пустой список + дано class равно "Р0" + ожидается 0 + длина (отфильтровать rows где row → (row.«class») равен class) + +тотальная функция «Total» + принимает numbers: список число + возвращает число + пример «A sum» + дано numbers равно [1, 2, 3] + ожидается 6 + свёртка numbers начиная с 0 как total и each → total плюс each + +тотальная функция «Map line» + принимает mask: строка, rows: список «Row», proved: число + возвращает строка + пример «Nothing taken off, nothing counted» + дано mask равно "000" + дано rows равно пустой список + дано proved равно 0 + ожидается "— ничего 0 0 знаменатель ноль" + пусть lead равно (подстрока mask с 1 по 1) + пусть mid равно (подстрока mask с 2 по 2) + пусть rear равно (подстрока mask с 3 по 3) + пусть kept равно (отфильтровать rows где row → (не (((row.«p1») больше 0) и притом (lead равен "0"))) и притом ((не (((row.«p2») больше 0) и притом (mid равен "0"))) и притом (не ((((row.«p3») плюс (row.«p5»)) больше 0) и притом (rear равен "0"))))) + пусть proven равно («Total» от (отобразить kept как row → row.«proved»)) + пусть label равно (соединить [(если lead равен "1" то "П1 " иначе ""), (если mid равен "1" то "П2 " иначе ""), (если rear равен "1" то "П3+П5 " иначе "")] по "") + соединить [(«Padded» от (если пусто label то "— ничего " иначе label) и 24 и нет), " ", («Padded» от (к строке (длина kept)) и 8 и да), " ", («Padded» от (к строке proven) и 10 и да), " ", («Padded» от («Share text» от proven и proved) и 11 и да)] по "" + +тотальная функция «Codes» + принимает codes: список число, wanted: число + возвращает число + пример «Codes of one value» + дано codes равно [0, 1, 0] + дано wanted равно 0 + ожидается 2 + длина (отфильтровать codes где code → code равен wanted) + +тотальная функция «Summary lines» + принимает rows: список «Row», title: строка, place: строка, ledger: строка, ledgered: число, forged: список строки, mismatches: число + возвращает список строки + пример «An empty set still names its denominators» + дано rows равно пустой список + дано title равно "к" + дано place равно "/d" + дано ledger равно "коммит x" + дано ledgered равно 3 + дано forged равно пустой список + дано mismatches равно 0 + ожидается ["", "═══ НАБОР «к» ═══", "каталог записей\t/d", "записей в наборе\t0", "ведомость дела\tкоммит x", "файлов в ведомости\t3", "", "-- исходы чекера, как его зовёт оснастка (два довода) --", "код 0 ПРОВЕРЕНО\t0", "код 1 НЕ СОШЛОСЬ\t0", "код 3 НЕ ПРОВЕРЕНО — не приговор\t0", "код 2 кривой вызов — не приговор\t0", "коды больше 3 — не приговор\t0", "", "-- тем же чекером, отпечаток подан третьим доводом --", "код 0 ПРОВЕРЕНО\t0", "код 1 НЕ СОШЛОСЬ\t0", "код 3 НЕ ПРОВЕРЕНО\t0", "прочие коды — не приговор\t0", "", "-- ДОЛЯ Г4, знаменатель назван вместе с числителем --", "по ЗАПИСЯМ, сегодня\t0 из 0\tзнаменатель ноль", " из них ВПУСТУЮ, доказанным не числится ничего\t0", "по ЗАПИСЯМ, не считая пустых\t0 из 0\tзнаменатель ноль", " (по УТВЕРЖДЕНИЯМ пустые дают ноль и числа не двигают)", " записей набора подделок (манифест, не имя файла)\t0", " из них в числителе\t0", "по ЗАПИСЯМ, снят разряд Р1\t0 из 0\tзнаменатель ноль", "по УТВЕРЖДЕНИЯМ, сегодня\t0 из 0\tзнаменатель ноль", "по УТВЕРЖДЕНИЯМ, снят разряд Р1\t0 из 0\tзнаменатель ноль", "", "-- разряды помех, по записям --", "Р0 принято кодом 0\t0", "Р1 мешает только нехватка «отпечаток256»\t0", "Р2 то же плюс места на слово ядра\t0", "Р3 противоречие, код 1\t0", "Р4 не приговор\t0", "Р5 НЕ БЕРУСЬ: дело не из дерева\t0", "", "-- породы мест на слово ядра, по всему набору --", "П1 «доказано», теоремы в записи нет\t0", "П2 посылка с правилом и без ходов\t0", "П3 шаг «по примеру»/«по свойству»/«по закону»\t0", "П5 шаг, который сверщик не проигрывает вовсе\t0", "П4 из них — значение «по объявлению» (внутри П1, не сверх)\t0", "ходами под постусловием проиграно мест (не на слове, вне П1)\t0", "чекер: на слово ядра — посылок и утверждений\t0", "чекер: на слово ядра — шагов\t0", " из П3: шаг «по примеру»\t0", " из П3: шаг «по свойству»\t0", " из П3: шаг «по закону»\t0", "сумма мест П1+П2+П3+П5\t0", "", "-- КАРТА РАБОТ: числитель, если снять Р1 и названные породы --", "снято сверх Р1 записей утвержд. доля", "— ничего 0 0 знаменатель ноль", "П1 0 0 знаменатель ноль", "П2 0 0 знаменатель ноль", "П3+П5 0 0 знаменатель ноль", "П1 П2 0 0 знаменатель ноль", "П1 П3+П5 0 0 знаменатель ноль", "П2 П3+П5 0 0 знаменатель ноль", "П1 П2 П3+П5 0 0 знаменатель ноль", "", "-- сходимость двух приборов --", "записей, где текстовый счёт разошёлся с чекером\t0", "утверждений в наборе всего\t0", "числятся доказанными — знаменатель по утверждениям\t0"] + пусть codes равно (отобразить rows как row → row.«code») + пусть printed равно (отобразить rows как row → row.«printed code») + пусть all равно (длина rows) + пусть proved равно («Total» от (отобразить rows как row → row.«proved»)) + пусть accepted равно (отфильтровать rows где row → (row.«code») равен 0) + пусть hollow равно (длина (отфильтровать accepted где row → (row.«proved») равен 0)) + пусть taken равно (длина accepted) + пусть printedtaken равно (отфильтровать rows где row → (row.«printed code») равен 0) + пусть inset равно (отфильтровать rows где row → не (пусто (отфильтровать forged где name → name равен (row.«name»)))) + пусть p1 равно («Total» от (отобразить rows как row → row.«p1»)) + пусть p2 равно («Total» от (отобразить rows как row → row.«p2»)) + пусть p3 равно («Total» от (отобразить rows как row → row.«p3»)) + пусть p5 равно («Total» от (отобразить rows как row → row.«p5»)) + [ + "", (соединить ["═══ НАБОР «", title, "» ═══"] по ""), (соединить ["каталог записей\t", place] по ""), (соединить ["записей в наборе\t", (к строке all)] по ""), (соединить ["ведомость дела\t", ledger] по ""), (соединить ["файлов в ведомости\t", (к строке ledgered)] по ""), + "", "-- исходы чекера, как его зовёт оснастка (два довода) --", (соединить ["код 0 ПРОВЕРЕНО\t", (к строке («Codes» от codes и 0))] по ""), (соединить ["код 1 НЕ СОШЛОСЬ\t", (к строке («Codes» от codes и 1))] по ""), (соединить ["код 3 НЕ ПРОВЕРЕНО — не приговор\t", (к строке («Codes» от codes и 3))] по ""), (соединить ["код 2 кривой вызов — не приговор\t", (к строке («Codes» от codes и 2))] по ""), (соединить ["коды больше 3 — не приговор\t", (к строке (длина (отфильтровать codes где code → code больше 3)))] по ""), + "", "-- тем же чекером, отпечаток подан третьим доводом --", (соединить ["код 0 ПРОВЕРЕНО\t", (к строке («Codes» от printed и 0))] по ""), (соединить ["код 1 НЕ СОШЛОСЬ\t", (к строке («Codes» от printed и 1))] по ""), (соединить ["код 3 НЕ ПРОВЕРЕНО\t", (к строке («Codes» от printed и 3))] по ""), (соединить ["прочие коды — не приговор\t", (к строке (длина (отфильтровать printed где code → не ((code равен 0) или ((code равен 1) или (code равен 3))))))] по ""), + "", "-- ДОЛЯ Г4, знаменатель назван вместе с числителем --", (соединить ["по ЗАПИСЯМ, сегодня\t", (к строке taken), " из ", (к строке all), "\t", («Share text» от taken и all)] по ""), (соединить [" из них ВПУСТУЮ, доказанным не числится ничего\t", (к строке hollow)] по ""), (соединить ["по ЗАПИСЯМ, не считая пустых\t", (к строке (taken минус hollow)), " из ", (к строке all), "\t", («Share text» от (taken минус hollow) и all)] по ""), " (по УТВЕРЖДЕНИЯМ пустые дают ноль и числа не двигают)", (соединить [" записей набора подделок (манифест, не имя файла)\t", (к строке (длина inset))] по ""), (соединить [" из них в числителе\t", (к строке (длина (отфильтровать inset где row → (row.«code») равен 0)))] по ""), (соединить ["по ЗАПИСЯМ, снят разряд Р1\t", (к строке (длина printedtaken)), " из ", (к строке all), "\t", («Share text» от (длина printedtaken) и all)] по ""), (соединить ["по УТВЕРЖДЕНИЯМ, сегодня\t", (к строке («Total» от (отобразить accepted как row → row.«proved»))), " из ", (к строке proved), "\t", («Share text» от («Total» от (отобразить accepted как row → row.«proved»)) и proved)] по ""), (соединить ["по УТВЕРЖДЕНИЯМ, снят разряд Р1\t", (к строке («Total» от (отобразить printedtaken как row → row.«proved»))), " из ", (к строке proved), "\t", («Share text» от («Total» от (отобразить printedtaken как row → row.«proved»)) и proved)] по ""), + "", "-- разряды помех, по записям --", (соединить ["Р0 принято кодом 0\t", (к строке («Count of class» от rows и "Р0"))] по ""), (соединить ["Р1 мешает только нехватка «отпечаток256»\t", (к строке («Count of class» от rows и "Р1"))] по ""), (соединить ["Р2 то же плюс места на слово ядра\t", (к строке («Count of class» от rows и "Р2"))] по ""), (соединить ["Р3 противоречие, код 1\t", (к строке («Count of class» от rows и "Р3"))] по ""), (соединить ["Р4 не приговор\t", (к строке («Count of class» от rows и "Р4"))] по ""), (соединить ["Р5 НЕ БЕРУСЬ: дело не из дерева\t", (к строке («Count of class» от rows и "Р5"))] по ""), + "", "-- породы мест на слово ядра, по всему набору --", (соединить ["П1 «доказано», теоремы в записи нет\t", (к строке p1)] по ""), (соединить ["П2 посылка с правилом и без ходов\t", (к строке p2)] по ""), (соединить ["П3 шаг «по примеру»/«по свойству»/«по закону»\t", (к строке p3)] по ""), (соединить ["П5 шаг, который сверщик не проигрывает вовсе\t", (к строке p5)] по ""), (соединить ["П4 из них — значение «по объявлению» (внутри П1, не сверх)\t", (к строке («Total» от (отобразить rows как row → row.«p4»)))] по ""), (соединить ["ходами под постусловием проиграно мест (не на слове, вне П1)\t", (к строке («Total» от (отобразить rows как row → row.«moves»)))] по ""), (соединить ["чекер: на слово ядра — посылок и утверждений\t", (к строке («Total» от (отобразить rows как row → row.«premises»)))] по ""), (соединить ["чекер: на слово ядра — шагов\t", (к строке («Total» от (отобразить rows как row → row.«steps»)))] по ""), (соединить [" из П3: шаг «по примеру»\t", (к строке («Total» от (отобразить rows как row → row.«by example»)))] по ""), (соединить [" из П3: шаг «по свойству»\t", (к строке («Total» от (отобразить rows как row → row.«by property»)))] по ""), (соединить [" из П3: шаг «по закону»\t", (к строке («Total» от (отобразить rows как row → row.«by law»)))] по ""), (соединить ["сумма мест П1+П2+П3+П5\t", (к строке (((p1 плюс p2) плюс p3) плюс p5))] по ""), + "", "-- КАРТА РАБОТ: числитель, если снять Р1 и названные породы --", (соединить [(«Padded» от "снято сверх Р1" и 24 и нет), " ", («Padded» от "записей" и 8 и да), " ", («Padded» от "утвержд." и 10 и да), " ", («Padded» от "доля" и 12 и да)] по ""), («Map line» от "000" и rows и proved), («Map line» от "100" и rows и proved), («Map line» от "010" и rows и proved), («Map line» от "001" и rows и proved), («Map line» от "110" и rows и proved), («Map line» от "101" и rows и proved), («Map line» от "011" и rows и proved), («Map line» от "111" и rows и proved), + "", "-- сходимость двух приборов --", (соединить ["записей, где текстовый счёт разошёлся с чекером\t", (к строке mismatches)] по ""), (соединить ["утверждений в наборе всего\t", (к строке («Total» от (отобразить rows как row → row.«statements»)))] по ""), (соединить ["числятся доказанными — знаменатель по утверждениям\t", (к строке proved)] по "")] + +объект «Fact» + «record»: строка + «name»: строка + «declared»: строка + «source»: строка + «present»: признак + «source sum»: строка + «record sum»: строка + +объект «Judgement» + «record»: строка + «code»: число + «printed code»: число + «said»: строка + «text»: строка + +тотальная функция «Facts command» + возвращает строка + пример «What the shell tells about each record of a set» + ожидается "cd \"$0\" || exit 2; for z in $(find \"$1\" -name '*.record' | sort); do nm=$(basename \"$z\"); d=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); if [ -n \"$2\" ]; then s=\"$2/$(basename \"$d\")\"; else s=\"$0/$d\"; fi; if [ -f \"$s\" ]; then e=1; h=$(sha256sum \"$s\" | cut -d' ' -f1); else e=0; h=-; fi; zh=$(sha256sum \"$z\" | cut -d' ' -f1); printf '%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \"$z\" \"$nm\" \"$d\" \"$s\" \"$e\" \"$h\" \"$zh\"; done" + "cd \"$0\" || exit 2; for z in $(find \"$1\" -name '*.record' | sort); do nm=$(basename \"$z\"); d=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); if [ -n \"$2\" ]; then s=\"$2/$(basename \"$d\")\"; else s=\"$0/$d\"; fi; if [ -f \"$s\" ]; then e=1; h=$(sha256sum \"$s\" | cut -d' ' -f1); else e=0; h=-; fi; zh=$(sha256sum \"$z\" | cut -d' ' -f1); printf '%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \"$z\" \"$nm\" \"$d\" \"$s\" \"$e\" \"$h\" \"$zh\"; done" + +тотальная функция «Judge command» + возвращает строка + пример «Each job is checked twice and its record printed beside» + ожидается "t=$(printf '\\t'); while IFS=\"$t\" read -r z s o; do \"$0\" \"$s\" \"$z\" > \"$1/said\" 2>&1; k=$?; \"$0\" \"$s\" \"$z\" \"$o\" > /dev/null 2>&1; kd=$?; printf '\\036 job %s\\t%s\\t%s\\n' \"$z\" \"$k\" \"$kd\"; cat \"$1/said\"; printf '\\n\\036 text\\n'; grep -a -E '^[[:space:]]*(утверждение «|конец утверждения|вердикт |теоремы нет|посылка |ход конец|по объявлению |правило «|следовательно доказано|шаг )' \"$z\"; printf '\\n'; done < \"$2\" > \"$3\"" + "t=$(printf '\\t'); while IFS=\"$t\" read -r z s o; do \"$0\" \"$s\" \"$z\" > \"$1/said\" 2>&1; k=$?; \"$0\" \"$s\" \"$z\" \"$o\" > /dev/null 2>&1; kd=$?; printf '\\036 job %s\\t%s\\t%s\\n' \"$z\" \"$k\" \"$kd\"; cat \"$1/said\"; printf '\\n\\036 text\\n'; grep -a -E '^[[:space:]]*(утверждение «|конец утверждения|вердикт |теоремы нет|посылка |ход конец|по объявлению |правило «|следовательно доказано|шаг )' \"$z\"; printf '\\n'; done < \"$2\" > \"$3\"" + +тотальная функция «Examples command» + возвращает строка + пример «The kernel prints a record for every example» + ожидается "cd \"$0\" || exit 2; mkdir -p \"$1\"; n=0; f=0; who=''; for s in flang/proof/examples/*.flang; do b=$(basename \"$s\" .flang); ./bootstrap/flang check --proof --записать \"$1/$b.record\" \"$s\" >/dev/null 2>&1; if [ -s \"$1/$b.record\" ]; then n=$((n+1)); else f=$((f+1)); who=\"$who $b\"; rm -f \"$1/$b.record\"; fi; done; printf 'примеров подано\\t%s\\nзаписей напечатано\\t%s\\nпечать отказала\\t%s\\t%s\\n' \"$(ls flang/proof/examples/*.flang | wc -l)\" \"$n\" \"$f\" \"$who\"" + "cd \"$0\" || exit 2; mkdir -p \"$1\"; n=0; f=0; who=''; for s in flang/proof/examples/*.flang; do b=$(basename \"$s\" .flang); ./bootstrap/flang check --proof --записать \"$1/$b.record\" \"$s\" >/dev/null 2>&1; if [ -s \"$1/$b.record\" ]; then n=$((n+1)); else f=$((f+1)); who=\"$who $b\"; rm -f \"$1/$b.record\"; fi; done; printf 'примеров подано\\t%s\\nзаписей напечатано\\t%s\\nпечать отказала\\t%s\\t%s\\n' \"$(ls flang/proof/examples/*.flang | wc -l)\" \"$n\" \"$f\" \"$who\"" + +тотальная функция «Facts of» + принимает text: строка + возвращает список «Fact» + пример «One record of a set» + дано text равно "/r/a.record\ta.record\tx/a.flang\t/t/x/a.flang\t1\taa\tbb\n" + ожидается [запись «Fact» с «record» равным "/r/a.record" и «name» равным "a.record" и «declared» равным "x/a.flang" и «source» равным "/t/x/a.flang" и «present» равным да и «source sum» равным "aa" и «record sum» равным "bb"] + отобразить (отфильтровать (отобразить («Lines» от text) как line → разделить line по "\t") где cells → (длина cells) равен 7) как cells → запись «Fact» с «record» равным («Cell» от 1 и cells) и «name» равным («Cell» от 2 и cells) и «declared» равным («Cell» от 3 и cells) и «source» равным («Cell» от 4 и cells) и «present» равным ((«Cell» от 5 и cells) равен "1") и «source sum» равным («Cell» от 6 и cells) и «record sum» равным («Cell» от 7 и cells) + +тотальная функция «Judgements of» + принимает text: строка + возвращает список «Judgement» + пример «One job» + дано text равно "\u001e job /r/a.record\t0\t1\nПРОВЕРЕНО\n\n\u001e text\nутверждений 1\n\n" + ожидается [запись «Judgement» с «record» равным "/r/a.record" и «code» равным 0 и «printed code» равным 1 и «said» равным "ПРОВЕРЕНО\n" и «text» равным "утверждений 1\n\n"] + отобразить (отфильтровать (разделить text по "\u001e job ") где chunk → не (пусто chunk)) как chunk → «Judgement of» от chunk + +тотальная функция «Judgement of» + принимает chunk: строка + возвращает «Judgement» + пример «A job without its text» + дано chunk равно "/r/a.record\t1\t1\nНЕ СОШЛОСЬ\n" + ожидается запись «Judgement» с «record» равным "/r/a.record" и «code» равным 1 и «printed code» равным 1 и «said» равным "НЕ СОШЛОСЬ\n" и «text» равным "" + пусть halves равно (разделить chunk по "\n\u001e text\n") + пусть head равно (разделить («Cell» от 1 и halves) по "\n") + пусть cells равно (разделить («Cell» от 1 и head) по "\t") + запись «Judgement» с «record» равным («Cell» от 1 и cells) и «code» равным («Count» от («Cell» от 2 и cells)) и «printed code» равным («Count» от («Cell» от 3 и cells)) и «said» равным (соединить («Without first» от head) по "\n") и «text» равным (соединить («Without first» от halves) по "\n\u001e text\n") + +тотальная функция «Ledger sum» + принимает path: строка, ledger: строка + возвращает строка + пример «The sum the ledger holds for a path» + дано path равно "a.flang" + дано ledger равно "11\tb.flang\n22\ta.flang\n" + ожидается "22" + пусть parts равно (разделить (соединить ["\n", ledger, "\n"] по "") по (соединить ["\t", path, "\n"] по "")) + пусть before равно («Cell» от 1 и parts) + пусть tail равно (если (длина before) больше 80 то (подстрока before с ((длина before) минус 79) по (длина before)) иначе before) + пусть lines равно (разделить tail по "\n") + если (длина parts) меньше 2 то "" иначе («Cell» от (длина lines) и lines) + +тотальная функция «Under root» + принимает path: строка, root: строка + возвращает строка + пример «A path inside the root loses its prefix» + дано path равно "/t/x/a.flang" + дано root равно "/t" + ожидается "x/a.flang" + пример «A path outside stays whole» + дано path равно "/w/a.flang" + дано root равно "/t" + ожидается "/w/a.flang" + если path начинается с (соединить [root, "/"] по "") то («After» от (соединить [root, "/"] по "") и path) иначе path + +тотальная функция «Refusal of» + принимает fact: «Fact», root: строка, ledger: строка + возвращает список строки + пример «A source the commit does not hold» + дано fact равно запись «Fact» с «record» равным "/w/a.record" и «name» равным "a.record" и «declared» равным "x/a.flang" и «source» равным "/t/x/a.flang" и «present» равным да и «source sum» равным "aa" и «record sum» равным "bb" + дано root равно "/t" + дано ledger равно "" + ожидается ["Р5", "не берусь: исходника «x/a.flang» нет в ведомости коммита"] + пусть rel равно («Under root» от (fact.«source») и root) + пусть sum равно («Ledger sum» от rel и ledger) + пусть inside равно ((fact.«record») начинается с (соединить [root, "/"] по "")) + пусть recorded равно («Ledger sum» от («Under root» от (fact.«record») и root) и ledger) + «Chosen» от [(«When» от (пусто sum) и ["Р5", (соединить ["не берусь: исходника «", rel, "» нет в ведомости коммита"] по "")]), + («When» от (не (fact.«present»)) и ["Р4", (соединить ["исходника нет: ", (fact.«source»)] по "")]), + («When» от (не ((fact.«source sum») равен sum)) и ["Р5", (соединить ["не берусь: файл «", rel, "» разошёлся с коммитом"] по "")]), + («When» от (inside и притом ((пусто recorded) или (не (recorded равен (fact.«record sum»))))) и ["Р5", (соединить ["не берусь: записи «", («Under root» от (fact.«record») и root), "» нет в ведомости коммита либо она правлена"] по "")])] и (пустой список) + +тотальная функция «Jobs» + принимает facts: список «Fact», root: строка, ledger: строка + возвращает строка + пример «A record judged against the sum its source has in the commit» + дано facts равно [запись «Fact» с «record» равным "/w/a.record" и «name» равным "a.record" и «declared» равным "x/a.flang" и «source» равным "/t/x/a.flang" и «present» равным да и «source sum» равным "aa" и «record sum» равным "bb"] + дано root равно "/t" + дано ledger равно "aa\tx/a.flang\n" + ожидается "/w/a.record\t/t/x/a.flang\taa\n" + соединить (отобразить (отфильтровать facts где fact → пусто («Refusal of» от fact и root и ledger)) как fact → соединить [(fact.«record»), "\t", (fact.«source»), "\t", («Ledger sum» от («Under root» от (fact.«source») и root) и ledger), "\n"] по "") по "" + +тотальная функция «Rows of» + принимает facts: список «Fact», judgements: список «Judgement», root: строка, ledger: строка + возвращает список «Row» + пример «A refused record becomes a refusal row» + дано facts равно [запись «Fact» с «record» равным "/w/a.record" и «name» равным "a.record" и «declared» равным "x/a.flang" и «source» равным "/t/x/a.flang" и «present» равным нет и «source sum» равным "-" и «record sum» равным "bb"] + дано judgements равно пустой список + дано root равно "/t" + дано ledger равно "aa\tx/a.flang\n" + ожидается [запись «Row» с «name» равным "a.record" и «source» равным "x/a.flang" и «code» равным 126 и «printed code» равным 126 и «statements» равным 0 и «proved» равным 0 и «premises» равным 0 и «steps» равным 0 и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 и «agreed» равным "нет" и «class» равным "Р4" и «p4» равным 0 и «said» равным "исходника нет: /t/x/a.flang" и «p5» равным 0 и «moves» равным 0 и «stripped» равным 0 и «mismatch» равным "" и «refusal» равным да] + отобразить facts как fact → «Row for» от fact и («Refusal of» от fact и root и ledger) и judgements + +тотальная функция «Row for» + принимает fact: «Fact», refusal: список строки, judgements: список «Judgement» + возвращает «Row» + пример «A refusal» + дано fact равно запись «Fact» с «record» равным "/w/a.record" и «name» равным "a.record" и «declared» равным "x/a.flang" и «source» равным "/t/x/a.flang" и «present» равным нет и «source sum» равным "-" и «record sum» равным "bb" + дано refusal равно ["Р4", "исходника нет"] + дано judgements равно пустой список + ожидается запись «Row» с «name» равным "a.record" и «source» равным "x/a.flang" и «code» равным 126 и «printed code» равным 126 и «statements» равным 0 и «proved» равным 0 и «premises» равным 0 и «steps» равным 0 и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 и «agreed» равным "нет" и «class» равным "Р4" и «p4» равным 0 и «said» равным "исходника нет" и «p5» равным 0 и «moves» равным 0 и «stripped» равным 0 и «mismatch» равным "" и «refusal» равным да + разбор refusal + случай голова и хвост + то «Refusal row» от (fact.«name») и (fact.«declared») и (голова) и («Cell» от 1 и (хвост)) + случай пусто + то «Judged row» от fact и (отфильтровать judgements где judgement → (judgement.«record») равен (fact.«record»)) + +тотальная функция «Judged row» + принимает fact: «Fact», found: список «Judgement» + возвращает «Row» + пример «A record never judged counts as a refusal of the fourth kind» + дано fact равно запись «Fact» с «record» равным "/w/a.record" и «name» равным "a.record" и «declared» равным "x/a.flang" и «source» равным "/t/x/a.flang" и «present» равным да и «source sum» равным "aa" и «record sum» равным "bb" + дано found равно пустой список + ожидается запись «Row» с «name» равным "a.record" и «source» равным "x/a.flang" и «code» равным 126 и «printed code» равным 126 и «statements» равным 0 и «proved» равным 0 и «premises» равным 0 и «steps» равным 0 и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 и «agreed» равным "нет" и «class» равным "Р4" и «p4» равным 0 и «said» равным "не судилась" и «p5» равным 0 и «moves» равным 0 и «stripped» равным 0 и «mismatch» равным "" и «refusal» равным да + разбор found + случай голова и хвост + то «Row of» от (fact.«name») и (fact.«declared») и "" и ((голова).«code») и ((голова).«printed code») и ((голова).«said») и ((голова).«text») + случай пусто + то «Refusal row» от (fact.«name») и (fact.«declared») и "Р4" и "не судилась" + +объект «Report» + «lines»: список строки + «failed»: признак + +тотальная функция «Empty line» + принимает row: «Row», listed: признак + возвращает список строки + пример «An accepted record with nothing proved and no excuse» + дано row равно запись «Row» с «name» равным "a.record" и «source» равным "a.flang" и «code» равным 0 и «printed code» равным 0 и «statements» равным 0 и «proved» равным 0 и «premises» равным 0 и «steps» равным 0 и «p1» равным 0 и «p2» равным 0 и «p3» равным 0 и «by example» равным 0 и «by property» равным 0 и «by law» равным 0 и «agreed» равным "да" и «class» равным "Р0" и «p4» равным 0 и «said» равным "" и «p5» равным 0 и «moves» равным 0 и «stripped» равным 0 и «mismatch» равным "" и «refusal» равным нет + дано listed равно да + ожидается [" ПУСТАЯ В ЧИСЛИТЕЛЕ, а поимённо не названа: a.record"] + пусть allowed равно (не (пусто (отфильтровать («Allowed empty») где name → name равен (row.«name»)))) + пусть hollow равно (((row.«code») равен 0) и притом ((row.«proved») равен 0)) + «Chosen» от [(«When» от (allowed и притом (listed и притом ((не ((row.«code») равен 0)) или ((row.«proved») больше 0)))) и [(соединить [" СПИСОК ПРОТУХ (запись больше не пуста в числителе): ", (row.«name»), " (код ", (к строке (row.«code»)), ", доказанными ", (к строке (row.«proved»)), ")"] по "")]), + («When» от allowed и (пустой список)), + («When» от (hollow и притом listed) и [(соединить [" ПУСТАЯ В ЧИСЛИТЕЛЕ, а поимённо не названа: ", (row.«name»)] по "")]), + («When» от hollow и [(соединить [" пустая в числителе (список на этот набор не заведён, прогон не роняется): ", (row.«name»)] по "")])] и (пустой список) + +тотальная функция «Set report» + принимает rows: список «Row», title: строка, place: строка, ledger: строка, ledgered: число, forged: список строки, listed: признак + возвращает «Report» + пример «An empty set measures to its summary and passes» + дано rows равно пустой список + дано title равно "к" + дано place равно "/d" + дано ledger равно "коммит x" + дано ledgered равно 3 + дано forged равно пустой список + дано listed равно да + ожидается запись «Report» с «lines» равным ["", "═══ НАБОР «к» ═══", "каталог записей\t/d", "записей в наборе\t0", "ведомость дела\tкоммит x", "файлов в ведомости\t3", "", "-- исходы чекера, как его зовёт оснастка (два довода) --", "код 0 ПРОВЕРЕНО\t0", "код 1 НЕ СОШЛОСЬ\t0", "код 3 НЕ ПРОВЕРЕНО — не приговор\t0", "код 2 кривой вызов — не приговор\t0", "коды больше 3 — не приговор\t0", "", "-- тем же чекером, отпечаток подан третьим доводом --", "код 0 ПРОВЕРЕНО\t0", "код 1 НЕ СОШЛОСЬ\t0", "код 3 НЕ ПРОВЕРЕНО\t0", "прочие коды — не приговор\t0", "", "-- ДОЛЯ Г4, знаменатель назван вместе с числителем --", "по ЗАПИСЯМ, сегодня\t0 из 0\tзнаменатель ноль", " из них ВПУСТУЮ, доказанным не числится ничего\t0", "по ЗАПИСЯМ, не считая пустых\t0 из 0\tзнаменатель ноль", " (по УТВЕРЖДЕНИЯМ пустые дают ноль и числа не двигают)", " записей набора подделок (манифест, не имя файла)\t0", " из них в числителе\t0", "по ЗАПИСЯМ, снят разряд Р1\t0 из 0\tзнаменатель ноль", "по УТВЕРЖДЕНИЯМ, сегодня\t0 из 0\tзнаменатель ноль", "по УТВЕРЖДЕНИЯМ, снят разряд Р1\t0 из 0\tзнаменатель ноль", "", "-- разряды помех, по записям --", "Р0 принято кодом 0\t0", "Р1 мешает только нехватка «отпечаток256»\t0", "Р2 то же плюс места на слово ядра\t0", "Р3 противоречие, код 1\t0", "Р4 не приговор\t0", "Р5 НЕ БЕРУСЬ: дело не из дерева\t0", "", "-- породы мест на слово ядра, по всему набору --", "П1 «доказано», теоремы в записи нет\t0", "П2 посылка с правилом и без ходов\t0", "П3 шаг «по примеру»/«по свойству»/«по закону»\t0", "П5 шаг, который сверщик не проигрывает вовсе\t0", "П4 из них — значение «по объявлению» (внутри П1, не сверх)\t0", "ходами под постусловием проиграно мест (не на слове, вне П1)\t0", "чекер: на слово ядра — посылок и утверждений\t0", "чекер: на слово ядра — шагов\t0", " из П3: шаг «по примеру»\t0", " из П3: шаг «по свойству»\t0", " из П3: шаг «по закону»\t0", "сумма мест П1+П2+П3+П5\t0", "", "-- КАРТА РАБОТ: числитель, если снять Р1 и названные породы --", "снято сверх Р1 записей утвержд. доля", "— ничего 0 0 знаменатель ноль", "П1 0 0 знаменатель ноль", "П2 0 0 знаменатель ноль", "П3+П5 0 0 знаменатель ноль", "П1 П2 0 0 знаменатель ноль", "П1 П3+П5 0 0 знаменатель ноль", "П2 П3+П5 0 0 знаменатель ноль", "П1 П2 П3+П5 0 0 знаменатель ноль", "", "-- сходимость двух приборов --", "записей, где текстовый счёт разошёлся с чекером\t0", "утверждений в наборе всего\t0", "числятся доказанными — знаменатель по утверждениям\t0"] и «failed» равным нет + пусть mismatched равно (отфильтровать rows где row → не (пусто (row.«mismatch»))) + пусть marked равно (отфильтровать rows где row → (row.«stripped») больше 0) + пусть refused равно («Count of class» от rows и "Р5") + пусть hollows равно («Gathered words» от (отобразить rows как row → «Empty line» от row и listed)) + пусть summary равно («Summary lines» от rows и title и place и ledger и ledgered и forged и (длина mismatched)) + пусть verdict равно («Chosen» от [(«When» от (не (пусто mismatched)) и ["", "РАСХОЖДЕНИЕ: линейка себе не верит"]), («When» от (refused больше 0) и ["", (соединить ["НЕ БЕРУСЬ: ", (к строке refused), " записей назвали исходником или собой не то, что лежит в коммите"] по "")])] и (пустой список)) + пусть first12 равно (отобразить (отфильтровать («Numbered» от (отобразить mismatched как row → row.«mismatch»)) где entry → («Count» от («Cell» от 1 и entry)) не больше 12) как entry → «Cell» от 2 и entry) + пусть located равно (если пусто mismatched то (пустой список) иначе («Соединить списки» от ["", (соединить ["ГДЕ ИМЕННО РАЗОШЛИСЬ ДВА ПРИБОРА (первые ", (к строке (длина first12)), "):"] по "")] и (добавить "Разошлось обычно потому, что чекер научился новому, а зеркало пород за ним не поехало." к (добавить "Слева — места, какие видит текст записи; справа — куда их разложил чекер." к first12)))) + пусть stripped равно («Total» от (отобразить marked как row → row.«stripped»)) + пусть traced равно (отобразить marked как row → соединить [" ", (row.«name»), ": мест ", (к строке (row.«stripped»)), " — утверждение без вердикта «доказано» несёт след разбора"] по "") + пусть traces равно (если пусто marked то (пустой список) иначе («Соединить списки» от ["", (соединить ["СНЯТЫЙ ВЕРДИКТ: мест ", (к строке stripped), " — утверждение без «доказано» несёт след разбора"] по ""), ""] и («Соединить списки» от traced и ["Печать ядра такого не пишет: разбор кладётся только под «доказано».", "Скорее всего слово «доказано» вычеркнули, чтобы обнулить счёт «на слово ядра»."]))) + пусть empties равно (если пусто hollows то (пустой список) иначе («Соединить списки» от (приписать "" к (приписать "ЧИСЛИТЕЛЬ Г4 ВПУСТУЮ:" к hollows)) и (если listed то ["Список законно пустых — в flang/proof/share-measure.fscript, «Allowed empty»."] иначе (пустой список)))) + запись «Report» с «lines» равным («Соединить списки» от summary и («Соединить списки» от verdict и («Соединить списки» от located и («Соединить списки» от traces и empties)))) и «failed» равным ((не (пусто verdict)) или ((не (пусто marked)) или (listed и притом (не (пусто hollows))))) + +объект «Set» + «tag»: строка + «title»: строка + «place»: строка + «sources»: строка + «listed»: признак + «dump»: строка + +тотальная функция «Words given» + принимает answers: список «Answer» + возвращает список строки + пример «No arguments» + дано answers равно пустой список + ожидается пустой список + «Given of» от "arguments" и answers + +тотальная функция «Keys taking a value» + возвращает список строки + пример «Six keys take a value» + ожидается ["--set", "--dump", "--root", "--commit", "--ledger", "--write-ledger"] + ["--set", "--dump", "--root", "--commit", "--ledger", "--write-ledger"] + +тотальная функция «Strange keys» + принимает words: список строки + возвращает список строки + пример «A key the measure does not know» + дано words равно ["--set", "corpus", "--мягко"] + ожидается ["--мягко"] + пусть pick равно (свёртка words начиная с (запись «Pick» с «waiting» равным нет и «found» равным пустой список) как pick и word → запись «Pick» с «waiting» равным (не (пусто (отфильтровать («Keys taking a value») где key → key равен word))) и «found» равным (если (pick.«waiting») или ((word равен "--both") или (не (пусто (отфильтровать («Keys taking a value») где key → key равен word)))) то (pick.«found») иначе (добавить word к (pick.«found»)))) + pick.«found» + +тотальная функция «Value» + принимает key: строка, answers: список «Answer» + возвращает строка + пример «The word after a key» + дано key равно "--set" + дано answers равно [запись «Answer» с «name» равным "arguments" и «reply» равным (вариант «Доводы» с доводы равным ["--set", "corpus"])] + ожидается "corpus" + «Key value» от key и («Words given» от answers) + +тотальная функция «Root» + принимает answers: список «Answer» + возвращает строка + пример «The root as the shell sees it» + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным "")] + ожидается "/t" + «First line» от («Output of» от "root" и answers) + +тотальная функция «Work» + принимает answers: список «Answer» + возвращает строка + пример «No work directory yet» + дано answers равно пустой список + ожидается "" + «Made of» от "work" и answers + +тотальная функция «In work» + принимает name: строка, answers: список «Answer» + возвращает строка + пример «A file in the work directory» + дано name равно "ledger.tsv" + дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается "/w/ledger.tsv" + соединить [(«Work» от answers), "/", name] по "" + +тотальная функция «Both» + принимает answers: список «Answer» + возвращает признак + пример «One set unless both are asked for» + дано answers равно пустой список + ожидается нет + не (пусто (отфильтровать («Words given» от answers) где word → word равен "--both")) + +тотальная функция «Corpus set» + принимает answers: список «Answer», dump: строка + возвращает «Set» + пример «The corpus of the tree» + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным "")] + дано dump равно "" + ожидается запись «Set» с «tag» равным "1" и «title» равным "корпус — 86 готовых записей дерева" и «place» равным "/t/flang/proof/checker/tests/records/corpus" и «sources» равным "" и «listed» равным да и «dump» равным "" + запись «Set» с «tag» равным "1" и «title» равным "корпус — 86 готовых записей дерева" и «place» равным (соединить [(«Root» от answers), "/flang/proof/checker/tests/records/corpus"] по "") и «sources» равным "" и «listed» равным да и «dump» равным dump + +тотальная функция «Examples set» + принимает answers: список «Answer», dump: строка + возвращает «Set» + пример «The examples printed by the kernel» + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным ""), запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + дано dump равно "" + ожидается запись «Set» с «tag» равным "2" и «title» равным "примеры — записи, напечатанные ядром" и «place» равным "/w/examples" и «sources» равным "/t/flang/proof/examples" и «listed» равным да и «dump» равным "" + запись «Set» с «tag» равным "2" и «title» равным "примеры — записи, напечатанные ядром" и «place» равным («In work» от "examples" и answers) и «sources» равным (соединить [(«Root» от answers), "/flang/proof/examples"] по "") и «listed» равным да и «dump» равным dump + +тотальная функция «Sets» + принимает answers: список «Answer» + возвращает список «Set» + пример «Nothing named, nothing measured» + дано answers равно пустой список + ожидается пустой список + пусть named равно («Value» от "--set" и answers) + пусть dump равно («Value» от "--dump" и answers) + «Chosen» от [(«When» от («Both» от answers) и [(«Corpus set» от answers и dump), («Examples set» от answers и (если пусто dump то "" иначе (соединить [dump, ".примеры"] по "")))]), + («When» от (named равен "corpus") и [(«Corpus set» от answers и dump)]), + («When» от (named равен "examples") и [(«Examples set» от answers и dump)]), + («When» от (пусто named) и (пустой список))] и [(запись «Set» с «tag» равным "1" и «title» равным (соединить ["каталог ", named] по "") и «place» равным named и «sources» равным "" и «listed» равным нет и «dump» равным dump)] + +тотальная функция «Ledger text» + принимает answers: список «Answer» + возвращает строка + пример «Nothing read» + дано answers равно пустой список + ожидается "" + «Output of» от "ledger" и answers + +тотальная функция «Ledger name» + принимает answers: список «Answer» + возвращает строка + пример «A commit named by its short form» + дано answers равно [запись «Answer» с «name» равным "short" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "abc\n" и ошибки равным "")] + ожидается "коммит abc" + пусть file равно («Value» от "--ledger" и answers) + пусть short равно («First line» от («Output of» от "short" и answers)) + «Chosen» от [(«When» от (не (пусто file)) и file), + («When» от (не (пусто short)) и (соединить ["коммит ", short] по ""))] и (соединить ["коммит ", («Commit» от answers)] по "") + +тотальная функция «Commit» + принимает answers: список «Answer» + возвращает строка + пример «The head commit unless another is named» + дано answers равно пустой список + ожидается "HEAD" + пусть named равно («Value» от "--commit" и answers) + если пусто named то "HEAD" иначе named + +тотальная функция «Checker» + принимает answers: список «Answer» + возвращает строка + пример «The checker of the tree measured» + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным "")] + ожидается "/t/flang/proof/checker/сверщик" + соединить [(«Root» от answers), "/flang/proof/checker/сверщик"] по "" + +тотальная функция «Forged names» + принимает answers: список «Answer» + возвращает список строки + пример «Names of the records the manifest lists» + дано answers равно [запись «Answer» с «name» равным "manifest" и «reply» равным (вариант «Прочитано» с содержимое равным "source\trecord\tclass\na.flang\tr/x.record\trecord-lies\n")] + ожидается ["x.record"] + отобразить (отфильтровать («Rows» от («Output of» от "manifest" и answers)) где row → (длина row) не меньше 3) как row → «File name» от («Cell» от 2 и row) + +тотальная функция «Setup» + возвращает список «Question» + пример «The arguments and the place of temporary files» + ожидается [запись «Question» с «name» равным "arguments" и «order» равным (вариант «Прочитать доводы»), запись «Question» с «name» равным "temporary" и «order» равным (вариант «Прочитать переменную среды» с имя равным "FLANG_TMP")] + [(«Arguments» от "arguments"), («Environment» от "temporary" и "FLANG_TMP")] + +тотальная функция «Rooting» + принимает answers: список «Answer» + возвращает список «Question» + пример «The tree of the plan unless another is named» + дано answers равно пустой список + ожидается [запись «Question» с «name» равным "root" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd \"$0\" && pwd", "../.."]), запись «Question» с «name» равным "work" и «order» равным (вариант «Завести временный каталог» с образец равным "/srv/tmp/share-measure.")] + пусть named равно («Value» от "--root" и answers) + [(«Run» от "root" и "sh" и ["-c", "cd \"$0\" && pwd", (если пусто named то "../.." иначе named)]), («Temporary directory» от "work" и (соединить [(«Setting of» от "temporary" и "/srv/tmp" и answers), "/share-measure."] по ""))] + +тотальная функция «Base» + принимает answers: список «Answer» + возвращает список «Question» + пример «Without a root nothing is asked yet» + дано answers равно пустой список + ожидается [запись «Question» с «name» равным "manifest" и «order» равным (вариант «Прочитать файл» с путь равным "/flang/proof/forgeries/manifest.tsv"), запись «Question» с «name» равным "checker present" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["-x", "/flang/proof/checker/сверщик"]), запись «Question» с «name» равным "checker stale" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["/flang/proof/checker/checker.c", "-nt", "/flang/proof/checker/сверщик"])] + [(«Read» от "manifest" и (соединить [(«Root» от answers), "/flang/proof/forgeries/manifest.tsv"] по "")), («Run» от "checker present" и "test" и ["-x", («Checker» от answers)]), («Run» от "checker stale" и "test" и [(соединить [(«Root» от answers), "/flang/proof/checker/checker.c"] по ""), "-nt", («Checker» от answers)])] + +тотальная функция «Ledgering» + принимает answers: список «Answer» + возвращает список «Question» + пример «A ready ledger is read as it is» + дано answers равно [запись «Answer» с «name» равным "arguments" и «reply» равным (вариант «Доводы» с доводы равным ["--ledger", "/l.tsv"])] + ожидается [запись «Question» с «name» равным "ledger" и «order» равным (вариант «Прочитать файл» с путь равным "/l.tsv")] + если не (пусто («Value» от "--ledger" и answers)) + то [(«Read» от "ledger" и («Value» от "--ledger" и answers))] + иначе [(«Run» от "built ledger" и "sh" и ["-c", («Ledger command»), («Root» от answers), («Commit» от answers), («Work» от answers)]), («Read» от "ledger" и («In work» от "ledger.tsv" и answers)), («Run» от "short" и "git" и ["-C", («Root» от answers), "rev-parse", "--short", («Commit» от answers)])] + +тотальная функция «Printing» + принимает answers: список «Answer» + возвращает список «Question» + пример «No examples, nothing printed» + дано answers равно пустой список + ожидается пустой список + если пусто (отфильтровать («Sets» от answers) где set → (set.«tag») равен "2") то пустой список иначе [(«Run» от "examples" и "sh" и ["-c", («Examples command»), («Root» от answers), («In work» от "examples" и answers)])] + +тотальная функция «Facting» + принимает answers: список «Answer» + возвращает список «Question» + пример «No sets, no facts» + дано answers равно пустой список + ожидается пустой список + отобразить («Sets» от answers) как set → «Run» от (соединить ["facts ", (set.«tag»)] по "") и "sh" и ["-c", («Facts command»), («Root» от answers), (set.«place»), (set.«sources»)] + +тотальная функция «Set facts» + принимает set: «Set», answers: список «Answer» + возвращает список «Fact» + пример «Nothing listed» + дано set равно запись «Set» с «tag» равным "1" и «title» равным "к" и «place» равным "/d" и «sources» равным "" и «listed» равным нет и «dump» равным "" + дано answers равно пустой список + ожидается пустой список + «Facts of» от («Output of» от (соединить ["facts ", (set.«tag»)] по "") и answers) + +тотальная функция «Judging» + принимает answers: список «Answer» + возвращает список «Question» + пример «No sets, nothing judged» + дано answers равно пустой список + ожидается пустой список + «Flattened» от (отобразить («Sets» от answers) как set → [(«Write» от (соединить ["jobs ", (set.«tag»)] по "") и («In work» от (соединить ["jobs-", (set.«tag»)] по "") и answers) и («Jobs» от («Set facts» от set и answers) и («Root» от answers) и («Ledger text» от answers))), («Run» от (соединить ["judge ", (set.«tag»)] по "") и "sh" и ["-c", («Judge command»), («Checker» от answers), («Work» от answers), («In work» от (соединить ["jobs-", (set.«tag»)] по "") и answers), («In work» от (соединить ["judged-", (set.«tag»)] по "") и answers)]), («Read» от (соединить ["judged ", (set.«tag»)] по "") и («In work» от (соединить ["judged-", (set.«tag»)] по "") и answers))]) + +тотальная функция «Flattened» + принимает parts: список список «Question» + возвращает список «Question» + пример «Nothing to join» + дано parts равно пустой список + ожидается пустой список + свёртка parts начиная с (пустой список) как joined и part → «Соединить списки» от joined и part + +тотальная функция «Set rows» + принимает set: «Set», answers: список «Answer» + возвращает список «Row» + пример «Nothing measured» + дано set равно запись «Set» с «tag» равным "1" и «title» равным "к" и «place» равным "/d" и «sources» равным "" и «listed» равным нет и «dump» равным "" + дано answers равно пустой список + ожидается пустой список + «Rows of» от («Set facts» от set и answers) и («Judgements of» от («Output of» от (соединить ["judged ", (set.«tag»)] по "") и answers)) и («Root» от answers) и («Ledger text» от answers) + +тотальная функция «Dump text» + принимает rows: список «Row» + возвращает строка + пример «The heading alone» + дано rows равно пустой список + ожидается "запись\tисходник\tкод\tкод-с-отпечатком\tутверждений\tдоказанными\tна-слово-посылок-и-утв\tна-слово-шагов\tП1\tП2\tП3\tпо-примеру\tпо-свойству\tпо-закону\tприборы-сошлись\tразряд\tП4\tвердикт\tП5\tходами-под-постусловием\n" + соединить (приписать "запись\tисходник\tкод\tкод-с-отпечатком\tутверждений\tдоказанными\tна-слово-посылок-и-утв\tна-слово-шагов\tП1\tП2\tП3\tпо-примеру\tпо-свойству\tпо-закону\tприборы-сошлись\tразряд\tП4\tвердикт\tП5\tходами-под-постусловием\n" к (отобразить rows как row → соединить [(«Dump line» от row), "\n"] по "")) по "" + +тотальная функция «Writing» + принимает answers: список «Answer» + возвращает список «Question» + пример «Nothing to write» + дано answers равно пустой список + ожидается пустой список + «Соединить списки» от (отобразить (отфильтровать («Sets» от answers) где set → не (пусто (set.«dump»))) как set → «Write» от (соединить ["dump ", (set.«tag»)] по "") и (set.«dump») и («Dump text» от («Set rows» от set и answers))) и (если пусто («Value» от "--write-ledger" и answers) то (пустой список) иначе [(«Write» от "ledger written" и («Value» от "--write-ledger" и answers) и («Ledger text» от answers))]) + +тотальная функция «Cleaning» + принимает answers: список «Answer» + возвращает список «Question» + пример «No work directory, nothing to clean» + дано answers равно пустой список + ожидается пустой список + если пусто («Work» от answers) то пустой список иначе [(«Run» от "cleaned" и "rm" и ["-rf", («Work» от answers)])] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + пример «A stage outside the plan asks nothing» + дано stages равно 20 + дано answers равно пустой список + ожидается пустой список + разбор stages + случай 8 + то «Setup» + случай 7 + то «Rooting» от answers + случай 6 + то «Base» от answers + случай 5 + то «Ledgering» от answers + случай 4 + то «Printing» от answers + случай 3 + то «Facting» от answers + случай 2 + то «Judging» от answers + случай 1 + то «Writing» от answers + случай 0 + то «Cleaning» от answers + случай любое + то пустой список + +тотальная функция «Reports» + принимает answers: список «Answer» + возвращает «Report» + пример «No sets, no lines» + дано answers равно пустой список + ожидается запись «Report» с «lines» равным пустой список и «failed» равным нет + пусть ledgered равно (длина («Lines» от («Ledger text» от answers))) + свёртка («Sets» от answers) начиная с (запись «Report» с «lines» равным пустой список и «failed» равным нет) как gathered и set → «Joined» от gathered и (если (set.«tag») равен "2" то («Lines» от («Output of» от "examples" и answers)) иначе (пустой список)) и («Set report» от («Set rows» от set и answers) и (set.«title») и (set.«place») и («Ledger name» от answers) и ledgered и («Forged names» от answers) и (set.«listed»)) + +тотальная функция «Joined» + принимает gathered: «Report», printed: список строки, report: «Report» + возвращает «Report» + пример «Two reports in a row» + дано gathered равно запись «Report» с «lines» равным ["а"] и «failed» равным нет + дано printed равно ["п"] + дано report равно запись «Report» с «lines» равным ["б"] и «failed» равным да + ожидается запись «Report» с «lines» равным ["а", "п", "б"] и «failed» равным да + запись «Report» с «lines» равным («Соединить списки» от (gathered.«lines») и («Соединить списки» от printed и (report.«lines»))) и «failed» равным ((gathered.«failed») или (report.«failed»)) + +тотальная функция «Verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + пример «No set named» + дано answers равно пустой список + ожидается вариант «Не проверено» с код равным "FLANG_SHARE_MEASURE_NOT_MEASURED" и сообщение равным "назвать набор: --set {corpus|examples|КАТАЛОГ} либо --both" + + пусть report равно («Reports» от answers) + пусть bare равно (отфильтровать («Sets» от answers) где set → пусто («Set facts» от set и answers)) + «Chosen» от [(«When» от (пусто («Sets» от answers)) и (вариант «Не проверено» с код равным "FLANG_SHARE_MEASURE_NOT_MEASURED" и сообщение равным "назвать набор: --set {corpus|examples|КАТАЛОГ} либо --both")), + («When» от (не (пусто bare)) и (вариант «Не проверено» с код равным "FLANG_SHARE_MEASURE_NOT_MEASURED" и сообщение равным (соединить ["в «", («Cell» от 1 и (отобразить bare как set → set.«place»)), "» нет ни одной записи"] по ""))), + («When» от (report.«failed») и (вариант «Провал» с код равным "FLANG_SHARE_MEASURE" и сообщение равным (соединить (report.«lines») по "\n")))] и (вариант «Конец работы» с значение равным (соединить (report.«lines») по "\n")) + +тотальная функция «Obstacles» + принимает asked: строка, answers: список «Answer» + возвращает список строки + пример «An unknown key» + дано asked равно "arguments" + дано answers равно [запись «Answer» с «name» равным "arguments" и «reply» равным (вариант «Доводы» с доводы равным ["--мягко"])] + ожидается ["не знаю ключа «--мягко»; ключи: --set {corpus|examples|КАТАЛОГ} --both --dump ФАЙЛ --root ПУТЬ --commit X --ledger Ф --write-ledger Ф"] + пусть code равно («Exit code of» от asked и answers) + «Chosen» от [(«When» от (asked равен "arguments") и (отобразить («Strange keys» от («Words given» от answers)) как word → соединить ["не знаю ключа «", word, "»; ключи: --set {corpus|examples|КАТАЛОГ} --both --dump ФАЙЛ --root ПУТЬ --commit X --ledger Ф --write-ledger Ф"] по "")), + («When» от ((asked равен "root") и притом (не (code равен 0))) и [(соединить ["корня нет: ", («Value» от "--root" и answers)] по "")]), + («When» от ((asked равен "checker present") и притом (не (code равен 0))) и [(соединить ["нет чекера ", («Checker» от answers), " — собрать: make -C flang/proof/checker"] по "")]), + («When» от ((asked равен "checker stale") и притом (code равен 0)) и [(соединить ["чекер ", («Checker» от answers), " старше checker.c — пересобрать: make -C flang/proof/checker"] по "")]), + («When» от ((asked равен "built ledger") и притом (code равен 4)) и [(соединить ["ведомость не построена: «", («Commit» от answers), "» не коммит дерева «", («Root» от answers), "».\nготовую ведомость можно подать ключом --ledger ФАЙЛ"] по "")]), + («When» от ((asked равен "built ledger") и притом (не (code равен 0))) и [(соединить ["ведомость не построена: git archive «", («Commit» от answers), "» не отдал дерево"] по "")]), + («When» от ((asked равен "ledger") и притом (не (code равен 0))) и [(соединить ["ведомости нет: ", («Value» от "--ledger" и answers)] по "")]), + («When» от ((asked равен "ledger") и притом (пусто («Lines» от («Ledger text» от answers)))) и [(соединить ["ведомость пуста: в коммите «", («Commit» от answers), "» нет ни одного *.flang"] по "")]), + («When» от ((asked равен "work") и притом (пусто («Work» от answers))) и ["временный каталог не заведён"])] и (пустой список) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + пример «An empty queue at the last stage gives the verdict» + дано queue равно пустой список + дано stages равно 0 + дано answers равно пустой список + ожидается вариант «Не проверено» с код равным "FLANG_SHARE_MEASURE_NOT_MEASURED" и сообщение равным "назвать набор: --set {corpus|examples|КАТАЛОГ} либо --both" + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Verdict» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + пример «Nine stages lie ahead» + ожидается запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 9 и «answers» равным пустой список + «Begin with» от 9 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + пример «The first turn asks for the arguments» + дано inquiry равно запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 9 и «answers» равным пустой список + дано reply равно вариант «Пока ничего» + ожидается вариант «Сделать» с поручение равным (вариант «Прочитать доводы») и потом равным (запись «Inquiry» с «asked» равным "arguments" и «queue» равным [запись «Question» с «name» равным "temporary" и «order» равным (вариант «Прочитать переменную среды» с имя равным "FLANG_TMP")] и «stages» равным 8 и «answers» равным пустой список) + пусть answers равно («Heard» от inquiry и reply) + разбор («Obstacles» от (inquiry.«asked») и answers) + случай голова и хвост + то если пусто («Work» от answers) + то вариант «Не проверено» с код равным "FLANG_SHARE_MEASURE_NOT_MEASURED" и сообщение равным голова + иначе вариант «Сделать» с поручение равным (вариант «Запустить процесс» с программа равным "rm" и аргументы равным ["-rf", («Work» от answers)]) и потом равным (запись «Inquiry» с «asked» равным (соединить ["stopped: ", голова] по "") и «queue» равным пустой список и «stages» равным 0 и «answers» равным answers) + случай пусто + то если (inquiry.«asked») начинается с "stopped: " + то вариант «Не проверено» с код равным "FLANG_SHARE_MEASURE_NOT_MEASURED" и сообщение равным («After» от "stopped: " и (inquiry.«asked»)) + иначе «Proceed» от (inquiry.«queue») и (inquiry.«stages») и answers + +план «Share measure» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/flang/proof/share-self-test.fscript b/flang/proof/share-self-test.fscript new file mode 100644 index 000000000..12b544c88 --- /dev/null +++ b/flang/proof/share-self-test.fscript @@ -0,0 +1,571 @@ +модуль «Share self test» + использует «Rules» из "../../scripts/rules.fscript" + использует «Inquiry» из "../../scripts/inquiry.fscript" + использует «Reading» из "../../scripts/reading.fscript" + использует «Tables» из "../../scripts/tables.fscript" + использует «Plan output» из "../../scripts/plan-output.fscript" + использует «Share measure» из "share-measure.fscript" только «Kinds», «Kinds of», «No kinds», «Kind step», «Line role», «Statement opened», «Statement closed», «Line seen», «Trimmed», «Third named», «Step ground», «One line», «Stripped ends», «Numbered», «Ledger sum» + использует «Replay share» из "replay-share.fscript" только «Digits after», «Sum after», «Without first», «File name» + использует «Kernel verdict» из "kernel-verdict.fscript" только «Ledger command» + использует «Lists» только «Соединить списки» + +тотальная функция «Corpus» + возвращает строка + пример «The corpus of records» + ожидается "flang/proof/checker/tests/records/corpus" + "flang/proof/checker/tests/records/corpus" + +тотальная функция «Records read» + возвращает список строки + пример «Six records the probes spoil or read» + ожидается ["abilities", "types", "corpus-natural", "corpus-alphabet", "poddelka-refleksivnost", "corpus-factorial"] + ["abilities", "types", "corpus-natural", "corpus-alphabet", "poddelka-refleksivnost", "corpus-factorial"] + +тотальная функция «Text» + принимает name: строка, answers: список «Answer» + возвращает строка + пример «A record not read» + дано name равно "types" + дано answers равно пустой список + ожидается "" + «Output of» от (соединить ["record ", name] по "") и answers + +тотальная функция «Source of» + принимает text: строка + возвращает строка + пример «The source a record names» + дано text равно "запись доказательства 1\nисходник flang/a.flang\n" + ожидается "flang/a.flang" + «After» от "исходник " и («Beginning with» от "исходник " и («Lines» от text)) + +тотальная функция «Kept lines» + принимает text: строка + возвращает список строки + пример «The line end after the last line opens no line» + дано text равно "a\nb\n" + ожидается ["a", "b"] + пусть parts равно (разделить text по "\n") + если «Ends with» от text и "\n" то (отобразить (отфильтровать («Numbered» от parts) где entry → не ((«Count» от («Cell» от 1 и entry)) равен (длина parts))) как entry → «Cell» от 2 и entry) иначе parts + +тотальная функция «Printed lines» + принимает lines: список строки + возвращает строка + пример «Every line ends with a line end» + дано lines равно ["a", "b"] + ожидается "a\nb\n" + соединить (отобразить lines как line → соединить [line, "\n"] по "") по "" + +тотальная функция «Is proved line» + принимает line: строка + возвращает признак + пример «A proved verdict» + дано line равно " вердикт доказано " + ожидается да + («Trimmed» от line) равен "вердикт доказано" + +тотальная функция «Is trace» + принимает line: строка, hence: признак + возвращает признак + пример «A rule line is a trace of the derivation» + дано line равно " правило «а»" + дано hence равно да + ожидается да + пусть l равно («Trimmed» от line) + (l начинается с "правило «") или ((l начинается с "по объявлению ") или (hence и притом (l начинается с "следовательно доказано"))) + +тотальная функция «All stripped» + принимает text: строка + возвращает строка + пример «The verdict and every trace leave» + дано text равно " вердикт доказано\n правило «а»\n следовательно доказано\nконец\n" + ожидается " вердикт нет вердикта\nконец\n" + «Printed lines» от (отобразить (отфильтровать («Kept lines» от text) где line → не («Is trace» от line и да)) как line → если «Is proved line» от line то " вердикт нет вердикта" иначе line) + +тотальная функция «Verdict stripped» + принимает text: строка + возвращает строка + пример «Only the word goes» + дано text равно " вердикт доказано\n правило «а»\n" + ожидается " вердикт нет вердикта\n правило «а»\n" + «Printed lines» от (отобразить («Kept lines» от text) как line → если «Is proved line» от line то " вердикт нет вердикта" иначе line) + +тотальная функция «Partly stripped» + принимает text: строка + возвращает строка + пример «Two verdicts go, and the traces after the first» + дано text равно " правило «а»\n вердикт доказано\n правило «б»\n вердикт доказано\n вердикт доказано\n по объявлению да\n" + ожидается " правило «а»\n вердикт нет вердикта\n вердикт нет вердикта\n вердикт доказано\n" + «Printed lines» от ((свёртка («Kept lines» от text) начиная с (запись «Cut» с «count» равным 0 и «lines» равным пустой список) как cut и line → «Cut line» от cut и line).«lines») + +объект «Cut» + «count»: число + «lines»: список строки + +тотальная функция «Cut line» + принимает cut: «Cut», line: строка + возвращает «Cut» + пример «The first verdict goes» + дано cut равно запись «Cut» с «count» равным 0 и «lines» равным пустой список + дано line равно " вердикт доказано" + ожидается запись «Cut» с «count» равным 1 и «lines» равным [" вердикт нет вердикта"] + «Chosen» от [(«When» от (((cut.«count») меньше 2) и притом («Is proved line» от line)) и (запись «Cut» с «count» равным ((cut.«count») плюс 1) и «lines» равным (добавить " вердикт нет вердикта" к (cut.«lines»)))), + («When» от (((cut.«count») больше 0) и притом («Is trace» от line и нет)) и cut)] и (запись «Cut» с «count» равным (cut.«count») и «lines» равным (добавить line к (cut.«lines»))) + +тотальная функция «Without theorem» + принимает text: строка + возвращает строка + пример «The lines saying there is no theorem leave» + дано text равно "а\n теоремы нет\nб\n" + ожидается "а\nб\n" + «Printed lines» от (отфильтровать («Kept lines» от text) где line → не ((«Trimmed» от line) равен "теоремы нет")) + +тотальная функция «Build command» + возвращает строка + пример «Small trees for the probes that need a tree of their own» + ожидается "r=$0; w=$1; c=\"$r/flang/proof/checker/сверщик\"; k=flang/proof/checker/tests/records/corpus; for d in verdict/honest verdict/both verdict/word verdict/part; do mkdir -p \"$w/$d/$k\" \"$w/$d/flang/proof/examples\" \"$w/$d/flang/proof/map\" \"$w/$d/flang/proof/checker\" && cp \"$c\" \"$w/$d/flang/proof/checker/сверщик\" && cp \"$r/flang/proof/examples/corpus-natural.flang\" \"$w/$d/flang/proof/examples/\" && cp \"$r/flang/proof/map/types.flang\" \"$w/$d/flang/proof/map/\" || exit 1; done; for d in empty/honest empty/stripped empty/named; do for s in \"$2\" \"$3\" \"$4\"; do mkdir -p \"$w/$d/$(dirname \"$s\")\" && cp \"$r/$s\" \"$w/$d/$s\" || exit 1; done; mkdir -p \"$w/$d/$k\" \"$w/$d/flang/proof/checker\" && cp \"$c\" \"$w/$d/flang/proof/checker/сверщик\" || exit 1; done; for d in print/honest print/forged; do mkdir -p \"$w/$d/$k\" \"$w/$d/flang/proof/map\" \"$w/$d/flang/proof/checker\" \"$w/$d/bootstrap\" && cp \"$c\" \"$w/$d/flang/proof/checker/сверщик\" && cp \"$r/flang/proof/map/types.flang\" \"$w/$d/flang/proof/map/\" && ln -sf \"$r/bootstrap/flang\" \"$w/$d/bootstrap/flang\" || exit 1; done; cp \"$r/$k/corpus-natural.record\" \"$r/$k/types.record\" \"$w/verdict/honest/$k/\" && cp \"$r/$k/types.record\" \"$w/verdict/both/$k/\" && cp \"$r/$k/corpus-natural.record\" \"$w/verdict/word/$k/\" && cp \"$r/$k/corpus-natural.record\" \"$w/verdict/part/$k/\" && cp \"$r/$k/corpus-alphabet.record\" \"$w/empty/honest/$k/\" && cp \"$r/$k/poddelka-refleksivnost.record\" \"$w/empty/named/$k/\" && cp \"$r/$k/types.record\" \"$w/print/honest/$k/\"" + "r=$0; w=$1; c=\"$r/flang/proof/checker/сверщик\"; k=flang/proof/checker/tests/records/corpus; for d in verdict/honest verdict/both verdict/word verdict/part; do mkdir -p \"$w/$d/$k\" \"$w/$d/flang/proof/examples\" \"$w/$d/flang/proof/map\" \"$w/$d/flang/proof/checker\" && cp \"$c\" \"$w/$d/flang/proof/checker/сверщик\" && cp \"$r/flang/proof/examples/corpus-natural.flang\" \"$w/$d/flang/proof/examples/\" && cp \"$r/flang/proof/map/types.flang\" \"$w/$d/flang/proof/map/\" || exit 1; done; for d in empty/honest empty/stripped empty/named; do for s in \"$2\" \"$3\" \"$4\"; do mkdir -p \"$w/$d/$(dirname \"$s\")\" && cp \"$r/$s\" \"$w/$d/$s\" || exit 1; done; mkdir -p \"$w/$d/$k\" \"$w/$d/flang/proof/checker\" && cp \"$c\" \"$w/$d/flang/proof/checker/сверщик\" || exit 1; done; for d in print/honest print/forged; do mkdir -p \"$w/$d/$k\" \"$w/$d/flang/proof/map\" \"$w/$d/flang/proof/checker\" \"$w/$d/bootstrap\" && cp \"$c\" \"$w/$d/flang/proof/checker/сверщик\" && cp \"$r/flang/proof/map/types.flang\" \"$w/$d/flang/proof/map/\" && ln -sf \"$r/bootstrap/flang\" \"$w/$d/bootstrap/flang\" || exit 1; done; cp \"$r/$k/corpus-natural.record\" \"$r/$k/types.record\" \"$w/verdict/honest/$k/\" && cp \"$r/$k/types.record\" \"$w/verdict/both/$k/\" && cp \"$r/$k/corpus-natural.record\" \"$w/verdict/word/$k/\" && cp \"$r/$k/corpus-natural.record\" \"$w/verdict/part/$k/\" && cp \"$r/$k/corpus-alphabet.record\" \"$w/empty/honest/$k/\" && cp \"$r/$k/poddelka-refleksivnost.record\" \"$w/empty/named/$k/\" && cp \"$r/$k/types.record\" \"$w/print/honest/$k/\"" + +тотальная функция «Trees» + возвращает список строки + пример «Nine small trees» + ожидается ["verdict/honest", "verdict/both", "verdict/word", "verdict/part", "empty/honest", "empty/stripped", "empty/named", "print/honest", "print/forged"] + ["verdict/honest", "verdict/both", "verdict/word", "verdict/part", "empty/honest", "empty/stripped", "empty/named", "print/honest", "print/forged"] + +тотальная функция «Ledgers command» + возвращает строка + пример «A ledger beside each small tree» + ожидается "for d in verdict/honest verdict/both verdict/word verdict/part empty/honest empty/stripped empty/named print/honest print/forged; do (cd \"$0/$d\" && find . -type f \\( -name '*.flang' -o -name '*.record' \\) -print0 | LC_ALL=C sort -z | xargs -0 sha256sum) | sed 's| \\./|\\t|' > \"$0/$d.tsv\" || exit 1; done" + "for d in verdict/honest verdict/both verdict/word verdict/part empty/honest empty/stripped empty/named print/honest print/forged; do (cd \"$0/$d\" && find . -type f \\( -name '*.flang' -o -name '*.record' \\) -print0 | LC_ALL=C sort -z | xargs -0 sha256sum) | sed 's| \\./|\\t|' > \"$0/$d.tsv\" || exit 1; done" + +тотальная функция «Printed sum command» + возвращает строка + пример «Each corpus record checked with its sum written in and with its sum given» + ожидается "cd \"$0\" || exit 2; for z in flang/proof/checker/tests/records/corpus/*.record; do s=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2); [ -f \"$s\" ] || continue; h=$(sha256sum \"$s\" | cut -d' ' -f1); { sed -n '1,/^утверждений /p' \"$z\"; printf 'отпечаток256 %s\\n' \"$h\"; sed '1,/^утверждений /d' \"$z\"; } > \"$1/with-sum.record\"; ./flang/proof/checker/сверщик \"$PWD/$s\" \"$1/with-sum.record\" >/dev/null 2>&1; a=$?; ./flang/proof/checker/сверщик \"$PWD/$s\" \"$PWD/$z\" \"$h\" >/dev/null 2>&1; b=$?; printf '%s %s\\n' \"$a\" \"$b\"; done" + "cd \"$0\" || exit 2; for z in flang/proof/checker/tests/records/corpus/*.record; do s=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2); [ -f \"$s\" ] || continue; h=$(sha256sum \"$s\" | cut -d' ' -f1); { sed -n '1,/^утверждений /p' \"$z\"; printf 'отпечаток256 %s\\n' \"$h\"; sed '1,/^утверждений /d' \"$z\"; } > \"$1/with-sum.record\"; ./flang/proof/checker/сверщик \"$PWD/$s\" \"$1/with-sum.record\" >/dev/null 2>&1; a=$?; ./flang/proof/checker/сверщик \"$PWD/$s\" \"$PWD/$z\" \"$h\" >/dev/null 2>&1; b=$?; printf '%s %s\\n' \"$a\" \"$b\"; done" + +тотальная функция «Property sum command» + возвращает строка + пример «Steps by property checked in the records of task 3455» + ожидается "cd \"$0\" || exit 2; [ -d flang/proof/checker/tests/records/3455 ] || exit 4; for z in flang/proof/checker/tests/records/3455/*.record; do [ -f \"$z\" ] || continue; s=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); [ -f \"$s\" ] || continue; ./flang/proof/checker/сверщик \"$PWD/$s\" \"$PWD/$z\" 2>&1 | grep -ao 'Шагов по свойству проверено по существу [0-9]*'; done; exit 0" + "cd \"$0\" || exit 2; [ -d flang/proof/checker/tests/records/3455 ] || exit 4; for z in flang/proof/checker/tests/records/3455/*.record; do [ -f \"$z\" ] || continue; s=$(grep -a -m1 '^исходник ' \"$z\" | cut -d' ' -f2-); [ -f \"$s\" ] || continue; ./flang/proof/checker/сверщик \"$PWD/$s\" \"$PWD/$z\" 2>&1 | grep -ao 'Шагов по свойству проверено по существу [0-9]*'; done; exit 0" + +тотальная функция «Plan probe command» + возвращает строка + пример «A plan of the tree run with its output kept and one mark looked for» + ожидается "cd \"$0\" || exit 2; o=$1; m=$2; shift 2; ./bootstrap/flang io \"$@\" > \"$o\" 2>&1; k=$?; printf 'code %s\\n' \"$k\"; if grep -aqF -e \"$m\" \"$o\"; then echo 'mark yes'; else echo 'mark no'; fi" + "cd \"$0\" || exit 2; o=$1; m=$2; shift 2; ./bootstrap/flang io \"$@\" > \"$o\" 2>&1; k=$?; printf 'code %s\\n' \"$k\"; if grep -aqF -e \"$m\" \"$o\"; then echo 'mark yes'; else echo 'mark no'; fi" + +тотальная функция «Root» + возвращает строка + пример «The tree lies two directories up» + ожидается "../.." + "../.." + +тотальная функция «Absolute root» + принимает answers: список «Answer» + возвращает строка + пример «The root as the shell sees it» + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным "")] + ожидается "/t" + «First line» от («Output of» от "root" и answers) + +тотальная функция «Work» + принимает answers: список «Answer» + возвращает строка + пример «No work directory yet» + дано answers равно пустой список + ожидается "" + «Made of» от "work" и answers + +тотальная функция «In work» + принимает name: строка, answers: список «Answer» + возвращает строка + пример «A file in the work directory» + дано name равно "ledger.tsv" + дано answers равно [запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается "/w/ledger.tsv" + соединить [(«Work» от answers), "/", name] по "" + +тотальная функция «Checker» + принимает answers: список «Answer» + возвращает строка + пример «The checker of the tree» + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным "")] + ожидается "/t/flang/proof/checker/сверщик" + соединить [(«Absolute root» от answers), "/flang/proof/checker/сверщик"] по "" + +тотальная функция «Source path» + принимает name: строка, answers: список «Answer» + возвращает строка + пример «The source of a record read, from the root» + дано name равно "types" + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным ""), запись «Answer» с «name» равным "record types" и «reply» равным (вариант «Прочитано» с содержимое равным "запись\nисходник flang/proof/map/types.flang\n")] + ожидается "/t/flang/proof/map/types.flang" + соединить [(«Absolute root» от answers), "/", («Source of» от («Text» от name и answers))] по "" + +тотальная функция «Measure probe» + принимает name: строка, tree: строка, mark: строка, dump: признак, answers: список «Answer» + возвращает «Question» + пример «The measure on a small tree with its own ledger» + дано name равно "verdict/both" + дано tree равно "verdict/both" + дано mark равно "ПУСТАЯ В ЧИСЛИТЕЛЕ" + дано dump равно нет + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным ""), запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается запись «Question» с «name» равным "verdict/both" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd \"$0\" || exit 2; o=$1; m=$2; shift 2; ./bootstrap/flang io \"$@\" > \"$o\" 2>&1; k=$?; printf 'code %s\\n' \"$k\"; if grep -aqF -e \"$m\" \"$o\"; then echo 'mark yes'; else echo 'mark no'; fi", "/t", "/w/verdict/both.out", "ПУСТАЯ В ЧИСЛИТЕЛЕ", "flang/proof/share-measure.fscript", "--max-steps", "4000000000", "--timeout", "900000", "--", "--root", "/w/verdict/both", "--ledger", "/w/verdict/both.tsv", "--set", "corpus"]) + «Run» от name и "sh" и («Соединить списки» от ["-c", («Plan probe command»), («Absolute root» от answers), («In work» от (соединить [tree, ".out"] по "") и answers), mark, "flang/proof/share-measure.fscript", "--max-steps", "4000000000", "--timeout", "900000", "--", "--root", («In work» от tree и answers), "--ledger", («In work» от (соединить [tree, ".tsv"] по "") и answers), "--set", "corpus"] и (если dump то ["--dump", («In work» от (соединить [tree, ".dump"] по "") и answers)] иначе (пустой список))) + +тотальная функция «Plan probe» + принимает name: строка, mark: строка, program: строка, keys: список строки, answers: список «Answer» + возвращает «Question» + пример «A program run from the root of the tree» + дано name равно "ledger probe" + дано mark равно "x" + дано program равно "flang/proof/share-ledger-forgery.fscript" + дано keys равно пустой список + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным ""), запись «Answer» с «name» равным "work" и «reply» равным (вариант «Заведено» с путь равным "/w")] + ожидается запись «Question» с «name» равным "ledger probe" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd \"$0\" || exit 2; o=$1; m=$2; shift 2; ./bootstrap/flang io \"$@\" > \"$o\" 2>&1; k=$?; printf 'code %s\\n' \"$k\"; if grep -aqF -e \"$m\" \"$o\"; then echo 'mark yes'; else echo 'mark no'; fi", "/t", "/w/ledger probe.out", "x", "flang/proof/share-ledger-forgery.fscript", "--max-steps", "4000000000", "--timeout", "900000"]) + «Run» от name и "sh" и («Соединить списки» от ["-c", («Plan probe command»), («Absolute root» от answers), («In work» от (соединить [name, ".out"] по "") и answers), mark, program, "--max-steps", "4000000000", "--timeout", "900000"] и keys) + +тотальная функция «Setup» + возвращает список «Question» + пример «The temporary place and the root» + ожидается [запись «Question» с «name» равным "temporary" и «order» равным (вариант «Прочитать переменную среды» с имя равным "FLANG_TMP"), запись «Question» с «name» равным "root" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd ../.. && pwd"])] + [(«Environment» от "temporary" и "FLANG_TMP"), («Run» от "root" и "sh" и ["-c", "cd ../.. && pwd"])] + +тотальная функция «Start» + принимает answers: список «Answer» + возвращает список «Question» + пример «Records, the checker, the binary and a work directory» + дано answers равно пустой список + ожидается [запись «Question» с «name» равным "record abilities" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/checker/tests/records/corpus/abilities.record"), запись «Question» с «name» равным "record types" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/checker/tests/records/corpus/types.record"), запись «Question» с «name» равным "record corpus-natural" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/checker/tests/records/corpus/corpus-natural.record"), запись «Question» с «name» равным "record corpus-alphabet" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/checker/tests/records/corpus/corpus-alphabet.record"), запись «Question» с «name» равным "record poddelka-refleksivnost" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/checker/tests/records/corpus/poddelka-refleksivnost.record"), запись «Question» с «name» равным "record corpus-factorial" и «order» равным (вариант «Прочитать файл» с путь равным "../../flang/proof/checker/tests/records/corpus/corpus-factorial.record"), запись «Question» с «name» равным "checker present" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["-x", "/flang/proof/checker/сверщик"]), запись «Question» с «name» равным "binary present" и «order» равным (вариант «Запустить процесс» с программа равным "test" и аргументы равным ["-x", "/bootstrap/flang"]), запись «Question» с «name» равным "work" и «order» равным (вариант «Завести временный каталог» с образец равным "/srv/tmp/share-self-test.")] + «Соединить списки» от (отобразить («Records read») как name → «Read» от (соединить ["record ", name] по "") и (соединить ["../../", («Corpus»), "/", name, ".record"] по "")) и [(«Run» от "checker present" и "test" и ["-x", («Checker» от answers)]), («Run» от "binary present" и "test" и ["-x", (соединить [(«Absolute root» от answers), "/bootstrap/flang"] по "")]), («Temporary directory» от "work" и (соединить [(«Setting of» от "temporary" и "/srv/tmp" и answers), "/share-self-test."] по ""))] + +тотальная функция «Checker run» + принимает name: строка, arguments: список строки, answers: список «Answer» + возвращает «Question» + пример «The checker with its output and errors together» + дано name равно "wrong key" + дано arguments равно ["--x"] + дано answers равно [запись «Answer» с «name» равным "root" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "/t\n" и ошибки равным "")] + ожидается запись «Question» с «name» равным "wrong key" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "exec \"$@\" 2>&1", "sh", "/t/flang/proof/checker/сверщик", "--x"]) + «Run» от name и "sh" и («Соединить списки» от ["-c", "exec \"$@\" 2>&1", "sh", («Checker» от answers)] и arguments) + +тотальная функция «Building» + принимает answers: список «Answer» + возвращает список «Question» + пример «Nothing without a work directory» + дано answers равно пустой список + ожидается пустой список + пусть w равно («Work» от answers) + пусть k равно («Corpus») + пусть root равно («Absolute root» от answers) + если пусто w + то пустой список + иначе [(«Run» от "ledger built" и "sh" и ["-c", («Ledger command»), root, "HEAD", w]), («Read» от "ledger" и («In work» от "ledger.tsv" и answers)), («Run» от "trees" и "sh" и ["-c", («Build command»), root, w, («Source of» от («Text» от "corpus-alphabet" и answers)), («Source of» от («Text» от "corpus-natural" и answers)), («Source of» от («Text» от "poddelka-refleksivnost" и answers))]), («Write» от "verdict both" и (соединить [w, "/verdict/both/", k, "/corpus-natural.record"] по "") и («All stripped» от («Text» от "corpus-natural" и answers))), («Write» от "verdict word" и (соединить [w, "/verdict/word/", k, "/types.record"] по "") и («Verdict stripped» от («Text» от "types" и answers))), («Write» от "verdict part" и (соединить [w, "/verdict/part/", k, "/types.record"] по "") и («Partly stripped» от («Text» от "types" и answers))), («Write» от "empty stripped" и (соединить [w, "/empty/stripped/", k, "/corpus-natural.record"] по "") и («All stripped» от («Text» от "corpus-natural" и answers))), («Write» от "print forged" и (соединить [w, "/print/forged/", k, "/types.record"] по "") и («Partly stripped» от («Text» от "types" и answers))), («Run» от "printed sums" и "sh" и ["-c", («Printed sum command»), root, w]), («Run» от "property sums" и "sh" и ["-c", («Property sum command»), root]), («Checker run» от "foreign sum" и [(«Source path» от "corpus-factorial" и answers), (соединить [root, "/", k, "/corpus-factorial.record"] по ""), "0000000000000000000000000000000000000000000000000000000000000000"] и answers), («Checker run» от "wrong key" и ["--такого-ключа-нет", («Source path» от "corpus-factorial" и answers), (соединить [root, "/", k, "/corpus-factorial.record"] по "")] и answers), («Checker run» от "types said" и [(«Source path» от "types" и answers), (соединить [root, "/", k, "/types.record"] по "")] и answers), («Checker run» от "abilities said" и [(«Source path» от "abilities" и answers), (соединить [root, "/", k, "/abilities.record"] по "")] и answers), («Run» от "natural sum" и "sha256sum" и [(соединить [root, "/flang/proof/examples/corpus-natural.flang"] по "")])] + +тотальная функция «Ledgering» + принимает answers: список «Answer» + возвращает список «Question» + пример «Nothing without a work directory» + дано answers равно пустой список + ожидается пустой список + если пусто («Work» от answers) то пустой список иначе [(«Run» от "ledgers" и "sh" и ["-c", («Ledgers command»), («Work» от answers)])] + +тотальная функция «Probing» + принимает answers: список «Answer» + возвращает список «Question» + пример «Nothing without a work directory» + дано answers равно пустой список + ожидается пустой список + если пусто («Work» от answers) + то пустой список + иначе «Соединить списки» от [(«Plan probe» от "ledger probe" и "проба порчи на ведомость" и "flang/proof/share-ledger-forgery.fscript" и (пустой список) и answers), («Plan probe» от "kernel probe" и "проба порчи на приговор ядра" и "flang/proof/kernel-verdict-forgery.fscript" и (пустой список) и answers), («Measure probe» от "verdict/honest" и "verdict/honest" и "ПУСТАЯ В ЧИСЛИТЕЛЕ" и нет и answers), («Measure probe» от "verdict/both" и "verdict/both" и "ПУСТАЯ В ЧИСЛИТЕЛЕ" и нет и answers), («Measure probe» от "verdict/word" и "verdict/word" и "СНЯТЫЙ ВЕРДИКТ" и нет и answers), («Measure probe» от "verdict/part" и "verdict/part" и "ПУСТАЯ В ЧИСЛИТЕЛЕ" и нет и answers), («Measure probe» от "empty/honest" и "empty/honest" и "ПУСТАЯ В ЧИСЛИТЕЛЕ" и да и answers), («Measure probe» от "empty/stripped" и "empty/stripped" и "ПУСТАЯ В ЧИСЛИТЕЛЕ" и да и answers), («Measure probe» от "empty/named" и "empty/named" и "ПУСТАЯ В ЧИСЛИТЕЛЕ" и да и answers), («Plan probe» от "print/honest" и "РАЗОШЛАСЬ" и "flang/proof/records-nesting.fscript" и ["--", "--root", («In work» от "print/honest" и answers)] и answers), («Plan probe» от "print/forged" и "РАЗОШЛАСЬ" и "flang/proof/records-nesting.fscript" и ["--", "--root", («In work» от "print/forged" и answers)] и answers), («Plan probe» от "property probe" и "разошёлся с чекером\\t0" и "flang/proof/share-measure.fscript" и ["--", "--root", («Absolute root» от answers), "--ledger", («In work» от "ledger.tsv" и answers), "--set", (соединить [(«Absolute root» от answers), "/flang/proof/checker/tests/records/3455"] по "")] и answers)] и [(«Read» от "empty/honest dump" и («In work» от "empty/honest.dump" и answers)), («Read» от "empty/stripped dump" и («In work» от "empty/stripped.dump" и answers)), («Read» от "empty/named dump" и («In work» от "empty/named.dump" и answers)), («Read» от "ledger probe text" и («In work» от "ledger probe.out" и answers)), («Read» от "kernel probe text" и («In work» от "kernel probe.out" и answers))] + +тотальная функция «Cleaning» + принимает answers: список «Answer» + возвращает список «Question» + пример «No work directory, nothing to clean» + дано answers равно пустой список + ожидается пустой список + если пусто («Work» от answers) то пустой список иначе [(«Run» от "cleaned" и "rm" и ["-rf", («Work» от answers)])] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + пример «A stage outside the plan asks nothing» + дано stages равно 20 + дано answers равно пустой список + ожидается пустой список + разбор stages + случай 5 + то «Setup» + случай 4 + то «Start» от answers + случай 3 + то «Building» от answers + случай 2 + то «Ledgering» от answers + случай 1 + то «Probing» от answers + случай 0 + то «Cleaning» от answers + случай любое + то пустой список + +тотальная функция «Probe code» + принимает name: строка, answers: список «Answer» + возвращает число + пример «A probe not run» + дано name равно "verdict/both" + дано answers равно пустой список + ожидается 127 + пусть said равно («Without blanks» от («Value after» от "code " и («Output of» от name и answers))) + если пусто said то 127 иначе («Count» от said) + +тотальная функция «Marked» + принимает name: строка, answers: список «Answer» + возвращает признак + пример «A mark found» + дано name равно "p" + дано answers равно [запись «Answer» с «name» равным "p" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "code 1\nmark yes\n" и ошибки равным "")] + ожидается да + («Output of» от name и answers) содержит "mark yes" + +тотальная функция «Said lines» + принимает text: строка + возвращает список строки + пример «What a finished plan said, line by line» + дано text равно "доказано: утверждений 0\n{\"plan\":\"P\",\"result\":\"a\\nb\",\"orders\":1,\"log\":[]}\n" + ожидается ["a", "b"] + пусть finished равно (отфильтровать (разделить text по "\n") где line → line начинается с "{\"plan\":\"") + разделить (если пусто finished то («Failure» от text) иначе («Result» от («Cell» от 1 и finished))) по "\n" + +тотальная функция «Hollow accepted» + принимает dump: строка + возвращает число + пример «Accepted rows with nothing proved» + дано dump равно "h\na\tb\t0\t0\t1\t0\tc\td\te\tf\tg\th\ti\tj\tk\tР0\n" + ожидается 1 + длина (отфильтровать («Rows» от dump) где row → ((«Cell» от 16 и row) равен "Р0") и притом ((«Cell» от 6 и row) равен "0")) + +тотальная функция «Kept removed» + принимает said: строка + возвращает список число + пример «Every count of places kept off the kernel word» + дано said равно "снято со слова ядра мест 2; снято со слова ядра мест 0, снято со слова ядра мест 5" + ожидается [2, 0, 5] + отобразить (отфильтровать (отобразить («Without first» от (разделить said по "снято со слова ядра мест ")) как part → «Leading digits» от (если (длина part) больше 24 то (подстрока part с 1 по 24) иначе part)) где digits → не (пусто digits)) как digits → «Count» от digits + +тотальная функция «Removed line» + принимает said: строка + возвращает строка + пример «Several addends sum to more than the largest» + дано said равно "снято со слова ядра мест 2; снято со слова ядра мест 3" + ожидается "П7 снятые места складываются по всем приёмам\tЦЕЛА (слагаемых 2: 2 3, сумма 5 > наибольшего 3)" + пусть kept равно («Kept removed» от said) + пусть total равно (свёртка kept начиная с 0 как sum и each → sum плюс each) + пусть largest равно (свёртка kept начиная с 0 как top и each → если each больше top то each иначе top) + пусть nonzero равно (длина (отфильтровать kept где each → each больше 0)) + пусть listed равно (соединить (отобразить kept как each → к строке each) по " ") + «Chosen» от [(«When» от (nonzero меньше 2) и "П7 снятые места складываются по всем приёмам\tПРОВАЛ (у «abilities.record» ненулевое слагаемое одно — сторожить нечего)"), + («When» от (((«Sum after» от "снято со слова ядра мест " и said) равен total) и притом (total больше largest)) и (соединить ["П7 снятые места складываются по всем приёмам\tЦЕЛА (слагаемых ", (к строке (длина kept)), ": ", listed, ", сумма ", (к строке total), " > наибольшего ", (к строке largest), ")"] по ""))] и (соединить ["П7 снятые места складываются по всем приёмам\tПРОВАЛ (сумма ", (к строке («Sum after» от "снято со слова ядра мест " и said)), ", а слагаемые ", listed, ")"] по "") + +тотальная функция «Flat line» + принимает said: строка + возвращает строка + пример «A verdict of many lines is flattened» + дано said равно "а\nб\n" + ожидается "П6 столбец вердикта — одна строка\tЦЕЛА (настоящий вердикт из 2 строк сплющен)" + пусть stripped равно («Stripped ends» от said) + пусть lines равно (длина (разделить stripped по "\n")) + пусть flat равно («One line» от said) + «Chosen» от [(«When» от (lines меньше 2) и "П6 столбец вердикта — одна строка\tПРОВАЛ (вердикт «types.record» больше не многострочен — сторожить нечего)"), + («When» от ((не (flat содержит "\n")) и притом (не (пусто flat))) и (соединить ["П6 столбец вердикта — одна строка\tЦЕЛА (настоящий вердикт из ", (к строке lines), " строк сплющен)"] по ""))] и "П6 столбец вердикта — одна строка\tПРОВАЛ (переводов строки 1)" + +тотальная функция «Sum lines» + принимает said: строка + возвращает строка + пример «Every record judged the same both ways» + дано said равно "0 0\n3 3\n" + ожидается "П5 строка «отпечаток256» = отпечаток доводом\tЦЕЛА (2 записей, расхождений 0)" + пусть pairs равно («Lines» от said) + пусть apart равно (длина (отфильтровать pairs где pair → не ((«Word» от 1 и pair) равен («Word» от 2 и pair)))) + если (apart равен 0) и притом ((длина pairs) больше 0) то (соединить ["П5 строка «отпечаток256» = отпечаток доводом\tЦЕЛА (", (к строке (длина pairs)), " записей, расхождений 0)"] по "") иначе (соединить ["П5 строка «отпечаток256» = отпечаток доводом\tПРОВАЛ (записей ", (к строке (длина pairs)), ", расхождений ", (к строке apart), ")"] по "") + +тотальная функция «Verdict probe lines» + принимает answers: список «Answer» + возвращает список строки + пример «Nothing run fails the control» + дано answers равно пустой список + ожидается ["контроль: честные записи корпуса\tПРОВАЛ (код 127)", "подлог А: вердикт и следы сняты вместе\tПРОШЁЛ — охраны нет (код 127)", "подлог Б: снято только слово «доказано»\tПРОШЁЛ — охраны нет (код 127)", "дыра: вердикт снят у ЧАСТИ утверждений\tНЕ ПОКАЗАНА (код 127) — подделка не собралась либо линейку правили"] + пусть honest равно («Probe code» от "verdict/honest" и answers) + пусть both равно («Probe code» от "verdict/both" и answers) + пусть word равно («Probe code» от "verdict/word" и answers) + пусть part равно («Probe code» от "verdict/part" и answers) + [(если honest равен 0 то "контроль: честные записи корпуса\tЦЕЛА (код 0)" иначе (соединить ["контроль: честные записи корпуса\tПРОВАЛ (код ", (к строке honest), ")"] по "")), + (если (both равен 1) и притом («Marked» от "verdict/both" и answers) то "подлог А: вердикт и следы сняты вместе\tОТВЕРГНУТ (пустой числитель, код 1)" иначе (соединить ["подлог А: вердикт и следы сняты вместе\tПРОШЁЛ — охраны нет (код ", (к строке both), ")"] по "")), + (если (word равен 1) и притом («Marked» от "verdict/word" и answers) то "подлог Б: снято только слово «доказано»\tОТВЕРГНУТ (примета, код 1)" иначе (соединить ["подлог Б: снято только слово «доказано»\tПРОШЁЛ — охраны нет (код ", (к строке word), ")"] по "")), + (если part равен 0 то "дыра: вердикт снят у ЧАСТИ утверждений\tПОКАЗАНА (оба сторожа молчат, код 0)" иначе (соединить ["дыра: вердикт снят у ЧАСТИ утверждений\tНЕ ПОКАЗАНА (код ", (к строке part), ") — подделка не собралась либо линейку правили"] по ""))] + +тотальная функция «Empty probe lines» + принимает answers: список «Answer» + возвращает список строки + пример «Nothing run» + дано answers равно пустой список + ожидается ["контроль: честная непустая запись в числителе\tПРОВАЛ (код 127, пустых в Р0 0)", "подлог: пустая запись просочилась в числитель\tПРОШЁЛ — охраны нет (код 127, пустых в Р0 0)", "показ: пустая, но названная поимённо\tПРОВАЛ (код 127) — список разошёлся с корпусом"] + пусть honest равно («Probe code» от "empty/honest" и answers) + пусть stripped равно («Probe code» от "empty/stripped" и answers) + пусть named равно («Probe code» от "empty/named" и answers) + пусть honesthollow равно («Hollow accepted» от («Output of» от "empty/honest dump" и answers)) + пусть strippedhollow равно («Hollow accepted» от («Output of» от "empty/stripped dump" и answers)) + пусть namedhollow равно («Hollow accepted» от («Output of» от "empty/named dump" и answers)) + [(если (honest равен 0) и притом (honesthollow равен 0) то "контроль: честная непустая запись в числителе\tЦЕЛА (Р0, доказанными 7, код 0)" иначе (соединить ["контроль: честная непустая запись в числителе\tПРОВАЛ (код ", (к строке honest), ", пустых в Р0 ", (к строке honesthollow), ")"] по "")), + (если (stripped равен 1) и притом ((strippedhollow больше 0) и притом («Marked» от "empty/stripped" и answers)) то "подлог: пустая запись просочилась в числитель\tОТВЕРГНУТ (Р0 при доказанными 0, код 1)" иначе (соединить ["подлог: пустая запись просочилась в числитель\tПРОШЁЛ — охраны нет (код ", (к строке stripped), ", пустых в Р0 ", (к строке strippedhollow), ")"] по "")), + (если (named равен 0) и притом (namedhollow больше 0) то "показ: пустая, но названная поимённо\tЗАКОННА (Р0 при доказанными 0, код 0)" иначе (соединить ["показ: пустая, но названная поимённо\tПРОВАЛ (код ", (к строке named), ") — список разошёлся с корпусом"] по ""))] + +тотальная функция «Print probe lines» + принимает answers: список «Answer» + возвращает список строки + пример «Nothing run» + дано answers равно пустой список + ожидается ["контроль: честная запись против печати ядра\tПРОВАЛ (код 127)", "охрана: печать ядра на той же подделке\tПРОШЛА — охраны нет (код 127)"] + пусть honest равно («Probe code» от "print/honest" и answers) + пусть forged равно («Probe code» от "print/forged" и answers) + [(если honest равен 0 то "контроль: честная запись против печати ядра\tЦЕЛА (побайтово, код 0)" иначе (соединить ["контроль: честная запись против печати ядра\tПРОВАЛ (код ", (к строке honest), ")"] по "")), + (если (forged равен 1) и притом («Marked» от "print/forged" и answers) то "охрана: печать ядра на той же подделке\tОТВЕРГНУТА (код 1)" иначе (соединить ["охрана: печать ядра на той же подделке\tПРОШЛА — охраны нет (код ", (к строке forged), ")"] по ""))] + +тотальная функция «Summed up» + принимает lines: список строки, closing: строка, title: строка + возвращает список строки + пример «All inner lines agreed» + дано lines равно ["контроль\tЦЕЛА"] + дано closing равно "проба цела" + дано title равно "П9 проба" + ожидается ["контроль\tЦЕЛА", "проба цела", "П9 проба\tЦЕЛА"] + пусть bad равно (не (пусто (отфильтровать lines где line → (line содержит "\tПРОВАЛ") или ((line содержит "\tПРОШЁЛ") или ((line содержит "\tПРОШЛА") или (line содержит "\tНЕ ПОКАЗАНА")))))) + «Соединить списки» от lines и (если bad то [(соединить [title, "\tПРОВАЛ"] по "")] иначе [closing, (соединить [title, "\tЦЕЛА"] по "")]) + +тотальная функция «Report lines» + принимает answers: список «Answer» + возвращает список строки + пример «Nothing read at all» + дано answers равно пустой список + ожидается ["П1 счёт пород не слеп\tПРОВАЛ", "П2 изъятие роняет счёт\tПРОВАЛ (0 → 0)", "П3 чужой отпечаток отвергнут\tПРОВАЛ (код 127)", "П4 кривой вызов — код 2\tПРОВАЛ (код 127)", "П5 строка «отпечаток256» = отпечаток доводом\tПРОВАЛ (записей 0, расхождений 0)", "П6 столбец вердикта — одна строка\tПРОВАЛ (вердикт «types.record» больше не многострочен — сторожить нечего)", "П7 снятые места складываются по всем приёмам\tПРОВАЛ (у «abilities.record» ненулевое слагаемое одно — сторожить нечего)", "П8 ведомость знает дерево и не знает выдуманного\tПРОВАЛ (в ведомости «», у файла «», выдуманный «»)", "", "П9 подлог отвергнут, честная запись зелена\tПРОВАЛ", "П10 подлог, проведённый в коммит, ловится приговором ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)", "контроль: честные записи корпуса\tПРОВАЛ (код 127)", "подлог А: вердикт и следы сняты вместе\tПРОШЁЛ — охраны нет (код 127)", "подлог Б: снято только слово «доказано»\tПРОШЁЛ — охраны нет (код 127)", "дыра: вердикт снят у ЧАСТИ утверждений\tНЕ ПОКАЗАНА (код 127) — подделка не собралась либо линейку правили", "П11/П12 ложно-зелёная запись отвергнута, честная зелена\tПРОВАЛ", "П14 тождество сверено там, где слагаемые не нули\tПРОВАЛ (нет каталога 3455)", "контроль: честная непустая запись в числителе\tПРОВАЛ (код 127, пустых в Р0 0)", "подлог: пустая запись просочилась в числитель\tПРОШЁЛ — охраны нет (код 127, пустых в Р0 0)", "показ: пустая, но названная поимённо\tПРОВАЛ (код 127) — список разошёлся с корпусом", "П15 пустая запись в числителе Г4 краснит прогон\tПРОВАЛ", "П13 подделка записи ловится печатью ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)"] + пусть abilities равно («Kinds of» от («Text» от "abilities" и answers)) + пусть bare равно («Kinds of» от («Without theorem» от («Text» от "abilities" и answers))) + пусть foreign равно («Exit code of» от "foreign sum" и answers) + пусть crooked равно («Exit code of» от "wrong key" и answers) + пусть ledger равно («Output of» от "ledger" и answers) + пусть known равно («Ledger sum» от "flang/proof/examples/corpus-natural.flang" и ledger) + пусть actual равно («Word» от 1 и («First line» от («Output of» от "natural sum" и answers))) + пусть invented равно («Ledger sum» от "свои/выдуманный.flang" и ledger) + пусть binary равно ((«Exit code of» от "binary present" и answers) равен 0) + пусть p1 равно (если (((abilities.«p1») плюс (abilities.«p2»)) плюс (abilities.«p3»)) больше 0 то (соединить ["П1 счёт пород не слеп\tЦЕЛА (П1=", (к строке (abilities.«p1»)), " П2=", (к строке (abilities.«p2»)), " П3=", (к строке (abilities.«p3»)), ")"] по "") иначе "П1 счёт пород не слеп\tПРОВАЛ") + пусть p2 равно (соединить ["П2 изъятие роняет счёт\t", (если (bare.«p1») меньше (abilities.«p1») то "ЦЕЛА" иначе "ПРОВАЛ"), " (", (к строке (abilities.«p1»)), " → ", (к строке (bare.«p1»)), ")"] по "") + пусть p3 равно (если foreign равен 1 то "П3 чужой отпечаток отвергнут\tЦЕЛА (код 1)" иначе (соединить ["П3 чужой отпечаток отвергнут\tПРОВАЛ (код ", (к строке foreign), ")"] по "")) + пусть p4 равно (если crooked равен 2 то "П4 кривой вызов — код 2\tЦЕЛА" иначе (соединить ["П4 кривой вызов — код 2\tПРОВАЛ (код ", (к строке crooked), ")"] по "")) + пусть p8 равно (если (не (пусто known)) и притом ((known равен actual) и притом (пусто invented)) то "П8 ведомость знает дерево и не знает выдуманного\tЦЕЛА" иначе (соединить ["П8 ведомость знает дерево и не знает выдуманного\tПРОВАЛ (в ведомости «", known, "», у файла «", actual, "», выдуманный «", invented, "»)"] по "")) + пусть p9 равно (добавить (если («Probe code» от "ledger probe" и answers) равен 0 то "П9 подлог отвергнут, честная запись зелена\tЦЕЛА" иначе "П9 подлог отвергнут, честная запись зелена\tПРОВАЛ") к («Said lines» от («Output of» от "ledger probe text" и answers))) + пусть p10 равно («Kernel probe lines» от binary и answers) + пусть p14 равно («Property line» от answers) + пусть p13 равно (если binary то («Summed up» от («Print probe lines» от answers) и "проба на печать ядра: подделка записи отвергнута, честная запись зелена" и "П13 подделка записи ловится печатью ядра") иначе ["П13 подделка записи ловится печатью ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)"]) + «All lines» от [[p1, p2, p3, p4, («Sum lines» от («Output of» от "printed sums" и answers)), («Flat line» от («Output of» от "types said" и answers)), («Removed line» от («Output of» от "abilities said" и answers)), p8], p9, p10, («Summed up» от («Verdict probe lines» от answers) и "проба на снятый вердикт: обе подделки отвергнуты, честные записи зелены, остаток назван" и "П11/П12 ложно-зелёная запись отвергнута, честная зелена"), [p14], («Summed up» от («Empty probe lines» от answers) и "проба на пустой числитель: незаявленная пустота красна, честная зелена, заявленная законна" и "П15 пустая запись в числителе Г4 краснит прогон"), p13] + +тотальная функция «All lines» + принимает parts: список список строки + возвращает список строки + пример «Parts joined in order» + дано parts равно [["а"], ["б", "в"]] + ожидается ["а", "б", "в"] + свёртка parts начиная с (пустой список) как joined и part → «Соединить списки» от joined и part + +тотальная функция «Kernel probe lines» + принимает binary: признак, answers: список «Answer» + возвращает список строки + пример «Without the binary the probe is not called» + дано binary равно нет + дано answers равно пустой список + ожидается ["П10 подлог, проведённый в коммит, ловится приговором ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)"] + пусть said равно («Said lines» от («Output of» от "kernel probe text" и answers)) + «Chosen» от [(«When» от (не binary) и ["П10 подлог, проведённый в коммит, ловится приговором ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)"]), + («When» от ((«Probe code» от "kernel probe" и answers) равен 0) и (добавить "П10 подлог, проведённый в коммит, ловится приговором ядра\tЦЕЛА" к said))] и (добавить "П10 подлог, проведённый в коммит, ловится приговором ядра\tПРОВАЛ" к said) + +тотальная функция «Property line» + принимает answers: список «Answer» + возвращает строка + пример «No directory of task 3455» + дано answers равно [запись «Answer» с «name» равным "property sums" и «reply» равным (вариант «Процесс завершён» с код равным 4 и вывод равным "" и ошибки равным "")] + ожидается "П14 тождество сверено там, где слагаемые не нули\tПРОВАЛ (нет каталога 3455)" + пусть checked равно («Sum after» от "Шагов по свойству проверено по существу " и («Output of» от "property sums" и answers)) + пусть probe равно («Probe code» от "property probe" и answers) + «Chosen» от [(«When» от (не ((«Exit code of» от "property sums" и answers) равен 0)) и "П14 тождество сверено там, где слагаемые не нули\tПРОВАЛ (нет каталога 3455)"), + («When» от (checked равен 0) и "П14 тождество сверено там, где слагаемые не нули\tПРОВАЛ (в 3455 снятий «по свойству» больше нет — сторожить нечем)"), + («When» от ((probe равен 0) и притом («Marked» от "property probe" и answers)) и (соединить ["П14 тождество сверено там, где слагаемые не нули\tЦЕЛА (снятий «по свойству» ", (к строке checked), ", расхождений 0)"] по ""))] и (соединить ["П14 тождество сверено там, где слагаемые не нули\tПРОВАЛ (код ", (к строке probe), ")"] по "") + +тотальная функция «Verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + пример «Nothing read fails» + дано answers равно пустой список + ожидается вариант «Провал» с код равным "FLANG_SHARE_SELF_TEST" и сообщение равным "П1 счёт пород не слеп\tПРОВАЛ\nП2 изъятие роняет счёт\tПРОВАЛ (0 → 0)\nП3 чужой отпечаток отвергнут\tПРОВАЛ (код 127)\nП4 кривой вызов — код 2\tПРОВАЛ (код 127)\nП5 строка «отпечаток256» = отпечаток доводом\tПРОВАЛ (записей 0, расхождений 0)\nП6 столбец вердикта — одна строка\tПРОВАЛ (вердикт «types.record» больше не многострочен — сторожить нечего)\nП7 снятые места складываются по всем приёмам\tПРОВАЛ (у «abilities.record» ненулевое слагаемое одно — сторожить нечего)\nП8 ведомость знает дерево и не знает выдуманного\tПРОВАЛ (в ведомости «», у файла «», выдуманный «»)\n\nП9 подлог отвергнут, честная запись зелена\tПРОВАЛ\nП10 подлог, проведённый в коммит, ловится приговором ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)\nконтроль: честные записи корпуса\tПРОВАЛ (код 127)\nподлог А: вердикт и следы сняты вместе\tПРОШЁЛ — охраны нет (код 127)\nподлог Б: снято только слово «доказано»\tПРОШЁЛ — охраны нет (код 127)\nдыра: вердикт снят у ЧАСТИ утверждений\tНЕ ПОКАЗАНА (код 127) — подделка не собралась либо линейку правили\nП11/П12 ложно-зелёная запись отвергнута, честная зелена\tПРОВАЛ\nП14 тождество сверено там, где слагаемые не нули\tПРОВАЛ (нет каталога 3455)\nконтроль: честная непустая запись в числителе\tПРОВАЛ (код 127, пустых в Р0 0)\nподлог: пустая запись просочилась в числитель\tПРОШЁЛ — охраны нет (код 127, пустых в Р0 0)\nпоказ: пустая, но названная поимённо\tПРОВАЛ (код 127) — список разошёлся с корпусом\nП15 пустая запись в числителе Г4 краснит прогон\tПРОВАЛ\nП13 подделка записи ловится печатью ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)" + пусть lines равно («Report lines» от answers) + если пусто (отфильтровать lines где line → (line начинается с "П") и притом (line содержит "\tПРОВАЛ")) + то вариант «Конец работы» с значение равным (соединить lines по "\n") + иначе вариант «Провал» с код равным "FLANG_SHARE_SELF_TEST" и сообщение равным (соединить lines по "\n") + +тотальная функция «Obstacles» + принимает asked: строка, answers: список «Answer» + возвращает список строки + пример «No checker» + дано asked равно "checker present" + дано answers равно [запись «Answer» с «name» равным "checker present" и «reply» равным (вариант «Процесс завершён» с код равным 1 и вывод равным "" и ошибки равным "")] + ожидается ["нет чекера /flang/proof/checker/сверщик — собрать: make -C flang/proof/checker"] + «Chosen» от [(«When» от ((asked равен "checker present") и притом (не ((«Exit code of» от asked и answers) равен 0))) и [(соединить ["нет чекера ", («Checker» от answers), " — собрать: make -C flang/proof/checker"] по "")]), + («When» от ((asked равен "work") и притом (пусто («Work» от answers))) и ["временный каталог не заведён"]), + («When» от ((asked равен "trees") и притом (не ((«Exit code of» от asked и answers) равен 0))) и ["ПОДЛОГ НЕ СОБРАЛСЯ: малые деревья проб не сложились — поправить пробу, линейка ни при чём"])] и (пустой список) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + пример «An empty queue at the last stage gives the verdict» + дано queue равно пустой список + дано stages равно 0 + дано answers равно [запись «Answer» с «name» равным "checker present" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "" и ошибки равным "")] + ожидается вариант «Провал» с код равным "FLANG_SHARE_SELF_TEST" и сообщение равным "П1 счёт пород не слеп\tПРОВАЛ\nП2 изъятие роняет счёт\tПРОВАЛ (0 → 0)\nП3 чужой отпечаток отвергнут\tПРОВАЛ (код 127)\nП4 кривой вызов — код 2\tПРОВАЛ (код 127)\nП5 строка «отпечаток256» = отпечаток доводом\tПРОВАЛ (записей 0, расхождений 0)\nП6 столбец вердикта — одна строка\tПРОВАЛ (вердикт «types.record» больше не многострочен — сторожить нечего)\nП7 снятые места складываются по всем приёмам\tПРОВАЛ (у «abilities.record» ненулевое слагаемое одно — сторожить нечего)\nП8 ведомость знает дерево и не знает выдуманного\tПРОВАЛ (в ведомости «», у файла «», выдуманный «»)\n\nП9 подлог отвергнут, честная запись зелена\tПРОВАЛ\nП10 подлог, проведённый в коммит, ловится приговором ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)\nконтроль: честные записи корпуса\tПРОВАЛ (код 127)\nподлог А: вердикт и следы сняты вместе\tПРОШЁЛ — охраны нет (код 127)\nподлог Б: снято только слово «доказано»\tПРОШЁЛ — охраны нет (код 127)\nдыра: вердикт снят у ЧАСТИ утверждений\tНЕ ПОКАЗАНА (код 127) — подделка не собралась либо линейку правили\nП11/П12 ложно-зелёная запись отвергнута, честная зелена\tПРОВАЛ\nП14 тождество сверено там, где слагаемые не нули\tПРОВАЛ (нет каталога 3455)\nконтроль: честная непустая запись в числителе\tПРОВАЛ (код 127, пустых в Р0 0)\nподлог: пустая запись просочилась в числитель\tПРОШЁЛ — охраны нет (код 127, пустых в Р0 0)\nпоказ: пустая, но названная поимённо\tПРОВАЛ (код 127) — список разошёлся с корпусом\nП15 пустая запись в числителе Г4 краснит прогон\tПРОВАЛ\nП13 подделка записи ловится печатью ядра\tНЕ ЗВАЛАСЬ (нет bootstrap/flang)" + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Verdict» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + пример «Six stages lie ahead» + ожидается запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 6 и «answers» равным пустой список + «Begin with» от 6 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + пример «The first turn asks for the place of temporary files» + дано inquiry равно запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 6 и «answers» равным пустой список + дано reply равно вариант «Пока ничего» + ожидается вариант «Сделать» с поручение равным (вариант «Прочитать переменную среды» с имя равным "FLANG_TMP") и потом равным (запись «Inquiry» с «asked» равным "temporary" и «queue» равным [запись «Question» с «name» равным "root" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd ../.. && pwd"])] и «stages» равным 5 и «answers» равным пустой список) + пусть answers равно («Heard» от inquiry и reply) + разбор («Obstacles» от (inquiry.«asked») и answers) + случай голова и хвост + то если пусто («Work» от answers) + то вариант «Не проверено» с код равным "FLANG_SHARE_SELF_TEST_NOT_MEASURED" и сообщение равным голова + иначе вариант «Сделать» с поручение равным (вариант «Запустить процесс» с программа равным "rm" и аргументы равным ["-rf", («Work» от answers)]) и потом равным (запись «Inquiry» с «asked» равным (соединить ["stopped: ", голова] по "") и «queue» равным пустой список и «stages» равным 0 и «answers» равным answers) + случай пусто + то если (inquiry.«asked») начинается с "stopped: " + то вариант «Не проверено» с код равным "FLANG_SHARE_SELF_TEST_NOT_MEASURED" и сообщение равным («After» от "stopped: " и (inquiry.«asked»)) + иначе «Proceed» от (inquiry.«queue») и (inquiry.«stages») и answers + +план «Share self test» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/flang/scripts/run-verdict-targets-not-named.tsv b/flang/scripts/run-verdict-targets-not-named.tsv index fea5bb5b1..695536e39 100644 --- a/flang/scripts/run-verdict-targets-not-named.tsv +++ b/flang/scripts/run-verdict-targets-not-named.tsv @@ -1,4 +1,3 @@ файл ключ довод flang/test/обход.sh да обходчик гоняет проверки дерева на flang; вердикта они не проходят (замер 18.09: «доказано 224, сетка 42, на веру 83»), без ключа не прогналась бы ни одна scripts/guards/one-string-measure-guard.sh нет зовёт flang/test/string-measure.flang через переменную PLAN; файл вердикт проходит -flang/proof/forgeries/run.sh нет зовёт план сверки flang/proof/check.fscript через переменную; план вердикт проходит diff --git a/scripts/four-coverages.fscript b/scripts/four-coverages.fscript index 1602d8185..99a3c1aab 100644 --- a/scripts/four-coverages.fscript +++ b/scripts/four-coverages.fscript @@ -3,6 +3,7 @@ использует «Inquiry» из "inquiry.fscript" использует «Reading» из "reading.fscript" использует «Report provenance» из "report-provenance.fscript" + использует «Plan output» из "plan-output.fscript" использует «Lists» только «Соединить списки» тотальная функция «Tree» @@ -27,8 +28,8 @@ тотальная функция «Measurements» возвращает список «Question» - «Соединить списки» от («Provenance questions» от («Tree»)) и [(«Run from» от "share" и («Tree») и "sh" и ["flang/proof/corpus-share.sh", "--проигрыванием"]), - («Run from» от "corpus" и («Tree») и "sh" и ["flang/proof/corpus-share.sh", "--набор", "корпус"]), + «Соединить списки» от («Provenance questions» от («Tree»)) и [(«Run from» от "share" и («Tree») и "bootstrap/flang" и ["io", "flang/proof/replay-share.fscript", "--max-steps", "4000000000", "--timeout", "900000"]), + («Run from» от "corpus" и («Tree») и "bootstrap/flang" и ["io", "flang/proof/share-measure.fscript", "--max-steps", "4000000000", "--timeout", "900000", "--", "--set", "corpus"]), («Run from» от "lemmas" и («Tree») и "grep" и ["-h", "-a", "^theorem «", "flang/proof/lean/Rules.lean", "flang/proof/lean/Term.lean"]), («Run from» от "accepted" и («Tree») и "sed" и ["-n", "/^def «правила» : List/,/\\]$/p", "flang/proof/lean/Acceptance.lean"]), («Read from» от "rules" и («Tree») и («Rules table»)), @@ -175,7 +176,7 @@ тотальная функция «Said by» принимает name: строка, answers: список «Answer» возвращает список строки - «Соединить списки» от («Lines» от («Output of» от name и answers)) и («Lines» от («Errors of» от name и answers)) + «Lines» от («Plan said by» от name и answers) тотальная функция «Share words» принимает line: строка @@ -193,7 +194,7 @@ тотальная функция «Idle» принимает answers: список «Answer» возвращает строка - пусть line равно («First line» от (соединить (отфильтровать («Lines» от («Output of» от "corpus" и answers)) где line → (соединить («Words» от line) по " ") начинается с "из них ВПУСТУЮ") по "\n")) + пусть line равно («First line» от (соединить (отфильтровать («Said by» от "corpus" и answers) где line → (соединить («Words» от line) по " ") начинается с "из них ВПУСТУЮ") по "\n")) «Leading digits» от («Cell» от 2 и (разделить line по "\t")) тотальная функция «Share lines» diff --git a/scripts/guards/file-extensions.fscript b/scripts/guards/file-extensions.fscript index a0bc25807..52fe0e64d 100644 --- a/scripts/guards/file-extensions.fscript +++ b/scripts/guards/file-extensions.fscript @@ -140,7 +140,7 @@ запись «Место» с «путь» равным "flang/scripts/word-occupancy.fscript" и «нужно» равным "(«Кончается на» от имя и \".фланг\") или («Кончается на» от имя и \".fscript\")" и «нельзя» равным "", запись «Место» с «путь» равным "flang/test/владение-состоянием.sh" и «нужно» равным "--include='*.фланг' --include='*.fscript'" и «нельзя» равным "--include='*.фланг' .", запись «Место» с «путь» равным "docs/site/changelog.json" и «нужно» равным ".фп" и «нельзя» равным "\"*.flang\"]", - запись «Место» с «путь» равным "flang/proof/forgeries/run.sh" и «нужно» равным "examples/*.фланг; do" и «нельзя» равным "", + запись «Место» с «путь» равным "flang/proof/forgeries/run.fscript" и «нужно» равным "\".fp\", \".фп\", \".фланг\"]" и «нельзя» равным "", запись «Место» с «путь» равным "flang/proof/checker/tests/families/run-induction/letters.record" и «нужно» равным ".фп" и «нельзя» равным "\"*.flang\"]", запись «Место» с «путь» равным "scripts/guards/tree-inventory.fscript" и «нужно» равным "«Кончается на» от путь и \".fscript\"" и «нельзя» равным "", запись «Место» с «путь» равным "scripts/guards/link-guard.fscript" и «нужно» равным "\"flang\", \"fscript\", \"md\"" и «нельзя» равным "\"flang\", \"md\"", diff --git a/scripts/ledgers/file-name-words.txt b/scripts/ledgers/file-name-words.txt index 32aa31a37..24434087c 100644 --- a/scripts/ledgers/file-name-words.txt +++ b/scripts/ledgers/file-name-words.txt @@ -1373,6 +1373,7 @@ replaced replacement replaces replacing +replay replayed reply report diff --git a/scripts/ledgers/guards-without-forgery-probe.json b/scripts/ledgers/guards-without-forgery-probe.json index e012e6505..f50a2b39e 100644 --- a/scripts/ledgers/guards-without-forgery-probe.json +++ b/scripts/ledgers/guards-without-forgery-probe.json @@ -41,5 +41,5 @@ "checker:check": "CI ЗОВЁТ ЕГО И ЕМУ ВЕРИТ, а покраснеть на порче не показано ни разу. Самый опасный род: выпотрошенный сторож останется зелёным, и сказать об этом будет некому. Пробу строить в первую очередь.", "numbers:check": "СТОРОЖ ПРОГНАН ЦЕЛИКОМ, пробы всё ещё нет: код 1 за 6864 с — 1 ч 54 мин (перемер 6 сентября 2026, свой прогон), бед 20. Цена та же, что у подсчётов: обход 295 файлов корпуса. Прежняя запись 5 сентября: код 124 на 200 с (задача 5612).", "kernel-verdict:check": "проба есть — flang/proof/kernel-verdict-forgery.fscript (короткая команда kernel-verdict:forgery), но в CI её не ставят вместе с самим сторожем: сторож КРАСЕН по делу (37 файлов, замер 1 октября 2026).", - "proved-share:check": "проба есть и стоит в CI — flang/proof/share-ledger-forgery.fscript (binary.yml, «if ! … share-ledger-forgery.fscript»), но это другой файл, чем сам сторож corpus-share.sh, и сличение по имени файла её не видит." + "proved-share:check": "проба есть и стоит в CI — flang/proof/share-ledger-forgery.fscript (binary.yml, «if ! … share-ledger-forgery.fscript»), но это другой файл, чем сам сторож share-measure.fscript, и сличение по имени файла её не видит." } diff --git a/scripts/provability.fscript b/scripts/provability.fscript index e2e4934d0..37a864078 100644 --- a/scripts/provability.fscript +++ b/scripts/provability.fscript @@ -124,7 +124,7 @@ тотальная функция «Suites» принимает answers: список «Answer» возвращает список «Question» - «Соединить списки» от [(«Run from» от "share" и («Root») и "sh" и ["flang/proof/corpus-share.sh", "--проигрыванием"]), + «Соединить списки» от [(«Run from» от "share" и («Root») и "bootstrap/flang" и ["io", "flang/proof/replay-share.fscript", "--max-steps", "4000000000", "--timeout", "900000"]), («Run from» от "probes" и («Root») и "sh" и ["-c", "exec \"$0\" \"$@\" > /dev/null", "bootstrap/flang", "io", "flang/proof/checker/tests/run.fscript", "--max-steps", "4000000000", "--timeout", "600000", "--", («Report file» от answers)]), («Read» от "probes report" и («Report file» от answers))] и («Provenance questions» от («Root»))