Standard library API
Every module of flang/stdlib/ and every one of its functions, exactly as the source writes them: the signature, the требует preconditions, the обеспечивает guarantees and the first пример of the function. The body is not shown: to call a function you need what it accepts, what it returns and what it promises. In flang the contract is the documentation of a function, so there is no retelling here, only the lines of the source themselves. The library is written in Russian, and so are its names.
Which module fits a task and how to import it: Library reference.
How to read the page
Under the heading of a module stand its file, the number of its functions and the state of the kernel ledger. The ledger is what flang check --proof prints for the module: how the termination of every function is proved and what the kernel said about every guarantee. It is taken by bootstrap/flang run-script docs:library-status, one module at a time with a time limit per module, and is kept in docs/site/library-status.tsv together with the SHA-256 digest of the module text it was taken from.
The status table under a module is printed only while the digest agrees with the present text of the file. A module changed after the measurement gets no table, and the line under the heading says the ledger was taken from another version of the file: an old status is never shown as the present one.
| Word in the table | Meaning |
|---|---|
доказано | true for every input |
сетка | counted on the values of the examples, no violation found; not a proof |
объявлено, не доказано | the kernel lacked rules; the guarantee is checked at run time |
нарушено | a counterexample was found |
Modules
«AES»
flang/stdlib/aes.flang — functions 105; the kernel ledger was taken from this version of the file
тип «Ход шифра»
вариант «Ход шифра» содержит расширение: список числа, квадрат: список числа
тип «Ход счёта»
вариант «Ход счёта» содержит перенос: число, байты: список числа
тип «Ход гаммы»
вариант «Ход гаммы» содержит расширение: список числа, счётчик: список числа, гамма: список числа, позиция: число, выход: список числа
тип «Ход поля»
вариант «Ход поля» содержит накоплено: список числа, сдвиг: список числа
тип «Ход сдвига»
вариант «Ход сдвига» содержит прежний: число, байты: список числа
тип «Ход GHASH»
вариант «Ход GHASH» содержит ключ: список числа, свод: список числа, буфер: список числа, набрано: число
тип «Ход гаммы GCM»
вариант «Ход гаммы GCM» содержит ключ: список числа, счётчик: список числа, гамма: список числа, позиция: число, выход: список числа
тип «Печать GCM»
вариант «Печать GCM» содержит шифротекст: список числа, тег: список числа
тип «Исход GCM»
вариант «Расшифровано» содержит текст: список числа
вариант «Тег не сошёлся» содержит посчитан: список числа, предъявлен: список числа
тип «Ход CBC»
вариант «Ход CBC» содержит ключ: список числа, сцепка: список числа, буфер: список числа, набрано: число, выход: список числа
тип «Ход начала»
вариант «Ход начала» содержит предел: число, место: число, выход: список числа
тотальная функция «Веса байта»
возвращает список числа
обеспечивает «разрядов ровно восемь» (длина результат) равен 8
обеспечивает «младший вес — единица» («Байт по номеру» от результат и 1) равен 1
обеспечивает «старший вес — сто двадцать восемь» («Байт по номеру» от результат и 8) равен 128
обеспечивает «вес старшего разряда меньше двухсот пятидесяти шести» («Байт по номеру» от результат и 8) меньше 256
пример «Восемь весов, от единицы до ста двадцати восьми»
ожидается [1, 2, 4, 8, 16, 32, 64, 128]
тотальная функция «Исключающее или байтов»
принимает первый: число, второй: число
возвращает число
обеспечивает «итог — байт снизу» результат не меньше 0
обеспечивает «итог — байт сверху» результат меньше 256
пример «Ноль с нулём»
дано первый равно 0
дано второй равно 0
ожидается 0
тотальная функция «Байт по номеру»
принимает байты: список числа, номер: число
возвращает число
обеспечивает «байт по номеру — байт сверху» результат меньше 256
обеспечивает «байт по номеру — байт снизу» результат не меньше 0
обеспечивает «за границами номера — ноль» если (номер меньше 1) или (номер больше (длина байты)) то (результат равен 0) иначе да
обеспечивает «вне списка ноль, второй записью» не ((номер меньше 1) или (номер больше (длина байты))) или (результат равен 0)
обеспечивает «до начала списка — ноль» если (номер меньше 1) то (результат равен 0) иначе да
обеспечивает «за хвостом списка — ноль» если (номер больше (длина байты)) то (результат равен 0) иначе да
пример «Первый»
дано байты равно [7, 8, 9]
дано номер равно 1
ожидается 7
тотальная функция «Таблица подстановки»
возвращает список числа
обеспечивает «в таблице ровно двести пятьдесят шесть байтов» (длина результат) равен 256
пример «Первый байт — 0x63, последний — 0x16»
ожидается [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89,
71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216,
49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160,
82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208,
239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182,
218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79,
220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145,
149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28,
166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193,
29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230,
66, 104, 65, 153, 45, 15, 176, 84, 187, 22]
тотальная функция «Подстановка»
принимает байт: число
возвращает число
обеспечивает «подстановка — байт» (результат не меньше 0) и притом (результат меньше 256)
пример «Ноль идёт в 0x63»
дано байт равно 0
ожидается 99
тотальная функция «Удвоить в поле»
принимает байт: число
возвращает число
обеспечивает «удвоенное — байт» (результат не меньше 0) и притом (результат меньше 256)
обеспечивает «байт без старшего разряда удваивается просто» если ((«Свести к байту» от байт) меньше 128) то (результат равен ((«Свести к байту» от байт) умножить на 2)) иначе да
пример «Единица удваивается в двойку»
дано байт равно 1
ожидается 2
тотальная функция «Утроить в поле»
принимает байт: число
возвращает число
обеспечивает «утроенное — байт» (результат не меньше 0) и притом (результат меньше 256)
пример «Ноль»
дано байт равно 0
ожидается 0
тотальная функция «Четыре байта»
принимает байты: список числа, смещение: число
возвращает список числа
обеспечивает «слово — ровно четыре байта» (длина результат) равен 4
пример «Первое слово»
дано байты равно [1, 2, 3, 4, 5, 6, 7, 8]
дано смещение равно 0
ожидается [1, 2, 3, 4]
тотальная функция «Шестнадцать байтов»
принимает байты: список числа, смещение: число
возвращает список числа
обеспечивает «блок — ровно шестнадцать байтов» (длина результат) равен 16
пример «Начало ключа FIPS-197»
дано байты равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано смещение равно 0
ожидается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
тотальная функция «Сложить слова»
принимает первое: список числа, второе: список числа
возвращает список числа
обеспечивает «сумма слов — четыре байта» (длина результат) равен 4
пример «Слово само с собой даёт нули»
дано первое равно [1, 2, 3, 4]
дано второе равно [1, 2, 3, 4]
ожидается [0, 0, 0, 0]
тотальная функция «Постоянные раундов»
возвращает список числа
обеспечивает «постоянных ровно десять» (длина результат) равен 10
обеспечивает «первая постоянная раунда — единица» («Байт по номеру» от результат и 1) равен 1
обеспечивает «последняя постоянная раунда — 0x36» («Байт по номеру» от результат и 10) равен 54
обеспечивает «постоянных раундов больше девяти» (длина результат) больше 9
пример «01 02 04 08 10 20 40 80 1b 36»
ожидается [1, 2, 4, 8, 16, 32, 64, 128, 27, 54]
тотальная функция «Слово поворота»
принимает слово: список числа, постоянная: число
возвращает список числа
обеспечивает «итог — четыре байта» (длина результат) равен 4
пример «Последнее слово ключа FIPS-197 с первой постоянной»
дано слово равно [12, 13, 14, 15]
дано постоянная равно 1
ожидается [214, 171, 118, 254]
тотальная функция «Шаг расширения»
принимает расширение: список числа, постоянная: число
возвращает список числа
обеспечивает «шаг дописывает ровно шестнадцать байтов» (длина результат) равен ((длина расширение) плюс 16)
пример «Первый шаг над ключом FIPS-197 даёт слова w4..w7»
дано расширение равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано постоянная равно 1
ожидается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 214, 170, 116, 253, 210, 175, 114, 250, 218, 166,
120, 241, 214, 171, 118, 254]
тотальная функция «Расширение ключа»
принимает ключ: список числа
возвращает список числа
обеспечивает «расширение — сто семьдесят шесть байтов, одиннадцать ключей раунда» (длина результат) равен 176
обеспечивает «первый ключ раунда — сам ключ» («Шестнадцать байтов» от результат и 0) равно («Шестнадцать байтов» от ключ и 0)
пример «Ключ 000102...0f из приложения A.1 FIPS-197»
дано ключ равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
ожидается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 214, 170, 116, 253, 210, 175, 114, 250, 218, 166,
120, 241, 214, 171, 118, 254, 182, 146, 207, 11, 100, 61, 189, 241, 190, 155, 197, 0, 104, 48, 179, 254, 182, 255,
116, 78, 210, 194, 201, 191, 108, 89, 12, 191, 4, 105, 191, 65, 71, 247, 247, 188, 149, 53, 62, 3, 249, 108, 50,
188, 253, 5, 141, 253, 60, 170, 163, 232, 169, 159, 157, 235, 80, 243, 175, 87, 173, 246, 34, 170, 94, 57, 15,
125, 247, 166, 146, 150, 167, 85, 61, 193, 10, 163, 31, 107, 20, 249, 112, 26, 227, 95, 226, 140, 68, 10, 223, 77,
78, 169, 192, 38, 71, 67, 135, 53, 164, 28, 101, 185, 224, 22, 186, 244, 174, 191, 122, 210, 84, 153, 50, 209,
240, 133, 87, 104, 16, 147, 237, 156, 190, 44, 151, 78, 19, 17, 29, 127, 227, 148, 74, 23, 243, 7, 167, 139, 77,
43, 48, 197]
тотальная функция «Подстановка блока»
принимает квадрат: список числа
возвращает список числа
обеспечивает «подстановка длины не меняет» (длина результат) равен (длина квадрат)
пример «Шестнадцать нулей идут в шестнадцать 0x63»
дано квадрат равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99]
тотальная функция «Сдвиг строк»
принимает квадрат: список числа
возвращает список числа
обеспечивает «сдвиг даёт ровно шестнадцать байтов» (длина результат) равен 16
пример «Байты, помеченные своим местом, разъезжаются по строкам»
дано квадрат равно [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
ожидается [1, 6, 11, 16, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12]
тотальная функция «Смешать столбец»
принимает б0: число, б1: число, б2: число, б3: число
возвращает список числа
обеспечивает «смешанный столбец — четыре байта» (длина результат) равен 4
пример «Учебный столбец db 13 53 45 идёт в 8e 4d a1 bc»
дано б0 равно 219
дано б1 равно 19
дано б2 равно 83
дано б3 равно 69
ожидается [142, 77, 161, 188]
тотальная функция «Смешать столбцы»
принимает квадрат: список числа
возвращает список числа
обеспечивает «смешение даёт ровно шестнадцать байтов» (длина результат) равен 16
пример «Четыре одинаковых столбца db 13 53 45»
дано квадрат равно [219, 19, 83, 69, 219, 19, 83, 69, 219, 19, 83, 69, 219, 19, 83, 69]
ожидается [142, 77, 161, 188, 142, 77, 161, 188, 142, 77, 161, 188, 142, 77, 161, 188]
тотальная функция «Сложить с ключом»
принимает квадрат: список числа, ключ: список числа
возвращает список числа
обеспечивает «сложение даёт ровно шестнадцать байтов» (длина результат) равен 16
пример «Ключ сам с собой обнуляет квадрат»
дано квадрат равно [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
дано ключ равно [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Ключ раунда»
принимает расширение: список числа, раунд: число
возвращает список числа
обеспечивает «ключ раунда — шестнадцать байтов» (длина результат) равен 16
пример «Нулевой ключ раунда — сам ключ»
дано расширение равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 214, 170, 116, 253, 210, 175, 114, 250,
218, 166, 120, 241, 214, 171, 118, 254, 182, 146, 207, 11, 100, 61, 189, 241, 190, 155, 197, 0, 104, 48, 179, 254,
182, 255, 116, 78, 210, 194, 201, 191, 108, 89, 12, 191, 4, 105, 191, 65, 71, 247, 247, 188, 149, 53, 62, 3, 249,
108, 50, 188, 253, 5, 141, 253, 60, 170, 163, 232, 169, 159, 157, 235, 80, 243, 175, 87, 173, 246, 34, 170, 94,
57, 15, 125, 247, 166, 146, 150, 167, 85, 61, 193, 10, 163, 31, 107, 20, 249, 112, 26, 227, 95, 226, 140, 68, 10,
223, 77, 78, 169, 192, 38, 71, 67, 135, 53, 164, 28, 101, 185, 224, 22, 186, 244, 174, 191, 122, 210, 84, 153, 50,
209, 240, 133, 87, 104, 16, 147, 237, 156, 190, 44, 151, 78, 19, 17, 29, 127, 227, 148, 74, 23, 243, 7, 167, 139,
77, 43, 48, 197]
дано раунд равно 0
ожидается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
тотальная функция «Шаг раунда шифра»
принимает ход: «Ход шифра», раунд: число
возвращает «Ход шифра»
обеспечивает «раунд шифра ключа не трогает» (длина результат.расширение) равен (длина ход.расширение)
обеспечивает «квадрат шифра остаётся блоком» (длина результат.квадрат) равен 16
обеспечивает «раунд шифра отдаёт то же расширение» результат.расширение равно ход.расширение
пример «Первый раунд над блоком FIPS-197»
дано ход равно вариант «Ход шифра» с расширение равным [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 214,
170, 116, 253, 210, 175, 114, 250, 218, 166, 120, 241, 214, 171, 118, 254, 182, 146, 207, 11, 100, 61, 189, 241,
190, 155, 197, 0, 104, 48, 179, 254, 182, 255, 116, 78, 210, 194, 201, 191, 108, 89, 12, 191, 4, 105, 191, 65, 71,
247, 247, 188, 149, 53, 62, 3, 249, 108, 50, 188, 253, 5, 141, 253, 60, 170, 163, 232, 169, 159, 157, 235, 80,
243, 175, 87, 173, 246, 34, 170, 94, 57, 15, 125, 247, 166, 146, 150, 167, 85, 61, 193, 10, 163, 31, 107, 20, 249,
112, 26, 227, 95, 226, 140, 68, 10, 223, 77, 78, 169, 192, 38, 71, 67, 135, 53, 164, 28, 101, 185, 224, 22, 186,
244, 174, 191, 122, 210, 84, 153, 50, 209, 240, 133, 87, 104, 16, 147, 237, 156, 190, 44, 151, 78, 19, 17, 29,
127, 227, 148, 74, 23, 243, 7, 167, 139, 77, 43, 48, 197] и квадрат равным [0, 16, 32, 48, 64, 80, 96, 112, 128,
144, 160, 176, 192, 208, 224, 240]
дано раунд равно 1
ожидается вариант «Ход шифра» с расширение равным [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 214, 170,
116, 253, 210, 175, 114, 250, 218, 166, 120, 241, 214, 171, 118, 254, 182, 146, 207, 11, 100, 61, 189, 241, 190,
155, 197, 0, 104, 48, 179, 254, 182, 255, 116, 78, 210, 194, 201, 191, 108, 89, 12, 191, 4, 105, 191, 65, 71, 247,
247, 188, 149, 53, 62, 3, 249, 108, 50, 188, 253, 5, 141, 253, 60, 170, 163, 232, 169, 159, 157, 235, 80, 243,
175, 87, 173, 246, 34, 170, 94, 57, 15, 125, 247, 166, 146, 150, 167, 85, 61, 193, 10, 163, 31, 107, 20, 249, 112,
26, 227, 95, 226, 140, 68, 10, 223, 77, 78, 169, 192, 38, 71, 67, 135, 53, 164, 28, 101, 185, 224, 22, 186, 244,
174, 191, 122, 210, 84, 153, 50, 209, 240, 133, 87, 104, 16, 147, 237, 156, 190, 44, 151, 78, 19, 17, 29, 127,
227, 148, 74, 23, 243, 7, 167, 139, 77, 43, 48, 197] и квадрат равным [137, 216, 16, 232, 133, 90, 206, 104, 45,
24, 67, 216, 203, 18, 143, 228]
тотальная функция «Состояние хода»
принимает ход: «Ход шифра»
возвращает список числа
обеспечивает «квадрат хода — то самое квадрат» результат равно ход.квадрат
пример «Достаёт квадрат»
дано ход равно вариант «Ход шифра» с расширение равным пустой список и квадрат равным [1, 2]
ожидается [1, 2]
тотальная функция «Зашифровать блок»
принимает ключ: список числа, блок: список числа
возвращает список числа
обеспечивает «шифроблок ровно той же длины, что и блок, — шестнадцать байтов» (длина результат) равен 16
пример «Официальный вектор FIPS-197, приложение B и C.1»
дано ключ равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано блок равно [0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255]
ожидается [105, 196, 224, 216, 106, 123, 4, 48, 216, 205, 183, 128, 112, 180, 197, 90]
тотальная функция «Шаг счёта»
принимает ход: «Ход счёта», байт: число
возвращает «Ход счёта»
обеспечивает «счёт удлиняет ответ ровно на байт» (длина результат.байты) равен ((длина ход.байты) плюс 1)
обеспечивает «перенос — ноль или единица» (результат.перенос равен 0) или (результат.перенос равен 1)
обеспечивает «с переполнением перенос равен единице» если (((«Свести к байту» от байт) плюс ход.перенос) не меньше 256) то (результат.перенос равен 1) иначе да
обеспечивает «без переполнения переноса нет» если (не (((«Свести к байту» от байт) плюс ход.перенос) не меньше 256)) то (результат.перенос равен 0) иначе да
обеспечивает «с переполнением байт кладётся уменьшенным на 256» если (((«Свести к байту» от байт) плюс ход.перенос) не меньше 256) то (результат.байты равен (приписать (((«Свести к байту» от байт) плюс ход.перенос) минус 256) к ход.байты)) иначе да
обеспечивает «без переполнения байт кладётся как есть» если (не (((«Свести к байту» от байт) плюс ход.перенос) не меньше 256)) то (результат.байты равен (приписать ((«Свести к байту» от байт) плюс ход.перенос) к ход.байты)) иначе да
пример «Байт 255 с переносом обнуляется и переносит дальше»
дано ход равно вариант «Ход счёта» с перенос равным 1 и байты равным пустой список
дано байт равно 255
ожидается вариант «Ход счёта» с перенос равным 1 и байты равным [0]
тотальная функция «Байты счёта»
принимает ход: «Ход счёта»
возвращает список числа
обеспечивает «байты счёта — те самые байты» результат равно ход.байты
пример «Достаёт байты»
дано ход равно вариант «Ход счёта» с перенос равным 0 и байты равным [1, 2]
ожидается [1, 2]
тотальная функция «Прибавить единицу»
принимает счётчик: список числа
возвращает список числа
обеспечивает «счётчик CTR остаётся блоком в шестнадцать байтов» (длина результат) равен 16
пример «Ноль становится единицей»
дано счётчик равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
тотальная функция «Шаг гаммы»
принимает ход: «Ход гаммы», байт: число
возвращает «Ход гаммы»
обеспечивает «выход гаммы удлиняется ровно на байт» (длина результат.выход) равен ((длина ход.выход) плюс 1)
обеспечивает «место в гамме CTR не выходит за блок» (результат.позиция не меньше 1) и притом (результат.позиция не больше 16)
обеспечивает «ключ гаммы CTR не трогается» результат.расширение равно ход.расширение
обеспечивает «до конца блока счётчик CTR не трогается» если (не (ход.позиция не меньше 16)) то (результат.счётчик равно ход.счётчик) иначе да
обеспечивает «до конца блока гамма CTR не пересчитывается» если (не (ход.позиция не меньше 16)) то (результат.гамма равно ход.гамма) иначе да
обеспечивает «до конца блока место CTR растёт на единицу» если (не (ход.позиция не меньше 16)) то (результат.позиция равен (ход.позиция плюс 1)) иначе да
обеспечивает «на конце блока место CTR сбрасывается в единицу» если (ход.позиция не меньше 16) то (результат.позиция равен 1) иначе да
обеспечивает «на конце блока счётчик CTR прирастает» если (ход.позиция не меньше 16) то (результат.счётчик равно («Прибавить единицу» от ход.счётчик)) иначе да
пример «Второй байт блока CTR-AES128 из NIST SP 800-38A, F.5.1: гамма готова, счётчик не трогается»
дано ход равно вариант «Ход гаммы» с расширение равным [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9,
207, 79, 60] и счётчик равным [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
255] и гамма равным [236, 140, 223, 115, 152, 96, 124, 176, 242, 210, 22, 117, 234, 158, 161,
228] и позиция равным 1 и выход равным [135]
дано байт равно 193
ожидается вариант «Ход гаммы» с расширение равным [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207,
79, 60] и счётчик равным [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
255] и гамма равным [236, 140, 223, 115, 152, 96, 124, 176, 242, 210, 22, 117, 234, 158, 161,
228] и позиция равным 2 и выход равным [135, 77]
тотальная функция «Выход гаммы»
принимает ход: «Ход гаммы»
возвращает список числа
обеспечивает «выход хода гаммы — тот самый выход» результат равно ход.выход
пример «Достаёт выход»
дано ход равно вариант «Ход гаммы» с расширение равным пустой список и счётчик равным пустой список и гамма равным пустой список и позиция равным 16 и выход равным [5]
ожидается [5]
тотальная функция «Шифр CTR»
принимает ключ: список числа, счётчик: список числа, текст: список числа
возвращает список числа
обеспечивает «шифротекст CTR ровно той же длины, что и открытый текст» (длина результат) равен (длина текст)
пример «Пустому тексту — пустой шифротекст»
дано ключ равно [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79, 60]
дано счётчик равно [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]
дано текст равно пустой список
ожидается пустой список
тотальная функция «Сложить блоки»
принимает первый: список числа, второй: список числа
возвращает список числа
обеспечивает «сумма блоков — ровно шестнадцать байтов» (длина результат) равен 16
пример «Блок сам с собой даёт нули»
дано первый равно [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
дано второй равно [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Многочлен поля»
возвращает список числа
обеспечивает «многочлен — блок в шестнадцать байтов» (длина результат) равен 16
обеспечивает «старший байт многочлена — 0xe1» («Байт по номеру» от результат и 1) равен 225
обеспечивает «последний байт многочлена — ноль» («Байт по номеру» от результат и 16) равен 0
пример «0xe1 и пятнадцать нулей»
ожидается [225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Шаг сдвига блока»
принимает ход: «Ход сдвига», байт: число
возвращает «Ход сдвига»
обеспечивает «сдвиг удлиняет ответ ровно на байт» (длина результат.байты) равен ((длина ход.байты) плюс 1)
обеспечивает «сдвиг помнит поданный байт» результат.прежний равен («Свести к байту» от байт)
пример «Второй шаг сдвига 01 00…: младший разряд соседа слева становится старшим»
дано ход равно вариант «Ход сдвига» с прежний равным 1 и байты равным [0]
дано байт равно 0
ожидается вариант «Ход сдвига» с прежний равным 0 и байты равным [0, 128]
тотальная функция «Байты сдвига»
принимает ход: «Ход сдвига»
возвращает список числа
обеспечивает «байты сдвига — те самые байты» результат равно ход.байты
пример «Достаёт байты»
дано ход равно вариант «Ход сдвига» с прежний равным 0 и байты равным [1, 2]
ожидается [1, 2]
тотальная функция «Сдвиг блока вправо»
принимает блок: список числа
возвращает список числа
обеспечивает «сдвиг не меняет длины» (длина результат) равен (длина блок)
пример «Единица в старшем разряде уезжает на разряд вправо»
дано блок равно [128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Привести сдвиг»
принимает блок: список числа
возвращает список числа
обеспечивает «приведение не меняет длины» (длина результат) равен (длина блок)
обеспечивает «пустому блоку приводить нечего» если ((длина блок) равен 0) то (результат равен блок) иначе да
обеспечивает «пустому блоку приводить нечего, второй записью» не ((длина блок) равен 0) или (результат равен блок)
обеспечивает «непустому блоку первый байт складывается с многочленом» если (не ((длина блок) равен 0)) то (результат равен (приписать («Исключающее или байтов» от (голова блок) и 225) к (хвост блок))) иначе да
пример «Первый байт складывается с 0xe1, прочие не трогаются»
дано блок равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
ожидается [225, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
тотальная функция «Шаг разряда поля»
принимает ход: «Ход поля», бит: число
возвращает «Ход поля»
обеспечивает «произведение разряда остаётся блоком» (длина результат.накоплено) равен 16
обеспечивает «сдвиг остаётся блоком» (длина результат.сдвиг) равен 16
обеспечивает «на нулевом разряде накопленное не трогается» если (не (бит равен 1)) то (результат.накоплено равно ход.накоплено) иначе да
обеспечивает «на единичном разряде накопленное складывается со сдвигом» если (бит равен 1) то (результат.накоплено равно («Сложить блоки» от ход.накоплено и ход.сдвиг)) иначе да
пример «Нулевой разряд: накопленное стоит, сдвиг едет вправо»
дано ход равно вариант «Ход поля» с накоплено равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0] и сдвиг равным [128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано бит равно 0
ожидается вариант «Ход поля» с накоплено равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и сдвиг равным [64,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Шаг байта поля»
принимает ход: «Ход поля», байт: число
возвращает «Ход поля»
обеспечивает «произведение байта остаётся блоком» (длина результат.накоплено) равен 16
тотальная функция «Произведение поля»
принимает ход: «Ход поля»
возвращает список числа
обеспечивает «произведение хода — то самое накопленное» результат равно ход.накоплено
пример «Достаёт произведение»
дано ход равно вариант «Ход поля» с накоплено равным [1, 2] и сдвиг равным пустой список
ожидается [1, 2]
тотальная функция «Умножить в поле»
принимает первый: список числа, второй: список числа
возвращает список числа
обеспечивает «произведение — блок в шестнадцать байтов» (длина результат) равен 16
пример «На нуль — нуль»
дано первый равно [102, 233, 75, 212, 239, 138, 44, 59, 136, 76, 250, 89, 202, 52, 43, 46]
дано второй равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Шаг GHASH»
принимает ход: «Ход GHASH», байт: число
возвращает «Ход GHASH»
обеспечивает «свод остаётся блоком в шестнадцать байтов» (длина результат.свод) равен 16
обеспечивает «ключ поля не трогается» результат.ключ равно ход.ключ
обеспечивает «на шестнадцатом байте буфер опустошается» если (ход.набрано не меньше 15) то (результат.буфер равен пустой список) иначе да
обеспечивает «на шестнадцатом байте счёт набранного обнуляется» если (ход.набрано не меньше 15) то (результат.набрано равен 0) иначе да
обеспечивает «до шестнадцатого байта свод не трогается» если (не (ход.набрано не меньше 15)) то (результат.свод равен ход.свод) иначе да
обеспечивает «до шестнадцатого байта счёт набранного растёт на единицу» если (не (ход.набрано не меньше 15)) то (результат.набрано равен (ход.набрано плюс 1)) иначе да
обеспечивает «до шестнадцатого байта буфер прирастает байтом» если (не (ход.набрано не меньше 15)) то (результат.буфер равен (добавить («Свести к байту» от байт) к ход.буфер)) иначе да
пример «Первый байт шифротекста GCM (SP 800-38D, Test Case 2) только копится в буфере»
дано ход равно вариант «Ход GHASH» с ключ равным [102, 233, 75, 212, 239, 138, 44, 59, 136, 76, 250, 89, 202, 52,
43, 46] и свод равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0] и буфер равным пустой список и набрано равным 0
дано байт равно 3
ожидается вариант «Ход GHASH» с ключ равным [102, 233, 75, 212, 239, 138, 44, 59, 136, 76, 250, 89, 202, 52, 43,
46] и свод равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и буфер равным [3] и набрано равным 1
тотальная функция «Свод GHASH»
принимает ход: «Ход GHASH»
возвращает список числа
обеспечивает «свод хода — тот самый свод» результат равно ход.свод
пример «Достаёт свод»
дано ход равно вариант «Ход GHASH» с ключ равным пустой список и свод равным [1, 2] и буфер равным пустой список и набрано равным 0
ожидается [1, 2]
тотальная функция «GHASH»
принимает ключ: список числа, данные: список числа
возвращает список числа
обеспечивает «свод GHASH — блок в шестнадцать байтов» (длина результат) равен 16
пример «Пустым данным — нулевой свод»
дано ключ равно [102, 233, 75, 212, 239, 138, 44, 59, 136, 76, 250, 89, 202, 52, 43, 46]
дано данные равно пустой список
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Ключ хеша»
принимает ключ: список числа
возвращает список числа
обеспечивает «ключ поля — блок в шестнадцать байтов» (длина результат) равен 16
пример «Нулевой ключ даёт H = 66e94bd4ef8a2c3b884cfa59ca342b2e (SP 800-38D, Test Case 1)»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [102, 233, 75, 212, 239, 138, 44, 59, 136, 76, 250, 89, 202, 52, 43, 46]
тотальная функция «Прибавить единицу по младшим четырём»
принимает счётчик: список числа
возвращает список числа
обеспечивает «счётчик GCM остаётся блоком в шестнадцать байтов» (длина результат) равен 16
пример «Единица прирастает в двойку, вектор не тронут»
дано счётчик равно [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 1]
ожидается [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 2]
тотальная функция «Шаг гаммы GCM»
принимает ход: «Ход гаммы GCM», байт: число
возвращает «Ход гаммы GCM»
обеспечивает «выход гаммы GCM удлиняется ровно на байт» (длина результат.выход) равен ((длина ход.выход) плюс 1)
обеспечивает «место в гамме GCM не выходит за блок» (результат.позиция не меньше 1) и притом (результат.позиция не больше 16)
обеспечивает «ключ гаммы GCM не трогается» результат.ключ равно ход.ключ
обеспечивает «до конца блока счётчик GCM не трогается» если (не (ход.позиция не меньше 16)) то (результат.счётчик равно ход.счётчик) иначе да
обеспечивает «до конца блока гамма GCM не пересчитывается» если (не (ход.позиция не меньше 16)) то (результат.гамма равно ход.гамма) иначе да
обеспечивает «до конца блока место GCM растёт на единицу» если (не (ход.позиция не меньше 16)) то (результат.позиция равен (ход.позиция плюс 1)) иначе да
обеспечивает «на конце блока место GCM сбрасывается в единицу» если (ход.позиция не меньше 16) то (результат.позиция равен 1) иначе да
обеспечивает «на конце блока счётчик GCM прирастает» если (ход.позиция не меньше 16) то (результат.счётчик равно («Прибавить единицу по младшим четырём» от ход.счётчик)) иначе да
пример «Второй байт гаммы GCM (SP 800-38D, Test Case 2): счётчик по inc32 не трогается»
дано ход равно вариант «Ход гаммы GCM» с ключ равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0] и счётчик равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2] и гамма равным [3, 136, 218, 206, 96, 182,
163, 146, 243, 40, 194, 185, 113, 178, 254, 120] и позиция равным 1 и выход равным [3]
дано байт равно 0
ожидается вариант «Ход гаммы GCM» с ключ равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и счётчик равным [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2] и гамма равным [3, 136, 218, 206, 96, 182, 163, 146, 243, 40, 194,
185, 113, 178, 254, 120] и позиция равным 2 и выход равным [3, 136]
тотальная функция «Выход гаммы GCM»
принимает ход: «Ход гаммы GCM»
возвращает список числа
обеспечивает «выход хода гаммы GCM — тот самый выход» результат равно ход.выход
пример «Достаёт выход»
дано ход равно вариант «Ход гаммы GCM» с ключ равным пустой список и счётчик равным пустой список и гамма равным пустой список и позиция равным 16 и выход равным [5]
ожидается [5]
тотальная функция «Шифр GCTR»
принимает ключ: список числа, счётчик: список числа, текст: список числа
возвращает список числа
обеспечивает «шифротекст GCTR ровно той же длины, что и открытый текст» (длина результат) равен (длина текст)
пример «Пустому тексту — пустой шифротекст»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано счётчик равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]
дано текст равно пустой список
ожидается пустой список
тотальная функция «Набивка до блока»
принимает байты: список числа
возвращает список числа
обеспечивает «набитое нулями делится на блоки нацело» ((длина результат) остаток от 16) равен 0
обеспечивает «набивка короче блока» (длина результат) меньше ((длина байты) плюс 16)
пример «Пусто остаётся пустым»
дано байты равно пустой список
ожидается пустой список
тотальная функция «Данные GHASH»
принимает доп: список числа, шифротекст: список числа
возвращает список числа
обеспечивает «данные делятся на блоки нацело» ((длина результат) остаток от 16) равен 0
пример «Пусто и пусто — один блок из двух нулевых длин»
дано доп равно пустой список
дано шифротекст равно пустой список
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Начальный счётчик»
принимает ключ: список числа, вектор: список числа
возвращает список числа
обеспечивает «начальный счётчик — блок в шестнадцать байтов» (длина результат) равен 16
обеспечивает «вектору в двенадцать байтов приписана единица» если ((длина вектор) равен 12) то (результат равен («Досыпать байты» от («Досыпать байты» от вектор и («Нули» от 3)) и [1])) иначе да
пример «Вектор в двенадцать байтов: к нему приписана единица»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано вектор равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
тотальная функция «Тег GCM»
принимает ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа
возвращает список числа
обеспечивает «тег GCM — ровно шестнадцать байтов» (длина результат) равен 16
пример «Test Case 1 (SP 800-38D): нулевой ключ, пустые данные, пустой шифротекст»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано вектор равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано доп равно пустой список
дано шифротекст равно пустой список
ожидается [88, 226, 252, 206, 250, 126, 48, 97, 54, 127, 29, 87, 164, 231, 69, 90]
тотальная функция «Зашифровать GCM»
принимает ключ: список числа, вектор: список числа, доп: список числа, текст: список числа
возвращает «Печать GCM»
обеспечивает «тег шифрования GCM — ровно шестнадцать байтов» (длина результат.тег) равен 16
обеспечивает «шифротекст GCM ровно той же длины, что и открытый текст» (длина результат.шифротекст) равен (длина текст)
пример «Test Case 1 (SP 800-38D): пустой текст, пустые данные, нулевой ключ»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано вектор равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано доп равно пустой список
дано текст равно пустой список
ожидается вариант «Печать GCM» с шифротекст равным пустой список и тег равным [88, 226, 252, 206, 250, 126, 48, 97,
54, 127, 29, 87, 164, 231, 69, 90]
тотальная функция «Расшифровано ли»
принимает исход: «Исход GCM»
возвращает признак
пример «Успех признаётся успехом»
дано исход равно вариант «Расшифровано» с текст равным [1, 2]
ожидается да
тотальная функция «Текст исхода»
принимает исход: «Исход GCM»
возвращает список числа
обеспечивает «у отказа текста нет» («Расшифровано ли» от исход) или ((длина результат) равен 0)
пример «У успеха берётся текст»
дано исход равно вариант «Расшифровано» с текст равным [1, 2]
ожидается [1, 2]
тотальная функция «Расшифровать GCM»
принимает ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа, тег: список числа
возвращает «Исход GCM»
обеспечивает «при отказе открытого текста не выдаётся» («Расшифровано ли» от результат) или ((длина («Текст исхода» от результат)) равен 0)
обеспечивает «при успехе открытый текст той же длины, что и шифротекст» не («Расшифровано ли» от результат) или ((длина («Текст исхода» от результат)) равен (длина шифротекст))
тотальная функция «Обратная таблица подстановки»
возвращает список числа
обеспечивает «в обратной таблице ровно двести пятьдесят шесть байтов» (длина результат) равен 256
пример «Двести пятьдесят шесть байтов обратной таблицы FIPS-197, рис. 14»
ожидается [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255,
135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78,
8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22,
212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132,
144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175,
189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172,
116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183,
98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168,
51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147,
201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119,
214, 38, 225, 105, 20, 99, 85, 33, 12, 125]
тотальная функция «Обратная подстановка»
принимает байт: число
возвращает число
обеспечивает «обратная подстановка — байт» (результат не меньше 0) и притом (результат меньше 256)
пример «0x63 возвращается в ноль»
дано байт равно 99
ожидается 0
тотальная функция «Обратная подстановка блока»
принимает квадрат: список числа
возвращает список числа
обеспечивает «обратная подстановка длины не меняет» (длина результат) равен (длина квадрат)
пример «Шестнадцать 0x63 возвращаются в шестнадцать нулей»
дано квадрат равно [99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99]
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Обратный сдвиг строк»
принимает квадрат: список числа
возвращает список числа
обеспечивает «обратный сдвиг даёт ровно шестнадцать байтов» (длина результат) равен 16
пример «Разъехавшееся по строкам возвращается на свои места»
дано квадрат равно [1, 6, 11, 16, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12]
ожидается [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
тотальная функция «Умножить на девять в поле»
принимает байт: число
возвращает число
обеспечивает «произведение на девять — байт» (результат не меньше 0) и притом (результат меньше 256)
пример «Ноль»
дано байт равно 0
ожидается 0
тотальная функция «Умножить на одиннадцать в поле»
принимает байт: число
возвращает число
обеспечивает «произведение на одиннадцать — байт» (результат не меньше 0) и притом (результат меньше 256)
пример «Единица идёт в одиннадцать»
дано байт равно 1
ожидается 11
тотальная функция «Умножить на тринадцать в поле»
принимает байт: число
возвращает число
обеспечивает «произведение на тринадцать — байт» (результат не меньше 0) и притом (результат меньше 256)
пример «Единица идёт в тринадцать»
дано байт равно 1
ожидается 13
тотальная функция «Умножить на четырнадцать в поле»
принимает байт: число
возвращает число
обеспечивает «произведение на четырнадцать — байт» (результат не меньше 0) и притом (результат меньше 256)
пример «Единица идёт в четырнадцать»
дано байт равно 1
ожидается 14
тотальная функция «Обратно смешать столбец»
принимает б0: число, б1: число, б2: число, б3: число
возвращает список числа
обеспечивает «обратно смешанный столбец — четыре байта» (длина результат) равен 4
пример «Учебный 8e 4d a1 bc возвращается в db 13 53 45»
дано б0 равно 142
дано б1 равно 77
дано б2 равно 161
дано б3 равно 188
ожидается [219, 19, 83, 69]
тотальная функция «Обратно смешать столбцы»
принимает квадрат: список числа
возвращает список числа
обеспечивает «обратное смешение даёт ровно шестнадцать байтов» (длина результат) равен 16
пример «Четыре одинаковых столбца 8e 4d a1 bc»
дано квадрат равно [142, 77, 161, 188, 142, 77, 161, 188, 142, 77, 161, 188, 142, 77, 161, 188]
ожидается [219, 19, 83, 69, 219, 19, 83, 69, 219, 19, 83, 69, 219, 19, 83, 69]
тотальная функция «Шаг раунда расшифровки»
принимает ход: «Ход шифра», раунд: число
возвращает «Ход шифра»
обеспечивает «раунд расшифровки ключа не трогает» (длина результат.расширение) равен (длина ход.расширение)
обеспечивает «квадрат расшифровки остаётся блоком» (длина результат.квадрат) равен 16
обеспечивает «раунд расшифровки отдаёт то же расширение» результат.расширение равно ход.расширение
пример «Девятый обратный раунд следа FIPS-197 C.1: 7ad5fda789ef4e272bca100b3d9ff59f → 54d990a16ba09ab596bbf40ea111702f»
дано ход равно вариант «Ход шифра» с расширение равным [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 214,
170, 116, 253, 210, 175, 114, 250, 218, 166, 120, 241, 214, 171, 118, 254, 182, 146, 207, 11, 100, 61, 189, 241,
190, 155, 197, 0, 104, 48, 179, 254, 182, 255, 116, 78, 210, 194, 201, 191, 108, 89, 12, 191, 4, 105, 191, 65, 71,
247, 247, 188, 149, 53, 62, 3, 249, 108, 50, 188, 253, 5, 141, 253, 60, 170, 163, 232, 169, 159, 157, 235, 80,
243, 175, 87, 173, 246, 34, 170, 94, 57, 15, 125, 247, 166, 146, 150, 167, 85, 61, 193, 10, 163, 31, 107, 20, 249,
112, 26, 227, 95, 226, 140, 68, 10, 223, 77, 78, 169, 192, 38, 71, 67, 135, 53, 164, 28, 101, 185, 224, 22, 186,
244, 174, 191, 122, 210, 84, 153, 50, 209, 240, 133, 87, 104, 16, 147, 237, 156, 190, 44, 151, 78, 19, 17, 29,
127, 227, 148, 74, 23, 243, 7, 167, 139, 77, 43, 48, 197] и квадрат равным [122, 213, 253, 167, 137, 239, 78, 39,
43, 202, 16, 11, 61, 159, 245, 159]
дано раунд равно 9
ожидается вариант «Ход шифра» с расширение равным [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 214, 170,
116, 253, 210, 175, 114, 250, 218, 166, 120, 241, 214, 171, 118, 254, 182, 146, 207, 11, 100, 61, 189, 241, 190,
155, 197, 0, 104, 48, 179, 254, 182, 255, 116, 78, 210, 194, 201, 191, 108, 89, 12, 191, 4, 105, 191, 65, 71, 247,
247, 188, 149, 53, 62, 3, 249, 108, 50, 188, 253, 5, 141, 253, 60, 170, 163, 232, 169, 159, 157, 235, 80, 243,
175, 87, 173, 246, 34, 170, 94, 57, 15, 125, 247, 166, 146, 150, 167, 85, 61, 193, 10, 163, 31, 107, 20, 249, 112,
26, 227, 95, 226, 140, 68, 10, 223, 77, 78, 169, 192, 38, 71, 67, 135, 53, 164, 28, 101, 185, 224, 22, 186, 244,
174, 191, 122, 210, 84, 153, 50, 209, 240, 133, 87, 104, 16, 147, 237, 156, 190, 44, 151, 78, 19, 17, 29, 127,
227, 148, 74, 23, 243, 7, 167, 139, 77, 43, 48, 197] и квадрат равным [84, 217, 144, 161, 107, 160, 154, 181, 150,
187, 244, 14, 161, 17, 112, 47]
тотальная функция «Расшифровать блок»
принимает ключ: список числа, блок: список числа
возвращает список числа
обеспечивает «расшифрованное ровно той же длины, что и шифроблок, — шестнадцать байтов» (длина результат) равен 16
пример «Официальный вектор FIPS-197, приложение C.1, в обратную сторону»
дано ключ равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано блок равно [105, 196, 224, 216, 106, 123, 4, 48, 216, 205, 183, 128, 112, 180, 197, 90]
ожидается [0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255]
тотальная функция «Состояние обратного хода»
принимает ключ: список числа, блок: список числа, раунды: список числа
возвращает список числа
обеспечивает «состояние обратного хода — шестнадцать байтов» (длина результат) равен 16
пример «Без единого раунда — блок, сложенный с десятым ключом раунда»
дано ключ равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано блок равно [105, 196, 224, 216, 106, 123, 4, 48, 216, 205, 183, 128, 112, 180, 197, 90]
дано раунды равно пустой список
ожидается [122, 213, 253, 167, 137, 239, 78, 39, 43, 202, 16, 11, 61, 159, 245, 159]
тотальная функция «Шаг CBC вперёд»
принимает ход: «Ход CBC», байт: число
возвращает «Ход CBC»
обеспечивает «сцепка шифрования CBC остаётся блоком в шестнадцать байтов» (длина результат.сцепка) равен 16
обеспечивает «ключ шифрования CBC не трогается» результат.ключ равно ход.ключ
обеспечивает «на полном блоке буфер шифрования опустошается» если (ход.набрано не меньше 15) то (результат.буфер равен пустой список) иначе да
обеспечивает «на полном блоке счёт набранного обнуляется» если (ход.набрано не меньше 15) то (результат.набрано равен 0) иначе да
обеспечивает «до полного блока счёт набранного шифрования растёт на единицу» если (не (ход.набрано не меньше 15)) то (результат.набрано равен (ход.набрано плюс 1)) иначе да
обеспечивает «до полного блока буфер шифрования прирастает байтом» если (не (ход.набрано не меньше 15)) то (результат.буфер равен (добавить («Свести к байту» от байт) к ход.буфер)) иначе да
обеспечивает «до полного блока выход шифрования не трогается» если (не (ход.набрано не меньше 15)) то (результат.выход равно ход.выход) иначе да
обеспечивает «до полного блока сцепка шифрования не трогается» если (не (ход.набрано не меньше 15)) то (результат.сцепка равно ход.сцепка) иначе да
пример «Первый байт CBC-AES128 (NIST SP 800-38A, F.2.1) копится в буфере, сцепка стоит вектором»
дано ход равно вариант «Ход CBC» с ключ равным [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79,
60] и сцепка равным [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15] и буфер равным пустой список и набрано равным 0 и выход равным пустой список
дано байт равно 107
ожидается вариант «Ход CBC» с ключ равным [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79,
60] и сцепка равным [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15] и буфер равным [107] и набрано равным 1 и выход равным пустой список
тотальная функция «Шаг CBC назад»
принимает ход: «Ход CBC», байт: число
возвращает «Ход CBC»
обеспечивает «сцепка расшифровки CBC остаётся блоком в шестнадцать байтов» (длина результат.сцепка) равен 16
обеспечивает «ключ расшифровки CBC не трогается» результат.ключ равно ход.ключ
обеспечивает «на полном блоке буфер расшифровки опустошается» если (ход.набрано не меньше 15) то (результат.буфер равен пустой список) иначе да
обеспечивает «на полном блоке счёт набранного расшифровки обнуляется» если (ход.набрано не меньше 15) то (результат.набрано равен 0) иначе да
обеспечивает «до полного блока счёт набранного расшифровки растёт на единицу» если (не (ход.набрано не меньше 15)) то (результат.набрано равен (ход.набрано плюс 1)) иначе да
обеспечивает «до полного блока буфер расшифровки прирастает байтом» если (не (ход.набрано не меньше 15)) то (результат.буфер равен (добавить («Свести к байту» от байт) к ход.буфер)) иначе да
обеспечивает «до полного блока выход расшифровки не трогается» если (не (ход.набрано не меньше 15)) то (результат.выход равно ход.выход) иначе да
обеспечивает «до полного блока сцепка расшифровки не трогается» если (не (ход.набрано не меньше 15)) то (результат.сцепка равно ход.сцепка) иначе да
обеспечивает «на полном блоке сцепкой расшифровки становится сам шифроблок» если (ход.набрано не меньше 15) то (результат.сцепка равно (добавить («Свести к байту» от байт) к ход.буфер)) иначе да
пример «Первый байт шифротекста CBC-AES128 (F.2.2) копится в буфере, выход не трогается»
дано ход равно вариант «Ход CBC» с ключ равным [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79,
60] и сцепка равным [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15] и буфер равным пустой список и набрано равным 0 и выход равным пустой список
дано байт равно 118
ожидается вариант «Ход CBC» с ключ равным [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79,
60] и сцепка равным [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15] и буфер равным [118] и набрано равным 1 и выход равным пустой список
тотальная функция «Выход CBC»
принимает ход: «Ход CBC»
возвращает список числа
обеспечивает «выход хода CBC — тот самый выход» результат равно ход.выход
пример «Достаёт выход»
дано ход равно вариант «Ход CBC» с ключ равным пустой список и сцепка равным пустой список и буфер равным пустой список и набрано равным 0 и выход равным [7]
ожидается [7]
тотальная функция «Шифр CBC»
принимает ключ: список числа, вектор: список числа, текст: список числа
возвращает список числа
обеспечивает «на целом числе блоков шифротекст ровно той же длины, что и открытый текст» (не (((длина текст) остаток от 16) равен 0)) или ((длина результат) равен (длина текст))
пример «Пустому тексту — пустой шифротекст»
дано ключ равно [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79, 60]
дано вектор равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано текст равно пустой список
ожидается пустой список
тотальная функция «Расшифровка CBC начисто»
принимает ключ: список числа, вектор: список числа, шифротекст: список числа
возвращает список числа
обеспечивает «на целом числе блоков расшифрованное ровно той же длины, что и шифротекст» (не (((длина шифротекст) остаток от 16) равен 0)) или ((длина результат) равен (длина шифротекст))
пример «Все четыре блока CBC-AES128 из NIST SP 800-38A, F.2.2»
дано ключ равно [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79, 60]
дано вектор равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано шифротекст равно [118, 73, 171, 172, 129, 25, 178, 70, 206, 233, 142, 155, 18, 233, 25, 125, 80, 134, 203, 155,
80, 114, 25, 238, 149, 219, 17, 58, 145, 118, 120, 178, 115, 190, 214, 184, 227, 193, 116, 59, 113, 22, 230, 158,
34, 34, 149, 22, 63, 241, 202, 161, 104, 31, 172, 9, 18, 14, 202, 48, 117, 134, 225, 167]
ожидается [107, 193, 190, 226, 46, 64, 159, 150, 233, 61, 126, 17, 115, 147, 23, 42, 174, 45, 138, 87, 30, 3, 172,
156, 158, 183, 111, 172, 69, 175, 142, 81, 48, 200, 28, 70, 163, 92, 228, 17, 229, 251, 193, 25, 26, 10, 82, 239,
246, 159, 36, 69, 223, 79, 155, 23, 173, 43, 65, 123, 230, 108, 55, 16]
тотальная функция «Набивка PKCS7»
принимает байты: список числа
возвращает список числа
обеспечивает «набитое по PKCS7 делится на блоки нацело» ((длина результат) остаток от 16) равен 0
обеспечивает «набивка добавляет не меньше байта и не больше блока» ((длина результат) больше (длина байты)) и притом ((длина результат) не больше ((длина байты) плюс 16))
пример «Пусто добивается целым блоком шестнадцати»
дано байты равно пустой список
ожидается [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]
тотальная функция «Длина без набивки»
принимает байты: список числа
возвращает число
обеспечивает «длина без набивки не больше самой длины» результат не больше (длина байты)
обеспечивает «длина без набивки не меньше нуля» результат не меньше 0
обеспечивает «негодная набивка не снимается» если ((«Байт по номеру» от байты и (длина байты)) меньше 1) или ((«Байт по номеру» от байты и (длина байты)) больше 16) или ((«Байт по номеру» от байты и (длина байты)) больше (длина байты)) то (результат равен (длина байты)) иначе да
обеспечивает «годная набивка снимается вся» если (не (((«Байт по номеру» от байты и (длина байты)) меньше 1) или ((«Байт по номеру» от байты и (длина байты)) больше 16) или ((«Байт по номеру» от байты и (длина байты)) больше (длина байты)))) то (результат равен ((длина байты) минус («Байт по номеру» от байты и (длина байты)))) иначе да
пример «Целый блок набивки снимается весь»
дано байты равно [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]
ожидается 0
тотальная функция «Шаг начала»
принимает ход: «Ход начала», байт: число
возвращает «Ход начала»
обеспечивает «место растёт ровно на единицу» результат.место равен (ход.место плюс 1)
обеспечивает «предел не трогается» результат.предел равно ход.предел
обеспечивает «за пределом выход начала не трогается» если ((ход.место плюс 1) больше ход.предел) то (результат.выход равно ход.выход) иначе да
обеспечивает «до предела выход начала прирастает байтом» если (не ((ход.место плюс 1) больше ход.предел)) то (результат.выход равен (добавить («Свести к байту» от байт) к ход.выход)) иначе да
пример «До предела байт берётся»
дано ход равно вариант «Ход начала» с предел равным 5 и место равным 0 и выход равным пустой список
дано байт равно 1
ожидается вариант «Ход начала» с предел равным 5 и место равным 1 и выход равным [1]
тотальная функция «Выход начала»
принимает ход: «Ход начала»
возвращает список числа
обеспечивает «выход хода начала — тот самый выход» результат равно ход.выход
пример «Достаёт выход»
дано ход равно вариант «Ход начала» с предел равным 0 и место равным 0 и выход равным [3]
ожидается [3]
тотальная функция «Начало байтов»
принимает байты: список числа, сколько: число
возвращает список числа
обеспечивает «начало не длиннее целого» (длина результат) не больше (длина байты)
пример «Первые пять из шестнадцати»
дано байты равно [1, 2, 3, 4, 5, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11]
дано сколько равно 5
ожидается [1, 2, 3, 4, 5]
тотальная функция «Зашифровать CBC»
принимает ключ: список числа, вектор: список числа, текст: список числа
возвращает список числа
обеспечивает «шифротекст ложится блоками нацело» ((длина результат) остаток от 16) равен 0
обеспечивает «шифротекст длиннее открытого текста не меньше чем на байт и не больше чем на блок» ((длина результат) больше (длина текст)) и притом ((длина результат) не больше ((длина текст) плюс 16))
пример «Пять байтов уходят в один блок»
дано ключ равно [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79, 60]
дано вектор равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано текст равно [1, 2, 3, 4, 5]
ожидается [15, 110, 170, 226, 130, 197, 68, 0, 161, 146, 108, 179, 138, 104, 218, 95]
тотальная функция «Расшифровать CBC»
принимает ключ: список числа, вектор: список числа, шифротекст: список числа
возвращает список числа
обеспечивает «расшифрованное не длиннее шифротекста» (длина результат) не больше (длина шифротекст)
пример «Тот же блок в обратную сторону: расшифровка зашифрованного возвращает исходное»
дано ключ равно [43, 126, 21, 22, 40, 174, 210, 166, 171, 247, 21, 136, 9, 207, 79, 60]
дано вектор равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано шифротекст равно [15, 110, 170, 226, 130, 197, 68, 0, 161, 146, 108, 179, 138, 104, 218, 95]
ожидается [1, 2, 3, 4, 5]
тотальная функция «Тридцать два байта»
принимает байты: список числа, смещение: число
возвращает список числа
обеспечивает «ключ — ровно тридцать два байта» (длина результат) равен 32
пример «Ключ 000102…1f из приложения C.3 FIPS-197»
дано байты равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31]
дано смещение равно 0
ожидается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
29, 30, 31]
тотальная функция «Слово подстановки»
принимает слово: список числа
возвращает список числа
обеспечивает «итог — четыре байта» (длина результат) равен 4
пример «Последнее слово ключа C.3: 1c1d1e1f идёт в 9ca472c0»
дано слово равно [28, 29, 30, 31]
ожидается [156, 164, 114, 192]
тотальная функция «Постоянные раундов 256»
возвращает список числа
обеспечивает «постоянных ровно шесть» (длина результат) равен 6
обеспечивает «первая постоянная раунда 256 — единица» («Байт по номеру» от результат и 1) равен 1
обеспечивает «последняя постоянная раунда 256 — 0x20» («Байт по номеру» от результат и 6) равен 32
пример «01 02 04 08 10 20»
ожидается [1, 2, 4, 8, 16, 32]
тотальная функция «Шаг расширения 256»
принимает расширение: список числа, постоянная: число
возвращает список числа
обеспечивает «шаг дописывает ровно тридцать два байта» (длина результат) равен ((длина расширение) плюс 32)
тотальная функция «Полшага расширения 256»
принимает расширение: список числа, постоянная: число
возвращает список числа
обеспечивает «полшага дописывает ровно шестнадцать байтов» (длина результат) равен ((длина расширение) плюс 16)
тотальная функция «Расширение ключа 256»
принимает ключ: список числа
возвращает список числа
обеспечивает «расширение — двести сорок байтов, пятнадцать ключей раунда» (длина результат) равен 240
обеспечивает «первый ключ раунда — первая половина ключа» («Шестнадцать байтов» от результат и 0) равно («Шестнадцать байтов» от ключ и 0)
пример «Ключ 000102…1f из приложения C.3 FIPS-197: все шестьдесят слов»
дано ключ равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31]
ожидается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
29, 30, 31, 165, 115, 194, 159, 161, 118, 196, 152, 169, 127, 206, 147, 165, 114, 192, 156, 22, 81, 168, 205, 2,
68, 190, 218, 26, 93, 164, 193, 6, 64, 186, 222, 174, 135, 223, 240, 15, 241, 27, 104, 166, 142, 213, 251, 3, 252,
21, 103, 109, 225, 241, 72, 111, 165, 79, 146, 117, 248, 235, 83, 115, 184, 81, 141, 198, 86, 130, 127, 201, 167,
153, 23, 111, 41, 76, 236, 108, 213, 89, 139, 61, 226, 58, 117, 82, 71, 117, 231, 39, 191, 158, 180, 84, 7, 207,
57, 11, 220, 144, 95, 194, 123, 9, 72, 173, 82, 69, 164, 193, 135, 28, 47, 69, 245, 166, 96, 23, 178, 211, 135,
48, 13, 77, 51, 100, 10, 130, 10, 124, 207, 247, 28, 190, 180, 254, 84, 19, 230, 187, 240, 210, 97, 167, 223, 240,
26, 250, 254, 231, 168, 41, 121, 215, 165, 100, 74, 179, 175, 230, 64, 37, 65, 254, 113, 155, 245, 0, 37, 136, 19,
187, 213, 90, 114, 28, 10, 78, 90, 102, 153, 169, 242, 79, 224, 126, 87, 43, 170, 205, 248, 205, 234, 36, 252,
121, 204, 191, 9, 121, 233, 55, 26, 194, 60, 109, 104, 222, 54]
тотальная функция «Зашифровать блок 256»
принимает ключ: список числа, блок: список числа
возвращает список числа
обеспечивает «шифроблок ровно той же длины, что и блок, — шестнадцать байтов» (длина результат) равен 16
пример «Официальный вектор FIPS-197, приложение C.3 (AES-256)»
дано ключ равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31]
дано блок равно [0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255]
ожидается [142, 162, 183, 202, 81, 103, 69, 191, 234, 252, 73, 144, 75, 73, 96, 137]
тотальная функция «Расшифровать блок 256»
принимает ключ: список числа, блок: список числа
возвращает список числа
обеспечивает «расшифрованное ровно той же длины, что и шифроблок, — шестнадцать байтов» (длина результат) равен 16
пример «Официальный вектор FIPS-197, приложение C.3, в обратную сторону»
дано ключ равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31]
дано блок равно [142, 162, 183, 202, 81, 103, 69, 191, 234, 252, 73, 144, 75, 73, 96, 137]
ожидается [0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255]
тотальная функция «Шаг гаммы 256»
принимает ход: «Ход гаммы», байт: число
возвращает «Ход гаммы»
обеспечивает «выход удлиняется ровно на байт» (длина результат.выход) равен ((длина ход.выход) плюс 1)
обеспечивает «место в гамме не выходит за блок» (результат.позиция не меньше 1) и притом (результат.позиция не больше 16)
обеспечивает «до конца блока место 256 растёт на единицу» если (не (ход.позиция не меньше 16)) то (результат.позиция равен (ход.позиция плюс 1)) иначе да
обеспечивает «на конце блока место 256 сбрасывается в единицу» если (ход.позиция не меньше 16) то (результат.позиция равен 1) иначе да
обеспечивает «ключ гаммы 256 не трогается» результат.расширение равно ход.расширение
обеспечивает «до конца блока счётчик 256 не трогается» если (не (ход.позиция не меньше 16)) то (результат.счётчик равно ход.счётчик) иначе да
обеспечивает «до конца блока гамма 256 не пересчитывается» если (не (ход.позиция не меньше 16)) то (результат.гамма равно ход.гамма) иначе да
обеспечивает «на конце блока счётчик 256 прирастает» если (ход.позиция не меньше 16) то (результат.счётчик равно («Прибавить единицу» от ход.счётчик)) иначе да
пример «Второй байт блока CTR-AES256 из NIST SP 800-38A, F.5.5»
дано ход равно вариант «Ход гаммы» с расширение равным [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133,
125, 119, 129, 31, 53, 44, 7, 59, 97, 8, 215, 45, 152, 16, 163, 9, 20, 223, 244] и счётчик равным [240, 241, 242,
243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255] и гамма равным [11, 223, 125, 241, 89, 23, 22,
51, 94, 154, 139, 21, 200, 96, 197, 2] и позиция равным 1 и выход равным [96]
дано байт равно 193
ожидается вариант «Ход гаммы» с расширение равным [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125,
119, 129, 31, 53, 44, 7, 59, 97, 8, 215, 45, 152, 16, 163, 9, 20, 223, 244] и счётчик равным [240, 241, 242, 243,
244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255] и гамма равным [11, 223, 125, 241, 89, 23, 22, 51, 94,
154, 139, 21, 200, 96, 197, 2] и позиция равным 2 и выход равным [96, 30]
тотальная функция «Шифр CTR 256»
принимает ключ: список числа, счётчик: список числа, текст: список числа
возвращает список числа
обеспечивает «шифротекст ровно той же длины, что и открытый текст» (длина результат) равен (длина текст)
пример «Пустому тексту — пустой шифротекст»
дано ключ равно [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125, 119, 129, 31, 53, 44, 7, 59, 97,
8, 215, 45, 152, 16, 163, 9, 20, 223, 244]
дано счётчик равно [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]
дано текст равно пустой список
ожидается пустой список
тотальная функция «Шаг CBC вперёд 256»
принимает ход: «Ход CBC», байт: число
возвращает «Ход CBC»
обеспечивает «сцепка остаётся блоком в шестнадцать байтов» (длина результат.сцепка) равен 16
обеспечивает «ключ не трогается» результат.ключ равно ход.ключ
обеспечивает «до полного блока счёт набранного 256 растёт на единицу» если (не (ход.набрано не меньше 15)) то (результат.набрано равен (ход.набрано плюс 1)) иначе да
обеспечивает «до полного блока буфер 256 прирастает байтом» если (не (ход.набрано не меньше 15)) то (результат.буфер равен (добавить («Свести к байту» от байт) к ход.буфер)) иначе да
обеспечивает «на полном блоке буфер шифрования 256 опустошается» если (ход.набрано не меньше 15) то (результат.буфер равен пустой список) иначе да
обеспечивает «на полном блоке счёт набранного 256 обнуляется» если (ход.набрано не меньше 15) то (результат.набрано равен 0) иначе да
обеспечивает «до полного блока выход шифрования 256 не трогается» если (не (ход.набрано не меньше 15)) то (результат.выход равно ход.выход) иначе да
обеспечивает «до полного блока сцепка шифрования 256 не трогается» если (не (ход.набрано не меньше 15)) то (результат.сцепка равно ход.сцепка) иначе да
пример «Первый байт CBC-AES256 (NIST SP 800-38A, F.2.5) копится в буфере»
дано ход равно вариант «Ход CBC» с ключ равным [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125,
119, 129, 31, 53, 44, 7, 59, 97, 8, 215, 45, 152, 16, 163, 9, 20, 223, 244] и сцепка равным [0, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15] и буфер равным пустой список и набрано равным 0 и выход равным пустой список
дано байт равно 107
ожидается вариант «Ход CBC» с ключ равным [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125, 119,
129, 31, 53, 44, 7, 59, 97, 8, 215, 45, 152, 16, 163, 9, 20, 223, 244] и сцепка равным [0, 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15] и буфер равным [107] и набрано равным 1 и выход равным пустой список
тотальная функция «Шаг CBC назад 256»
принимает ход: «Ход CBC», байт: число
возвращает «Ход CBC»
обеспечивает «сцепка остаётся блоком в шестнадцать байтов» (длина результат.сцепка) равен 16
обеспечивает «ключ не трогается» результат.ключ равно ход.ключ
обеспечивает «до полного блока счёт набранного 256 растёт на единицу» если (не (ход.набрано не меньше 15)) то (результат.набрано равен (ход.набрано плюс 1)) иначе да
обеспечивает «до полного блока буфер 256 прирастает байтом» если (не (ход.набрано не меньше 15)) то (результат.буфер равен (добавить («Свести к байту» от байт) к ход.буфер)) иначе да
обеспечивает «на полном блоке буфер расшифровки 256 опустошается» если (ход.набрано не меньше 15) то (результат.буфер равен пустой список) иначе да
обеспечивает «на полном блоке счёт набранного расшифровки 256 обнуляется» если (ход.набрано не меньше 15) то (результат.набрано равен 0) иначе да
обеспечивает «до полного блока выход расшифровки 256 не трогается» если (не (ход.набрано не меньше 15)) то (результат.выход равно ход.выход) иначе да
обеспечивает «до полного блока сцепка расшифровки 256 не трогается» если (не (ход.набрано не меньше 15)) то (результат.сцепка равно ход.сцепка) иначе да
обеспечивает «на полном блоке сцепкой расшифровки 256 становится сам шифроблок» если (ход.набрано не меньше 15) то (результат.сцепка равно (добавить («Свести к байту» от байт) к ход.буфер)) иначе да
пример «Первый байт шифротекста CBC-AES256 (F.2.6) копится в буфере»
дано ход равно вариант «Ход CBC» с ключ равным [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125,
119, 129, 31, 53, 44, 7, 59, 97, 8, 215, 45, 152, 16, 163, 9, 20, 223, 244] и сцепка равным [0, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15] и буфер равным пустой список и набрано равным 0 и выход равным пустой список
дано байт равно 245
ожидается вариант «Ход CBC» с ключ равным [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125, 119,
129, 31, 53, 44, 7, 59, 97, 8, 215, 45, 152, 16, 163, 9, 20, 223, 244] и сцепка равным [0, 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15] и буфер равным [245] и набрано равным 1 и выход равным пустой список
тотальная функция «Шифр CBC 256»
принимает ключ: список числа, вектор: список числа, текст: список числа
возвращает список числа
обеспечивает «на целом числе блоков шифротекст ровно той же длины, что и открытый текст» (не (((длина текст) остаток от 16) равен 0)) или ((длина результат) равен (длина текст))
пример «Пустому тексту — пустой шифротекст»
дано ключ равно [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125, 119, 129, 31, 53, 44, 7, 59, 97,
8, 215, 45, 152, 16, 163, 9, 20, 223, 244]
дано вектор равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано текст равно пустой список
ожидается пустой список
тотальная функция «Расшифровка CBC 256 начисто»
принимает ключ: список числа, вектор: список числа, шифротекст: список числа
возвращает список числа
обеспечивает «на целом числе блоков расшифрованное ровно той же длины, что и шифротекст» (не (((длина шифротекст) остаток от 16) равен 0)) или ((длина результат) равен (длина шифротекст))
пример «Все четыре блока CBC-AES256 из NIST SP 800-38A, F.2.6»
дано ключ равно [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125, 119, 129, 31, 53, 44, 7, 59, 97,
8, 215, 45, 152, 16, 163, 9, 20, 223, 244]
дано вектор равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано шифротекст равно [245, 140, 76, 4, 214, 229, 241, 186, 119, 158, 171, 251, 95, 123, 251, 214, 156, 252, 78,
150, 126, 219, 128, 141, 103, 159, 119, 123, 198, 112, 44, 125, 57, 242, 51, 105, 169, 217, 186, 207, 165, 48,
226, 99, 4, 35, 20, 97, 178, 235, 5, 226, 195, 155, 233, 252, 218, 108, 25, 7, 140, 106, 157, 27]
ожидается [107, 193, 190, 226, 46, 64, 159, 150, 233, 61, 126, 17, 115, 147, 23, 42, 174, 45, 138, 87, 30, 3, 172,
156, 158, 183, 111, 172, 69, 175, 142, 81, 48, 200, 28, 70, 163, 92, 228, 17, 229, 251, 193, 25, 26, 10, 82, 239,
246, 159, 36, 69, 223, 79, 155, 23, 173, 43, 65, 123, 230, 108, 55, 16]
тотальная функция «Зашифровать CBC 256»
принимает ключ: список числа, вектор: список числа, текст: список числа
возвращает список числа
обеспечивает «шифротекст ложится блоками нацело» ((длина результат) остаток от 16) равен 0
пример «Пять байтов уходят в один блок»
дано ключ равно [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125, 119, 129, 31, 53, 44, 7, 59, 97,
8, 215, 45, 152, 16, 163, 9, 20, 223, 244]
дано вектор равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано текст равно [1, 2, 3, 4, 5]
ожидается [36, 100, 216, 41, 27, 59, 0, 233, 62, 81, 217, 6, 102, 54, 124, 224]
тотальная функция «Расшифровать CBC 256»
принимает ключ: список числа, вектор: список числа, шифротекст: список числа
возвращает список числа
обеспечивает «расшифрованное не длиннее шифротекста» (длина результат) не больше (длина шифротекст)
пример «Тот же блок в обратную сторону: расшифровка зашифрованного возвращает исходное»
дано ключ равно [96, 61, 235, 16, 21, 202, 113, 190, 43, 115, 174, 240, 133, 125, 119, 129, 31, 53, 44, 7, 59, 97,
8, 215, 45, 152, 16, 163, 9, 20, 223, 244]
дано вектор равно [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
дано шифротекст равно [36, 100, 216, 41, 27, 59, 0, 233, 62, 81, 217, 6, 102, 54, 124, 224]
ожидается [1, 2, 3, 4, 5]
тотальная функция «Ключ хеша 256»
принимает ключ: список числа
возвращает список числа
обеспечивает «ключ поля — блок в шестнадцать байтов» (длина результат) равен 16
пример «Нулевой ключ в тридцать два байта даёт H = dc95c078a2408989ad48a21492842087 (SP 800-38D, Test Case 13)»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [220, 149, 192, 120, 162, 64, 137, 137, 173, 72, 162, 20, 146, 132, 32, 135]
тотальная функция «Шаг гаммы GCM 256»
принимает ход: «Ход гаммы GCM», байт: число
возвращает «Ход гаммы GCM»
обеспечивает «выход удлиняется ровно на байт» (длина результат.выход) равен ((длина ход.выход) плюс 1)
обеспечивает «место в гамме не выходит за блок» (результат.позиция не меньше 1) и притом (результат.позиция не больше 16)
обеспечивает «до конца блока место 256 растёт на единицу» если (не (ход.позиция не меньше 16)) то (результат.позиция равен (ход.позиция плюс 1)) иначе да
обеспечивает «на конце блока место 256 сбрасывается в единицу» если (ход.позиция не меньше 16) то (результат.позиция равен 1) иначе да
обеспечивает «ключ гаммы GCM 256 не трогается» результат.ключ равно ход.ключ
обеспечивает «до конца блока счётчик GCM 256 не трогается» если (не (ход.позиция не меньше 16)) то (результат.счётчик равно ход.счётчик) иначе да
обеспечивает «до конца блока гамма GCM 256 не пересчитывается» если (не (ход.позиция не меньше 16)) то (результат.гамма равно ход.гамма) иначе да
обеспечивает «на конце блока счётчик GCM 256 прирастает» если (ход.позиция не меньше 16) то (результат.счётчик равно («Прибавить единицу по младшим четырём» от ход.счётчик)) иначе да
пример «Второй байт гаммы GCM-AES256 (SP 800-38D, Test Case 14)»
дано ход равно вариант «Ход гаммы GCM» с ключ равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и счётчик равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2] и гамма равным [206, 167, 64, 61, 77, 96, 107, 110, 7, 78, 197, 211, 186, 243, 157,
24] и позиция равным 1 и выход равным [206]
дано байт равно 0
ожидается вариант «Ход гаммы GCM» с ключ равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и счётчик равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2] и гамма равным [
206, 167, 64, 61, 77, 96, 107, 110, 7, 78, 197, 211, 186, 243, 157,
24] и позиция равным 2 и выход равным [206, 167]
тотальная функция «Шифр GCTR 256»
принимает ключ: список числа, счётчик: список числа, текст: список числа
возвращает список числа
обеспечивает «шифротекст ровно той же длины, что и открытый текст» (длина результат) равен (длина текст)
тотальная функция «Начальный счётчик 256»
принимает ключ: список числа, вектор: список числа
возвращает список числа
обеспечивает «начальный счётчик — блок в шестнадцать байтов» (длина результат) равен 16
обеспечивает «вектору в двенадцать байтов приписана единица» если ((длина вектор) равен 12) то (результат равен («Досыпать байты» от («Досыпать байты» от вектор и («Нули» от 3)) и [1])) иначе да
пример «Вектор в двенадцать байтов: к нему приписана единица»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано вектор равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
тотальная функция «Тег GCM 256»
принимает ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа
возвращает список числа
обеспечивает «тег — ровно шестнадцать байтов» (длина результат) равен 16
пример «Test Case 13 (SP 800-38D): нулевой ключ в тридцать два байта, пустые данные, пустой шифротекст»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано вектор равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано доп равно пустой список
дано шифротекст равно пустой список
ожидается [83, 15, 138, 251, 199, 69, 54, 185, 169, 99, 180, 241, 196, 203, 115, 139]
тотальная функция «Зашифровать GCM 256»
принимает ключ: список числа, вектор: список числа, доп: список числа, текст: список числа
возвращает «Печать GCM»
обеспечивает «тег — ровно шестнадцать байтов» (длина результат.тег) равен 16
обеспечивает «шифротекст ровно той же длины, что и открытый текст» (длина результат.шифротекст) равен (длина текст)
пример «Test Case 13 (SP 800-38D): пустой текст, пустые данные, нулевой ключ в тридцать два байта»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано вектор равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано доп равно пустой список
дано текст равно пустой список
ожидается вариант «Печать GCM» с шифротекст равным пустой список и тег равным [83, 15, 138, 251, 199, 69, 54, 185,
169, 99, 180, 241, 196, 203, 115, 139]
тотальная функция «Расшифровать GCM 256»
принимает ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа, тег: список числа
возвращает «Исход GCM»
обеспечивает «при отказе открытого текста не выдаётся» («Расшифровано ли» от результат) или ((длина («Текст исхода» от результат)) равен 0)
обеспечивает «при успехе открытый текст той же длины, что и шифротекст» не («Расшифровано ли» от результат) или ((длина («Текст исхода» от результат)) равен (длина шифротекст))
пример «Test Case 14 в обратную сторону: тег сошёлся, текст выдан»
дано ключ равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано вектор равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано доп равно пустой список
дано шифротекст равно [206, 167, 64, 61, 77, 96, 107, 110, 7, 78, 197, 211, 186, 243, 157, 24]
дано тег равно [208, 209, 200, 167, 153, 153, 107, 240, 38, 91, 152, 181, 212, 138, 185, 25]
ожидается вариант «Расшифровано» с текст равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Байт двумя знаками»
принимает байт: число
возвращает строка
обеспечивает «байт печатается ровно двумя знаками» (длина результат) равен 2
пример «Ноль»
дано байт равно 0
ожидается "00"
тотальная функция «Байты шестнадцатеричной строкой»
принимает байты: список числа
возвращает строка
обеспечивает «на каждый байт — по два знака» (длина результат) равен ((длина байты) умножить на 2)
пример «Пусто»
дано байты равно пустой список
ожидается ""
| Function | Termination | Claims |
|---|---|---|
| «Веса байта» | доказано композицией | доказано 4 из 4 |
| «Исключающее или байтов» | доказано композицией | доказано 0 из 2; «итог — байт снизу» — сетка; «итог — байт сверху» — сетка |
| «Байт по номеру» | доказано композицией | доказано 4 из 6; «байт по номеру — байт сверху» — сетка; «байт по номеру — байт снизу» — сетка |
| «Таблица подстановки» | доказано композицией | доказано 1 из 1 |
| «Подстановка» | доказано композицией | доказано 1 из 1 |
| «Удвоить в поле» | доказано композицией | доказано 1 из 2; «удвоенное — байт» — сетка |
| «Утроить в поле» | доказано композицией | доказано 1 из 1 |
| «Четыре байта» | доказано композицией | доказано 1 из 1 |
| «Шестнадцать байтов» | доказано композицией | доказано 1 из 1 |
| «Сложить слова» | доказано композицией | доказано 1 из 1 |
| «Постоянные раундов» | доказано композицией | доказано 4 из 4 |
| «Слово поворота» | доказано композицией | доказано 1 из 1 |
| «Шаг расширения» | доказано композицией | доказано 0 из 1; «шаг дописывает ровно шестнадцать байтов» — сетка |
| «Расширение ключа» | доказано композицией | доказано 0 из 2; «расширение — сто семьдесят шесть байтов, одиннадцать ключей раунда» — сетка; «первый ключ раунда — сам ключ» — сетка |
| «Подстановка блока» | доказано композицией | доказано 1 из 1 |
| «Сдвиг строк» | доказано композицией | доказано 1 из 1 |
| «Смешать столбец» | доказано композицией | доказано 1 из 1 |
| «Смешать столбцы» | доказано композицией | доказано 1 из 1 |
| «Сложить с ключом» | доказано композицией | доказано 1 из 1 |
| «Ключ раунда» | доказано композицией | доказано 1 из 1 |
| «Шаг раунда шифра» | доказано композицией | доказано 3 из 3 |
| «Состояние хода» | доказано композицией | доказано 1 из 1 |
| «Зашифровать блок» | доказано композицией | доказано 0 из 1; «шифроблок ровно той же длины, что и блок, — шестнадцать байтов» — сетка |
| «Шаг счёта» | доказано композицией | доказано 6 из 6 |
| «Байты счёта» | доказано композицией | доказано 1 из 1 |
| «Прибавить единицу» | доказано композицией | доказано 0 из 1; «счётчик CTR остаётся блоком в шестнадцать байтов» — сетка |
| «Шаг гаммы» | доказано композицией | доказано 7 из 8; «место в гамме CTR не выходит за блок» — сетка |
| «Выход гаммы» | доказано композицией | доказано 1 из 1 |
| «Шифр CTR» | доказано композицией | доказано 0 из 1; «шифротекст CTR ровно той же длины, что и открытый текст» — сетка |
| «Сложить блоки» | доказано композицией | доказано 1 из 1 |
| «Многочлен поля» | доказано композицией | доказано 3 из 3 |
| «Шаг сдвига блока» | доказано композицией | доказано 2 из 2 |
| «Байты сдвига» | доказано композицией | доказано 1 из 1 |
| «Сдвиг блока вправо» | доказано композицией | доказано 0 из 1; «сдвиг не меняет длины» — сетка |
| «Привести сдвиг» | доказано композицией | доказано 3 из 4; «приведение не меняет длины» — сетка |
| «Шаг разряда поля» | доказано композицией | доказано 2 из 4; «произведение разряда остаётся блоком» — сетка; «сдвиг остаётся блоком» — сетка |
| «Шаг байта поля» | доказано композицией | доказано 0 из 1; «произведение байта остаётся блоком» — объявлено, не доказано |
| «Произведение поля» | доказано композицией | доказано 1 из 1 |
| «Умножить в поле» | доказано композицией | доказано 0 из 1; «произведение — блок в шестнадцать байтов» — сетка |
| «Шаг GHASH» | доказано композицией | доказано 6 из 7; «свод остаётся блоком в шестнадцать байтов» — сетка |
| «Свод GHASH» | доказано композицией | доказано 1 из 1 |
| «GHASH» | доказано композицией | доказано 0 из 1; «свод GHASH — блок в шестнадцать байтов» — сетка |
| «Ключ хеша» | доказано композицией | доказано 0 из 1; «ключ поля — блок в шестнадцать байтов» — сетка |
| «Прибавить единицу по младшим четырём» | доказано композицией | доказано 0 из 1; «счётчик GCM остаётся блоком в шестнадцать байтов» — сетка |
| «Шаг гаммы GCM» | доказано композицией | доказано 7 из 8; «место в гамме GCM не выходит за блок» — сетка |
| «Выход гаммы GCM» | доказано композицией | доказано 1 из 1 |
| «Шифр GCTR» | доказано композицией | доказано 0 из 1; «шифротекст GCTR ровно той же длины, что и открытый текст» — сетка |
| «Набивка до блока» | доказано композицией | доказано 0 из 2; «набитое нулями делится на блоки нацело» — сетка; «набивка короче блока» — сетка |
| «Данные GHASH» | доказано композицией | доказано 0 из 1; «данные делятся на блоки нацело» — сетка |
| «Начальный счётчик» | доказано композицией | доказано 1 из 2; «начальный счётчик — блок в шестнадцать байтов» — сетка |
| «Тег GCM» | доказано композицией | доказано 1 из 1 |
| «Зашифровать GCM» | доказано композицией | доказано 0 из 2; «тег шифрования GCM — ровно шестнадцать байтов» — сетка; «шифротекст GCM ровно той же длины, что и открытый текст» — сетка |
| «Расшифровано ли» | доказано композицией | — |
| «Текст исхода» | доказано композицией | доказано 0 из 1; «у отказа текста нет» — сетка |
| «Расшифровать GCM» | доказано композицией | доказано 1 из 2; «при успехе открытый текст той же длины, что и шифротекст» — объявлено, не доказано |
| «Обратная таблица подстановки» | доказано композицией | доказано 1 из 1 |
| «Обратная подстановка» | доказано композицией | доказано 1 из 1 |
| «Обратная подстановка блока» | доказано композицией | доказано 1 из 1 |
| «Обратный сдвиг строк» | доказано композицией | доказано 1 из 1 |
| «Умножить на девять в поле» | доказано композицией | доказано 0 из 1; «произведение на девять — байт» — сетка |
| «Умножить на одиннадцать в поле» | доказано композицией | доказано 0 из 1; «произведение на одиннадцать — байт» — сетка |
| «Умножить на тринадцать в поле» | доказано композицией | доказано 0 из 1; «произведение на тринадцать — байт» — сетка |
| «Умножить на четырнадцать в поле» | доказано композицией | доказано 0 из 1; «произведение на четырнадцать — байт» — сетка |
| «Обратно смешать столбец» | доказано композицией | доказано 1 из 1 |
| «Обратно смешать столбцы» | доказано композицией | доказано 1 из 1 |
| «Шаг раунда расшифровки» | доказано композицией | доказано 3 из 3 |
| «Расшифровать блок» | доказано композицией | доказано 0 из 1; «расшифрованное ровно той же длины, что и шифроблок, — шестнадцать байтов» — сетка |
| «Состояние обратного хода» | доказано композицией | доказано 0 из 1; «состояние обратного хода — шестнадцать байтов» — сетка |
| «Шаг CBC вперёд» | доказано композицией | доказано 7 из 8; «сцепка шифрования CBC остаётся блоком в шестнадцать байтов» — сетка |
| «Шаг CBC назад» | доказано композицией | доказано 8 из 9; «сцепка расшифровки CBC остаётся блоком в шестнадцать байтов» — сетка |
| «Выход CBC» | доказано композицией | доказано 1 из 1 |
| «Шифр CBC» | доказано композицией | доказано 0 из 1; «на целом числе блоков шифротекст ровно той же длины, что и открытый текст» — сетка |
| «Расшифровка CBC начисто» | доказано композицией | доказано 0 из 1; «на целом числе блоков расшифрованное ровно той же длины, что и шифротекст» — сетка |
| «Набивка PKCS7» | доказано композицией | доказано 0 из 2; «набитое по PKCS7 делится на блоки нацело» — сетка; «набивка добавляет не меньше байта и не больше блока» — сетка |
| «Длина без набивки» | доказано композицией | доказано 2 из 4; «длина без набивки не больше самой длины» — сетка; «длина без набивки не меньше нуля» — сетка |
| «Шаг начала» | доказано композицией | доказано 4 из 4 |
| «Выход начала» | доказано композицией | доказано 1 из 1 |
| «Начало байтов» | доказано композицией | доказано 0 из 1; «начало не длиннее целого» — сетка |
| «Зашифровать CBC» | доказано композицией | доказано 0 из 2; «шифротекст ложится блоками нацело» — сетка; «шифротекст длиннее открытого текста не меньше чем на байт и не больше чем на блок» — сетка |
| «Расшифровать CBC» | доказано композицией | доказано 0 из 1; «расшифрованное не длиннее шифротекста» — сетка |
| «Тридцать два байта» | доказано композицией | доказано 1 из 1 |
| «Слово подстановки» | доказано композицией | доказано 1 из 1 |
| «Постоянные раундов 256» | доказано композицией | доказано 3 из 3 |
| «Шаг расширения 256» | доказано композицией | доказано 0 из 1; «шаг дописывает ровно тридцать два байта» — объявлено, не доказано |
| «Полшага расширения 256» | доказано композицией | доказано 0 из 1; «полшага дописывает ровно шестнадцать байтов» — объявлено, не доказано |
| «Расширение ключа 256» | доказано композицией | доказано 0 из 2; «расширение — двести сорок байтов, пятнадцать ключей раунда» — сетка; «первый ключ раунда — первая половина ключа» — сетка |
| «Зашифровать блок 256» | доказано композицией | доказано 0 из 1; «шифроблок ровно той же длины, что и блок, — шестнадцать байтов» — сетка |
| «Расшифровать блок 256» | доказано композицией | доказано 0 из 1; «расшифрованное ровно той же длины, что и шифроблок, — шестнадцать байтов» — сетка |
| «Шаг гаммы 256» | доказано композицией | доказано 7 из 8; «место в гамме не выходит за блок» — сетка |
| «Шифр CTR 256» | доказано композицией | доказано 0 из 1; «шифротекст ровно той же длины, что и открытый текст» — сетка |
| «Шаг CBC вперёд 256» | доказано композицией | доказано 7 из 8; «сцепка остаётся блоком в шестнадцать байтов» — сетка |
| «Шаг CBC назад 256» | доказано композицией | доказано 8 из 9; «сцепка остаётся блоком в шестнадцать байтов» — сетка |
| «Шифр CBC 256» | доказано композицией | доказано 0 из 1; «на целом числе блоков шифротекст ровно той же длины, что и открытый текст» — сетка |
| «Расшифровка CBC 256 начисто» | доказано композицией | доказано 0 из 1; «на целом числе блоков расшифрованное ровно той же длины, что и шифротекст» — сетка |
| «Зашифровать CBC 256» | доказано композицией | доказано 0 из 1; «шифротекст ложится блоками нацело» — сетка |
| «Расшифровать CBC 256» | доказано композицией | доказано 0 из 1; «расшифрованное не длиннее шифротекста» — сетка |
| «Ключ хеша 256» | доказано композицией | доказано 0 из 1; «ключ поля — блок в шестнадцать байтов» — сетка |
| «Шаг гаммы GCM 256» | доказано композицией | доказано 7 из 8; «место в гамме не выходит за блок» — сетка |
| «Шифр GCTR 256» | доказано композицией | доказано 0 из 1; «шифротекст ровно той же длины, что и открытый текст» — объявлено, не доказано |
| «Начальный счётчик 256» | доказано композицией | доказано 1 из 2; «начальный счётчик — блок в шестнадцать байтов» — сетка |
| «Тег GCM 256» | доказано композицией | доказано 1 из 1 |
| «Зашифровать GCM 256» | доказано композицией | доказано 0 из 2; «тег — ровно шестнадцать байтов» — сетка; «шифротекст ровно той же длины, что и открытый текст» — сетка |
| «Расшифровать GCM 256» | доказано композицией | доказано 1 из 2; «при успехе открытый текст той же длины, что и шифротекст» — сетка |
| «Байт двумя знаками» | доказано композицией | доказано 0 из 1; «байт печатается ровно двумя знаками» — сетка |
| «Байты шестнадцатеричной строкой» | доказано композицией | доказано 0 из 1; «на каждый байт — по два знака» — сетка |
«Automaton»
flang/stdlib/automaton.flang — functions 63; the kernel ledger was taken from this version of the file
объект «Отрезок»
«низ»: число
«верх»: число
тип «Узел»
вариант «Тупик»
вариант «Пустое слово»
вариант «Знак» содержит точка: число
вариант «Любой»
вариант «Класс» содержит отрицание: признак, отрезки: список «Отрезок»
вариант «Начало»
вариант «Конец»
вариант «Ряд» содержит первый: «Узел», второй: «Узел»
вариант «Или» содержит лв: «Узел», пр: «Узел»
вариант «Много» содержит нутро: «Узел»
тотальная функция «Это тупик»
принимает узел: «Узел»
возвращает признак
обеспечивает «тупик признаётся тупиком» (не (узел равен (вариант «Тупик»))) или (результат равен да)
обеспечивает «всё, что не тупик, тупиком не зовётся» (узел равен (вариант «Тупик»)) или (результат равен нет)
пример «тупик»
дано узел равно вариант «Тупик»
ожидается да
тотальная функция «Это пустое слово»
принимает узел: «Узел»
возвращает признак
обеспечивает «пустое слово признаётся пустым словом» (не (узел равен (вариант «Пустое слово»))) или (результат равен да)
обеспечивает «всё, что не пустое слово, пустым словом не зовётся» (узел равен (вариант «Пустое слово»)) или (результат равен нет)
пример «пустое слово»
дано узел равно вариант «Пустое слово»
ожидается да
тотальная функция «Есть ветвь»
принимает узел: «Узел», ветка: «Узел»
возвращает признак
пример «ветвь совпала»
дано узел равно вариант «Знак» с точка равным 97
дано ветка равно вариант «Знак» с точка равным 97
ожидается да
тотальная функция «Слить в ряд»
принимает нч: «Узел», хв: «Узел»
возвращает «Узел»
обеспечивает «тупик в ряду поглощает всё» если («Это тупик» от нч) или («Это тупик» от хв) то (результат равен (вариант «Тупик»)) иначе да
обеспечивает «ряд с тупиком — тупик» (не ((«Это тупик» от нч) или («Это тупик» от хв))) или («Это тупик» от результат)
пример «пустое слово слева выпадает»
дано нч равно вариант «Пустое слово»
дано хв равно вариант «Знак» с точка равным 97
ожидается вариант «Знак» с точка равным 97
тотальная функция «Слить в выбор»
принимает лев: «Узел», прв: «Узел»
возвращает «Узел»
пример «тупик слева выпадает»
дано лев равно вариант «Тупик»
дано прв равно вариант «Знак» с точка равным 97
ожидается вариант «Знак» с точка равным 97
тотальная функция «Повторить много»
принимает нтр: «Узел»
возвращает «Узел»
обеспечивает «повтор пустого — пустое слово» если («Это тупик» от нтр) или («Это пустое слово» от нтр) то (результат равен (вариант «Пустое слово»)) иначе да
обеспечивает «повтор непустого — узел повтора» если не ((«Это тупик» от нтр) или («Это пустое слово» от нтр)) то (результат равен (вариант «Много» с нутро равным нтр)) иначе да
пример «повтор тупика — пустое слово»
дано нтр равно вариант «Тупик»
ожидается вариант «Пустое слово»
тотальная функция «Повторить хотя бы раз»
принимает нтр: «Узел»
возвращает «Узел»
обеспечивает «хотя бы раз от тупика — тупик» если («Это тупик» от нтр) или («Это тупик» от («Повторить много» от нтр)) то (результат равен (вариант «Тупик»)) иначе да
пример «хотя бы раз от тупика — тупик»
дано нтр равно вариант «Тупик»
ожидается вариант «Тупик»
тотальная функция «Может не быть»
принимает нтр: «Узел»
возвращает «Узел»
пример «необязательный тупик — пустое слово»
дано нтр равно вариант «Тупик»
ожидается вариант «Пустое слово»
тотальная функция «Пусто допустимо»
принимает узел: «Узел», вначале: признак, вконце: признак
возвращает признак
обеспечивает «тупик пустого не допускает» (не (узел равен (вариант «Тупик»))) или (результат равен нет)
обеспечивает «пустое слово пустое допускает» (не (узел равен (вариант «Пустое слово»))) или (результат равен да)
обеспечивает «любой знак пустого не допускает» (не (узел равен (вариант «Любой»))) или (результат равен нет)
обеспечивает «якорь начала спрашивает только про начало» (не (узел равен (вариант «Начало»))) или (результат равен вначале)
обеспечивает «якорь конца спрашивает только про конец» (не (узел равен (вариант «Конец»))) или (результат равен вконце)
пример «пустое слово допускает пустое»
дано узел равно вариант «Пустое слово»
дано вначале равно да
дано вконце равно да
ожидается да
тотальная функция «В отрезке»
принимает отрезок: «Отрезок», тк: число
возвращает признак
обеспечивает «точка между низом и верхом отрезку принадлежит» (не ((тк не меньше (отрезок.«низ»)) и притом (тк не больше (отрезок.«верх»)))) или (результат равен да)
обеспечивает «точка вне низа и верха отрезку не принадлежит» ((тк не меньше (отрезок.«низ»)) и притом (тк не больше (отрезок.«верх»))) или (результат равен нет)
пример «цифра в отрезке цифр»
дано отрезок равно запись «Отрезок» с «низ» равным 48 и «верх» равным 57
дано тк равно 53
ожидается да
тотальная функция «В отрезках»
принимает отрезки: список «Отрезок», тк: число
возвращает признак
пример «пустой набор не держит ничего»
дано отрезки равно пустой список
дано тк равно 97
ожидается нет
тотальная функция «Знак подходит»
принимает узел: «Узел», тк: число
возвращает признак
пример «знак совпал»
дано узел равно вариант «Знак» с точка равным 97
дано тк равно 97
ожидается да
тотальная функция «Производная»
принимает узел: «Узел», тк: число, вначале: признак
возвращает «Узел»
обеспечивает «производная тупика — тупик» (не (узел равен (вариант «Тупик»))) или (результат равен (вариант «Тупик»))
обеспечивает «производная пустого слова — тупик» (не (узел равен (вариант «Пустое слово»))) или (результат равен (вариант «Тупик»))
обеспечивает «производная якоря начала — тупик» (не (узел равен (вариант «Начало»))) или (результат равен (вариант «Тупик»))
обеспечивает «производная якоря конца — тупик» (не (узел равен (вариант «Конец»))) или (результат равен (вариант «Тупик»))
обеспечивает «подошедший любой знак стирается в пустое слово» если узел равен (вариант «Любой») то (если «Знак подходит» от узел и тк то (результат равен (вариант «Пустое слово»)) иначе да) иначе да
пример «знак съеден — остаётся пустое слово»
дано узел равно вариант «Знак» с точка равным 97
дано тк равно 97
дано вначале равно да
ожидается вариант «Пустое слово»
объект «Ход бега»
«узел»: «Узел»
«вначале»: признак
тотальная функция «Шаг бега»
принимает ход: «Ход бега», знак: строка
возвращает «Ход бега»
обеспечивает «после первого же шага начало пройдено» (результат.«вначале») равен нет
обеспечивает «шаг бега берёт производную по коду знака» (результат.«узел») равен («Производная» от (ход.«узел») и (код символа знак) и (ход.«вначале»))
пример «первый знак снимает признак начала»
дано ход равно запись «Ход бега» с «узел» равным (вариант «Знак» с точка равным 97) и «вначале» равным да
дано знак равно "a"
ожидается запись «Ход бега» с «узел» равным (вариант «Пустое слово») и «вначале» равным нет
тотальная функция «Прогон с места»
принимает узел: «Узел», текст: строка, вначале: признак
возвращает «Узел»
пример «строка съедена целиком»
дано узел равно вариант «Знак» с точка равным 97
дано текст равно "a"
дано вначале равно да
ожидается вариант «Пустое слово»
тотальная функция «Прогон»
принимает узел: «Узел», текст: строка
возвращает «Узел»
обеспечивает «прогон есть прогон с начала строки» результат равен («Прогон с места» от узел и текст и да)
пример «строка съедена целиком»
дано узел равно вариант «Знак» с точка равным 97
дано текст равно "a"
ожидается вариант «Пустое слово»
тотальная функция «Узлом совпадает с места»
принимает узел: «Узел», текст: строка, вначале: признак
возвращает признак
обеспечивает «непустой остаток прогоняется и спрашивается на конце» если не ((длина текст) равен 0) то (результат равен («Пусто допустимо» от («Прогон с места» от узел и текст и вначале) и нет и да)) иначе да
обеспечивает «на пустом остатке спрашивается только допустимость пустого» если (длина текст) равен 0 то (результат равен («Пусто допустимо» от узел и вначале и да)) иначе да
пример «якорь начала не годится в середине строки»
дано узел равно вариант «Начало»
дано текст равно ""
дано вначале равно нет
ожидается нет
тотальная функция «Узлом совпадает целиком»
принимает узел: «Узел», текст: строка
возвращает признак
пример «знак и строка из него»
дано узел равно вариант «Знак» с точка равным 97
дано текст равно "a"
ожидается да
тотальная функция «Обёртка поиска»
принимает узел: «Узел»
возвращает «Узел»
обеспечивает «обёртка вокруг тупика — всё равно тупик» если («Это тупик» от («Повторить много» от (вариант «Любой»))) или («Это тупик» от («Слить в ряд» от узел и («Повторить много» от (вариант «Любой»)))) то (результат равен (вариант «Тупик»)) иначе да
пример «обёртка вокруг тупика — всё равно тупик»
дано узел равно вариант «Тупик»
ожидается вариант «Тупик»
тотальная функция «Узлом есть совпадение»
принимает узел: «Узел», текст: строка
возвращает признак
пример «знак есть в середине»
дано узел равно вариант «Знак» с точка равным 98
дано текст равно "abc"
ожидается да
тип «Знак образца»
вариант «Атом» содержит уз: «Узел»
вариант «Звёздочка»
вариант «Плюс»
вариант «Вопрос»
вариант «Черта»
вариант «Скобка влево»
вариант «Скобка вправо»
объект «Ход лексера»
«токены»: список «Знак образца»
«режим»: число
«отрицание»: признак
«отрезки»: список «Отрезок»
«низ»: число
«дефис»: признак
«свежий»: признак
«беда»: строка
тотальная функция «Отрезки цифр»
возвращает список «Отрезок»
обеспечивает «цифры — один отрезок» (длина результат) равен 1
обеспечивает «цифры — это отрезок кодов 48…57» результат равен [запись «Отрезок» с «низ» равным 48 и «верх» равным 57]
пример «один отрезок»
ожидается [запись «Отрезок» с «низ» равным 48 и «верх» равным 57]
тотальная функция «Отрезки слова»
возвращает список «Отрезок»
обеспечивает «знаков слова — четыре отрезка» (длина результат) равен 4
обеспечивает «первый отрезок слова — цифры» (элемент 1 в результат) равен (запись «Отрезок» с «низ» равным 48 и «верх» равным 57)
пример «четыре отрезка, как у чужого \\w»
ожидается [(запись «Отрезок» с «низ» равным 48 и «верх» равным 57),
(запись «Отрезок» с «низ» равным 65 и «верх» равным 90), (запись «Отрезок» с «низ» равным 95 и «верх» равным 95),
(запись «Отрезок» с «низ» равным 97 и «верх» равным 122)]
тотальная функция «Отрезки пробелов»
возвращает список «Отрезок»
обеспечивает «пробелов — десять отрезков» (длина результат) равен 10
обеспечивает «первый отрезок пробелов — управляющие 9…13» (элемент 1 в результат) равен (запись «Отрезок» с «низ» равным 9 и «верх» равным 13)
пример «первый отрезок — управляющие»
ожидается [(запись «Отрезок» с «низ» равным 9 и «верх» равным 13),
(запись «Отрезок» с «низ» равным 32 и «верх» равным 32),
(запись «Отрезок» с «низ» равным 160 и «верх» равным 160),
(запись «Отрезок» с «низ» равным 5760 и «верх» равным 5760),
(запись «Отрезок» с «низ» равным 8192 и «верх» равным 8202),
(запись «Отрезок» с «низ» равным 8232 и «верх» равным 8233),
(запись «Отрезок» с «низ» равным 8239 и «верх» равным 8239),
(запись «Отрезок» с «низ» равным 8287 и «верх» равным 8287),
(запись «Отрезок» с «низ» равным 12288 и «верх» равным 12288),
(запись «Отрезок» с «низ» равным 65279 и «верх» равным 65279)]
тотальная функция «Ход вне класса»
принимает токены: список «Знак образца», режим: число, беда: строка
возвращает «Ход лексера»
обеспечивает «беда доносится» результат.«беда» равен беда
обеспечивает «режим доносится» результат.«режим» равен режим
обеспечивает «поток знаков доносится» результат.«токены» равен токены
обеспечивает «вне класса отрицания нет» результат.«отрицание» равен нет
обеспечивает «вне класса набор пуст» результат.«отрезки» равен пустой список
обеспечивает «вне класса отложенного знака нет» результат.«низ» равен -1
пример «порожний ход»
дано токены равно пустой список
дано режим равно 0
дано беда равно ""
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Ход в классе»
принимает ход: «Ход лексера», режим: число, отрицание: признак, отрезки: список «Отрезок», низ: число, дефис: признак, свежий: признак
возвращает «Ход лексера»
обеспечивает «в классе беда не заводится» результат.«беда» равен (ход.«беда»)
обеспечивает «в классе поток знаков не трогается» результат.«токены» равен (ход.«токены»)
обеспечивает «режим доносится» результат.«режим» равен режим
обеспечивает «отрицание доносится» результат.«отрицание» равен отрицание
обеспечивает «набор доносится» результат.«отрезки» равен отрезки
пример «класс только что открыт»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
дано режим равно 2
дано отрицание равно нет
дано отрезки равно пустой список
дано низ равно -1
дано дефис равно нет
дано свежий равно да
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным да и «беда» равным ""
тотальная функция «Атом вне класса»
принимает ход: «Ход лексера», уз: «Узел»
возвращает «Ход лексера»
обеспечивает «после атома режим обычный» результат.«режим» равен 0
обеспечивает «атом беды не заводит» результат.«беда» равен ""
пример «знак лёг в поток»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 1 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
дано уз равно вариант «Любой»
ожидается запись «Ход лексера» с «токены» равным [вариант «Атом» с уз равным (вариант «Любой»)] и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Знак в класс»
принимает ход: «Ход лексера», тк: число
возвращает «Ход лексера»
обеспечивает «отложенный знак закрывается сам собою» если не (ход.«дефис») то (если (ход.«низ») не меньше 0 то (результат равен («Ход в классе» от ход и 2 и (ход.«отрицание») и (добавить (запись «Отрезок» с «низ» равным (ход.«низ») и «верх» равным (ход.«низ»)) к (ход.«отрезки»)) и тк и нет и нет)) иначе да) иначе да
обеспечивает «первый знак класса только откладывается» если не (ход.«дефис») то (если не ((ход.«низ») не меньше 0) то (результат равен («Ход в классе» от ход и 2 и (ход.«отрицание») и (ход.«отрезки») и тк и нет и нет)) иначе да) иначе да
обеспечивает «после дефиса знак закрывает отрезок» если ход.«дефис» то (результат равен («Ход в классе» от ход и 2 и (ход.«отрицание») и (добавить (запись «Отрезок» с «низ» равным (ход.«низ») и «верх» равным тк) к (ход.«отрезки»)) и -1 и нет и нет)) иначе да
пример «первый знак класса только запоминается»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным да и «беда» равным ""
дано тк равно 97
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным 97 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Слить хвост класса»
принимает ход: «Ход лексера»
возвращает список «Отрезок»
обеспечивает «отложенный знак досыпается знаком» если не (ход.«дефис») то (если (ход.«низ») не меньше 0 то (результат равен (добавить (запись «Отрезок» с «низ» равным (ход.«низ») и «верх» равным (ход.«низ»)) к (ход.«отрезки»))) иначе да) иначе да
обеспечивает «висячий дефис досыпается знаком» если ход.«дефис» то (результат равен (добавить (запись «Отрезок» с «низ» равным 45 и «верх» равным 45) к (добавить (запись «Отрезок» с «низ» равным (ход.«низ») и «верх» равным (ход.«низ»)) к (ход.«отрезки»)))) иначе да
обеспечивает «без дефиса и без отложенного знака набор не меняется» если не (ход.«дефис») то (если не ((ход.«низ») не меньше 0) то (результат равен (ход.«отрезки»)) иначе да) иначе да
пример «висячий дефис становится знаком»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным 97 и «дефис» равным да и «свежий» равным нет и «беда» равным ""
ожидается [(запись «Отрезок» с «низ» равным 97 и «верх» равным 97),
(запись «Отрезок» с «низ» равным 45 и «верх» равным 45)]
тотальная функция «Закрыть класс»
принимает ход: «Ход лексера»
возвращает «Ход лексера»
обеспечивает «закрытый класс возвращает в обычный режим» результат.«режим» равен 0
обеспечивает «закрытие класса беды не заводит» результат.«беда» равен ""
пример «класс из одного знака»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным 97 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
ожидается запись «Ход лексера» с «токены» равным [вариант «Атом» с уз равным (вариант «Класс» с отрицание равным нет и отрезки равным [запись «Отрезок» с «низ» равным 97 и «верх» равным 97])] и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Набор в класс»
принимает ход: «Ход лексера», наб: список «Отрезок»
возвращает «Ход лексера»
обеспечивает «набор без дефиса досыпается в класс» если не (ход.«дефис») то (результат равен («Ход в классе» от ход и 2 и (ход.«отрицание») и (свёртка наб начиная с («Слить хвост класса» от ход) как акк и отр → добавить отр к акк) и -1 и нет и нет)) иначе да
обеспечивает «набор после дефиса отказывает названно» если ход.«дефис» то (результат равен («Ход вне класса» от (ход.«токены») и 0 и "внутри […] отрезок не может кончаться набором: после дефиса ждался один знак")) иначе да
пример «набор цифр вошёл в класс»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 3 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
дано наб равно [запись «Отрезок» с «низ» равным 48 и «верх» равным 57]
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным нет и «отрезки» равным [запись «Отрезок» с «низ» равным 48 и «верх» равным 57] и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Шаг косой в классе»
принимает ход: «Ход лексера», тк: число
возвращает «Ход лексера»
обеспечивает «набор с отрицанием внутри класса отказывает названно» если не (тк равен 100) то (если не (тк равен 119) то (если не (тк равен 115) то (если (тк равен 68) или ((тк равен 87) или (тк равен 83)) то (результат.«беда» равен "внутри […] набор с отрицанием (\\D, \\W, \\S) не выражается отрезками: перечислите нужное прямо") иначе да) иначе да) иначе да) иначе да
обеспечивает «косая и w в классе дают набор слова» если не (тк равен 100) то (если тк равен 119 то (результат равен («Набор в класс» от ход и («Отрезки слова»))) иначе да) иначе да
обеспечивает «косая и s в классе дают набор пробелов» если не (тк равен 100) то (если не (тк равен 119) то (если тк равен 115 то (результат равен («Набор в класс» от ход и («Отрезки пробелов»))) иначе да) иначе да) иначе да
обеспечивает «косая и d в классе дают набор цифр» если тк равен 100 то (результат равен («Набор в класс» от ход и («Отрезки цифр»))) иначе да
пример «косая и n дают перевод строки»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 3 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
дано тк равно 110
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным 10 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Шаг в классе»
принимает ход: «Ход лексера», тк: число
возвращает «Ход лексера»
обеспечивает «косая в классе переводит в режим после косой» если не ((ход.«свежий») и притом (тк равен 94)) то (если не ((тк равен 93) и притом (не (ход.«свежий»))) то (если тк равен 92 то (результат равен («Ход в классе» от ход и 3 и (ход.«отрицание») и (ход.«отрезки») и (ход.«низ») и (ход.«дефис») и нет)) иначе да) иначе да) иначе да
обеспечивает «закрывающая скобка закрывает класс» если не ((ход.«свежий») и притом (тк равен 94)) то (если (тк равен 93) и притом (не (ход.«свежий»)) то (результат равен («Закрыть класс» от ход)) иначе да) иначе да
обеспечивает «решётка сразу после скобки — отрицание класса» если (ход.«свежий») и притом (тк равен 94) то (результат равен («Ход в классе» от ход и 2 и да и (ход.«отрезки») и (ход.«низ») и (ход.«дефис») и да)) иначе да
пример «решётка отрицания сразу после скобки»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным да и «беда» равным ""
дано тк равно 94
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 2 и «отрицание» равным да и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным да и «беда» равным ""
тотальная функция «Шаг после косой»
принимает ход: «Ход лексера», тк: число
возвращает «Ход лексера»
обеспечивает «косая и W дают класс слова с отрицанием» если не (тк равен 100) то (если не (тк равен 68) то (если не (тк равен 119) то (если тк равен 87 то (результат равен («Атом вне класса» от ход и (вариант «Класс» с отрицание равным да и отрезки равным («Отрезки слова»)))) иначе да) иначе да) иначе да) иначе да
обеспечивает «косая и D дают класс цифр с отрицанием» если не (тк равен 100) то (если тк равен 68 то (результат равен («Атом вне класса» от ход и (вариант «Класс» с отрицание равным да и отрезки равным («Отрезки цифр»)))) иначе да) иначе да
обеспечивает «косая и w дают класс слова» если не (тк равен 100) то (если не (тк равен 68) то (если тк равен 119 то (результат равен («Атом вне класса» от ход и (вариант «Класс» с отрицание равным нет и отрезки равным («Отрезки слова»)))) иначе да) иначе да) иначе да
обеспечивает «косая и d дают класс цифр» если тк равен 100 то (результат равен («Атом вне класса» от ход и (вариант «Класс» с отрицание равным нет и отрезки равным («Отрезки цифр»)))) иначе да
пример «косая и точка дают саму точку»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 1 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
дано тк равно 46
ожидается запись «Ход лексера» с «токены» равным [вариант «Атом» с уз равным (вариант «Знак» с точка равным 46)] и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Шаг после вопроса»
принимает ход: «Ход лексера», тк: число
возвращает «Ход лексера»
обеспечивает «двоеточие открывает обычную группу» если тк равен 58 то (результат равен («Ход вне класса» от (ход.«токены») и 0 и "")) иначе да
обеспечивает «просмотр вперёд и назад отказывает названно» если не (тк равен 58) то (если (тк равен 61) или ((тк равен 33) или (тк равен 60)) то (результат равен («Ход вне класса» от (ход.«токены») и 0 и "просмотр вперёд или назад ((?=…), (?!…), (?<=…), (?<!…)) конечным автоматом не выражается: он требует вернуться и перечитать прочитанное. Границу слова пишут явно — (^|[^а-яё]) вместо (?<![а-яё])")) иначе да) иначе да
обеспечивает «непонятная группа названа» если не (тк равен 58) то (если не ((тк равен 61) или ((тк равен 33) или (тк равен 60))) то (результат равен («Ход вне класса» от (ход.«токены») и 0 и "непонятная группа: после «(?» ждались «:», «=», «!» или «<»")) иначе да) иначе да
пример «двоеточие открывает обычную группу»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 4 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
дано тк равно 58
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Шаг обычный»
принимает ход: «Ход лексера», тк: число
возвращает «Ход лексера»
обеспечивает «точка становится любым знаком» если не (тк равен 92) то (если не (тк равен 91) то (если тк равен 46 то (результат равен («Атом вне класса» от ход и (вариант «Любой»))) иначе да) иначе да) иначе да
обеспечивает «решётка становится якорем начала» если не (тк равен 92) то (если не (тк равен 91) то (если не (тк равен 46) то (если тк равен 94 то (результат равен («Атом вне класса» от ход и (вариант «Начало»))) иначе да) иначе да) иначе да) иначе да
обеспечивает «косая черта переводит в режим после косой» если тк равен 92 то (результат равен («Ход вне класса» от (ход.«токены») и 1 и "")) иначе да
обеспечивает «квадратная скобка открывает класс» если не (тк равен 92) то (если тк равен 91 то (результат равен («Ход в классе» от ход и 2 и нет и пустой список и -1 и нет и да)) иначе да) иначе да
пример «точка становится атомом любого знака»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
дано тк равно 46
ожидается запись «Ход лексера» с «токены» равным [вариант «Атом» с уз равным (вариант «Любой»)] и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
тотальная функция «Шаг лексера»
принимает ход: «Ход лексера», тк: число
возвращает «Ход лексера»
обеспечивает «после косой работает шаг после косой» если не ((ход.«беда») не равен "") то (если не ((ход.«режим») равен 0) то (если (ход.«режим») равен 1 то (результат равен («Шаг после косой» от ход и тк)) иначе да) иначе да) иначе да
обеспечивает «внутри класса работает шаг в классе» если не ((ход.«беда») не равен "") то (если не ((ход.«режим») равен 0) то (если не ((ход.«режим») равен 1) то (если (ход.«режим») равен 2 то (результат равен («Шаг в классе» от ход и тк)) иначе да) иначе да) иначе да) иначе да
обеспечивает «после беды лексер ход не меняет» если (ход.«беда») не равен "" то (результат равен ход) иначе да
обеспечивает «в обычном режиме шаг обычный» если не ((ход.«беда») не равен "") то (если (ход.«режим») равен 0 то (результат равен («Шаг обычный» от ход и тк)) иначе да) иначе да
пример «после беды ход не меняется»
дано ход равно запись «Ход лексера» с «токены» равным пустой список и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным "уже плохо"
дано тк равно 97
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным "уже плохо"
тотальная функция «Разложить образец»
принимает образец: строка
возвращает «Ход лексера»
пример «пустой образец даёт пустой поток»
дано образец равно ""
ожидается запись «Ход лексера» с «токены» равным пустой список и «режим» равным 0 и «отрицание» равным нет и «отрезки» равным пустой список и «низ» равным -1 и «дефис» равным нет и «свежий» равным нет и «беда» равным ""
объект «Рамка»
«выбор»: «Узел»
«ряд»: «Узел»
«хвост»: «Узел»
«есть хвост»: признак
объект «Ход сборки»
«рамки»: список «Рамка»
«беда»: строка
объект «Собранный образец»
«узел»: «Узел»
«беда»: строка
тотальная функция «Рамка чистая»
возвращает «Рамка»
обеспечивает «у порожней рамки хвоста нет» результат.«есть хвост» равен нет
обеспечивает «порожняя рамка ничего не выбирает» результат.«выбор» равен (вариант «Тупик»)
пример «порожняя рамка»
ожидается запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Пустое слово») и «есть хвост» равным нет
тотальная функция «Верх рамок»
принимает рамки: список «Рамка»
возвращает «Рамка»
пример «пустая стопка даёт порожнюю рамку»
дано рамки равно пустой список
ожидается запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Пустое слово») и «есть хвост» равным нет
тотальная функция «Низ рамок»
принимает рамки: список «Рамка»
возвращает список «Рамка»
пример «пустая стопка так и остаётся пустой»
дано рамки равно пустой список
ожидается пустой список
тотальная функция «Закрыть рамку»
принимает рамка: «Рамка»
возвращает «Узел»
пример «порожняя рамка даёт пустое слово»
дано рамка равно запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Пустое слово») и «есть хвост» равным нет
ожидается вариант «Пустое слово»
тотальная функция «Положить атом»
принимает рамка: «Рамка», уз: «Узел»
возвращает «Рамка»
обеспечивает «после атома хвост есть» результат.«есть хвост» равен да
обеспечивает «положенный атом и становится хвостом» результат.«хвост» равен уз
обеспечивает «атом выбора не трогает» результат.«выбор» равен (рамка.«выбор»)
пример «первый атом становится хвостом»
дано рамка равно запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Пустое слово») и «есть хвост» равным нет
дано уз равно вариант «Любой»
ожидается запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Любой») и «есть хвост» равным да
тотальная функция «Повтор рамки»
принимает рамка: «Рамка», вид: число
возвращает «Рамка»
обеспечивает «звёздочка кладёт в хвост повтор» если вид равен 0 то (результат.«хвост» равен («Повторить много» от (рамка.«хвост»))) иначе да
обеспечивает «плюс кладёт в хвост повтор хотя бы раз» если не (вид равен 0) то (если вид равен 1 то (результат.«хвост» равен («Повторить хотя бы раз» от (рамка.«хвост»))) иначе да) иначе да
обеспечивает «вопрос кладёт в хвост необязательное» если не (вид равен 0) то (если не (вид равен 1) то (результат.«хвост» равен («Может не быть» от (рамка.«хвост»))) иначе да) иначе да
обеспечивает «после повтора хвост есть» результат.«есть хвост» равен да
обеспечивает «повтор выбора не трогает» результат.«выбор» равен (рамка.«выбор»)
обеспечивает «повтор набранного ряда не трогает» результат.«ряд» равен (рамка.«ряд»)
пример «звёздочка над последним атомом»
дано рамка равно запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Любой») и «есть хвост» равным да
дано вид равно 0
ожидается запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Много» с нутро равным (вариант «Любой»)) и «есть хвост» равным да
тотальная функция «Ветвь рамки»
принимает рамка: «Рамка»
возвращает «Рамка»
обеспечивает «после черты хвоста нет» результат.«есть хвост» равен нет
обеспечивает «после черты ряд начинается заново» результат.«ряд» равен (вариант «Пустое слово»)
пример «черта закрывает набранное и открывает новое»
дано рамка равно запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Любой») и «есть хвост» равным да
ожидается запись «Рамка» с «выбор» равным (вариант «Любой») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Пустое слово») и «есть хвост» равным нет
тотальная функция «Заменить верх»
принимает ход: «Ход сборки», рамка: «Рамка»
возвращает «Ход сборки»
обеспечивает «замена верха беды не заводит» результат.«беда» равен (ход.«беда»)
пример «верхняя рамка заменена»
дано ход равно запись «Ход сборки» с «рамки» равным пустой список и «беда» равным ""
дано рамка равно запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Любой») и «есть хвост» равным да
ожидается запись «Ход сборки» с «рамки» равным [запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Любой») и «есть хвост» равным да] и «беда» равным ""
тотальная функция «Ход с бедой»
принимает ход: «Ход сборки», весть: строка
возвращает «Ход сборки»
обеспечивает «весть становится бедой» результат.«беда» равен весть
обеспечивает «стопка рамок при беде не трогается» результат.«рамки» равен (ход.«рамки»)
пример «беда записана»
дано ход равно запись «Ход сборки» с «рамки» равным пустой список и «беда» равным ""
дано весть равно "плохо"
ожидается запись «Ход сборки» с «рамки» равным пустой список и «беда» равным "плохо"
тотальная функция «Повтор в ходе»
принимает ход: «Ход сборки», вид: число
возвращает «Ход сборки»
обеспечивает «повторять нечего — беда названа» если не ((«Верх рамок» от (ход.«рамки»)).«есть хвост») то (результат равен («Ход с бедой» от ход и "повтор (*, + или ?) стоит там, где повторять нечего")) иначе да
обеспечивает «есть что повторять — верхняя рамка заменяется» если не (не ((«Верх рамок» от (ход.«рамки»)).«есть хвост»)) то (результат равен («Заменить верх» от ход и («Повтор рамки» от («Верх рамок» от (ход.«рамки»)) и вид))) иначе да
пример «повторять нечего»
дано ход равно запись «Ход сборки» с «рамки» равным пустой список и «беда» равным ""
дано вид равно 0
ожидается запись «Ход сборки» с «рамки» равным пустой список и «беда» равным "повтор (*, + или ?) стоит там, где повторять нечего"
тотальная функция «Закрыть скобку»
принимает ход: «Ход сборки»
возвращает «Ход сборки»
обеспечивает «закрывающая скобка без открывающей названа» если (длина (ход.«рамки»)) не больше 1 то (результат равен («Ход с бедой» от ход и "закрывающая скобка без открывающей")) иначе да
пример «закрывающая скобка без открывающей»
дано ход равно запись «Ход сборки» с «рамки» равным пустой список и «беда» равным ""
ожидается запись «Ход сборки» с «рамки» равным пустой список и «беда» равным "закрывающая скобка без открывающей"
тотальная функция «Шаг сборки живой»
принимает ход: «Ход сборки», ткн: «Знак образца»
возвращает «Ход сборки»
пример «открывающая скобка кладёт рамку»
дано ход равно запись «Ход сборки» с «рамки» равным пустой список и «беда» равным ""
дано ткн равно вариант «Скобка влево»
ожидается запись «Ход сборки» с «рамки» равным [запись «Рамка» с «выбор» равным (вариант «Тупик») и «ряд» равным (вариант «Пустое слово») и «хвост» равным (вариант «Пустое слово») и «есть хвост» равным нет] и «беда» равным ""
тотальная функция «Шаг сборки»
принимает ход: «Ход сборки», ткн: «Знак образца»
возвращает «Ход сборки»
обеспечивает «после беды сборка ход не меняет» если (ход.«беда») не равен "" то (результат равен ход) иначе да
обеспечивает «пока беды нет, шаг сборки живой» если не ((ход.«беда») не равен "") то (результат равен («Шаг сборки живой» от ход и ткн)) иначе да
пример «после беды ход не меняется»
дано ход равно запись «Ход сборки» с «рамки» равным пустой список и «беда» равным "уже плохо"
дано ткн равно вариант «Звёздочка»
ожидается запись «Ход сборки» с «рамки» равным пустой список и «беда» равным "уже плохо"
тотальная функция «Итог сборки»
принимает ход: «Ход сборки»
возвращает «Собранный образец»
обеспечивает «одна рамка на стопке — образец собран» если не ((ход.«беда») не равен "") то (если не ((длина (ход.«рамки»)) не равен 1) то (результат равен (запись «Собранный образец» с «узел» равным («Закрыть рамку» от («Верх рамок» от (ход.«рамки»))) и «беда» равным "")) иначе да) иначе да
обеспечивает «беда доносится до итога сборки» если (ход.«беда») не равен "" то (результат равен (запись «Собранный образец» с «узел» равным (вариант «Тупик») и «беда» равным (ход.«беда»))) иначе да
обеспечивает «незакрытая скобка названа» если не ((ход.«беда») не равен "") то (если (длина (ход.«рамки»)) не равен 1 то (результат равен (запись «Собранный образец» с «узел» равным (вариант «Тупик») и «беда» равным "открывающая скобка без закрывающей")) иначе да) иначе да
пример «незакрытая скобка»
дано ход равно запись «Ход сборки» с «рамки» равным пустой список и «беда» равным ""
ожидается запись «Собранный образец» с «узел» равным (вариант «Тупик») и «беда» равным "открывающая скобка без закрывающей"
тотальная функция «Беда оборванного»
принимает режим: число
возвращает строка
обеспечивает «оборванная косая названа» если (режим равен 1) или (режим равен 3) то (результат равен "образец кончился косой чертой: закрывать нечего") иначе да
обеспечивает «незакрытый класс назван» если не ((режим равен 1) или (режим равен 3)) то (если режим равен 2 то (результат равен "класс […] не закрыт") иначе да) иначе да
обеспечивает «недописанная группа названа» если не ((режим равен 1) или (режим равен 3)) то (если не (режим равен 2) то (результат равен "группа «(?» не дописана") иначе да) иначе да
пример «класс не закрыт»
дано режим равно 2
ожидается "класс […] не закрыт"
тотальная функция «Разобрать образец»
принимает образец: строка
возвращает «Собранный образец»
обеспечивает «оборванный образец назван бедой» если не ((«Разложить образец» от образец).«беда» не равен "") то (если (((«Разложить образец» от образец).«режим») не равен 0) и притом (((«Разложить образец» от образец).«режим») не равен 5) то (результат равен (запись «Собранный образец» с «узел» равным (вариант «Тупик») и «беда» равным («Беда оборванного» от ((«Разложить образец» от образец).«режим»)))) иначе да) иначе да
обеспечивает «беда лексера доносится до разбора» если («Разложить образец» от образец).«беда» не равен "" то (результат равен (запись «Собранный образец» с «узел» равным (вариант «Тупик») и «беда» равным ((«Разложить образец» от образец).«беда»))) иначе да
пример «пустой образец — пустое слово»
дано образец равно ""
ожидается запись «Собранный образец» с «узел» равным (вариант «Пустое слово») и «беда» равным ""
тотальная функция «Беда образца»
принимает образец: строка
возвращает строка
обеспечивает «беда образца — это беда разбора» результат равен ((«Разобрать образец» от образец).«беда»)
пример «годный образец бед не даёт»
дано образец равно "a(b|c)*d"
ожидается ""
тотальная функция «Образец годен»
принимает образец: строка
возвращает признак
обеспечивает «годен ровно тогда, когда беды нет» результат равен ((«Беда образца» от образец) равен "")
пример «годен»
дано образец равно "[а-яё]+"
ожидается да
тотальная функция «Совпадает целиком»
принимает образец: строка, текст: строка
возвращает признак
обеспечивает «годный образец спрашивается своим узлом» если не ((«Разобрать образец» от образец).«беда» не равен "") то (результат равен («Узлом совпадает целиком» от ((«Разобрать образец» от образец).«узел») и текст)) иначе да
обеспечивает «негодный образец целиком не совпадает» если («Разобрать образец» от образец).«беда» не равен "" то (результат равен нет) иначе да
пример «буквы и повтор»
дано образец равно "ab*c"
дано текст равно "abbbc"
ожидается да
тотальная функция «Есть совпадение»
принимает образец: строка, текст: строка
возвращает признак
обеспечивает «годный образец ищется своим узлом» если не ((«Разобрать образец» от образец).«беда» не равен "") то (результат равен («Узлом есть совпадение» от ((«Разобрать образец» от образец).«узел») и текст)) иначе да
обеспечивает «негодным образцом ничего не находится» если («Разобрать образец» от образец).«беда» не равен "" то (результат равен нет) иначе да
обеспечивает «что совпало целиком, то нашлось и поиском» (не («Совпадает целиком» от образец и текст)) или результат
пример «в середине»
дано образец равно "эталон"
дано текст равно "тот эталон здесь"
ожидается да
объект «Ход места»
«место»: число
«найдено»: число
тотальная функция «Хвост образца»
принимает узел: «Узел»
возвращает «Узел»
обеспечивает «к тупику хвост не приписывается» если («Это тупик» от узел) или («Это тупик» от («Повторить много» от (вариант «Любой»))) то (результат равен (вариант «Тупик»)) иначе да
пример «к тупику ничего не приписывается»
дано узел равно вариант «Тупик»
ожидается вариант «Тупик»
тотальная функция «Шаг места»
принимает ход: «Ход места», текст: строка, узел: «Узел»
возвращает «Ход места»
обеспечивает «найденное место остаётся прежним» если (ход.«найдено») больше 0 то (результат.«найдено» равен (ход.«найдено»)) иначе да
обеспечивает «пока не найдено, место всё равно двигается» если не ((ход.«найдено») больше 0) то (результат.«место» равен ((ход.«место») плюс 1)) иначе да
обеспечивает «найденное место не переписывается» если (ход.«найдено») больше 0 то (результат равен (запись «Ход места» с «место» равным ((ход.«место») плюс 1) и «найдено» равным (ход.«найдено»))) иначе да
пример «совпало с первого места»
дано ход равно запись «Ход места» с «место» равным 0 и «найдено» равным 0
дано текст равно "абв"
дано узел равно вариант «Знак» с точка равным 1072
ожидается запись «Ход места» с «место» равным 1 и «найдено» равным 1
тотальная функция «Место совпадения»
принимает образец: строка, текст: строка
возвращает число
обеспечивает «годный образец меряется своим узлом» если не ((«Разобрать образец» от образец).«беда» не равен "") то (результат равен ((«Шаг места» от (свёртка (разложить текст на символы) начиная с (запись «Ход места» с «место» равным 0 и «найдено» равным 0) как ход и знак → «Шаг места» от ход и текст и ((«Разобрать образец» от образец).«узел»)) и текст и ((«Разобрать образец» от образец).«узел»)).«найдено»)) иначе да
обеспечивает «негодный образец места не называет» если («Разобрать образец» от образец).«беда» не равен "" то (результат равен 0) иначе да
обеспечивает «найденное место лежит внутри строки или сразу за ней» (результат равен 0) или ((результат не меньше 1) и притом (результат не больше ((длина текст) плюс 1)))
пример «в середине»
дано образец равно "эталон"
дано текст равно "тот эталон здесь"
ожидается 5
объект «Ход строк»
«номер»: число
«номера»: список числа
тотальная функция «Шаг строк»
принимает ход: «Ход строк», строчка: строка, узел: «Узел»
возвращает «Ход строк»
обеспечивает «подошедшая строка кладёт свой номер» если «Узлом совпадает целиком» от узел и строчка то (результат равен (запись «Ход строк» с «номер» равным ((ход.«номер») плюс 1) и «номера» равным (добавить ((ход.«номер») плюс 1) к (ход.«номера»)))) иначе да
обеспечивает «неподошедшая строка номеров не добавляет» если не («Узлом совпадает целиком» от узел и строчка) то (результат равен (запись «Ход строк» с «номер» равным ((ход.«номер») плюс 1) и «номера» равным (ход.«номера»))) иначе да
пример «строка подошла»
дано ход равно запись «Ход строк» с «номер» равным 0 и «номера» равным пустой список
дано строчка равно "a"
дано узел равно вариант «Много» с нутро равным (вариант «Любой»)
ожидается запись «Ход строк» с «номер» равным 1 и «номера» равным [1]
тотальная функция «Номера строк с образцом»
принимает образец: строка, текст: строка
возвращает список числа
обеспечивает «годный образец ищется построчно своим узлом» если не ((«Разобрать образец» от образец).«беда» не равен "") то (результат равен ((свёртка (разделить текст по "\n") начиная с (запись «Ход строк» с «номер» равным 0 и «номера» равным пустой список) как ход и стрк → «Шаг строк» от ход и стрк и («Обёртка поиска» от ((«Разобрать образец» от образец).«узел»))).«номера»)) иначе да
обеспечивает «негодный образец не даёт ни одного номера» если («Разобрать образец» от образец).«беда» не равен "" то ((длина результат) не больше 0) иначе да
обеспечивает «негодный образец строк не находит» если («Разобрать образец» от образец).«беда» не равен "" то (результат равен пустой список) иначе да
пример «вторая и четвёртая»
дано образец равно "свод"
дано текст равно "раз\nсвод\nтри\nсводка"
ожидается [2, 4]
тотальная функция «Строк с образцом»
принимает образец: строка, текст: строка
возвращает число
обеспечивает «строк с образцом не больше, чем строк вообще» результат не больше (длина (разделить текст по "
| Function | Termination | Claims |
|---|---|---|
| «Это тупик» | доказано композицией | доказано 1 из 2; «всё, что не тупик, тупиком не зовётся» — сетка |
| «Это пустое слово» | доказано композицией | доказано 1 из 2; «всё, что не пустое слово, пустым словом не зовётся» — сетка |
| «Есть ветвь» | доказано структурой | — |
| «Слить в ряд» | доказано композицией | доказано 2 из 2 |
| «Слить в выбор» | доказано композицией | — |
| «Повторить много» | доказано композицией | доказано 2 из 2 |
| «Повторить хотя бы раз» | доказано композицией | доказано 1 из 1 |
| «Может не быть» | доказано композицией | — |
| «Пусто допустимо» | доказано структурой | доказано 5 из 5 |
| «В отрезке» | доказано композицией | доказано 2 из 2 |
| «В отрезках» | доказано композицией | — |
| «Знак подходит» | доказано композицией | — |
| «Производная» | доказано структурой | доказано 5 из 5 |
| «Шаг бега» | доказано композицией | доказано 2 из 2 |
| «Прогон с места» | доказано композицией | — |
| «Прогон» | доказано композицией | доказано 1 из 1 |
| «Узлом совпадает с места» | доказано композицией | доказано 2 из 2 |
| «Узлом совпадает целиком» | доказано композицией | — |
| «Обёртка поиска» | доказано композицией | доказано 1 из 1 |
| «Узлом есть совпадение» | доказано композицией | — |
| «Отрезки цифр» | доказано композицией | доказано 2 из 2 |
| «Отрезки слова» | доказано композицией | доказано 2 из 2 |
| «Отрезки пробелов» | доказано композицией | доказано 2 из 2 |
| «Ход вне класса» | доказано композицией | доказано 6 из 6 |
| «Ход в классе» | доказано композицией | доказано 5 из 5 |
| «Атом вне класса» | доказано композицией | доказано 2 из 2 |
| «Знак в класс» | доказано композицией | доказано 3 из 3 |
| «Слить хвост класса» | доказано композицией | доказано 3 из 3 |
| «Закрыть класс» | доказано композицией | доказано 2 из 2 |
| «Набор в класс» | доказано композицией | доказано 2 из 2 |
| «Шаг косой в классе» | доказано композицией | доказано 4 из 4 |
| «Шаг в классе» | доказано композицией | доказано 3 из 3 |
| «Шаг после косой» | доказано композицией | доказано 4 из 4 |
| «Шаг после вопроса» | доказано композицией | доказано 3 из 3 |
| «Шаг обычный» | доказано композицией | доказано 4 из 4 |
| «Шаг лексера» | доказано композицией | доказано 4 из 4 |
| «Разложить образец» | доказано композицией | — |
| «Рамка чистая» | доказано композицией | доказано 2 из 2 |
| «Верх рамок» | доказано композицией | — |
| «Низ рамок» | доказано композицией | — |
| «Закрыть рамку» | доказано композицией | — |
| «Положить атом» | доказано композицией | доказано 3 из 3 |
| «Повтор рамки» | доказано композицией | доказано 6 из 6 |
| «Ветвь рамки» | доказано композицией | доказано 2 из 2 |
| «Заменить верх» | доказано композицией | доказано 1 из 1 |
| «Ход с бедой» | доказано композицией | доказано 2 из 2 |
| «Повтор в ходе» | доказано композицией | доказано 2 из 2 |
| «Закрыть скобку» | доказано композицией | доказано 1 из 1 |
| «Шаг сборки живой» | доказано композицией | — |
| «Шаг сборки» | доказано композицией | доказано 2 из 2 |
| «Итог сборки» | доказано композицией | доказано 3 из 3 |
| «Беда оборванного» | доказано композицией | доказано 3 из 3 |
| «Разобрать образец» | доказано композицией | доказано 2 из 2 |
| «Беда образца» | доказано композицией | доказано 1 из 1 |
| «Образец годен» | доказано композицией | доказано 1 из 1 |
| «Совпадает целиком» | доказано композицией | доказано 2 из 2 |
| «Есть совпадение» | доказано композицией | доказано 2 из 3; «что совпало целиком, то нашлось и поиском» — сетка |
| «Хвост образца» | доказано композицией | доказано 1 из 1 |
| «Шаг места» | доказано композицией | доказано 3 из 3 |
| «Место совпадения» | доказано композицией | доказано 2 из 3; «найденное место лежит внутри строки или сразу за ней» — сетка |
| «Шаг строк» | доказано композицией | доказано 2 из 2 |
| «Номера строк с образцом» | доказано композицией | доказано 3 из 3 |
| «Строк с образцом» | доказано композицией | доказано 0 из 1; «строк с образцом не больше, чем строк вообще» — сетка |
«Base64»
flang/stdlib/base64.flang — functions 19; the kernel ledger was taken from this version of the file
тип «Ход кодирования 64»
вариант «Копим» содержит собрано: строка, набрано: число, первый: число, второй: число
тип «Ход раскодирования 64»
вариант «Разбираем» содержит байты: список числа, набрано: число, копилка: число
тотальная функция «Азбука 64»
возвращает строка
обеспечивает «в азбуке ровно 64 знака» (длина результат) равен 64
обеспечивает «в азбуке знаков больше шестидесяти трёх» (длина результат) больше 63
обеспечивает «в азбуке знаков меньше шестидесяти пяти» (длина результат) меньше 65
обеспечивает «первый знак азбуки — заглавная A» (символ 1 в результат) равен "A"
обеспечивает «двадцать седьмой знак азбуки — строчная a» (символ 27 в результат) равен "a"
обеспечивает «пятьдесят третий знак азбуки — цифра ноль» (символ 53 в результат) равен "0"
обеспечивает «шестьдесят третий знак азбуки — плюс» (символ 63 в результат) равен "+"
обеспечивает «последний знак азбуки — косая черта» (символ 64 в результат) равен "/"
обеспечивает «двадцать шестой знак азбуки — заглавная Z» (символ 26 в результат) равен "Z"
обеспечивает «пятьдесят второй знак азбуки — строчная z» (символ 52 в результат) равен "z"
обеспечивает «шестьдесят второй знак азбуки — цифра девять» (символ 62 в результат) равен "9"
обеспечивает «добивочного знака равно в азбуке нет» не (результат содержит "=")
обеспечивает «добивочного знака равно в азбуке нет, вторым видом цели» (результат содержит "=") равен нет
обеспечивает «минуса, знака адресной азбуки, в основной нет» не (результат содержит "-")
обеспечивает «подчёркивания, знака адресной азбуки, в основной нет» не (результат содержит "_")
пример «Азбука RFC 4648»
ожидается "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
тотальная функция «Азбука 64 для адреса»
возвращает строка
обеспечивает «в азбуке для адреса тоже ровно 64 знака» (длина результат) равен 64
обеспечивает «в адресной азбуке знаков больше шестидесяти трёх» (длина результат) больше 63
обеспечивает «в адресной азбуке знаков меньше шестидесяти пяти» (длина результат) меньше 65
обеспечивает «первый знак адресной азбуки — заглавная A» (символ 1 в результат) равен "A"
обеспечивает «пятьдесят третий знак адресной азбуки — цифра ноль» (символ 53 в результат) равен "0"
обеспечивает «шестьдесят третий знак адресной азбуки — минус, а не плюс» (символ 63 в результат) равен "-"
обеспечивает «последний знак адресной азбуки — подчёркивание, а не косая» (символ 64 в результат) равен "_"
обеспечивает «двадцать шестой знак адресной азбуки — заглавная Z» (символ 26 в результат) равен "Z"
обеспечивает «пятьдесят второй знак адресной азбуки — строчная z» (символ 52 в результат) равен "z"
обеспечивает «шестьдесят второй знак адресной азбуки — цифра девять» (символ 62 в результат) равен "9"
обеспечивает «добивочного знака равно в адресной азбуке нет» не (результат содержит "=")
обеспечивает «плюса, знака основной азбуки, в адресной нет» не (результат содержит "+")
обеспечивает «косой черты, знака основной азбуки, в адресной нет» не (результат содержит "/")
пример «Азбука URL-safe: вместо плюса и косой — минус и подчёркивание»
ожидается "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
тотальная функция «Знак 64»
принимает шестёрка: число
возвращает строка
обеспечивает «знак азбуки — ровно один знак» (длина результат) равен 1
обеспечивает «вне отрезка знак всё равно ровно один» если шестёрка меньше 0 или шестёрка не меньше 64 то ((длина результат) равен 1) иначе да
обеспечивает «внутри отрезка знак ровно один» если не (шестёрка меньше 0 или шестёрка не меньше 64) то ((длина результат) равен 1) иначе да
обеспечивает «шестёрка вне отрезка даёт первый знак азбуки» если шестёрка меньше 0 или шестёрка не меньше 64 то (результат равен "A") иначе да
обеспечивает «шестёрка внутри отрезка читается из азбуки» если не (шестёрка меньше 0 или шестёрка не меньше 64) то (результат равен (символ (шестёрка плюс 1) в («Азбука 64»))) иначе да
пример «Ноль — это A»
дано шестёрка равно 0
ожидается "A"
тотальная функция «Знак 64 для адреса»
принимает шестёрка: число
возвращает строка
обеспечивает «знак адресной азбуки — ровно один знак» (длина результат) равен 1
обеспечивает «вне отрезка знак адресной азбуки всё равно ровно один» если шестёрка меньше 0 или шестёрка не меньше 64 то ((длина результат) равен 1) иначе да
обеспечивает «внутри отрезка знак адресной азбуки ровно один» если не (шестёрка меньше 0 или шестёрка не меньше 64) то ((длина результат) равен 1) иначе да
обеспечивает «шестёрка вне отрезка даёт первый знак адресной азбуки» если шестёрка меньше 0 или шестёрка не меньше 64 то (результат равен "A") иначе да
обеспечивает «шестёрка внутри отрезка читается из адресной азбуки» если не (шестёрка меньше 0 или шестёрка не меньше 64) то (результат равен (символ (шестёрка плюс 1) в («Азбука 64 для адреса»))) иначе да
пример «Шестьдесят два — минус»
дано шестёрка равно 62
ожидается "-"
тотальная функция «Значение знака 64»
принимает код: число
возвращает число
обеспечивает «значение знака либо шестёрка, либо честный отказ минус один» результат не меньше (0 минус 1)
обеспечивает «значение знака меньше шестидесяти четырёх» результат меньше 64
обеспечивает «прописная буква даёт свой номер от нуля» если код не меньше 65 и притом код не больше 90 то (результат равен (код минус 65)) иначе да
обеспечивает «строчная буква даёт свой номер от двадцати шести» (код не меньше 65 и притом код не больше 90) или ((не (код не меньше 97 и притом код не больше 122)) или (результат равен (код минус 71)))
обеспечивает «цифра даёт свой номер от пятидесяти двух» (код не меньше 65 и притом код не больше 90) или ((код не меньше 97 и притом код не больше 122) или ((не (код не меньше 48 и притом код не больше 57)) или (результат равен (код плюс 4))))
обеспечивает «плюс даёт шестьдесят два» (код не меньше 65 и притом код не больше 90) или ((код не меньше 97 и притом код не больше 122) или ((код не меньше 48 и притом код не больше 57) или ((не (код равен 43)) или (результат равен 62))))
пример «Заглавная A — ноль»
дано код равно 65
ожидается 0
тотальная функция «Это знак 64»
принимает знак: строка
возвращает признак
обеспечивает «знак азбуки — ровно один из шестидесяти шести знаков обеих азбук» не ((длина знак) равен 1) или (результат равен ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/-_" содержит знак))
обеспечивает «одиночный знак азбуки: если признак да, знак стоит в обеих азбуках» не ((длина знак) равен 1) или (не результат) или ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/-_" содержит знак)
обеспечивает «одиночный знак азбуки: если знак стоит в азбуках, признак да» не ((длина знак) равен 1) или (не ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/-_" содержит знак)) или результат
пример «Буква — знак азбуки»
дано знак равно "Q"
ожидается да
тотальная функция «Первая шестёрка»
принимает байт: число
возвращает число
обеспечивает «первая шестёрка неотрицательна, пока байт конечен» не ((байт минус байт) равен 0) или (результат не меньше 0)
обеспечивает «первая шестёрка меньше шестидесяти четырёх, пока байт конечен» не ((байт минус байт) равен 0) или (результат меньше 64)
пример «Ноль»
дано байт равно 0
ожидается 0
тотальная функция «Вторая шестёрка»
принимает первый: число, второй: число
возвращает число
обеспечивает «вторая шестёрка неотрицательна, пока байты конечны» не (((первый минус первый) равен 0) и притом ((второй минус второй) равен 0)) или (результат не меньше 0)
обеспечивает «вторая шестёрка меньше шестидесяти четырёх, пока байты конечны» не (((первый минус первый) равен 0) и притом ((второй минус второй) равен 0)) или (результат меньше 64)
пример «Нули»
дано первый равно 0
дано второй равно 0
ожидается 0
тотальная функция «Третья шестёрка»
принимает второй: число, третий: число
возвращает число
обеспечивает «третья шестёрка неотрицательна, пока байты конечны» не (((второй минус второй) равен 0) и притом ((третий минус третий) равен 0)) или (результат не меньше 0)
обеспечивает «третья шестёрка меньше шестидесяти четырёх, пока байты конечны» не (((второй минус второй) равен 0) и притом ((третий минус третий) равен 0)) или (результат меньше 64)
пример «Нули»
дано второй равно 0
дано третий равно 0
ожидается 0
тотальная функция «Четвёртая шестёрка»
принимает байт: число
возвращает число
обеспечивает «четвёртая шестёрка неотрицательна, пока байт конечен» не ((байт минус байт) равен 0) или (результат не меньше 0)
обеспечивает «четвёртая шестёрка меньше шестидесяти четырёх, пока байт конечен» не ((байт минус байт) равен 0) или (результат меньше 64)
пример «Ноль»
дано байт равно 0
ожидается 0
тотальная функция «Тройка байтов»
принимает первый: число, второй: число, третий: число
возвращает строка
обеспечивает «тройка байтов даёт ровно четыре знака» (длина результат) равен 4
пример «Man — учебная тройка RFC 4648»
дано первый равно 77
дано второй равно 97
дано третий равно 110
ожидается "TWFu"
тотальная функция «Шаг кодирования»
принимает ход: «Ход кодирования 64», байт: число
возвращает «Ход кодирования 64»
обеспечивает «пока байтов меньше трёх, кодировка не растёт, а счёт растёт на один» не (ход.набрано равен 0 или ход.набрано равен 1) или ((результат.набрано равен (ход.набрано плюс 1)) и притом (результат.собрано равен ход.собрано))
обеспечивает «пока байтов меньше трёх: счёт растёт на один» не (ход.набрано равен 0 или ход.набрано равен 1) или (результат.набрано равен (ход.набрано плюс 1))
обеспечивает «пока байтов меньше трёх: кодировка не растёт» не (ход.набрано равен 0 или ход.набрано равен 1) или (результат.собрано равен ход.собрано)
обеспечивает «третий байт закрывает тройку: счёт обнуляется, а кодировка удлиняется ровно на четыре знака» (ход.набрано равен 0 или ход.набрано равен 1) или ((результат.набрано равен 0) и притом ((длина результат.собрано) равен ((длина ход.собрано) плюс 4)))
обеспечивает «третий байт закрывает тройку: счёт обнуляется» (ход.набрано равен 0 или ход.набрано равен 1) или (результат.набрано равен 0)
обеспечивает «третий байт закрывает тройку: кодировка длиннее ровно на четыре знака» (ход.набрано равен 0 или ход.набрано равен 1) или ((длина результат.собрано) равен ((длина ход.собрано) плюс 4))
обеспечивает «байт уходит на своё место в тройке» не (ход.набрано равен 0) или (результат.первый равен байт)
обеспечивает «второй байт ложится вторым» (ход.набрано равен 0) или ((не (ход.набрано равен 1)) или (результат.второй равен байт))
обеспечивает «первый байт с места не сходит, пока тройка копится» (ход.набрано равен 0) или ((не (ход.набрано равен 1)) или (результат.первый равен ход.первый))
пример «Первый байт только копится»
дано ход равно вариант «Копим» с собрано равным "" и набрано равным 0 и первый равным 0 и второй равным 0
дано байт равно 77
ожидается вариант «Копим» с собрано равным "" и набрано равным 1 и первый равным 77 и второй равным 0
тотальная функция «Закрыть кодирование»
принимает ход: «Ход кодирования 64»
возвращает строка
обеспечивает «недобранная тройка добивается ровно до четырёх знаков, добранная не трогается» если (ход.набрано равен 1 или ход.набрано равен 2) то ((длина результат) равен ((длина ход.собрано) плюс 4)) иначе (результат равен ход.собрано)
обеспечивает «недобранная тройка добивается ровно до четырёх знаков» не (ход.набрано равен 1 или ход.набрано равен 2) или ((длина результат) равен ((длина ход.собрано) плюс 4))
обеспечивает «добранная тройка не трогается» (ход.набрано равен 1 или ход.набрано равен 2) или (результат равен ход.собрано)
обеспечивает «один байт в хвосте: два знака и две добивки» не (ход.набрано равен 1) или ((длина результат) равен ((((длина ход.собрано) плюс 1) плюс 1) плюс 2))
обеспечивает «два байта в хвосте: три знака и одна добивка» (ход.набрано равен 1) или ((не (ход.набрано равен 2)) или ((длина результат) равен (((((длина ход.собрано) плюс 1) плюс 1) плюс 1) плюс 1)))
обеспечивает «последним знаком добитой кодировки стоит равно» не (ход.набрано равен 1 или ход.набрано равен 2) или ((символ (длина результат) в результат) равен "=")
пример «Ничего не осталось»
дано ход равно вариант «Копим» с собрано равным "TWFu" и набрано равным 0 и первый равным 0 и второй равным 0
ожидается "TWFu"
тотальная функция «Закодировать байты»
принимает байты: список числа
возвращает строка
обеспечивает «длина кодировки кратна четырём» ((длина результат) остаток от 4) равен 0
пример «Пусто даёт пусто»
дано байты равно пустой список
ожидается ""
тотальная функция «Сложить шестёрку»
принимает готовые: список числа, сколько: число, набралось: число
возвращает «Ход раскодирования 64»
обеспечивает «четвёртая шестёрка выкладывает ровно три байта и обнуляет копилку» не (сколько не меньше 3) или ((результат.набрано равен 0) и притом (результат.копилка равен 0) и притом ((длина результат.байты) равен ((длина готовые) плюс 3)))
обеспечивает «четвёртая шестёрка: счёт обнуляется» не (сколько не меньше 3) или (результат.набрано равен 0)
обеспечивает «четвёртая шестёрка: копилка обнуляется» не (сколько не меньше 3) или (результат.копилка равен 0)
обеспечивает «четвёртая шестёрка: байтов стало на три больше» не (сколько не меньше 3) или ((длина результат.байты) равен ((((длина готовые) плюс 1) плюс 1) плюс 1))
обеспечивает «недобранная четвёрка байтов не выкладывает, а копилку запоминает целиком» (сколько не меньше 3) или ((результат.набрано равен (сколько плюс 1)) и притом (результат.копилка равен набралось) и притом ((длина результат.байты) равен (длина готовые)))
обеспечивает «недобранная четвёрка: счёт растёт на один» (сколько не меньше 3) или (результат.набрано равен (сколько плюс 1))
обеспечивает «недобранная четвёрка: копилка запомнена целиком» (сколько не меньше 3) или (результат.копилка равен набралось)
обеспечивает «недобранная четвёрка: байтов не прибавилось» (сколько не меньше 3) или ((длина результат.байты) равен (длина готовые))
пример «Четвёртая шестёрка выдаёт три байта»
дано готовые равно пустой список
дано сколько равно 3
дано набралось равно 5071214
ожидается вариант «Разбираем» с байты равным [77, 97, 110] и набрано равным 0 и копилка равным 0
тотальная функция «Свести шестёрку»
принимает ход: «Ход раскодирования 64», значение: число
возвращает «Ход раскодирования 64»
обеспечивает «знак не из азбуки хода не меняет» не (значение меньше 0) или ((результат.набрано равен ход.набрано) и притом (результат.копилка равен ход.копилка) и притом ((длина результат.байты) равен (длина ход.байты)))
обеспечивает «знак не из азбуки: счёт не тронут» не (значение меньше 0) или (результат.набрано равен ход.набрано)
обеспечивает «знак не из азбуки: копилка не тронута» не (значение меньше 0) или (результат.копилка равен ход.копилка)
обеспечивает «знак не из азбуки: байтов не прибавилось» не (значение меньше 0) или ((длина результат.байты) равен (длина ход.байты))
обеспечивает «шестёрка вдвигается в копилку слева, пока четвёрка не добрана» не (значение не меньше 0 и притом ход.набрано меньше 3) или ((результат.набрано равен (ход.набрано плюс 1)) и притом (результат.копилка равен ((ход.копилка умножить на 64) плюс значение)))
обеспечивает «шестёрка вдвигается: счёт растёт на один» не (значение не меньше 0 и притом ход.набрано меньше 3) или (результат.набрано равен (ход.набрано плюс 1))
обеспечивает «шестёрка вдвигается: копилка сдвигается на шесть разрядов» не (значение не меньше 0 и притом ход.набрано меньше 3) или (результат.копилка равен ((ход.копилка умножить на 64) плюс значение))
обеспечивает «шестёрка вдвигается: байтов не прибавилось» не (значение не меньше 0 и притом ход.набрано меньше 3) или ((длина результат.байты) равен (длина ход.байты))
пример «Знак не из азбуки ничего не меняет»
дано ход равно вариант «Разбираем» с байты равным пустой список и набрано равным 0 и копилка равным 0
дано значение равно -1
ожидается вариант «Разбираем» с байты равным пустой список и набрано равным 0 и копилка равным 0
тотальная функция «Шаг раскодирования 64»
принимает ход: «Ход раскодирования 64», знак: строка
возвращает «Ход раскодирования 64»
обеспечивает «знак не из азбуки пропускается без следа» («Это знак 64» от знак) или ((результат.набрано равен ход.набрано) и притом (результат.копилка равен ход.копилка) и притом ((длина результат.байты) равен (длина ход.байты)))
обеспечивает «чужой знак: счёт не тронут» («Это знак 64» от знак) или (результат.набрано равен ход.набрано)
обеспечивает «чужой знак: копилка не тронута» («Это знак 64» от знак) или (результат.копилка равен ход.копилка)
обеспечивает «чужой знак: байтов не прибавилось» («Это знак 64» от знак) или ((длина результат.байты) равен (длина ход.байты))
обеспечивает «знак азбуки до четвёртого только копится, байтов не прибавляя» не ((«Это знак 64» от знак) и притом (ход.набрано меньше 3)) или ((результат.набрано равен (ход.набрано плюс 1)) и притом ((длина результат.байты) равен (длина ход.байты)))
обеспечивает «знак азбуки до четвёртого: счёт растёт на один» не (((«Значение знака 64» от (код символа знак)) не меньше 0) и притом (ход.набрано меньше 3)) или (результат.набрано равен (ход.набрано плюс 1))
обеспечивает «знак азбуки до четвёртого: байтов не прибавилось» не (((«Значение знака 64» от (код символа знак)) не меньше 0) и притом (ход.набрано меньше 3)) или ((длина результат.байты) равен (длина ход.байты))
обеспечивает «знак с отрицательным значением: счёт не тронут» не ((«Значение знака 64» от (код символа знак)) меньше 0) или (результат.набрано равен ход.набрано)
обеспечивает «знак с отрицательным значением: копилка не тронута» не ((«Значение знака 64» от (код символа знак)) меньше 0) или (результат.копилка равен ход.копилка)
обеспечивает «знак с отрицательным значением: байтов не прибавилось» не ((«Значение знака 64» от (код символа знак)) меньше 0) или ((длина результат.байты) равен (длина ход.байты))
пример «Равно пропускается — это добивка, а не знак азбуки»
дано ход равно вариант «Разбираем» с байты равным пустой список и набрано равным 0 и копилка равным 0
дано знак равно "="
ожидается вариант «Разбираем» с байты равным пустой список и набрано равным 0 и копилка равным 0
тотальная функция «Закрыть раскодирование»
принимает ход: «Ход раскодирования 64»
возвращает список числа
обеспечивает «хвост из двух знаков даёт байт, из трёх — два, из нуля — ни одного» если (ход.набрано равен 2) то ((длина результат) равен ((длина ход.байты) плюс 1)) иначе (если (ход.набрано равен 3) то ((длина результат) равен ((длина ход.байты) плюс 2)) иначе ((длина результат) равен (длина ход.байты)))
обеспечивает «хвост из двух знаков даёт один байт» не (ход.набрано равен 2) или ((длина результат) равен ((длина ход.байты) плюс 1))
обеспечивает «хвост из трёх знаков даёт два байта» (ход.набрано равен 2) или ((не (ход.набрано равен 3)) или ((длина результат) равен (((длина ход.байты) плюс 1) плюс 1)))
обеспечивает «прочий хвост байтов не даёт» (ход.набрано равен 2) или (ход.набрано равен 3) или ((длина результат) равен (длина ход.байты))
пример «Ничего не осталось»
дано ход равно вариант «Разбираем» с байты равным [77] и набрано равным 0 и копилка равным 0
ожидается [77]
тотальная функция «Раскодировать в байты»
принимает код: строка
возвращает список числа
обеспечивает «байтов не больше, чем знаков» (длина результат) не больше (длина код)
пример «Пусто даёт пусто»
дано код равно ""
ожидается пустой список
| Function | Termination | Claims |
|---|---|---|
| «Азбука 64» | доказано композицией | доказано 15 из 15 |
| «Азбука 64 для адреса» | доказано композицией | доказано 13 из 13 |
| «Знак 64» | доказано композицией | доказано 5 из 5 |
| «Знак 64 для адреса» | доказано композицией | доказано 5 из 5 |
| «Значение знака 64» | доказано композицией | доказано 4 из 6; «значение знака либо шестёрка, либо честный отказ минус один» — сетка; «значение знака меньше шестидесяти четырёх» — сетка |
| «Это знак 64» | доказано композицией | доказано 0 из 3; «знак азбуки — ровно один из шестидесяти шести знаков обеих азбук» — сетка; «одиночный знак азбуки: если признак да, знак стоит в обеих азбуках» — сетка; «одиночный знак азбуки: если знак стоит в азбуках, признак да» — сетка |
| «Первая шестёрка» | доказано композицией | доказано 0 из 2; «первая шестёрка неотрицательна, пока байт конечен» — сетка; «первая шестёрка меньше шестидесяти четырёх, пока байт конечен» — сетка |
| «Вторая шестёрка» | доказано композицией | доказано 0 из 2; «вторая шестёрка неотрицательна, пока байты конечны» — сетка; «вторая шестёрка меньше шестидесяти четырёх, пока байты конечны» — сетка |
| «Третья шестёрка» | доказано композицией | доказано 0 из 2; «третья шестёрка неотрицательна, пока байты конечны» — сетка; «третья шестёрка меньше шестидесяти четырёх, пока байты конечны» — сетка |
| «Четвёртая шестёрка» | доказано композицией | доказано 0 из 2; «четвёртая шестёрка неотрицательна, пока байт конечен» — сетка; «четвёртая шестёрка меньше шестидесяти четырёх, пока байт конечен» — сетка |
| «Тройка байтов» | доказано композицией | доказано 1 из 1 |
| «Шаг кодирования» | доказано композицией | доказано 9 из 9 |
| «Закрыть кодирование» | доказано композицией | доказано 5 из 6; «последним знаком добитой кодировки стоит равно» — сетка |
| «Закодировать байты» | доказано композицией | доказано 0 из 1; «длина кодировки кратна четырём» — сетка |
| «Сложить шестёрку» | доказано композицией | доказано 8 из 8 |
| «Свести шестёрку» | доказано композицией | доказано 7 из 8; «шестёрка вдвигается в копилку слева, пока четвёрка не добрана» — сетка |
| «Шаг раскодирования 64» | доказано композицией | доказано 5 из 10; «знак не из азбуки пропускается без следа» — сетка; «чужой знак: счёт не тронут» — сетка; «чужой знак: копилка не тронута» — сетка; «чужой знак: байтов не прибавилось» — сетка; «знак азбуки до четвёртого только копится, байтов не прибавляя» — сетка |
| «Закрыть раскодирование» | доказано композицией | доказано 4 из 4 |
| «Раскодировать в байты» | доказано композицией | доказано 0 из 1; «байтов не больше, чем знаков» — сетка |
«Bignum»
flang/stdlib/bignum.flang — functions 46; the kernel ledger was taken from this version of the file
объект «Ход переноса»
«столбцы»: список числа
«перенос»: число
объект «Ход займа»
«столбцы»: список числа
«заём»: число
объект «Ход деления»
«частное»: список числа
«остаток»: число
«делитель»: число
объект «Ход длинного деления»
«частное»: список числа
«остаток»: список числа
«делитель»: список числа
тотальная функция «Основание»
возвращает число
пример «Разряд — двадцать два бита: произведение двух разрядов, сложенное сотни раз, ещё точно в double»
ожидается 4194304
тотальная функция «Нулевые разряды»
принимает сколько: число
возвращает список числа
пример «Три нуля»
дано сколько равно 3
ожидается [0, 0, 0]
тотальная функция «Разряд»
принимает разряды: список числа, номер: число
возвращает число
пример «Второй разряд»
дано разряды равно [7, 8, 9]
дано номер равно 2
ожидается 8
тотальная функция «Взять первые»
принимает разряды: список числа, сколько: число
возвращает список числа
обеспечивает «взято не больше, чем было» (длина результат) не больше (длина разряды)
пример «Первые два»
дано разряды равно [1, 2, 3]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Отбросить первые»
принимает разряды: список числа, сколько: число
возвращает список числа
обеспечивает «отброшенное не удлиняет» (длина результат) не больше (длина разряды)
пример «Без первого»
дано разряды равно [1, 2, 3]
дано сколько равно 1
ожидается [2, 3]
тотальная функция «Обрезать старшие нули»
принимает разряды: список числа
возвращает список числа
обеспечивает «обрезка не удлиняет» (длина результат) не больше (длина разряды)
пример «Нули сверху сняты»
дано разряды равно [7, 0, 0]
ожидается [7]
тотальная функция «Сложить по разрядам»
принимает первые: список числа, вторые: список числа
возвращает список числа
пример «Разной длины — хвост едет как есть»
дано первые равно [1, 2]
дано вторые равно [10, 20, 30]
ожидается [11, 22, 30]
тотальная функция «Ширина»
принимает первые: список числа, вторые: список числа
возвращает число
обеспечивает «ширина не меньше каждой длины» ((результат не меньше (длина первые)) и притом (результат не меньше (длина вторые)))
пример «Длиннее первое»
дано первые равно [1, 2]
дано вторые равно [3]
ожидается 2
тотальная функция «Дополнить нулями до»
принимает разряды: список числа, ширина: число
возвращает список числа
пример «Дополнено до трёх»
дано разряды равно [7]
дано ширина равно 3
ожидается [7, 0, 0]
тотальная функция «Сдвинуть на разряды»
принимает разряды: список числа, сколько: число
возвращает список числа
пример «Сдвиг на два разряда — умножение на квадрат основания»
дано разряды равно [5]
дано сколько равно 2
ожидается [0, 0, 5]
тотальная функция «Разряды малого числа»
принимает значение: число
возвращает список числа
пример «Ноль — пустой список»
дано значение равно 0
ожидается []
тотальная функция «Шаг переноса»
принимает ход: «Ход переноса», разряд: число
возвращает «Ход переноса»
обеспечивает «шаг переноса ставит ровно один столбец» (длина (результат.«столбцы»)) равен ((длина (ход.«столбцы»)) плюс 1)
пример «Малый разряд ложится столбцом, переноса нет»
дано ход равно (запись «Ход переноса» с «столбцы» равным пустой список и «перенос» равным 0)
дано разряд равно 5
ожидается запись «Ход переноса» с «столбцы» равным [5] и «перенос» равным 0
тотальная функция «Уложить»
принимает разряды: список числа
возвращает список числа
пример «Перенос из младшего разряда»
дано разряды равно [4194305, 0]
ожидается [1, 1]
тотальная функция «Вычесть с займом»
принимает первые: список числа, вторые: список числа, заём: число
возвращает «Ход займа»
обеспечивает «столбцов разности столько же, сколько у уменьшаемого» (длина (результат.«столбцы»)) равен (длина первые)
пример «Разность без займа»
дано первые равно [5, 7]
дано вторые равно [3, 2]
дано заём равно 0
ожидается запись «Ход займа» с «столбцы» равным [2, 5] и «заём» равным 0
тотальная функция «Сложение»
принимает первые: список числа, вторые: список числа
возвращает список числа
пример «Через границу разряда»
дано первые равно [4194303]
дано вторые равно [1]
ожидается [0, 1]
тотальная функция «Меньше»
принимает первые: список числа, вторые: список числа
возвращает признак
пример «Один разряд меньше двух разрядов»
дано первые равно [1]
дано вторые равно [0, 1]
ожидается да
тотальная функция «Равны»
принимает первые: список числа, вторые: список числа
возвращает признак
пример «Равные»
дано первые равно [1, 2]
дано вторые равно [1, 2]
ожидается да
тотальная функция «Вычитание»
принимает первые: список числа, вторые: список числа
возвращает список числа
обеспечивает «меньшее минус большее — ноль» если («Меньше» от первые и вторые) то ((длина результат) равен 0) иначе да
пример «Разность через границу разряда»
дано первые равно [0, 1]
дано вторые равно [1]
ожидается [4194303]
тотальная функция «Умножить на малое»
принимает разряды: список числа, множитель: число
возвращает список числа
пример «Семь на восемь»
дано разряды равно [7]
дано множитель равно 8
ожидается [56]
тотальная функция «Прибавить малое»
принимает разряды: список числа, добавка: число
возвращает список числа
пример «Добавка перебрасывает разряд»
дано разряды равно [4194303]
дано добавка равно 1
ожидается [0, 1]
тотальная функция «Свёртка разрядов»
принимает первые: список числа, вторые: список числа
возвращает список числа
пример «Двойка на тройку»
дано первые равно [2]
дано вторые равно [3]
ожидается [6]
тотальная функция «Умножение столбиком»
принимает первые: список числа, вторые: список числа
возвращает список числа
пример «Семь на восемь»
дано первые равно [7]
дано вторые равно [8]
ожидается [56]
тотальная функция «Карацуба»
принимает первые: список числа, вторые: список числа
возвращает список числа
убывает (длина первые) плюс (длина вторые)
пример «Короткие числа уходят в столбик»
дано первые равно [7]
дано вторые равно [8]
ожидается [56]
тотальная функция «Умножить»
принимает первые: список числа, вторые: список числа
возвращает список числа
пример «Старшие нули входу не мешают»
дано первые равно [7, 0]
дано вторые равно [8, 0, 0]
ожидается [56]
тотальная функция «Обратить разряды»
принимает разряды: список числа
возвращает список числа
обеспечивает «обращение длины не меняет» (длина результат) равен (длина разряды)
пример «Задом наперёд»
дано разряды равно [1, 2, 3]
ожидается [3, 2, 1]
тотальная функция «Шаг деления»
принимает ход: «Ход деления», разряд: число
возвращает «Ход деления»
обеспечивает «шаг деления ставит ровно одну цифру частного» (длина (результат.«частное»)) равен ((длина (ход.«частное»)) плюс 1)
пример «Девять на два — четыре и один в остатке»
дано ход равно (запись «Ход деления» с «частное» равным пустой список и «остаток» равным 0 и «делитель» равным 2)
дано разряд равно 9
ожидается запись «Ход деления» с «частное» равным [4] и «остаток» равным 1 и «делитель» равным 2
тотальная функция «Разделить на малое»
принимает разряды: список числа, делитель: число
возвращает «Ход деления»
пример «Основание с единицей пополам»
дано разряды равно [1, 1]
дано делитель равно 2
ожидается запись «Ход деления» с «частное» равным [2097152] и «остаток» равным 1 и «делитель» равным 2
тотальная функция «Десятичные знаки»
принимает разряды: список числа, запас: число
возвращает строка
убывает запас
пример «Без запаса — пусто»
дано разряды равно [7]
дано запас равно 0
ожидается ""
тотальная функция «В десятичную строку»
принимает разряды: список числа
возвращает строка
пример «Ноль печатается нулём»
дано разряды равно []
ожидается "0"
тотальная функция «Цифра из знака»
принимает знак: строка
возвращает число
пример «Знак семь — семёрка»
дано знак равно "7"
ожидается 7
тотальная функция «Шаг разбора цифры»
принимает накопленное: список числа, знак: строка
возвращает список числа
пример «Цифра приписывается справа»
дано накопленное равно [7]
дано знак равно "5"
ожидается [75]
тотальная функция «Из десятичной строки»
принимает текст: строка
возвращает список числа
пример «Ноль — пустой список разрядов»
дано текст равно "0"
ожидается []
тотальная функция «Произведение десятичных»
принимает первое: строка, второе: строка
возвращает строка
пример «Однозначные»
дано первое равно "7"
дано второе равно "8"
ожидается "56"
тотальная функция «Карацуба сходится со столбиком»
принимает первое: строка, второе: строка
возвращает признак
пример «Один разряд на один»
дано первое равно "7"
дано второе равно "8"
ожидается да
тотальная функция «Биты разряда»
принимает разряд: число, осталось: неотрицательное
возвращает список числа
пример «Пятёрка тремя битами — старший первым»
дано разряд равно 5
дано осталось равно 3
ожидается [1, 0, 1]
тотальная функция «Бит в деление»
принимает ход: «Ход длинного деления», бит: число
возвращает «Ход длинного деления»
пример «Остаток дорос до делителя — в частном единица»
дано ход равно (запись «Ход длинного деления» с «частное» равным пустой список и «остаток» равным [1] и «делитель» равным [3])
дано бит равно 1
ожидается запись «Ход длинного деления» с «частное» равным [1] и «остаток» равным [] и «делитель» равным [3]
тотальная функция «Разряд в деление»
принимает ход: «Ход длинного деления», разряд: число
возвращает «Ход длинного деления»
пример «Семь на три — два и один в остатке»
дано ход равно (запись «Ход длинного деления» с «частное» равным пустой список и «остаток» равным пустой список и «делитель» равным [3])
дано разряд равно 7
ожидается запись «Ход длинного деления» с «частное» равным [2] и «остаток» равным [1] и «делитель» равным [3]
тотальная функция «Деление на один разряд»
принимает делимое: список числа, делитель: список числа
возвращает «Ход длинного деления»
пример «Основание с единицей на два»
дано делимое равно [1, 1]
дано делитель равно [2]
ожидается запись «Ход длинного деления» с «частное» равным [2097152] и «остаток» равным [1] и «делитель» равным [2]
тотальная функция «Деление с остатком»
принимает делимое: список числа, делитель: список числа
возвращает «Ход длинного деления»
пример «Основание с единицей на два»
дано делимое равно [1, 1]
дано делитель равно [2]
ожидается запись «Ход длинного деления» с «частное» равным [2097152] и «остаток» равным [1] и «делитель» равным [2]
тотальная функция «Частное»
принимает делимое: список числа, делитель: список числа
возвращает список числа
пример «Сто на семь — четырнадцать»
дано делимое равно [100]
дано делитель равно [7]
ожидается [14]
тотальная функция «Остаток»
принимает делимое: список числа, делитель: список числа
возвращает список числа
пример «Сто на семь — два в остатке»
дано делимое равно [100]
дано делитель равно [7]
ожидается [2]
тотальная функция «НОД с запасом»
принимает первое: список числа, второе: список числа, запас: неотрицательное
возвращает список числа
пример «Двенадцать и восемнадцать»
дано первое равно [12]
дано второе равно [18]
дано запас равно 10
ожидается [6]
тотальная функция «Запас алгоритма Евклида»
принимает первое: список числа, второе: список числа
возвращает неотрицательное
пример «Два однозначных — девяносто шесть шагов»
дано первое равно [7]
дано второе равно [5]
ожидается 96
тотальная функция «Значение двух разрядов»
принимает разряды: список числа
возвращает число
пример «Основание с единицей»
дано разряды равно [1, 1]
ожидается 4194305
тотальная функция «НОД малых чисел»
принимает первое: число, второе: число, запас: неотрицательное
возвращает число
пример «Двенадцать и восемнадцать»
дано первое равно 12
дано второе равно 18
дано запас равно 10
ожидается 6
тотальная функция «НОД»
принимает первое: список числа, второе: список числа
возвращает список числа
пример «Взаимно простые»
дано первое равно [7]
дано второе равно [5]
ожидается [1]
| Function | Termination | Claims |
|---|---|---|
| «Основание» | доказано композицией | — |
| «Нулевые разряды» | доказано постоянным шагом | — |
| «Разряд» | доказано структурой | — |
| «Взять первые» | доказано структурой | доказано 1 из 1 |
| «Отбросить первые» | доказано структурой | доказано 1 из 1 |
| «Обрезать старшие нули» | доказано структурой | доказано 1 из 1 |
| «Сложить по разрядам» | доказано структурой | — |
| «Ширина» | доказано композицией | доказано 0 из 1; «ширина не меньше каждой длины» — сетка |
| «Дополнить нулями до» | доказано композицией | — |
| «Сдвинуть на разряды» | доказано постоянным шагом | — |
| «Разряды малого числа» | доказано композицией | — |
| «Шаг переноса» | доказано композицией | доказано 1 из 1 |
| «Уложить» | доказано композицией | — |
| «Вычесть с займом» | доказано структурой | доказано 1 из 1 |
| «Сложение» | доказано композицией | — |
| «Меньше» | доказано композицией | — |
| «Равны» | доказано композицией | — |
| «Вычитание» | доказано композицией | доказано 0 из 1; «меньшее минус большее — ноль» — сетка |
| «Умножить на малое» | доказано композицией | — |
| «Прибавить малое» | доказано композицией | — |
| «Свёртка разрядов» | доказано структурой | — |
| «Умножение столбиком» | доказано композицией | — |
| «Карацуба» | доказано объявленной мерой | — |
| «Умножить» | доказано композицией | — |
| «Обратить разряды» | доказано композицией | доказано 1 из 1 |
| «Шаг деления» | доказано композицией | доказано 1 из 1 |
| «Разделить на малое» | доказано композицией | — |
| «Десятичные знаки» | доказано объявленной мерой | — |
| «В десятичную строку» | доказано композицией | — |
| «Цифра из знака» | доказано композицией | — |
| «Шаг разбора цифры» | доказано композицией | — |
| «Из десятичной строки» | доказано композицией | — |
| «Произведение десятичных» | доказано композицией | — |
| «Карацуба сходится со столбиком» | доказано композицией | — |
| «Биты разряда» | доказано точным шагом | — |
| «Бит в деление» | доказано композицией | — |
| «Разряд в деление» | доказано композицией | — |
| «Деление на один разряд» | доказано композицией | — |
| «Деление с остатком» | доказано композицией | — |
| «Частное» | доказано композицией | — |
| «Остаток» | доказано композицией | — |
| «НОД с запасом» | доказано точным шагом | — |
| «Запас алгоритма Евклида» | доказано композицией | — |
| «Значение двух разрядов» | доказано композицией | — |
| «НОД малых чисел» | доказано точным шагом | — |
| «НОД» | доказано композицией | — |
«Certificate path»
flang/stdlib/certificate-path.flang — functions 40; the kernel ledger was taken from this version of the file
объект «Правило пути»
«верно»: признак
«код»: строка
«слова»: строка
объект «Корень доверия»
«субъект»: список числа
«сертификат»: список числа
тип «Приговор пути»
вариант «Путь годен»
вариант «Путь отвергнут» содержит код: строка, слова: строка
тип «Шаг пути»
вариант «Дошли» содержит приговор: «Приговор пути»
вариант «Идём выше»
тип «Вид строчки»
вариант «Начало PEM»
вариант «Конец PEM»
вариант «Строчка тела»
объект «Примета строчки»
«приставка»: строка
«вид»: «Вид строчки»
тип «Ход связки корней»
вариант «Ход связки корней» содержит внутри: признак, набрано: строка, тела: список строки
тотальная функция «Строчный октет»
принимает октет: число
возвращает число
пример «E становится e»
дано октет равно 69
ожидается 101
тотальная функция «Строчные октеты»
принимает октеты: список числа
возвращает список числа
обеспечивает «строчные той же длины» (длина результат) равен (длина октеты)
пример «Example становится example»
дано октеты равно [69, 120]
ожидается [101, 120]
тотальная функция «Октеты имени»
принимает имя: строка
возвращает список числа
пример «имя узла октетами»
дано имя равно "a.b"
ожидается [97, 46, 98]
тотальная функция «Метка в месте»
принимает октеты: список числа, место: число
возвращает число
пример «пустая последовательность помечена 48»
дано октеты равно [48, 0]
дано место равно 1
ожидается 48
тотальная функция «Последний или ноль»
принимает места: список числа
возвращает число
пример «последнее место»
дано места равно [3, 9, 12]
ожидается 12
тотальная функция «Место с меткой»
принимает октеты: список числа, места: список числа, метка: число
возвращает число
пример «второе место несёт метку 2»
дано октеты равно [48, 0, 2, 1, 5]
дано места равно [1, 3]
дано метка равно 2
ожидается 3
тотальная функция «Места расширений»
принимает серт: список числа
возвращает список числа
пример «у сертификата RFC 8448 два расширения»
дано серт равно [48, 130, 1, 172, 48, 130, 1, 21, 160, 3, 2, 1, 2, 2, 1, 2, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13,
1, 1, 11, 5, 0, 48, 14, 49, 12, 48, 10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 30, 23, 13, 49, 54, 48, 55, 51,
48, 48, 49, 50, 51, 53, 57, 90, 23, 13, 50, 54, 48, 55, 51, 48, 48, 49, 50, 51, 53, 57, 90, 48, 14, 49, 12, 48,
10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3,
129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 180, 187, 73, 143, 130, 121, 48, 61, 152, 8, 54, 57, 155, 54, 198, 152,
140, 12, 104, 222, 85, 225, 189, 184, 38, 211, 144, 26, 36, 97, 234, 253, 45, 228, 154, 145, 208, 21, 171, 188,
154, 149, 19, 122, 206, 108, 26, 241, 158, 170, 106, 249, 140, 124, 237, 67, 18, 9, 152, 225, 135, 168, 14, 224,
204, 176, 82, 75, 27, 1, 140, 62, 11, 99, 38, 77, 68, 154, 109, 56, 226, 42, 95, 218, 67, 8, 70, 116, 128, 48, 83,
14, 240, 70, 28, 140, 169, 217, 239, 191, 174, 142, 166, 209, 208, 62, 43, 209, 147, 239, 240, 171, 154, 128, 2,
196, 116, 40, 166, 211, 90, 141, 136, 215, 159, 127, 30, 63, 2, 3, 1, 0, 1, 163, 26, 48, 24, 48, 9, 6, 3, 85, 29,
19, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 5, 160, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11,
5, 0, 3, 129, 129, 0, 133, 170, 210, 160, 229, 185, 39, 107, 144, 140, 101, 247, 58, 114, 103, 23, 6, 24, 165, 76,
95, 138, 123, 51, 125, 45, 247, 165, 148, 54, 84, 23, 242, 234, 232, 248, 165, 140, 143, 129, 114, 249, 49, 156,
243, 107, 127, 214, 197, 91, 128, 242, 26, 3, 1, 81, 86, 114, 96, 150, 253, 51, 94, 94, 103, 242, 219, 241, 2,
112, 46, 96, 140, 202, 230, 190, 193, 252, 99, 164, 42, 153, 190, 92, 62, 183, 16, 124, 60, 84, 233, 185, 235, 43,
213, 32, 59, 28, 59, 132, 224, 168, 178, 247, 89, 64, 155, 163, 234, 201, 217, 29, 64, 45, 204, 12, 200, 248, 150,
18, 41, 172, 145, 135, 180, 43, 77, 225]
ожидается [262, 273]
тотальная функция «Опознаватель расширения»
принимает серт: список числа, место: число
возвращает строка
пример «первое расширение сертификата RFC 8448 — basicConstraints»
дано серт равно [48, 130, 1, 172, 48, 130, 1, 21, 160, 3, 2, 1, 2, 2, 1, 2, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13,
1, 1, 11, 5, 0, 48, 14, 49, 12, 48, 10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 30, 23, 13, 49, 54, 48, 55, 51,
48, 48, 49, 50, 51, 53, 57, 90, 23, 13, 50, 54, 48, 55, 51, 48, 48, 49, 50, 51, 53, 57, 90, 48, 14, 49, 12, 48,
10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3,
129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 180, 187, 73, 143, 130, 121, 48, 61, 152, 8, 54, 57, 155, 54, 198, 152,
140, 12, 104, 222, 85, 225, 189, 184, 38, 211, 144, 26, 36, 97, 234, 253, 45, 228, 154, 145, 208, 21, 171, 188,
154, 149, 19, 122, 206, 108, 26, 241, 158, 170, 106, 249, 140, 124, 237, 67, 18, 9, 152, 225, 135, 168, 14, 224,
204, 176, 82, 75, 27, 1, 140, 62, 11, 99, 38, 77, 68, 154, 109, 56, 226, 42, 95, 218, 67, 8, 70, 116, 128, 48, 83,
14, 240, 70, 28, 140, 169, 217, 239, 191, 174, 142, 166, 209, 208, 62, 43, 209, 147, 239, 240, 171, 154, 128, 2,
196, 116, 40, 166, 211, 90, 141, 136, 215, 159, 127, 30, 63, 2, 3, 1, 0, 1, 163, 26, 48, 24, 48, 9, 6, 3, 85, 29,
19, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 5, 160, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11,
5, 0, 3, 129, 129, 0, 133, 170, 210, 160, 229, 185, 39, 107, 144, 140, 101, 247, 58, 114, 103, 23, 6, 24, 165, 76,
95, 138, 123, 51, 125, 45, 247, 165, 148, 54, 84, 23, 242, 234, 232, 248, 165, 140, 143, 129, 114, 249, 49, 156,
243, 107, 127, 214, 197, 91, 128, 242, 26, 3, 1, 81, 86, 114, 96, 150, 253, 51, 94, 94, 103, 242, 219, 241, 2,
112, 46, 96, 140, 202, 230, 190, 193, 252, 99, 164, 42, 153, 190, 92, 62, 183, 16, 124, 60, 84, 233, 185, 235, 43,
213, 32, 59, 28, 59, 132, 224, 168, 178, 247, 89, 64, 155, 163, 234, 201, 217, 29, 64, 45, 204, 12, 200, 248, 150,
18, 41, 172, 145, 135, 180, 43, 77, 225]
дано место равно 262
ожидается "2.5.29.19"
тотальная функция «Расширение»
принимает серт: список числа, опознаватель: строка
возвращает список числа
пример «basicConstraints сертификата RFC 8448 — пустая последовательность, cA не заявлен»
дано серт равно [48, 130, 1, 172, 48, 130, 1, 21, 160, 3, 2, 1, 2, 2, 1, 2, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13,
1, 1, 11, 5, 0, 48, 14, 49, 12, 48, 10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 30, 23, 13, 49, 54, 48, 55, 51,
48, 48, 49, 50, 51, 53, 57, 90, 23, 13, 50, 54, 48, 55, 51, 48, 48, 49, 50, 51, 53, 57, 90, 48, 14, 49, 12, 48,
10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3,
129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 180, 187, 73, 143, 130, 121, 48, 61, 152, 8, 54, 57, 155, 54, 198, 152,
140, 12, 104, 222, 85, 225, 189, 184, 38, 211, 144, 26, 36, 97, 234, 253, 45, 228, 154, 145, 208, 21, 171, 188,
154, 149, 19, 122, 206, 108, 26, 241, 158, 170, 106, 249, 140, 124, 237, 67, 18, 9, 152, 225, 135, 168, 14, 224,
204, 176, 82, 75, 27, 1, 140, 62, 11, 99, 38, 77, 68, 154, 109, 56, 226, 42, 95, 218, 67, 8, 70, 116, 128, 48, 83,
14, 240, 70, 28, 140, 169, 217, 239, 191, 174, 142, 166, 209, 208, 62, 43, 209, 147, 239, 240, 171, 154, 128, 2,
196, 116, 40, 166, 211, 90, 141, 136, 215, 159, 127, 30, 63, 2, 3, 1, 0, 1, 163, 26, 48, 24, 48, 9, 6, 3, 85, 29,
19, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 5, 160, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11,
5, 0, 3, 129, 129, 0, 133, 170, 210, 160, 229, 185, 39, 107, 144, 140, 101, 247, 58, 114, 103, 23, 6, 24, 165, 76,
95, 138, 123, 51, 125, 45, 247, 165, 148, 54, 84, 23, 242, 234, 232, 248, 165, 140, 143, 129, 114, 249, 49, 156,
243, 107, 127, 214, 197, 91, 128, 242, 26, 3, 1, 81, 86, 114, 96, 150, 253, 51, 94, 94, 103, 242, 219, 241, 2,
112, 46, 96, 140, 202, 230, 190, 193, 252, 99, 164, 42, 153, 190, 92, 62, 183, 16, 124, 60, 84, 233, 185, 235, 43,
213, 32, 59, 28, 59, 132, 224, 168, 178, 247, 89, 64, 155, 163, 234, 201, 217, 29, 64, 45, 204, 12, 200, 248, 150,
18, 41, 172, 145, 135, 180, 43, 77, 225]
дано опознаватель равно "2.5.29.19"
ожидается [48, 0]
тотальная функция «Имена узла»
принимает серт: список числа
возвращает список список числа
пример «subjectAltName пробного сертификата — шаблон и само имя»
дано серт равно [48, 130, 2, 47, 48, 130, 1, 152, 160, 3, 2, 1, 2, 2, 20, 38, 159, 83, 214, 113, 16, 212, 144, 93,
243, 154, 164, 128, 178, 80, 128, 152, 8, 112, 43, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48,
22, 49, 20, 48, 18, 6, 3, 85, 4, 3, 12, 11, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 48, 30, 23, 13,
50, 54, 49, 48, 48, 55, 49, 49, 53, 56, 50, 49, 90, 23, 13, 51, 54, 49, 48, 48, 52, 49, 49, 53, 56, 50, 49, 90,
48, 22, 49, 20, 48, 18, 6, 3, 85, 4, 3, 12, 11, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 48, 129, 159,
48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 209, 227,
87, 216, 180, 145, 72, 134, 95, 165, 75, 118, 138, 10, 115, 16, 222, 6, 231, 151, 68, 125, 46, 171, 23, 3, 48, 95,
109, 116, 192, 214, 141, 227, 79, 120, 22, 91, 63, 215, 237, 204, 141, 33, 113, 49, 151, 207, 89, 255, 41, 86,
160, 114, 238, 121, 146, 161, 136, 0, 146, 233, 56, 197, 52, 214, 58, 103, 182, 10, 235, 146, 246, 52, 19, 8, 244,
251, 54, 163, 240, 37, 170, 30, 154, 12, 233, 102, 223, 219, 47, 164, 133, 89, 225, 6, 244, 73, 50, 196, 102, 96,
47, 65, 52, 29, 36, 187, 101, 165, 161, 198, 240, 99, 147, 156, 0, 141, 49, 197, 229, 88, 213, 46, 161, 20, 4,
169, 2, 3, 1, 0, 1, 163, 122, 48, 120, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 210, 168, 151, 231, 167, 251, 210,
227, 182, 108, 106, 46, 100, 153, 158, 34, 11, 121, 171, 216, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20,
210, 168, 151, 231, 167, 251, 210, 227, 182, 108, 106, 46, 100, 153, 158, 34, 11, 121, 171, 216, 48, 37, 6, 3, 85,
29, 17, 4, 30, 48, 28, 130, 13, 42, 46, 69, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 130, 11, 101, 120, 97,
109, 112, 108, 101, 46, 99, 111, 109, 48, 15, 6, 3, 85, 29, 19, 1, 1, 255, 4, 5, 48, 3, 1, 1, 255, 48, 13, 6, 9,
42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 129, 129, 0, 125, 111, 31, 234, 103, 103, 70, 246, 3, 13, 250, 87,
214, 79, 130, 56, 101, 88, 106, 85, 114, 254, 125, 0, 190, 113, 230, 39, 97, 154, 121, 26, 63, 31, 0, 141, 32, 11,
81, 65, 226, 141, 102, 81, 240, 43, 202, 44, 124, 152, 60, 39, 190, 158, 29, 194, 114, 229, 149, 34, 191, 74, 52,
159, 192, 10, 77, 205, 183, 211, 207, 63, 26, 86, 161, 124, 6, 215, 88, 93, 170, 135, 162, 175, 113, 255, 209,
139, 172, 56, 218, 58, 73, 233, 123, 203, 69, 207, 134, 170, 123, 197, 200, 29, 234, 68, 161, 65, 89, 159, 24,
220, 91, 74, 63, 244, 80, 145, 48, 203, 67, 115, 21, 163, 100, 146, 41, 89]
ожидается [[42, 46, 69, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109],
[101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109]]
тотальная функция «Имена с меткой»
принимает имена: список числа
возвращает список список числа
пример «одно имя dNSName из одного знака»
дано имена равно [48, 3, 130, 1, 97]
ожидается [[97]]
тотальная функция «Удостоверяющий центр»
принимает серт: список числа
возвращает признак
пример «пробный сертификат заявлен центром»
дано серт равно [48, 130, 2, 47, 48, 130, 1, 152, 160, 3, 2, 1, 2, 2, 20, 38, 159, 83, 214, 113, 16, 212, 144, 93,
243, 154, 164, 128, 178, 80, 128, 152, 8, 112, 43, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48,
22, 49, 20, 48, 18, 6, 3, 85, 4, 3, 12, 11, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 48, 30, 23, 13,
50, 54, 49, 48, 48, 55, 49, 49, 53, 56, 50, 49, 90, 23, 13, 51, 54, 49, 48, 48, 52, 49, 49, 53, 56, 50, 49, 90,
48, 22, 49, 20, 48, 18, 6, 3, 85, 4, 3, 12, 11, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 48, 129, 159,
48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 209, 227,
87, 216, 180, 145, 72, 134, 95, 165, 75, 118, 138, 10, 115, 16, 222, 6, 231, 151, 68, 125, 46, 171, 23, 3, 48, 95,
109, 116, 192, 214, 141, 227, 79, 120, 22, 91, 63, 215, 237, 204, 141, 33, 113, 49, 151, 207, 89, 255, 41, 86,
160, 114, 238, 121, 146, 161, 136, 0, 146, 233, 56, 197, 52, 214, 58, 103, 182, 10, 235, 146, 246, 52, 19, 8, 244,
251, 54, 163, 240, 37, 170, 30, 154, 12, 233, 102, 223, 219, 47, 164, 133, 89, 225, 6, 244, 73, 50, 196, 102, 96,
47, 65, 52, 29, 36, 187, 101, 165, 161, 198, 240, 99, 147, 156, 0, 141, 49, 197, 229, 88, 213, 46, 161, 20, 4,
169, 2, 3, 1, 0, 1, 163, 122, 48, 120, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 210, 168, 151, 231, 167, 251, 210,
227, 182, 108, 106, 46, 100, 153, 158, 34, 11, 121, 171, 216, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20,
210, 168, 151, 231, 167, 251, 210, 227, 182, 108, 106, 46, 100, 153, 158, 34, 11, 121, 171, 216, 48, 37, 6, 3, 85,
29, 17, 4, 30, 48, 28, 130, 13, 42, 46, 69, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 130, 11, 101, 120, 97,
109, 112, 108, 101, 46, 99, 111, 109, 48, 15, 6, 3, 85, 29, 19, 1, 1, 255, 4, 5, 48, 3, 1, 1, 255, 48, 13, 6, 9,
42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 129, 129, 0, 125, 111, 31, 234, 103, 103, 70, 246, 3, 13, 250, 87,
214, 79, 130, 56, 101, 88, 106, 85, 114, 254, 125, 0, 190, 113, 230, 39, 97, 154, 121, 26, 63, 31, 0, 141, 32, 11,
81, 65, 226, 141, 102, 81, 240, 43, 202, 44, 124, 152, 60, 39, 190, 158, 29, 194, 114, 229, 149, 34, 191, 74, 52,
159, 192, 10, 77, 205, 183, 211, 207, 63, 26, 86, 161, 124, 6, 215, 88, 93, 170, 135, 162, 175, 113, 255, 209,
139, 172, 56, 218, 58, 73, 233, 123, 203, 69, 207, 134, 170, 123, 197, 200, 29, 234, 68, 161, 65, 89, 159, 24,
220, 91, 74, 63, 244, 80, 145, 48, 203, 67, 115, 21, 163, 100, 146, 41, 89]
ожидается да
тотальная функция «Хвост равен»
принимает октеты: список числа, хвост: список числа
возвращает признак
пример «example.com кончается на .com»
дано октеты равно [97, 46, 99]
дано хвост равно [46, 99]
ожидается да
тотальная функция «Имя подходит»
принимает шаблон: список числа, узел: список числа
возвращает признак
пример «шаблон закрывает одну метку слева»
дано шаблон равно [42, 46, 98, 46, 99]
дано узел равно [97, 46, 98, 46, 99]
ожидается да
тотальная функция «Имя узла сходится»
принимает серт: список числа, узел: список числа
возвращает признак
пример «пробный сертификат годится для www.example.com по шаблону»
дано серт равно [48, 130, 2, 47, 48, 130, 1, 152, 160, 3, 2, 1, 2, 2, 20, 38, 159, 83, 214, 113, 16, 212, 144, 93,
243, 154, 164, 128, 178, 80, 128, 152, 8, 112, 43, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48,
22, 49, 20, 48, 18, 6, 3, 85, 4, 3, 12, 11, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 48, 30, 23, 13,
50, 54, 49, 48, 48, 55, 49, 49, 53, 56, 50, 49, 90, 23, 13, 51, 54, 49, 48, 48, 52, 49, 49, 53, 56, 50, 49, 90,
48, 22, 49, 20, 48, 18, 6, 3, 85, 4, 3, 12, 11, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 48, 129, 159,
48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 209, 227,
87, 216, 180, 145, 72, 134, 95, 165, 75, 118, 138, 10, 115, 16, 222, 6, 231, 151, 68, 125, 46, 171, 23, 3, 48, 95,
109, 116, 192, 214, 141, 227, 79, 120, 22, 91, 63, 215, 237, 204, 141, 33, 113, 49, 151, 207, 89, 255, 41, 86,
160, 114, 238, 121, 146, 161, 136, 0, 146, 233, 56, 197, 52, 214, 58, 103, 182, 10, 235, 146, 246, 52, 19, 8, 244,
251, 54, 163, 240, 37, 170, 30, 154, 12, 233, 102, 223, 219, 47, 164, 133, 89, 225, 6, 244, 73, 50, 196, 102, 96,
47, 65, 52, 29, 36, 187, 101, 165, 161, 198, 240, 99, 147, 156, 0, 141, 49, 197, 229, 88, 213, 46, 161, 20, 4,
169, 2, 3, 1, 0, 1, 163, 122, 48, 120, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 210, 168, 151, 231, 167, 251, 210,
227, 182, 108, 106, 46, 100, 153, 158, 34, 11, 121, 171, 216, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20,
210, 168, 151, 231, 167, 251, 210, 227, 182, 108, 106, 46, 100, 153, 158, 34, 11, 121, 171, 216, 48, 37, 6, 3, 85,
29, 17, 4, 30, 48, 28, 130, 13, 42, 46, 69, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 130, 11, 101, 120, 97,
109, 112, 108, 101, 46, 99, 111, 109, 48, 15, 6, 3, 85, 29, 19, 1, 1, 255, 4, 5, 48, 3, 1, 1, 255, 48, 13, 6, 9,
42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 129, 129, 0, 125, 111, 31, 234, 103, 103, 70, 246, 3, 13, 250, 87,
214, 79, 130, 56, 101, 88, 106, 85, 114, 254, 125, 0, 190, 113, 230, 39, 97, 154, 121, 26, 63, 31, 0, 141, 32, 11,
81, 65, 226, 141, 102, 81, 240, 43, 202, 44, 124, 152, 60, 39, 190, 158, 29, 194, 114, 229, 149, 34, 191, 74, 52,
159, 192, 10, 77, 205, 183, 211, 207, 63, 26, 86, 161, 124, 6, 215, 88, 93, 170, 135, 162, 175, 113, 255, 209,
139, 172, 56, 218, 58, 73, 233, 123, 203, 69, 207, 134, 170, 123, 197, 200, 29, 234, 68, 161, 65, 89, 159, 24,
220, 91, 74, 63, 244, 80, 145, 48, 203, 67, 115, 21, 163, 100, 146, 41, 89]
дано узел равно [119, 119, 119, 46, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109]
ожидается да
тотальная функция «Ключ сертификата RSA»
принимает серт: список числа
возвращает признак
пример «у сертификата RFC 8448 ключ RSA»
дано серт равно [48, 130, 1, 172, 48, 130, 1, 21, 160, 3, 2, 1, 2, 2, 1, 2, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13,
1, 1, 11, 5, 0, 48, 14, 49, 12, 48, 10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 30, 23, 13, 49, 54, 48, 55, 51,
48, 48, 49, 50, 51, 53, 57, 90, 23, 13, 50, 54, 48, 55, 51, 48, 48, 49, 50, 51, 53, 57, 90, 48, 14, 49, 12, 48,
10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3,
129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 180, 187, 73, 143, 130, 121, 48, 61, 152, 8, 54, 57, 155, 54, 198, 152,
140, 12, 104, 222, 85, 225, 189, 184, 38, 211, 144, 26, 36, 97, 234, 253, 45, 228, 154, 145, 208, 21, 171, 188,
154, 149, 19, 122, 206, 108, 26, 241, 158, 170, 106, 249, 140, 124, 237, 67, 18, 9, 152, 225, 135, 168, 14, 224,
204, 176, 82, 75, 27, 1, 140, 62, 11, 99, 38, 77, 68, 154, 109, 56, 226, 42, 95, 218, 67, 8, 70, 116, 128, 48, 83,
14, 240, 70, 28, 140, 169, 217, 239, 191, 174, 142, 166, 209, 208, 62, 43, 209, 147, 239, 240, 171, 154, 128, 2,
196, 116, 40, 166, 211, 90, 141, 136, 215, 159, 127, 30, 63, 2, 3, 1, 0, 1, 163, 26, 48, 24, 48, 9, 6, 3, 85, 29,
19, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 5, 160, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11,
5, 0, 3, 129, 129, 0, 133, 170, 210, 160, 229, 185, 39, 107, 144, 140, 101, 247, 58, 114, 103, 23, 6, 24, 165, 76,
95, 138, 123, 51, 125, 45, 247, 165, 148, 54, 84, 23, 242, 234, 232, 248, 165, 140, 143, 129, 114, 249, 49, 156,
243, 107, 127, 214, 197, 91, 128, 242, 26, 3, 1, 81, 86, 114, 96, 150, 253, 51, 94, 94, 103, 242, 219, 241, 2,
112, 46, 96, 140, 202, 230, 190, 193, 252, 99, 164, 42, 153, 190, 92, 62, 183, 16, 124, 60, 84, 233, 185, 235, 43,
213, 32, 59, 28, 59, 132, 224, 168, 178, 247, 89, 64, 155, 163, 234, 201, 217, 29, 64, 45, 204, 12, 200, 248, 150,
18, 41, 172, 145, 135, 180, 43, 77, 225]
ожидается да
тотальная функция «Подпись звена верна»
принимает серт: список числа, издатель: список числа
возвращает признак
пример «сертификат RFC 8448 подписан собственным ключом»
дано серт равно [48, 130, 1, 172, 48, 130, 1, 21, 160, 3, 2, 1, 2, 2, 1, 2, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13,
1, 1, 11, 5, 0, 48, 14, 49, 12, 48, 10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 30, 23, 13, 49, 54, 48, 55, 51,
48, 48, 49, 50, 51, 53, 57, 90, 23, 13, 50, 54, 48, 55, 51, 48, 48, 49, 50, 51, 53, 57, 90, 48, 14, 49, 12, 48,
10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3,
129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 180, 187, 73, 143, 130, 121, 48, 61, 152, 8, 54, 57, 155, 54, 198, 152,
140, 12, 104, 222, 85, 225, 189, 184, 38, 211, 144, 26, 36, 97, 234, 253, 45, 228, 154, 145, 208, 21, 171, 188,
154, 149, 19, 122, 206, 108, 26, 241, 158, 170, 106, 249, 140, 124, 237, 67, 18, 9, 152, 225, 135, 168, 14, 224,
204, 176, 82, 75, 27, 1, 140, 62, 11, 99, 38, 77, 68, 154, 109, 56, 226, 42, 95, 218, 67, 8, 70, 116, 128, 48, 83,
14, 240, 70, 28, 140, 169, 217, 239, 191, 174, 142, 166, 209, 208, 62, 43, 209, 147, 239, 240, 171, 154, 128, 2,
196, 116, 40, 166, 211, 90, 141, 136, 215, 159, 127, 30, 63, 2, 3, 1, 0, 1, 163, 26, 48, 24, 48, 9, 6, 3, 85, 29,
19, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 5, 160, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11,
5, 0, 3, 129, 129, 0, 133, 170, 210, 160, 229, 185, 39, 107, 144, 140, 101, 247, 58, 114, 103, 23, 6, 24, 165, 76,
95, 138, 123, 51, 125, 45, 247, 165, 148, 54, 84, 23, 242, 234, 232, 248, 165, 140, 143, 129, 114, 249, 49, 156,
243, 107, 127, 214, 197, 91, 128, 242, 26, 3, 1, 81, 86, 114, 96, 150, 253, 51, 94, 94, 103, 242, 219, 241, 2,
112, 46, 96, 140, 202, 230, 190, 193, 252, 99, 164, 42, 153, 190, 92, 62, 183, 16, 124, 60, 84, 233, 185, 235, 43,
213, 32, 59, 28, 59, 132, 224, 168, 178, 247, 89, 64, 155, 163, 234, 201, 217, 29, 64, 45, 204, 12, 200, 248, 150,
18, 41, 172, 145, 135, 180, 43, 77, 225]
дано издатель равно [48, 130, 1, 172, 48, 130, 1, 21, 160, 3, 2, 1, 2, 2, 1, 2, 48, 13, 6, 9, 42, 134, 72, 134, 247,
13, 1, 1, 11, 5, 0, 48, 14, 49, 12, 48, 10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 30, 23, 13, 49, 54, 48, 55,
51, 48, 48, 49, 50, 51, 53, 57, 90, 23, 13, 50, 54, 48, 55, 51, 48, 48, 49, 50, 51, 53, 57, 90, 48, 14, 49, 12,
48, 10, 6, 3, 85, 4, 3, 19, 3, 114, 115, 97, 48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0,
3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 180, 187, 73, 143, 130, 121, 48, 61, 152, 8, 54, 57, 155, 54, 198,
152, 140, 12, 104, 222, 85, 225, 189, 184, 38, 211, 144, 26, 36, 97, 234, 253, 45, 228, 154, 145, 208, 21, 171,
188, 154, 149, 19, 122, 206, 108, 26, 241, 158, 170, 106, 249, 140, 124, 237, 67, 18, 9, 152, 225, 135, 168, 14,
224, 204, 176, 82, 75, 27, 1, 140, 62, 11, 99, 38, 77, 68, 154, 109, 56, 226, 42, 95, 218, 67, 8, 70, 116, 128,
48, 83, 14, 240, 70, 28, 140, 169, 217, 239, 191, 174, 142, 166, 209, 208, 62, 43, 209, 147, 239, 240, 171, 154,
128, 2, 196, 116, 40, 166, 211, 90, 141, 136, 215, 159, 127, 30, 63, 2, 3, 1, 0, 1, 163, 26, 48, 24, 48, 9, 6, 3,
85, 29, 19, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 5, 160, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1,
1, 11, 5, 0, 3, 129, 129, 0, 133, 170, 210, 160, 229, 185, 39, 107, 144, 140, 101, 247, 58, 114, 103, 23, 6, 24,
165, 76, 95, 138, 123, 51, 125, 45, 247, 165, 148, 54, 84, 23, 242, 234, 232, 248, 165, 140, 143, 129, 114, 249,
49, 156, 243, 107, 127, 214, 197, 91, 128, 242, 26, 3, 1, 81, 86, 114, 96, 150, 253, 51, 94, 94, 103, 242, 219,
241, 2, 112, 46, 96, 140, 202, 230, 190, 193, 252, 99, 164, 42, 153, 190, 92, 62, 183, 16, 124, 60, 84, 233, 185,
235, 43, 213, 32, 59, 28, 59, 132, 224, 168, 178, 247, 89, 64, 155, 163, 234, 201, 217, 29, 64, 45, 204, 12, 200,
248, 150, 18, 41, 172, 145, 135, 180, 43, 77, 225]
ожидается да
тотальная функция «Подпись RSA сходится»
принимает серт: список числа, издатель: список числа
возвращает признак
тотальная функция «Время сертификата»
принимает миллисекунды: число
возвращает число
пример «7 октября 2026, 12:00:00 UTC»
дано миллисекунды равно 1791374400000
ожидается 20261007120000
тотальная функция «Первый отказ»
принимает правила: список «Правило пути»
возвращает «Приговор пути»
пример «правил нет — путь годен»
дано правила равно пустой список
ожидается вариант «Путь годен»
тотальная функция «Правило»
принимает верно: признак, код: строка, слова: строка
возвращает «Правило пути»
пример «правило собирается из трёх полей»
дано верно равно нет
дано код равно "К"
дано слова равно "с"
ожидается запись «Правило пути» с «верно» равным нет и «код» равным "К" и «слова» равным "с"
тотальная функция «Назвать»
принимает слова: строка, серт: список числа, верх: список числа
возвращает строка
пример «пустые сертификаты печатаются пустыми именами»
дано слова равно "корень {верх} под {серт}"
дано серт равно пустой список
дано верх равно пустой список
ожидается "корень под "
тотальная функция «С именами»
принимает приговор: «Приговор пути», серт: список числа, верх: список числа
возвращает «Приговор пути»
пример «годный путь имён не печатает»
дано приговор равно вариант «Путь годен»
дано серт равно пустой список
дано верх равно пустой список
ожидается вариант «Путь годен»
тотальная функция «Звено к корню»
принимает серт: список числа, корень: список числа, сейчас: число
возвращает «Приговор пути»
пример «пустой корень не действует ни в какой день»
дано серт равно пустой список
дано корень равно пустой список
дано сейчас равно 20261007120000
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_EXPIRED" и слова равным "корень вне срока"
тотальная функция «Приговор звена к корню»
принимает серт: список числа, корень: список числа, сейчас: число
возвращает «Приговор пути»
пример «пустой корень не действует»
дано серт равно пустой список
дано корень равно пустой список
дано сейчас равно 20261007120000
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_EXPIRED" и слова равным "корень {верх} вне срока"
тотальная функция «Звено к верхнему»
принимает серт: список числа, верх: список числа, сейчас: число
возвращает «Приговор пути»
пример «пустой верхний не заявлен центром»
дано серт равно пустой список
дано верх равно пустой список
дано сейчас равно 20261007120000
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_CHAIN" и слова равным "промежуточный не центр"
тотальная функция «Приговор звена к верхнему»
принимает серт: список числа, верх: список числа, сейчас: число
возвращает «Приговор пути»
пример «пустой верхний не заявлен центром»
дано серт равно пустой список
дано верх равно пустой список
дано сейчас равно 20261007120000
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_CHAIN" и слова равным "промежуточный {верх} не центр"
тотальная функция «Корень доверия»
принимает сертификат: список числа
возвращает «Корень доверия»
пример «пустой сертификат — пустой субъект»
дано сертификат равно пустой список
ожидается запись «Корень доверия» с «субъект» равным пустой список и «сертификат» равным пустой список
тотальная функция «Корень издателя»
принимает корни: список «Корень доверия», серт: список числа
возвращает список числа
пример «корней нет — пусто»
дано корни равно пустой список
дано серт равно пустой список
ожидается пустой список
тотальная функция «Довести до корня»
принимает цепь: список список числа, корни: список «Корень доверия», сейчас: число
возвращает «Приговор пути»
пример «пустая цепь не доходит никуда»
дано цепь равно пустой список
дано корни равно пустой список
дано сейчас равно 20250101000000
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_CHAIN" и слова равным "цепочка пуста"
тотальная функция «Шаг к корню»
принимает серт: список числа, корень: список числа, остальные: список список числа, сейчас: число
возвращает «Шаг пути»
тотальная функция «Шаг к верхнему»
принимает серт: список числа, остальные: список список числа, сейчас: число
возвращает «Шаг пути»
тотальная функция «Цепочка не дошла»
принимает серт: список числа
возвращает «Приговор пути»
пример «пустой сертификат — пустое имя издателя»
дано серт равно пустой список
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_CHAIN" и слова равным "цепь не дошла до корня: издатель "
тотальная функция «Проверить путь»
принимает цепь: список список числа, корни: список «Корень доверия», сейчас: число, узел: строка
возвращает «Приговор пути»
пример «сервер не прислал ни одного сертификата»
дано цепь равно пустой список
дано корни равно пустой список
дано сейчас равно 20261007120000
дано узел равно "example.org"
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_CHAIN" и слова равным "сервер не прислал сертификата"
тотальная функция «Начало связки корней»
возвращает «Ход связки корней»
пример «связка начинается снаружи сертификата и без тел»
ожидается вариант «Ход связки корней» с внутри равным нет и набрано равным "" и тела равным пустой список
тотальная функция «Приметы строчек»
возвращает список «Примета строчки»
пример «две приметы: начало и конец PEM»
ожидается [запись «Примета строчки» с «приставка» равным "-----BEGIN" и «вид» равным (вариант «Начало PEM»),
запись «Примета строчки» с «приставка» равным "-----END" и «вид» равным (вариант «Конец PEM»)]
тотальная функция «Вид строчки»
принимает строчка: строка
возвращает «Вид строчки»
пример «начало сертификата»
дано строчка равно "-----BEGIN CERTIFICATE-----"
ожидается вариант «Начало PEM»
тотальная функция «Шаг связки корней»
принимает ход: «Ход связки корней», строчка: строка
возвращает «Ход связки корней»
пример «строчка тела внутри сертификата набирается»
дано ход равно вариант «Ход связки корней» с внутри равным да и набрано равным "MII" и тела равным пустой список
дано строчка равно "Bk "
ожидается вариант «Ход связки корней» с внутри равным да и набрано равным "MIIBk" и тела равным пустой список
тотальная функция «Строчка набрана»
принимает ход: «Ход связки корней», строчка: строка
возвращает «Ход связки корней»
пример «снаружи сертификата строчка не набирается»
дано ход равно вариант «Ход связки корней» с внутри равным нет и набрано равным "" и тела равным пустой список
дано строчка равно "x"
ожидается вариант «Ход связки корней» с внутри равным нет и набрано равным "" и тела равным пустой список
тотальная функция «Корни из связки»
принимает связка: строка
возвращает список «Корень доверия»
пример «пустая связка — корней нет»
дано связка равно ""
ожидается пустой список
| Function | Termination | Claims |
|---|---|---|
| «Строчный октет» | доказано композицией | — |
| «Строчные октеты» | доказано композицией | доказано 1 из 1 |
| «Октеты имени» | доказано композицией | — |
| «Метка в месте» | доказано композицией | — |
| «Последний или ноль» | доказано композицией | — |
| «Место с меткой» | доказано композицией | — |
| «Места расширений» | доказано композицией | — |
| «Опознаватель расширения» | доказано композицией | — |
| «Расширение» | доказано композицией | — |
| «Имена узла» | доказано композицией | — |
| «Имена с меткой» | доказано композицией | — |
| «Удостоверяющий центр» | доказано композицией | — |
| «Хвост равен» | доказано композицией | — |
| «Имя подходит» | доказано композицией | — |
| «Имя узла сходится» | доказано композицией | — |
| «Ключ сертификата RSA» | доказано композицией | — |
| «Подпись звена верна» | доказано композицией | — |
| «Подпись RSA сходится» | доказано композицией | — |
| «Время сертификата» | доказано композицией | — |
| «Первый отказ» | доказано композицией | — |
| «Правило» | доказано композицией | — |
| «Назвать» | доказано композицией | — |
| «С именами» | доказано композицией | — |
| «Звено к корню» | доказано композицией | — |
| «Приговор звена к корню» | доказано композицией | — |
| «Звено к верхнему» | доказано композицией | — |
| «Приговор звена к верхнему» | доказано композицией | — |
| «Корень доверия» | доказано композицией | — |
| «Корень издателя» | доказано композицией | — |
| «Довести до корня» | доказано структурой | — |
| «Шаг к корню» | доказано композицией | — |
| «Шаг к верхнему» | доказано композицией | — |
| «Цепочка не дошла» | доказано композицией | — |
| «Проверить путь» | доказано композицией | — |
| «Начало связки корней» | доказано композицией | — |
| «Приметы строчек» | доказано композицией | — |
| «Вид строчки» | доказано композицией | — |
| «Шаг связки корней» | доказано композицией | — |
| «Строчка набрана» | доказано композицией | — |
| «Корни из связки» | доказано композицией | — |
«CLI»
flang/stdlib/cli.flang — functions 32; the kernel ledger was taken from this version of the file
тип «Флаг»
вариант «Флаг» содержит имя: строка, «со значением»: признак, обязателен: признак, «по умолчанию»: строка, описание: строка
тип «Объявление»
вариант «Объявление» содержит программа: строка, назначение: строка, флаги: список «Флаг», позиционные: список строки
тип «Значение флага»
вариант «Значение флага» содержит имя: строка, значение: строка, задан: признак
тип «Итог доводов»
вариант «Доводы разобраны» содержит флаги: список «Значение флага», позиционные: список строки
вариант «Неизвестный флаг» содержит имя: строка
вариант «Пропущено значение» содержит имя: строка
вариант «Лишнее значение» содержит имя: строка
вариант «Флаг задан дважды» содержит имя: строка
вариант «Нет обязательного флага» содержит имя: строка
вариант «Позиционных не хватает» содержит имя: строка
вариант «Лишний довод» содержит довод: строка
вариант «Запрошена справка»
тип «Ход доводов»
вариант «Идёт разбор» содержит собрано: список «Значение флага», места: список строки, ждёт: строка, «флаги закрыты»: признак
вариант «Разбор прерван» содержит итог: «Итог доводов»
тотальная функция «Флаг объявлен»
принимает флаги: список «Флаг», имя: строка
возвращает признак
обеспечивает «флаг объявлен ровно тогда, когда его имя стоит среди имён флагов» результат равен ((отобразить флаги как флаг → флаг.имя) содержит имя)
пример «Объявленный флаг находится»
дано флаги равно [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать"]
дано имя равно "выход"
ожидается да
тотальная функция «Флаг берёт значение»
принимает флаги: список «Флаг», имя: строка
возвращает признак
обеспечивает «необъявленный флаг значения не берёт» если не («Флаг объявлен» от флаги и имя) то (результат равен нет) иначе да
пример «Флаг со значением берёт значение»
дано флаги равно [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности"]
дано имя равно "выход"
ожидается да
тотальная функция «Задан среди значений»
принимает значения: список «Значение флага», имя: строка
возвращает признак
обеспечивает «задан ровно тогда, когда имя стоит среди имён значений» результат равен ((отобразить значения как пара → пара.имя) содержит имя)
пример «Заданный флаг находится»
дано значения равно [вариант «Значение флага» с имя равным "формат" и значение равным "json" и задан равным да]
дано имя равно "формат"
ожидается да
тотальная функция «Значение среди значений»
принимает значения: список «Значение флага», имя: строка
возвращает строка
обеспечивает «у незаданного флага значение пусто» если не («Задан среди значений» от значения и имя) то (результат равен "") иначе да
пример «Значение заданного флага»
дано значения равно [вариант «Значение флага» с имя равным "формат" и значение равным "json" и задан равным да]
дано имя равно "формат"
ожидается "json"
тотальная функция «Без дефиса»
принимает текст: строка
возвращает строка
обеспечивает «снимается ровно один знак, а с пустого снимать нечего» (длина результат) равен (если (длина текст) равен 0 то 0 иначе ((длина текст) минус 1))
пример «Дефис снимается»
дано текст равно "-x"
ожидается "x"
тотальная функция «Имя из довода»
принимает довод: строка
возвращает строка
обеспечивает «в имени флага нет знака равно» не (результат содержит "=")
обеспечивает «имя короче довода на два дефиса» (длина результат) не больше (длина довод)
пример «Имя без значения»
дано довод равно "--формат"
ожидается "формат"
тотальная функция «Значение из довода»
принимает довод: строка
возвращает строка
обеспечивает «без знака равно значения нет» если не (довод содержит "=") то (результат равен "") иначе да
пример «Значение после знака равно»
дано довод равно "--формат=json"
ожидается "json"
тотальная функция «Начальный ход»
возвращает «Ход доводов»
обеспечивает «в начале ничего не собрано, ничего не ждётся и флаги открыты» разбор результат
случай вариант «Идёт разбор» с собрано как собрано и места как места и ждёт как ожидание и «флаги закрыты» как закрыты
то ((длина собрано) равен 0) и притом ((длина места) равен 0) и притом (ожидание равен "") и притом (не закрыты)
случай любое
то нет
пример «Начальный ход пуст»
ожидается вариант «Идёт разбор» с собрано равным [] и места равным [] и ждёт равным "" и «флаги закрыты» равным нет
тотальная функция «Уложить флаг»
принимает объявление: «Объявление», собрано: список «Значение флага», места: список строки, довод: строка
возвращает «Ход доводов»
обеспечивает «необъявленный флаг прерывает разбор своим именем» если не («Флаг объявлен» от объявление.флаги и («Имя из довода» от довод)) то (результат равен (вариант «Разбор прерван» с итог равным (вариант «Неизвестный флаг» с имя равным («Имя из довода» от довод)))) иначе да
обеспечивает «повтор объявленного флага прерывает разбор» если («Флаг объявлен» от объявление.флаги и («Имя из довода» от довод)) и притом («Задан среди значений» от собрано и («Имя из довода» от довод)) то (результат равен (вариант «Разбор прерван» с итог равным (вариант «Флаг задан дважды» с имя равным («Имя из довода» от довод)))) иначе да
пример «Флаг со значением через знак равно ложится сразу»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "" и флаги равным [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности"] и позиционные равным ["вход"]
дано собрано равно []
дано места равно []
дано довод равно "--выход=a.txt"
ожидается вариант «Идёт разбор» с собрано равным [вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да] и места равным [] и ждёт равным "" и «флаги закрыты» равным нет
тотальная функция «Похож на флаг»
принимает довод: строка
возвращает признак
обеспечивает «похожий на флаг начинается дефисом» если результат то (довод начинается с "-") иначе да
обеспечивает «голый дефис на флаг не похож» если довод равен "-" то (не результат) иначе да
пример «Два дефиса и имя — похож»
дано довод равно "--выход"
ожидается да
тотальная функция «Уложить значение»
принимает собрано: список «Значение флага», места: список строки, имя: строка, довод: строка
возвращает «Ход доводов»
обеспечивает «довод, похожий на флаг, вместо значения — значение пропущено» если «Похож на флаг» от довод то (результат равен (вариант «Разбор прерван» с итог равным (вариант «Пропущено значение» с имя равным имя))) иначе да
обеспечивает «значение мест не трогает и ожидание снимает» разбор результат
случай вариант «Идёт разбор» с собрано как новое и места как новые и ждёт как дальше и «флаги закрыты» как закрыты
то (новые равен места) и притом (дальше равен "") и притом ((длина новое) равен ((длина собрано) плюс 1))
случай любое
то да
пример «Значение ложится к ожидавшему флагу»
дано собрано равно []
дано места равно ["in.txt"]
дано имя равно "выход"
дано довод равно "a.txt"
ожидается вариант «Идёт разбор» с собрано равным [вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да] и места равным ["in.txt"] и ждёт равным "" и «флаги закрыты» равным нет
тотальная функция «Уложить довод»
принимает объявление: «Объявление», собрано: список «Значение флага», места: список строки, довод: строка
возвращает «Ход доводов»
обеспечивает «слово без дефиса ложится последним позиционным» если не (довод начинается с "-") то (результат равен (вариант «Идёт разбор» с собрано равным собрано и места равным (добавить довод к места) и ждёт равным "" и «флаги закрыты» равным нет)) иначе да
обеспечивает «одиночный дефис с буквами — неизвестный флаг» если («Похож на флаг» от довод) и притом (не (довод начинается с "--")) то (результат равен (вариант «Разбор прерван» с итог равным (вариант «Неизвестный флаг» с имя равным («Имя из довода» от довод)))) иначе да
пример «Два дефиса закрывают флаги, собранное остаётся»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "" и флаги равным [] и позиционные равным []
дано собрано равно [вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да]
дано места равно ["a"]
дано довод равно "--"
ожидается вариант «Идёт разбор» с собрано равным [вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да] и места равным ["a"] и ждёт равным "" и «флаги закрыты» равным да
тотальная функция «Шаг довода»
принимает объявление: «Объявление», ход: «Ход доводов», довод: строка
возвращает «Ход доводов»
обеспечивает «прерванный разбор довод не меняет» разбор ход
случай вариант «Разбор прерван» с итог как беда
то результат равен ход
случай любое
то да
обеспечивает «при открытых флагах --help и -h прерывают разбор справкой» разбор ход
случай вариант «Идёт разбор» с собрано как собрано и места как места и ждёт как ожидание и «флаги закрыты» как закрыты
то закрыты или (не (довод равен "--help" или довод равен "-h")) или (результат равен (вариант «Разбор прерван» с итог равным (вариант «Запрошена справка»)))
случай любое
то да
пример «Прерванный разбор не меняется»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "" и флаги равным [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности"] и позиционные равным ["вход"]
дано ход равно вариант «Разбор прерван» с итог равным (вариант «Неизвестный флаг» с имя равным "цвет")
дано довод равно "in.txt"
ожидается вариант «Разбор прерван» с итог равным (вариант «Неизвестный флаг» с имя равным "цвет")
тотальная функция «Значение флага с запасным»
принимает флаг: «Флаг», собрано: список «Значение флага»
возвращает «Значение флага»
обеспечивает «имя значения — имя флага» результат.имя равен флаг.имя
обеспечивает «заданный флаг помечен заданным, незаданный берёт запасное» если («Задан среди значений» от собрано и флаг.имя) то (результат.задан равен да) иначе (результат равен (вариант «Значение флага» с имя равным флаг.имя и значение равным флаг.«по умолчанию» и задан равным нет))
пример «Заданный флаг берёт своё значение»
дано флаг равно вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать"
дано собрано равно [вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да]
ожидается вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да
тотальная функция «Заполнить флаги»
принимает флаги: список «Флаг», собрано: список «Значение флага»
возвращает список «Значение флага»
обеспечивает «значений ровно столько, сколько флагов» (длина результат) равен (длина флаги)
пример «Заданный берёт своё, незаданный — запасное»
дано флаги равно [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности"]
дано собрано равно [вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да]
ожидается [вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да,
вариант «Значение флага» с имя равным "подробно" и значение равным "" и задан равным нет]
тотальная функция «Первый незаданный обязательный»
принимает флаги: список «Флаг», собрано: список «Значение флага»
возвращает строка
обеспечивает «названный флаг объявлен» (результат равен "") или («Флаг объявлен» от флаги и результат)
обеспечивает «названный флаг не задан» (результат равен "") или (не («Задан среди значений» от собрано и результат))
пример «Обязательный не задан — он и назван»
дано флаги равно [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "формат" и «со значением» равным да и обязателен равным да и «по умолчанию» равным "" и описание равным "формат вывода"]
дано собрано равно []
ожидается "формат"
тотальная функция «Проверить места»
принимает объявление: «Объявление», значения: список «Значение флага», места: список строки
возвращает «Итог доводов»
обеспечивает «мест ровно столько, сколько объявлено, — доводы разобраны как есть» если (длина места) равен (длина объявление.позиционные) то (результат равен (вариант «Доводы разобраны» с флаги равным значения и позиционные равным места)) иначе да
обеспечивает «мест меньше объявленного — не хватает» если (длина места) меньше (длина объявление.позиционные) то (результат равен (вариант «Позиционных не хватает» с имя равным (элемент ((длина места) плюс 1) в объявление.позиционные))) иначе да
обеспечивает «мест больше объявленного — первый лишний назван» если (длина места) больше (длина объявление.позиционные) то (результат равен (вариант «Лишний довод» с довод равным (элемент ((длина объявление.позиционные) плюс 1) в места))) иначе да
пример «Одно место на одно объявленное»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "" и флаги равным [] и позиционные равным ["вход"]
дано значения равно []
дано места равно ["in.txt"]
ожидается вариант «Доводы разобраны» с флаги равным [] и позиционные равным ["in.txt"]
тотальная функция «Завершить разбор»
принимает объявление: «Объявление», ход: «Ход доводов»
возвращает «Итог доводов»
обеспечивает «прерванный ход отдаёт свой итог» разбор ход
случай вариант «Разбор прерван» с итог как беда
то результат равен беда
случай любое
то да
обеспечивает «в разобранном столько значений, сколько флагов объявлено, и столько мест, сколько объявлено» разбор результат
случай вариант «Доводы разобраны» с флаги как значения и позиционные как места
то ((длина значения) равен (длина объявление.флаги)) и притом ((длина места) равен (длина объявление.позиционные))
случай любое
то да
пример «Прерванный ход отдаёт свой итог»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "" и флаги равным [] и позиционные равным []
дано ход равно вариант «Разбор прерван» с итог равным (вариант «Неизвестный флаг» с имя равным "цвет")
ожидается вариант «Неизвестный флаг» с имя равным "цвет"
тотальная функция «Разобрать доводы»
принимает объявление: «Объявление», доводы: список строки
возвращает «Итог доводов»
обеспечивает «в разобранном столько значений флагов, сколько флагов в объявлении» разбор результат
случай вариант «Доводы разобраны» с флаги как значения и позиционные как места
то (длина значения) равен (длина объявление.флаги)
случай любое
то да
обеспечивает «позиционных ровно столько, сколько объявлено» разбор результат
случай вариант «Доводы разобраны» с флаги как значения и позиционные как места
то (длина места) равен (длина объявление.позиционные)
случай любое
то да
пример «Флаг со значением и позиционный довод»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "" и флаги равным [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности"] и позиционные равным ["вход"]
дано доводы равно ["--выход", "a.txt", "in.txt"]
ожидается вариант «Доводы разобраны» с флаги равным [вариант «Значение флага» с имя равным "выход" и значение равным "a.txt" и задан равным да, вариант «Значение флага» с имя равным "подробно" и значение равным "" и задан равным нет] и позиционные равным ["in.txt"]
тотальная функция «Значение флага по имени»
принимает итог: «Итог доводов», имя: строка
возвращает строка
обеспечивает «у разобранных доводов — значение из списка, у отказа — пусто» разбор итог
случай вариант «Доводы разобраны» с флаги как значения и позиционные как места
то результат равен («Значение среди значений» от значения и имя)
случай любое
то результат равен ""
пример «Значение по имени»
дано итог равно вариант «Доводы разобраны» с флаги равным [вариант «Значение флага» с имя равным "формат" и значение равным "json" и задан равным да] и позиционные равным ["in.txt"]
дано имя равно "формат"
ожидается "json"
тотальная функция «Флаг задан»
принимает итог: «Итог доводов», имя: строка
возвращает признак
обеспечивает «у разобранных доводов — по пометке в списке, у отказа — нет» разбор итог
случай вариант «Доводы разобраны» с флаги как значения и позиционные как места
то результат равен ((отфильтровать значения где пара → (пара.имя равен имя) и притом пара.задан) не равен [])
случай любое
то результат равен нет
пример «Заданный флаг»
дано итог равно вариант «Доводы разобраны» с флаги равным [вариант «Значение флага» с имя равным "формат" и значение равным "json" и задан равным да, вариант «Значение флага» с имя равным "выход" и значение равным "out.txt" и задан равным нет] и позиционные равным ["in.txt"]
дано имя равно "формат"
ожидается да
тотальная функция «Позиционный по номеру»
принимает итог: «Итог доводов», номер: неотрицательное
возвращает строка
обеспечивает «у отказа позиционных нет» разбор итог
случай вариант «Доводы разобраны» с флаги как значения и позиционные как места
то результат равен («Строка по номеру» от места и номер и "")
случай любое
то результат равен ""
пример «Первый позиционный»
дано итог равно вариант «Доводы разобраны» с флаги равным [] и позиционные равным ["in.txt", "out.txt"]
дано номер равно 1
ожидается "in.txt"
тотальная функция «Строка флага в справке»
принимает флаг: «Флаг»
возвращает строка
обеспечивает «строка флага начинается отступом и двумя дефисами» результат начинается с " --"
обеспечивает «строка флага называет его имя» результат содержит флаг.имя
обеспечивает «обязательный флаг назван обязательным» если флаг.обязателен то (результат содержит "(обязателен)") иначе да
пример «Флаг со значением и запасным»
дано флаг равно вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать"
ожидается " --выход <значение> куда писать (по умолчанию: out.txt)"
тотальная функция «Строка использования»
принимает объявление: «Объявление»
возвращает строка
обеспечивает «строка использования начинается словом Использование» результат начинается с "Использование: "
обеспечивает «строка использования называет программу» результат содержит объявление.программа
пример «Программа с одним позиционным»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "" и флаги равным [] и позиционные равным ["вход"]
ожидается "Использование: п [ключи] <вход>"
тотальная функция «Справка называет все флаги»
принимает объявление: «Объявление», текст: строка
возвращает признак
обеспечивает «без флагов называть нечего» если (длина объявление.флаги) равен 0 то (результат равен да) иначе да
пример «Оба флага названы»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "" и флаги равным [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности"] и позиционные равным ["вход"]
дано текст равно "--выход --подробно"
ожидается да
тотальная функция «Справка»
принимает объявление: «Объявление»
возвращает строка
обеспечивает «справка начинается словом Использование» результат начинается с "Использование: "
обеспечивает «справка называет имя каждого флага» («Справка называет все флаги» от объявление и результат) равен да
пример «Справка из объявления с двумя флагами»
дано объявление равно вариант «Объявление» с программа равным "п" и назначение равным "Пример." и флаги равным [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности"] и позиционные равным ["вход"]
ожидается "Использование: п [ключи] <вход>\nПример.\n --выход <значение> куда писать (по умолчанию: out.txt)\n --подробно печатать подробности"
тотальная функция «Доводы из строки»
принимает текст: строка
возвращает список строки
обеспечивает «пустого довода не бывает» не (результат содержит "")
обеспечивает «доводов не больше, чем кусков между пробелами» (длина результат) не больше (длина (разделить текст по " "))
пример «Доводы разделяются пробелами»
дано текст равно "--формат json in.txt"
ожидается ["--формат", "json", "in.txt"]
тотальная функция «Объявление примера»
возвращает «Объявление»
обеспечивает «программа примера — сборка» результат.программа равен "сборка"
обеспечивает «у сборки три флага и один позиционный» ((длина результат.флаги) равен 3) и притом ((длина результат.позиционные) равен 1)
пример «Объявление сборки»
ожидается вариант «Объявление» с программа равным "сборка" и назначение равным "Собрать вход в выход." и флаги равным [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности", вариант «Флаг» с имя равным "формат" и «со значением» равным да и обязателен равным да и «по умолчанию» равным "" и описание равным "формат вывода"] и позиционные равным ["вход"]
тотальная функция «Объявление примера с цветом»
возвращает «Объявление»
обеспечивает «это объявление сборки плюс ровно один флаг» (длина результат.флаги) равен ((длина («Объявление примера»).флаги) плюс 1)
обеспечивает «новый флаг — цвет» («Флаг объявлен» от результат.флаги и "цвет") и притом (не («Флаг объявлен» от («Объявление примера»).флаги и "цвет"))
пример «Объявление сборки с флагом цвета»
ожидается вариант «Объявление» с программа равным "сборка" и назначение равным "Собрать вход в выход." и флаги равным [вариант «Флаг» с имя равным "выход" и «со значением» равным да и обязателен равным нет и «по умолчанию» равным "out.txt" и описание равным "куда писать", вариант «Флаг» с имя равным "подробно" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "печатать подробности", вариант «Флаг» с имя равным "формат" и «со значением» равным да и обязателен равным да и «по умолчанию» равным "" и описание равным "формат вывода", вариант «Флаг» с имя равным "цвет" и «со значением» равным нет и обязателен равным нет и «по умолчанию» равным "" и описание равным "красить вывод"] и позиционные равным ["вход"]
тотальная функция «Разбор примера»
принимает доводы: список строки
возвращает «Итог доводов»
обеспечивает «у разобранной сборки три значения флагов и один позиционный» разбор результат
случай вариант «Доводы разобраны» с флаги как значения и позиционные как места
то ((длина значения) равен 3) и притом ((длина места) равен 1)
случай любое
то да
пример «Счастливый путь: формат, переключатель и вход»
дано доводы равно ["--формат", "json", "--подробно", "in.txt"]
ожидается вариант «Доводы разобраны» с флаги равным [вариант «Значение флага» с имя равным "выход" и значение равным "out.txt" и задан равным нет, вариант «Значение флага» с имя равным "подробно" и значение равным "" и задан равным да, вариант «Значение флага» с имя равным "формат" и значение равным "json" и задан равным да] и позиционные равным ["in.txt"]
тотальная функция «Справка примера»
возвращает строка
обеспечивает «справка сборки начинается её именем» результат начинается с "Использование: сборка"
обеспечивает «флага цвета в справке сборки нет» не (результат содержит "--цвет")
пример «Справка сборки»
ожидается "Использование: сборка [ключи] <вход>\nСобрать вход в выход.\n --выход <значение> куда писать (по умолчанию: out.txt)\n --подробно печатать подробности\n --формат <значение> формат вывода (обязателен)"
тотальная функция «Справка примера с цветом»
возвращает строка
обеспечивает «добавленный флаг появился в справке сам» результат содержит "--цвет"
обеспечивает «справка с цветом начинается справкой без цвета» результат начинается с («Справка примера»)
пример «Справка сборки с флагом цвета»
ожидается "Использование: сборка [ключи] <вход>\nСобрать вход в выход.\n --выход <значение> куда писать (по умолчанию: out.txt)\n --подробно печатать подробности\n --формат <значение> формат вывода (обязателен)\n --цвет красить вывод"
| Function | Termination | Claims |
|---|---|---|
| «Флаг объявлен» | доказано композицией | доказано 0 из 1; «флаг объявлен ровно тогда, когда его имя стоит среди имён флагов» — сетка |
| «Флаг берёт значение» | доказано композицией | доказано 0 из 1; «необъявленный флаг значения не берёт» — сетка |
| «Задан среди значений» | доказано композицией | доказано 0 из 1; «задан ровно тогда, когда имя стоит среди имён значений» — сетка |
| «Значение среди значений» | доказано структурой | доказано 0 из 1; «у незаданного флага значение пусто» — сетка |
| «Без дефиса» | доказано композицией | доказано 0 из 1; «снимается ровно один знак, а с пустого снимать нечего» — сетка |
| «Имя из довода» | доказано композицией | доказано 0 из 2; «в имени флага нет знака равно» — сетка; «имя короче довода на два дефиса» — сетка |
| «Значение из довода» | доказано композицией | доказано 0 из 1; «без знака равно значения нет» — сетка |
| «Начальный ход» | доказано композицией | доказано 1 из 1 |
| «Уложить флаг» | доказано композицией | доказано 1 из 2; «повтор объявленного флага прерывает разбор» — сетка |
| «Похож на флаг» | доказано композицией | доказано 1 из 2; «голый дефис на флаг не похож» — сетка |
| «Уложить значение» | доказано композицией | доказано 2 из 2 |
| «Уложить довод» | доказано композицией | доказано 0 из 2; «слово без дефиса ложится последним позиционным» — сетка; «одиночный дефис с буквами — неизвестный флаг» — сетка |
| «Шаг довода» | доказано композицией | доказано 0 из 2; «прерванный разбор довод не меняет» — сетка; «при открытых флагах --help и -h прерывают разбор справкой» — сетка |
| «Значение флага с запасным» | доказано композицией | доказано 0 из 2; «имя значения — имя флага» — сетка; «заданный флаг помечен заданным, незаданный берёт запасное» — сетка |
| «Заполнить флаги» | доказано композицией | доказано 1 из 1 |
| «Первый незаданный обязательный» | доказано структурой | доказано 1 из 2; «названный флаг объявлен» — сетка |
| «Проверить места» | доказано композицией | доказано 3 из 3 |
| «Завершить разбор» | доказано композицией | доказано 0 из 2; «прерванный ход отдаёт свой итог» — сетка; «в разобранном столько значений, сколько флагов объявлено, и столько мест, сколько объявлено» — сетка |
| «Разобрать доводы» | доказано композицией | доказано 0 из 2; «в разобранном столько значений флагов, сколько флагов в объявлении» — сетка; «позиционных ровно столько, сколько объявлено» — сетка |
| «Значение флага по имени» | доказано композицией | доказано 0 из 1; «у разобранных доводов — значение из списка, у отказа — пусто» — сетка |
| «Флаг задан» | доказано композицией | доказано 0 из 1; «у разобранных доводов — по пометке в списке, у отказа — нет» — сетка |
| «Позиционный по номеру» | доказано композицией | доказано 0 из 1; «у отказа позиционных нет» — сетка |
| «Строка флага в справке» | доказано композицией | доказано 0 из 3; «строка флага начинается отступом и двумя дефисами» — сетка; «строка флага называет его имя» — сетка; «обязательный флаг назван обязательным» — сетка |
| «Строка использования» | доказано композицией | доказано 0 из 2; «строка использования начинается словом Использование» — сетка; «строка использования называет программу» — сетка |
| «Справка называет все флаги» | доказано композицией | доказано 1 из 1 |
| «Справка» | доказано композицией | доказано 0 из 2; «справка начинается словом Использование» — сетка; «справка называет имя каждого флага» — сетка |
| «Доводы из строки» | доказано композицией | доказано 1 из 2; «пустого довода не бывает» — сетка |
| «Объявление примера» | доказано композицией | доказано 2 из 2 |
| «Объявление примера с цветом» | доказано композицией | доказано 2 из 2 |
| «Разбор примера» | доказано композицией | доказано 0 из 1; «у разобранной сборки три значения флагов и один позиционный» — сетка |
| «Справка примера» | доказано композицией | доказано 2 из 2 |
| «Справка примера с цветом» | доказано композицией | доказано 2 из 2 |
«Code page data»
flang/stdlib/code-page-data.flang — functions 2; the kernel ledger was never taken; take it: docs:library-status
тотальная функция «Верхняя половина CP1251»
возвращает список числа
обеспечивает «знаков верхней половины 128» (длина результат) равен 128
тотальная функция «Верхняя половина KOI8-R»
возвращает список числа
обеспечивает «знаков верхней половины 128» (длина результат) равен 128
«Revocation list»
flang/stdlib/crl.flang — functions 32; the kernel ledger was taken from this version of the file
тотальная функция «Октеты списка из PEM»
принимает текст: строка
возвращает список числа
обеспечивает «октетов списка не больше, чем знаков в его тексте» (длина результат) не больше (длина текст)
обеспечивает «октетов списка не больше, чем знаков в теле PEM» (длина результат) не больше (длина («Тело PEM» от текст))
пример «Пустой PEM даёт ни одного октета»
дано текст равно ""
ожидается пустой список
тотальная функция «Место тела списка»
принимает октеты: список числа
возвращает число
обеспечивает «тело списка начинается не раньше третьего октета» если результат больше 0 то результат не меньше 3 иначе да
пример «Тело простого списка»
дано октеты равно [48, 8, 48, 3, 2, 1, 1, 48, 1, 5]
ожидается 3
тотальная функция «Сдвиг версии списка»
принимает октеты: список числа
возвращает число
обеспечивает «сдвиг версии списка — ноль или один, третьего не бывает» (результат равен 0) или (результат равен 1)
обеспечивает «целое на первом месте тела — сдвиг один» если («Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела списка» от октеты) и 1)).«метка» равен 2 то (результат равен 1) иначе да
обеспечивает «нет целого на первом месте тела — сдвига нет» если не ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела списка» от октеты) и 1)).«метка» равен 2) то (результат равен 0) иначе да
пример «Версия названа целым — сдвиг один»
дано октеты равно [48, 8, 48, 6, 2, 1, 1, 48, 1, 5]
ожидается 1
тотальная функция «Место поля списка»
принимает октеты: список числа, номер: число
возвращает число
обеспечивает «место поля списка лежит внутри октетов или равно нулю» (результат равен 0) или (результат не больше (длина октеты))
обеспечивает «за концом состава место поля нулевое» если ((номер плюс («Сдвиг версии списка» от октеты)) меньше 1) или ((номер плюс («Сдвиг версии списка» от октеты)) больше (длина («Вложенные» от октеты и («Место тела списка» от октеты)))) то результат равен 0 иначе да
пример «Алгоритм подписи — первое поле после необязательной версии»
дано октеты равно [48, 10, 48, 8, 2, 1, 1, 48, 1, 5, 48, 1, 5]
дано номер равно 1
ожидается 8
тотальная функция «Метка поля списка»
принимает октеты: список числа, номер: число
возвращает число
обеспечивает «метка неотрицательна» результат не меньше 0
обеспечивает «метка поля списка — октет на месте этого поля» результат равен («Октет» от октеты и («Место поля списка» от октеты и номер))
пример «Пустой вход даёт нулевую метку, а не падение»
дано октеты равно пустой список
дано номер равно 4
ожидается 0
тотальная функция «Версия списка»
принимает октеты: список числа
возвращает число
обеспечивает «версия списка — первая или вторая» (результат равен 1) или (результат равен 2)
обеспечивает «без поля версии список считается первым» если («Сдвиг версии списка» от октеты) равен 0 то результат равен 1 иначе да
обеспечивает «есть поле версии и в нём единица — список второй» если не ((«Сдвиг версии списка» от октеты) равен 0) то (если («Целое DER» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Место тела списка» от октеты) и 1))) равен 1 то (результат равен 2) иначе да) иначе да
обеспечивает «есть поле версии, а в нём не единица — список первый» если не ((«Сдвиг версии списка» от октеты) равен 0) то (если не ((«Целое DER» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Место тела списка» от октеты) и 1))) равен 1) то (результат равен 1) иначе да) иначе да
пример «Версия названа целым 1 — значит вторая»
дано октеты равно [48, 10, 48, 8, 2, 1, 1, 48, 1, 5, 48, 1, 5]
ожидается 2
тотальная функция «Алгоритм подписи списка»
принимает октеты: список числа
возвращает строка
обеспечивает «имя алгоритма непусто у непустого списка» если (длина октеты) больше 4 то (длина результат) больше 0 иначе да
обеспечивает «RSA с SHA-256 в списке назван своим именем» если («Идентификатор объекта» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Вложенное по счёту» от октеты и 1 и 2) и 1))) равен "1.2.840.113549.1.1.11" то (результат равен "sha256WithRSAEncryption") иначе да
обеспечивает «SHA-384 с RSA в списке назван своим именем» если не ((«Идентификатор объекта» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Вложенное по счёту» от октеты и 1 и 2) и 1))) равен "1.2.840.113549.1.1.11") то (если («Идентификатор объекта» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Вложенное по счёту» от октеты и 1 и 2) и 1))) равен "1.2.840.113549.1.1.12" то (результат равен "sha384WithRSAEncryption") иначе да) иначе да
пример «Пустой вход не роняет, а даёт пустое имя»
дано октеты равно пустой список
ожидается ""
тотальная функция «Октеты подписи списка»
принимает октеты: список числа
возвращает список числа
обеспечивает «подпись не длиннее всего списка» (длина результат) не больше (длина октеты)
обеспечивает «подпись не длиннее содержимого своего BIT STRING» (длина результат) не больше (длина («Содержимое» от октеты и («Вложенное по счёту» от октеты и 1 и 3)))
пример «Пустой вход не роняет»
дано октеты равно пустой список
ожидается пустой список
тотальная функция «Подпись списка»
принимает октеты: список числа
возвращает строка
обеспечивает «подпись печатается не длиннее трёх знаков на октет списка» (длина результат) не больше ((длина октеты) умножить на 3)
обеспечивает «подпись печатается не длиннее трёх знаков на октет своих октетов» (длина результат) не больше ((длина («Октеты подписи списка» от октеты)) умножить на 3)
пример «Пустой вход даёт пустую подпись»
дано октеты равно пустой список
ожидается ""
тотальная функция «Издатель списка»
принимает октеты: список числа
возвращает строка
обеспечивает «издатель печатается не длиннее, чем весь список знаками» (длина результат) не больше ((длина октеты) умножить на 3)
пример «Пустой вход не роняет»
дано октеты равно пустой список
ожидается ""
тотальная функция «Выпущен»
принимает октеты: список числа
возвращает «Время DER»
обеспечивает «у времени выпуска месяц не больше девяноста девяти» результат.«месяц» не больше 99
обеспечивает «чужая метка выпуска названа бедой, а не угадана» если не ((«Разобрать голову» от октеты и («Место поля списка» от октеты и 3)).«метка» равен 23) то (если не ((«Разобрать голову» от октеты и («Место поля списка» от октеты и 3)).«метка» равен 24) то (результат.«беда» равен "не UTCTime и не GeneralizedTime") иначе да) иначе да
пример «Пустой вход даёт время с бедой, а не догадку»
дано октеты равно пустой список
ожидается запись «Время DER» с «год» равным 0 и «месяц» равным 0 и «день» равным 0 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным "не UTCTime и не GeneralizedTime"
тотальная функция «Время ли метка»
принимает метка: число
возвращает признак
обеспечивает «временем считаются ровно две метки: UTCTime и GeneralizedTime» если результат то ((метка равен 23) или (метка равен 24)) иначе да
обеспечивает «метка UTCTime — это время» если метка равен 23 то (результат равен да) иначе да
обеспечивает «метка GeneralizedTime — это время» если метка равен 24 то (результат равен да) иначе да
обеспечивает «чужая метка временем не считается» если не (метка равен 23) то (если не (метка равен 24) то (результат равен нет) иначе да) иначе да
пример «UTCTime»
дано метка равно 23
ожидается да
тотальная функция «Есть следующий выпуск»
принимает октеты: список числа
возвращает признак
обеспечивает «пустой список следующего выпуска не обещает» если (длина октеты) равен 0 то результат равен нет иначе да
обеспечивает «UTCTime на четвёртом поле — следующий выпуск назван» если («Метка поля списка» от октеты и 4) равен 23 то (результат равен да) иначе да
обеспечивает «GeneralizedTime на четвёртом поле — следующий выпуск назван» если («Метка поля списка» от октеты и 4) равен 24 то (результат равен да) иначе да
обеспечивает «чужая метка на четвёртом поле — следующего выпуска нет» если не ((«Метка поля списка» от октеты и 4) равен 23) то (если не ((«Метка поля списка» от октеты и 4) равен 24) то (результат равен нет) иначе да) иначе да
пример «Пустой вход»
дано октеты равно пустой список
ожидается нет
тотальная функция «Следующий выпуск»
принимает октеты: список числа
возвращает «Время DER»
обеспечивает «у времени следующего выпуска месяц не больше девяноста девяти» результат.«месяц» не больше 99
обеспечивает «чужая метка следующего выпуска названа бедой, а не угадана» если не ((«Разобрать голову» от октеты и (если («Есть следующий выпуск» от октеты) то («Место поля списка» от октеты и 4) иначе 0)).«метка» равен 23) то (если не ((«Разобрать голову» от октеты и (если («Есть следующий выпуск» от октеты) то («Место поля списка» от октеты и 4) иначе 0)).«метка» равен 24) то (результат.«беда» равен "не UTCTime и не GeneralizedTime") иначе да) иначе да
пример «Пустой вход даёт время с бедой, а не догадку»
дано октеты равно пустой список
ожидается запись «Время DER» с «год» равным 0 и «месяц» равным 0 и «день» равным 0 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным "не UTCTime и не GeneralizedTime"
тотальная функция «Срок списка вышел»
принимает есть: признак, следующий: число, сейчас: число
возвращает признак
обеспечивает «список без названного срока считается просроченным» если не есть то результат равен да иначе да
обеспечивает «срок назван — просрочен ровно тогда, когда сейчас позже срока» если не (не есть) то (результат равен (сейчас больше следующий)) иначе да
пример «Срока нет — просрочен»
дано есть равно нет
дано следующий равно 0
дано сейчас равно 20260823000000
ожидается да
тотальная функция «Список просрочен»
принимает октеты: список числа, сейчас: число
возвращает признак
обеспечивает «пустой список просрочен: читать нечего» если (длина октеты) равен 0 то результат равен да иначе да
обеспечивает «список без названного срока просрочен» если не («Есть следующий выпуск» от октеты) то результат равен да иначе да
обеспечивает «срок назван — просрочен ровно тогда, когда сейчас позже срока» если не (не («Есть следующий выпуск» от октеты)) то (результат равен (сейчас больше («Время числом» от («Следующий выпуск» от октеты)))) иначе да
пример «Пустой вход просрочен всегда»
дано октеты равно пустой список
дано сейчас равно 20260823000000
ожидается да
объект «Запись отзыва»
«серийный»: строка
«отозван»: «Время DER»
«числом»: число
«беда»: строка
тотальная функция «Место перечня»
принимает октеты: список числа
возвращает число
обеспечивает «место перечня либо ноль, либо лежит внутри октетов» (результат равен 0) или (результат не больше (длина октеты))
обеспечивает «не последовательность на месте перечня — значит перечня нет» если не ((«Разобрать голову» от октеты и («Место поля списка» от октеты и (если («Есть следующий выпуск» от октеты) то 5 иначе 4))).«метка» равен 48) то результат равен 0 иначе да
обеспечивает «последовательность на месте перечня — она и есть перечень» если («Разобрать голову» от октеты и («Место поля списка» от октеты и (если («Есть следующий выпуск» от октеты) то 5 иначе 4))).«метка» равен 48 то (результат равен («Место поля списка» от октеты и (если («Есть следующий выпуск» от октеты) то 5 иначе 4))) иначе да
пример «Пустой вход даёт ноль»
дано октеты равно пустой список
ожидается 0
тотальная функция «Места записей»
принимает октеты: список числа
возвращает список числа
обеспечивает «мест записей не больше, чем октетов во всём списке» (длина результат) не больше (длина октеты)
обеспечивает «нет перечня — нет и мест записей» если («Место перечня» от октеты) равен 0 то (длина результат) равен 0 иначе да
обеспечивает «нет перечня — мест ни одного» если («Место перечня» от октеты) равен 0 то (результат равен пустой список) иначе да
обеспечивает «есть перечень — места берутся вложенными перечня» если не ((«Место перечня» от октеты) равен 0) то (результат равен («Вложенные» от октеты и («Место перечня» от октеты))) иначе да
пример «Перечня нет — мест нет»
дано октеты равно пустой список
ожидается пустой список
тотальная функция «Знак 16 заглавный»
принимает н: число
возвращает строка
обеспечивает «заглавная цифра — ровно один знак» (длина результат) равен 1
обеспечивает «вне шестнадцати цифра нулевая» если (н меньше 0) или (н больше 15) то (результат равен "0") иначе да
обеспечивает «внутри шестнадцати цифра берётся из азбуки» если не ((н меньше 0) или (н больше 15)) то (результат равен (символ (н плюс 1) в "0123456789ABCDEF")) иначе да
пример «Ноль»
дано н равно 0
ожидается "0"
тотальная функция «Октет 16 заглавным»
принимает октет: число
возвращает строка
обеспечивает «октет печатается заглавными ровно двумя знаками» (длина результат) равен 2
пример «Ноль»
дано октет равно 0
ожидается "00"
объект «Ход обрезки»
«набрано»: список числа
«начато»: признак
тотальная функция «Шаг обрезки»
принимает ход: «Ход обрезки», октет: число
возвращает «Ход обрезки»
обеспечивает «начатое число дальше не прерывается» если ход.«начато» то результат.«начато» равен да иначе да
обеспечивает «набранное прирастает не больше чем на один» (длина результат.«набрано») не больше ((длина ход.«набрано») плюс 1)
обеспечивает «начатое число берёт октет как есть» если ход.«начато» то (результат равен (запись «Ход обрезки» с «набрано» равным (добавить октет к ход.«набрано») и «начато» равным да)) иначе да
обеспечивает «не начатое число ведущий нуль отбрасывает» если не (ход.«начато») то (если октет равен 0 то (результат равен ход) иначе да) иначе да
обеспечивает «не начатое число ненулевой октет начинает» если не (ход.«начато») то (если не (октет равен 0) то (результат равен (запись «Ход обрезки» с «набрано» равным (добавить октет к ход.«набрано») и «начато» равным да)) иначе да) иначе да
пример «Число начато — берётся любой октет, и нулевой тоже»
дано ход равно запись «Ход обрезки» с «набрано» равным [7] и «начато» равным да
дано октет равно 0
ожидается запись «Ход обрезки» с «набрано» равным [7, 0] и «начато» равным да
тотальная функция «Ход обрезки нулей»
принимает октеты: список числа
возвращает «Ход обрезки»
обеспечивает «обрезка не удлиняет» (длина результат.«набрано») не больше (длина октеты)
пример «Ведущий нуль DER снимается»
дано октеты равно [0, 192, 255, 238, 0]
ожидается запись «Ход обрезки» с «набрано» равным [192, 255, 238, 0] и «начато» равным да
тотальная функция «Без ведущих нулей»
принимает октеты: список числа
возвращает список числа
обеспечивает «обрезка не удлиняет» (длина результат) не больше (длина октеты)
пример «Ведущий нуль DER снимается»
дано октеты равно [0, 192, 255, 238, 0]
ожидается [192, 255, 238, 0]
тотальная функция «Шаг печати номера»
принимает набрано: строка, октет: число
возвращает строка
обеспечивает «на каждый октет приписывается ровно два знака» (длина результат) равен ((длина набрано) плюс 2)
пример «К пустому приписывается пара знаков»
дано набрано равно ""
дано октет равно 171
ожидается "AB"
тотальная функция «Серийный номер шестнадцатеричным»
принимает октеты: список числа
возвращает строка
обеспечивает «от нуля остаются два нуля, а не пустая строка» если (длина («Без ведущих нулей» от октеты)) равен 0 то результат равен "00" иначе да
пример «Пусто — два нуля, как печатает openssl»
дано октеты равно пустой список
ожидается "00"
тотальная функция «Запись отзыва по месту»
принимает октеты: список числа, место: число, выпущен: число
возвращает «Запись отзыва»
обеспечивает «у записи без беды серийный номер непуст, а дата отзыва не раньше выпуска списка» если результат.«беда» равен "" то (((длина результат.«серийный») больше 0) и притом (результат.«числом» не меньше выпущен)) иначе да
пример «Пустой вход даёт запись с бедой, а не догадку»
дано октеты равно пустой список
дано место равно 0
дано выпущен равно 0
ожидается запись «Запись отзыва» с «серийный» равным "00" и «отозван» равным (запись «Время DER» с «год» равным 0 и «месяц» равным 0 и «день» равным 0 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным "не UTCTime и не GeneralizedTime") и «числом» равным 0 и «беда» равным "серийный номер записи пуст"
тотальная функция «Шаг записей»
принимает октеты: список числа, выпущен: число, набрано: список «Запись отзыва», место: число
возвращает список «Запись отзыва»
обеспечивает «шаг набирает ровно одну запись» (длина результат) равен ((длина набрано) плюс 1)
пример «Пустой вход даёт одну запись с бедой, а не падение»
дано октеты равно пустой список
дано выпущен равно 0
дано набрано равно пустой список
дано место равно 0
ожидается [запись «Запись отзыва» с «серийный» равным "00" и «отозван» равным (запись «Время DER» с «год» равным 0 и «месяц» равным 0 и «день» равным 0 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным "не UTCTime и не GeneralizedTime") и «числом» равным 0 и «беда» равным "серийный номер записи пуст"]
тотальная функция «Записи»
принимает октеты: список числа, места: список числа, выпущен: число
возвращает список «Запись отзыва»
обеспечивает «записей ровно столько, сколько разобранных мест» (длина результат) равен (длина места)
пример «Мест нет — записей нет»
дано октеты равно пустой список
дано места равно пустой список
дано выпущен равно 0
ожидается пустой список
тотальная функция «Перечень отзыва»
принимает октеты: список числа
возвращает список «Запись отзыва»
обеспечивает «записей отзыва не больше, чем октетов во всём списке» (длина результат) не больше (длина октеты)
обеспечивает «записей отзыва ровно столько, сколько мест в перечне» (длина результат) равен (длина («Места записей» от октеты))
пример «Пустой вход даёт пустой перечень»
дано октеты равно пустой список
ожидается пустой список
тотальная функция «Шаг поиска отзыва»
принимает серийный: строка, найдено: признак, отзыв: «Запись отзыва»
возвращает признак
обеспечивает «однажды найденное дальше не теряется» если найдено то (результат равен да) иначе да
обеспечивает «пока не найдено — решает сличение печатей номеров» если не найдено то (результат равен (отзыв.«серийный» равен серийный)) иначе да
пример «Уже найдено — так и остаётся»
дано серийный равно "1000"
дано найдено равно да
дано отзыв равно (запись «Запись отзыва» с «серийный» равным "2000" и «отозван» равным (запись «Время DER» с «год» равным 2026 и «месяц» равным 8 и «день» равным 23 и «час» равным 15 и «минута» равным 36 и «секунда» равным 57 и «беда» равным "") и «числом» равным 20260823153657 и «беда» равным "")
ожидается да
тотальная функция «Серийный номер отозван»
принимает серийный: строка, перечень: список «Запись отзыва»
возвращает признак
обеспечивает «в пустом перечне не отозван никто» если (длина перечень) равен 0 то результат равен нет иначе да
пример «Пустой перечень никого не отзывает»
дано серийный равно "1000"
дано перечень равно пустой список
ожидается нет
тотальная функция «Приговор номеру»
принимает серийный: строка, перечень: список «Запись отзыва», просрочен: признак
возвращает строка
обеспечивает «приговор непуст» (длина результат) больше 0
пример «Отозван по свежему списку»
дано серийный равно "1000"
дано перечень равно [(запись «Запись отзыва» с «серийный» равным "1000" и «отозван» равным (запись «Время DER» с «год» равным 2026 и «месяц» равным 8 и «день» равным 23 и «час» равным 15 и «минута» равным 36 и «секунда» равным 57 и «беда» равным "") и «числом» равным 20260823153657 и «беда» равным "")]
дано просрочен равно нет
ожидается "ОТОЗВАН"
| Function | Termination | Claims |
|---|---|---|
| «Октеты списка из PEM» | доказано композицией | доказано 1 из 2; «октетов списка не больше, чем знаков в его тексте» — сетка |
| «Место тела списка» | доказано композицией | доказано 0 из 1; «тело списка начинается не раньше третьего октета» — сетка |
| «Сдвиг версии списка» | доказано композицией | доказано 3 из 3 |
| «Место поля списка» | доказано композицией | доказано 1 из 2; «место поля списка лежит внутри октетов или равно нулю» — сетка |
| «Метка поля списка» | доказано композицией | доказано 1 из 2; «метка неотрицательна» — сетка |
| «Версия списка» | доказано композицией | доказано 4 из 4 |
| «Алгоритм подписи списка» | доказано композицией | доказано 2 из 3; «имя алгоритма непусто у непустого списка» — сетка |
| «Октеты подписи списка» | доказано композицией | доказано 2 из 2 |
| «Подпись списка» | доказано композицией | доказано 1 из 2; «подпись печатается не длиннее трёх знаков на октет списка» — сетка |
| «Издатель списка» | доказано композицией | доказано 1 из 1 |
| «Выпущен» | доказано композицией | доказано 2 из 2 |
| «Время ли метка» | доказано композицией | доказано 4 из 4 |
| «Есть следующий выпуск» | доказано композицией | доказано 3 из 4; «пустой список следующего выпуска не обещает» — сетка |
| «Следующий выпуск» | доказано композицией | доказано 2 из 2 |
| «Срок списка вышел» | доказано композицией | доказано 2 из 2 |
| «Список просрочен» | доказано композицией | доказано 2 из 3; «пустой список просрочен: читать нечего» — сетка |
| «Место перечня» | доказано композицией | доказано 2 из 3; «место перечня либо ноль, либо лежит внутри октетов» — сетка |
| «Места записей» | доказано композицией | доказано 3 из 4; «мест записей не больше, чем октетов во всём списке» — сетка |
| «Знак 16 заглавный» | доказано композицией | доказано 3 из 3 |
| «Октет 16 заглавным» | доказано композицией | доказано 1 из 1 |
| «Шаг обрезки» | доказано композицией | доказано 5 из 5 |
| «Ход обрезки нулей» | доказано композицией | доказано 1 из 1 |
| «Без ведущих нулей» | доказано композицией | доказано 1 из 1 |
| «Шаг печати номера» | доказано композицией | доказано 1 из 1 |
| «Серийный номер шестнадцатеричным» | доказано композицией | доказано 1 из 1 |
| «Запись отзыва по месту» | доказано композицией | доказано 0 из 1; «у записи без беды серийный номер непуст, а дата отзыва не раньше выпуска списка» — сетка |
| «Шаг записей» | доказано композицией | доказано 1 из 1 |
| «Записи» | доказано композицией | доказано 1 из 1 |
| «Перечень отзыва» | доказано композицией | доказано 1 из 2; «записей отзыва не больше, чем октетов во всём списке» — сетка |
| «Шаг поиска отзыва» | доказано композицией | доказано 2 из 2 |
| «Серийный номер отозван» | доказано композицией | доказано 1 из 1 |
| «Приговор номеру» | доказано композицией | доказано 1 из 1 |
«Date and time»
flang/stdlib/datetime.flang — functions 37; the kernel ledger was taken from this version of the file
тотальная функция «Пол дроби»
принимает значение: число
возвращает число
обеспечивает «на конечном числе пол цел, не больше входа и отстоит не дальше единицы» не ((значение минус значение) равен 0) или (((результат остаток от 1) плюс 0) равен 0 и притом результат не больше значение и притом (значение минус результат) не больше 1)
обеспечивает «при перелёте пол меньше срезанного на единицу, иначе равен ему» (пусть срезано равно (значение минус (значение остаток от 1))
если срезано больше значение то (результат равен (срезано минус 1)) иначе (результат равен срезано))
обеспечивает «при перелёте пол меньше срезанного ровно на единицу» если (значение минус (значение остаток от 1)) больше значение то (результат равен ((значение минус (значение остаток от 1)) минус 1)) иначе да
обеспечивает «без перелёта пол и есть срезанное» если не ((значение минус (значение остаток от 1)) больше значение) то (результат равен (значение минус (значение остаток от 1))) иначе да
пример «Целое остаётся собой»
дано значение равно 7
ожидается 7
тотальная функция «Деление вниз»
принимает делимое: число, делитель: число
возвращает число
обеспечивает «деление вниз — это пол частного» не (((делимое делить на делитель) минус (делимое делить на делитель)) равен 0) или (((результат остаток от 1) плюс 0) равен 0 и притом результат не больше (делимое делить на делитель) и притом ((делимое делить на делитель) минус результат) не больше 1)
обеспечивает «нулевой делитель даёт ноль» если делитель равен 0 то (результат равен 0) иначе да
обеспечивает «ненулевой делитель отдаёт пол частного» если не (делитель равен 0) то (результат равен («Пол дроби» от (делимое делить на делитель))) иначе да
пример «Делитель ноль даёт ноль: обещать это предусловием нельзя, см. выше»
дано делимое равно 5
дано делитель равно 0
ожидается 0
тип «Календарный день»
вариант «Календарный день» содержит год: число, месяц: число, сутки: число
тип «Часы»
вариант «Часы» содержит час: число, минута: число, секунда: число
тип «Отметка»
вариант «Отметка» содержит день: «Календарный день», часы: «Часы», смещение: число
тип «Итог даты»
вариант «Дата разобрана» содержит отметка: «Отметка»
вариант «Дата не разобрана» содержит причина: строка
тотальная функция «Високосный год»
принимает год: число
возвращает признак
обеспечивает «високосный год — тот, в котором 366 дней» не (((год остаток от 1) плюс 0) равен 0 и притом год не меньше 0 и притом год не больше 9999) или (результат равен ((«Разность дат» от (вариант «Календарный день» с год равным (год плюс 1) и месяц равным 1 и сутки равным 1) и (вариант «Календарный день» с год равным год и месяц равным 1 и сутки равным 1)) равен 366))
пример «2024 високосный»
дано год равно 2024
ожидается да
тотальная функция «Дней в месяце»
принимает год: число, месяц: число
возвращает число
обеспечивает «в месяце не больше 31 дня» результат не больше 31
обеспечивает «дней в месяце не бывает отрицательно» результат не меньше 0
обеспечивает «дней в месяце — это расстояние до первого числа следующего месяца» не (((год остаток от 1) плюс 0) равен 0 и притом год не меньше 0 и притом год не больше 9999 и притом ((месяц остаток от 1) плюс 0) равен 0 и притом месяц не меньше 1 и притом месяц не больше 12) или (результат равен («Разность дат» от (вариант «Календарный день» с год равным (если месяц равен 12 то год плюс 1 иначе год) и месяц равным (если месяц равен 12 то 1 иначе (месяц плюс 1)) и сутки равным 1) и (вариант «Календарный день» с год равным год и месяц равным месяц и сутки равным 1)))
обеспечивает «в феврале високосного года двадцать девять дней, а в обычном двадцать восемь» если месяц равен 2 то (если «Високосный год» от год то (результат равен 29) иначе (результат равен 28)) иначе да
обеспечивает «в апреле, июне, сентябре и ноябре тридцать дней» если не (месяц равен 2) то (если месяц равен 4 или месяц равен 6 или месяц равен 9 или месяц равен 11 то (результат равен 30) иначе да) иначе да
пример «Январь»
дано год равно 2026
дано месяц равно 1
ожидается 31
тотальная функция «Дата верна»
принимает дата: «Календарный день»
возвращает признак
обеспечивает «дата верна ровно тогда, когда круг через счёт дней её не меняет» (пусть день равно («Дней от эпохи» от дата)
не ((день минус день) равен 0 и притом день не меньше -719162 и притом день не больше 3652896) или (результат равен ((«Напечатать дату» от («Дата из дней» от день)) равен («Напечатать дату» от дата))))
пример «Обычная дата верна»
дано дата равно вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18
ожидается да
тотальная функция «Часы верны»
принимает часы: «Часы»
возвращает признак
обеспечивает «время верно ровно тогда, когда напечатанные ЧЧ:ММ:СС читаются обратно в границах суток» (пусть напечатано равно («Напечатать отметку» от (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 1970 и месяц равным 1 и сутки равным 1) и часы равным часы и смещение равным 0))
пусть ч равно («Число из цифр» от (подстрока напечатано с 12 по 13))
пусть мин равно («Число из цифр» от (подстрока напечатано с 15 по 16))
пусть сек равно («Число из цифр» от (подстрока напечатано с 18 по 19))
не ((длина напечатано) равен 20) или (результат равен (ч не меньше 0 и притом ч не больше 23 и притом мин не меньше 0 и притом мин не больше 59 и притом сек не меньше 0 и притом сек не больше 60)))
пример «Полдень верен»
дано часы равно вариант «Часы» с час равным 12 и минута равным 0 и секунда равным 0
ожидается да
тотальная функция «Дней от эпохи»
принимает дата: «Календарный день»
возвращает число
обеспечивает «отсчёт привязан к эпохе: 1970-01-01 — ноль, следующий день — единица, предыдущий — минус единица» (пусть напечатано равно («Напечатать дату» от дата)
(не (напечатано равен "1970-01-01") или (результат плюс 0) равен 0) и притом (не (напечатано равен "1970-01-02") или результат равен 1) и притом (не (напечатано равен "1969-12-31") или результат равен (0 минус 1)))
пример «Сама эпоха — ноль»
дано дата равно вариант «Календарный день» с год равным 1970 и месяц равным 1 и сутки равным 1
ожидается 0
тотальная функция «Дата из дней»
принимает дни: число
возвращает «Календарный день»
обеспечивает «дата, собранная из дня, тем же днём и отсчитывается» (пусть целое равно ((дни остаток от 1) плюс 0)
пусть круг равно ((«Дней от эпохи» от результат) равен дни)
не (целое равен 0 и притом дни не меньше -3652425 и притом дни не больше 3652425) или круг)
пример «Ноль — сама эпоха»
дано дни равно 0
ожидается вариант «Календарный день» с год равным 1970 и месяц равным 1 и сутки равным 1
тотальная функция «День недели»
принимает дата: «Календарный день»
возвращает число
обеспечивает «день недели не больше шести» результат не больше 6
обеспечивает «день недели не отрицателен» результат не меньше 0
обеспечивает «день недели считается и от четверга эпохи, и счёт сходится» результат равен ((((((«Дней от эпохи» от дата) плюс 4) остаток от 7) плюс 7) остаток от 7) плюс 0)
пример «Эпоха была четвергом»
дано дата равно вариант «Календарный день» с год равным 1970 и месяц равным 1 и сутки равным 1
ожидается 4
тотальная функция «Имя дня недели»
принимает номер: неотрицательное
возвращает строка
обеспечивает «у всякого дня недели имя есть, и оно от пяти до одиннадцати букв» не (номер не меньше 0 и притом номер не больше 6 и притом ((номер остаток от 1) плюс 0) равен 0) или ((длина результат) не меньше 5 и притом (длина результат) не больше 11)
обеспечивает «вне недели имени нет» если номер меньше 0 или номер больше 6 то (результат равен "") иначе да
обеспечивает «имя дня недели берётся из списка семи» если не (номер меньше 0 или номер больше 6) то (результат равен (элемент (номер плюс 1) в ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"])) иначе да
обеспечивает «вне недели имя пусто по длине» если номер меньше 0 или номер больше 6 то ((длина результат) равен 0) иначе да
пример «Ноль — воскресенье»
дано номер равно 0
ожидается "воскресенье"
тотальная функция «День года»
принимает дата: «Календарный день»
возвращает число
обеспечивает «у верной даты день года лежит между первым и триста шестьдесят шестым» не («Дата верна» от дата) или (результат не меньше 1 и притом результат не больше 366)
пример «Первое января — первый день»
дано дата равно вариант «Календарный день» с год равным 2026 и месяц равным 1 и сутки равным 1
ожидается 1
тотальная функция «Прибавить дни»
принимает дата: «Календарный день», сколько: число
возвращает «Календарный день»
обеспечивает «между исходной датой и сдвинутой ровно столько дней, сколько прибавили» (пусть день равно («Дней от эпохи» от дата)
пусть цель равно (день плюс сколько)
пусть целые равно ((((сколько остаток от 1) плюс 0) равен 0) и притом (((день остаток от 1) плюс 0) равен 0))
пусть сошлось равно ((«Разность дат» от результат и дата) равен (сколько плюс 0))
не (целые и притом цель не меньше -3652425 и притом цель не больше 3652425) или сошлось)
пример «Через день»
дано дата равно вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18
дано сколько равно 1
ожидается вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 19
тотальная функция «Разность дат»
принимает первая: «Календарный день», вторая: «Календарный день»
возвращает число
обеспечивает «даты, отстоящие на целое число недель, приходятся на один день недели» не (((результат остаток от 7) плюс 0) равен 0) или (((«День недели» от первая) плюс 0) равен ((«День недели» от вторая) плюс 0))
пример «Сама с собой — ноль»
дано первая равно вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18
дано вторая равно вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18
ожидается 0
тотальная функция «Секунд от эпохи»
принимает отметка: «Отметка»
возвращает число
обеспечивает «эпоха на нуле, полдень на 43200, а тот же полдень в поясе плюс три — на 32400» (пусть напечатано равно («Напечатать отметку» от отметка)
(не (напечатано равен "1970-01-01T00:00:00Z") или (результат плюс 0) равен 0) и притом (не (напечатано равен "1970-01-01T12:00:00Z") или результат равен 43200) и притом (не (напечатано равен "1970-01-01T12:00:00+03:00") или результат равен 32400))
пример «Сама эпоха — ноль»
дано отметка равно вариант «Отметка» с день равным (вариант «Календарный день» с год равным 1970 и месяц равным 1 и сутки равным 1) и часы равным (вариант «Часы» с час равным 0 и минута равным 0 и секунда равным 0) и смещение равным 0
ожидается 0
тотальная функция «Раньше»
принимает первая: «Отметка», вторая: «Отметка»
возвращает признак
обеспечивает «что раньше по мгновению, то раньше и по ответу» не ((«Секунд от эпохи» от первая) меньше («Секунд от эпохи» от вторая)) или результат
обеспечивает «раньше и одновременно не совмещаются» не результат или не («Одно мгновение» от первая и вторая)
пример «Раньше»
дано первая равно вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 10 и минута равным 0 и секунда равным 0) и смещение равным 0
дано вторая равно вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 11 и минута равным 0 и секунда равным 0) и смещение равным 0
ожидается да
тотальная функция «Одно мгновение»
принимает первая: «Отметка», вторая: «Отметка»
возвращает признак
обеспечивает «совпали секунды — совпало и мгновение, как бы ни были записаны пояса» не ((«Секунд от эпохи» от первая) равен («Секунд от эпохи» от вторая)) или результат
пример «Один и тот же миг в двух поясах»
дано первая равно вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 13 и минута равным 0 и секунда равным 0) и смещение равным 180
дано вторая равно вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 10 и минута равным 0 и секунда равным 0) и смещение равным 0
ожидается да
тотальная функция «Число из цифр»
принимает текст: строка
возвращает число
обеспечивает «пустая строка даёт минус единицу» не ((длина текст) равен 0) или результат равен (0 минус 1)
обеспечивает «число из пятнадцати цифр не длиннее своей записи» не (результат не меньше 0 и притом (длина текст) не больше 15) или (результат не больше ((свёртка (разложить текст на символы) начиная с 1 как акк и знак → акк умножить на 10) минус 1))
обеспечивает «из пустой строки числа нет» если (длина текст) равен 0 то (результат равен -1) иначе да
пример «Четыре цифры»
дано текст равно "2026"
ожидается 2026
тотальная функция «Смещение из хвоста»
принимает хвост: строка
возвращает число
обеспечивает «шестизначная запись пояса разбирается и печатается той же записью, а плюс с ненулевым часом даёт положительное смещение» (не ((длина хвост) равен 6 и притом не (результат равен (0 минус 1000000)) и притом (результат больше 0 или результат меньше 0)) или ((«Напечатать пояс» от результат) равен хвост)) и притом (не ((длина хвост) равен 6 и притом (символ 1 в хвост) равен "+" и притом (символ 4 в хвост) равен ":" и притом ((«Число из цифр» от (подстрока хвост с 2 по 3)) не меньше 1) и притом ((«Число из цифр» от (подстрока хвост с 2 по 3)) не больше 23) и притом ((«Число из цифр» от (подстрока хвост с 5 по 6)) не меньше 0) и притом ((«Число из цифр» от (подстрока хвост с 5 по 6)) не больше 59)) или результат больше 0)
обеспечивает «пустой хвост и Z — это нулевое смещение» если хвост равен "" или хвост равен "Z" или хвост равен "z" то (результат равен 0) иначе да
обеспечивает «пояс не в шесть знаков отвергается» если не (хвост равен "" или хвост равен "Z" или хвост равен "z") то (если не (длина хвост) равен 6 то (результат равен -1000000) иначе да) иначе да
пример «Z — ноль»
дано хвост равно "Z"
ожидается 0
тотальная функция «Разобрать отметку»
принимает текст: строка
возвращает «Итог даты»
обеспечивает «отметка короче десяти знаков отвергается с названной причиной» не ((длина текст) меньше 10) или (результат равен (вариант «Дата не разобрана» с причина равным "длина не та: ISO-8601 здесь читается как ГГГГ-ММ-ДД, ГГГГ-ММ-ДДTЧЧ:ММ:СС или та же запись с поясом"))
обеспечивает «сбитый разделитель даты отвергается с названной причиной» не ((длина текст) не меньше 10 и притом (не ((символ 5 в текст) равен "-") или не ((символ 8 в текст) равен "-"))) или (результат равен (вариант «Дата не разобрана» с причина равным "разделители даты не на месте: ждали ГГГГ-ММ-ДД"))
обеспечивает «разбор либо отдаёт отметку, и тогда знаков было не меньше десяти, либо называет непустую причину» разбор результат
случай вариант «Дата разобрана» с отметка как о
то (длина текст) не меньше 10
случай вариант «Дата не разобрана» с причина как п
то не (п равен "")
пример «Одна дата»
дано текст равно "2026-08-18"
ожидается вариант «Дата разобрана» с отметка равным (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 0 и минута равным 0 и секунда равным 0) и смещение равным 0)
тотальная функция «Двумя знаками»
принимает значение: число
возвращает строка
обеспечивает «двумя знаками — это ровно два знака, пока число целое» не (((значение остаток от 1) плюс 0) равен 0) или (длина результат) не больше 2
обеспечивает «двузначное целое печатается двумя знаками и читается обратно собой» не (значение не меньше 0 и притом значение не больше 99 и притом ((значение остаток от 1) плюс 0) равен 0) или ((длина результат) равен 2 и притом («Число из цифр» от результат) равен (значение плюс 0))
обеспечивает «число вне двух знаков печатается вопросами» если значение меньше 0 или значение больше 99 то (результат равен "??") иначе да
обеспечивает «однозначное дополняется нулём слева, двузначное печатается как есть» если не (значение меньше 0 или значение больше 99) то (если значение меньше 10 то (результат равен (соединить "0" с (к строке значение))) иначе (результат равен (к строке значение))) иначе да
обеспечивает «вне двух знаков печатаются ровно два знака» если значение меньше 0 или значение больше 99 то ((длина результат) равен 2) иначе да
пример «Однозначное дополняется нулём»
дано значение равно 8
ожидается "08"
тотальная функция «Четырьмя знаками»
принимает значение: число
возвращает строка
обеспечивает «четырёхзначное целое печатается четырьмя знаками и читается обратно собой» не (значение не меньше 0 и притом значение не больше 9999 и притом ((значение остаток от 1) плюс 0) равен 0) или ((длина результат) равен 4 и притом («Число из цифр» от результат) равен (значение плюс 0))
обеспечивает «число вне четырёх знаков печатается вопросами» если значение меньше 0 или значение больше 9999 то (результат равен "????") иначе да
обеспечивает «вне четырёх знаков печатаются ровно четыре знака» если значение меньше 0 или значение больше 9999 то ((длина результат) равен 4) иначе да
пример «Год»
дано значение равно 2026
ожидается "2026"
тотальная функция «Напечатать дату»
принимает дата: «Календарный день»
возвращает строка
обеспечивает «печать даты не короче десяти знаков, а ровно десять — это ГГГГ-ММ-ДД» ((длина результат) не меньше 10) и притом (не ((длина результат) равен 10) или ((символ 5 в результат) равен "-" и притом (символ 8 в результат) равен "-"))
пример «Восемнадцатое августа»
дано дата равно вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18
ожидается "2026-08-18"
тотальная функция «Напечатать пояс»
принимает смещение: число
возвращает строка
обеспечивает «ноль печатается буквой Z» не (смещение равен 0) или результат равен "Z"
обеспечивает «целое смещение до 23:59 печатается знаком, часами и минутами, читаемыми обратно» не (смещение больше 0 и притом смещение не больше 1439 и притом ((смещение остаток от 1) плюс 0) равен 0) или ((длина результат) равен 6 и притом (символ 1 в результат) равен "+" и притом (символ 4 в результат) равен ":" и притом ((((«Число из цифр» от (подстрока результат с 2 по 3)) умножить на 60) плюс («Число из цифр» от (подстрока результат с 5 по 6))) равен смещение))
обеспечивает «нулевой пояс печатается буквой Z» если смещение равен 0 то (результат равен "Z") иначе да
пример «Ноль — Z»
дано смещение равно 0
ожидается "Z"
тотальная функция «Напечатать отметку»
принимает отметка: «Отметка»
возвращает строка
обеспечивает «печать отметки не короче двадцати знаков, а ровно двадцать — это запись со всемирным поясом» ((длина результат) не меньше 20) и притом (не ((длина результат) равен 20) или (символ 20 в результат) равен "Z")
пример «Дата, время и Z»
дано отметка равно вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 12 и минута равным 34 и секунда равным 56) и смещение равным 0
ожидается "2026-08-18T12:34:56Z"
тип «Длительность»
вариант «Длительность» содержит секунды: число
тотальная функция «Остаток при делении вниз»
принимает делимое: число, делитель: число
возвращает число
обеспечивает «при нулевом делителе остаток — само делимое» если делитель равен 0 и притом (делимое минус делимое) равен 0 то (результат равен (делимое плюс 0)) иначе да
обеспечивает «при положительном делителе целый остаток лежит от нуля до делителя, не включая» если делитель больше 0 и притом ((делимое остаток от 1) плюс 0) равен 0 и притом ((делитель остаток от 1) плюс 0) равен 0 и притом делимое не меньше -62135596800 и притом делимое не больше 315569520000 и притом делитель не больше 86400 то (результат не меньше 0 и притом результат меньше делитель) иначе да
пример «Тринадцать при делении на четыре — один»
дано делимое равно 13
дано делитель равно 4
ожидается 1
тотальная функция «Длительность из часов минут секунд»
принимает часов: число, минут: число, секунд: число
возвращает «Длительность»
обеспечивает «целые часы, минуты и секунды в своих границах читаются из длительности обратно» если ((часов остаток от 1) плюс 0) равен 0 и притом часов не меньше 0 и притом часов не больше 87000000 и притом ((минут остаток от 1) плюс 0) равен 0 и притом минут не меньше 0 и притом минут не больше 59 и притом ((секунд остаток от 1) плюс 0) равен 0 и притом секунд не меньше 0 и притом секунд не больше 59 то ((«Часов в длительности» от результат) равен (часов плюс 0) и притом («Минут в длительности» от результат) равен (минут плюс 0) и притом («Секунд в длительности» от результат) равен (секунд плюс 0)) иначе да
пример «Девяносто минут — 5400 секунд»
дано часов равно 0
дано минут равно 90
дано секунд равно 0
ожидается вариант «Длительность» с секунды равным 5400
тотальная функция «Часов в длительности»
принимает длительность: «Длительность»
возвращает число
обеспечивает «часы, умноженные на 3600, не больше секунд и отстоят от них меньше чем на час» если ((длительность.секунды остаток от 1) плюс 0) равен 0 и притом длительность.секунды не меньше -62135596800 и притом длительность.секунды не больше 315569520000 то ((результат умножить на 3600) не больше длительность.секунды и притом (длительность.секунды минус (результат умножить на 3600)) меньше 3600) иначе да
пример «5400 секунд — один час»
дано длительность равно вариант «Длительность» с секунды равным 5400
ожидается 1
тотальная функция «Минут в длительности»
принимает длительность: «Длительность»
возвращает число
обеспечивает «минут внутри часа — от нуля до пятидесяти девяти» если ((длительность.секунды остаток от 1) плюс 0) равен 0 и притом длительность.секунды не меньше -62135596800 и притом длительность.секунды не больше 315569520000 то (результат не меньше 0 и притом результат не больше 59) иначе да
пример «5400 секунд — тридцать минут сверх часа»
дано длительность равно вариант «Длительность» с секунды равным 5400
ожидается 30
тотальная функция «Секунд в длительности»
принимает длительность: «Длительность»
возвращает число
обеспечивает «секунд внутри минуты — от нуля до пятидесяти девяти» если ((длительность.секунды остаток от 1) плюс 0) равен 0 и притом длительность.секунды не меньше -62135596800 и притом длительность.секунды не больше 315569520000 то (результат не меньше 0 и притом результат не больше 59) иначе да
пример «3661 секунда — одна секунда сверх минуты»
дано длительность равно вариант «Длительность» с секунды равным 3661
ожидается 1
тотальная функция «Отметка из секунд»
принимает секунды: число, смещение: число
возвращает «Отметка»
обеспечивает «отметка, собранная из секунд, теми же секундами и отсчитывается» если ((секунды остаток от 1) плюс 0) равен 0 и притом секунды не меньше -62135510400 и притом секунды не больше 315569433600 и притом ((смещение остаток от 1) плюс 0) равен 0 и притом смещение не меньше -1440 и притом смещение не больше 1440 то (((«Секунд от эпохи» от результат) плюс 0) равен (секунды плюс 0)) иначе да
обеспечивает «время суток собранной отметки верно» если ((секунды остаток от 1) плюс 0) равен 0 и притом секунды не меньше -62135510400 и притом секунды не больше 315569433600 и притом ((смещение остаток от 1) плюс 0) равен 0 и притом смещение не меньше -1440 и притом смещение не больше 1440 то («Часы верны» от результат.часы) иначе да
обеспечивает «смещение пояса записывается в отметку как есть» если (смещение минус смещение) равен 0 то (результат.смещение равен смещение) иначе да
пример «Ноль — сама эпоха»
дано секунды равно 0
дано смещение равно 0
ожидается вариант «Отметка» с день равным (вариант «Календарный день» с год равным 1970 и месяц равным 1 и сутки равным 1) и часы равным (вариант «Часы» с час равным 0 и минута равным 0 и секунда равным 0) и смещение равным 0
тотальная функция «Прибавить длительность»
принимает отметка: «Отметка», длительность: «Длительность»
возвращает «Отметка»
обеспечивает «секунд от эпохи стало ровно на длительность больше» (пусть было равно («Секунд от эпохи» от отметка)
пусть стало равно (было плюс длительность.секунды)
если ((стало остаток от 1) плюс 0) равен 0 и притом стало не меньше -62135510400 и притом стало не больше 315569433600 и притом ((отметка.смещение остаток от 1) плюс 0) равен 0 и притом отметка.смещение не меньше -1440 и притом отметка.смещение не больше 1440 то (((«Секунд от эпохи» от результат) плюс 0) равен (стало плюс 0)) иначе да)
обеспечивает «пояс отметки не меняется» если (отметка.смещение минус отметка.смещение) равен 0 то (результат.смещение равен отметка.смещение) иначе да
пример «Час после половины двенадцатого ночи — уже следующие сутки»
дано отметка равно вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 23 и минута равным 30 и секунда равным 0) и смещение равным 0
дано длительность равно вариант «Длительность» с секунды равным 3600
ожидается вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 19) и часы равным (вариант «Часы» с час равным 0 и минута равным 30 и секунда равным 0) и смещение равным 0
тип «Интервал»
вариант «Интервал» содержит начало: «Отметка», конец: «Отметка»
тотальная функция «Содержит момент»
принимает интервал: «Интервал», момент: «Отметка»
возвращает признак
обеспечивает «момент раньше начала — вне интервала» если («Раньше» от момент и интервал.начало) то (результат равен нет) иначе да
обеспечивает «момент не раньше конца — вне интервала: интервал полуоткрытый» если не («Раньше» от момент и интервал.конец) то (результат равен нет) иначе да
обеспечивает «начало непустого интервала ему принадлежит» если («Раньше» от интервал.начало и интервал.конец) и притом («Одно мгновение» от момент и интервал.начало) то (результат равен да) иначе да
пример «Полдень внутри рабочего дня»
дано интервал равно вариант «Интервал» с начало равным (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 9 и минута равным 0 и секунда равным 0) и смещение равным 0) и конец равным (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 18 и минута равным 0 и секунда равным 0) и смещение равным 0)
дано момент равно вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 12 и минута равным 0 и секунда равным 0) и смещение равным 0
ожидается да
тотальная функция «Пересекается»
принимает первый: «Интервал», второй: «Интервал»
возвращает признак
обеспечивает «касание концами — не пересечение» если («Одно мгновение» от первый.конец и второй.начало) или («Одно мгновение» от второй.конец и первый.начало) то (результат равен нет) иначе да
обеспечивает «один кончился раньше начала другого — не пересекаются» если («Раньше» от первый.конец и второй.начало) или («Раньше» от второй.конец и первый.начало) то (результат равен нет) иначе да
пример «Перекрытие на час»
дано первый равно вариант «Интервал» с начало равным (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 9 и минута равным 0 и секунда равным 0) и смещение равным 0) и конец равным (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 12 и минута равным 0 и секунда равным 0) и смещение равным 0)
дано второй равно вариант «Интервал» с начало равным (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 11 и минута равным 0 и секунда равным 0) и смещение равным 0) и конец равным (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 14 и минута равным 0 и секунда равным 0) и смещение равным 0)
ожидается да
тотальная функция «Ведущих цифр»
принимает знаки: список строки
возвращает число
обеспечивает «ведущих цифр не меньше нуля» результат не меньше 0
обеспечивает «ведущих цифр не больше, чем знаков» результат не больше (длина знаки)
обеспечивает «в пустом списке цифр нет» если (длина знаки) равен 0 то (результат равен 0) иначе да
пример «Три цифры и буква»
дано знаки равно ["7", "8", "9", "Z"]
ожидается 3
тотальная функция «Без долей секунды»
принимает текст: строка
возвращает строка
обеспечивает «без точки на двадцатом месте текст не меняется» если (длина текст) меньше 20 то (результат равен текст) иначе (если не ((символ 20 в текст) равен ".") то (результат равен текст) иначе да)
обеспечивает «без долей не длиннее, чем с долями» (длина результат) не больше (длина текст)
обеспечивает «первые девятнадцать знаков — дата и время — сохраняются» если (длина текст) не меньше 19 то ((подстрока результат с 1 по 19) равен (подстрока текст с 1 по 19)) иначе да
пример «Три знака долей вырезаются, пояс остаётся»
дано текст равно "2026-08-18T12:34:56.789Z"
ожидается "2026-08-18T12:34:56Z"
тотальная функция «Доли секунды»
принимает текст: строка
возвращает число
обеспечивает «долей не меньше нуля» результат не меньше 0
обеспечивает «долей не больше 999 — миллисекунды» результат не больше 999
обеспечивает «без точки на двадцатом месте долей нет» если (длина текст) меньше 20 то (результат равен 0) иначе (если не ((символ 20 в текст) равен ".") то (результат равен 0) иначе да)
пример «Три цифры — миллисекунды как есть»
дано текст равно "2026-08-18T12:34:56.789Z"
ожидается 789
тотальная функция «Разобрать отметку с долями»
принимает текст: строка
возвращает «Итог даты»
обеспечивает «без точки на двадцатом месте разбор тот же, что и без долей» если (длина текст) меньше 20 то (результат равен («Разобрать отметку» от текст)) иначе (если не ((символ 20 в текст) равен ".") то (результат равен («Разобрать отметку» от текст)) иначе да)
пример «Дробные секунды принимаются: 12:34:56.789Z читается как 12:34:56 по Гринвичу»
дано текст равно "2026-08-18T12:34:56.789Z"
ожидается вариант «Дата разобрана» с отметка равным (вариант «Отметка» с день равным (вариант «Календарный день» с год равным 2026 и месяц равным 8 и сутки равным 18) и часы равным (вариант «Часы» с час равным 12 и минута равным 34 и секунда равным 56) и смещение равным 0)
| Function | Termination | Claims |
|---|---|---|
| «Пол дроби» | доказано композицией | доказано 3 из 4; «на конечном числе пол цел, не больше входа и отстоит не дальше единицы» — сетка |
| «Деление вниз» | доказано композицией | доказано 2 из 3; «деление вниз — это пол частного» — сетка |
| «Високосный год» | доказано композицией | доказано 0 из 1; «високосный год — тот, в котором 366 дней» — сетка |
| «Дней в месяце» | доказано композицией | доказано 4 из 5; «дней в месяце — это расстояние до первого числа следующего месяца» — сетка |
| «Дата верна» | доказано композицией | доказано 0 из 1; «дата верна ровно тогда, когда круг через счёт дней её не меняет» — сетка |
| «Часы верны» | доказано композицией | доказано 0 из 1; «время верно ровно тогда, когда напечатанные ЧЧ:ММ:СС читаются обратно в границах суток» — сетка |
| «Дней от эпохи» | доказано композицией | доказано 0 из 1; «отсчёт привязан к эпохе: 1970-01-01 — ноль, следующий день — единица, предыдущий — минус единица» — сетка |
| «Дата из дней» | доказано композицией | доказано 0 из 1; «дата, собранная из дня, тем же днём и отсчитывается» — сетка |
| «День недели» | доказано композицией | доказано 0 из 3; «день недели не больше шести» — сетка; «день недели не отрицателен» — сетка; «день недели считается и от четверга эпохи, и счёт сходится» — сетка |
| «Имя дня недели» | доказано композицией | доказано 3 из 4; «у всякого дня недели имя есть, и оно от пяти до одиннадцати букв» — сетка |
| «День года» | доказано композицией | доказано 0 из 1; «у верной даты день года лежит между первым и триста шестьдесят шестым» — сетка |
| «Прибавить дни» | доказано композицией | доказано 0 из 1; «между исходной датой и сдвинутой ровно столько дней, сколько прибавили» — сетка |
| «Разность дат» | доказано композицией | доказано 0 из 1; «даты, отстоящие на целое число недель, приходятся на один день недели» — сетка |
| «Секунд от эпохи» | доказано композицией | доказано 0 из 1; «эпоха на нуле, полдень на 43200, а тот же полдень в поясе плюс три — на 32400» — сетка |
| «Раньше» | доказано композицией | доказано 1 из 2; «раньше и одновременно не совмещаются» — сетка |
| «Одно мгновение» | доказано композицией | доказано 1 из 1 |
| «Число из цифр» | доказано композицией | доказано 2 из 3; «число из пятнадцати цифр не длиннее своей записи» — сетка |
| «Смещение из хвоста» | доказано композицией | доказано 2 из 3; «шестизначная запись пояса разбирается и печатается той же записью, а плюс с ненулевым часом даёт положительное смещение» — сетка |
| «Разобрать отметку» | доказано композицией | доказано 2 из 3; «разбор либо отдаёт отметку, и тогда знаков было не меньше десяти, либо называет непустую причину» — сетка |
| «Двумя знаками» | доказано композицией | доказано 3 из 5; «двумя знаками — это ровно два знака, пока число целое» — сетка; «двузначное целое печатается двумя знаками и читается обратно собой» — сетка |
| «Четырьмя знаками» | доказано композицией | доказано 2 из 3; «четырёхзначное целое печатается четырьмя знаками и читается обратно собой» — сетка |
| «Напечатать дату» | доказано композицией | доказано 0 из 1; «печать даты не короче десяти знаков, а ровно десять — это ГГГГ-ММ-ДД» — сетка |
| «Напечатать пояс» | доказано композицией | доказано 2 из 3; «целое смещение до 23:59 печатается знаком, часами и минутами, читаемыми обратно» — сетка |
| «Напечатать отметку» | доказано композицией | доказано 0 из 1; «печать отметки не короче двадцати знаков, а ровно двадцать — это запись со всемирным поясом» — сетка |
| «Остаток при делении вниз» | доказано композицией | доказано 0 из 2; «при нулевом делителе остаток — само делимое» — сетка; «при положительном делителе целый остаток лежит от нуля до делителя, не включая» — сетка |
| «Длительность из часов минут секунд» | доказано композицией | доказано 0 из 1; «целые часы, минуты и секунды в своих границах читаются из длительности обратно» — сетка |
| «Часов в длительности» | доказано композицией | доказано 0 из 1; «часы, умноженные на 3600, не больше секунд и отстоят от них меньше чем на час» — сетка |
| «Минут в длительности» | доказано композицией | доказано 0 из 1; «минут внутри часа — от нуля до пятидесяти девяти» — сетка |
| «Секунд в длительности» | доказано композицией | доказано 0 из 1; «секунд внутри минуты — от нуля до пятидесяти девяти» — сетка |
| «Отметка из секунд» | доказано композицией | доказано 1 из 3; «отметка, собранная из секунд, теми же секундами и отсчитывается» — сетка; «время суток собранной отметки верно» — сетка |
| «Прибавить длительность» | доказано композицией | доказано 1 из 2; «секунд от эпохи стало ровно на длительность больше» — сетка |
| «Содержит момент» | доказано композицией | доказано 2 из 3; «начало непустого интервала ему принадлежит» — сетка |
| «Пересекается» | доказано композицией | доказано 0 из 2; «касание концами — не пересечение» — сетка; «один кончился раньше начала другого — не пересекаются» — сетка |
| «Ведущих цифр» | доказано структурой | доказано 3 из 3 |
| «Без долей секунды» | доказано композицией | доказано 1 из 3; «без долей не длиннее, чем с долями» — сетка; «первые девятнадцать знаков — дата и время — сохраняются» — сетка |
| «Доли секунды» | доказано композицией | доказано 1 из 3; «долей не меньше нуля» — сетка; «долей не больше 999 — миллисекунды» — сетка |
| «Разобрать отметку с долями» | доказано композицией | доказано 0 из 1; «без точки на двадцатом месте разбор тот же, что и без долей» — сетка |
«DER»
flang/stdlib/der.flang — functions 36; the kernel ledger was taken from this version of the file
тотальная функция «Октет»
принимает октеты: список числа, место: число
возвращает число
обеспечивает «за концом списка октет нулевой» если (место меньше 1) или (место больше (длина октеты)) то результат равен 0 иначе да
пример «Первый октет»
дано октеты равно [48, 6, 2]
дано место равно 1
ожидается 48
объект «Ход куска»
«набрано»: список числа
«номер»: число
тотальная функция «Шаг куска»
принимает ход: «Ход куска», октет: число, начало: число, конец: число
возвращает «Ход куска»
обеспечивает «номер подвинулся ровно на один» результат.«номер» равен (ход.«номер» плюс 1)
обеспечивает «набранное прирастает не больше чем на один» (длина результат.«набрано») не больше ((длина ход.«набрано») плюс 1)
пример «Октет внутри отрезка набирается»
дано ход равно запись «Ход куска» с «набрано» равным пустой список и «номер» равным 1
дано октет равно 7
дано начало равно 1
дано конец равно 2
ожидается запись «Ход куска» с «набрано» равным [7] и «номер» равным 2
тотальная функция «Ход по куску»
принимает октеты: список числа, начало: число, конец: число
возвращает «Ход куска»
обеспечивает «пройден весь список, номер стал длиной плюс один» результат.«номер» равен ((длина октеты) плюс 1)
обеспечивает «набранного не больше, чем номер» (длина результат.«набрано») не больше результат.«номер»
обеспечивает «набранного не больше, чем всех октетов» (длина результат.«набрано») не больше (длина октеты)
пример «Средние два октета»
дано октеты равно [1, 2, 3, 4]
дано начало равно 2
дано конец равно 3
ожидается запись «Ход куска» с «набрано» равным [2, 3] и «номер» равным 5
тотальная функция «Кусок»
принимает октеты: список числа, начало: число, конец: число
возвращает список числа
обеспечивает «кусок не длиннее целого» (длина результат) не больше (длина октеты)
пример «Середина»
дано октеты равно [1, 2, 3, 4, 5]
дано начало равно 2
дано конец равно 4
ожидается [2, 3, 4]
тотальная функция «Отбросить начало»
принимает октеты: список числа, сколько: число
возвращает список числа
обеспечивает «отброшенное не длиннее целого» (длина результат) не больше (длина октеты)
пример «без двух первых»
дано октеты равно [1, 2, 3]
дано сколько равно 2
ожидается [3]
тотальная функция «Взять начало»
принимает октеты: список числа, сколько: число
возвращает список числа
обеспечивает «взятое не длиннее целого» (длина результат) не больше (длина октеты)
пример «два первых»
дано октеты равно [1, 2, 3]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Делить нацело»
принимает делимое: число, делитель: число
возвращает число
обеспечивает «деление на ноль даёт ноль, а не бесконечность» если делитель равен 0 то результат равен 0 иначе да
пример «Сто сорок два на сорок»
дано делимое равно 142
дано делитель равно 40
ожидается 3
объект «Мера DER»
«значение»: число
«октетов»: число
«беда»: строка
тотальная функция «Разобрать меру»
принимает октеты: список числа, место: число
возвращает «Мера DER»
обеспечивает «у меры без беды хотя бы один октет длины» если результат.«беда» равен "" то 1 не больше результат.«октетов» иначе да
обеспечивает «короткая форма — ровно один октет длины» если («Октет» от октеты и место) меньше 128 то (результат.«октетов» равен 1) иначе да
обеспечивает «короткая форма беды не даёт» если («Октет» от октеты и место) меньше 128 то (результат.«беда» равен "") иначе да
обеспечивает «неопределённая длина названа бедой» если не ((«Октет» от октеты и место) меньше 128) то (если («Октет» от октеты и место) равен 128 то (результат.«беда» равен "неопределённая длина запрещена в DER") иначе да) иначе да
обеспечивает «у неопределённой длины октет длины ровно один» если не ((«Октет» от октеты и место) меньше 128) то (если («Октет» от октеты и место) равен 128 то (результат.«октетов» равен 1) иначе да) иначе да
пример «Короткая форма: шесть»
дано октеты равно [48, 6, 2, 1, 5]
дано место равно 2
ожидается запись «Мера DER» с «значение» равным 6 и «октетов» равным 1 и «беда» равным ""
тотальная функция «Число из октетов»
принимает октеты: список числа
возвращает число
обеспечивает «пустая цепочка октетов даёт ноль» если (длина октеты) равен 0 то результат равен 0 иначе да
пример «Пусто — ноль»
дано октеты равно пустой список
ожидается 0
объект «Голова DER»
«метка»: число
«начало»: число
«длина»: число
«конец»: число
«беда»: строка
тотальная функция «Разобрать голову»
принимает октеты: список числа, место: число
возвращает «Голова DER»
обеспечивает «при короткой неотрицательной мере конец не раньше начала» если ((«Октет» от октеты и (место плюс 1)) не меньше 0) и притом ((«Октет» от октеты и (место плюс 1)) меньше 128) то (результат.«конец» не меньше результат.«начало») иначе да
обеспечивает «метка длиннее октета названа бедой» если ((«Октет» от октеты и место) остаток от 32) равен 31 то (результат.«беда» равен "метка длиннее одного октета не разбирается") иначе да
обеспечивает «метка разобранной головы — октет на её месте» результат.«метка» равен («Октет» от октеты и место)
обеспечивает «у длинной метки конец стоит там же, где место» если ((«Октет» от октеты и место) остаток от 32) равен 31 то (результат.«конец» равен место) иначе да
обеспечивает «у длинной метки начало стоит там же, где место» если ((«Октет» от октеты и место) остаток от 32) равен 31 то (результат.«начало» равен место) иначе да
обеспечивает «у длинной метки длина нулевая» если ((«Октет» от октеты и место) остаток от 32) равен 31 то (результат.«длина» равен 0) иначе да
обеспечивает «у длинной метки сама метка — октет на её месте» если ((«Октет» от октеты и место) остаток от 32) равен 31 то (результат.«метка» равен («Октет» от октеты и место)) иначе да
обеспечивает «у короткой метки сама метка — октет на её месте» если не (((«Октет» от октеты и место) остаток от 32) равен 31) то (результат.«метка» равен («Октет» от октеты и место)) иначе да
обеспечивает «у короткой метки начало стоит за меткой и октетами длины» если не (((«Октет» от октеты и место) остаток от 32) равен 31) то (результат.«начало» равен (место плюс 1 плюс («Разобрать меру» от октеты и (место плюс 1)).«октетов»)) иначе да
обеспечивает «у короткой метки длина головы — значение меры» если не (((«Октет» от октеты и место) остаток от 32) равен 31) то (результат.«длина» равен («Разобрать меру» от октеты и (место плюс 1)).«значение») иначе да
обеспечивает «у короткой метки конец отстоит от места на метку, октеты длины и саму длину» если не (((«Октет» от октеты и место) остаток от 32) равен 31) то (результат.«конец» равен (место плюс 1 плюс («Разобрать меру» от октеты и (место плюс 1)).«октетов» плюс («Разобрать меру» от октеты и (место плюс 1)).«значение»)) иначе да
обеспечивает «беда меры доходит до головы и через короткую метку» если не (((«Октет» от октеты и место) остаток от 32) равен 31) то (если не ((«Разобрать меру» от октеты и (место плюс 1)).«беда» равен "") то (результат.«беда» равен («Разобрать меру» от октеты и (место плюс 1)).«беда») иначе да) иначе да
пример «Последовательность из шести октетов»
дано октеты равно [48, 6, 2, 1, 5, 2, 1, 9]
дано место равно 1
ожидается запись «Голова DER» с «метка» равным 48 и «начало» равным 3 и «длина» равным 6 и «конец» равным 9 и «беда» равным ""
тотальная функция «Собрать голову»
принимает октеты: список числа, место: число, мера: «Мера DER»
возвращает «Голова DER»
обеспечивает «беда меры переходит в беду головы» если не (мера.«беда» равен "") то результат.«беда» равен мера.«беда» иначе да
обеспечивает «метка головы — октет на её месте» результат.«метка» равен («Октет» от октеты и место)
обеспечивает «начало содержимого стоит за меткой и октетами длины» результат.«начало» равен (место плюс 1 плюс мера.«октетов»)
обеспечивает «длина головы — значение меры» результат.«длина» равен мера.«значение»
обеспечивает «конец отстоит от места на метку, октеты длины и саму длину» результат.«конец» равен (место плюс 1 плюс мера.«октетов» плюс мера.«значение»)
пример «Мера без беды даёт голову без беды»
дано октеты равно [48, 6, 2, 1, 5, 2, 1, 9]
дано место равно 1
дано мера равно запись «Мера DER» с «значение» равным 6 и «октетов» равным 1 и «беда» равным ""
ожидается запись «Голова DER» с «метка» равным 48 и «начало» равным 3 и «длина» равным 6 и «конец» равным 9 и «беда» равным ""
тотальная функция «Содержимое»
принимает октеты: список числа, место: число
возвращает список числа
обеспечивает «содержимое не длиннее всего разбираемого» (длина результат) не больше (длина октеты)
пример «Содержимое последовательности»
дано октеты равно [48, 6, 2, 1, 5, 2, 1, 9]
дано место равно 1
ожидается [2, 1, 5, 2, 1, 9]
объект «Обход DER»
«места»: список числа
«место»: число
тотальная функция «Шаг обхода»
принимает ход: «Обход DER», октеты: список числа, конец: число
возвращает «Обход DER»
обеспечивает «дойдя до конца, обход стоит» если ход.«место» не меньше конец то (результат равен ход) иначе да
обеспечивает «мест прирастает не больше чем на одно» (длина результат.«места») не больше ((длина ход.«места») плюс 1)
пример «За концом ничего не прибавляется»
дано ход равно запись «Обход DER» с «места» равным [3] и «место» равным 9
дано октеты равно [48, 6, 2, 1, 5, 2, 1, 9]
дано конец равно 9
ожидается запись «Обход DER» с «места» равным [3] и «место» равным 9
тотальная функция «Шаг вперёд»
принимает ход: «Обход DER», голова: «Голова DER», конец: число
возвращает «Обход DER»
обеспечивает «мест прирастает не больше чем на одно» (длина результат.«места») не больше ((длина ход.«места») плюс 1)
обеспечивает «беда головы останавливает обход на конце» если не (голова.«беда» равен "") то результат.«место» равен конец иначе да
обеспечивает «без беды место встаёт ровно на конец головы» если (голова.«беда» равен "") то (результат.«место» равен голова.«конец») иначе да
обеспечивает «обход не пятится, когда есть куда идти» если (конец не меньше ход.«место») и притом (голова.«конец» не меньше ход.«место») то (результат.«место» не меньше ход.«место») иначе да
пример «Голова без беды — место отмечено, обход подвинут за неё»
дано ход равно запись «Обход DER» с «места» равным пустой список и «место» равным 3
дано голова равно запись «Голова DER» с «метка» равным 2 и «начало» равным 5 и «длина» равным 1 и «конец» равным 6 и «беда» равным ""
дано конец равно 9
ожидается запись «Обход DER» с «места» равным [3] и «место» равным 6
тотальная функция «Ход по вложенным»
принимает октеты: список числа, место: число
возвращает «Обход DER»
обеспечивает «мест не больше, чем всех октетов» (длина результат.«места») не больше (длина октеты)
пример «Два целых внутри последовательности»
дано октеты равно [48, 6, 2, 1, 5, 2, 1, 9]
дано место равно 1
ожидается запись «Обход DER» с «места» равным [3, 6] и «место» равным 9
тотальная функция «Вложенные»
принимает октеты: список числа, место: число
возвращает список числа
обеспечивает «вложенных не больше, чем октетов во всём разбираемом» (длина результат) не больше (длина октеты)
пример «Два целых»
дано октеты равно [48, 6, 2, 1, 5, 2, 1, 9]
дано место равно 1
ожидается [3, 6]
тотальная функция «Вложенное по счёту»
принимает октеты: список числа, место: число, номер: число
возвращает число
обеспечивает «место вложенного либо ноль, либо лежит внутри октетов» (результат равен 0) или (результат не больше (длина октеты))
пример «Второе вложенное»
дано октеты равно [48, 6, 2, 1, 5, 2, 1, 9]
дано место равно 1
дано номер равно 2
ожидается 6
тотальная функция «Целое DER»
принимает октеты: список числа
возвращает число
обеспечивает «пустое целое равно нулю» если (длина октеты) равен 0 то результат равен 0 иначе да
пример «Пять»
дано октеты равно [5]
ожидается 5
тотальная функция «Цифра DER»
принимает н: число
возвращает строка
обеспечивает «цифра — ровно один знак» (длина результат) равен 1
пример «Ноль»
дано н равно 0
ожидается "0"
тотальная функция «Октет шестнадцатеричным»
принимает октет: число
возвращает строка
обеспечивает «октет печатается ровно двумя знаками» (длина результат) равен 2
пример «Ноль»
дано октет равно 0
ожидается "00"
тотальная функция «Шаг шестнадцатеричного»
принимает набрано: строка, октет: число
возвращает строка
обеспечивает «шаг приписывает ровно два знака» (длина результат) равен ((длина набрано) плюс 2)
пример «К пустому приписывается пара знаков»
дано набрано равно ""
дано октет равно 1
ожидается "01"
тотальная функция «Октеты шестнадцатеричным»
принимает октеты: список числа
возвращает строка
обеспечивает «на каждый октет ровно два знака» (длина результат) равен ((длина октеты) умножить на 2)
пример «Пусто»
дано октеты равно пустой список
ожидается ""
тотальная функция «Шаг двоеточий»
принимает набрано: строка, октет: число
возвращает строка
обеспечивает «к пустому приписывается пара знаков без двоеточия» если (длина набрано) равен 0 то ((длина результат) равен 2) иначе да
обеспечивает «к непустому приписывается двоеточие и пара знаков» если не ((длина набрано) равен 0) то ((длина результат) равен ((длина (соединить набрано с ":")) плюс 2)) иначе да
пример «Первый октет идёт без двоеточия»
дано набрано равно ""
дано октет равно 1
ожидается "01"
тотальная функция «Октеты двоеточиями»
принимает октеты: список числа
возвращает строка
обеспечивает «пустое даёт пустое» если (длина октеты) равен 0 то (длина результат) равен 0 иначе да
обеспечивает «не больше трёх знаков на октет» (длина результат) не больше ((длина октеты) умножить на 3)
пример «Пусто»
дано октеты равно пустой список
ожидается ""
тотальная функция «Знак октета»
принимает октет: число
возвращает строка
обеспечивает «знак всегда ровно один» (длина результат) равен 1
пример «Заглавная A»
дано октет равно 65
ожидается "A"
тотальная функция «Строка DER»
принимает октеты: список числа
возвращает строка
обеспечивает «на каждый октет ровно один знак» (длина результат) равен (длина октеты)
пример «Пусто»
дано октеты равно пустой список
ожидается ""
объект «Ход OID»
«части»: список строки
«копилка»: число
«начат»: признак
тотальная функция «Закрыть узел OID»
принимает ход: «Ход OID», значение: число
возвращает «Ход OID»
обеспечивает «после закрытия узла копилка пуста» результат.«копилка» равен 0
пример «Первый узел разлагается на два: 42 — это 1.2»
дано ход равно запись «Ход OID» с «части» равным пустой список и «копилка» равным 0 и «начат» равным нет
дано значение равно 42
ожидается запись «Ход OID» с «части» равным ["1", "2"] и «копилка» равным 0 и «начат» равным да
тотальная функция «Шаг OID»
принимает ход: «Ход OID», октет: число
возвращает «Ход OID»
обеспечивает «узел закрывается ровно на октете без старшего бита» если октет меньше 128 то результат.«копилка» равен 0 иначе да
пример «Октет со старшим битом копится»
дано ход равно запись «Ход OID» с «части» равным ["1", "2"] и «копилка» равным 0 и «начат» равным да
дано октет равно 134
ожидается запись «Ход OID» с «части» равным ["1", "2"] и «копилка» равным 6 и «начат» равным да
тотальная функция «Идентификатор объекта»
принимает октеты: список числа
возвращает строка
обеспечивает «пустой идентификатор печатается пустым» если (длина октеты) равен 0 то (длина результат) равен 0 иначе да
пример «Пусто»
дано октеты равно пустой список
ожидается ""
объект «Время DER»
«год»: число
«месяц»: число
«день»: число
«час»: число
«минута»: число
«секунда»: число
«беда»: строка
тотальная функция «Цифра октета»
принимает октет: число
возвращает число
обеспечивает «цифра не больше девяти» результат не больше 9
обеспечивает «не цифра даёт ноль» если (октет меньше 48) или (октет больше 57) то результат равен 0 иначе да
обеспечивает «цифра — это октет без сорока восьми» если (октет меньше 48) или (октет больше 57) то да иначе (результат равен (октет минус 48))
пример «Знак 5»
дано октет равно 53
ожидается 5
тотальная функция «Двузначное»
принимает октеты: список числа, место: число
возвращает число
обеспечивает «двузначное не больше девяноста девяти» результат не больше 99
пример «Двадцать пять»
дано октеты равно [50, 53, 48, 56]
дано место равно 1
ожидается 25
тотальная функция «Разобрать время»
принимает метка: число, октеты: список числа
возвращает «Время DER»
обеспечивает «месяц не больше девяноста девяти» результат.«месяц» не больше 99
обеспечивает «у времени без беды год не меньше тысяча девятьсот пятидесятого» если результат.«беда» равен "" то результат.«год» не меньше 1950 иначе да
обеспечивает «чужая метка названа бедой, а не угадана» если не (метка равен 23) то (если не (метка равен 24) то (результат.«беда» равен "не UTCTime и не GeneralizedTime") иначе да) иначе да
обеспечивает «у чужой метки год нулевой» если не (метка равен 23) то (если не (метка равен 24) то (результат.«год» равен 0) иначе да) иначе да
пример «UTCTime 13 августа 2025»
дано метка равно 23
дано октеты равно [50, 53, 48, 56, 49, 51, 48, 48, 48, 48, 48, 48, 90]
ожидается запись «Время DER» с «год» равным 2025 и «месяц» равным 8 и «день» равным 13 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным ""
тотальная функция «Название месяца»
принимает месяц: число
возвращает строка
обеспечивает «название месяца — ровно три знака» (длина результат) равен 3
обеспечивает «вне года — ровно три вопроса» если (месяц меньше 1) или (месяц больше 12) то (результат равен "???") иначе да
обеспечивает «вне года название всё равно трёхзначно» если (месяц меньше 1) или (месяц больше 12) то ((длина результат) равен 3) иначе да
пример «Первый»
дано месяц равно 1
ожидается "Jan"
тотальная функция «Два знака»
принимает н: число
возвращает строка
обеспечивает «ровно два знака» (длина результат) равен 2
пример «Ноль»
дано н равно 0
ожидается "00"
тотальная функция «Время как у openssl»
принимает время: «Время DER»
возвращает строка
обеспечивает «печать времени непуста» (длина результат) больше 0
пример «13 августа 2025»
дано время равно запись «Время DER» с «год» равным 2025 и «месяц» равным 8 и «день» равным 13 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным ""
ожидается "Aug 13 00:00:00 2025 GMT"
тотальная функция «Время числом»
принимает время: «Время DER»
возвращает число
обеспечивает «время числом неотрицательно» результат не меньше 0
пример «13 августа 2025 полночь»
дано время равно запись «Время DER» с «год» равным 2025 и «месяц» равным 8 и «день» равным 13 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным ""
ожидается 20250813000000
| Function | Termination | Claims |
|---|---|---|
| «Октет» | доказано композицией | доказано 1 из 1 |
| «Шаг куска» | доказано композицией | доказано 2 из 2 |
| «Ход по куску» | доказано композицией | доказано 3 из 3 |
| «Кусок» | доказано композицией | доказано 1 из 1 |
| «Отбросить начало» | доказано структурой | доказано 1 из 1 |
| «Взять начало» | доказано структурой | доказано 1 из 1 |
| «Делить нацело» | доказано композицией | доказано 1 из 1 |
| «Разобрать меру» | доказано композицией | доказано 4 из 5; «у меры без беды хотя бы один октет длины» — сетка |
| «Число из октетов» | доказано композицией | доказано 1 из 1 |
| «Разобрать голову» | доказано композицией | доказано 11 из 12; «при короткой неотрицательной мере конец не раньше начала» — сетка |
| «Собрать голову» | доказано композицией | доказано 5 из 5 |
| «Содержимое» | доказано композицией | доказано 1 из 1 |
| «Шаг обхода» | доказано композицией | доказано 2 из 2 |
| «Шаг вперёд» | доказано композицией | доказано 4 из 4 |
| «Ход по вложенным» | доказано композицией | доказано 0 из 1; «мест не больше, чем всех октетов» — сетка |
| «Вложенные» | доказано композицией | доказано 1 из 1 |
| «Вложенное по счёту» | доказано композицией | доказано 0 из 1; «место вложенного либо ноль, либо лежит внутри октетов» — сетка |
| «Целое DER» | доказано композицией | доказано 0 из 1; «пустое целое равно нулю» — сетка |
| «Цифра DER» | доказано композицией | доказано 1 из 1 |
| «Октет шестнадцатеричным» | доказано композицией | доказано 1 из 1 |
| «Шаг шестнадцатеричного» | доказано композицией | доказано 1 из 1 |
| «Октеты шестнадцатеричным» | доказано композицией | доказано 0 из 1; «на каждый октет ровно два знака» — сетка |
| «Шаг двоеточий» | доказано композицией | доказано 2 из 2 |
| «Октеты двоеточиями» | доказано композицией | доказано 1 из 2; «не больше трёх знаков на октет» — сетка |
| «Знак октета» | доказано композицией | доказано 1 из 1 |
| «Строка DER» | доказано композицией | доказано 1 из 1 |
| «Закрыть узел OID» | доказано композицией | доказано 1 из 1 |
| «Шаг OID» | доказано композицией | доказано 1 из 1 |
| «Идентификатор объекта» | доказано композицией | доказано 1 из 1 |
| «Цифра октета» | доказано композицией | доказано 2 из 3; «цифра не больше девяти» — сетка |
| «Двузначное» | доказано композицией | доказано 0 из 1; «двузначное не больше девяноста девяти» — сетка |
| «Разобрать время» | доказано композицией | доказано 2 из 4; «месяц не больше девяноста девяти» — сетка; «у времени без беды год не меньше тысяча девятьсот пятидесятого» — сетка |
| «Название месяца» | доказано композицией | доказано 2 из 3; «название месяца — ровно три знака» — сетка |
| «Два знака» | доказано композицией | доказано 1 из 1 |
| «Время как у openssl» | доказано композицией | доказано 1 из 1 |
| «Время числом» | доказано композицией | доказано 0 из 1; «время числом неотрицательно» — сетка |
«Dictionary»
flang/stdlib/dictionary.flang — functions 14; the kernel ledger was taken from this version of the file
тип «Связь»
вариант «Связь» содержит ключ: строка, значение: строка
тотальная функция «Ключ связи»
принимает связь: «Связь»
возвращает строка
обеспечивает «ключ связи — это ключ, записанный в связи» результат равен связь.ключ
пример «Ключ достаётся из связи»
дано связь равно вариант «Связь» с ключ равным "имя" и значение равным "Марат"
ожидается "имя"
тотальная функция «Значение связи»
принимает связь: «Связь»
возвращает строка
обеспечивает «значение связи — это значение, записанное в связи» результат равен связь.значение
пример «Значение достаётся из связи»
дано связь равно вариант «Связь» с ключ равным "имя" и значение равным "Марат"
ожидается "Марат"
тотальная функция «Шаг поиска ключа»
принимает найдено: признак, связь: «Связь», искомый: строка
возвращает признак
обеспечивает «совпавший ключ даёт да» если «Ключ связи» от связь равно искомый то результат равен да иначе да
обеспечивает «однажды найденное не теряется» если найдено равен да то результат равен да иначе да
обеспечивает «чужой ключ накопленное не меняет» если не («Ключ связи» от связь равно искомый) то (результат равен найдено) иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (да)) или ((результат равен (найдено)))
пример «Совпало — да»
дано найдено равно нет
дано связь равно вариант «Связь» с ключ равным "имя" и значение равным "Марат"
дано искомый равно "имя"
ожидается да
тотальная функция «Есть ключ»
принимает словарь: список «Связь», искомый: строка
возвращает признак
обеспечивает «ключ найден ровно тогда, когда он есть среди ключей» результат равен ((«Ключи» от словарь) содержит искомый)
пример «Ключ есть»
дано словарь равно [вариант «Связь» с ключ равным "имя" и значение равным "Марат"]
дано искомый равно "имя"
ожидается да
тотальная функция «Шаг взятия»
принимает итог: строка, связь: «Связь», искомый: строка
возвращает строка
обеспечивает «совпавший ключ отдаёт своё значение» если «Ключ связи» от связь равно искомый то результат равен («Значение связи» от связь) иначе да
обеспечивает «чужой ключ ничего не меняет» если не («Ключ связи» от связь равно искомый) то результат равен итог иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен («Значение связи» от связь)) или ((результат равен (итог)))
пример «Совпало — берётся значение связи»
дано итог равно "неизвестно"
дано связь равно вариант «Связь» с ключ равным "имя" и значение равным "Марат"
дано искомый равно "имя"
ожидается "Марат"
тотальная функция «Взять или запасное»
принимает словарь: список «Связь», искомый: строка, запасное: строка
возвращает строка
обеспечивает «чего нет среди ключей, того и не взято: отдаётся запасное» если ((«Ключи» от словарь) содержит искомый) то да иначе (результат равен запасное)
обеспечивает «взятое — либо одно из значений словаря, либо запасное» ((«Значения» от словарь) содержит результат) или (результат равен запасное)
пример «Значение по ключу»
дано словарь равно [вариант «Связь» с ключ равным "имя" и значение равным "Марат"]
дано искомый равно "имя"
дано запасное равно "неизвестно"
ожидается "Марат"
тотальная функция «Убрать»
принимает словарь: список «Связь», искомый: строка
возвращает список «Связь»
обеспечивает «удаление не удлиняет словарь» (длина результат) не больше (длина словарь)
обеспечивает «удаление оставляет ровно связи с другими ключами» (длина результат) равен (длина (отфильтровать («Ключи» от словарь) где клч → (не (клч равен искомый))))
обеспечивает «убранного ключа больше нет, а прочие ключи остались» ((не ((«Ключи» от результат) содержит искомый)) равен да) и притом ((длина (отфильтровать («Ключи» от словарь) где клч → ((не (клч равен искомый)) и притом (не ((«Ключи» от результат) содержит клч))))) равен 0)
пример «Единственная связь убирается»
дано словарь равно [вариант «Связь» с ключ равным "имя" и значение равным "Марат"]
дано искомый равно "имя"
ожидается []
тотальная функция «Положить»
принимает словарь: список «Связь», ключ: строка, значение: строка
возвращает список «Связь»
обеспечивает «после записи словарь непуст» 1 не больше (длина результат)
обеспечивает «запись удлиняет словарь не больше чем на одну связь» (длина результат) не больше ((длина словарь) плюс 1)
обеспечивает «положенная связь стоит в словаре» результат содержит (вариант «Связь» с ключ равным ключ и значение равным значение)
обеспечивает «положенный ключ есть, и по нему лежит положенное значение» (((«Ключи» от результат) содержит ключ) равен да) и притом ((«Взять или запасное» от результат и ключ и "") равен значение)
обеспечивает «в словаре остались прочие ключи и ровно одна связь по этому» (длина результат) равен (1 плюс (длина (отфильтровать («Ключи» от словарь) где клч → (не (клч равен ключ)))))
пример «В пустой словарь»
дано словарь равно []
дано ключ равно "имя"
дано значение равно "Марат"
ожидается [вариант «Связь» с ключ равным "имя" и значение равным "Марат"]
тотальная функция «Шаг сбора ключей»
принимает собранные: список строки, связь: «Связь»
возвращает список строки
обеспечивает «сбор растёт ровно на один» (длина результат) равен ((длина собранные) плюс 1)
обеспечивает «дописан ключ этой связи» результат содержит («Ключ связи» от связь)
обеспечивает «сбор — это прежний сбор с дописанным ключом» результат равен (добавить («Ключ связи» от связь) к собранные)
пример «Ключ дописывается в конец»
дано собранные равно ["имя"]
дано связь равно вариант «Связь» с ключ равным "город" и значение равным "Казань"
ожидается ["имя", "город"]
тотальная функция «Ключи»
принимает словарь: список «Связь»
возвращает список строки
обеспечивает «ключей ровно столько, сколько связей» (длина результат) равен (длина словарь)
обеспечивает «в ключах — ключ каждой связи» (длина (отфильтровать словарь где св → (не (результат содержит («Ключ связи» от св))))) равен 0
пример «Все ключи по порядку»
дано словарь равно [вариант «Связь» с ключ равным "имя" и значение равным "Марат",
вариант «Связь» с ключ равным "город" и значение равным "Казань"]
ожидается ["имя", "город"]
тотальная функция «Шаг сбора значений»
принимает собранные: список строки, связь: «Связь»
возвращает список строки
обеспечивает «сбор растёт ровно на один» (длина результат) равен ((длина собранные) плюс 1)
обеспечивает «дописано значение этой связи» результат содержит («Значение связи» от связь)
обеспечивает «сбор — это прежний сбор с дописанным значением» результат равен (добавить («Значение связи» от связь) к собранные)
пример «Значение дописывается в конец»
дано собранные равно ["Марат"]
дано связь равно вариант «Связь» с ключ равным "город" и значение равным "Казань"
ожидается ["Марат", "Казань"]
тотальная функция «Значения»
принимает словарь: список «Связь»
возвращает список строки
обеспечивает «значений ровно столько, сколько связей» (длина результат) равен (длина словарь)
обеспечивает «в значениях — значение каждой связи» (длина (отфильтровать словарь где св → (не (результат содержит («Значение связи» от св))))) равен 0
пример «Все значения по порядку»
дано словарь равно [вариант «Связь» с ключ равным "имя" и значение равным "Марат",
вариант «Связь» с ключ равным "город" и значение равным "Казань"]
ожидается ["Марат", "Казань"]
тотальная функция «Шаг счёта связей»
принимает сколько: число, связь: «Связь»
возвращает число
обеспечивает «счёт растёт ровно на один» результат равен (сколько плюс 1)
пример «Счёт прибавляется»
дано сколько равно 1
дано связь равно вариант «Связь» с ключ равным "город" и значение равным "Казань"
ожидается 2
тотальная функция «Размер»
принимает словарь: список «Связь»
возвращает число
обеспечивает «размер словаря неотрицателен» результат не меньше 0
обеспечивает «размер словаря не больше длины его списка» результат не больше (длина словарь)
обеспечивает «размер — это длина списка связей» результат равен (длина словарь)
пример «Две связи»
дано словарь равно [вариант «Связь» с ключ равным "имя" и значение равным "Марат",
вариант «Связь» с ключ равным "город" и значение равным "Казань"]
ожидается 2
| Function | Termination | Claims |
|---|---|---|
| «Ключ связи» | доказано композицией | доказано 1 из 1 |
| «Значение связи» | доказано композицией | доказано 1 из 1 |
| «Шаг поиска ключа» | доказано композицией | доказано 4 из 4 |
| «Есть ключ» | доказано композицией | доказано 0 из 1; «ключ найден ровно тогда, когда он есть среди ключей» — сетка |
| «Шаг взятия» | доказано композицией | доказано 3 из 3 |
| «Взять или запасное» | доказано композицией | доказано 0 из 2; «чего нет среди ключей, того и не взято: отдаётся запасное» — сетка; «взятое — либо одно из значений словаря, либо запасное» — сетка |
| «Убрать» | доказано композицией | доказано 1 из 3; «удаление оставляет ровно связи с другими ключами» — сетка; «убранного ключа больше нет, а прочие ключи остались» — сетка |
| «Положить» | доказано композицией | доказано 4 из 5; «положенный ключ есть, и по нему лежит положенное значение» — сетка |
| «Шаг сбора ключей» | доказано композицией | доказано 3 из 3 |
| «Ключи» | доказано композицией | доказано 1 из 2; «в ключах — ключ каждой связи» — сетка |
| «Шаг сбора значений» | доказано композицией | доказано 3 из 3 |
| «Значения» | доказано композицией | доказано 1 из 2; «в значениях — значение каждой связи» — сетка |
| «Шаг счёта связей» | доказано композицией | доказано 1 из 1 |
| «Размер» | доказано композицией | доказано 3 из 3 |
«DNS»
flang/stdlib/dns.flang — functions 38; the kernel ledger was taken from this version of the file
тип «Заголовок DNS»
вариант «Заголовок DNS» содержит идентификатор: число, флаги: число, вопросов: число, ответов: число, властных: число, дополнительных: число
тип «Вопрос DNS»
вариант «Вопрос DNS» содержит имя: строка, тип: число, класс: число
тип «Данные записи»
вариант «Адрес IPv4» содержит адрес: строка
вариант «Адрес IPv6» содержит адрес: строка
вариант «Каноническое имя» содержит имя: строка
вариант «Сервер имён» содержит имя: строка
вариант «Почтовый обмен» содержит приоритет: число, имя: строка
вариант «Текст» содержит текст: строка
вариант «Данные как есть» содержит октеты: список строки
тип «Запись DNS»
вариант «Запись DNS» содержит имя: строка, тип: число, класс: число, «время жизни»: число, данные: «Данные записи»
тип «Пакет DNS»
вариант «Пакет DNS» содержит заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», ответы: список «Запись DNS», властные: список «Запись DNS», дополнительные: список «Запись DNS»
тип «Итог пакета DNS»
вариант «Пакет разобран» содержит пакет: «Пакет DNS»
вариант «Пакет испорчен» содержит причина: строка, место: число
тип «Итог заголовка»
вариант «Заголовок разобран» содержит заголовок: «Заголовок DNS»
вариант «Заголовок испорчен» содержит причина: строка, место: число
тип «Итог имени»
вариант «Имя разобрано» содержит имя: строка, место: число
вариант «Имя испорчено» содержит причина: строка, место: число
тип «Итог вопроса»
вариант «Вопрос разобран» содержит вопрос: «Вопрос DNS», место: число
вариант «Вопрос испорчен» содержит причина: строка, место: число
тип «Итог вопросов»
вариант «Вопросы разобраны» содержит вопросы: список «Вопрос DNS», место: число
вариант «Вопросы испорчены» содержит причина: строка, место: число
тип «Итог данных записи»
вариант «Данные разобраны» содержит данные: «Данные записи»
вариант «Данные испорчены» содержит причина: строка, место: число
тип «Итог записи»
вариант «Запись разобрана» содержит «запись»: «Запись DNS», место: число
вариант «Запись испорчена» содержит причина: строка, место: число
тип «Итог записей»
вариант «Записи разобраны» содержит записи: список «Запись DNS», место: число
вариант «Записи испорчены» содержит причина: строка, место: число
тотальная функция «Октет пакета»
принимает пакет: список строки, место: число
возвращает число
обеспечивает «за пределами пакета октета нет — минус один» если (место меньше 0) или (место не меньше (длина пакет)) то (результат равен (0 минус 1)) иначе да
пример «пакет — список знаков с кодами 0…255, октет на знак, как в Wire: первый октет запроса 0x12»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано место равно 0
ожидается 18
тотальная функция «Хватает октетов»
принимает пакет: список строки, место: число, сколько: число
возвращает признак
обеспечивает «с отрицательного места октетов не хватает» не (место меньше 0) или (результат равен нет)
обеспечивает «хватает ровно тогда, когда конец отрезка не за пакетом» не (место не меньше 0) или (результат равен ((место плюс сколько) не больше (длина пакет)))
пример «двенадцати октетов заголовка в запросе хватает»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано место равно 0
дано сколько равно 12
ожидается да
тотальная функция «Целое с места»
принимает пакет: список строки, место: число, ширина: неотрицательное
возвращает число
обеспечивает «целое с места неотрицательно» результат не меньше 0
пример «идентификатор запроса — два октета с нулевого места, 0x1234»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано место равно 0
дано ширина равно 2
ожидается 4660
тотальная функция «Первые октеты»
принимает знаки: список строки, сколько: число
возвращает список строки
обеспечивает «первых берётся не больше, чем просили» не (((сколько остаток от 1) равен 0) и притом (сколько не меньше 0)) или ((длина результат) не больше сколько)
обеспечивает «первых берётся не больше, чем есть» (длина результат) не больше (длина знаки)
пример «первые три знака»
дано знаки равно ["w", "w", "w", "\u0007"]
дано сколько равно 3
ожидается ["w", "w", "w"]
тотальная функция «Отрезок пакета»
принимает пакет: список строки, место: число, сколько: число
возвращает список строки
обеспечивает «отрезок не длиннее пакета» (длина результат) не больше (длина пакет)
пример «метка www — три октета с места 13»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано место равно 13
дано сколько равно 3
ожидается ["w", "w", "w"]
тотальная функция «Дописать октеты»
принимает начало: список строки, продолжение: список строки
возвращает список строки
обеспечивает «длины складываются» (длина результат) равен ((длина начало) плюс (длина продолжение))
пример «продолжение дописывается за началом»
дано начало равно ["a", "b"]
дано продолжение равно ["c"]
ожидается ["a", "b", "c"]
тотальная функция «Знак октета»
принимает октет: число
возвращает строка
обеспечивает «знак октета — ровно один знак» (длина результат) равен 1
обеспечивает «октет из отрезка 0…255 даёт знак со своим кодом» не ((октет не меньше 0) и притом (октет меньше 256) и притом (((октет остаток от 1) плюс 0) равен 0)) или ((код символа результат) равен октет)
пример «сто девяносто два — знак указателя; Знак байта из Wire дал бы здесь пустую строку»
дано октет равно 192
ожидается "\u00C0"
тотальная функция «Код октета»
принимает знак: строка
возвращает число
обеспечивает «пустой знак — ноль» если (длина знак) равен 0 то (результат равен 0) иначе да
обеспечивает «непустой знак — код его символа» если (длина знак) равен 0 то да иначе (результат равен (код символа знак))
пример «знак с кодом 93»
дано знак равно "]"
ожидается 93
тотальная функция «Умещается в два октета»
принимает значение: число
возвращает признак
обеспечивает «отрицательное не умещается» не (значение меньше 0) или (результат равен нет)
обеспечивает «от 65536 не умещается» не (значение не меньше 65536) или (результат равен нет)
пример «65535 умещается»
дано значение равно 65535
ожидается да
тотальная функция «Два октета DNS»
принимает значение: число
возвращает список строки
обеспечивает «ровно два октета» (длина результат) равен 2
обеспечивает «умещающееся значение читается из своих октетов обратно» не («Умещается в два октета» от значение) или ((«Целое с места» от результат и 0 и 2) равен значение)
пример «0x1234 — октеты 0x12 и 0x34»
дано значение равно 4660
ожидается ["\u0012", "4"]
тотальная функция «Четыре октета DNS»
принимает значение: число
возвращает список строки
обеспечивает «ровно четыре октета» (длина результат) равен 4
обеспечивает «целое из отрезка 0…2^32 читается из своих октетов обратно» не ((значение не меньше 0) и притом (значение меньше 4294967296) и притом (((значение остаток от 1) плюс 0) равен 0)) или ((«Целое с места» от результат и 0 и 4) равен значение)
пример «триста — 00 00 01 2c»
дано значение равно 300
ожидается ["\u0000", "\u0000", "\u0001", ","]
тотальная функция «Разобрать заголовок»
принимает пакет: список строки
возвращает «Итог заголовка»
обеспечивает «короче двенадцати октетов — байтов не хватило» не ((длина пакет) меньше 12) или (результат равен (вариант «Заголовок испорчен» с причина равным "байтов не хватило" и место равным 0))
обеспечивает «заголовок разобран только от двенадцати октетов, а отказ несёт непустую причину» разбор результат
случай вариант «Заголовок разобран» с заголовок как заголовок
то (длина пакет) не меньше 12
случай вариант «Заголовок испорчен» с причина как причина и место как точка
то (длина причина) больше 0
пример «заголовок запроса: 0x1234, флаги 0x0100, один вопрос»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
ожидается вариант «Заголовок разобран» с заголовок равным (вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0)
тотальная функция «Собрать заголовок»
принимает заголовок: «Заголовок DNS»
возвращает список строки
обеспечивает «заголовок — ровно двенадцать октетов» (длина результат) равен 12
обеспечивает «круг заголовка: собранный из полей в два октета разбирается в него же» разбор заголовок
случай вариант «Заголовок DNS» с идентификатор как идентификатор и флаги как флаги и вопросов как вопросов и ответов как ответов и властных как властных и дополнительных как дополнительных
то не ((«Умещается в два октета» от идентификатор) и притом («Умещается в два октета» от флаги) и притом («Умещается в два октета» от вопросов) и притом («Умещается в два октета» от ответов) и притом («Умещается в два октета» от властных) и притом («Умещается в два октета» от дополнительных)) или ((«Разобрать заголовок» от результат) равен (вариант «Заголовок разобран» с заголовок равным заголовок))
пример «заголовок запроса собирается в двенадцать октетов RFC 1035»
дано заголовок равно вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0
ожидается ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000"]
тотальная функция «Имя по указателю»
принимает место: число, итог: «Итог имени»
возвращает «Итог имени»
обеспечивает «конец имени по указателю — сразу за двумя октетами указателя, куда бы он ни вёл» разбор результат
случай вариант «Имя разобрано» с имя как имя и место как конец
то конец равен (место плюс 2)
случай вариант «Имя испорчено» с причина как причина и место как точка
то да
обеспечивает «порча имени проходит через указатель как есть» разбор итог
случай вариант «Имя разобрано» с имя как имя и место как конец
то да
случай вариант «Имя испорчено» с причина как причина и место как точка
то результат равен итог
пример «имя по указателю: имя от цели, конец от указателя»
дано место равно 33
дано итог равно вариант «Имя разобрано» с имя равным "www.example.com" и место равным 29
ожидается вариант «Имя разобрано» с имя равным "www.example.com" и место равным 35
тотальная функция «Имя с меткой»
принимает метка: строка, место: число, итог: «Итог имени»
возвращает «Итог имени»
обеспечивает «имя с меткой не длиннее 255 знаков» разбор результат
случай вариант «Имя разобрано» с имя как имя и место как конец
то (длина имя) не больше 255
случай вариант «Имя испорчено» с причина как причина и место как точка
то да
обеспечивает «имя с меткой начинается с метки» разбор результат
случай вариант «Имя разобрано» с имя как имя и место как конец
то имя начинается с метка
случай вариант «Имя испорчено» с причина как причина и место как точка
то да
обеспечивает «порча хвоста проходит как есть» разбор итог
случай вариант «Имя разобрано» с имя как имя и место как конец
то да
случай вариант «Имя испорчено» с причина как причина и место как точка
то результат равен итог
пример «метка перед пустым хвостом — без точки»
дано метка равно "com"
дано место равно 24
дано итог равно вариант «Имя разобрано» с имя равным "" и место равным 29
ожидается вариант «Имя разобрано» с имя равным "com" и место равным 29
тотальная функция «Разобрать имя»
принимает пакет: список строки, место: число, витков: неотрицательное
возвращает «Итог имени»
обеспечивает «разобранное имя не длиннее 255 знаков, а отказ несёт непустую причину» разбор результат
случай вариант «Имя разобрано» с имя как имя и место как конец
то (длина имя) не больше 255
случай вариант «Имя испорчено» с причина как причина и место как точка
то (длина причина) больше 0
обеспечивает «без витков — указатель имени зациклен» не (витков не больше 0) или (результат равен (вариант «Имя испорчено» с причина равным "указатель имени зациклен" и место равным место))
обеспечивает «разобранное имя кончается дальше своего начала» разбор результат
случай вариант «Имя разобрано» с имя как имя и место как конец
то конец больше место
случай вариант «Имя испорчено» с причина как причина и место как точка
то да
пример «www.example.com с места 12: три метки с длинами до нуля, конец на 29»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m", "\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано место равно 12
дано витков равно 33
ожидается вариант «Имя разобрано» с имя равным "www.example.com" и место равным 29
тотальная функция «Дописать метку»
принимает собрано: список строки, метка: строка
возвращает список строки
обеспечивает «пустая метка ничего не дописывает» если (длина метка) равен 0 то (результат равен собрано) иначе да
обеспечивает «непустая метка дописывает октет длины и свои знаки» если (длина метка) равен 0 то да иначе ((длина результат) равен ((длина собрано) плюс 1 плюс (длина метка)))
пример «метка www — октет 3 и три знака»
дано собрано равно []
дано метка равно "www"
ожидается ["\u0003", "w", "w", "w"]
тотальная функция «Собрать имя»
принимает имя: строка
возвращает список строки
обеспечивает «собранное имя кончается нулевым октетом» (элемент (длина результат) в результат) равен "\u0000"
обеспечивает «собранное имя не короче одного октета» (длина результат) не меньше 1
обеспечивает «имя из меток не длиннее 63 знаков разбирается с нулевого места до своего конца» разбор («Разобрать имя» от результат и 0 и (длина результат))
случай вариант «Имя разобрано» с имя как обратно и место как конец
то не (свёртка (разделить имя по ".") начиная с да как годно и метка → годно и притом ((длина метка) не больше 63)) или (конец равен (длина результат))
случай вариант «Имя испорчено» с причина как причина и место как точка
то да
пример «www.example.com — 17 октетов: три метки с длинами и нуль»
дано имя равно "www.example.com"
ожидается ["\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m", "\u0000"]
тотальная функция «Разобрать вопрос»
принимает пакет: список строки, место: число
возвращает «Итог вопроса»
обеспечивает «разобранный вопрос кончается дальше начала, а отказ несёт непустую причину» разбор результат
случай вариант «Вопрос разобран» с вопрос как вопрос и место как конец
то конец больше место
случай вариант «Вопрос испорчен» с причина как причина и место как точка
то (длина причина) больше 0
пример «вопрос запроса: www.example.com, тип A, класс IN, конец на 33»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано место равно 12
ожидается вариант «Вопрос разобран» с вопрос равным (вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1) и место равным 33
тотальная функция «Собрать вопрос»
принимает имя: строка, вид: число, класс: число
возвращает список строки
обеспечивает «вопрос длиннее собранного имени ровно на четыре октета» (длина результат) равен ((длина («Собрать имя» от имя)) плюс 4)
пример «вопрос www.example.com A IN — 21 октет»
дано имя равно "www.example.com"
дано вид равно 1
дано класс равно 1
ожидается ["\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m", "\u0000",
"\u0000", "\u0001", "\u0000", "\u0001"]
тотальная функция «Данные с именем»
принимает вид: число, приоритет: число, итог: «Итог имени»
возвращает «Итог данных записи»
обеспечивает «порча имени — порча данных с той же причиной и местом» разбор итог
случай вариант «Имя разобрано» с имя как имя и место как конец
то да
случай вариант «Имя испорчено» с причина как причина и место как точка
то результат равен (вариант «Данные испорчены» с причина равным причина и место равным точка)
обеспечивает «тип 5 с разобранным именем — каноническое имя» разбор итог
случай вариант «Имя разобрано» с имя как имя и место как конец
то не (вид равен 5) или (результат равен (вариант «Данные разобраны» с данные равным (вариант «Каноническое имя» с имя равным имя)))
случай вариант «Имя испорчено» с причина как причина и место как точка
то да
пример «тип 5 — каноническое имя»
дано вид равно 5
дано приоритет равно 0
дано итог равно вариант «Имя разобрано» с имя равным "example.com" и место равным 47
ожидается вариант «Данные разобраны» с данные равным (вариант «Каноническое имя» с имя равным "example.com")
тотальная функция «Разобрать данные записи»
принимает пакет: список строки, место: число, размер: число, вид: число
возвращает «Итог данных записи»
обеспечивает «тип вне шести известных отдаёт данные как есть» не ((не (вид равен 1)) и притом (не (вид равен 28)) и притом (не (вид равен 5)) и притом (не (вид равен 2)) и притом (не (вид равен 15)) и притом (не (вид равен 16))) или (результат равен (вариант «Данные разобраны» с данные равным (вариант «Данные как есть» с октеты равным («Отрезок пакета» от пакет и место и размер))))
обеспечивает «отказ данных несёт непустую причину» разбор результат
случай вариант «Данные разобраны» с данные как данные
то да
случай вариант «Данные испорчены» с причина как причина и место как точка
то (длина причина) больше 0
пример «A: четыре октета — адрес IPv4»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m", "\u0000", "\u0000", "\u0001", "\u0000", "\u0001", "\u00C0", "\u000C", "\u0000", "\u0001", "\u0000", "\u0001", "\u0000", "\u0000", "\u0001", ",", "\u0000", "\u0004", "]", "\u00B8", "\u00D8", "\""]
дано место равно 45
дано размер равно 4
дано вид равно 1
ожидается вариант «Данные разобраны» с данные равным (вариант «Адрес IPv4» с адрес равным "93.184.216.34")
тотальная функция «Запись с данными»
принимает имя: строка, вид: число, класс: число, срок: число, конец: число, итог: «Итог данных записи»
возвращает «Итог записи»
обеспечивает «порча данных проходит в запись с той же причиной и местом» разбор итог
случай вариант «Данные разобраны» с данные как данные
то да
случай вариант «Данные испорчены» с причина как причина и место как точка
то результат равен (вариант «Запись испорчена» с причина равным причина и место равным точка)
обеспечивает «разобранная запись кончается на переданном конце» разбор результат
случай вариант «Запись разобрана» с «запись» как ресурс и место как точка
то точка равен конец
случай вариант «Запись испорчена» с причина как причина и место как точка
то да
пример «разобранные данные ложатся в запись»
дано имя равно "www.example.com"
дано вид равно 1
дано класс равно 1
дано срок равно 300
дано конец равно 49
дано итог равно вариант «Данные разобраны» с данные равным (вариант «Адрес IPv4» с адрес равным "93.184.216.34")
ожидается вариант «Запись разобрана» с «запись» равным (вариант «Запись DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1 и «время жизни» равным 300 и данные равным (вариант «Адрес IPv4» с адрес равным "93.184.216.34")) и место равным 49
тотальная функция «Запись после имени»
принимает пакет: список строки, имя: строка, место: число
возвращает «Итог записи»
обеспечивает «без десяти октетов после имени — байтов не хватило на месте после имени» («Хватает октетов» от пакет и место и 10) или (результат равен (вариант «Запись испорчена» с причина равным "байтов не хватило" и место равным место))
пример «после имени на 35: тип 1, класс 1, время жизни 300, четыре октета адреса, конец на 49»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m", "\u0000", "\u0000", "\u0001", "\u0000", "\u0001", "\u00C0", "\u000C", "\u0000", "\u0001", "\u0000", "\u0001", "\u0000", "\u0000", "\u0001", ",", "\u0000", "\u0004", "]", "\u00B8", "\u00D8", "\""]
дано имя равно "www.example.com"
дано место равно 35
ожидается вариант «Запись разобрана» с «запись» равным (вариант «Запись DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1 и «время жизни» равным 300 и данные равным (вариант «Адрес IPv4» с адрес равным "93.184.216.34")) и место равным 49
тотальная функция «Разобрать запись»
принимает пакет: список строки, место: число
возвращает «Итог записи»
обеспечивает «разобранная запись кончается дальше начала, а отказ несёт непустую причину» разбор результат
случай вариант «Запись разобрана» с «запись» как ресурс и место как конец
то конец больше место
случай вариант «Запись испорчена» с причина как причина и место как точка
то (длина причина) больше 0
пример «запись A по указателю: www.example.com, время жизни 300, адрес 93.184.216.34, конец на 49»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001", "\u00C0", "\u000C", "\u0000", "\u0001", "\u0000", "\u0001",
"\u0000", "\u0000", "\u0001", ",", "\u0000", "\u0004", "]", "\u00B8", "\u00D8", "\""]
дано место равно 33
ожидается вариант «Запись разобрана» с «запись» равным (вариант «Запись DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1 и «время жизни» равным 300 и данные равным (вариант «Адрес IPv4» с адрес равным "93.184.216.34")) и место равным 49
тотальная функция «Разобрать вопросы»
принимает пакет: список строки, место: число, осталось: число, витков: неотрицательное, собрано: список «Вопрос DNS»
возвращает «Итог вопросов»
обеспечивает «когда вопросов не осталось — собранное как есть, с тем же местом» не (осталось не больше 0) или (результат равен (вариант «Вопросы разобраны» с вопросы равным собрано и место равным место))
обеспечивает «отказ несёт непустую причину, а разобранных вопросов не меньше собранных» разбор результат
случай вариант «Вопросы разобраны» с вопросы как вопросы и место как конец
то (длина вопросы) не меньше (длина собрано)
случай вариант «Вопросы испорчены» с причина как причина и место как точка
то (длина причина) больше 0
пример «один вопрос с места 12 — конец на 33»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m", "\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано место равно 12
дано осталось равно 1
дано витков равно 33
дано собрано равно []
ожидается вариант «Вопросы разобраны» с вопросы равным [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1] и место равным 33
тотальная функция «Разобрать записи»
принимает пакет: список строки, место: число, осталось: число, витков: неотрицательное, собрано: список «Запись DNS»
возвращает «Итог записей»
обеспечивает «когда записей не осталось — собранное как есть, с тем же местом» не (осталось не больше 0) или (результат равен (вариант «Записи разобраны» с записи равным собрано и место равным место))
обеспечивает «отказ несёт непустую причину, а разобранных записей не меньше собранных» разбор результат
случай вариант «Записи разобраны» с записи как записи и место как конец
то (длина записи) не меньше (длина собрано)
случай вариант «Записи испорчены» с причина как причина и место как точка
то (длина причина) больше 0
пример «две записи ответа с места 33 — конец на 63»
дано пакет равно ["\u0012", "4", "\u0081", "\u0080", "\u0000", "\u0001", "\u0000", "\u0002", "\u0000", "\u0000", "\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m", "\u0000", "\u0000", "\u0001", "\u0000", "\u0001", "\u00C0", "\u000C", "\u0000", "\u0005", "\u0000", "\u0001", "\u0000", "\u0000", "\u0001", ",", "\u0000", "\u0002", "\u00C0", "\u0010", "\u00C0", "\u0010", "\u0000", "\u0001", "\u0000", "\u0001", "\u0000", "\u0000", "\u0001", ",", "\u0000", "\u0004", "]", "\u00B8", "\u00D8", "\""]
дано место равно 33
дано осталось равно 2
дано витков равно 63
дано собрано равно []
ожидается вариант «Записи разобраны» с записи равным [вариант «Запись DNS» с имя равным "www.example.com" и тип равным 5 и класс равным 1 и «время жизни» равным 300 и данные равным (вариант «Каноническое имя» с имя равным "example.com"), вариант «Запись DNS» с имя равным "example.com" и тип равным 1 и класс равным 1 и «время жизни» равным 300 и данные равным (вариант «Адрес IPv4» с адрес равным "93.184.216.34")] и место равным 63
тотальная функция «Пакет после властных»
принимает пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», ответы: список «Запись DNS», властные: список «Запись DNS», место: число
возвращает «Итог пакета DNS»
обеспечивает «отказ несёт непустую причину» разбор результат
случай вариант «Пакет разобран» с пакет как разобранный
то да
случай вариант «Пакет испорчен» с причина как причина и место как точка
то (длина причина) больше 0
пример «без дополнительных записей пакет собирается из уже разобранного»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано заголовок равно вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0
дано вопросы равно [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1]
дано ответы равно []
дано властные равно []
дано место равно 33
ожидается вариант «Пакет разобран» с пакет равным (вариант «Пакет DNS» с заголовок равным (вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0) и вопросы равным [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1] и ответы равным [] и властные равным [] и дополнительные равным [])
тотальная функция «Пакет после ответов»
принимает пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», ответы: список «Запись DNS», место: число
возвращает «Итог пакета DNS»
обеспечивает «отказ несёт непустую причину» разбор результат
случай вариант «Пакет разобран» с пакет как разобранный
то да
случай вариант «Пакет испорчен» с причина как причина и место как точка
то (длина причина) больше 0
пример «без властных и дополнительных пакет собирается из уже разобранного»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано заголовок равно вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0
дано вопросы равно [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1]
дано ответы равно []
дано место равно 33
ожидается вариант «Пакет разобран» с пакет равным (вариант «Пакет DNS» с заголовок равным (вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0) и вопросы равным [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1] и ответы равным [] и властные равным [] и дополнительные равным [])
тотальная функция «Пакет после вопросов»
принимает пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», место: число
возвращает «Итог пакета DNS»
обеспечивает «отказ несёт непустую причину» разбор результат
случай вариант «Пакет разобран» с пакет как разобранный
то да
случай вариант «Пакет испорчен» с причина как причина и место как точка
то (длина причина) больше 0
пример «без ответов пакет собирается из уже разобранного»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано заголовок равно вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0
дано вопросы равно [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1]
дано место равно 33
ожидается вариант «Пакет разобран» с пакет равным (вариант «Пакет DNS» с заголовок равным (вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0) и вопросы равным [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1] и ответы равным [] и властные равным [] и дополнительные равным [])
тотальная функция «Пакет после заголовка»
принимает пакет: список строки, заголовок: «Заголовок DNS»
возвращает «Итог пакета DNS»
обеспечивает «отказ несёт непустую причину» разбор результат
случай вариант «Пакет разобран» с пакет как разобранный
то да
случай вариант «Пакет испорчен» с причина как причина и место как точка
то (длина причина) больше 0
пример «вопросы читаются с места 12»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
дано заголовок равно вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0
ожидается вариант «Пакет разобран» с пакет равным (вариант «Пакет DNS» с заголовок равным (вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0) и вопросы равным [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1] и ответы равным [] и властные равным [] и дополнительные равным [])
тотальная функция «Разобрать пакет»
принимает пакет: список строки
возвращает «Итог пакета DNS»
обеспечивает «отказ несёт непустую причину» разбор результат
случай вариант «Пакет разобран» с пакет как разобранный
то да
случай вариант «Пакет испорчен» с причина как причина и место как точка
то (длина причина) больше 0
обеспечивает «короче двенадцати октетов — байтов не хватило» не ((длина пакет) меньше 12) или (результат равен (вариант «Пакет испорчен» с причина равным "байтов не хватило" и место равным 0))
пример «запрос www.example.com A, 33 октета по RFC 1035: заголовок и один вопрос»
дано пакет равно ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m",
"\u0000", "\u0000", "\u0001", "\u0000", "\u0001"]
ожидается вариант «Пакет разобран» с пакет равным (вариант «Пакет DNS» с заголовок равным (вариант «Заголовок DNS» с идентификатор равным 4660 и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0) и вопросы равным [вариант «Вопрос DNS» с имя равным "www.example.com" и тип равным 1 и класс равным 1] и ответы равным [] и властные равным [] и дополнительные равным [])
тотальная функция «Собрать запрос»
принимает идентификатор: число, имя: строка, вид: число
возвращает список строки
обеспечивает «запрос — заголовок и вопрос» (длина результат) равен (12 плюс (длина («Собрать вопрос» от имя и вид и 1)))
обеспечивает «запрос начинается заголовком с флагом RD и одним вопросом» («Первые октеты» от результат и 12) равен («Собрать заголовок» от (вариант «Заголовок DNS» с идентификатор равным идентификатор и флаги равным 256 и вопросов равным 1 и ответов равным 0 и властных равным 0 и дополнительных равным 0))
пример «круг: собранный запрос www.example.com A с идентификатором 0x1234 — ровно 33 октета RFC 1035»
дано идентификатор равно 4660
дано имя равно "www.example.com"
дано вид равно 1
ожидается ["\u0012", "4", "\u0001", "\u0000", "\u0000", "\u0001", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0003", "w", "w", "w", "\u0007", "e", "x", "a", "m", "p", "l", "e", "\u0003", "c", "o", "m", "\u0000",
"\u0000", "\u0001", "\u0000", "\u0001"]
тотальная функция «Напечатать IPv4»
принимает октеты: список строки
возвращает строка
обеспечивает «четыре октета — четыре десятичных числа через три точки» не ((длина октеты) равен 4) или ((длина (разделить результат по ".")) равен 4)
пример «93.184.216.34»
дано октеты равно ["]", "\u00B8", "\u00D8", "\""]
ожидается "93.184.216.34"
тотальная функция «Шестнадцатеричная цифра»
принимает значение: число
возвращает строка
обеспечивает «цифра — ровно один знак» (длина результат) равен 1
обеспечивает «вне отрезка 0…15 — ноль» если (значение меньше 0) или (значение больше 15) то (результат равен "0") иначе да
пример «ноль»
дано значение равно 0
ожидается "0"
тотальная функция «Пара шестнадцатеричных»
принимает октет: число
возвращает строка
обеспечивает «октет печатается ровно двумя знаками» (длина результат) равен 2
пример «ноль — 00»
дано октет равно 0
ожидается "00"
тотальная функция «Шаг печати IPv6»
принимает собрано: строка, октет: строка
возвращает строка
обеспечивает «шаг дописывает два знака, а перед новой группой ещё двоеточие» (длина результат) равен ((длина собрано) плюс (если ((длина собрано) остаток от 5) равен 4 то 3 иначе 2))
пример «первый октет группы — без двоеточия»
дано собрано равно ""
дано октет равно " "
ожидается "20"
тотальная функция «Напечатать IPv6»
принимает октеты: список строки
возвращает строка
обеспечивает «шестнадцать октетов — тридцать девять знаков: восемь групп по четыре и семь двоеточий» не ((длина октеты) равен 16) или ((длина результат) равен 39)
обеспечивает «сжатия двумя двоеточиями печать не применяет» не (результат содержит "::")
пример «2001:db8::1 печатается всеми восемью группами, без сжатия ::»
дано октеты равно [" ", "\u0001", "\u000D", "\u00B8", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0000",
"\u0000", "\u0000", "\u0000", "\u0000", "\u0000", "\u0001"]
ожидается "2001:0db8:0000:0000:0000:0000:0000:0001"
| Function | Termination | Claims |
|---|---|---|
| «Октет пакета» | доказано композицией | доказано 1 из 1 |
| «Хватает октетов» | доказано композицией | доказано 2 из 2 |
| «Целое с места» | доказано композицией | доказано 0 из 1; «целое с места неотрицательно» — сетка |
| «Первые октеты» | доказано структурой | доказано 1 из 2; «первых берётся не больше, чем просили» — сетка |
| «Отрезок пакета» | доказано композицией | доказано 0 из 1; «отрезок не длиннее пакета» — сетка |
| «Дописать октеты» | доказано композицией | доказано 1 из 1 |
| «Знак октета» | доказано композицией | доказано 0 из 2; «знак октета — ровно один знак» — сетка; «октет из отрезка 0…255 даёт знак со своим кодом» — сетка |
| «Код октета» | доказано композицией | доказано 2 из 2 |
| «Умещается в два октета» | доказано композицией | доказано 2 из 2 |
| «Два октета DNS» | доказано композицией | доказано 1 из 2; «умещающееся значение читается из своих октетов обратно» — сетка |
| «Четыре октета DNS» | доказано композицией | доказано 0 из 2; «ровно четыре октета» — сетка; «целое из отрезка 0…2^32 читается из своих октетов обратно» — сетка |
| «Разобрать заголовок» | доказано композицией | доказано 1 из 2; «заголовок разобран только от двенадцати октетов, а отказ несёт непустую причину» — сетка |
| «Собрать заголовок» | доказано композицией | доказано 1 из 2; «круг заголовка: собранный из полей в два октета разбирается в него же» — сетка |
| «Имя по указателю» | доказано композицией | доказано 0 из 2; «конец имени по указателю — сразу за двумя октетами указателя, куда бы он ни вёл» — сетка; «порча имени проходит через указатель как есть» — сетка |
| «Имя с меткой» | доказано композицией | доказано 0 из 3; «имя с меткой не длиннее 255 знаков» — сетка; «имя с меткой начинается с метки» — сетка; «порча хвоста проходит как есть» — сетка |
| «Разобрать имя» | доказано точным шагом | доказано 1 из 3; «разобранное имя не длиннее 255 знаков, а отказ несёт непустую причину» — сетка; «разобранное имя кончается дальше своего начала» — сетка |
| «Дописать метку» | доказано композицией | доказано 2 из 2 |
| «Собрать имя» | доказано композицией | доказано 2 из 3; «имя из меток не длиннее 63 знаков разбирается с нулевого места до своего конца» — сетка |
| «Разобрать вопрос» | доказано композицией | доказано 0 из 1; «разобранный вопрос кончается дальше начала, а отказ несёт непустую причину» — сетка |
| «Собрать вопрос» | доказано композицией | доказано 1 из 1 |
| «Данные с именем» | доказано композицией | доказано 0 из 2; «порча имени — порча данных с той же причиной и местом» — сетка; «тип 5 с разобранным именем — каноническое имя» — сетка |
| «Разобрать данные записи» | доказано композицией | доказано 0 из 2; «тип вне шести известных отдаёт данные как есть» — сетка; «отказ данных несёт непустую причину» — сетка |
| «Запись с данными» | доказано композицией | доказано 0 из 2; «порча данных проходит в запись с той же причиной и местом» — сетка; «разобранная запись кончается на переданном конце» — сетка |
| «Запись после имени» | доказано композицией | доказано 1 из 1 |
| «Разобрать запись» | доказано композицией | доказано 0 из 1; «разобранная запись кончается дальше начала, а отказ несёт непустую причину» — сетка |
| «Разобрать вопросы» | доказано постоянным шагом | доказано 1 из 2; «отказ несёт непустую причину, а разобранных вопросов не меньше собранных» — сетка |
| «Разобрать записи» | доказано постоянным шагом | доказано 1 из 2; «отказ несёт непустую причину, а разобранных записей не меньше собранных» — сетка |
| «Пакет после властных» | доказано композицией | доказано 0 из 1; «отказ несёт непустую причину» — сетка |
| «Пакет после ответов» | доказано композицией | доказано 0 из 1; «отказ несёт непустую причину» — сетка |
| «Пакет после вопросов» | доказано композицией | доказано 0 из 1; «отказ несёт непустую причину» — сетка |
| «Пакет после заголовка» | доказано композицией | доказано 0 из 1; «отказ несёт непустую причину» — сетка |
| «Разобрать пакет» | доказано композицией | доказано 1 из 2; «отказ несёт непустую причину» — сетка |
| «Собрать запрос» | доказано композицией | доказано 1 из 2; «запрос начинается заголовком с флагом RD и одним вопросом» — сетка |
| «Напечатать IPv4» | доказано композицией | доказано 0 из 1; «четыре октета — четыре десятичных числа через три точки» — сетка |
| «Шестнадцатеричная цифра» | доказано композицией | доказано 2 из 2 |
| «Пара шестнадцатеричных» | доказано композицией | доказано 1 из 1 |
| «Шаг печати IPv6» | доказано композицией | доказано 1 из 1 |
| «Напечатать IPv6» | доказано композицией | доказано 0 из 2; «шестнадцать октетов — тридцать девять знаков: восемь групп по четыре и семь двоеточий» — сетка; «сжатия двумя двоеточиями печать не применяет» — сетка |
«ECDSA»
flang/stdlib/ecdsa.flang — functions 57; the kernel ledger was taken from this version of the file
объект «Ход переноса»
«столбцы»: список числа
«перенос»: число
объект «Ход займа»
«столбцы»: список числа
«заём»: число
объект «Точка»
«х»: список числа
«у»: список числа
«з»: список числа
тотальная функция «Нулевые разряды»
принимает сколько: число
возвращает список числа
пример «Три нуля»
дано сколько равно 3
ожидается [0, 0, 0]
тотальная функция «Разряд»
принимает разряды: список числа, номер: число
возвращает число
пример «Второй разряд»
дано разряды равно [7, 8, 9]
дано номер равно 2
ожидается 8
тотальная функция «Взять первые»
принимает разряды: список числа, сколько: число
возвращает список числа
обеспечивает «взято не больше, чем было» (длина результат) не больше (длина разряды)
пример «Первые два»
дано разряды равно [1, 2, 3]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Отбросить первые»
принимает разряды: список числа, сколько: число
возвращает список числа
обеспечивает «отброшенное не удлиняет» (длина результат) не больше (длина разряды)
пример «Без первого»
дано разряды равно [1, 2, 3]
дано сколько равно 1
ожидается [2, 3]
тотальная функция «Сложить по разрядам»
принимает первые: список числа, вторые: список числа
возвращает список числа
пример «Разной длины — хвост едет как есть»
дано первые равно [1, 2]
дано вторые равно [10, 20, 30]
ожидается [11, 22, 30]
тотальная функция «Добавить к первому»
принимает разряды: список числа, добавка: число
возвращает список числа
обеспечивает «добавка не меняет числа разрядов» (длина результат) равен (длина разряды)
пример «Добавка ложится на младший разряд»
дано разряды равно [1, 2]
дано добавка равно 5
ожидается [6, 2]
тотальная функция «Шаг переноса»
принимает ход: «Ход переноса», разряд: число
возвращает «Ход переноса»
обеспечивает «шаг переноса ставит ровно один столбец» (длина (результат.«столбцы»)) равен ((длина (ход.«столбцы»)) плюс 1)
пример «Малый разряд ложится столбцом, переноса нет»
дано ход равно (запись «Ход переноса» с «столбцы» равным пустой список и «перенос» равным 0)
дано разряд равно 5
ожидается запись «Ход переноса» с «столбцы» равным [5] и «перенос» равным 0
тотальная функция «Перенос»
принимает разряды: список числа
возвращает «Ход переноса»
обеспечивает «столбцов ровно столько, сколько разрядов» (длина (результат.«столбцы»)) равен (длина разряды)
пример «Три разряда в сетке — ни один не тронут»
дано разряды равно [1, 2, 3]
ожидается запись «Ход переноса» с «столбцы» равным [1, 2, 3] и «перенос» равным 0
тотальная функция «Уложить»
принимает разряды: список числа
возвращает список числа
обеспечивает «разрядов не больше двенадцати» (длина результат) не больше 12
пример «Перенос из младшего разряда»
дано разряды равно [4194305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Вычесть с займом»
принимает первые: список числа, вторые: список числа, заём: число
возвращает «Ход займа»
обеспечивает «столбцов разности столько же, сколько у уменьшаемого» (длина (результат.«столбцы»)) равен (длина первые)
пример «Разность без займа»
дано первые равно [5, 7]
дано вторые равно [3, 2]
дано заём равно 0
ожидается запись «Ход займа» с «столбцы» равным [2, 5] и «заём» равным 0
тотальная функция «Меньше»
принимает а: список числа, б: список числа
возвращает признак
пример «Единица меньше двойки»
дано а равно [1, 0]
дано б равно [2, 0]
ожидается да
тотальная функция «Привести»
принимает а: список числа, предел: список числа
возвращает список числа
обеспечивает «приведение не меняет числа разрядов» (длина результат) равен (длина а)
пример «Больше предела — предел вычитается»
дано а равно [5, 0]
дано предел равно [3, 0]
ожидается [2, 0]
тотальная функция «Это ноль»
принимает разряды: список числа
возвращает признак
пример «Ноль»
дано разряды равно [0, 0, 0]
ожидается да
тотальная функция «Разряды равны»
принимает а: список числа, б: список числа
возвращает признак
пример «Равные»
дано а равно [1, 2]
дано б равно [1, 2]
ожидается да
тотальная функция «Простое»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «p = 2^256 − 2^224 + 2^192 + 2^96 − 1 из FIPS 186-4»
ожидается [4194303, 4194303, 4194303, 4194303, 255, 0, 0, 0, 65536, 0, 4194288, 16383]
тотальная функция «Порядок»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «n — порядок группы точек P-256»
ожидается [2303313, 2821105, 998300, 386977, 3845543, 4125595, 4194303, 4194303, 65535, 0, 4194288, 16383]
тотальная функция «Ноль поля»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «ноль»
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Единица»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «единица»
ожидается [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Единица поля М»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «2^264 mod p»
ожидается [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0]
тотальная функция «Единица порядка М»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «2^264 mod n»
ожидается [1748736, 3411571, 287571, 1597123, 1202408, 812053, 4, 0, 0, 4194300, 4095, 0]
тотальная функция «Квадрат основания поля»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «2^528 mod p»
ожидается [196608, 0, 0, 4177920, 4194303, 4194287, 4190207, 4194303, 4194303, 4192255, 1048575, 1]
тотальная функция «Квадрат основания порядка»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «2^528 mod n»
ожидается [2092495, 2239082, 2160653, 3067339, 428586, 109283, 366105, 711419, 2404921, 1605381, 1420197, 2917]
тотальная функция «Простое минус два»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «p − 2, показатель обращения в поле»
ожидается [4194301, 4194303, 4194303, 4194303, 255, 0, 0, 0, 65536, 0, 4194288, 16383]
тотальная функция «Порядок минус два»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «n − 2, показатель обращения по порядку»
ожидается [2303311, 2821105, 998300, 386977, 3845543, 4125595, 4194303, 4194303, 65535, 0, 4194288, 16383]
тотальная функция «Образующая»
возвращает «Точка»
обеспечивает «у образующей х в двенадцати разрядах» (длина (результат.«х»)) равен 12
обеспечивает «у образующей у в двенадцати разрядах» (длина (результат.«у»)) равен 12
обеспечивает «у образующей з в двенадцати разрядах» (длина (результат.«з»)) равен 12
пример «G из FIPS 186-4, обе координаты в области Монтгомери»
ожидается запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967, 712152,
2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099, 2044504,
2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303,
4194299, 4095, 0]
тотальная функция «Бесконечность»
возвращает «Точка»
обеспечивает «у бесконечности х в двенадцати разрядах» (длина (результат.«х»)) равен 12
обеспечивает «у бесконечности у в двенадцати разрядах» (длина (результат.«у»)) равен 12
обеспечивает «у бесконечности знаменатель нулевой длины двенадцать» (длина (результат.«з»)) равен 12
пример «Бесконечность: знаменатель нулевой»
ожидается запись «Точка» с «х» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095,
0] и «у» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095,
0] и «з» равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Свёртка разрядов»
принимает а: список числа, б: список числа
возвращает список числа
пример «Двойка на тройку»
дано а равно [2]
дано б равно [3]
ожидается [6]
тотальная функция «Виток Монтгомери»
принимает т: список числа, предел: список числа, штрих: число
возвращает список числа
тотальная функция «Витки Монтгомери»
принимает т: список числа, предел: список числа, штрих: число, осталось: число
возвращает список числа
обеспечивает «без витков остаётся то, что дали» если осталось не больше 0 то результат равен т иначе да
пример «Ноль витков — список не тронут»
дано т равно [1, 2, 3]
дано предел равно [3, 0]
дано штрих равно 1
дано осталось равно 0
ожидается [1, 2, 3]
тотальная функция «Монт умножение»
принимает а: список числа, б: список числа, предел: список числа, штрих: число
возвращает список числа
тотальная функция «Сложение поля»
принимает а: список числа, б: список числа
возвращает список числа
тотальная функция «Вычитание поля»
принимает а: список числа, б: список числа
возвращает список числа
тотальная функция «Умножение поля»
принимает а: список числа, б: список числа
возвращает список числа
тотальная функция «Квадрат поля»
принимает а: список числа
возвращает список числа
тотальная функция «Удвоить поле»
принимает а: список числа
возвращает список числа
тотальная функция «Утроить поле»
принимает а: список числа
возвращает список числа
тотальная функция «Степень двойки»
принимает сколько: число
возвращает число
обеспечивает «нулевая степень двойки — единица» если сколько не больше 0 то результат равен 1 иначе да
пример «Два в нулевой»
дано сколько равно 0
ожидается 1
тотальная функция «Бит разрядов»
принимает разряды: список числа, номер: число
возвращает число
пример «Младший бит девятки»
дано разряды равно [9]
дано номер равно 0
ожидается 1
тотальная функция «Виток степени»
принимает акк: список числа, основа: список числа, показатель: список числа, предел: список числа, штрих: число, номер: число
возвращает список числа
обеспечивает «на нулевом бите остаётся один квадрат» если не ((«Бит разрядов» от показатель и номер) равен 1) то (результат равен («Монт умножение» от акк и акк и предел и штрих)) иначе да
обеспечивает «на единичном бите к квадрату домножается основа» если («Бит разрядов» от показатель и номер) равен 1 то (результат равен («Монт умножение» от («Монт умножение» от акк и акк и предел и штрих) и основа и предел и штрих)) иначе да
пример «Единичный бит: единица в квадрате, домноженная на двойку, даёт двойку»
дано акк равно [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0]
дано основа равно [512, 0, 0, 0, 4063232, 4194303, 4194303, 4194303, 4194303, 4194295, 8191, 0]
дано показатель равно [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано предел равно [4194303, 4194303, 4194303, 4194303, 255, 0, 0, 0, 65536, 0, 4194288, 16383]
дано штрих равно 1
дано номер равно 0
ожидается [512, 0, 0, 0, 4063232, 4194303, 4194303, 4194303, 4194303, 4194295, 8191, 0]
тотальная функция «Степень»
принимает акк: список числа, основа: список числа, показатель: список числа, предел: список числа, штрих: число, осталось: число
возвращает список числа
обеспечивает «без витков остаётся накопитель» если осталось не больше 0 то результат равен акк иначе да
пример «Ноль витков — накопитель не тронут»
дано акк равно [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0]
дано основа равно [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0]
дано показатель равно [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано предел равно [4194303, 4194303, 4194303, 4194303, 255, 0, 0, 0, 65536, 0, 4194288, 16383]
дано штрих равно 1
дано осталось равно 0
ожидается [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0]
тотальная функция «Обращение»
принимает а: список числа, предел: список числа, штрих: число, показатель: список числа, одинМ: список числа
возвращает список числа
тотальная функция «Удвоение»
принимает т: «Точка»
возвращает «Точка»
тотальная функция «Сложить точки»
принимает п: «Точка», вт: «Точка»
возвращает «Точка»
тотальная функция «Коэффициент b»
возвращает список числа
обеспечивает «двенадцать разрядов» (длина результат) равен 12
пример «b кривой P-256 в области Монтгомери»
ожидается [4055004, 567058, 642550, 795702, 826500, 3391511, 1240426, 2817480, 631328, 1908944, 2219528, 3073]
тотальная функция «Точка на кривой»
принимает т: «Точка»
возвращает признак
тотальная функция «Образующая на кривой»
возвращает признак
пример «G лежит на кривой P-256»
ожидается да
тотальная функция «Удвоенная образующая на кривой»
возвращает признак
пример «2G лежит на кривой P-256»
ожидается да
тотальная функция «Утроенная образующая на кривой»
возвращает признак
пример «3G лежит на кривой P-256»
ожидается да
тотальная функция «Виток Шамира»
принимает акк: «Точка», у1: список числа, у2: список числа, точкаГ: «Точка», точкаК: «Точка», сумма: «Точка», номер: число
возвращает «Точка»
обеспечивает «оба бита нулевые — только удвоение» если ((«Бит разрядов» от у1 и номер) равен 0) и притом ((«Бит разрядов» от у2 и номер) равен 0) то (результат равен («Удвоение» от акк)) иначе да
пример «Оба бита нулевые: образующая удваивается в 2G»
дано акк равно (запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967, 712152, 2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099, 2044504, 2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0])
дано у1 равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано у2 равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано точкаГ равно запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967, 712152, 2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099, 2044504, 2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0]
дано точкаК равно запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967, 712152, 2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099, 2044504, 2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0]
дано сумма равно запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967, 712152, 2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099, 2044504, 2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095, 0]
дано номер равно 0
ожидается запись «Точка» с «х» равным [3680605, 1391791, 2534427, 1533692, 3789877, 1756044, 1091692, 1632706, 3517141, 3786217, 1647605, 14654] и «у» равным [1379833, 586546, 2856561, 3582198, 1945875, 4006565, 636, 2323362, 2201618, 3440503, 3278603, 15891] и «з» равным [2888970, 4093098, 4082282, 3288686, 551475, 1725895, 4089009, 290448, 1822989, 191530, 2299217, 14591]
тотальная функция «Лестница Шамира»
принимает акк: «Точка», у1: список числа, у2: список числа, точкаГ: «Точка», точкаК: «Точка», сумма: «Точка», осталось: число
возвращает «Точка»
обеспечивает «без витков остаётся накопитель» если осталось не больше 0 то результат равен акк иначе да
пример «Ноль витков — накопитель не тронут»
дано акк равно запись «Точка» с «х» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299,
4095, 0] и «у» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095,
0] и «з» равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано у1 равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано у2 равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано точкаГ равно запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967,
712152, 2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099,
2044504, 2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303,
4194303, 4194299, 4095, 0]
дано точкаК равно запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967,
712152, 2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099,
2044504, 2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303,
4194303, 4194299, 4095, 0]
дано сумма равно запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967, 712152,
2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099, 2044504,
2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303,
4194299, 4095, 0]
дано осталось равно 0
ожидается запись «Точка» с «х» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095,
0] и «у» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303, 4194299, 4095,
0] и «з» равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Шаг байта числа»
принимает разряды: список числа, байт: число
возвращает список числа
тотальная функция «Число из байтов»
принимает байты: список числа
возвращает список числа
пример «Один байт»
дано байты равно [7]
ожидается [7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Точка ключа»
принимает байты: список числа
возвращает «Точка»
обеспечивает «у точки ключа знаменатель ровно в двенадцать разрядов» (длина (результат.«з»)) равен 12
пример «Шестьдесят четыре байта образующей дают ровно образующую»
дано байты равно [107, 23, 209, 242, 225, 44, 66, 71, 248, 188, 230, 229, 99, 164, 64, 242, 119, 3, 125, 129, 45,
235, 51, 160, 244, 161, 57, 69, 216, 152, 194, 150, 79, 227, 66, 226, 254, 26, 127, 155, 142, 231, 235, 74, 124,
15, 158, 22, 43, 206, 51, 87, 107, 49, 94, 206, 203, 182, 64, 104, 55, 191, 81, 245]
ожидается запись «Точка» с «х» равным [1326104, 1073828, 1995533, 2981982, 3950573, 1501783, 2248967, 712152,
2227059, 1922841, 3632083, 9239] и «у» равным [1444485, 2046549, 2041141, 3741495, 2372889, 2960099, 2044504,
2242376, 911494, 2192917, 3246760, 7295] и «з» равным [256, 0, 0, 0, 4128768, 4194303, 4194303, 4194303, 4194303,
4194299, 4095, 0]
тотальная функция «Целое подписи»
принимает подпись: список числа, номер: число
возвращает список числа
тотальная функция «Годно для подписи»
принимает значение: список числа
возвращает признак
тотальная функция «Проверка ECDSA»
принимает ключ: список числа, подпись: список числа, свод: список числа
возвращает признак
тотальная функция «Слово о подписи»
принимает ключ: список числа, подпись: список числа, свод: список числа
возвращает строка
обеспечивает «верную подпись называют верной» если («Проверка ECDSA» от ключ и подпись и свод) то (результат равен "подпись верна") иначе да
обеспечивает «неверную подпись называют неверной» если не («Проверка ECDSA» от ключ и подпись и свод) то (результат равен "подпись НЕ верна") иначе да
| Function | Termination | Claims |
|---|---|---|
| «Нулевые разряды» | доказано постоянным шагом | — |
| «Разряд» | доказано структурой | — |
| «Взять первые» | доказано структурой | доказано 1 из 1 |
| «Отбросить первые» | доказано структурой | доказано 1 из 1 |
| «Сложить по разрядам» | доказано структурой | — |
| «Добавить к первому» | доказано композицией | доказано 1 из 1 |
| «Шаг переноса» | доказано композицией | доказано 1 из 1 |
| «Перенос» | доказано композицией | доказано 1 из 1 |
| «Уложить» | доказано композицией | доказано 0 из 1; «разрядов не больше двенадцати» — сетка |
| «Вычесть с займом» | доказано структурой | доказано 1 из 1 |
| «Меньше» | доказано композицией | — |
| «Привести» | доказано композицией | доказано 1 из 1 |
| «Это ноль» | доказано композицией | — |
| «Разряды равны» | доказано композицией | — |
| «Простое» | доказано композицией | доказано 1 из 1 |
| «Порядок» | доказано композицией | доказано 1 из 1 |
| «Ноль поля» | доказано композицией | доказано 1 из 1 |
| «Единица» | доказано композицией | доказано 1 из 1 |
| «Единица поля М» | доказано композицией | доказано 1 из 1 |
| «Единица порядка М» | доказано композицией | доказано 1 из 1 |
| «Квадрат основания поля» | доказано композицией | доказано 1 из 1 |
| «Квадрат основания порядка» | доказано композицией | доказано 1 из 1 |
| «Простое минус два» | доказано композицией | доказано 1 из 1 |
| «Порядок минус два» | доказано композицией | доказано 1 из 1 |
| «Образующая» | доказано композицией | доказано 3 из 3 |
| «Бесконечность» | доказано композицией | доказано 3 из 3 |
| «Свёртка разрядов» | доказано структурой | — |
| «Виток Монтгомери» | доказано композицией | — |
| «Витки Монтгомери» | доказано постоянным шагом | доказано 1 из 1 |
| «Монт умножение» | доказано композицией | — |
| «Сложение поля» | доказано композицией | — |
| «Вычитание поля» | доказано композицией | — |
| «Умножение поля» | доказано композицией | — |
| «Квадрат поля» | доказано композицией | — |
| «Удвоить поле» | доказано композицией | — |
| «Утроить поле» | доказано композицией | — |
| «Степень двойки» | доказано постоянным шагом | доказано 1 из 1 |
| «Бит разрядов» | доказано композицией | — |
| «Виток степени» | доказано композицией | доказано 2 из 2 |
| «Степень» | доказано постоянным шагом | доказано 1 из 1 |
| «Обращение» | доказано композицией | — |
| «Удвоение» | доказано композицией | — |
| «Сложить точки» | доказано композицией | — |
| «Коэффициент b» | доказано композицией | доказано 1 из 1 |
| «Точка на кривой» | доказано композицией | — |
| «Образующая на кривой» | доказано композицией | — |
| «Удвоенная образующая на кривой» | доказано композицией | — |
| «Утроенная образующая на кривой» | доказано композицией | — |
| «Виток Шамира» | доказано композицией | доказано 1 из 1 |
| «Лестница Шамира» | доказано постоянным шагом | доказано 1 из 1 |
| «Шаг байта числа» | доказано композицией | — |
| «Число из байтов» | доказано композицией | — |
| «Точка ключа» | доказано композицией | доказано 1 из 1 |
| «Целое подписи» | доказано композицией | — |
| «Годно для подписи» | доказано композицией | — |
| «Проверка ECDSA» | доказано композицией | — |
| «Слово о подписи» | доказано композицией | доказано 2 из 2 |
«Fmath»
flang/stdlib/fmath.flang — functions 0; the kernel ledger was taken from this version of the file
| Function | Termination | Claims |
|---|
«Hash map»
flang/stdlib/hashmap.flang — functions 25; the kernel ledger was taken from this version of the file
тип «Звено» от «З»
вариант «Звено» содержит ключ: строка, значение: «З»
тотальная функция «Ключ звена» от «З»
принимает звено: «Звено» от «З»
возвращает строка
обеспечивает «ключ звена — это ключ, записанный в звене» результат равен звено.ключ
пример «Ключ достаётся из звена»
дано звено равно вариант «Звено» с ключ равным "имя" и значение равным "Марат"
ожидается "имя"
тотальная функция «Значение звена» от «З»
принимает звено: «Звено» от «З»
возвращает «З»
обеспечивает «значение звена — это значение, записанное в звене» результат равен звено.значение
пример «Значение достаётся из звена»
дано звено равно вариант «Звено» с ключ равным "имя" и значение равным "Марат"
ожидается "Марат"
тотальная функция «В кольцо»
принимает значение: число
возвращает число
обеспечивает «кольцо неотрицательно» 0 не больше результат
обеспечивает «кольцо меньше модуля 100000007» результат не больше 100000006
обеспечивает «целое, уже лежащее в кольце, кольцо не трогает» если (значение минус значение) равен 0 то (не (значение не меньше 0 и притом значение не больше 100000006 и притом ((значение остаток от 1) плюс 0) равен 0) или результат равен (значение плюс 0)) иначе да
обеспечивает «у бесконечности вверх кольцо отдаёт единицу» если (значение минус значение) равен 0 то да иначе (если значение больше 0 то результат равен 1 иначе да)
обеспечивает «у бесконечности вниз кольцо отдаёт двойку, а у не-числа тройку» если (значение минус значение) равен 0 то да иначе (если значение больше 0 то да иначе (если значение меньше 0 то результат равен 2 иначе результат равен 3))
пример «Ноль»
дано значение равно 0
ожидается 0
тотальная функция «Хеш числа»
принимает значение: число
возвращает число
обеспечивает «хеш числа неотрицателен» 0 не больше результат
обеспечивает «хеш числа меньше модуля 100000007» результат не больше 100000006
обеспечивает «хеш числа — точный вычет произведения, а не округление» результат равен («В кольцо» от ((7 плюс («В кольцо» от значение)) умножить на 61803399))
пример «Ноль»
дано значение равно 0
ожидается 32623765
тотальная функция «Хеш ключа»
принимает ключ: строка
возвращает число
обеспечивает «хеш ключа неотрицателен» 0 не больше результат
обеспечивает «хеш ключа меньше модуля 100000007» результат не больше 100000006
обеспечивает «ни одно промежуточное произведение свёртки не вышло за 2⁵³» результат равен (свёртка (разложить ключ на символы) начиная с 7 как акк и знак → (пусть произведение равно ((акк плюс (код символа знак)) умножить на 61803399)
если произведение не больше 9007199254740991 то (произведение остаток от 100000007) иначе (0 минус 1)))
пример «Пустой ключ — семя свёртки»
дано ключ равно ""
ожидается 7
тотальная функция «Путь хеша»
принимает хеш: число
возвращает список числа
обеспечивает «путь хеша — ровно четырнадцать ступеней» (длина результат) равен 14
обеспечивает «все четырнадцать ступеней — цифры основания 4» (длина (отфильтровать результат где цифра → цифра не меньше 0 и притом цифра не больше 3)) равен 14
обеспечивает «путь складывается обратно в тот же вычет» ((элемент 1 в результат) плюс (4 умножить на (элемент 2 в результат)) плюс (16 умножить на (элемент 3 в результат)) плюс (64 умножить на (элемент 4 в результат)) плюс (256 умножить на (элемент 5 в результат)) плюс (1024 умножить на (элемент 6 в результат)) плюс (4096 умножить на (элемент 7 в результат)) плюс (16384 умножить на (элемент 8 в результат)) плюс (65536 умножить на (элемент 9 в результат)) плюс (262144 умножить на (элемент 10 в результат)) плюс (1048576 умножить на (элемент 11 в результат)) плюс (4194304 умножить на (элемент 12 в результат)) плюс (16777216 умножить на (элемент 13 в результат)) плюс (67108864 умножить на (элемент 14 в результат))) равен («В кольцо» от хеш)
пример «Ноль — четырнадцать нулей»
дано хеш равно 0
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тип «Узел хеша» от «З»
вариант «Пустое место»
вариант «Одиночка» содержит звено: «Звено» от «З», спуск: число
вариант «Гроздь» содержит звенья: список («Звено» от «З»), спуск: число
вариант «Четвёрка» содержит ноль: «Узел хеша» от «З», один: «Узел хеша» от «З», два: «Узел хеша» от «З», три: «Узел хеша» от «З»
тотальная функция «Гнездо» от «З»
принимает звенья: список («Звено» от «З»), спуск: число
возвращает «Узел хеша» от «З»
обеспечивает «из пустого списка звеньев выходит пустое место» если звенья равен пустой список то (результат равен (вариант «Пустое место»)) иначе да
пример «Из ничего — пустое место»
дано звенья равно пустой список
дано спуск равно 5
ожидается вариант «Пустое место»
тотальная функция «Слить звенья» от «З»
принимает первые: список («Звено» от «З»), вторые: список («Звено» от «З»)
возвращает список («Звено» от «З»)
обеспечивает «длина слияния есть сумма длин» (длина результат) равен ((длина первые) плюс (длина вторые))
пример «Второе дописывается к первому»
дано первые равно [вариант «Звено» с ключ равным "имя" и значение равным "Марат"]
дано вторые равно [вариант «Звено» с ключ равным "город" и значение равным "Казань"]
ожидается [вариант «Звено» с ключ равным "имя" и значение равным "Марат", вариант «Звено» с ключ равным "город" и значение равным "Казань"]
тотальная функция «Вписать» от «З»
принимает звенья: список («Звено» от «З»), новое: «Звено» от «З»
возвращает список («Звено» от «З»)
обеспечивает «после вписывания список звеньев непуст» 1 не больше (длина результат)
обеспечивает «вписанное звено стоит в списке» результат содержит новое
обеспечивает «вписанное звено стоит последним» (элемент (длина результат) в результат) равен новое
пример «Новый ключ встаёт в конец»
дано звенья равно [вариант «Звено» с ключ равным "имя" и значение равным "Марат"]
дано новое равно вариант «Звено» с ключ равным "город" и значение равным "Казань"
ожидается [вариант «Звено» с ключ равным "имя" и значение равным "Марат", вариант «Звено» с ключ равным "город" и значение равным "Казань"]
тотальная функция «Развести» от «З»
принимает путь: список числа, первые: список («Звено» от «З»), спуск: число, вторые: список («Звено» от «З»), прежний: число
возвращает «Узел хеша» от «З»
обеспечивает «кончился путь — разводить негде: выходит то же гнездо из слитых звеньев» если не (спуск равен прежний) то (если путь равен пустой список то (результат равен («Гнездо» от («Слить звенья» от вторые и первые) и спуск)) иначе да) иначе да
обеспечивает «совпал спуск — разводить нечем: выходит гнездо из слитых звеньев» если спуск равен прежний то результат равен («Гнездо» от («Слить звенья» от вторые и первые) и спуск) иначе да
пример «Цифры разные — одна развилка, обе группы по местам»
дано путь равно [1, 0]
дано первые равно [вариант «Звено» с ключ равным "а" и значение равным "1"]
дано спуск равно 1
дано вторые равно [вариант «Звено» с ключ равным "б" и значение равным "2"]
дано прежний равно 2
ожидается вариант «Четвёрка» с ноль равным (вариант «Пустое место») и один равным (вариант «Одиночка» с звено равным (вариант «Звено» с ключ равным "а" и значение равным "1") и спуск равным 0) и два равным (вариант «Одиночка» с звено равным (вариант «Звено» с ключ равным "б" и значение равным "2") и спуск равным 0) и три равным (вариант «Пустое место»)
тотальная функция «Вложить» от «З»
принимает узел: «Узел хеша» от «З», спуск: число, новое: «Звено» от «З»
возвращает «Узел хеша» от «З»
обеспечивает «в пустое место вкладывается одиночка с этим звеном и этим спуском» если узел равен (вариант «Пустое место») то (результат равен (вариант «Одиночка» с звено равным новое и спуск равным спуск)) иначе да
пример «В пустое место — одиночка»
дано узел равно вариант «Пустое место»
дано спуск равно 5
дано новое равно вариант «Звено» с ключ равным "имя" и значение равным "Марат"
ожидается вариант «Одиночка» с звено равным (вариант «Звено» с ключ равным "имя" и значение равным "Марат") и спуск равным 5
тотальная функция «Искать» от «З»
принимает узел: «Узел хеша» от «З», спуск: число, искомый: строка, запасное: «З»
возвращает «З»
обеспечивает «где признака нет, поиск отдаёт запасное» если узел равен (вариант «Пустое место») то (результат равен запасное) иначе да
пример «В пустом месте — запасное»
дано узел равно вариант «Пустое место»
дано спуск равно 5
дано искомый равно "имя"
дано запасное равно "неизвестно"
ожидается "неизвестно"
тотальная функция «Искать признак» от «З»
принимает узел: «Узел хеша» от «З», спуск: число, искомый: строка
возвращает признак
обеспечивает «в пустом месте ключей нет» если узел равен (вариант «Пустое место») то (результат равен нет) иначе да
пример «В пустом месте ключей нет»
дано узел равно вариант «Пустое место»
дано спуск равно 5
дано искомый равно "имя"
ожидается нет
тотальная функция «Положить в словарь» от «З»
принимает словарь: «Узел хеша» от «З», ключ: строка, значение: «З»
возвращает «Узел хеша» от «З»
обеспечивает «в пустой словарь кладётся одиночка с этим ключом, значением и хешем» если словарь равен (вариант «Пустое место») то (результат равен (вариант «Одиночка» с звено равным (вариант «Звено» с ключ равным ключ и значение равным значение) и спуск равным («Хеш ключа» от ключ))) иначе да
пример «В пустой словарь»
дано словарь равно вариант «Пустое место»
дано ключ равно "имя"
дано значение равно "Марат"
ожидается вариант «Одиночка» с звено равным (вариант «Звено» с ключ равным "имя" и значение равным "Марат") и спуск равным 97745194
тотальная функция «Найти в словаре» от «З»
принимает словарь: «Узел хеша» от «З», искомый: строка, запасное: «З»
возвращает «З»
обеспечивает «чего в словаре нет, за то отдаётся запасное» если словарь равен (вариант «Пустое место») то (результат равен запасное) иначе да
пример «В пустом словаре — запасное»
дано словарь равно вариант «Пустое место»
дано искомый равно "имя"
дано запасное равно "неизвестно"
ожидается "неизвестно"
тотальная функция «Есть ключ в словаре» от «З»
принимает словарь: «Узел хеша» от «З», искомый: строка
возвращает признак
обеспечивает «в пустом словаре ключей нет» если словарь равен (вариант «Пустое место») то (результат равен нет) иначе да
пример «В пустом словаре ключей нет»
дано словарь равно вариант «Пустое место»
дано искомый равно "имя"
ожидается нет
тотальная функция «Звенья грозди» от «З»
принимает узел: «Узел хеша» от «З»
возвращает список («Звено» от «З»)
пример «У пустого места набора нет»
дано узел равно вариант «Пустое место»
ожидается пустой список
тотальная функция «Спуск грозди» от «З»
принимает узел: «Узел хеша» от «З»
возвращает число
обеспечивает «у пустого места спуска нет» если узел равен (вариант «Пустое место») то (результат равен 0) иначе да
пример «У пустого места спуска нет»
дано узел равно вариант «Пустое место»
ожидается 0
тотальная функция «Звенья словаря» от «З»
принимает словарь: «Узел хеша» от «З»
возвращает список («Звено» от «З»)
обеспечивает «у пустого места звеньев нет» если словарь равен (вариант «Пустое место») то (результат равен пустой список) иначе да
обеспечивает «у грозди звенья — весь её набор» если словарь равен (вариант «Гроздь» с звенья равным («Звенья грозди» от словарь) и спуск равным («Спуск грозди» от словарь)) то (результат равен («Звенья грозди» от словарь)) иначе да
пример «У пустого словаря звеньев нет»
дано словарь равно вариант «Пустое место»
ожидается пустой список
тотальная функция «Размер словаря» от «З»
принимает словарь: «Узел хеша» от «З»
возвращает число
обеспечивает «размер — это сколько у словаря ключей» результат равен (длина («Ключи словаря» от словарь))
пример «Пустой словарь»
дано словарь равно вариант «Пустое место»
ожидается 0
тотальная функция «Ключи словаря» от «З»
принимает словарь: «Узел хеша» от «З»
возвращает список строки
обеспечивает «ключей ровно столько, сколько звеньев» (длина результат) равен (длина («Звенья словаря» от словарь))
пример «У пустого словаря ключей нет»
дано словарь равно вариант «Пустое место»
ожидается пустой список
тотальная функция «Значения словаря» от «З»
принимает словарь: «Узел хеша» от «З»
возвращает список «З»
обеспечивает «значений ровно столько, сколько звеньев» (длина результат) равен (длина («Звенья словаря» от словарь))
пример «У пустого словаря значений нет»
дано словарь равно вариант «Пустое место»
ожидается пустой список
тотальная функция «Больше из двух»
принимает слева: число, справа: число
возвращает число
обеспечивает «больше из двух — одно из двух» не ((слева минус слева) равен 0 и притом (справа минус справа) равен 0) или ((результат плюс 0) равен (слева плюс 0) или (результат плюс 0) равен (справа плюс 0))
обеспечивает «выбор идёт по сравнению: не меньше — левое, иначе правое» если слева не меньше справа то результат равен слева иначе результат равен справа
пример «Левое больше»
дано слева равно 3
дано справа равно 1
ожидается 3
тотальная функция «Глубина словаря» от «З»
принимает словарь: «Узел хеша» от «З»
возвращает число
обеспечивает «где есть звенья, там есть и глубина» если словарь равен (вариант «Пустое место») то да иначе (1 не больше результат)
обеспечивает «у грозди глубина один» если словарь равен (вариант «Гроздь» с звенья равным («Звенья грозди» от словарь) и спуск равным («Спуск грозди» от словарь)) то (результат равен 1) иначе да
обеспечивает «у пустого места глубина ноль» если словарь равен (вариант «Пустое место») то (результат равен 0) иначе да
пример «У пустого словаря глубины нет»
дано словарь равно вариант «Пустое место»
ожидается 0
тотальная функция «Словарь из ключей»
принимает ключи: список строки
возвращает «Узел хеша» от строки
обеспечивает «из пустого списка ключей выходит пустое место» если ключи равен пустой список то (результат равен (вариант «Пустое место»)) иначе да
пример «Из пустого списка — пустое место»
дано ключи равно пустой список
ожидается вариант «Пустое место»
| Function | Termination | Claims |
|---|---|---|
| «Ключ звена» | доказано композицией | доказано 1 из 1 |
| «Значение звена» | доказано композицией | доказано 1 из 1 |
| «В кольцо» | доказано композицией | доказано 2 из 5; «кольцо неотрицательно» — сетка; «кольцо меньше модуля 100000007» — сетка; «целое, уже лежащее в кольце, кольцо не трогает» — сетка |
| «Хеш числа» | доказано композицией | доказано 0 из 3; «хеш числа неотрицателен» — сетка; «хеш числа меньше модуля 100000007» — сетка; «хеш числа — точный вычет произведения, а не округление» — сетка |
| «Хеш ключа» | доказано композицией | доказано 0 из 3; «хеш ключа неотрицателен» — сетка; «хеш ключа меньше модуля 100000007» — сетка; «ни одно промежуточное произведение свёртки не вышло за 2⁵³» — сетка |
| «Путь хеша» | доказано композицией | доказано 1 из 3; «все четырнадцать ступеней — цифры основания 4» — сетка; «путь складывается обратно в тот же вычет» — сетка |
| «Гнездо» | доказано композицией | доказано 1 из 1 |
| «Слить звенья» | доказано композицией | доказано 1 из 1 |
| «Вписать» | доказано композицией | доказано 3 из 3 |
| «Развести» | доказано структурой | доказано 2 из 2 |
| «Вложить» | доказано структурой | доказано 1 из 1 |
| «Искать» | доказано структурой | доказано 1 из 1 |
| «Искать признак» | доказано структурой | доказано 1 из 1 |
| «Положить в словарь» | доказано композицией | доказано 1 из 1 |
| «Найти в словаре» | доказано композицией | доказано 1 из 1 |
| «Есть ключ в словаре» | доказано композицией | доказано 1 из 1 |
| «Звенья грозди» | доказано композицией | — |
| «Спуск грозди» | доказано композицией | доказано 1 из 1 |
| «Звенья словаря» | доказано структурой | доказано 1 из 2; «у грозди звенья — весь её набор» — сетка |
| «Размер словаря» | доказано композицией | доказано 1 из 1 |
| «Ключи словаря» | доказано композицией | доказано 1 из 1 |
| «Значения словаря» | доказано композицией | доказано 1 из 1 |
| «Больше из двух» | доказано композицией | доказано 2 из 2 |
| «Глубина словаря» | доказано структурой | доказано 2 из 3; «где есть звенья, там есть и глубина» — сетка |
| «Словарь из ключей» | доказано структурой | доказано 1 из 1 |
«Higher order»
flang/stdlib/higher-order.flang — functions 35; the kernel ledger was taken from this version of the file
тотальная функция «Удвоить»
принимает х: число
возвращает число
обеспечивает «удвоение есть сложение с самим собой» результат равен («Сложить» от х и х)
пример «Дважды два»
дано х равно 2
ожидается 4
тотальная функция «Возвести в квадрат»
принимает х: число
возвращает число
обеспечивает «квадрат есть умножение на самого себя» результат равен («Умножить» от х и х)
пример «Три в квадрате»
дано х равно 3
ожидается 9
тотальная функция «Утроить»
принимает х: число
возвращает число
обеспечивает «утроение есть умножение на три» результат равен («Умножить» от х и 3)
пример «Трижды два»
дано х равно 2
ожидается 6
тотальная функция «Противоположное»
принимает х: число
возвращает число
обеспечивает «противоположное складывается с исходным в ноль, пока это число» не ((х минус х) равен 0) или (если х больше 0 то ((результат плюс х) равен 0) иначе да)
пример «Минус пять»
дано х равно 5
ожидается -5
тотальная функция «Положительное»
принимает х: число
возвращает признак
обеспечивает «положительно то, что больше нуля пересиливает» результат равен (не ((«Большее» от х и 0) равен 0))
обеспечивает «больше нуля — значит положительное» (не (х больше 0)) или (результат равен да)
обеспечивает «не больше нуля — значит не положительное» (х больше 0) или (результат равен нет)
пример «Положительное»
дано х равно 1
ожидается да
тотальная функция «Сложить»
принимает первое: число, второе: число
возвращает число
обеспечивает «слагаемые можно переставить» результат равен (второе плюс первое)
пример «Два и три»
дано первое равно 2
дано второе равно 3
ожидается 5
тотальная функция «Умножить»
принимает первое: число, второе: число
возвращает число
обеспечивает «сомножители можно переставить» результат равен (второе умножить на первое)
пример «Два на три»
дано первое равно 2
дано второе равно 3
ожидается 6
тотальная функция «Меньшее»
принимает первое: число, второе: число
возвращает число
обеспечивает «меньшее и большее вместе дают ту же сумму, когда первое строго меньше» (не (первое меньше второе)) или ((результат плюс («Большее» от первое и второе)) равен (первое плюс второе))
обеспечивает «меньшее и большее вместе дают ту же сумму, когда первое строго больше» (первое меньше второе) или ((не (первое больше второе)) или ((результат плюс («Большее» от первое и второе)) равен (первое плюс второе)))
обеспечивает «меньшее и большее вместе дают ту же сумму, когда доводы равны» (не (первое равен второе)) или ((результат плюс («Большее» от первое и второе)) равен (первое плюс второе))
обеспечивает «на равных доводах меньшее есть любой из них» (не (первое равен второе)) или (результат равен первое)
обеспечивает «когда первое строго меньше, меньшее есть первое» (не (первое меньше второе)) или (результат равен первое)
обеспечивает «когда первое не меньше, меньшее есть второе» (первое меньше второе) или (результат равен второе)
пример «Меньшее из двух»
дано первое равно 7
дано второе равно 3
ожидается 3
тотальная функция «Большее»
принимает первое: число, второе: число
возвращает число
обеспечивает «на строгом неравенстве отдаётся то из двух, что больше» если второе больше первое то результат равен второе иначе (если первое больше второе то результат равен первое иначе да)
обеспечивает «на равных доводах большее есть любой из них» (не (первое равен второе)) или (результат равен первое)
обеспечивает «когда первое строго больше, большее есть первое» (не (первое больше второе)) или (результат равен первое)
обеспечивает «когда первое не больше, большее есть второе» (первое больше второе) или (результат равен второе)
пример «Большее из двух»
дано первое равно 7
дано второе равно 3
ожидается 7
тотальная функция «По возрастанию»
принимает первое: число, второе: число
возвращает признак
обеспечивает «порядок вперёд есть порядок назад с переставленными доводами» результат равен («По убыванию» от второе и первое)
обеспечивает «что не больше — то и вперёд» (не (первое не больше второе)) или (результат равен да)
обеспечивает «что больше — то не вперёд» (первое не больше второе) или (результат равен нет)
пример «Меньшее раньше»
дано первое равно 1
дано второе равно 2
ожидается да
тотальная функция «По убыванию»
принимает первое: число, второе: число
возвращает признак
обеспечивает «на строгом неравенстве порядок назад решается однозначно» если первое больше второе то результат равен да иначе (если второе больше первое то результат равен нет иначе да)
обеспечивает «что не больше с другой стороны — то и назад» (не (второе не больше первое)) или (результат равен да)
обеспечивает «что больше с другой стороны — то не назад» (второе не больше первое) или (результат равен нет)
пример «Большее раньше»
дано первое равно 2
дано второе равно 1
ожидается да
тотальная функция «Свернуть»
принимает ф: функция из числа и числа в число, основа: число, элементы: список числа
возвращает число
обеспечивает «на пустом списке свёртка есть само основание» если (длина элементы) равен 0 то результат равен основа иначе да
обеспечивает «на списке из одного элемента свёртка есть один шаг» если (длина элементы) равен 1 то результат равен (ф от основа и (элемент 1 в элементы)) иначе да
пример «Сумма»
дано ф равно функция «Сложить»
дано основа равно 0
дано элементы равно [1, 2, 3]
ожидается 6
тотальная функция «Отобразить» от «А» и «Б»
принимает ф: функция из «А» в «Б», элементы: список «А»
возвращает список «Б»
обеспечивает «отображение сохраняет длину списка» (длина результат) равен (длина элементы)
пример «Удвоение»
дано ф равно функция «Удвоить»
дано элементы равно [1, 2, 3]
ожидается [2, 4, 6]
тотальная функция «Отфильтровать» от «А»
принимает условие: функция из «А» в признак, элементы: список «А»
возвращает список «А»
обеспечивает «подходящий первый элемент отбор не теряет» если ((длина элементы) больше 0) и притом (условие от (элемент 1 в элементы)) то 1 не больше (длина результат) иначе да
обеспечивает «отобранных не больше, чем было» (длина результат) не больше (длина элементы)
пример «Только чётные»
дано условие равно функция «Чётное»
дано элементы равно [1, 2, 3, 4]
ожидается [2, 4]
тотальная функция «Шаг счёта где»
принимает акк: число, эл: число, условие: функция из числа в признак
возвращает число
обеспечивает «подошедшее прибавляет ровно один» если условие от эл то результат равен (акк плюс 1) иначе да
обеспечивает «не подошедшее ничего не меняет» если не (условие от эл) то результат равен акк иначе да
пример «Подошло — прибавили»
дано акк равно 1
дано эл равно 2
дано условие равно функция «Чётное»
ожидается 2
тотальная функция «Считать где»
принимает условие: функция из числа в признак, элементы: список числа
возвращает число
обеспечивает «счёт подходящих есть длина отобранного» результат равен (длина («Отфильтровать» от условие и элементы))
пример «Сколько чётных»
дано условие равно функция «Чётное»
дано элементы равно [1, 2, 3, 4]
ожидается 2
тотальная функция «Шаг все»
принимает акк: признак, эл: число, условие: функция из числа в признак
возвращает признак
обеспечивает «однажды сорванное не восстанавливается» если акк равен нет то результат равен нет иначе да
обеспечивает «пока не сорвано — отвечает условие» если не (акк равен нет) то результат равен (условие от эл) иначе да
пример «Сорванное держится»
дано акк равно нет
дано эл равно 2
дано условие равно функция «Чётное»
ожидается нет
тотальная функция «Все»
принимает условие: функция из числа в признак, элементы: список числа
возвращает признак
обеспечивает «все подходят ровно тогда, когда подходящих столько же, сколько элементов» результат равен ((«Считать где» от условие и элементы) равен (длина элементы))
пример «Все чётные»
дано условие равно функция «Чётное»
дано элементы равно [2, 4]
ожидается да
тотальная функция «Шаг любой»
принимает акк: признак, эл: число, условие: функция из числа в признак
возвращает признак
обеспечивает «однажды найденное не теряется» если акк равен да то результат равен да иначе да
обеспечивает «пока не найдено — отвечает условие» если не (акк равен да) то результат равен (условие от эл) иначе да
пример «Найденное держится»
дано акк равно да
дано эл равно 3
дано условие равно функция «Чётное»
ожидается да
тотальная функция «Любой»
принимает условие: функция из числа в признак, элементы: список числа
возвращает признак
обеспечивает «хоть один подходит ровно тогда, когда подходящих не меньше одного» результат равен (1 не больше («Считать где» от условие и элементы))
пример «Есть чётное»
дано условие равно функция «Чётное»
дано элементы равно [1, 4]
ожидается да
тотальная функция «Найти первое»
принимает условие: функция из числа в признак, элементы: список числа, запасное: число
возвращает число
обеспечивает «всё, что не запасное, подходит» если результат равен запасное то да иначе условие от результат
обеспечивает «на пустом списке отдаётся запасное» если (длина элементы) равен 0 то результат равен запасное иначе да
пример «Нашли»
дано условие равно функция «Положительное»
дано элементы равно [-1, 0, 7, 9]
дано запасное равно -100
ожидается 7
тотальная функция «Позиция где»
принимает условие: функция из числа в признак, элементы: список числа
возвращает число
обеспечивает «на найденном месте стоит подходящее, а ноль значит: не найдено» если (длина элементы) равен 0 то результат равен 0 иначе (если условие от (элемент 1 в элементы) то результат равен 1 иначе (если результат равен 0 то да иначе условие от (элемент результат в элементы)))
пример «Третьим»
дано условие равно функция «Чётное»
дано элементы равно [1, 3, 6, 8]
ожидается 3
тотальная функция «Вставить по»
принимает раньше: функция из числа и числа в признак, значение: число, элементы: список числа
возвращает список числа
обеспечивает «вставка удлиняет список ровно на один» (длина результат) равен ((длина элементы) плюс 1)
обеспечивает «во главе результата стоит либо вставленное, либо прежняя голова» если (длина элементы) равен 0 то (длина результат) равен 1 иначе ((элемент 1 в результат) равен значение) или ((элемент 1 в результат) равен (элемент 1 в элементы))
пример «В середину по возрастанию»
дано раньше равно функция «По возрастанию»
дано значение равно 2
дано элементы равно [1, 3]
ожидается [1, 2, 3]
тотальная функция «Сортировать по»
принимает раньше: функция из числа и числа в признак, элементы: список числа
возвращает список числа
обеспечивает «сортировка по порядку не теряет и не добавляет элементов» (длина результат) равен (длина элементы)
пример «По возрастанию»
дано раньше равно функция «По возрастанию»
дано элементы равно [3, 1, 2]
ожидается [1, 2, 3]
тотальная функция «Сортировать по направлению»
принимает убывание: признак, элементы: список числа
возвращает список числа
обеспечивает «сортировка не теряет и не добавляет элементов» (длина результат) равен (длина элементы)
обеспечивает «при убывании сортируется порядком назад» (не убывание) или (результат равен («Сортировать по» от функция «По убыванию» и элементы))
обеспечивает «без убывания сортируется порядком вперёд» убывание или (результат равен («Сортировать по» от функция «По возрастанию» и элементы))
пример «Возрастание»
дано убывание равно нет
дано элементы равно [3, 1, 2]
ожидается [1, 2, 3]
тотальная функция «Составить»
принимает внешняя: функция из числа в число, внутренняя: функция из числа в число, х: число
возвращает число
обеспечивает «состав есть два отображения подряд» («Отобразить» от внешняя и («Отобразить» от внутренняя и [х])) содержит результат
обеспечивает «внешняя считается после внутренней, а не наоборот» результат равен (внешняя от (внутренняя от х))
пример «Квадрат удвоенного»
дано внешняя равно функция «Возвести в квадрат»
дано внутренняя равно функция «Удвоить»
дано х равно 3
ожидается 36
тотальная функция «Отобразить составом»
принимает внешняя: функция из числа в число, внутренняя: функция из числа в число, элементы: список числа
возвращает список числа
обеспечивает «отображение составом сохраняет длину списка» (длина результат) равен (длина элементы)
пример «Квадраты удвоенных»
дано внешняя равно функция «Возвести в квадрат»
дано внутренняя равно функция «Удвоить»
дано элементы равно [1, 2, 3]
ожидается [4, 16, 36]
тотальная функция «Сжать»
принимает ф: функция из числа и числа в число, первые: список числа, вторые: список числа
возвращает список числа
обеспечивает «сжато ровно столько, сколько в коротком из списков» если (длина первые) не больше (длина вторые) то (длина результат) равен (длина первые) иначе (длина результат) равен (длина вторые)
пример «Сложение по позициям»
дано ф равно функция «Сложить»
дано первые равно [1, 2, 3]
дано вторые равно [10, 20, 30]
ожидается [11, 22, 33]
тотальная функция «Сумма сложением»
принимает элементы: список числа
возвращает число
обеспечивает «сумма положительных не меньше наибольшего из них» если «Все» от функция «Положительное» и элементы то результат не меньше («Максимум большим из двух» от элементы) иначе да
пример «Сумма трёх»
дано элементы равно [1, 2, 3]
ожидается 6
тотальная функция «Произведение умножением»
принимает элементы: список числа
возвращает число
обеспечивает «произведение одного элемента есть он сам» если (длина элементы) равен 1 то результат равен (элемент 1 в элементы) иначе да
пример «Произведение трёх»
дано элементы равно [2, 3, 4]
ожидается 24
тотальная функция «Минимум меньшим из двух»
принимает элементы: список числа
возвращает число
обеспечивает «наименьшее взято из самого списка, а на пустом это ноль» если (длина элементы) больше 0 то элементы содержит результат иначе результат равен 0
пример «Минимум трёх»
дано элементы равно [3, 1, 2]
ожидается 1
тотальная функция «Максимум большим из двух»
принимает элементы: список числа
возвращает число
обеспечивает «наибольшее взято из самого списка, а на пустом это ноль» если (длина элементы) больше 0 то элементы содержит результат иначе результат равен 0
пример «Максимум трёх»
дано элементы равно [3, 1, 2]
ожидается 3
тотальная функция «Обратить знаки»
принимает элементы: список числа
возвращает список числа
обеспечивает «обращение знаков сохраняет длину списка» (длина результат) равен (длина элементы)
обеспечивает «у положительной головы знак меняется на противоположный» если ((длина элементы) больше 0) и притом ((элемент 1 в элементы) больше 0) то (элемент 1 в результат) равен (0 минус (элемент 1 в элементы)) иначе да
пример «Знаки меняются»
дано элементы равно [1, -2, 3]
ожидается [-1, 2, -3]
тотальная функция «Заглавная точка»
принимает текст: строка
возвращает строка
обеспечивает «точка удлиняет строку ровно на один знак» (длина результат) равен ((длина текст) плюс 1)
пример «Точка в конце»
дано текст равно "раз"
ожидается "раз."
тотальная функция «Непустая»
принимает текст: строка
возвращает признак
обеспечивает «непустая — та, чья длина положительна» результат равен («Положительное» от (длина текст))
обеспечивает «у строки с знаками признак непустоты истинен» (не ((длина текст) больше 0)) или (результат равен да)
обеспечивает «у строки без знаков признак непустоты ложен» ((длина текст) больше 0) или (результат равен нет)
пример «Непустая»
дано текст равно "а"
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Удвоить» | доказано композицией | доказано 1 из 1 |
| «Возвести в квадрат» | доказано композицией | доказано 1 из 1 |
| «Утроить» | доказано композицией | доказано 1 из 1 |
| «Противоположное» | доказано композицией | доказано 0 из 1; «противоположное складывается с исходным в ноль, пока это число» — сетка |
| «Положительное» | доказано композицией | доказано 3 из 3 |
| «Сложить» | доказано композицией | доказано 1 из 1 |
| «Умножить» | доказано композицией | доказано 1 из 1 |
| «Меньшее» | доказано композицией | доказано 6 из 6 |
| «Большее» | доказано композицией | доказано 4 из 4 |
| «По возрастанию» | доказано композицией | доказано 3 из 3 |
| «По убыванию» | доказано композицией | доказано 2 из 3; «на строгом неравенстве порядок назад решается однозначно» — сетка |
| «Свернуть» | доказано композицией | доказано 1 из 2; «на списке из одного элемента свёртка есть один шаг» — сетка |
| «Отобразить» | доказано композицией | доказано 1 из 1 |
| «Отфильтровать» | доказано композицией | доказано 1 из 2; «подходящий первый элемент отбор не теряет» — сетка |
| «Шаг счёта где» | доказано композицией | доказано 2 из 2 |
| «Считать где» | доказано композицией | доказано 0 из 1; «счёт подходящих есть длина отобранного» — сетка |
| «Шаг все» | доказано композицией | доказано 2 из 2 |
| «Все» | доказано композицией | доказано 0 из 1; «все подходят ровно тогда, когда подходящих столько же, сколько элементов» — сетка |
| «Шаг любой» | доказано композицией | доказано 2 из 2 |
| «Любой» | доказано композицией | доказано 0 из 1; «хоть один подходит ровно тогда, когда подходящих не меньше одного» — сетка |
| «Найти первое» | доказано структурой | доказано 2 из 2 |
| «Позиция где» | доказано структурой | доказано 0 из 1; «на найденном месте стоит подходящее, а ноль значит: не найдено» — сетка |
| «Вставить по» | доказано структурой | доказано 1 из 2; «во главе результата стоит либо вставленное, либо прежняя голова» — сетка |
| «Сортировать по» | доказано структурой | доказано 1 из 1 |
| «Сортировать по направлению» | доказано композицией | доказано 3 из 3 |
| «Составить» | доказано композицией | доказано 1 из 2; «состав есть два отображения подряд» — сетка |
| «Отобразить составом» | доказано композицией | доказано 1 из 1 |
| «Сжать» | доказано структурой | доказано 0 из 1; «сжато ровно столько, сколько в коротком из списков» — сетка |
| «Сумма сложением» | доказано композицией | доказано 0 из 1; «сумма положительных не меньше наибольшего из них» — сетка |
| «Произведение умножением» | доказано композицией | доказано 0 из 1; «произведение одного элемента есть он сам» — сетка |
| «Минимум меньшим из двух» | доказано композицией | доказано 0 из 1; «наименьшее взято из самого списка, а на пустом это ноль» — сетка |
| «Максимум большим из двух» | доказано композицией | доказано 0 из 1; «наибольшее взято из самого списка, а на пустом это ноль» — сетка |
| «Обратить знаки» | доказано композицией | доказано 1 из 2; «у положительной головы знак меняется на противоположный» — сетка |
| «Заглавная точка» | доказано композицией | доказано 1 из 1 |
| «Непустая» | доказано композицией | доказано 3 из 3 |
«HMAC»
flang/stdlib/hmac.flang — functions 12; the kernel ledger was taken from this version of the file
тотальная функция «Байты слова»
принимает слово: число
возвращает список числа
обеспечивает «слово занимает ровно четыре байта» (длина результат) равен 4
обеспечивает «четвёрка складывается обратно в то же слово» ((((элемент 1 в результат) умножить на 16777216) плюс ((элемент 2 в результат) умножить на 65536)) плюс (((элемент 3 в результат) умножить на 256) плюс (элемент 4 в результат))) равен («Свести к слову» от слово)
пример «Ноль»
дано слово равно 0
ожидается [0, 0, 0, 0]
тотальная функция «Байты шестнадцатеричным»
принимает байты: список числа
возвращает строка
обеспечивает «на каждый байт ровно два знака» (длина результат) равен ((длина байты) умножить на 2)
пример «Пусто»
дано байты равно пустой список
ожидается ""
тотальная функция «Байты свода»
принимает свод: «Свод sha256»
возвращает список числа
обеспечивает «свод занимает ровно тридцать два байта» (длина результат) равен 32
обеспечивает «байты свода печатаются тем же, чем печатается сам свод» («Байты шестнадцатеричным» от результат) равен («Свод шестнадцатеричным» от свод)
пример «Начальный свод»
дано свод равно вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225
ожидается [106, 9, 230, 103, 187, 103, 174, 133, 60, 110, 243, 114, 165, 79, 245, 58, 81, 14, 82, 127, 155, 5, 104,
140, 31, 131, 217, 171, 91, 224, 205, 25]
тип «Ход начала»
вариант «Ход начала» содержит взято: список числа, осталось: число
тип «Ход слияния»
вариант «Ход слияния» содержит второй: список числа, номер: число, готово: список числа
тотальная функция «Шаг начала»
принимает ход: «Ход начала», байт: число
возвращает «Ход начала»
обеспечивает «просить нечего: остаток остаётся нулём» (не (ход.осталось не больше 0)) или (результат.осталось равен 0)
обеспечивает «просить нечего: взятое не удлиняется» (не (ход.осталось не больше 0)) или ((длина результат.взято) равен (длина ход.взято))
обеспечивает «пока просят: остаток убывает на один» (ход.осталось не больше 0) или (результат.осталось равен (ход.осталось минус 1))
обеспечивает «пока просят: взятое длиннее на один» (ход.осталось не больше 0) или ((длина результат.взято) равен ((длина ход.взято) плюс 1))
пример «Пока просят — берём»
дано ход равно вариант «Ход начала» с взято равным пустой список и осталось равным 2
дано байт равно 7
ожидается вариант «Ход начала» с взято равным [7] и осталось равным 1
тотальная функция «Начало списка»
принимает байты: список числа, сколько: число
возвращает список числа
обеспечивает «взято меньшее из заказанного и наличного» (длина результат) равен (если сколько не больше 0 то 0
иначе (если сколько не больше (длина байты) то сколько иначе (длина байты)))
обеспечивает «ничего не заказано — ничего и не взято» если сколько не больше 0 то (результат равен пустой список) иначе да
обеспечивает «заказано не меньше наличного — берётся весь список» если не (сколько не больше 0) то (если (длина байты) не больше сколько то (результат равен байты) иначе да) иначе да
пример «Ничего»
дано байты равно [1, 2, 3]
дано сколько равно 0
ожидается пустой список
тотальная функция «Байт или ноль»
принимает байты: список числа, номер: число
возвращает число
пример «Первый»
дано байты равно [7, 8]
дано номер равно 1
ожидается 7
тотальная функция «Шаг слияния»
принимает ход: «Ход слияния», байт: число
возвращает «Ход слияния»
обеспечивает «слияние: номер растёт на один» результат.номер равен (ход.номер плюс 1)
обеспечивает «слияние: готовое длиннее на один» (длина результат.готово) равен ((длина ход.готово) плюс 1)
обеспечивает «слияние: второй список не трогается» (длина результат.второй) равен (длина ход.второй)
обеспечивает «слияние: второй список остаётся тем же списком» результат.второй равен ход.второй
пример «Первый разряд сливается со вторым списком»
дано ход равно вариант «Ход слияния» с второй равным [255] и номер равным 1 и готово равным пустой список
дано байт равно 15
ожидается вариант «Ход слияния» с второй равным [255] и номер равным 2 и готово равным [240]
тотальная функция «Исключающее или списков»
принимает первый: список числа, второй: список числа
возвращает список числа
обеспечивает «слияние длиной в первый список» (длина результат) равен (длина первый)
обеспечивает «слияние с пустым вторым списком ничего не меняет» (если (длина второй) равен 0 то результат равен первый
иначе да)
обеспечивает «слияние списка с самим собой даёт одни нули» (если второй равен первый то результат равен («Нули» от (длина первый)) иначе да)
пример «Пустой второй список ничего не меняет»
дано первый равно [1, 2, 255]
дано второй равно пустой список
ожидается [1, 2, 255]
тотальная функция «Ключ блока»
принимает ключ: список числа
возвращает список числа
обеспечивает «ключ приведён ровно к блоку хеша» (длина результат) равен 64
обеспечивает «ключ длиннее блока сначала хешируется» (если (длина ключ) больше 64 то («Начало списка» от результат и 32) равен («Байты свода» от («Свод байтов» от ключ)) иначе да)
обеспечивает «ключ не длиннее блока стоит в начале как есть» (если (длина ключ) не больше 64 то («Начало списка» от результат и (длина ключ)) равен ключ иначе да)
пример «Пустой ключ — блок нулей»
дано ключ равно пустой список
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Набивка ключа»
принимает блок: список числа, набивка: число
возвращает список числа
обеспечивает «набивка не меняет длину» (длина результат) равен (длина блок)
обеспечивает «нулевая набивка ничего не меняет» (если набивка равен 0 то результат равен блок иначе да)
пример «Нулевая набивка ничего не меняет — без этого примера утверждение о ней даровое»
дано блок равно [1, 2, 255]
дано набивка равно 0
ожидается [1, 2, 255]
тотальная функция «Подпись байтами»
принимает ключ: список числа, сообщение: список числа
возвращает список числа
обеспечивает «подпись — ровно тридцать два байта» (длина результат) равен 32
обеспечивает «пустой ключ и пустое сообщение дают известное значение» (если ((длина ключ) равен 0) и притом ((длина сообщение) равен 0) то («Байты шестнадцатеричным» от результат) равен "b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad" иначе да)
пример «Пустой ключ, пустое сообщение»
дано ключ равно пустой список
дано сообщение равно пустой список
ожидается [182, 19, 103, 154, 8, 20, 217, 236, 119, 47, 149, 215, 120, 195, 95, 197, 255, 22, 151, 196, 147, 113,
86, 83, 198, 199, 18, 20, 66, 146, 197, 173]
тотальная функция «Подпись шестнадцатеричным»
принимает ключ: список числа, сообщение: список числа
возвращает строка
обеспечивает «подпись печатается ровно шестьюдесятью четырьмя знаками» (длина результат) равен 64
пример «RFC 4231, случай 1: ключ из двадцати 0x0b, сообщение Hi There»
дано ключ равно [11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11]
дано сообщение равно [72, 105, 32, 84, 104, 101, 114, 101]
ожидается "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
| Function | Termination | Claims |
|---|---|---|
| «Байты слова» | доказано композицией | доказано 1 из 2; «четвёрка складывается обратно в то же слово» — сетка |
| «Байты шестнадцатеричным» | доказано композицией | доказано 0 из 1; «на каждый байт ровно два знака» — сетка |
| «Байты свода» | доказано композицией | доказано 1 из 2; «байты свода печатаются тем же, чем печатается сам свод» — сетка |
| «Шаг начала» | доказано композицией | доказано 4 из 4 |
| «Начало списка» | доказано композицией | доказано 2 из 3; «взято меньшее из заказанного и наличного» — сетка |
| «Байт или ноль» | доказано композицией | — |
| «Шаг слияния» | доказано композицией | доказано 4 из 4 |
| «Исключающее или списков» | доказано композицией | доказано 0 из 3; «слияние длиной в первый список» — сетка; «слияние с пустым вторым списком ничего не меняет» — сетка; «слияние списка с самим собой даёт одни нули» — сетка |
| «Ключ блока» | доказано композицией | доказано 0 из 3; «ключ приведён ровно к блоку хеша» — сетка; «ключ длиннее блока сначала хешируется» — сетка; «ключ не длиннее блока стоит в начале как есть» — сетка |
| «Набивка ключа» | доказано композицией | доказано 1 из 2; «нулевая набивка ничего не меняет» — сетка |
| «Подпись байтами» | доказано композицией | доказано 0 из 2; «подпись — ровно тридцать два байта» — сетка; «пустой ключ и пустое сообщение дают известное значение» — сетка |
| «Подпись шестнадцатеричным» | доказано композицией | доказано 1 из 1 |
«Requests and responses»
flang/stdlib/http.flang — functions 64; the kernel ledger was taken from this version of the file
тип «Заголовок»
вариант «Заголовок» содержит имя: строка, значение: строка
тип «Запрос»
вариант «Запрос» содержит метод: строка, цель: строка, версия: строка, заголовки: список «Заголовок», тело: строка
тип «Ответ»
вариант «Ответ» содержит код: число, пояснение: строка, заголовки: список «Заголовок», тело: строка
тип «Разбор запроса»
вариант «Запрос разобран» содержит запрос: «Запрос»
вариант «Запрос неполон»
вариант «Запрос испорчен» содержит код: число, причина: строка
тип «Разбор заголовков»
вариант «Заголовки разобраны» содержит заголовки: список «Заголовок»
вариант «Заголовки негодны» содержит код: число, причина: строка
тип «Разбор тела»
вариант «Тело собрано» содержит тело: строка
вариант «Тело неполно»
вариант «Тело испорчено» содержит причина: строка
тип «Длина тела»
вариант «Длина названа» содержит сколько: число
вариант «Длина не названа»
вариант «Длина негодна» содержит причина: строка
тип «Целое из строки»
вариант «Число получено» содержит значение: число
вариант «Число не получено»
тип «Ход раскодирования»
вариант «Ход» содержит собрано: строка, ждём: число, набрано: число, сырое: строка
тотальная функция «Склеить куски»
принимает части: список строки, разделитель: строка
возвращает строка
обеспечивает «склейка содержит первый кусок» результат содержит («Первый кусок» от части)
пример «Три куска»
дано части равно ["а", "б", "в"]
дано разделитель равно "-"
ожидается "а-б-в"
тотальная функция «Первый кусок»
принимает части: список строки
возвращает строка
обеспечивает «у пустого списка первого куска нет, а у непустого он — его голова» разбор части
случай пусто
то результат равен ""
случай голова г и хвост х
то результат равен г
пример «Первый из двух»
дано части равно ["а", "б"]
ожидается "а"
тотальная функция «Прочие куски»
принимает части: список строки
возвращает список строки
обеспечивает «прочих ровно на один меньше» (длина результат) равен (если пусто части то 0 иначе (длина части) минус 1)
обеспечивает «прочие куски — это хвост списка» разбор части
случай пусто
то результат равен []
случай голова г и хвост х
то результат равен х
пример «Всё, кроме первого»
дано части равно ["а", "б", "в"]
ожидается ["б", "в"]
тотальная функция «Обрезать пробельные знаки слева»
принимает текст: строка
возвращает строка
обеспечивает «слева снято ровно начало текста» ((соединить (подстрока текст с 1 по ((длина текст) минус (длина результат))) с результат) равен текст)
обеспечивает «слева не осталось пробельного знака» (((длина результат) равен 0) или ((не ((подстрока результат с 1 по 1) равен " ")) и притом (не ((подстрока результат с 1 по 1) равен "\t"))))
обеспечивает «слева снимали только пробельный знак» (((длина текст) равен (длина результат)) или ((подстрока текст с 1 по 1) равен " ") или ((подстрока текст с 1 по 1) равен "\t"))
пример «Ведущие пробелы»
дано текст равно " узел"
ожидается "узел"
тотальная функция «Обрезать пробельные знаки справа»
принимает текст: строка
возвращает строка
обеспечивает «обрезка справа есть обрезка слева между двумя переворотами» результат равен («Перевернуть» от («Обрезать пробельные знаки слева» от («Перевернуть» от текст)))
обеспечивает «справа снято ровно окончание текста» ((соединить результат с (подстрока текст с ((длина результат) плюс 1) по (длина текст))) равен текст)
обеспечивает «справа не осталось пробельного знака» (((длина результат) равен 0) или ((не ((подстрока результат с (длина результат) по (длина результат)) равен " ")) и притом (не ((подстрока результат с (длина результат) по (длина результат)) равен "\t"))))
обеспечивает «справа снимали только пробельный знак» (((длина текст) равен (длина результат)) или ((подстрока текст с (длина текст) по (длина текст)) равен " ") или ((подстрока текст с (длина текст) по (длина текст)) равен "\t"))
пример «Хвостовые пробелы»
дано текст равно "узел "
ожидается "узел"
тотальная функция «Перевернуть»
принимает текст: строка
возвращает строка
обеспечивает «пустое переворачивается в пустое» ((не ((длина текст) равен 0)) или (результат равен ""))
обеспечивает «один знак переворачивается в себя» ((не ((длина текст) равен 1)) или (результат равен текст))
обеспечивает «два знака меняются местами» ((не ((длина текст) равен 2)) или (результат равен (соединить (символ 2 в текст) с (символ 1 в текст))))
пример «Три буквы»
дано текст равно "абв"
ожидается "вба"
тотальная функция «Обрезать края»
принимает текст: строка
возвращает строка
обеспечивает «обрезка краёв есть обрезка справа после обрезки слева» результат равен («Обрезать пробельные знаки справа» от («Обрезать пробельные знаки слева» от текст))
пример «Пробелы с обеих сторон»
дано текст равно " узел "
ожидается "узел"
тотальная функция «Строчный код»
принимает код: число
возвращает число
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (код плюс 32)) или ((результат равен (код)))
обеспечивает «заглавная латинская буква переезжает в нижний регистр ровно на тридцать два, всё прочее не двигается, пока это число» не ((код минус код) равен 0) или (если (код не меньше 65 и притом код не больше 90) то ((результат минус код) равен 32) иначе (результат равен код))
обеспечивает «не заглавная латинская буква с места не двигается» если ((код не меньше 65) и притом (код не больше 90)) то да иначе (результат равен код)
пример «Заглавная A становится строчной»
дано код равно 65
ожидается 97
тотальная функция «Имена совпадают»
принимает первое: строка, второе: строка
возвращает признак
обеспечивает «имена разной длины не совпадают, а две пустые совпадают» если ((длина первое) равен (длина второе)) то ((не ((длина первое) равен 0)) или результат) иначе (не результат)
пример «Разный регистр — одно имя»
дано первое равно "Content-Length"
дано второе равно "cOnTeNt-LeNgTh"
ожидается да
тотальная функция «Цифра десятичная»
принимает код: число
возвращает число
обеспечивает «не цифра даёт минус единицу» если ((код не меньше 48) и притом (код не больше 57)) то да иначе (результат равен (0 минус 1))
обеспечивает «разбор цифры обратен таблице шестнадцати» (результат равен (0 минус 1)) или ((«Цифра в шестнадцатеричную» от результат) равен («Знак по коду» от код))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (код минус 48)) или ((результат равен (0 минус 1)))
пример «Ноль»
дано код равно 48
ожидается 0
тотальная функция «Цифра шестнадцатеричная»
принимает код: число
возвращает число
обеспечивает «не шестнадцатеричный знак даёт минус единицу» если ((код не меньше 48) и притом (код не больше 57)) то да иначе (если ((код не меньше 97) и притом (код не больше 102)) то да иначе (если ((код не меньше 65) и притом (код не больше 70)) то да иначе (результат равен (0 минус 1))))
обеспечивает «разбор шестнадцатеричной обратен таблице шестнадцати» (результат равен (0 минус 1)) или ((«Цифра в шестнадцатеричную» от результат) равен («Знак по коду» от (если ((код не меньше 97) и притом (код не больше 102)) то (код минус 32) иначе код)))
пример «Цифра пять»
дано код равно 53
ожидается 5
тотальная функция «Целое из десятичной»
принимает текст: строка
возвращает «Целое из строки»
обеспечивает «пустая строка числом не является» ((не (пусто текст)) или (результат равен (вариант «Число не получено»)))
обеспечивает «одна цифра даёт своё значение» ((не ((длина текст) равен 1 и притом ("0123456789" содержит текст))) или (результат равен (вариант «Число получено» с значение равным ((код символа текст) минус 48))))
обеспечивает «один нецифровой знак — отказ» ((не ((длина текст) равен 1 и притом (не ("0123456789" содержит текст)))) или (результат равен (вариант «Число не получено»)))
пример «Обычное число»
дано текст равно "123"
ожидается вариант «Число получено» с значение равным 123
тотальная функция «Целое из шестнадцатеричной»
принимает текст: строка
возвращает «Целое из строки»
обеспечивает «пустая строка размером не является» ((не (пусто текст)) или (результат равен (вариант «Число не получено»)))
обеспечивает «одна шестнадцатеричная цифра даёт своё значение» ((не ((длина текст) равен 1 и притом ((«Цифра шестнадцатеричная» от (код символа текст)) не меньше 0))) или (результат равен (вариант «Число получено» с значение равным («Цифра шестнадцатеричная» от (код символа текст)))))
обеспечивает «один не шестнадцатеричный знак — отказ» ((не ((длина текст) равен 1 и притом ((«Цифра шестнадцатеричная» от (код символа текст)) меньше 0))) или (результат равен (вариант «Число не получено»)))
пример «Размер чанка»
дано текст равно "1f"
ожидается вариант «Число получено» с значение равным 31
тотальная функция «Знак по коду»
принимает код: число
возвращает строка
обеспечивает «знак по коду есть ровно тогда, когда код в таблице» ((длина результат) равен (если ((код меньше 32) или (код больше 126)) то 0 иначе 1))
обеспечивает «за таблицей знака нет» если ((код меньше 32) или (код больше 126)) то (результат равен "") иначе да
обеспечивает «у найденного знака тот самый код» (((длина результат) равен 0) или ((код символа результат) равен код))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен ("")) или ((результат равен (символ (код минус 31) в " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~")))
пример «Пробел»
дано код равно 32
ожидается " "
тотальная функция «Цифра в шестнадцатеричную»
принимает н: число
возвращает строка
обеспечивает «шестнадцатеричная цифра — ровно один знак» (длина результат) равен 1
обеспечивает «за пределом шестнадцати выходит ноль» если ((н меньше 0) или (н больше 15)) то (результат равен "0") иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен ("0")) или ((результат равен (символ (н плюс 1) в "0123456789ABCDEF")))
пример «Десять — это A»
дано н равно 10
ожидается "A"
обеспечивает «число в пределах шестнадцати даёт свою цифру таблицы» если не (н меньше 0 или н больше 15) то (результат равен (символ (н плюс 1) в "0123456789ABCDEF")) иначе да
тотальная функция «Байт процентами»
принимает байт: число
возвращает строка
обеспечивает «байт процентами — ровно три знака» (длина результат) равен 3
пример «Пробел»
дано байт равно 32
ожидается "%20"
тотальная функция «Незарезервированный»
принимает код: число
возвращает признак
обеспечивает «буква и тильда незарезервированы, а пробел и разделители адреса — зарезервированы» если (код равен 97 или код равен 126) то результат иначе ((не (код равен 32 или код равен 38 или код равен 47)) или (не результат))
пример «Буква»
дано код равно 97
ожидается да
тотальная функция «Знак процентами»
принимает знак: строка
возвращает строка
обеспечивает «пустой знак даёт пустое» ((не (пусто знак)) или (результат равен ""))
обеспечивает «незарезервированный знак не трогается» если (пусто знак) то да иначе (если («Незарезервированный» от (код символа знак)) то (результат равен знак) иначе да)
обеспечивает «прочий однобайтовый становится тройкой с процентом впереди» ((не ((длина знак) равен 1 и притом ((код символа знак) меньше 128) и притом (не («Незарезервированный» от (код символа знак))))) или (((длина результат) равен 3) и притом ((символ 1 в результат) равен "%")))
пример «Незарезервированное не трогается»
дано знак равно "a"
ожидается "a"
тотальная функция «Точка процентами»
принимает точка: число
возвращает строка
обеспечивает «на каждый октет UTF-8 по три знака» ((длина результат) равен (3 умножить на (длина («Байты кодовой точки» от точка))))
обеспечивает «знаков не меньше трёх» ((длина результат) не меньше 3)
обеспечивает «знаков не больше двенадцати» ((длина результат) не больше 12)
пример «Один байт»
дано точка равно 47
ожидается "%2F"
тотальная функция «Закодировать проценты»
принимает текст: строка
возвращает строка
обеспечивает «кодирование процентами не укорачивает» (длина результат) не меньше (длина текст)
пример «Слово с пробелом»
дано текст равно "два слова"
ожидается "%D0%B4%D0%B2%D0%B0%20%D1%81%D0%BB%D0%BE%D0%B2%D0%B0"
тотальная функция «Свести байт»
принимает собрано: строка, байт: число, сырое: строка
возвращает «Ход раскодирования»
обеспечивает «сведение байта закрывает ожидание» (результат.ждём равен 0)
обеспечивает «сведение байта обнуляет набранное» (результат.набрано равен 0)
обеспечивает «сведение байта опустошает сырое» (результат.сырое равен "")
обеспечивает «непечатный байт возвращает сырую запись целиком» ((не (байт меньше 32 или байт больше 126)) или ((длина результат.собрано) равен ((длина собрано) плюс (длина сырое))))
обеспечивает «печатный байт даёт один знак» ((не (байт не меньше 32 и притом байт не больше 126)) или ((длина результат.собрано) равен ((длина собрано) плюс 1)))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (вариант «Ход» с собрано равным (соединить собрано с сырое) и ждём равным 0 и набрано равным 0 и сырое равным "")) или ((результат равен (вариант «Ход» с собрано равным (соединить собрано с («Знак по коду» от байт)) и ждём равным 0 и набрано равным 0 и сырое равным "")))
пример «Печатный байт становится знаком»
дано собрано равно "а"
дано байт равно 65
дано сырое равно "%41"
ожидается вариант «Ход» с собрано равным "аA" и ждём равным 0 и набрано равным 0 и сырое равным ""
тотальная функция «Шаг раскодирования»
принимает ход: «Ход раскодирования», знак: строка
возвращает «Ход раскодирования»
обеспечивает «процент вне ожидания начинает ожидание двух цифр и запоминается сырым» не ((ход.ждём равен 0) и притом (знак равен "%")) или ((результат.ждём равен 2) и притом (результат.сырое равен "%") и притом (результат.собрано равен ход.собрано))
обеспечивает «обычный знак вне ожидания просто приписывается к собранному» не ((ход.ждём равен 0) и притом (не (знак равен "%"))) или ((результат.ждём равен 0) и притом ((длина результат.собрано) равен ((длина ход.собрано) плюс (длина знак))) и притом (результат.сырое равен ""))
обеспечивает «не шестнадцатеричный знак после процента закрывает ожидание и отдаёт сырое обратно» не ((ход.ждём больше 0) и притом ((длина знак) больше 0) и притом (((«Цифра шестнадцатеричная» от (код символа знак))) меньше 0)) или ((результат.ждём равен 0) и притом (результат.сырое равен ""))
пример «Обычный знак приписывается»
дано ход равно вариант «Ход» с собрано равным "а" и ждём равным 0 и набрано равным 0 и сырое равным ""
дано знак равно "б"
ожидается вариант «Ход» с собрано равным "аб" и ждём равным 0 и набрано равным 0 и сырое равным ""
тотальная функция «Раскодировать проценты»
принимает текст: строка
возвращает строка
обеспечивает «текст без процента раскодированием не меняется» (текст содержит "%") или результат равен текст
пример «Две цифры»
дано текст равно "%41%42"
ожидается "AB"
тотальная функция «Плюсы в пробелы»
принимает текст: строка
возвращает строка
обеспечивает «замена плюсов сохраняет длину» (длина результат) равен (длина текст)
пример «Два слова»
дано текст равно "два+слова"
ожидается "два слова"
тотальная функция «Путь цели»
принимает цель: строка
возвращает строка
обеспечивает «путь и строка запроса покрывают цель без остатка» (длина результат) плюс (длина («Строка запроса цели» от цель)) равен ((длина цель) минус (если цель содержит "?" то 1 иначе 0))
пример «Путь со строкой запроса»
дано цель равно "/заказы?номер=77"
ожидается "/заказы"
тотальная функция «Строка запроса цели»
принимает цель: строка
возвращает строка
обеспечивает «строка запроса — весь хвост после первого вопроса» (длина результат) равен ((длина цель) минус (длина («Первый кусок» от (разделить цель по "?"))) минус (если цель содержит "?" то 1 иначе 0))
пример «Строка запроса есть»
дано цель равно "/заказы?номер=77"
ожидается "номер=77"
тотальная функция «Разобрать пару»
принимает кусок: строка
возвращает «Заголовок»
обеспечивает «кусок без равенства даёт имя из всего куска и пустое значение» (кусок содержит "=") или ((результат.значение равен "") и притом (результат.имя равен («Раскодировать проценты» от («Плюсы в пробелы» от кусок))))
пример «Обычная пара»
дано кусок равно "имя=Марат"
ожидается вариант «Заголовок» с имя равным "имя" и значение равным "Марат"
тотальная функция «Шаг параметров»
принимает акк: список «Заголовок», кусок: строка
возвращает список «Заголовок»
обеспечивает «кусок без имени накопитель не меняет» если пусто («Первый кусок» от (разделить кусок по "=")) то (результат равен акк) иначе да
обеспечивает «кусок с именем даёт разобранную пару поверх накопителя» если не (пусто («Первый кусок» от (разделить кусок по "="))) то (результат равен (добавить («Разобрать пару» от кусок) к акк)) иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (акк)) или ((результат равен (добавить («Разобрать пару» от кусок) к акк)))
пример «кусок без имени накопитель не меняет»
дано акк равно []
дано кусок равно "=1"
ожидается []
тотальная функция «Разобрать параметры»
принимает строказапроса: строка
возвращает список «Заголовок»
обеспечивает «строка запроса без амперсанда и с непустым именем даёт ровно один параметр, и это та же пара» не ((не (строказапроса содержит "&")) и притом ((длина строказапроса) больше 0) и притом (не (строказапроса начинается с "="))) или (((длина результат) равен 1) и притом ((«Имя заголовка» от (элемент 1 в результат)) равен («Имя заголовка» от («Разобрать пару» от строказапроса))))
пример «Две пары»
дано строказапроса равно "а=1&б=2"
ожидается [вариант «Заголовок» с имя равным "а" и значение равным "1",
вариант «Заголовок» с имя равным "б" и значение равным "2"]
тотальная функция «Имя заголовка»
принимает заголовок: «Заголовок»
возвращает строка
обеспечивает «имя заголовка — это записанное в нём имя» результат равен заголовок.имя
пример «Имя достаётся»
дано заголовок равно вариант «Заголовок» с имя равным "Host" и значение равным "узел"
ожидается "Host"
тотальная функция «Значение заголовка»
принимает заголовок: «Заголовок»
возвращает строка
обеспечивает «значение заголовка — это записанное в нём значение» результат равен заголовок.значение
пример «Значение достаётся»
дано заголовок равно вариант «Заголовок» с имя равным "Host" и значение равным "узел"
ожидается "узел"
тотальная функция «Шаг счёта заголовков»
принимает акк: число, заголовок: «Заголовок», имя: строка
возвращает число
обеспечивает «совпавшее имя прибавляет единицу» если «Имена совпадают» от («Имя заголовка» от заголовок) и имя то (результат равен (акк плюс 1)) иначе да
обеспечивает «чужое имя счёта не меняет» если не («Имена совпадают» от («Имя заголовка» от заголовок) и имя) то (результат равен акк) иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (акк плюс 1)) или ((результат равен (акк)))
пример «совпавшее имя прибавляет единицу, и регистр не мешает»
дано акк равно 0
дано заголовок равно (вариант «Заголовок» с имя равным "Host" и значение равным "узел")
дано имя равно "host"
ожидается 1
тотальная функция «Сколько заголовков»
принимает заголовки: список «Заголовок», имя: строка
возвращает число
обеспечивает «столько заголовков, сколько их отбирается по имени» результат равен (длина (отфильтровать заголовки где з → «Имена совпадают» от («Имя заголовка» от з) и имя))
пример «Один такой»
дано заголовки равно [вариант «Заголовок» с имя равным "Host" и значение равным "узел"]
дано имя равно "host"
ожидается 1
тотальная функция «Шаг взятия заголовка»
принимает акк: строка, заголовок: «Заголовок», имя: строка
возвращает строка
обеспечивает «первое совпавшее имя отдаёт своё значение» если («Имена совпадают» от («Имя заголовка» от заголовок) и имя) и притом (пусто акк) то (результат равен («Значение заголовка» от заголовок)) иначе да
обеспечивает «непустой накопитель уже не меняется» если не (пусто акк) то (результат равен акк) иначе да
обеспечивает «чужое имя накопитель не меняет» если не («Имена совпадают» от («Имя заголовка» от заголовок) и имя) то (результат равен акк) иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен («Значение заголовка» от заголовок)) или ((результат равен (акк)))
пример «первое совпавшее имя отдаёт своё значение»
дано акк равно ""
дано заголовок равно (вариант «Заголовок» с имя равным "Host" и значение равным "узел")
дано имя равно "Host"
ожидается "узел"
тотальная функция «Взять заголовок»
принимает заголовки: список «Заголовок», имя: строка
возвращает строка
обеспечивает «у пустого списка заголовка нет» ((не ((длина заголовки) равен 0)) или (результат равен ""))
обеспечивает «на одном заголовке значение берётся ровно при совпадении имён» ((не ((длина заголовки) равен 1)) или (результат равен (если («Имена совпадают» от («Имя заголовка» от (элемент 1 в заголовки)) и имя) то («Значение заголовка» от (элемент 1 в заголовки)) иначе "")))
пример «Регистр имени не важен»
дано заголовки равно [вариант «Заголовок» с имя равным "Content-Length" и значение равным "11"]
дано имя равно "content-length"
ожидается "11"
тотальная функция «Есть заголовок»
принимает заголовки: список «Заголовок», имя: строка
возвращает признак
обеспечивает «заголовок есть ровно тогда, когда отбор по имени непуст» результат равен ((длина (отфильтровать заголовки где з → «Имена совпадают» от («Имя заголовка» от з) и имя)) больше 0)
пример «Есть»
дано заголовки равно [вариант «Заголовок» с имя равным "Host" и значение равным "узел"]
дано имя равно "HOST"
ожидается да
тотальная функция «Шаг заголовков»
принимает прежнее: «Разбор заголовков», строка: строка
возвращает «Разбор заголовков»
обеспечивает «негодный блок заголовков негодным и остаётся: первую беду вторая не затирает» разбор прежнее
случай вариант «Заголовки негодны» с код как кд и причина как пр
то результат равен прежнее
случай любое
то да
обеспечивает «строка без двоеточия делает годный блок негодным с названной причиной» разбор прежнее
случай вариант «Заголовки разобраны» с заголовки как собранные
то (не ((длина (разделить строка по ":")) меньше 2)) или (результат равен (вариант «Заголовки негодны» с код равным 400 и причина равным "заголовок без двоеточия"))
случай любое
то да
пример «Обычный заголовок»
дано прежнее равно вариант «Заголовки разобраны» с заголовки равным []
дано строка равно "Host: узел"
ожидается вариант «Заголовки разобраны» с заголовки равным [вариант «Заголовок» с имя равным "Host" и значение равным "узел"]
тотальная функция «Разобрать заголовки»
принимает строки: список строки
возвращает «Разбор заголовков»
обеспечивает «пустой список строк даёт пустой блок заголовков» ((не ((длина строки) равен 0)) или (результат равен (вариант «Заголовки разобраны» с заголовки равным пустой список)))
обеспечивает «одна строка без двоеточия — названная негодность» ((не (((длина строки) равен 1) и притом ((длина (разделить (элемент 1 в строки) по ":")) меньше 2))) или (результат равен (вариант «Заголовки негодны» с код равным 400 и причина равным "заголовок без двоеточия")))
пример «Два заголовка»
дано строки равно ["Host: узел", "X-Пусто:"]
ожидается вариант «Заголовки разобраны» с заголовки равным [
вариант «Заголовок» с имя равным "Host" и значение равным "узел",
вариант «Заголовок» с имя равным "X-Пусто" и значение равным ""]
тотальная функция «Длина тела»
принимает заголовки: список «Заголовок»
возвращает «Длина тела»
обеспечивает «без заголовка длина не названа» если ((«Сколько заголовков» от заголовки и "Content-Length") больше 1) то да иначе (если ((«Сколько заголовков» от заголовки и "Content-Length") равен 0) то (результат равен (вариант «Длина не названа»)) иначе да)
обеспечивает «при двух заголовках длина негодна с названной причиной» ((не ((«Сколько заголовков» от заголовки и "Content-Length") больше 1)) или (результат равен (вариант «Длина негодна» с причина равным "длина тела названа дважды")))
пример «Длина названа»
дано заголовки равно [вариант «Заголовок» с имя равным "Content-Length" и значение равным "11"]
ожидается вариант «Длина названа» с сколько равным 11
тотальная функция «Тело чанками»
принимает заголовки: список «Заголовок»
возвращает признак
обеспечивает «один заголовок передачи со значением chunked объявляет чанки» (не ((длина заголовки) равен 1 и притом («Имена совпадают» от («Имя заголовка» от (элемент 1 в заголовки)) и "Transfer-Encoding") и притом ((«Значение заголовка» от (элемент 1 в заголовки)) равен "chunked"))) или результат
пример «Чанки объявлены»
дано заголовки равно [вариант «Заголовок» с имя равным "Transfer-Encoding" и значение равным "chunked"]
ожидается да
тотальная функция «Чанки с запасом»
принимает остаток: строка, запас: число, собрано: строка
возвращает «Разбор тела»
обеспечивает «исчерпанный запас — названная порча» не (запас не больше 0) или (результат равен (вариант «Тело испорчено» с причина равным "чанков больше, чем байтов"))
обеспечивает «нулевой размер чанка закрывает тело ровно тем, что собрано» не (запас больше 0 и притом (остаток начинается с "0\r\n")) или (результат равен (вариант «Тело собрано» с тело равным собрано))
пример «Один чанк и конец»
дано остаток равно "5\r\nабвгд\r\n0\r\n\r\n"
дано запас равно 20
дано собрано равно ""
ожидается вариант «Тело собрано» с тело равным "абвгд"
тотальная функция «Чанки кусками»
принимает остаток: строка, запас: число, куски: список строки
возвращает «Разбор тела»
тотальная функция «Собрать чанки»
принимает текст: строка
возвращает «Разбор тела»
обеспечивает «пустой текст запаса не даёт и потому объявляется испорченным» ((не ((длина текст) равен 0)) или (результат равен (вариант «Тело испорчено» с причина равным "чанков больше, чем байтов")))
обеспечивает «один нулевой чанк закрывает пустое тело» ((не (текст равен "0\r\n\r\n")) или (результат равен (вариант «Тело собрано» с тело равным "")))
пример «Два чанка»
дано текст равно "2\r\nаб\r\n3\r\nвгд\r\n0\r\n\r\n"
ожидается вариант «Тело собрано» с тело равным "абвгд"
тотальная функция «Голый перевод строки»
принимает голова: строка
возвращает признак
обеспечивает «в пустом блоке голых переводов нет» ((не ((длина голова) равен 0)) или (не результат))
обеспечивает «одиночный перевод строки голый» ((не (голова равен "\n")) или результат)
обеспечивает «одиночный возврат каретки голый» ((не (голова равен "\r")) или результат)
обеспечивает «пара из возврата и перевода не голая» ((не (голова равен "\r\n")) или (не результат))
пример «Правильный блок»
дано голова равно "GET / HTTP/1.1\r\nHost: узел"
ожидается нет
тотальная функция «Шаг длинной строки»
принимает акк: признак, строка: строка, предел: число
возвращает признак
обеспечивает «строка длиннее предела поднимает признак» если (длина строка) больше предел то (результат равен да) иначе да
обеспечивает «короткая строка признака не трогает» если не ((длина строка) больше предел) то (результат равен акк) иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (да)) или ((результат равен (акк)))
пример «строка длиннее предела поднимает признак»
дано акк равно нет
дано строка равно "абв"
дано предел равно 2
ожидается да
тотальная функция «Есть длинная строка»
принимает строки: список строки, предел: число
возвращает признак
обеспечивает «у пустого списка длинных строк нет» ((не ((длина строки) равен 0)) или (не результат))
обеспечивает «одна строка длинна ровно тогда, когда длиннее предела» ((не ((длина строки) равен 1)) или (результат равен ((длина (элемент 1 в строки)) больше предел)))
пример «Все короткие»
дано строки равно ["Host: узел"]
дано предел равно 8192
ожидается нет
тотальная функция «Свести тело»
принимает метод: строка, цель: строка, версия: строка, заголовки: список «Заголовок», сырое: строка
возвращает «Разбор запроса»
обеспечивает «длина тела и чанки, объявленные разом, — названная порча» не ((«Тело чанками» от заголовки) и притом ((«Сколько заголовков» от заголовки и "Content-Length") больше 0)) или (результат равен (вариант «Запрос испорчен» с код равным 400 и причина равным "длина тела и чанки объявлены разом"))
обеспечивает «без чанков и без длины запрос сложен, а тело пусто» не ((не («Тело чанками» от заголовки)) и притом ((«Сколько заголовков» от заголовки и "Content-Length") равен 0)) или (результат равен (вариант «Запрос разобран» с запрос равным (вариант «Запрос» с метод равным метод и цель равным цель и версия равным версия и заголовки равным заголовки и тело равным "")))
пример «Тело по длине»
дано метод равно "POST"
дано цель равно "/"
дано версия равно "HTTP/1.1"
дано заголовки равно [вариант «Заголовок» с имя равным "Content-Length" и значение равным "2"]
дано сырое равно "аб"
ожидается вариант «Запрос разобран» с запрос равным (вариант «Запрос» с метод равным "POST" и цель равным "/" и версия равным "HTTP/1.1" и заголовки равным [вариант «Заголовок» с имя равным "Content-Length" и значение равным "2"] и тело равным "аб")
тотальная функция «Собрать запрос»
принимает голова: строка, сырое: строка
возвращает «Разбор запроса»
обеспечивает «голый перевод строки в голове отвергает запрос названной причиной» не («Голый перевод строки» от голова) или (результат равен (вариант «Запрос испорчен» с код равным 400 и причина равным "голый перевод строки в блоке заголовков"))
обеспечивает «строка запроса не из трёх слов отвергается названной причиной» если («Голый перевод строки» от голова) то да иначе (если ((длина (разделить («Первый кусок» от (разделить голова по "\r\n")) по " ")) не равен 3) то (результат равен (вариант «Запрос испорчен» с код равным 400 и причина равным "строка запроса не из трёх частей")) иначе да)
пример «Минимальный запрос»
дано голова равно "GET / HTTP/1.1"
дано сырое равно ""
ожидается вариант «Запрос разобран» с запрос равным (вариант «Запрос» с метод равным "GET" и цель равным "/" и версия равным "HTTP/1.1" и заголовки равным [] и тело равным "")
тотальная функция «Разобрать запрос»
принимает текст: строка
возвращает «Разбор запроса»
обеспечивает «вход без пустой строки между головой и телом — неполон, и отвечать на него нечем» не ((длина (разделить текст по "\r\n\r\n")) меньше 2) или (результат равен (вариант «Запрос неполон»))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (вариант «Запрос неполон»)) или ((результат равен («Собрать запрос» от («Первый кусок» от (разделить текст по "\r\n\r\n")) и («Склеить куски» от («Прочие куски» от (разделить текст по "\r\n\r\n")) и "\r\n\r\n"))))
пример «Целый запрос»
дано текст равно "GET / HTTP/1.1\r\n\r\n"
ожидается вариант «Запрос разобран» с запрос равным (вариант «Запрос» с метод равным "GET" и цель равным "/" и версия равным "HTTP/1.1" и заголовки равным [] и тело равным "")
обеспечивает «полный вход разбирается сборкой запроса из головы и тела» если не ((длина (разделить текст по "\r\n\r\n")) меньше 2) то (результат равен («Собрать запрос» от («Первый кусок» от (разделить текст по "\r\n\r\n")) и («Склеить куски» от («Прочие куски» от (разделить текст по "\r\n\r\n")) и "\r\n\r\n"))) иначе да
тотальная функция «Пояснение кода»
принимает код: число
возвращает строка
обеспечивает «код двести получает своё слово» ((не (код равен 200)) или (результат равен "OK"))
обеспечивает «код двести один получает своё слово» если (код равен 200) то да иначе (если (код равен 201) то (результат равен "Created") иначе да)
обеспечивает «код четыреста четыре получает своё слово» ((не (код равен 404)) или (результат равен "Not Found"))
обеспечивает «неизвестный код получает пустое» ((не (код равен 199)) или (результат равен ""))
пример «Сто девяносто девять — не наш»
дано код равно 199
ожидается ""
тотальная функция «Код успешен»
принимает код: число
возвращает признак
обеспечивает «успешны ровно те коды, у которых пояснение из двухсотых» результат равен (((«Пояснение кода» от код) равен "OK") или ((«Пояснение кода» от код) равен "Created") или ((«Пояснение кода» от код) равен "No Content") или (((длина («Пояснение кода» от код)) равен 0) и притом ((код не меньше 200) и притом (код меньше 300))))
пример «Двести»
дано код равно 200
ожидается да
тотальная функция «Напечатать заголовки»
принимает заголовки: список «Заголовок»
возвращает строка
обеспечивает «на каждый заголовок не меньше четырёх знаков: двоеточие, пробел и конец строки» (длина результат) не меньше (4 умножить на (длина заголовки))
пример «Два заголовка»
дано заголовки равно [вариант «Заголовок» с имя равным "Content-Length" и значение равным "2",
вариант «Заголовок» с имя равным "Content-Type" и значение равным "text/plain"]
ожидается "Content-Length: 2\r\nContent-Type: text/plain\r\n"
тотальная функция «Напечатать ответ»
принимает ответ: «Ответ»
возвращает строка
обеспечивает «печать ответа начинается версией, кодом и пояснением» (результат начинается с (соединить (соединить (соединить "HTTP/1.1 " с (к строке ответ.код)) с " ") с ответ.пояснение))
обеспечивает «в печати ответа длина тела названа по самому телу» (результат содержит (соединить (соединить "Content-Length: " с (к строке (длина ответ.тело))) с "\r\n\r\n"))
пример «Ответ с телом»
дано ответ равно вариант «Ответ» с код равным 200 и пояснение равным "OK" и заголовки равным [] и тело равным "аб"
ожидается "HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nаб"
тотальная функция «Ответ с телом»
принимает код: число, тело: строка
возвращает «Ответ»
обеспечивает «ответ несёт свой код, пояснение по коду, ровно один заголовок вида и то самое тело» (результат.код равен код) и притом (результат.тело равен тело) и притом (результат.пояснение равен («Пояснение кода» от код)) и притом ((длина результат.заголовки) равен 1) и притом ((«Имя заголовка» от (элемент 1 в результат.заголовки)) равен "Content-Type")
пример «Обычный ответ»
дано код равно 200
дано тело равно "готово"
ожидается вариант «Ответ» с код равным 200 и пояснение равным "OK" и заголовки равным [вариант «Заголовок» с имя равным "Content-Type" и значение равным "text/plain; charset=utf-8"] и тело равным "готово"
тотальная функция «Ответ на разбор»
принимает разобранное: «Разбор запроса»
возвращает строка
обеспечивает «неполному запросу не отвечают вовсе» если разобранное равен (вариант «Запрос неполон») то (результат равен "") иначе да
обеспечивает «неполному и разобранному запросу не отвечают вовсе, а испорченному отвечают его же кодом и его же причиной» разбор разобранное
случай вариант «Запрос неполон»
то результат равен ""
случай вариант «Запрос испорчен» с код как кд и причина как пр
то (результат начинается с (соединить (соединить "HTTP/1.1 " с (к строке кд)) с " ")) и притом (результат содержит пр)
случай вариант «Запрос разобран» с запрос как зпр
то результат равен ""
пример «Испорченный запрос получает код и причину»
дано разобранное равно вариант «Запрос испорчен» с код равным 400 и причина равным "заголовок без двоеточия"
ожидается "HTTP/1.1 400 Bad Request\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 23\r\n\r\nзаголовок без двоеточия"
тотальная функция «Напечатать запрос»
принимает запрос: «Запрос»
возвращает строка
обеспечивает «печать запроса начинается методом, целью и версией» (результат начинается с (соединить (соединить (соединить (соединить (соединить запрос.метод с " ") с запрос.цель) с " ") с запрос.версия) с "\r\n"))
обеспечивает «в печати запроса длина тела названа по самому телу» (результат содержит (соединить (соединить "Content-Length: " с (к строке (длина запрос.тело))) с "\r\n\r\n"))
пример «GET без тела»
дано запрос равно вариант «Запрос» с метод равным "GET" и цель равным "/" и версия равным "HTTP/1.1" и заголовки равным [вариант «Заголовок» с имя равным "Host" и значение равным "узел"] и тело равным ""
ожидается "GET / HTTP/1.1\r\nHost: узел\r\nContent-Length: 0\r\n\r\n"
тотальная функция «Шаг кусков пути»
принимает собрано: список строки, кусок: строка
возвращает список строки
обеспечивает «пустой кусок в путь не идёт» если пусто кусок то (результат равен собрано) иначе да
обеспечивает «непустой кусок дописывается к собранному» если не (пусто кусок) то (результат равен (добавить кусок к собрано)) иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (собрано)) или ((результат равен (добавить кусок к собрано)))
пример «пустой кусок в путь не идёт»
дано собрано равно []
дано кусок равно ""
ожидается []
тотальная функция «Куски пути»
принимает путь: строка
возвращает список строки
обеспечивает «кусков ровно столько, сколько непустых частей пути» (длина результат) равен (длина (отфильтровать (разделить путь по "/") где часть → (длина часть) больше 0))
пример «Два куска»
дано путь равно "/с/к1"
ожидается ["с", "к1"]
тотальная функция «Глубина пути»
принимает путь: строка
возвращает число
обеспечивает «глубина — число непустых частей пути» результат равен (длина (отфильтровать (разделить путь по "/") где часть → (длина часть) больше 0))
пример «Один кусок»
дано путь равно "/ссылки"
ожидается 1
тотальная функция «Кусок пути»
принимает путь: строка, номер: число
возвращает строка
обеспечивает «номер вне пути куска не даёт» если ((номер меньше 1) или (номер больше (длина («Куски пути» от путь)))) то (результат равен "") иначе да
обеспечивает «номер меньше единицы куска не даёт, а первый кусок пути — это голова его разбиения» если (номер равен 1) то (результат равен («Первый кусок» от («Куски пути» от путь))) иначе ((не (номер не больше 0)) или (результат равен ""))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен ("")) или ((результат равен (элемент номер в («Куски пути» от путь))))
пример «Первый кусок»
дано путь равно "/с/к1"
дано номер равно 1
ожидается "с"
обеспечивает «номер внутри пути отдаёт свой кусок» если не ((номер меньше 1) или (номер больше (длина («Куски пути» от путь)))) то (результат равен (элемент номер в («Куски пути» от путь))) иначе да
тотальная функция «Значение параметра»
принимает параметры: список «Заголовок», имя: строка
возвращает строка
обеспечивает «у пустого списка значения нет» ((не ((длина параметры) равен 0)) или (результат равен ""))
обеспечивает «первый параметр с тем же именем отдаёт своё значение, даже пустое» ((не (((длина параметры) больше 0) и притом ((«Имя заголовка» от (элемент 1 в параметры)) равен имя))) или (результат равен («Значение заголовка» от (элемент 1 в параметры))))
пример «Параметр найден»
дано параметры равно [вариант «Заголовок» с имя равным "номер" и значение равным "77"]
дано имя равно "номер"
ожидается "77"
тотальная функция «Есть параметр»
принимает параметры: список «Заголовок», имя: строка
возвращает признак
обеспечивает «параметр есть ровно тогда, когда имя встретилось хоть раз» результат равен ((длина (отфильтровать параметры где п → («Имя заголовка» от п) равен имя)) больше 0)
пример «Есть, хотя значение пусто»
дано параметры равно [вариант «Заголовок» с имя равным "флаг" и значение равным ""]
дано имя равно "флаг"
ожидается да
тотальная функция «Схема адреса»
принимает адрес: строка
возвращает строка
обеспечивает «без разделителя схемы схема пуста» если (адрес содержит "://") то да иначе (результат равен "")
обеспечивает «при разделителе схема — голова разбиения по нему» если (адрес содержит "://") то (результат равен («Первый кусок» от (разделить адрес по "://"))) иначе да
обеспечивает «схема — ровно то, что стоит перед ://» (если адрес содержит "://" то (адрес начинается с (соединить результат с "://")) иначе ((длина результат) равен 0))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен («Первый кусок» от (разделить адрес по "://"))) или ((результат равен ("")))
пример «Схема http»
дано адрес равно "http://пример.рф/страница"
ожидается "http"
обеспечивает «без разделителя схемы результат пуст» если не (адрес содержит "://") то (результат равен "") иначе да
тотальная функция «Адрес годен»
принимает адрес: строка
возвращает признак
обеспечивает «годен ровно тот адрес, у которого схема http или https» результат равен (((«Схема адреса» от адрес) равен "http") или ((«Схема адреса» от адрес) равен "https"))
пример «http годен»
дано адрес равно "http://пример.рф/страница"
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Склеить куски» | доказано композицией | доказано 0 из 1; «склейка содержит первый кусок» — сетка |
| «Первый кусок» | доказано композицией | доказано 1 из 1 |
| «Прочие куски» | доказано композицией | доказано 1 из 2; «прочих ровно на один меньше» — сетка |
| «Обрезать пробельные знаки слева» | доказано структурой | доказано 0 из 3; «слева снято ровно начало текста» — сетка; «слева не осталось пробельного знака» — сетка; «слева снимали только пробельный знак» — сетка |
| «Обрезать пробельные знаки справа» | доказано композицией | доказано 1 из 4; «справа снято ровно окончание текста» — сетка; «справа не осталось пробельного знака» — сетка; «справа снимали только пробельный знак» — сетка |
| «Перевернуть» | доказано композицией | доказано 0 из 3; «пустое переворачивается в пустое» — сетка; «один знак переворачивается в себя» — сетка; «два знака меняются местами» — сетка |
| «Обрезать края» | доказано композицией | доказано 1 из 1 |
| «Строчный код» | доказано композицией | доказано 2 из 3; «заглавная латинская буква переезжает в нижний регистр ровно на тридцать два, всё прочее не двигается, пока это число» — сетка |
| «Имена совпадают» | доказано структурой | доказано 0 из 1; «имена разной длины не совпадают, а две пустые совпадают» — сетка |
| «Цифра десятичная» | доказано композицией | доказано 2 из 3; «разбор цифры обратен таблице шестнадцати» — сетка |
| «Цифра шестнадцатеричная» | доказано композицией | доказано 1 из 2; «разбор шестнадцатеричной обратен таблице шестнадцати» — сетка |
| «Целое из десятичной» | доказано композицией | доказано 1 из 3; «одна цифра даёт своё значение» — сетка; «один нецифровой знак — отказ» — сетка |
| «Целое из шестнадцатеричной» | доказано композицией | доказано 1 из 3; «одна шестнадцатеричная цифра даёт своё значение» — сетка; «один не шестнадцатеричный знак — отказ» — сетка |
| «Знак по коду» | доказано композицией | доказано 3 из 4; «у найденного знака тот самый код» — сетка |
| «Цифра в шестнадцатеричную» | доказано композицией | доказано 4 из 4 |
| «Байт процентами» | доказано композицией | доказано 1 из 1 |
| «Незарезервированный» | доказано композицией | доказано 0 из 1; «буква и тильда незарезервированы, а пробел и разделители адреса — зарезервированы» — сетка |
| «Знак процентами» | доказано композицией | доказано 2 из 3; «прочий однобайтовый становится тройкой с процентом впереди» — сетка |
| «Точка процентами» | доказано композицией | доказано 0 из 3; «на каждый октет UTF-8 по три знака» — сетка; «знаков не меньше трёх» — сетка; «знаков не больше двенадцати» — сетка |
| «Закодировать проценты» | доказано композицией | доказано 0 из 1; «кодирование процентами не укорачивает» — сетка |
| «Свести байт» | доказано композицией | доказано 6 из 6 |
| «Шаг раскодирования» | доказано композицией | доказано 2 из 3; «не шестнадцатеричный знак после процента закрывает ожидание и отдаёт сырое обратно» — сетка |
| «Раскодировать проценты» | доказано композицией | доказано 0 из 1; «текст без процента раскодированием не меняется» — сетка |
| «Плюсы в пробелы» | доказано композицией | доказано 0 из 1; «замена плюсов сохраняет длину» — сетка |
| «Путь цели» | доказано композицией | доказано 0 из 1; «путь и строка запроса покрывают цель без остатка» — сетка |
| «Строка запроса цели» | доказано композицией | доказано 0 из 1; «строка запроса — весь хвост после первого вопроса» — сетка |
| «Разобрать пару» | доказано композицией | доказано 0 из 1; «кусок без равенства даёт имя из всего куска и пустое значение» — сетка |
| «Шаг параметров» | доказано композицией | доказано 3 из 3 |
| «Разобрать параметры» | доказано композицией | доказано 0 из 1; «строка запроса без амперсанда и с непустым именем даёт ровно один параметр, и это та же пара» — сетка |
| «Имя заголовка» | доказано композицией | доказано 1 из 1 |
| «Значение заголовка» | доказано композицией | доказано 1 из 1 |
| «Шаг счёта заголовков» | доказано композицией | доказано 3 из 3 |
| «Сколько заголовков» | доказано композицией | доказано 0 из 1; «столько заголовков, сколько их отбирается по имени» — сетка |
| «Шаг взятия заголовка» | доказано композицией | доказано 4 из 4 |
| «Взять заголовок» | доказано композицией | доказано 1 из 2; «на одном заголовке значение берётся ровно при совпадении имён» — сетка |
| «Есть заголовок» | доказано композицией | доказано 1 из 1 |
| «Шаг заголовков» | доказано композицией | доказано 0 из 2; «негодный блок заголовков негодным и остаётся: первую беду вторая не затирает» — сетка; «строка без двоеточия делает годный блок негодным с названной причиной» — сетка |
| «Разобрать заголовки» | доказано композицией | доказано 1 из 2; «одна строка без двоеточия — названная негодность» — сетка |
| «Длина тела» | доказано композицией | доказано 2 из 2 |
| «Тело чанками» | доказано композицией | доказано 0 из 1; «один заголовок передачи со значением chunked объявляет чанки» — сетка |
| «Чанки с запасом» | доказано композицией | доказано 0 из 2; «исчерпанный запас — названная порча» — сетка; «нулевой размер чанка закрывает тело ровно тем, что собрано» — сетка |
| «Чанки кусками» | доказано постоянным шагом | — |
| «Собрать чанки» | доказано композицией | доказано 0 из 2; «пустой текст запаса не даёт и потому объявляется испорченным» — сетка; «один нулевой чанк закрывает пустое тело» — сетка |
| «Голый перевод строки» | доказано композицией | доказано 0 из 4; «в пустом блоке голых переводов нет» — сетка; «одиночный перевод строки голый» — сетка; «одиночный возврат каретки голый» — сетка; «пара из возврата и перевода не голая» — сетка |
| «Шаг длинной строки» | доказано композицией | доказано 3 из 3 |
| «Есть длинная строка» | доказано композицией | доказано 0 из 2; «у пустого списка длинных строк нет» — сетка; «одна строка длинна ровно тогда, когда длиннее предела» — сетка |
| «Свести тело» | доказано композицией | доказано 1 из 2; «без чанков и без длины запрос сложен, а тело пусто» — сетка |
| «Собрать запрос» | доказано композицией | доказано 2 из 2 |
| «Разобрать запрос» | доказано композицией | доказано 3 из 3 |
| «Пояснение кода» | доказано композицией | доказано 4 из 4 |
| «Код успешен» | доказано композицией | доказано 0 из 1; «успешны ровно те коды, у которых пояснение из двухсотых» — сетка |
| «Напечатать заголовки» | доказано композицией | доказано 0 из 1; «на каждый заголовок не меньше четырёх знаков: двоеточие, пробел и конец строки» — сетка |
| «Напечатать ответ» | доказано композицией | доказано 1 из 2; «в печати ответа длина тела названа по самому телу» — сетка |
| «Ответ с телом» | доказано композицией | доказано 1 из 1 |
| «Ответ на разбор» | доказано композицией | доказано 1 из 2; «неполному и разобранному запросу не отвечают вовсе, а испорченному отвечают его же кодом и его же причиной» — сетка |
| «Напечатать запрос» | доказано композицией | доказано 1 из 2; «в печати запроса длина тела названа по самому телу» — сетка |
| «Шаг кусков пути» | доказано композицией | доказано 3 из 3 |
| «Куски пути» | доказано композицией | доказано 0 из 1; «кусков ровно столько, сколько непустых частей пути» — сетка |
| «Глубина пути» | доказано композицией | доказано 1 из 1 |
| «Кусок пути» | доказано композицией | доказано 3 из 4; «номер меньше единицы куска не даёт, а первый кусок пути — это голова его разбиения» — сетка |
| «Значение параметра» | доказано структурой | доказано 1 из 2; «первый параметр с тем же именем отдаёт своё значение, даже пустое» — сетка |
| «Есть параметр» | доказано структурой | доказано 0 из 1; «параметр есть ровно тогда, когда имя встретилось хоть раз» — сетка |
| «Схема адреса» | доказано композицией | доказано 4 из 5; «схема — ровно то, что стоит перед ://» — сетка |
| «Адрес годен» | доказано композицией | доказано 0 из 1; «годен ровно тот адрес, у которого схема http или https» — сетка |
«JSON»
flang/stdlib/json.flang — functions 36; the kernel ledger was taken from this version of the file
тип «Значение json»
вариант «Ничто json»
вариант «Признак json» содержит истина: признак
вариант «Число json» содержит величина: число
вариант «Текст json» содержит текст: строка
вариант «Массив json» содержит элементы: список «Значение json»
вариант «Объект json» содержит состав: список «Поле json»
тип «Поле json»
вариант «Поле json» содержит имя: строка, содержимое: «Значение json»
тип «Итог json»
вариант «Разобран json» содержит значение: «Значение json»
вариант «Не разобран json» содержит причина: строка
тотальная функция «Имя поля json»
принимает пара: «Поле json»
возвращает строка
обеспечивает «имя поля — это записанное в поле имя» результат равен пара.имя
пример «Имя достаётся из поля»
дано пара равно вариант «Поле json» с имя равным "а" и содержимое равным (вариант «Ничто json»)
ожидается "а"
тотальная функция «Содержимое поля json»
принимает пара: «Поле json»
возвращает «Значение json»
обеспечивает «содержимое поля — это записанное в поле значение» результат равен пара.содержимое
пример «Содержимое достаётся из поля»
дано пара равно вариант «Поле json» с имя равным "а" и содержимое равным (вариант «Ничто json»)
ожидается вариант «Ничто json»
тип «Знак json»
вариант «Скобка json» содержит скобка: строка
вариант «Слово json» содержит слово: строка
вариант «Цифирь json» содержит величина: число
вариант «Строчка json» содержит текст: строка
тип «Разметка json»
вариант «Разметка json» содержит знаки: список «Знак json», лад: строка, копилка: строка, хвостик: строка, беда: строка
тотальная функция «Беда разметки json»
принимает разметка: «Разметка json»
возвращает строка
обеспечивает «беда разметки — это записанная в состоянии беда» результат равен разметка.беда
пример «У свежей разметки беды нет»
дано разметка равно вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
ожидается ""
тотальная функция «Знаки разметки json»
принимает разметка: «Разметка json»
возвращает список «Знак json»
обеспечивает «знаки разметки — это записанный в состоянии список знаков» результат равен разметка.знаки
пример «У свежей разметки знаков нет»
дано разметка равно вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
ожидается пустой список
тотальная функция «Сломать разметку json»
принимает разметка: «Разметка json», причина: строка
возвращает «Разметка json»
обеспечивает «беда липкая: сломанную разметку ломать нечем» (разметка.беда равен "") или ((результат.беда равен разметка.беда) и притом ((длина результат.знаки) равен (длина разметка.знаки)))
обеспечивает «сломанная разметка не бывает без причины» не («Беда разметки json» от результат) равен ""
обеспечивает «поломка сбрасывает лад» не (разметка.беда равен "") или (результат.лад равен "")
обеспечивает «поломка опустошает копилку» не (разметка.беда равен "") или (результат.копилка равен "")
обеспечивает «поломка знаков не прибавляет» не (разметка.беда равен "") или ((длина результат.знаки) равен (длина разметка.знаки))
обеспечивает «безымянная поломка получает общее имя» не (разметка.беда равен "" и притом (причина равен "")) или (результат.беда равен "разметка сломалась")
пример «Причина встаёт в состояние»
дано разметка равно вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
дано причина равно "мусор"
ожидается вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным "мусор"
тотальная функция «Пробельный json»
принимает симв: строка
возвращает признак
обеспечивает «пробельны ровно четыре знака, и ровно по одному» результат равен (((длина симв) равен 1) и притом (" \n\r\t" содержит симв))
пример «Пробел пробельный»
дано симв равно " "
ожидается да
тотальная функция «Цифра json»
принимает симв: строка
возвращает признак
обеспечивает «цифра — ровно тот знак, у которого значение цифры лежит в 0..9» результат равен (((длина симв) равен 1) и притом ((«Значение цифры json» от симв) не меньше 0) и притом ((«Значение цифры json» от симв) не больше 9))
пример «Ноль — цифра»
дано симв равно "0"
ожидается да
тотальная функция «Значение цифры json»
принимает симв: строка
возвращает число
обеспечивает «значение цифры — код первого знака без сорока восьми, и пустая строка ведёт себя как ноль» результат равен ((код символа (соединить симв с "0")) минус 48)
обеспечивает «пустая строка даёт ноль» если (симв равен "") то (результат равен 0) иначе да
обеспечивает «непустой знак — его код без сорока восьми» если (симв равен "") то да иначе (результат равен ((код символа симв) минус 48))
пример «Семёрка»
дано симв равно "7"
ожидается 7
тотальная функция «Шестнадцатеричная json»
принимает симв: строка
возвращает признак
обеспечивает «шестнадцатеричны ровно двадцать два знака набора» результат равен (((длина симв) равен 1) и притом ("0123456789abcdefABCDEF" содержит симв))
пример «Цифра годится»
дано симв равно "9"
ожидается да
тотальная функция «Буква слова json»
принимает симв: строка
возвращает признак
обеспечивает «буквы слов — ровно те, из которых сложены true, false и null» результат равен (((длина симв) равен 1) и притом ("true" содержит симв или "false" содержит симв или "null" содержит симв))
пример «t — буква слова»
дано симв равно "t"
ожидается да
тотальная функция «Одиночный знак json»
принимает симв: строка
возвращает признак
обеспечивает «одиночны ровно шесть знаков разметки» результат равен (((длина симв) равен 1) и притом ("{}[]:," содержит симв))
пример «Фигурная скобка одиночная»
дано симв равно "{"
ожидается да
тип «Счёт json»
вариант «Счёт json» содержит этап: строка, знак: число, целое: число, дробь: число, масштаб: число, знакп: число, порядок: число
тип «Исход числа json»
вариант «Число разобрано json» содержит величина: число
вариант «Число не разобрано json»
тотальная функция «Начало счёта json»
принимает ничего: строка
возвращает «Счёт json»
обеспечивает «свежий счёт ещё ничего не прочёл: этап начальный, знаки положительны, целое и дробь нули» (результат.этап равен "0") и притом (результат.знак равен 1) и притом (результат.целое равен 0) и притом (результат.дробь равен 0) и притом (результат.масштаб равен 0.1) и притом (результат.знакп равен 1) и притом (результат.порядок равен 0)
пример «Начало счёта»
дано ничего равно ""
ожидается вариант «Счёт json» с этап равным "0" и знак равным 1 и целое равным 0 и дробь равным 0 и масштаб равным 0.1 и знакп равным 1 и порядок равным 0
тотальная функция «Шаг счёта json»
принимает счёт: «Счёт json», симв: строка
возвращает «Счёт json»
обеспечивает «сбой липкий: этап остаётся сорванным» не (счёт.этап равен "!") или (результат.этап равен "!")
обеспечивает «сбой липкий: целая часть не меняется» не (счёт.этап равен "!") или (результат.целое равен счёт.целое)
обеспечивает «сбой липкий: дробная часть не меняется» не (счёт.этап равен "!") или (результат.дробь равен счёт.дробь)
обеспечивает «сбой липкий: знак не меняется» не (счёт.этап равен "!") или (результат.знак равен счёт.знак)
обеспечивает «сбой липкий: порядок не меняется» не (счёт.этап равен "!") или (результат.порядок равен счёт.порядок)
обеспечивает «цифра в целой части множит на десять и прибавляет своё значение» не ((счёт.этап равен "i") и притом («Цифра json» от симв) и притом (счёт.целое не больше 1000000)) или (результат.целое равен ((счёт.целое умножить на 10) плюс («Значение цифры json» от симв)))
обеспечивает «цифра в целой части оставляет счёт на целом этапе» не ((счёт.этап равен "i") и притом («Цифра json» от симв) и притом (счёт.целое не больше 1000000)) или (результат.этап равен "i")
обеспечивает «минус в начале делает знак отрицательным» если (счёт.этап равен "!") то да иначе (если ((счёт.этап равен "0") и притом (симв равен "-")) то (результат.знак равен (0 минус 1)) иначе да)
обеспечивает «минус в начале переводит счёт на этап после знака» если (счёт.этап равен "!") то да иначе (если ((счёт.этап равен "0") и притом (симв равен "-")) то (результат.этап равен "1") иначе да)
пример «Первая цифра переводит в целую часть»
дано счёт равно вариант «Счёт json» с этап равным "0" и знак равным 1 и целое равным 0 и дробь равным 0 и масштаб равным 0.1 и знакп равным 1 и порядок равным 0
дано симв равно "7"
ожидается вариант «Счёт json» с этап равным "i" и знак равным 1 и целое равным 7 и дробь равным 0 и масштаб равным 0.1 и знакп равным 1 и порядок равным 0
тотальная функция «Десять в степени json»
принимает показатель: число
возвращает число
убывает показатель
обеспечивает «степень десяти положительна» результат больше 0
обеспечивает «неположительный показатель даёт единицу» если (показатель не больше 0) то (результат равен 1) иначе да
пример «Нулевая степень»
дано показатель равно 0
ожидается 1
тотальная функция «Число из текста json»
принимает текст: строка
возвращает «Исход числа json»
обеспечивает «пустой текст числом не разбирается» не ((длина текст) равен 0) или (результат равен (вариант «Число не разобрано json»))
обеспечивает «одна цифра разбирается ровно в своё значение» не ((длина текст) равен 1 и притом («Цифра json» от текст)) или (результат равен (вариант «Число разобрано json» с величина равным («Значение цифры json» от текст)))
пример «Целое»
дано текст равно "123"
ожидается вариант «Число разобрано json» с величина равным 123
тотальная функция «Начало разметки json»
принимает ничего: строка
возвращает «Разметка json»
обеспечивает «свежая разметка пуста во всех пяти полях» ((длина результат.знаки) равен 0) и притом (результат.лад равен "") и притом (результат.копилка равен "") и притом (результат.хвостик равен "") и притом (результат.беда равен "")
пример «Свежая разметка пуста»
дано ничего равно ""
ожидается вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
тотальная функция «Добавить знак json»
принимает разметка: «Разметка json», знак: «Знак json»
возвращает «Разметка json»
обеспечивает «беда липкая: к сломанной разметке знак не добавляется» (разметка.беда равен "") или ((результат.беда равен разметка.беда) и притом ((длина результат.знаки) равен (длина разметка.знаки)) и притом (результат.лад равен разметка.лад) и притом (результат.копилка равен разметка.копилка))
обеспечивает «к целой разметке знак добавляется ровно один, а лад и копилка сбрасываются» не (разметка.беда равен "") или (((длина результат.знаки) равен ((длина разметка.знаки) плюс 1)) и притом (результат.лад равен "") и притом (результат.копилка равен "") и притом (результат.беда равен ""))
пример «Скобка встаёт в список знаков»
дано разметка равно вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
дано знак равно вариант «Скобка json» с скобка равным "{"
ожидается вариант «Разметка json» с знаки равным [вариант «Скобка json» с скобка равным "{"] и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
тотальная функция «Копить json»
принимает разметка: «Разметка json», лад: строка, добавка: строка, хвост: строка
возвращает «Разметка json»
обеспечивает «беда липкая: сломанная разметка не копит» (разметка.беда равен "") или ((результат.беда равен разметка.беда) и притом (результат.лад равен разметка.лад) и притом ((длина результат.копилка) равен (длина разметка.копилка)))
обеспечивает «копилка удлиняется ровно на добавку, лад и хвостик встают заданные, а знаков не прибавляется» не (разметка.беда равен "") или (((длина результат.копилка) равен ((длина разметка.копилка) плюс (длина добавка))) и притом (результат.лад равен лад) и притом (результат.хвостик равен хвост) и притом ((длина результат.знаки) равен (длина разметка.знаки)))
пример «Знак копится в копилку»
дано разметка равно вариант «Разметка json» с знаки равным пустой список и лад равным "с" и копилка равным "а" и хвостик равным "" и беда равным ""
дано лад равно "с"
дано добавка равно "б"
дано хвост равно ""
ожидается вариант «Разметка json» с знаки равным пустой список и лад равным "с" и копилка равным "аб" и хвостик равным "" и беда равным ""
тотальная функция «Закрыть лексему json»
принимает разметка: «Разметка json»
возвращает «Разметка json»
обеспечивает «беда липкая: сломанную разметку закрытие не трогает» (разметка.беда равен "") или ((результат.беда равен разметка.беда) и притом ((длина результат.знаки) равен (длина разметка.знаки)))
обеспечивает «закрытие лексемы сбрасывает лад» не (разметка.беда равен "" и притом (разметка.лад равен "ч" или разметка.лад равен "б")) или (результат.лад равен "")
обеспечивает «закрытие лексемы опустошает копилку» не (разметка.беда равен "" и притом (разметка.лад равен "ч" или разметка.лад равен "б")) или (результат.копилка равен "")
обеспечивает «закрытие лексемы даёт ровно один знак или называет беду» не (разметка.беда равен "" и притом (разметка.лад равен "ч" или разметка.лад равен "б")) или (((длина результат.знаки) равен ((длина разметка.знаки) плюс 1)) или (не (результат.беда равен "")))
обеспечивает «вне лексемы закрывать нечего: лад не тронут» не (разметка.беда равен "" и притом не (разметка.лад равен "ч") и притом не (разметка.лад равен "б")) или (результат.лад равен разметка.лад)
обеспечивает «вне лексемы закрывать нечего: копилка не тронута» не (разметка.беда равен "" и притом не (разметка.лад равен "ч") и притом не (разметка.лад равен "б")) или (результат.копилка равен разметка.копилка)
обеспечивает «вне лексемы закрывать нечего: знаков не прибавилось» не (разметка.беда равен "" и притом не (разметка.лад равен "ч") и притом не (разметка.лад равен "б")) или ((длина результат.знаки) равен (длина разметка.знаки))
пример «Число закрывается знаком»
дано разметка равно вариант «Разметка json» с знаки равным пустой список и лад равным "ч" и копилка равным "12" и хвостик равным "" и беда равным ""
ожидается вариант «Разметка json» с знаки равным [вариант «Цифирь json» с величина равным 12] и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
тотальная функция «Знак вне json»
принимает разметка: «Разметка json», симв: строка
возвращает «Разметка json»
обеспечивает «беда липкая: сломанная разметка знаков не читает» (разметка.беда равен "") или ((результат.беда равен разметка.беда) и притом ((длина результат.знаки) равен (длина разметка.знаки)))
обеспечивает «пробел вне лексемы: лад не тронут» не (разметка.беда равен "" и притом («Пробельный json» от симв)) или (результат.лад равен разметка.лад)
обеспечивает «пробел вне лексемы: знаков не прибавилось» не (разметка.беда равен "" и притом («Пробельный json» от симв)) или ((длина результат.знаки) равен (длина разметка.знаки))
обеспечивает «пробел вне лексемы: беды не заводит» не (разметка.беда равен "" и притом («Пробельный json» от симв)) или (результат.беда равен "")
обеспечивает «пробел вне лексемы: копилка не тронута» не (разметка.беда равен "" и притом («Пробельный json» от симв)) или (результат.копилка равен разметка.копилка)
обеспечивает «одиночный знак прибавляет ровно один знак разметки» не (разметка.беда равен "" и притом («Одиночный знак json» от симв)) или ((длина результат.знаки) равен ((длина разметка.знаки) плюс 1))
обеспечивает «одиночный знак беды не заводит» не (разметка.беда равен "" и притом («Одиночный знак json» от симв)) или (результат.беда равен "")
обеспечивает «одиночный знак оставляет лад пустым» не (разметка.беда равен "" и притом («Одиночный знак json» от симв)) или (результат.лад равен "")
пример «Пробел ничего не меняет»
дано разметка равно вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
дано симв равно " "
ожидается вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
тотальная функция «Шаг разметки json»
принимает разметка: «Разметка json», симв: строка
возвращает «Разметка json»
обеспечивает «беда липкая: сломанная разметка дальше не идёт» (разметка.беда равен "") или ((результат.беда равен разметка.беда) и притом ((длина результат.знаки) равен (длина разметка.знаки)) и притом (результат.лад равен разметка.лад))
обеспечивает «шаг разметки знаков не теряет» ((длина результат.знаки) не меньше (длина разметка.знаки))
обеспечивает «шаг разметки прибавляет не больше двух знаков» ((длина результат.знаки) не больше ((длина разметка.знаки) плюс 2))
обеспечивает «кавычка вне лексемы ставит лад строки» не (разметка.беда равен "" и притом (разметка.лад равен "") и притом (симв равен "\"")) или (результат.лад равен "с")
обеспечивает «кавычка вне лексемы опустошает копилку» не (разметка.беда равен "" и притом (разметка.лад равен "") и притом (симв равен "\"")) или (результат.копилка равен "")
обеспечивает «кавычка вне лексемы знаков не прибавляет» не (разметка.беда равен "" и притом (разметка.лад равен "") и притом (симв равен "\"")) или ((длина результат.знаки) равен (длина разметка.знаки))
пример «Скобка становится знаком»
дано разметка равно вариант «Разметка json» с знаки равным пустой список и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
дано симв равно "["
ожидается вариант «Разметка json» с знаки равным [вариант «Скобка json» с скобка равным "["] и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
тотальная функция «Знаки json»
принимает текст: строка
возвращает «Разметка json»
обеспечивает «у целой разметки лад пуст» не (результат.беда равен "") или (результат.лад равен "")
обеспечивает «у целой разметки копилка пуста» не (результат.беда равен "") или (результат.копилка равен "")
обеспечивает «две скобки дают ровно два знака» (не (текст равен "[]")) или ((длина результат.знаки) равен 2)
обеспечивает «две скобки бедой не кончаются» (не (текст равен "[]")) или (результат.беда равен "")
обеспечивает «слово null даёт ровно один знак» (не (текст равен "null")) или ((длина результат.знаки) равен 1)
обеспечивает «слово null бедой не кончается» (не (текст равен "null")) или (результат.беда равен "")
обеспечивает «неизвестный знак кончается бедой» ((не (текст равен "'")) или (не (результат.беда равен "")))
пример «Пустой массив — две скобки»
дано текст равно "[]"
ожидается вариант «Разметка json» с знаки равным [вариант «Скобка json» с скобка равным "[", вариант «Скобка json» с скобка равным "]"] и лад равным "" и копилка равным "" и хвостик равным "" и беда равным ""
тип «Рамка json»
вариант «Рамка массива json» содержит собрано: список «Значение json»
вариант «Рамка объекта json» содержит собраны: список «Поле json», ключ: строка
тип «Ход json»
вариант «Ход json» содержит стопка: список «Рамка json», готово: список «Значение json», ждём: строка, изъян: строка
тотальная функция «Начало хода json»
принимает ничего: строка
возвращает «Ход json»
обеспечивает «свежий ход ждёт значения: стопка и готовое пусты, изъяна нет» ((длина результат.стопка) равен 0) и притом ((длина результат.готово) равен 0) и притом (результат.ждём равен "з") и притом (результат.изъян равен "")
пример «Свежий ход ждёт значения»
дано ничего равно ""
ожидается вариант «Ход json» с стопка равным пустой список и готово равным пустой список и ждём равным "з" и изъян равным ""
тотальная функция «Сломать ход json»
принимает ход: «Ход json», причина: строка
возвращает «Ход json»
обеспечивает «изъян липкий: первую причину вторая не затирает» (ход.изъян равен "") или ((результат.изъян равен ход.изъян) и притом (результат.ждём равен ход.ждём))
обеспечивает «поломка называет непустую причину» не (ход.изъян равен "") или (не (результат.изъян равен ""))
обеспечивает «поломка запирает ход» не (ход.изъян равен "") или (результат.ждём равен "!")
обеспечивает «поломка готового не прибавляет» не (ход.изъян равен "") или ((длина результат.готово) равен (длина ход.готово))
обеспечивает «поломка стопки не трогает» не (ход.изъян равен "") или ((длина результат.стопка) равен (длина ход.стопка))
обеспечивает «безымянная поломка получает общее имя» не (ход.изъян равен "" и притом (причина равен "")) или (результат.изъян равен "разбор сбился")
пример «Причина встаёт в ход»
дано ход равно вариант «Ход json» с стопка равным пустой список и готово равным пустой список и ждём равным "з" и изъян равным ""
дано причина равно "лишний знак"
ожидается вариант «Ход json» с стопка равным пустой список и готово равным пустой список и ждём равным "!" и изъян равным "лишний знак"
тотальная функция «Шаг поиска имени json»
принимает есть: признак, п: «Поле json», новое: «Поле json»
возвращает признак
обеспечивает «однажды найденное имя уже не теряется» если есть то (результат равен да) иначе да
обеспечивает «пока не найдено, отвечает сравнение имён» если не есть то (результат равен ((«Имя поля json» от п) равен («Имя поля json» от новое))) иначе да
тотальная функция «Вписать поле json»
принимает набор: список «Поле json», новое: «Поле json»
возвращает список «Поле json»
обеспечивает «в пустой набор встаёт ровно одно поле» не ((длина набор) равен 0) или ((длина результат) равен 1)
обеспечивает «в пустом наборе у вписанного поля своё имя» не ((длина набор) равен 0) или ((«Имя поля json» от (элемент 1 в результат)) равен («Имя поля json» от новое))
обеспечивает «вписывание полей не теряет» ((длина результат) не меньше (длина набор))
обеспечивает «вписывание прибавляет не больше одного поля» ((длина результат) не больше ((длина набор) плюс 1))
пример «Новый ключ встаёт в конец»
дано набор равно [вариант «Поле json» с имя равным "а" и содержимое равным (вариант «Ничто json»)]
дано новое равно вариант «Поле json» с имя равным "б" и содержимое равным (вариант «Ничто json»)
ожидается [вариант «Поле json» с имя равным "а" и содержимое равным (вариант «Ничто json»),
вариант «Поле json» с имя равным "б" и содержимое равным (вариант «Ничто json»)]
тотальная функция «Вложить значение json»
принимает ход: «Ход json», значение: «Значение json»
возвращает «Ход json»
обеспечивает «изъян липкий: сломанный ход значений не берёт» (ход.изъян равен "") или ((результат.изъян равен ход.изъян) и притом ((длина результат.готово) равен (длина ход.готово)) и притом ((длина результат.стопка) равен (длина ход.стопка)))
обеспечивает «на пустой стопке готовых становится на одно больше» не (ход.изъян равен "" и притом ((длина ход.стопка) равен 0)) или ((длина результат.готово) равен ((длина ход.готово) плюс 1))
обеспечивает «на пустой стопке ход запирается» не (ход.изъян равен "" и притом ((длина ход.стопка) равен 0)) или (результат.ждём равен "!")
обеспечивает «на пустой стопке стопка остаётся пустой» не (ход.изъян равен "" и притом ((длина ход.стопка) равен 0)) или ((длина результат.стопка) равен 0)
обеспечивает «при непустой стопке ход ждёт разделитель» не (ход.изъян равен "" и притом ((длина ход.стопка) больше 0)) или (результат.ждём равен "р")
обеспечивает «при непустой стопке высота стопки не меняется» не (ход.изъян равен "" и притом ((длина ход.стопка) больше 0)) или ((длина результат.стопка) равен (длина ход.стопка))
обеспечивает «при непустой стопке готовых не прибавляется» не (ход.изъян равен "" и притом ((длина ход.стопка) больше 0)) или ((длина результат.готово) равен (длина ход.готово))
пример «На пустой стопке значение становится готовым»
дано ход равно вариант «Ход json» с стопка равным пустой список и готово равным пустой список и ждём равным "з" и изъян равным ""
дано значение равно вариант «Ничто json»
ожидается вариант «Ход json» с стопка равным пустой список и готово равным [вариант «Ничто json»] и ждём равным "!" и изъян равным ""
тотальная функция «Закрыть рамку json»
принимает ход: «Ход json», квадратной: признак
возвращает «Ход json»
обеспечивает «изъян липкий: сломанный ход рамок не закрывает» (ход.изъян равен "") или ((результат.изъян равен ход.изъян) и притом ((длина результат.стопка) равен (длина ход.стопка)))
обеспечивает «закрывающая скобка без открывающей — названный изъян» не (ход.изъян равен "" и притом ((длина ход.стопка) равен 0)) или (результат.изъян равен "закрывающая скобка без открывающей")
обеспечивает «закрытие снимает рамку со стопки, если скобки совпали» не (ход.изъян равен "" и притом ((длина ход.стопка) больше 0)) или (((длина результат.стопка) равен ((длина ход.стопка) минус 1)) или (не (результат.изъян равен "")))
пример «Пустой массив закрывается значением»
дано ход равно вариант «Ход json» с стопка равным [вариант «Рамка массива json» с собрано равным пустой список] и готово равным пустой список и ждём равным "з0" и изъян равным ""
дано квадратной равно да
ожидается вариант «Ход json» с стопка равным пустой список и готово равным [вариант «Массив json» с элементы равным пустой список] и ждём равным "!" и изъян равным ""
тотальная функция «Верх это массив json»
принимает стопка: список «Рамка json»
возвращает признак
обеспечивает «пустая рамка массива наверху — это массив» не ((длина стопка) больше 0 и притом ((элемент 1 в стопка) равен (вариант «Рамка массива json» с собрано равным пустой список))) или результат
обеспечивает «пустая рамка объекта наверху — не массив» не ((длина стопка) больше 0 и притом ((элемент 1 в стопка) равен (вариант «Рамка объекта json» с собраны равным пустой список и ключ равным ""))) или (не результат)
пример «Пустая стопка — не массив»
дано стопка равно пустой список
ожидается нет
тотальная функция «Записать ключ json»
принимает ход: «Ход json», имя: строка
возвращает «Ход json»
обеспечивает «ключ вне объекта — названный изъян» не (ход.изъян равен "" и притом ((длина ход.стопка) равен 0)) или (результат.изъян равен "ключ вне объекта")
обеспечивает «записанный ключ переводит ход в ожидание двоеточия» не (ход.изъян равен "" и притом ((длина ход.стопка) больше 0) и притом (не («Верх это массив json» от ход.стопка))) или (результат.ждём равен "д")
обеспечивает «записанный ключ стопки не меняет» не (ход.изъян равен "" и притом ((длина ход.стопка) больше 0) и притом (не («Верх это массив json» от ход.стопка))) или ((длина результат.стопка) равен (длина ход.стопка))
обеспечивает «записанный ключ изъяна не заводит» не (ход.изъян равен "" и притом ((длина ход.стопка) больше 0) и притом (не («Верх это массив json» от ход.стопка))) или (результат.изъян равен "")
пример «Ключ ложится в верхнюю рамку объекта»
дано ход равно вариант «Ход json» с стопка равным [вариант «Рамка объекта json» с собраны равным пустой список и ключ равным ""] и готово равным пустой список и ждём равным "к0" и изъян равным ""
дано имя равно "а"
ожидается вариант «Ход json» с стопка равным [вариант «Рамка объекта json» с собраны равным пустой список и ключ равным "а"] и готово равным пустой список и ждём равным "д" и изъян равным ""
тотальная функция «Шаг разбора json»
принимает ход: «Ход json», знак: «Знак json»
возвращает «Ход json»
обеспечивает «изъян липкий: сломанный разбор дальше не идёт» (ход.изъян равен "") или ((результат.изъян равен ход.изъян) и притом ((длина результат.стопка) равен (длина ход.стопка)) и притом (результат.ждём равен ход.ждём))
обеспечивает «после готового значения любой знак лишний» не (ход.изъян равен "" и притом (ход.ждём равен "!")) или (результат.изъян равен "после значения стоит лишний знак")
обеспечивает «открывающая квадратная скобка прибавляет к стопке одну рамку» не (ход.изъян равен "" и притом (ход.ждём равен "з" или ход.ждём равен "з0") и притом (знак равен (вариант «Скобка json» с скобка равным "["))) или ((длина результат.стопка) равен ((длина ход.стопка) плюс 1))
обеспечивает «открывающая квадратная скобка переводит ход в ожидание первого значения» не (ход.изъян равен "" и притом (ход.ждём равен "з" или ход.ждём равен "з0") и притом (знак равен (вариант «Скобка json» с скобка равным "["))) или (результат.ждём равен "з0")
обеспечивает «открывающая квадратная скобка изъяна не заводит» не (ход.изъян равен "" и притом (ход.ждём равен "з" или ход.ждём равен "з0") и притом (знак равен (вариант «Скобка json» с скобка равным "["))) или (результат.изъян равен "")
пример «Открывающая квадратная кладёт рамку массива»
дано ход равно вариант «Ход json» с стопка равным пустой список и готово равным пустой список и ждём равным "з" и изъян равным ""
дано знак равно вариант «Скобка json» с скобка равным "["
ожидается вариант «Ход json» с стопка равным [вариант «Рамка массива json» с собрано равным пустой список] и готово равным пустой список и ждём равным "з0" и изъян равным ""
тотальная функция «Разобрать json»
принимает текст: строка
возвращает «Итог json»
обеспечивает «пустой вход отвергается с названной причиной» не ((длина текст) равен 0) или (результат равен (вариант «Не разобран json» с причина равным "вход пуст: значения в нём нет"))
обеспечивает «незакрытая скобка отвергается с названной причиной» не (текст равен "[") или (результат равен (вариант «Не разобран json» с причина равным "скобки остались незакрытыми"))
обеспечивает «одна цифра разбирается ровно в своё число» не ((длина текст) равен 1 и притом («Цифра json» от текст)) или (результат равен (вариант «Разобран json» с значение равным (вариант «Число json» с величина равным («Значение цифры json» от текст))))
пример «Пустой массив»
дано текст равно "[]"
ожидается вариант «Разобран json» с значение равным (вариант «Массив json» с элементы равным пустой список)
тотальная функция «Шестнадцатеричная цифра json»
принимает значение: число
возвращает строка
обеспечивает «цифра — ровно один знак» (длина результат) равен 1
пример «Десять — это a»
дано значение равно 10
ожидается "a"
тотальная функция «Заслонить знак json»
принимает симв: строка
возвращает строка
обеспечивает «заслонение не укорачивает» ((длина результат) не меньше (длина симв))
обеспечивает «пустой знак заслоняется в пустой» если (симв равен "") то (результат равен "") иначе да
обеспечивает «заслонение пусто ровно на пустом» (((длина результат) равен 0) равен ((длина симв) равен 0))
пример «Кавычка заслоняется»
дано симв равно "\""
ожидается "\\\""
тотальная функция «Напечатать строку json»
принимает текст: строка
возвращает строка
обеспечивает «печать строки — кавычки плюс не меньше знаков, чем было» (длина результат) не меньше ((длина текст) плюс 2)
пример «Пустая строка»
дано текст равно ""
ожидается "\"\""
тотальная функция «Напечатать json»
принимает значение: «Значение json»
возвращает строка
обеспечивает «напечатанное значение непусто» (длина результат) больше 0
обеспечивает «ничто печатается словом null» если значение равен (вариант «Ничто json») то (результат равен "null") иначе да
обеспечивает «у ничто печать ровно в четыре знака» если значение равен (вариант «Ничто json») то ((длина результат) равен 4) иначе да
пример «Ничто»
дано значение равно вариант «Ничто json»
ожидается "null"
| Function | Termination | Claims |
|---|---|---|
| «Имя поля json» | доказано композицией | доказано 1 из 1 |
| «Содержимое поля json» | доказано композицией | доказано 1 из 1 |
| «Беда разметки json» | доказано композицией | доказано 1 из 1 |
| «Знаки разметки json» | доказано композицией | доказано 1 из 1 |
| «Сломать разметку json» | доказано композицией | доказано 5 из 6; «сломанная разметка не бывает без причины» — сетка |
| «Пробельный json» | доказано композицией | доказано 0 из 1; «пробельны ровно четыре знака, и ровно по одному» — сетка |
| «Цифра json» | доказано композицией | доказано 0 из 1; «цифра — ровно тот знак, у которого значение цифры лежит в 0..9» — сетка |
| «Значение цифры json» | доказано композицией | доказано 2 из 3; «значение цифры — код первого знака без сорока восьми, и пустая строка ведёт себя как ноль» — сетка |
| «Шестнадцатеричная json» | доказано композицией | доказано 0 из 1; «шестнадцатеричны ровно двадцать два знака набора» — сетка |
| «Буква слова json» | доказано композицией | доказано 0 из 1; «буквы слов — ровно те, из которых сложены true, false и null» — сетка |
| «Одиночный знак json» | доказано композицией | доказано 0 из 1; «одиночны ровно шесть знаков разметки» — сетка |
| «Начало счёта json» | доказано композицией | доказано 1 из 1 |
| «Шаг счёта json» | доказано композицией | доказано 7 из 9; «цифра в целой части множит на десять и прибавляет своё значение» — сетка; «цифра в целой части оставляет счёт на целом этапе» — сетка |
| «Десять в степени json» | доказано постоянным шагом | доказано 1 из 2; «степень десяти положительна» — сетка |
| «Число из текста json» | доказано композицией | доказано 0 из 2; «пустой текст числом не разбирается» — сетка; «одна цифра разбирается ровно в своё значение» — сетка |
| «Начало разметки json» | доказано композицией | доказано 1 из 1 |
| «Добавить знак json» | доказано композицией | доказано 2 из 2 |
| «Копить json» | доказано композицией | доказано 2 из 2 |
| «Закрыть лексему json» | доказано композицией | доказано 4 из 7; «закрытие лексемы сбрасывает лад» — сетка; «закрытие лексемы опустошает копилку» — сетка; «закрытие лексемы даёт ровно один знак или называет беду» — сетка |
| «Знак вне json» | доказано композицией | доказано 1 из 8; «пробел вне лексемы: лад не тронут» — сетка; «пробел вне лексемы: знаков не прибавилось» — сетка; «пробел вне лексемы: беды не заводит» — сетка; «пробел вне лексемы: копилка не тронута» — сетка; «одиночный знак прибавляет ровно один знак разметки» — сетка; «одиночный знак беды не заводит» — сетка; «одиночный знак оставляет лад пустым» — сетка |
| «Шаг разметки json» | доказано композицией | доказано 3 из 6; «шаг разметки знаков не теряет» — сетка; «шаг разметки прибавляет не больше двух знаков» — сетка; «кавычка вне лексемы опустошает копилку» — сетка |
| «Знаки json» | доказано композицией | доказано 4 из 7; «у целой разметки лад пуст» — сетка; «у целой разметки копилка пуста» — сетка; «неизвестный знак кончается бедой» — сетка |
| «Начало хода json» | доказано композицией | доказано 1 из 1 |
| «Сломать ход json» | доказано композицией | доказано 5 из 6; «поломка называет непустую причину» — сетка |
| «Шаг поиска имени json» | доказано композицией | доказано 2 из 2 |
| «Вписать поле json» | доказано композицией | доказано 2 из 4; «в пустом наборе у вписанного поля своё имя» — сетка; «вписывание полей не теряет» — сетка |
| «Вложить значение json» | доказано композицией | доказано 2 из 7; «на пустой стопке готовых становится на одно больше» — сетка; «на пустой стопке стопка остаётся пустой» — сетка; «при непустой стопке ход ждёт разделитель» — сетка; «при непустой стопке высота стопки не меняется» — сетка; «при непустой стопке готовых не прибавляется» — сетка |
| «Закрыть рамку json» | доказано композицией | доказано 2 из 3; «закрытие снимает рамку со стопки, если скобки совпали» — сетка |
| «Верх это массив json» | доказано композицией | доказано 0 из 2; «пустая рамка массива наверху — это массив» — сетка; «пустая рамка объекта наверху — не массив» — сетка |
| «Записать ключ json» | доказано композицией | доказано 1 из 4; «записанный ключ переводит ход в ожидание двоеточия» — сетка; «записанный ключ стопки не меняет» — сетка; «записанный ключ изъяна не заводит» — сетка |
| «Шаг разбора json» | доказано композицией | доказано 4 из 5; «открывающая квадратная скобка прибавляет к стопке одну рамку» — сетка |
| «Разобрать json» | доказано композицией | доказано 0 из 3; «пустой вход отвергается с названной причиной» — сетка; «незакрытая скобка отвергается с названной причиной» — сетка; «одна цифра разбирается ровно в своё число» — сетка |
| «Шестнадцатеричная цифра json» | доказано композицией | доказано 1 из 1 |
| «Заслонить знак json» | доказано композицией | доказано 1 из 3; «заслонение не укорачивает» — сетка; «заслонение пусто ровно на пустом» — сетка |
| «Напечатать строку json» | доказано композицией | доказано 0 из 1; «печать строки — кавычки плюс не меньше знаков, чем было» — сетка |
| «Напечатать json» | доказано структурой | доказано 2 из 3; «напечатанное значение непусто» — сетка |
«Key derivation»
flang/stdlib/kdf.flang — functions 7; ведомость не снялась: код 1 — FLANG_PROOF_STEP, строка 140, столбец 3: шаг 1, теорема «один виток даёт ровно тридцать два байта»: не выведено заключение из постусловия «подпись — ровно тридцать два байта» функции «Подпись байтами», инстанцированного на 1 вызове: у цели этого случая нет вида, к которому у ядра есть правило: правил десять — «не меньше 0», «не больше конечного литерала», «не больше терма», «не меньше терма», «меньше терма», «больше терма», «равно», «содержит», «не убывает» и «начинается с», и все десять названы в отказе, чтобы список был виден целиком. «Не меньше терма» и «не меньше конечного литерала» ядро считает тем же правилом, что «не больше»: цель переворачивается сторонами, и это не второе правило, а одна и та же мысль, записанная с другой стороны. Вида цели не спрашивает только одиннадцатое, «цель есть допущение», и оно тоже не прошло: ни одно допущение не совпало с целью знак в знак. разбор цели по условию не прошёл: половина «условие ложно» не сведена: тождество после переписки допущением не проходит: после переписки допущениями стороны равенства остались разными термами. Ядро сличает синтаксически и равенства вычислений не решает. Сличение при этом читает плюс и умножить С ТОЧНОСТЬЮ ДО ПОРЯДКА СОСЕДЕЙ (перестановка двух операндов ОДНОГО узла — теорема IEEE-754; переставлять через скобки нельзя, ассоциативность в IEEE-754 ложна, и ядро этого не делает). Не прошла и свёртка, растущая РОВНО на один: у неё начало обязано совпасть с основанием правой стороны, шаг — прибавлять к мере накопителя ровно единицу, а список свёртки — быть тем же самым, чья длина стоит справа. Не прошёл и СЧЁТ ПОСТОЯННЫХ ПРИ ОДНОЙ МЕРЕ: он складывает целые неотрицательные литералы дерева плюс в одно число и берётся лишь тогда, когда неизвестный терм в этом дереве РОВНО ОДИН и он есть длина от одного довода; двух мер он не переставляет — это была бы ассоциативность, ложная в IEEE-754, — а произвольного числа вместо длины не берёт вовсе: при х порядка 10^16 (х плюс 1) плюс 1 и х плюс 2 РАЗНЫЕ числа. разбор цели по условию не прошёл: половина «условие истинно» не сведена: тождество после переписки допущением не проходит: после переписки допущениями стороны равенства остались разными термами. Ядро сличает синтаксически и равенства вычислений не решает. Сличение при этом читает плюс и умножить С ТОЧНОСТЬЮ ДО ПОРЯДКА СОСЕДЕЙ (перестановка двух операндов ОДНОГО узла — теорема IEEE-754; переставлять через скобки нельзя, ассоциативность в IEEE-754 ложна, и ядро этого не делает). Не прошла и свёртка, растущая РОВНО на один: у неё начало обязано совпасть с основанием правой стороны, шаг — прибавлять к мере накопителя ровно единицу, а список свёртки — быть тем же самым, чья длина стоит справа. Не прошёл и СЧЁТ ПОСТОЯННЫХ ПРИ ОДНОЙ МЕРЕ: он складывает целые неотрицательные литералы дерева плюс в одно число и берётся лишь тогда, когда неизвестный терм в этом дереве РОВНО ОДИН и он есть длина от одного довода; двух мер он не переставляет — это была бы ассоциативность, ложная в IEEE-754, — а произвольного числа вместо длины не берёт вовсе: при х порядка 10^16 (х плюс 1) плюс 1 и х плюс 2 РАЗНЫЕ числа. цель-выбор с истинной ветвью не прошёл: левая половина дизъюнкции сама не выведена: у цели этого случая нет вида, к которому у ядра есть правило: правил десять — «не меньше 0», «не больше конечного литерала», «не больше терма», «не меньше терма», «меньше терма», «больше терма», «равно», «содержит», «не убывает» и «начинается с», и все десять названы в отказе, чтобы список был виден целиком. «Не меньше терма» и «не меньше конечного литерала» ядро считает тем же правилом, что «не больше»: цель переворачивается сторонами, и это не второе правило, а одна и та же мысль, записанная с другой стороны. Вида цели не спрашивает только одиннадцатое, «цель есть допущение», и оно тоже не прошло: ни одно допущение не совпало с целью знак в знак. разбор цели по условию не прошёл: половина «условие истинно» не сведена: она стала литералом «нет», то есть ЛОЖНА — доказывать нечего, надо чинить. разбор случаев по внутреннему условию цели не прошёл: разбор цели по условию не прошёл: половина «условие истинно» не сведена: тождество после переписки допущением не проходит: после переписки допущениями стороны равенства остались разными термами. Ядро сличает синтаксически и равенства вычислений не решает. Сличение при этом читает плюс и умножить С ТОЧНОСТЬЮ ДО ПОРЯДКА СОСЕДЕЙ (перестановка двух операндов ОДНОГО узла — теорема IEEE-754; переставлять через скобки нельзя, ассоциативность в IEEE-754 ложна, и ядро этого не делает). Не прошла и свёртка, растущая РОВНО на один: у неё начало обязано совпасть с основанием правой стороны, шаг — прибавлять к мере накопителя ровно единицу, а список свёртки — быть тем же самым, чья длина стоит справа. Не прошёл и СЧЁТ ПОСТОЯННЫХ ПРИ ОДНОЙ МЕРЕ: он складывает целые неотрицательные литералы дерева плюс в одно число и берётся лишь тогда, когда неизвестный терм в этом дереве РОВНО ОДИН и он есть длина от одного довода; двух мер он не переставляет — это была бы ассоциативность, ложная в IEEE-754, — а произвольного числа вместо длины не берёт вовсе: при х порядка 10^16 (х плюс 1) плюс 1 и х плюс 2 РАЗНЫЕ числа. к этому месту не известно ничего, кроме гипотез «дано»
тип «Ход вывода»
вариант «Ход вывода» содержит текущий: список числа, накоплено: список числа
тотальная функция «Дописать номер»
принимает меньшие: список числа, байтов: число
возвращает список числа
обеспечивает «на границе куска список растёт ровно на один номер, внутри куска не меняется» если ((байтов остаток от 32) равен 1) то ((длина результат) равен (1 плюс (длина меньшие))) иначе (результат равен меньшие)
пример «Граница куска — номер дописывается»
дано меньшие равно [1]
дано байтов равно 33
ожидается [1, 2]
тотальная функция «Номера кусков»
принимает байтов: неотрицательное
возвращает список числа
обеспечивает «кусков хватает на заказанную длину» ((длина результат) умножить на 32) не меньше байтов
обеспечивает «на нулевой заказ кусков нет вовсе» если байтов не больше 0 то (результат равен пустой список) иначе да
пример «Ничего не заказано — ни куска»
дано байтов равно 0
ожидается пустой список
тотальная функция «Шаг витка»
принимает пароль: список числа, ход: «Ход вывода»
возвращает «Ход вывода»
обеспечивает «шаг витка кладёт в текущее подпись прежнего текущего» (результат.текущий) равен («Подпись байтами» от пароль и (ход.текущий))
обеспечивает «шаг витка сливает накопленное с новой подписью» (результат.накоплено) равен («Исключающее или списков» от (ход.накоплено) и («Подпись байтами» от пароль и (ход.текущий)))
пример «Второй виток PBKDF2-HMAC-SHA256 пароля passwd… по RFC 7914: U(2) и U(1) xor U(2)»
дано пароль равно [112, 97, 115, 115, 119, 111, 114, 100]
дано ход равно вариант «Ход вывода» с текущий равным [18, 15, 182, 207, 252, 248, 179, 44, 67, 231, 34, 82, 86, 196,
248, 55, 168, 101, 72, 201, 44, 204, 53, 72, 8, 5, 152, 124, 183, 11, 225, 123] и накоплено равным [18, 15, 182,
207, 252, 248, 179, 44, 67, 231, 34, 82, 86, 196, 248, 55, 168, 101, 72, 201, 44, 204, 53, 72, 8, 5, 152, 124,
183, 11, 225, 123]
ожидается вариант «Ход вывода» с текущий равным [188, 66, 186, 90, 83, 147, 245, 255, 110, 237, 253, 171, 126, 52,
149, 231, 130, 85, 119, 71, 223, 14, 100, 151, 222, 231, 64, 38, 34, 76, 173, 56] и накоплено равным [174, 77, 12,
149, 175, 107, 70, 211, 45, 10, 223, 249, 40, 240, 109, 208, 42, 48, 63, 142, 243, 194, 81, 223, 214, 226, 216,
90, 149, 71, 76, 67]
тотальная функция «Витки вывода»
принимает пароль: список числа, ход: «Ход вывода», осталось: число
возвращает «Ход вывода»
обеспечивает «нечего повторять — ход возвращается как есть» если (осталось не больше 0) то (результат равен ход) иначе да
пример «Повторять нечего — ход возвращается тем же»
дано пароль равно [112, 97, 115, 115, 119, 111, 114, 100]
дано ход равно вариант «Ход вывода» с текущий равным [18, 15, 182, 207, 252, 248, 179, 44, 67, 231, 34, 82, 86, 196,
248, 55, 168, 101, 72, 201, 44, 204, 53, 72, 8, 5, 152, 124, 183, 11, 225, 123] и накоплено равным [18, 15, 182,
207, 252, 248, 179, 44, 67, 231, 34, 82, 86, 196, 248, 55, 168, 101, 72, 201, 44, 204, 53, 72, 8, 5, 152, 124,
183, 11, 225, 123]
дано осталось равно 0
ожидается вариант «Ход вывода» с текущий равным [18, 15, 182, 207, 252, 248, 179, 44, 67, 231, 34, 82, 86, 196, 248,
55, 168, 101, 72, 201, 44, 204, 53, 72, 8, 5, 152, 124, 183, 11, 225, 123] и накоплено равным [18, 15, 182, 207,
252, 248, 179, 44, 67, 231, 34, 82, 86, 196, 248, 55, 168, 101, 72, 201, 44, 204, 53, 72, 8, 5, 152, 124, 183, 11,
225, 123]
тотальная функция «Итог витков»
принимает ход: «Ход вывода»
возвращает список числа
обеспечивает «итог витков — это накопленное хода» результат равен (ход.накоплено)
пример «Итог двух витков — накопленное, а не последняя подпись»
дано ход равно вариант «Ход вывода» с текущий равным [188, 66, 186, 90, 83, 147, 245, 255, 110, 237, 253, 171, 126,
52, 149, 231, 130, 85, 119, 71, 223, 14, 100, 151, 222, 231, 64, 38, 34, 76, 173, 56] и накоплено равным [174, 77,
12, 149, 175, 107, 70, 211, 45, 10, 223, 249, 40, 240, 109, 208, 42, 48, 63, 142, 243, 194, 81, 223, 214, 226,
216, 90, 149, 71, 76, 67]
ожидается [174, 77, 12, 149, 175, 107, 70, 211, 45, 10, 223, 249, 40, 240, 109, 208, 42, 48, 63, 142, 243, 194, 81,
223, 214, 226, 216, 90, 149, 71, 76, 67]
тотальная функция «Кусок вывода»
принимает пароль: список числа, соль: список числа, повторов: число, номер: число
возвращает список числа
обеспечивает «кусок — ровно тридцать два байта» (длина результат) равен 32
обеспечивает «один виток — это ровно одна подпись соли с номером» (если повторов не больше 1 то результат равен («Подпись байтами» от пароль и («Досыпать байты» от соль и («Байты слова» от номер))) иначе да)
обеспечивает «один виток даёт ровно тридцать два байта» (не (повторов не больше 1)) или ((длина результат) равен 32)
пример «первый кусок вектора RFC 7914: без примера утверждение о длине считает рантайм»
дано пароль равно [112, 97, 115, 115, 119, 100]
дано соль равно [115, 97, 108, 116]
дано повторов равно 1
дано номер равно 1
ожидается [85, 172, 4, 110, 86, 227, 8, 159, 236, 22, 145, 194, 37, 68, 182, 5, 249, 65, 133, 33, 109, 222, 4, 101,
230, 139, 157, 87, 194, 13, 172, 188]
тотальная функция «Вывод ключа»
принимает пароль: список числа, соль: список числа, повторов: число, байтов: неотрицательное
возвращает список числа
обеспечивает «ключ ровно заказанной длины» (длина результат) равен байтов
пример «RFC 7914, раздел 11: пароль passwd, соль salt, один виток, 64 байта»
дано пароль равно [112, 97, 115, 115, 119, 100]
дано соль равно [115, 97, 108, 116]
дано повторов равно 1
дано байтов равно 64
ожидается [85, 172, 4, 110, 86, 227, 8, 159, 236, 22, 145, 194, 37, 68, 182, 5, 249, 65, 133, 33, 109, 222, 4, 101,
230, 139, 157, 87, 194, 13, 172, 188, 73, 202, 156, 204, 241, 121, 182, 69, 153, 22, 100, 179, 157, 119, 239, 49,
124, 113, 184, 69, 177, 227, 11, 213, 9, 17, 32, 65, 211, 161, 151, 131]
| Function | Termination | Claims |
|---|---|---|
| «Дописать номер» | — | — |
| «Номера кусков» | — | — |
| «Шаг витка» | — | — |
| «Витки вывода» | — | — |
| «Итог витков» | — | — |
| «Кусок вывода» | — | — |
| «Вывод ключа» | — | — |
«Lists»
flang/stdlib/lists.flang — functions 38; the kernel ledger was taken from this version of the file
тотальная функция «Длина» от «А»
принимает элементы: список «А»
возвращает число
обеспечивает «счёт звеньев сходится со встроенной длиной» результат равен (длина элементы)
пример «Пустой список»
дано элементы равно пустой список
ожидается 0
тотальная функция «Приписать в начало» от «А»
принимает первый: «А», элементы: список «А»
возвращает список «А»
обеспечивает «приписывание удлиняет список ровно на один» (длина результат) равен ((длина элементы) плюс 1)
обеспечивает «приписанное встало первым» (элемент 1 в результат) равен первый
обеспечивает «приписанное стоит в результате» результат содержит первый
пример «В пустой»
дано первый равно 1
дано элементы равно пустой список
ожидается [1]
тотальная функция «Соединить списки» от «А»
принимает первый: список «А», второй: список «А»
возвращает список «А»
обеспечивает «длина соединения есть сумма длин» (длина результат) равен ((длина первый) плюс (длина второй))
пример «Два непустых»
дано первый равно [1, 2]
дано второй равно [3]
ожидается [1, 2, 3]
тотальная функция «Обратить» от «А»
принимает элементы: список «А»
возвращает список «А»
обеспечивает «обращение не теряет и не добавляет элементов» (длина результат) равен (длина элементы)
пример «Три элемента»
дано элементы равно [1, 2, 3]
ожидается [3, 2, 1]
тотальная функция «Отбросить первые» от «А»
принимает элементы: список «А», сколько: число
возвращает список «А»
обеспечивает «при неположительном сколько не отброшено ничего» если сколько не больше 0 то (длина результат) равен (длина элементы) иначе да
обеспечивает «при положительном сколько из непустого отброшено хотя бы одно» если ((длина элементы) больше 0) и притом (сколько больше 0) то (длина результат) не больше ((длина элементы) минус 1) иначе да
пример «Отбросить два»
дано элементы равно [1, 2, 3, 4]
дано сколько равно 2
ожидается [3, 4]
тотальная функция «Взять первые» от «А»
принимает элементы: список «А», сколько: число
возвращает список «А»
обеспечивает «целое N внутри длины даёт ровно N» если ((сколько остаток от 1) равен 0) и притом ((сколько не меньше 0) и притом (сколько не больше (длина элементы))) то (длина результат) равен сколько иначе да
обеспечивает «при неположительном сколько не взято ничего» если сколько не больше 0 то результат равен пустой список иначе да
пример «Взять два»
дано элементы равно [1, 2, 3, 4]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Срез» от «А»
принимает элементы: список «А», начало: число, конец: число
возвращает список «А»
обеспечивает «срез от первого до последнего есть весь список» если (начало равен 1) и притом (конец равен (длина элементы)) то (длина результат) равен (длина элементы) иначе да
пример «Середина»
дано элементы равно [1, 2, 3, 4, 5]
дано начало равно 2
дано конец равно 4
ожидается [2, 3, 4]
тотальная функция «Числа до»
принимает предел: число
возвращает список числа
обеспечивает «предел стоит в промежутке» если предел не больше 0 то да иначе результат содержит предел
обеспечивает «до нуля промежуток пуст» (не (предел не больше 0)) или ((длина результат) равен 0)
обеспечивает «предел стоит последним» (предел не больше 0) или ((элемент (длина результат) в результат) равен предел)
обеспечивает «до нуля промежуток есть пустой список» если предел не больше 0 то (результат равен пустой список) иначе да
обеспечивает «от положительного предела промежуток есть предыдущий с дописанным пределом» если не (предел не больше 0) то (результат равен (добавить предел к («Числа до» от (предел минус 1)))) иначе да
обеспечивает «промежуток пуст или есть предыдущий с дописанным пределом» (результат равен пустой список) или (результат равен (добавить предел к («Числа до» от (предел минус 1))))
пример «От одного до пяти»
дано предел равно 5
ожидается [1, 2, 3, 4, 5]
тотальная функция «Числа от и до»
принимает начало: число, конец: число
возвращает список числа
обеспечивает «промежуток, начатый не выше единицы, доходит до конца» если (конец больше 0) и притом (начало не больше 1) то результат содержит конец иначе да
пример «От двух до пяти»
дано начало равно 2
дано конец равно 5
ожидается [2, 3, 4, 5]
тотальная функция «Элемент»
принимает элементы: список числа, индекс: число
возвращает число
обеспечивает «на целом номере внутри списка обход сходится со встроенной формой» если ((индекс остаток от 1) равен 0) и притом ((индекс не меньше 1) и притом (индекс не больше (длина элементы))) то результат равен (элемент индекс в элементы) иначе да
пример «Второй элемент»
дано элементы равно [10, 20, 30]
дано индекс равно 2
ожидается 20
тотальная функция «Индекс»
принимает элементы: список числа, значение: число
возвращает число
обеспечивает «найденное место держит искомое, а ноль значит: не найдено» если (длина элементы) равен 0 то результат равен 0 иначе (если (элемент 1 в элементы) равен значение то результат равен 1 иначе (если результат равен 0 то да иначе (элемент результат в элементы) равен значение))
пример «Найден третьим»
дано элементы равно [5, 6, 7]
дано значение равно 7
ожидается 3
тотальная функция «Содержит число»
принимает элементы: список числа, значение: число
возвращает признак
обеспечивает «встроенная форма и обход по индексу согласны» результат равен (1 не больше («Индекс» от элементы и значение))
пример «Есть»
дано элементы равно [1, 2, 3]
дано значение равно 2
ожидается да
тотальная функция «Списки равны»
принимает первый: список числа, второй: список числа
возвращает признак
обеспечивает «пустому равен только пустой» если (длина второй) равен 0 то результат равен ((длина первый) равен 0) иначе да
обеспечивает «равные списки одной длины» если результат то (длина первый) равен (длина второй) иначе да
пример «Совпадают»
дано первый равно [1, 2, 3]
дано второй равно [1, 2, 3]
ожидается да
тотальная функция «Поиск в диапазоне»
принимает элементы: список числа, цель: число, низ: число, верх: число, витков: неотрицательное
возвращает число
обеспечивает «отрезок из одного места отдаёт это место, когда оно держит цель» если (низ равен верх) и притом (((низ остаток от 1) равен 0) и притом ((низ не меньше 1) и притом ((низ не больше (длина элементы)) и притом ((витков не меньше 1) и притом ((элемент низ в элементы) равен цель))))) то результат равен низ иначе да
обеспечивает «без витков ответа нет» если витков не больше 0 то результат равен 0 иначе да
обеспечивает «на пустом отрезке ответа нет» если низ больше верх то результат равен 0 иначе да
пример «Нашли посередине»
дано элементы равно [1, 2, 3]
дано цель равно 2
дано низ равно 1
дано верх равно 3
дано витков равно 3
ожидается 2
тотальная функция «Двоичный поиск»
принимает элементы: список числа, цель: число
возвращает число
обеспечивает «ненулевое место держит цель» если результат равен 0 то да иначе (элемент результат в элементы) равен цель
обеспечивает «в пустом списке цель не находится» если (длина элементы) не больше 0 то результат равен 0 иначе да
обеспечивает «на списке из одного элемента цель находится» если ((длина элементы) равен 1) и притом (элементы содержит цель) то результат равен 1 иначе да
пример «Цель в середине»
дано элементы равно [-1, 0, 3, 5, 9, 12]
дано цель равно 9
ожидается 5
тотальная функция «Шаг все не меньше»
принимает ход: признак, эл: число, порог: число
возвращает признак
обеспечивает «однажды сорванное не восстанавливается» если ход равен нет то результат равен нет иначе да
обеспечивает «шаг отвечает нет или по свежему элементу» (результат равен нет) или (результат равен (эл не меньше порог))
обеспечивает «несорванный ход отвечает по свежему элементу» если не (ход равен нет) то (результат равен (эл не меньше порог)) иначе да
пример «Сорванное держится»
дано ход равно нет
дано эл равно 9
дано порог равно 5
ожидается нет
тотальная функция «Все не меньше»
принимает элементы: список числа, порог: число
возвращает признак
обеспечивает «пустому списку годится любой порог» если (длина элементы) равен 0 то результат равен да иначе да
обеспечивает «когда годятся все, годится и наименьшее» если результат и притом ((длина элементы) больше 0) то порог не больше («Минимум» от элементы) иначе да
пример «Все больше порога»
дано элементы равно [5, 6, 7]
дано порог равно 5
ожидается да
тотальная функция «Шаг любой не меньше»
принимает ход: признак, эл: число, порог: число
возвращает признак
обеспечивает «однажды найденное не теряется» если ход равен да то результат равен да иначе да
обеспечивает «шаг отвечает да или по свежему элементу» (результат равен да) или (результат равен (эл не меньше порог))
обеспечивает «ненайденный ход отвечает по свежему элементу» если не (ход равен да) то (результат равен (эл не меньше порог)) иначе да
пример «Найденное держится»
дано ход равно да
дано эл равно 1
дано порог равно 5
ожидается да
тотальная функция «Любой не меньше»
принимает элементы: список числа, порог: число
возвращает признак
обеспечивает «пустому списку не годится ни один порог» если (длина элементы) равен 0 то результат равен нет иначе да
обеспечивает «когда годится наибольшее, годится хоть один» если ((длина элементы) больше 0) и притом (порог не больше («Максимум» от элементы)) то результат равен да иначе да
пример «Есть подходящий»
дано элементы равно [1, 9]
дано порог равно 5
ожидается да
тотальная функция «Шаг минимума»
принимает ход: число, эл: число
возвращает число
обеспечивает «меньший элемент вытесняет накопленное» если эл меньше ход то результат равен эл иначе результат равен ход
обеспечивает «наименьшее шага — либо свежий элемент, либо накопленное» (результат равен эл) или (результат равен ход)
пример «Меньший вытесняет»
дано ход равно 3
дано эл равно 1
ожидается 1
тотальная функция «Минимум»
принимает элементы: список числа
возвращает число
обеспечивает «наименьшее взято из самого списка, а на пустом это ноль» если (длина элементы) больше 0 то элементы содержит результат иначе результат равен 0
пример «Минимум трёх»
дано элементы равно [3, 1, 2]
ожидается 1
тотальная функция «Шаг максимума»
принимает ход: число, эл: число
возвращает число
обеспечивает «больший элемент вытесняет накопленное» если эл больше ход то результат равен эл иначе результат равен ход
обеспечивает «наибольшее шага — либо свежий элемент, либо накопленное» (результат равен эл) или (результат равен ход)
пример «Больший вытесняет»
дано ход равно 1
дано эл равно 3
ожидается 3
тотальная функция «Максимум»
принимает элементы: список числа
возвращает число
обеспечивает «наибольшее взято из самого списка, а на пустом это ноль» если (длина элементы) больше 0 то элементы содержит результат иначе результат равен 0
пример «Максимум трёх»
дано элементы равно [3, 1, 2]
ожидается 3
тотальная функция «Шаг суммы»
принимает ход: число, эл: число
возвращает число
обеспечивает «шаг суммы прибавляет свежий элемент» результат равен (ход плюс эл)
пример «Прибавление»
дано ход равно 3
дано эл равно 4
ожидается 7
тотальная функция «Сумма»
принимает элементы: список числа
возвращает число
обеспечивает «сумма неотрицательных не меньше наибольшего из них» если «Все не меньше» от элементы и 0 то результат не меньше («Максимум» от элементы) иначе да
пример «Сумма трёх»
дано элементы равно [1, 2, 3]
ожидается 6
тотальная функция «Шаг произведения»
принимает ход: число, эл: число
возвращает число
обеспечивает «шаг произведения умножает на свежий элемент» результат равен (ход умножить на эл)
пример «Умножение»
дано ход равно 3
дано эл равно 4
ожидается 12
тотальная функция «Произведение»
принимает элементы: список числа
возвращает число
обеспечивает «произведение чисел не меньше единицы не меньше наибольшего из них» если «Все не меньше» от элементы и 1 то результат не меньше («Максимум» от элементы) иначе да
пример «Произведение трёх»
дано элементы равно [2, 3, 4]
ожидается 24
тотальная функция «Вставить по порядку»
принимает значение: число, элементы: список числа
возвращает список числа
обеспечивает «вставка удлиняет список ровно на один» (длина результат) равен ((длина элементы) плюс 1)
обеспечивает «во главе результата встало меньшее из вставляемого и прежней головы» если (длина элементы) равен 0 то (длина результат) равен 1 иначе (если значение не больше (элемент 1 в элементы) то (элемент 1 в результат) равен значение иначе (элемент 1 в результат) равен (элемент 1 в элементы))
пример «В середину»
дано значение равно 2
дано элементы равно [1, 3]
ожидается [1, 2, 3]
тотальная функция «Вставками по порядку»
принимает элементы: список числа
возвращает список числа
обеспечивает «вставками не теряется и не добавляется ни одного элемента» (длина результат) равен (длина элементы)
пример «Обратный порядок»
дано элементы равно [3, 1, 2]
ожидается [1, 2, 3]
тотальная функция «Сортировать»
принимает элементы: список числа
возвращает список числа
обеспечивает «сортировка не теряет и не добавляет элементов» (длина результат) равен (длина элементы)
обеспечивает «наименьшее переживает сортировку» если (длина элементы) больше 0 то результат содержит («Минимум» от элементы) иначе да
пример «Обратный порядок»
дано элементы равно [3, 1, 2]
ожидается [1, 2, 3]
тотальная функция «Шаг уникальных»
принимает ход: список числа, эл: число
возвращает список числа
обеспечивает «уже виденное ничего не меняет» если ход содержит эл то результат равен ход иначе да
обеспечивает «отсев растит ход не больше чем на один» (длина результат) не больше (1 плюс (длина ход))
обеспечивает «невиданное удлиняет ровно на один» если не (ход содержит эл) то (длина результат) равен ((длина ход) плюс 1) иначе да
обеспечивает «невиданное дописывается в хвост хода» если не (ход содержит эл) то (результат равен (добавить эл к ход)) иначе да
пример «Виденное не повторяется»
дано ход равно [1, 2]
дано эл равно 1
ожидается [1, 2]
тотальная функция «Уникальные»
принимает элементы: список числа
возвращает список числа
обеспечивает «первый элемент переживает отсев и остаётся первым, а пустой список остаётся пустым» если (длина элементы) больше 0 то (элемент 1 в результат) равен (элемент 1 в элементы) иначе (длина результат) равен 0
пример «С повторами»
дано элементы равно [1, 2, 1, 3, 2]
ожидается [1, 2, 3]
тотальная функция «Шаг счёта вхождений»
принимает ход: число, эл: число, значение: число
возвращает число
обеспечивает «совпавший элемент прибавляет ровно один» если эл равен значение то результат равен (ход плюс 1) иначе результат равен ход
обеспечивает «счёт либо стоит, либо растёт ровно на один» (результат равен ход) или (результат равен (ход плюс 1))
пример «Совпало — прибавили»
дано ход равно 1
дано эл равно 5
дано значение равно 5
ожидается 2
тотальная функция «Считать вхождения»
принимает элементы: список числа, значение: число
возвращает число
обеспечивает «счёт не ноль ровно тогда, когда значение в списке» если элементы содержит значение то 1 не больше результат иначе результат равен 0
пример «Два вхождения»
дано элементы равно [1, 2, 1]
дано значение равно 1
ожидается 2
тотальная функция «Без значения»
принимает элементы: список числа, значение: число
возвращает список числа
обеспечивает «удалено ровно столько, сколько было вхождений» (длина результат) равен ((длина элементы) минус («Считать вхождения» от элементы и значение))
пример «Убрать двойки»
дано элементы равно [1, 2, 3, 2]
дано значение равно 2
ожидается [1, 3]
объект «Пара чисел»
первое является числом
второе является числом
тотальная функция «Шаг сжатия пар»
принимает ход: список «Пара чисел», эл: «Пара чисел»
возвращает список «Пара чисел»
обеспечивает «шаг сжатия удлиняет ровно на одну пару» (длина результат) равен ((длина ход) плюс 1)
пример «Пара дописывается в конец»
дано ход равно [запись «Пара чисел» с первое равным 1 и второе равным 4]
дано эл равно запись «Пара чисел» с первое равным 2 и второе равным 5
ожидается [запись «Пара чисел» с первое равным 1 и второе равным 4,
запись «Пара чисел» с первое равным 2 и второе равным 5]
тотальная функция «Сжать в пары»
принимает первые: список числа, вторые: список числа
возвращает список «Пара чисел»
обеспечивает «пар ровно столько, сколько в коротком из списков» если (длина первые) не больше (длина вторые) то (длина результат) равен (длина первые) иначе (длина результат) равен (длина вторые)
пример «Одна пара»
дано первые равно [1]
дано вторые равно [4]
ожидается [запись «Пара чисел» с первое равным 1 и второе равным 4]
тотальная функция «Сжать суммами»
принимает первые: список числа, вторые: список числа
возвращает список числа
обеспечивает «сумм ровно столько, сколько в коротком из списков» если (длина первые) не больше (длина вторые) то (длина результат) равен (длина первые) иначе (длина результат) равен (длина вторые)
пример «Сложение по позициям»
дано первые равно [1, 2, 3]
дано вторые равно [10, 20, 30]
ожидается [11, 22, 33]
| Function | Termination | Claims |
|---|---|---|
| «Длина» | доказано композицией | доказано 1 из 1 |
| «Приписать в начало» | доказано композицией | доказано 3 из 3 |
| «Соединить списки» | доказано композицией | доказано 1 из 1 |
| «Обратить» | доказано композицией | доказано 1 из 1 |
| «Отбросить первые» | доказано структурой | доказано 1 из 2; «при положительном сколько из непустого отброшено хотя бы одно» — сетка |
| «Взять первые» | доказано структурой | доказано 1 из 2; «целое N внутри длины даёт ровно N» — сетка |
| «Срез» | доказано композицией | доказано 0 из 1; «срез от первого до последнего есть весь список» — сетка |
| «Числа до» | доказано постоянным шагом | доказано 6 из 6 |
| «Числа от и до» | доказано композицией | доказано 0 из 1; «промежуток, начатый не выше единицы, доходит до конца» — сетка |
| «Элемент» | доказано структурой | доказано 0 из 1; «на целом номере внутри списка обход сходится со встроенной формой» — сетка |
| «Индекс» | доказано структурой | доказано 0 из 1; «найденное место держит искомое, а ноль значит: не найдено» — сетка |
| «Содержит число» | доказано композицией | доказано 0 из 1; «встроенная форма и обход по индексу согласны» — сетка |
| «Списки равны» | доказано композицией | доказано 1 из 2; «пустому равен только пустой» — сетка |
| «Поиск в диапазоне» | доказано точным шагом | доказано 2 из 3; «отрезок из одного места отдаёт это место, когда оно держит цель» — сетка |
| «Двоичный поиск» | доказано композицией | доказано 1 из 3; «ненулевое место держит цель» — сетка; «на списке из одного элемента цель находится» — сетка |
| «Шаг все не меньше» | доказано композицией | доказано 3 из 3 |
| «Все не меньше» | доказано композицией | доказано 1 из 2; «когда годятся все, годится и наименьшее» — сетка |
| «Шаг любой не меньше» | доказано композицией | доказано 3 из 3 |
| «Любой не меньше» | доказано композицией | доказано 1 из 2; «когда годится наибольшее, годится хоть один» — сетка |
| «Шаг минимума» | доказано композицией | доказано 2 из 2 |
| «Минимум» | доказано композицией | доказано 0 из 1; «наименьшее взято из самого списка, а на пустом это ноль» — сетка |
| «Шаг максимума» | доказано композицией | доказано 2 из 2 |
| «Максимум» | доказано композицией | доказано 0 из 1; «наибольшее взято из самого списка, а на пустом это ноль» — сетка |
| «Шаг суммы» | доказано композицией | доказано 1 из 1 |
| «Сумма» | доказано композицией | доказано 0 из 1; «сумма неотрицательных не меньше наибольшего из них» — сетка |
| «Шаг произведения» | доказано композицией | доказано 1 из 1 |
| «Произведение» | доказано композицией | доказано 0 из 1; «произведение чисел не меньше единицы не меньше наибольшего из них» — сетка |
| «Вставить по порядку» | доказано структурой | доказано 1 из 2; «во главе результата встало меньшее из вставляемого и прежней головы» — сетка |
| «Вставками по порядку» | доказано структурой | доказано 1 из 1 |
| «Сортировать» | доказано композицией | доказано 1 из 2; «наименьшее переживает сортировку» — сетка |
| «Шаг уникальных» | доказано композицией | доказано 4 из 4 |
| «Уникальные» | доказано композицией | доказано 0 из 1; «первый элемент переживает отсев и остаётся первым, а пустой список остаётся пустым» — сетка |
| «Шаг счёта вхождений» | доказано композицией | доказано 2 из 2 |
| «Считать вхождения» | доказано композицией | доказано 0 из 1; «счёт не ноль ровно тогда, когда значение в списке» — сетка |
| «Без значения» | доказано композицией | доказано 0 из 1; «удалено ровно столько, сколько было вхождений» — сетка |
| «Шаг сжатия пар» | доказано композицией | доказано 1 из 1 |
| «Сжать в пары» | доказано структурой | доказано 0 из 1; «пар ровно столько, сколько в коротком из списков» — сетка |
| «Сжать суммами» | доказано структурой | доказано 0 из 1; «сумм ровно столько, сколько в коротком из списков» — сетка |
«Logic»
flang/stdlib/logic.flang — functions 7; the kernel ledger was taken from this version of the file
тотальная функция «Оба верны»
принимает первый: признак, второй: признак
возвращает признак
обеспечивает «конъюнкция читается и со второго довода: при истинном втором ответ есть первый, при ложном — ложь» если второй то (результат равен первый) иначе (результат равен нет)
обеспечивает «ложный первый довод гасит конъюнкцию» если первый то да иначе (результат равен нет)
пример «Оба да»
дано первый равно да
дано второй равно да
ожидается да
тотальная функция «Хотя бы одно»
принимает первый: признак, второй: признак
возвращает признак
обеспечивает «дизъюнкция читается и со второго довода: при истинном втором ответ истина, при ложном — первый» если второй то (результат равен да) иначе (результат равен первый)
обеспечивает «истинный первый довод держит дизъюнкцию» если первый то (результат равен да) иначе да
пример «Первый да»
дано первый равно да
дано второй равно нет
ожидается да
тотальная функция «Не так»
принимает значение: признак
возвращает признак
обеспечивает «отрицание есть импликация в ложь» результат равен («Следует» от значение и нет)
обеспечивает «А или не А — истина» («Хотя бы одно» от значение и результат) равен да
обеспечивает «А и не А — ложь» («Оба верны» от значение и результат) равен нет
обеспечивает «не не А равно А» («Не так» от результат) равен значение
пример «Да становится нет»
дано значение равно да
ожидается нет
тотальная функция «Ровно одно»
принимает первый: признак, второй: признак
возвращает признак
обеспечивает «исключающее или есть неравенство признаков» результат равен (не (первый равен второй))
обеспечивает «исключающее или читается и со второго довода: при истинном втором ответ есть отрицание первого, при ложном — сам первый» если второй то (результат равен («Не так» от первый)) иначе (результат равен первый)
обеспечивает «исключающее или читается и с первого довода: при истинном первом ответ есть отрицание второго, при ложном — сам второй» если первый то (результат равен (не второй)) иначе (результат равен второй)
пример «Разные»
дано первый равно да
дано второй равно нет
ожидается да
тотальная функция «Следует»
принимает посылка: признак, следствие: признак
возвращает признак
обеспечивает «импликация есть отрицание посылки или следствие» результат равен (не посылка или следствие)
обеспечивает «из ложной посылки следует что угодно» если посылка то да иначе (результат равен да)
обеспечивает «при верной посылке импликация есть само следствие» если посылка то (результат равен следствие) иначе да
пример «Посылка верна, следствие нет»
дано посылка равно да
дано следствие равно нет
ожидается нет
тотальная функция «Все верны»
принимает значения: список признака
возвращает признак
обеспечивает «все верны ровно тогда, когда ложного среди значений нет» результат равен (не (значения содержит нет))
пример «Все да»
дано значения равно [да, да]
ожидается да
тотальная функция «Есть верное»
принимает значения: список признака
возвращает признак
обеспечивает «есть верное ровно тогда, когда истинное среди значений есть» результат равен (значения содержит да)
пример «Одно да достаточно»
дано значения равно [нет, да, нет]
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Оба верны» | доказано композицией | доказано 2 из 2 |
| «Хотя бы одно» | доказано композицией | доказано 2 из 2 |
| «Не так» | доказано композицией | доказано 4 из 4 |
| «Ровно одно» | доказано композицией | доказано 2 из 3; «исключающее или есть неравенство признаков» — сетка |
| «Следует» | доказано композицией | доказано 3 из 3 |
| «Все верны» | доказано композицией | доказано 0 из 1; «все верны ровно тогда, когда ложного среди значений нет» — сетка |
| «Есть верное» | доказано композицией | доказано 0 из 1; «есть верное ровно тогда, когда истинное среди значений есть» — сетка |
«Math classics for lists»
flang/stdlib/math-classics-lists.flang — functions 25; the kernel ledger was taken from this version of the file
тотальная функция «Удвоить число»
принимает х: число
возвращает число
обеспечивает «удвоение есть сумма с самим собой» результат равен (х плюс х)
пример «Тройка»
дано х равно 3
ожидается 6
тотальная функция «Прибавить единицу»
принимает х: число
возвращает число
обеспечивает «прибавление единицы есть сумма с единицей» результат равен (х плюс 1)
пример «Тройка»
дано х равно 3
ожидается 4
тотальная функция «Сложить два»
принимает первое: число, второе: число
возвращает число
обеспечивает «сложение двух есть их сумма» результат равен (первое плюс второе)
пример «Два и три»
дано первое равно 2
дано второе равно 3
ожидается 5
тотальная функция «Шаг склейки» от «А»
принимает акк: список «А», эл: «А»
возвращает список «А»
обеспечивает «шаг склейки удлиняет список ровно на один» (длина результат) равен ((длина акк) плюс 1)
пример «К двум»
дано акк равно [1, 2]
дано эл равно 3
ожидается [1, 2, 3]
тотальная функция «Пустой список чисел»
возвращает список числа
обеспечивает «у пустого списка длина ноль» (длина результат) равен 0
пример «Он и есть пустой»
ожидается пустой список
тотальная функция «Склеить» от «А»
принимает первый: список «А», второй: список «А»
возвращает список «А»
обеспечивает «длина склейки есть сумма длин» (длина результат) равен ((длина первый) плюс (длина второй))
пример «Два и один»
дано первый равно [1, 2]
дано второй равно [3]
ожидается [1, 2, 3]
тотальная функция «Склеить с пустым справа» от «А»
принимает элементы: список «А»
возвращает список «А»
обеспечивает «склейка с пустым справа не меняет список» результат равен элементы
обеспечивает «склейка с пустым справа не меняет длину» (длина результат) равен (длина элементы)
пример «Три элемента»
дано элементы равно [1, 2, 3]
ожидается [1, 2, 3]
тотальная функция «Склеить с пустым слева» от «А»
принимает элементы: список «А»
возвращает список «А»
обеспечивает «склейка с пустым слева не меняет список» результат равен элементы
обеспечивает «склейка с пустым слева не меняет длину» (длина результат) равен (длина элементы)
пример «Три элемента»
дано элементы равно [1, 2, 3]
ожидается [1, 2, 3]
тотальная функция «Склеить три» от «А»
принимает первый: список «А», второй: список «А», третий: список «А»
возвращает список «А»
обеспечивает «склейка сочетательна» результат равен («Склеить» от первый и («Склеить» от второй и третий))
обеспечивает «длина склейки трёх есть сумма трёх длин» (длина результат) равен (((длина первый) плюс (длина второй)) плюс (длина третий))
пример «Один два три»
дано первый равно [1]
дано второй равно [2]
дано третий равно [3]
ожидается [1, 2, 3]
тотальная функция «Приписать к склейке» от «А»
принимает первый: «А», левый: список «А», правый: список «А»
возвращает список «А»
обеспечивает «приписывание к склейке есть склейка с приписыванием» результат равен («Склеить» от («Приписать в начало» от первый и левый) и правый)
обеспечивает «длина приписанной склейки на один больше суммы длин» (длина результат) равен (((длина левый) плюс (длина правый)) плюс 1)
пример «Один к двум и одному»
дано первый равно 0
дано левый равно [1, 2]
дано правый равно [3]
ожидается [0, 1, 2, 3]
тотальная функция «Приписать в начало» от «А»
принимает первый: «А», элементы: список «А»
возвращает список «А»
обеспечивает «приписывание удлиняет список ровно на один» (длина результат) равен ((длина элементы) плюс 1)
обеспечивает «приписанное впереди принадлежит списку» (результат содержит первый) равен да
пример «К двум»
дано первый равно 1
дано элементы равно [2, 3]
ожидается [1, 2, 3]
тотальная функция «Обратить» от «А»
принимает элементы: список «А»
возвращает список «А»
обеспечивает «обращение сохраняет длину» (длина результат) равен (длина элементы)
пример «Три элемента»
дано элементы равно [1, 2, 3]
ожидается [3, 2, 1]
тотальная функция «Обратить дважды» от «А»
принимает элементы: список «А»
возвращает список «А»
обеспечивает «двойное обращение возвращает исходный список» результат равен элементы
обеспечивает «двойное обращение сохраняет длину» (длина результат) равен (длина элементы)
пример «Три элемента»
дано элементы равно [1, 2, 3]
ожидается [1, 2, 3]
тотальная функция «Обратить склейку» от «А»
принимает первый: список «А», второй: список «А»
возвращает список «А»
обеспечивает «обращение склейки есть склейка обращений в обратном порядке» результат равен («Склеить» от («Обратить» от второй) и («Обратить» от первый))
обеспечивает «длина обращённой склейки есть сумма длин» (длина результат) равен ((длина первый) плюс (длина второй))
пример «Два и один»
дано первый равно [1, 2]
дано второй равно [3]
ожидается [3, 2, 1]
тотальная функция «Отобразить»
принимает ф: функция из числа в число, элементы: список числа
возвращает список числа
обеспечивает «отображение сохраняет длину» (длина результат) равен (длина элементы)
пример «Удвоение»
дано ф равно функция «Удвоить число»
дано элементы равно [1, 2, 3]
ожидается [2, 4, 6]
тотальная функция «Отобразить склейку»
принимает ф: функция из числа в число, первый: список числа, второй: список числа
возвращает список числа
обеспечивает «отображение склейки есть склейка отображений» результат равен («Склеить» от («Отобразить» от ф и первый) и («Отобразить» от ф и второй))
обеспечивает «длина отображённой склейки есть сумма длин» (длина результат) равен ((длина первый) плюс (длина второй))
пример «Удвоение склейки»
дано ф равно функция «Удвоить число»
дано первый равно [1, 2]
дано второй равно [3]
ожидается [2, 4, 6]
тотальная функция «Отобразить дважды»
принимает внешняя: функция из числа в число, внутренняя: функция из числа в число, элементы: список числа
возвращает список числа
обеспечивает «два отображения подряд суть одно отображение составом» результат равен («Отобразить» от внешняя и («Отобразить» от внутренняя и элементы))
обеспечивает «отображение составом сохраняет длину» (длина результат) равен (длина элементы)
пример «Удвоить, потом прибавить единицу»
дано внешняя равно функция «Прибавить единицу»
дано внутренняя равно функция «Удвоить число»
дано элементы равно [1, 2, 3]
ожидается [3, 5, 7]
тотальная функция «Отобразить тождеством»
принимает элементы: список числа
возвращает список числа
обеспечивает «отображение тождеством не меняет список» результат равен элементы
обеспечивает «отображение тождеством сохраняет длину» (длина результат) равен (длина элементы)
пример «Три элемента»
дано элементы равно [1, 2, 3]
ожидается [1, 2, 3]
тотальная функция «Свернуть слева»
принимает ф: функция из числа и числа в число, основа: число, элементы: список числа
возвращает число
обеспечивает «на пустом списке левая свёртка есть само основание» если (длина элементы) равен 0 то (результат равен основа) иначе да
пример «Сумма»
дано ф равно функция «Сложить два»
дано основа равно 0
дано элементы равно [1, 2, 3]
ожидается 6
тотальная функция «Свернуть слева склейку»
принимает ф: функция из числа и числа в число, основа: число, первый: список числа, второй: список числа
возвращает число
обеспечивает «левая свёртка склейки есть свёртка второго от свёртки первого» результат равен («Свернуть слева» от ф и («Свернуть слева» от ф и основа и первый) и второй)
пример «Сумма склейки»
дано ф равно функция «Сложить два»
дано основа равно 0
дано первый равно [1, 2]
дано второй равно [3, 4]
ожидается 10
тотальная функция «Свернуть справа»
принимает ф: функция из числа и числа в число, основа: число, элементы: список числа
возвращает число
обеспечивает «на пустом списке правая свёртка есть само основание» если (длина элементы) равен 0 то (результат равен основа) иначе да
пример «Сумма»
дано ф равно функция «Сложить два»
дано основа равно 0
дано элементы равно [1, 2, 3]
ожидается 6
тотальная функция «Свернуть справа склейку»
принимает ф: функция из числа и числа в число, основа: число, первый: список числа, второй: список числа
возвращает число
обеспечивает «правая свёртка склейки есть свёртка первого от свёртки второго» результат равен («Свернуть справа» от ф и («Свернуть справа» от ф и основа и второй) и первый)
пример «Сумма склейки»
дано ф равно функция «Сложить два»
дано основа равно 0
дано первый равно [1, 2]
дано второй равно [3, 4]
ожидается 10
тотальная функция «Есть в склейке»
принимает знач: число, первый: список числа, второй: список числа
возвращает признак
обеспечивает «вхождение в склейку есть вхождение в одну из частей» результат равен ((первый содержит знач) или (второй содержит знач))
обеспечивает «вхождение в первую часть даёт вхождение в склейку» (не (первый содержит знач)) или (результат равен да)
обеспечивает «вхождение во вторую часть даёт вхождение в склейку» (не (второй содержит знач)) или (результат равен да)
пример «В первом»
дано знач равно 1
дано первый равно [1, 2]
дано второй равно [3]
ожидается да
тотальная функция «Элемент по номеру»
принимает элементы: список числа, номер: неотрицательное
требует «номер не меньше первого» 1 не больше номер
требует «номер не за концом списка» номер не больше (длина элементы)
возвращает число
обеспечивает «элемент по номеру внутри списка принадлежит списку» (элементы содержит результат) равен да
пример «Второй из трёх»
дано элементы равно [10, 20, 30]
дано номер равно 2
ожидается 20
тотальная функция «Приписать к вошедшему»
принимает знач: число, первый: число, элементы: список числа
требует «значение уже в списке» (элементы содержит знач) равен да
возвращает список числа
обеспечивает «приписывание не теряет вошедшего» (результат содержит знач) равен да
пример «Двойка на месте»
дано знач равно 2
дано первый равно 9
дано элементы равно [1, 2, 3]
ожидается [9, 1, 2, 3]
| Function | Termination | Claims |
|---|---|---|
| «Удвоить число» | доказано композицией | доказано 0 из 1; «удвоение есть сумма с самим собой» — сетка |
| «Прибавить единицу» | доказано композицией | доказано 1 из 1 |
| «Сложить два» | доказано композицией | доказано 1 из 1 |
| «Шаг склейки» | доказано композицией | доказано 1 из 1 |
| «Пустой список чисел» | доказано композицией | доказано 1 из 1 |
| «Склеить» | доказано композицией | доказано 1 из 1 |
| «Склеить с пустым справа» | доказано композицией | доказано 2 из 2 |
| «Склеить с пустым слева» | доказано композицией | доказано 1 из 2; «склейка с пустым слева не меняет список» — сетка |
| «Склеить три» | доказано композицией | доказано 1 из 2; «склейка сочетательна» — сетка |
| «Приписать к склейке» | доказано композицией | доказано 1 из 2; «приписывание к склейке есть склейка с приписыванием» — сетка |
| «Приписать в начало» | доказано композицией | доказано 1 из 2; «приписанное впереди принадлежит списку» — сетка |
| «Обратить» | доказано композицией | доказано 1 из 1 |
| «Обратить дважды» | доказано композицией | доказано 1 из 2; «двойное обращение возвращает исходный список» — сетка |
| «Обратить склейку» | доказано композицией | доказано 1 из 2; «обращение склейки есть склейка обращений в обратном порядке» — сетка |
| «Отобразить» | доказано композицией | доказано 1 из 1 |
| «Отобразить склейку» | доказано композицией | доказано 1 из 2; «отображение склейки есть склейка отображений» — сетка |
| «Отобразить дважды» | доказано композицией | доказано 1 из 2; «два отображения подряд суть одно отображение составом» — сетка |
| «Отобразить тождеством» | доказано композицией | доказано 1 из 2; «отображение тождеством не меняет список» — сетка |
| «Свернуть слева» | доказано композицией | доказано 1 из 1 |
| «Свернуть слева склейку» | доказано композицией | доказано 0 из 1; «левая свёртка склейки есть свёртка второго от свёртки первого» — сетка |
| «Свернуть справа» | доказано композицией | доказано 0 из 1; «на пустом списке правая свёртка есть само основание» — сетка |
| «Свернуть справа склейку» | доказано композицией | доказано 0 из 1; «правая свёртка склейки есть свёртка первого от свёртки второго» — сетка |
| «Есть в склейке» | доказано композицией | доказано 0 из 3; «вхождение в склейку есть вхождение в одну из частей» — сетка; «вхождение в первую часть даёт вхождение в склейку» — сетка; «вхождение во вторую часть даёт вхождение в склейку» — сетка |
| «Элемент по номеру» | доказано композицией | доказано 0 из 1; «элемент по номеру внутри списка принадлежит списку» — сетка |
| «Приписать к вошедшему» | доказано композицией | доказано 0 из 1; «приписывание не теряет вошедшего» — сетка |
«Math classics»
flang/stdlib/math-classics.flang — functions 45; the kernel ledger was taken from this version of the file
тотальная функция «Сумма»
принимает а: неотрицательное, б: неотрицательное
возвращает число
обеспечивает «сложение переставимо» результат равен (б плюс а)
обеспечивает «первое слагаемое не больше суммы» а не больше результат
обеспечивает «второе слагаемое не больше суммы» б не больше результат
пример «Два и три»
дано а равно 2
дано б равно 3
ожидается 5
тотальная функция «Сумма трёх»
принимает а: неотрицательное, б: неотрицательное, третье: неотрицательное
возвращает число
обеспечивает «сложение сочетательно» результат равен (а плюс (б плюс третье))
пример «Один два три»
дано а равно 1
дано б равно 2
дано третье равно 3
ожидается 6
тотальная функция «Прибавить ноль»
принимает а: неотрицательное
возвращает число
обеспечивает «ноль справа ничего не прибавляет» результат равен а
пример «Пятёрка»
дано а равно 5
ожидается 5
тотальная функция «Ноль слева»
принимает а: неотрицательное
возвращает число
обеспечивает «ноль слева ничего не прибавляет» результат равен а
пример «Пятёрка»
дано а равно 5
ожидается 5
тотальная функция «Сократить общее слагаемое»
принимает общее: неотрицательное, а: неотрицательное, б: неотрицательное
требует «суммы с общим слагаемым равны» (общее плюс а) равен (общее плюс б)
возвращает число
обеспечивает «из равенства сумм следует равенство слагаемых» результат равен б
пример «Оба по три»
дано общее равно 10
дано а равно 3
дано б равно 3
ожидается 3
тотальная функция «Следующее»
принимает а: неотрицательное
возвращает число
обеспечивает «всякое натуральное не больше следующего» а не больше результат
пример «Пятёрка»
дано а равно 5
ожидается 6
тотальная функция «Прибавить десять»
принимает а: неотрицательное
возвращает число
обеспечивает «натуральное не больше себя с десяткой» а не больше результат
пример «Пятёрка»
дано а равно 5
ожидается 15
тотальная функция «Прибавить общее к большему»
принимает общее: неотрицательное, о: неотрицательное, п: неотрицательное
возвращает число
обеспечивает «общая прибавка сохраняет порядок» если (о не больше п) то ((общее плюс о) не больше результат) иначе да
пример «Два к тройке»
дано общее равно 2
дано о равно 1
дано п равно 3
ожидается 5
тотальная функция «Произведение»
принимает а: неотрицательное, б: неотрицательное
возвращает число
обеспечивает «умножение переставимо» результат равен (б умножить на а)
пример «Три на четыре»
дано а равно 3
дано б равно 4
ожидается 12
тотальная функция «Произведение трёх»
принимает а: неотрицательное, б: неотрицательное, третье: неотрицательное
возвращает число
обеспечивает «умножение сочетательно» результат равен (а умножить на (б умножить на третье))
пример «Два три четыре»
дано а равно 2
дано б равно 3
дано третье равно 4
ожидается 24
тотальная функция «Умножить на единицу»
принимает а: неотрицательное
возвращает число
обеспечивает «единица справа ничего не меняет» результат равен а
пример «Девятка»
дано а равно 9
ожидается 9
тотальная функция «Единица слева»
принимает а: неотрицательное
возвращает число
обеспечивает «единица слева ничего не меняет» результат равен а
пример «Девятка»
дано а равно 9
ожидается 9
тотальная функция «Умножить на ноль»
принимает а: неотрицательное
возвращает число
обеспечивает «ноль справа обнуляет произведение» результат равен 0
пример «Девятка»
дано а равно 9
ожидается 0
тотальная функция «Распределить слева»
принимает а: неотрицательное, б: неотрицательное, третье: неотрицательное
возвращает число
обеспечивает «умножение распределяется по сложению слева» результат равен ((а умножить на б) плюс (а умножить на третье))
пример «Два на три плюс четыре»
дано а равно 2
дано б равно 3
дано третье равно 4
ожидается 14
тотальная функция «Распределить справа»
принимает а: неотрицательное, б: неотрицательное, третье: неотрицательное
возвращает число
обеспечивает «умножение распределяется по сложению справа» результат равен ((а умножить на третье) плюс (б умножить на третье))
пример «Два плюс три на четыре»
дано а равно 2
дано б равно 3
дано третье равно 4
ожидается 20
тотальная функция «Вычесть и прибавить обратно»
принимает а: неотрицательное, б: неотрицательное
требует «вычитаемое не больше уменьшаемого» б не больше а
возвращает число
обеспечивает «вычтенное, прибавленное обратно, даёт прежнее» результат равен а
пример «Семь без трёх и обратно»
дано а равно 7
дано б равно 3
ожидается 7
тотальная функция «Вычесть ноль»
принимает а: неотрицательное
возвращает число
обеспечивает «ноль справа ничего не вычитает» результат равен а
пример «Пятёрка»
дано а равно 5
ожидается 5
тотальная функция «Вычесть само себя»
принимает а: неотрицательное
возвращает число
обеспечивает «число без самого себя есть ноль» результат равен 0
пример «Пятёрка»
дано а равно 5
ожидается 0
тотальная функция «Само себя»
принимает а: неотрицательное
возвращает число
обеспечивает «всякое натуральное не больше самого себя» а не больше результат
обеспечивает «ноль не больше всякого натурального» 0 не больше результат
пример «Пятёрка»
дано а равно 5
ожидается 5
тотальная функция «Через середину»
принимает а: неотрицательное, б: неотрицательное, третье: неотрицательное
требует «первое не больше второго» а не больше б
требует «второе не больше третьего» б не больше третье
возвращает число
обеспечивает «порядок переходит через середину» а не больше результат
обеспечивает «порядок переходит через середину, записью-двойником» (не ((а не больше б) и притом (б не больше третье))) или (а не больше результат)
пример «Один два три»
дано а равно 1
дано б равно 2
дано третье равно 3
ожидается 3
тотальная функция «Зажатое между»
принимает а: неотрицательное, б: неотрицательное
требует «первое не больше второго» а не больше б
требует «второе не больше первого» б не больше а
возвращает число
обеспечивает «зажатые с двух сторон равны» результат равен б
обеспечивает «зажатые с двух сторон равны, записью-двойником» (не ((а не больше б) и притом (б не больше а))) или (результат равен б)
пример «Оба по четыре»
дано а равно 4
дано б равно 4
ожидается 4
тотальная функция «Сравнить»
принимает а: неотрицательное, б: неотрицательное
возвращает число
обеспечивает «ответ есть одна из трёх ветвей тела» (результат равен (0 минус 1)) или ((результат равен (0)) или ((результат равен (1))))
обеспечивает «сравнение отдаёт ровно одно из трёх» ((результат равен (0 минус 1)) или (результат равен 0)) или (результат равен 1)
обеспечивает «меньшему отвечает минус единица» если (а меньше б) то (результат равен (0 минус 1)) иначе да
обеспечивает «равным отвечает ноль» если не (а меньше б) то (если (а равен б) то (результат равен 0)
иначе да) иначе да
обеспечивает «большему отвечает единица» если не (а меньше б) то (если не (а равен б) то (результат равен 1)
иначе да) иначе да
пример «Меньше»
дано а равно 2
дано б равно 5
ожидается -1
тотальная функция «Два сравнимы»
принимает а: неотрицательное, б: неотрицательное
возвращает признак
обеспечивает «два натуральных сравнимы всегда» результат равен да
пример «Меньше»
дано а равно 2
дано б равно 5
ожидается да
тотальная функция «Меньшее из двух»
принимает а: неотрицательное, б: неотрицательное
возвращает число
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (а)) или ((результат равен (б)))
обеспечивает «когда первое не больше второго, меньшее есть первое» если (а не больше б) то (результат равен а) иначе да
обеспечивает «когда первое больше второго, меньшее есть второе» если не (а не больше б) то (результат равен б) иначе да
обеспечивает «меньшее из двух не больше первого» если (а не больше б) то (результат не больше а) иначе да
обеспечивает «меньшее из двух не больше второго» если не (а не больше б) то (результат не больше б) иначе да
пример «Первое меньше»
дано а равно 2
дано б равно 5
ожидается 2
тотальная функция «Большее из двух»
принимает а: неотрицательное, б: неотрицательное
возвращает число
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (а)) или ((результат равен (б)))
обеспечивает «когда второе не больше первого, большее есть первое» если (б не больше а) то (результат равен а) иначе да
обеспечивает «когда второе больше первого, большее есть второе» если не (б не больше а) то (результат равен б) иначе да
обеспечивает «первое не больше большего из двух» если (б не больше а) то (а не больше результат) иначе да
обеспечивает «второе не больше большего из двух» если не (б не больше а) то (б не больше результат) иначе да
пример «Первое больше»
дано а равно 9
дано б равно 5
ожидается 9
тотальная функция «Равны признаком»
принимает а: неотрицательное, б: неотрицательное
возвращает признак
обеспечивает «признак равенства отвечает равенству» результат равен (а равен б)
пример «Равны»
дано а равно 5
дано б равно 5
ожидается да
тотальная функция «Не больше признаком»
принимает а: неотрицательное, б: неотрицательное
возвращает признак
обеспечивает «признак порядка отвечает порядку» результат равен (а не больше б)
пример «Меньше»
дано а равно 2
дано б равно 5
ожидается да
тотальная функция «Меньшее переставленное»
принимает а: неотрицательное, б: неотрицательное
возвращает число
обеспечивает «меньшее из двух переставимо» результат равен («Меньшее из двух» от б и а)
пример «Первое меньше»
дано а равно 2
дано б равно 5
ожидается 2
тотальная функция «Большее переставленное»
принимает а: неотрицательное, б: неотрицательное
возвращает число
обеспечивает «большее из двух переставимо» результат равен («Большее из двух» от б и а)
пример «Первое больше»
дано а равно 9
дано б равно 5
ожидается 9
тотальная функция «Частное»
принимает а: неотрицательное, б: неотрицательное
требует «делитель положителен» 1 не больше б
возвращает число
обеспечивает «частное и остаток восстанавливают делимое» ((б умножить на результат) плюс (а остаток от б)) равен а
пример «Без остатка»
дано а равно 8
дано б равно 4
ожидается 2
тотальная функция «Остаток»
принимает а: неотрицательное, б: неотрицательное
требует «делитель положителен» 1 не больше б
возвращает число
обеспечивает «остаток не больше делителя без единицы» результат не больше (б минус 1)
обеспечивает «остаток неотрицателен» 0 не больше результат
пример «Семь по два»
дано а равно 7
дано б равно 2
ожидается 1
тотальная функция «Остаток по десяти»
принимает н: неотрицательное
возвращает число
обеспечивает «остаток по десяти не больше девяти» результат не больше 9
обеспечивает «остаток по десяти неотрицателен» 0 не больше результат
пример «Двадцать три»
дано н равно 23
ожидается 3
тотальная функция «Остаток по единице»
принимает н: неотрицательное
возвращает число
обеспечивает «остаток по единице есть ноль» результат равен 0
обеспечивает «остаток по единице не больше нуля» результат не больше 0
обеспечивает «остаток по единице неотрицателен» 0 не больше результат
пример «Двадцать три»
дано н равно 23
ожидается 0
тотальная функция «Делить на единицу»
принимает н: неотрицательное
возвращает число
обеспечивает «деление на единицу ничего не меняет» результат равен н
пример «Двадцать три»
дано н равно 23
ожидается 23
тотальная функция «Остаток от самого себя»
принимает а: неотрицательное
требует «число положительно» 1 не больше а
возвращает число
обеспечивает «остаток от самого себя есть ноль» результат равен 0
пример «Семёрка»
дано а равно 7
ожидается 0
тотальная функция «Делит»
принимает делитель: неотрицательное, число: неотрицательное
требует «делитель положителен» 1 не больше делитель
возвращает признак
обеспечивает «делимость есть нулевой остаток» результат равен ((число остаток от делитель) равен 0)
пример «Делит»
дано делитель равно 3
дано число равно 12
ожидается да
тотальная функция «Делит само себя»
принимает а: неотрицательное
требует «число положительно» 1 не больше а
возвращает признак
обеспечивает «всякое положительное делит само себя» результат равен да
пример «Семёрка»
дано а равно 7
ожидается да
функция «НОД по Евклиду»
принимает первое: число, второе: число
возвращает число
обеспечивает «НОД с нулём есть само число» если второе равен 0 то (результат равен первое) иначе да
обеспечивает «НОД сводится к остатку» если не (второе равен 0) то (результат равен («НОД по Евклиду» от второе и (первое остаток от второе))) иначе да
обеспечивает «НОД переставим» результат равен («НОД по Евклиду» от второе и первое)
обеспечивает «НОД делит первое число» если ((1 не больше первое) и притом (1 не больше второе)) то (((первое остаток от результат) равен 0) равен да) иначе да
обеспечивает «НОД делит второе число» если ((1 не больше первое) и притом (1 не больше второе)) то (((второе остаток от результат) равен 0) равен да) иначе да
пример «Двенадцать и восемнадцать»
дано первое равно 12
дано второе равно 18
ожидается 6
функция «НОД с самим собой»
принимает а: число
возвращает число
обеспечивает «НОД числа с самим собой есть само число» результат равен а
пример «Семёрка»
дано а равно 7
ожидается 7
функция «НОД с единицей»
принимает а: число
возвращает число
обеспечивает «НОД с единицей есть единица» результат равен 1
пример «Семёрка»
дано а равно 7
ожидается 1
тотальная функция «Чётно»
принимает н: неотрицательное
возвращает признак
обеспечивает «чётность есть нулевой остаток по два» результат равен ((н остаток от 2) равен 0)
пример «Четыре»
дано н равно 4
ожидается да
тотальная функция «Остаток по два»
принимает н: неотрицательное
возвращает число
обеспечивает «всякое натуральное чётно или нечётно» (результат равен 0) или (результат равен 1)
пример «Четыре»
дано н равно 4
ожидается 0
тотальная функция «Сумма чётных»
принимает а: неотрицательное, б: неотрицательное
требует «первое чётно» (а остаток от 2) равен 0
требует «второе чётно» (б остаток от 2) равен 0
возвращает число
обеспечивает «сумма двух чётных чётна» (результат остаток от 2) равен 0
пример «Четыре и шесть»
дано а равно 4
дано б равно 6
ожидается 10
тотальная функция «Произведение с чётным»
принимает а: неотрицательное, б: неотрицательное
требует «первый сомножитель чётен» (а остаток от 2) равен 0
возвращает число
обеспечивает «произведение с чётным сомножителем чётно» (результат остаток от 2) равен 0
пример «Четыре на семь»
дано а равно 4
дано б равно 7
ожидается 28
тотальная функция «Нечётно»
принимает н: неотрицательное
возвращает признак
обеспечивает «нечётность есть единичный остаток по два» результат равен ((н остаток от 2) равен 1)
пример «Пять»
дано н равно 5
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Сумма» | доказано композицией | доказано 3 из 3 |
| «Сумма трёх» | доказано композицией | доказано 0 из 1; «сложение сочетательно» — сетка |
| «Прибавить ноль» | доказано композицией | доказано 0 из 1; «ноль справа ничего не прибавляет» — сетка |
| «Ноль слева» | доказано композицией | доказано 0 из 1; «ноль слева ничего не прибавляет» — сетка |
| «Сократить общее слагаемое» | доказано композицией | доказано 0 из 1; «из равенства сумм следует равенство слагаемых» — сетка |
| «Следующее» | доказано композицией | доказано 1 из 1 |
| «Прибавить десять» | доказано композицией | доказано 1 из 1 |
| «Прибавить общее к большему» | доказано композицией | доказано 1 из 1 |
| «Произведение» | доказано композицией | доказано 1 из 1 |
| «Произведение трёх» | доказано композицией | доказано 0 из 1; «умножение сочетательно» — сетка |
| «Умножить на единицу» | доказано композицией | доказано 0 из 1; «единица справа ничего не меняет» — сетка |
| «Единица слева» | доказано композицией | доказано 0 из 1; «единица слева ничего не меняет» — сетка |
| «Умножить на ноль» | доказано композицией | доказано 0 из 1; «ноль справа обнуляет произведение» — сетка |
| «Распределить слева» | доказано композицией | доказано 0 из 1; «умножение распределяется по сложению слева» — сетка |
| «Распределить справа» | доказано композицией | доказано 0 из 1; «умножение распределяется по сложению справа» — сетка |
| «Вычесть и прибавить обратно» | доказано композицией | доказано 0 из 1; «вычтенное, прибавленное обратно, даёт прежнее» — сетка |
| «Вычесть ноль» | доказано композицией | доказано 0 из 1; «ноль справа ничего не вычитает» — сетка |
| «Вычесть само себя» | доказано композицией | доказано 0 из 1; «число без самого себя есть ноль» — сетка |
| «Само себя» | доказано композицией | доказано 2 из 2 |
| «Через середину» | доказано композицией | доказано 2 из 2 |
| «Зажатое между» | доказано композицией | доказано 0 из 2; «зажатые с двух сторон равны» — сетка; «зажатые с двух сторон равны, записью-двойником» — сетка |
| «Сравнить» | доказано композицией | доказано 5 из 5 |
| «Два сравнимы» | доказано композицией | доказано 0 из 1; «два натуральных сравнимы всегда» — сетка |
| «Меньшее из двух» | доказано композицией | доказано 5 из 5 |
| «Большее из двух» | доказано композицией | доказано 5 из 5 |
| «Равны признаком» | доказано композицией | доказано 1 из 1 |
| «Не больше признаком» | доказано композицией | доказано 1 из 1 |
| «Меньшее переставленное» | доказано композицией | доказано 0 из 1; «меньшее из двух переставимо» — сетка |
| «Большее переставленное» | доказано композицией | доказано 0 из 1; «большее из двух переставимо» — сетка |
| «Частное» | доказано композицией | доказано 0 из 1; «частное и остаток восстанавливают делимое» — сетка |
| «Остаток» | доказано композицией | доказано 0 из 2; «остаток не больше делителя без единицы» — сетка; «остаток неотрицателен» — сетка |
| «Остаток по десяти» | доказано композицией | доказано 2 из 2 |
| «Остаток по единице» | доказано композицией | доказано 2 из 3; «остаток по единице есть ноль» — сетка |
| «Делить на единицу» | доказано композицией | доказано 0 из 1; «деление на единицу ничего не меняет» — сетка |
| «Остаток от самого себя» | доказано композицией | доказано 0 из 1; «остаток от самого себя есть ноль» — сетка |
| «Делит» | доказано композицией | доказано 1 из 1 |
| «Делит само себя» | доказано композицией | доказано 0 из 1; «всякое положительное делит само себя» — сетка |
| «НОД по Евклиду» | обещания нет | доказано 2 из 5; «НОД переставим» — сетка; «НОД делит первое число» — сетка; «НОД делит второе число» — сетка |
| «НОД с самим собой» | обещания нет | доказано 0 из 1; «НОД числа с самим собой есть само число» — сетка |
| «НОД с единицей» | обещания нет | доказано 0 из 1; «НОД с единицей есть единица» — сетка |
| «Чётно» | доказано композицией | доказано 1 из 1 |
| «Остаток по два» | доказано композицией | доказано 0 из 1; «всякое натуральное чётно или нечётно» — сетка |
| «Сумма чётных» | доказано композицией | доказано 0 из 1; «сумма двух чётных чётна» — сетка |
| «Произведение с чётным» | доказано композицией | доказано 0 из 1; «произведение с чётным сомножителем чётно» — сетка |
| «Нечётно» | доказано композицией | доказано 1 из 1 |
«Number format»
flang/stdlib/number-format.flang — functions 7; the kernel ledger was taken from this version of the file
тотальная функция «Цифра в основании»
принимает цифра: число
возвращает строка
обеспечивает «цифра — не больше одного знака» (длина результат) не больше 1
обеспечивает «вне азбуки — пусто» если (цифра меньше 0) или (цифра больше 15) то (результат равен "") иначе да
обеспечивает «дробная — пусто» если не (((цифра остаток от 1) плюс 0) равен 0) то (результат равен "") иначе да
обеспечивает «целая внутри азбуки — ровно один знак» если ((цифра не меньше 0) и притом (цифра не больше 15) и притом (((цифра остаток от 1) плюс 0) равен 0)) то ((длина результат) равен 1) иначе да
обеспечивает «цифра меньше десяти печатается как встроенной печатью» если ((цифра не меньше 0) и притом (цифра меньше 10) и притом (((цифра остаток от 1) плюс 0) равен 0)) то (результат равен (к строке цифра)) иначе да
пример «Ноль — это 0»
дано цифра равно 0
ожидается "0"
тотальная функция «Основание годно»
принимает основание: число
возвращает признак
обеспечивает «меньше двух — негодно» если основание меньше 2 то (не результат) иначе да
обеспечивает «больше шестнадцати — негодно» если основание больше 16 то (не результат) иначе да
обеспечивает «дробное — негодно» если не (((основание остаток от 1) плюс 0) равен 0) то (не результат) иначе да
обеспечивает «годное основание лежит от двух до шестнадцати» если результат то ((основание не меньше 2) и притом (основание не больше 16)) иначе да
пример «Два годно»
дано основание равно 2
ожидается да
тотальная функция «Цифры в основании»
принимает число: число, основание: число, витков: неотрицательное
возвращает строка
обеспечивает «без витков — пусто» если витков не больше 0 то (результат равен "") иначе да
обеспечивает «цифр не больше витков» (длина результат) не больше витков
обеспечивает «число меньше основания за виток даёт свою цифру» если (витков больше 0) и притом (число меньше основание) то (результат равен («Цифра в основании» от число)) иначе да
пример «255 двоичным за 54 витка»
дано число равно 255
дано основание равно 2
дано витков равно 54
ожидается "11111111"
тотальная функция «В основании»
принимает число: неотрицательное, основание: число
возвращает строка
обеспечивает «в негодном основании печать пуста» если не («Основание годно» от основание) то (результат равен "") иначе да
обеспечивает «в годном основании цифра хотя бы одна» если («Основание годно» от основание) то (1 не больше (длина результат)) иначе да
обеспечивает «цифр не больше пятидесяти четырёх» (длина результат) не больше 54
обеспечивает «число меньше годного основания — одна цифра» если («Основание годно» от основание) и притом (число меньше основание) то ((длина результат) равен 1) иначе да
обеспечивает «число не меньше годного основания — не меньше двух цифр» если («Основание годно» от основание) и притом (число не меньше основание) то (2 не больше (длина результат)) иначе да
обеспечивает «в основании десять печать совпадает со встроенной» если основание равен 10 то (результат равен (к строке число)) иначе да
пример «255 двоичным»
дано число равно 255
дано основание равно 2
ожидается "11111111"
тотальная функция «Дополнить нулями слева»
принимает текст: строка, ширина: неотрицательное
возвращает строка
обеспечивает «дополненный текст не короче ширины» ширина не больше (длина результат)
обеспечивает «дополненный текст не короче исходного» (длина текст) не больше (длина результат)
обеспечивает «текст не короче ширины не меняется» если ширина не больше (длина текст) то (результат равен текст) иначе да
обеспечивает «короткий текст дополняется ровно до ширины» если (длина текст) меньше ширина то ((длина результат) равен ширина) иначе да
обеспечивает «исходный текст остаётся внутри» результат содержит текст
пример «Один знак до трёх»
дано текст равно "5"
дано ширина равно 3
ожидается "005"
тотальная функция «С точностью»
принимает число: число, знаков: неотрицательное
возвращает строка
обеспечивает «отрицательное начинается с минуса» если число меньше 0 то (результат начинается с "-") иначе да
обеспечивает «неотрицательное минуса не несёт» если не (число меньше 0) то (не (результат начинается с "-")) иначе да
обеспечивает «без знаков после запятой — без точки» если знаков не больше 0 то (не (результат содержит ".")) иначе да
обеспечивает «со знаками после запятой — с точкой» если знаков больше 0 то (результат содержит ".") иначе да
обеспечивает «знаков после точки не меньше заказанных» если знаков больше 0 то ((знаков плюс 2) не больше (длина результат)) иначе да
обеспечивает «целое до половины потолка точных без знаков печатается как встроенной печатью» если ((знаков не больше 0) и притом (число не меньше 0) и притом (число не больше 4503599627370495) и притом (((число остаток от 1) плюс 0) равен 0)) то (результат равен (к строке число)) иначе да
пример «4.35 двумя знаками — 4.35, а не 4.34: произведение 4.35 на 100 равно 434.99999999999994»
дано число равно 4.35
дано знаков равно 2
ожидается "4.35"
тотальная функция «Круг основания десять держится»
принимает число: неотрицательное
возвращает признак
обеспечивает «круг держится на всяком точном неотрицательном» результат
пример «Ноль»
дано число равно 0
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Цифра в основании» | доказано композицией | доказано 4 из 5; «цифра меньше десяти печатается как встроенной печатью» — сетка |
| «Основание годно» | доказано композицией | доказано 4 из 4 |
| «Цифры в основании» | доказано точным шагом | доказано 2 из 3; «цифр не больше витков» — сетка |
| «В основании» | доказано композицией | доказано 1 из 6; «в годном основании цифра хотя бы одна» — сетка; «цифр не больше пятидесяти четырёх» — сетка; «число меньше годного основания — одна цифра» — сетка; «число не меньше годного основания — не меньше двух цифр» — сетка; «в основании десять печать совпадает со встроенной» — сетка |
| «Дополнить нулями слева» | доказано точным шагом | доказано 2 из 5; «дополненный текст не короче ширины» — сетка; «короткий текст дополняется ровно до ширины» — сетка; «исходный текст остаётся внутри» — сетка |
| «С точностью» | доказано композицией | доказано 1 из 6; «неотрицательное минуса не несёт» — сетка; «без знаков после запятой — без точки» — сетка; «со знаками после запятой — с точкой» — сетка; «знаков после точки не меньше заказанных» — сетка; «целое до половины потолка точных без знаков печатается как встроенной печатью» — сетка |
| «Круг основания десять держится» | доказано композицией | доказано 0 из 1; «круг держится на всяком точном неотрицательном» — сетка |
«Numbers»
flang/stdlib/numbers.flang — functions 16; the kernel ledger was taken from this version of the file
тотальная функция «Абсолютное значение»
принимает число: число
возвращает число
обеспечивает «модуль не меньше самого числа, когда число неотрицательно» если (0 не больше число) то (число не больше результат) иначе да
обеспечивает «модуль не меньше самого числа, когда число неположительно» если (число не больше 0) то (число не больше результат) иначе да
обеспечивает «модуль не меньше противоположного» если ((0 не больше число) или (число не больше 0)) то ((0 минус число) не больше результат) иначе да
обеспечивает «у отрицательного модуль — противоположное» если (число меньше 0) то (результат равен (0 минус число)) иначе да
обеспечивает «у неотрицательного модуль — само число» если не (число меньше 0) то (результат равен число) иначе да
пример «Отрицательное»
дано число равно -5
ожидается 5
тотальная функция «Знак»
принимает число: число
возвращает число
обеспечивает «знак читает порядок: у положительного единица, у отрицательного минус единица, у нуля ноль» если число больше 0 то (результат равен 1) иначе (если число меньше 0 то (результат равен (0 минус 1)) иначе (результат равен 0))
обеспечивает «знак не больше единицы» результат не больше 1
обеспечивает «знак, умноженный на модуль, даёт само число» (результат умножить на («Абсолютное значение» от число)) равен число
обеспечивает «у положительного знак — единица» если (число больше 0) то (результат равен 1) иначе да
обеспечивает «у отрицательного знак — минус единица» если не (число больше 0) то (если (число меньше 0) то (результат равен (0 минус 1)) иначе да) иначе да
обеспечивает «у нуля знак — ноль» если не (число больше 0) то (если не (число меньше 0) то (результат равен 0) иначе да) иначе да
пример «Положительное»
дано число равно 7
ожидается 1
тотальная функция «Минимум двух»
принимает первое: число, второе: число
возвращает число
обеспечивает «минимум — одно из двух чисел» (результат равен первое) или (результат равен второе)
обеспечивает «минимум не больше первого числа, когда второе не больше первого» если (второе не больше первое) то (результат не больше первое) иначе да
обеспечивает «минимум не больше первого числа, когда первое не больше второго» если (первое не больше второе) то (результат не больше первое) иначе да
обеспечивает «минимум не больше второго числа, когда числа сравнимы» если ((первое не больше второе) или (второе не больше первое)) то (результат не больше второе) иначе да
обеспечивает «когда первое строго меньше второго, минимум есть первое» если (первое меньше второе) то (результат равен первое) иначе да
обеспечивает «когда первое не меньше второго, минимум есть второе» если не (первое меньше второе) то (результат равен второе) иначе да
пример «Первое меньше»
дано первое равно 2
дано второе равно 5
ожидается 2
тотальная функция «Максимум двух»
принимает первое: число, второе: число
возвращает число
обеспечивает «максимум — одно из двух чисел» (результат равен первое) или (результат равен второе)
обеспечивает «максимум не меньше первого числа, когда первое не больше второго» если (первое не больше второе) то (результат не меньше первое) иначе да
обеспечивает «максимум не меньше первого числа, когда второе не больше первого» если (второе не больше первое) то (результат не меньше первое) иначе да
обеспечивает «максимум не меньше второго числа, когда числа сравнимы» если ((первое не больше второе) или (второе не больше первое)) то (результат не меньше второе) иначе да
обеспечивает «когда первое строго больше второго, максимум есть первое» если (первое больше второе) то (результат равен первое) иначе да
обеспечивает «когда первое не больше второго, максимум есть второе» если не (первое больше второе) то (результат равен второе) иначе да
пример «Первое больше»
дано первое равно 7
дано второе равно 5
ожидается 7
тотальная функция «Ограничить»
принимает число: число, снизу: число, сверху: число
возвращает число
обеспечивает «ограничение отдаёт либо само число, либо одну из границ» ((результат равен число) или (результат равен снизу)) или (результат равен сверху)
обеспечивает «число внутри границ не меняется» если ((снизу не больше число) и притом (число не больше сверху)) то (результат равен число) иначе да
обеспечивает «ниже нижней границы отдаётся нижняя» если (число меньше снизу) то (результат равен снизу) иначе да
обеспечивает «выше верхней границы отдаётся верхняя» если не (число меньше снизу) то (если (число больше сверху) то (результат равен сверху) иначе да) иначе да
обеспечивает «между границами отдаётся само число» если не (число меньше снизу) то (если не (число больше сверху) то (результат равен число) иначе да) иначе да
пример «Ниже границы»
дано число равно 0
дано снизу равно 1
дано сверху равно 9
ожидается 1
тотальная функция «Целочисленное деление»
принимает делимое: число, делитель: число
возвращает число
обеспечивает «частное и остаток восстанавливают делимое» если (((делимое не меньше 0) и притом (делимое не больше 9007199254740991) и притом ((делимое остаток от 1) равен 0)) и притом ((делитель не меньше 1) и притом (делитель не больше 9007199254740991) и притом ((делитель остаток от 1) равен 0))) то (((результат умножить на делитель) плюс (делимое остаток от делитель)) равен делимое) иначе да
обеспечивает «частное — это делимое без остатка, поделённое на делитель» результат равен ((делимое минус (делимое остаток от делитель)) делить на делитель)
пример «Без остатка»
дано делимое равно 8
дано делитель равно 4
ожидается 2
тотальная функция «Целая часть»
принимает значение: число
возвращает число
обеспечивает «целая часть — само число без остатка от единицы» результат равен (значение минус (значение остаток от 1))
обеспечивает «на конечном числе целая часть цела и отстоит меньше чем на единицу» не ((значение минус значение) равен 0) или (((результат остаток от 1) плюс 0) равен 0 и притом (значение минус результат) меньше 1 и притом (результат минус значение) меньше 1)
обеспечивает «на неотрицательном целая часть не больше самого числа и отстаёт от него меньше чем на единицу» (не ((значение не меньше 0) и притом (значение меньше 9007199254740992))) или ((результат не больше значение) и притом (результат больше (значение минус 1)))
пример «Дробь отбрасывается»
дано значение равно 5.5
ожидается 5
тотальная функция «Чётное»
принимает число: число
возвращает признак
обеспечивает «чётность есть делимость на два» результат равен («Делится на» от число и 2)
обеспечивает «у соседних целых чётность разная» если ((число не меньше 0) и притом (число не больше 9007199254740990) и притом ((число остаток от 1) равен 0)) то (результат равен (не («Делится на» от (число плюс 1) и 2))) иначе да
пример «Чётное»
дано число равно 4
ожидается да
тотальная функция «Делится на»
принимает число: число, делитель: число
возвращает признак
обеспечивает «делимость — это ровно то, что деление нацело восстанавливает число» если (((число не меньше 0) и притом (число не больше 9007199254740991) и притом ((число остаток от 1) равен 0)) и притом ((делитель не меньше 1) и притом (делитель не больше 9007199254740991) и притом ((делитель остаток от 1) равен 0))) то (результат равен (((«Целочисленное деление» от число и делитель) умножить на делитель) равен число)) иначе да
обеспечивает «делимость — это нулевой остаток» результат равен ((число остаток от делитель) равен 0)
пример «Делится»
дано число равно 9
дано делитель равно 3
ожидается да
функция «НОД»
принимает первое: число, второе: число
возвращает число
обеспечивает «общий делитель и правда делит оба числа» если (((первое не меньше 1) и притом (первое не больше 9007199254740991) и притом ((первое остаток от 1) равен 0)) и притом ((второе не меньше 1) и притом (второе не больше 9007199254740991) и притом ((второе остаток от 1) равен 0))) то ((«Делится на» от первое и результат) и притом («Делится на» от второе и результат) и притом (1 не больше результат)) иначе да
обеспечивает «наибольший общий делитель с нулём — модуль первого» если второе равен 0 то (результат равен («Абсолютное значение» от первое)) иначе да
пример «12 и 18»
дано первое равно 12
дано второе равно 18
ожидается 6
функция «НОК»
принимает первое: число, второе: число
возвращает число
обеспечивает «общее кратное и правда делится на оба числа» если (((первое не меньше 1) и притом (первое не больше 3000000) и притом ((первое остаток от 1) равен 0)) и притом ((второе не меньше 1) и притом (второе не больше 3000000) и притом ((второе остаток от 1) равен 0))) то ((«Делится на» от результат и первое) и притом («Делится на» от результат и второе) и притом (1 не больше результат)) иначе да
обеспечивает «наименьшее общее кратное нуля — ноль» если первое равен 0 то (результат равен 0) иначе да
обеспечивает «наименьшее общее кратное со вторым нулём — ноль» если не (первое равен 0) то (если второе равен 0 то (результат равен 0) иначе да) иначе да
пример «4 и 6»
дано первое равно 4
дано второе равно 6
ожидается 12
тотальная функция «Степень»
принимает основание: число, показатель: неотрицательное
возвращает число
обеспечивает «единица в любой степени — единица» если (основание равен 1) то (результат равен 1) иначе да
обеспечивает «основание не меньше единицы — и степень не меньше единицы» если (основание не меньше 1) то (1 не больше результат) иначе да
обеспечивает «показатель не выше нуля даёт единицу» если показатель не больше 0 то (результат равен 1) иначе да
обеспечивает «показатель не выше нуля даёт степень не меньше единицы» если показатель не больше 0 то (1 не больше результат) иначе да
пример «Два в пятой»
дано основание равно 2
дано показатель равно 5
ожидается 32
тотальная функция «Факториал»
принимает число: неотрицательное
возвращает число
обеспечивает «факториал не меньше единицы» 1 не больше результат
обеспечивает «факториал не меньше самого числа» если (1 не больше число) то (число не больше результат) иначе да
обеспечивает «факториал нуля и единицы — единица» если число не больше 1 то (результат равен 1) иначе да
обеспечивает «на нуле и единице факториал не меньше самого числа» если число не больше 1 то (число не больше результат) иначе да
обеспечивает «на нуле и единице факториал не меньше единицы» если число не больше 1 то (1 не больше результат) иначе да
пример «Пять факториал»
дано число равно 5
ожидается 120
функция «Цифры»
принимает число: число
возвращает список числа
обеспечивает «цифра хотя бы одна» 1 не больше (длина результат)
обеспечивает «у целого от десяти и выше цифр не меньше двух» если ((число не меньше 10) и притом (число не больше 9007199254740991)) то (2 не больше (длина результат)) иначе да
обеспечивает «у числа меньше десяти цифра одна, и это оно само» если число меньше 10 то (результат равен [число]) иначе да
обеспечивает «у числа меньше десяти цифра ровно одна» если число меньше 10 то ((длина результат) равен 1) иначе да
пример «Три цифры»
дано число равно 507
ожидается [5, 0, 7]
тотальная функция «Шаг суммы цифр»
принимает акк: число, цифра: число
возвращает число
обеспечивает «шаг суммы цифр прибавляет ровно цифру» результат равен (акк плюс цифра)
пример «Прибавили цифру»
дано акк равно 5
дано цифра равно 7
ожидается 12
функция «Сумма цифр»
принимает число: число
возвращает число
обеспечивает «у однозначного целого сумма цифр — оно само» если ((число не меньше 0) и притом (число меньше 10) и притом ((число остаток от 1) равен 0)) то (результат равен число) иначе да
обеспечивает «сумма цифр сохраняет остаток от девяти» если ((число не меньше 0) и притом (число не больше 9007199254740991) и притом ((число остаток от 1) равен 0)) то ((результат остаток от 9) равен (число остаток от 9)) иначе да
пример «507»
дано число равно 507
ожидается 12
| Function | Termination | Claims |
|---|---|---|
| «Абсолютное значение» | доказано композицией | доказано 3 из 5; «модуль не меньше самого числа, когда число неположительно» — сетка; «модуль не меньше противоположного» — сетка |
| «Знак» | доказано композицией | доказано 5 из 6; «знак, умноженный на модуль, даёт само число» — сетка |
| «Минимум двух» | доказано композицией | доказано 4 из 6; «минимум не больше первого числа, когда первое не больше второго» — сетка; «минимум не больше второго числа, когда числа сравнимы» — сетка |
| «Максимум двух» | доказано композицией | доказано 4 из 6; «максимум не меньше первого числа, когда второе не больше первого» — сетка; «максимум не меньше второго числа, когда числа сравнимы» — сетка |
| «Ограничить» | доказано композицией | доказано 5 из 5 |
| «Целочисленное деление» | доказано композицией | доказано 1 из 2; «частное и остаток восстанавливают делимое» — сетка |
| «Целая часть» | доказано композицией | доказано 1 из 3; «на конечном числе целая часть цела и отстоит меньше чем на единицу» — сетка; «на неотрицательном целая часть не больше самого числа и отстаёт от него меньше чем на единицу» — сетка |
| «Чётное» | доказано композицией | доказано 1 из 2; «у соседних целых чётность разная» — сетка |
| «Делится на» | доказано композицией | доказано 1 из 2; «делимость — это ровно то, что деление нацело восстанавливает число» — сетка |
| «НОД» | обещания нет | доказано 1 из 2; «общий делитель и правда делит оба числа» — сетка |
| «НОК» | обещания нет | доказано 2 из 3; «общее кратное и правда делится на оба числа» — сетка |
| «Степень» | доказано точным шагом | доказано 3 из 4; «единица в любой степени — единица» — сетка |
| «Факториал» | доказано точным шагом | доказано 4 из 5; «факториал не меньше самого числа» — сетка |
| «Цифры» | обещания нет | доказано 4 из 4 |
| «Шаг суммы цифр» | доказано композицией | доказано 1 из 1 |
| «Сумма цифр» | обещания нет | доказано 0 из 2; «у однозначного целого сумма цифр — оно само» — сетка; «сумма цифр сохраняет остаток от девяти» — сетка |
«Number tree»
flang/stdlib/numtree.flang — functions 6; the kernel ledger was taken from this version of the file
тип «Дерево чисел»
вариант «Пустое»
вариант «Развилка» содержит значение: число, меньшие: «Дерево чисел», большие: «Дерево чисел»
тотальная функция «Добавить число»
принимает дерево: «Дерево чисел», число: число
возвращает «Дерево чисел»
обеспечивает «добавленное число в дереве находится» «Есть число» от результат и число
обеспечивает «добавление растит дерево ровно на одно число» (длина («Обход по порядку» от результат)) равен (1 плюс (длина («Обход по порядку» от дерево)))
обеспечивает «в пустое дерево добавляется ровно одна развилка с этим числом» если (дерево равен (вариант «Пустое»)) то (результат равен (вариант «Развилка» с значение равным число и меньшие равным (вариант «Пустое») и большие равным (вариант «Пустое»))) иначе да
пример «В пустое дерево»
дано дерево равно вариант «Пустое»
дано число равно 5
ожидается вариант «Развилка» с значение равным 5 и меньшие равным (вариант «Пустое») и большие равным (вариант «Пустое»)
тотальная функция «Дерево из чисел»
принимает элементы: список числа
возвращает «Дерево чисел»
обеспечивает «в дереве ровно столько чисел, сколько в списке» (длина («Обход по порядку» от результат)) равен (длина элементы)
пример «Пустой список даёт пустое дерево»
дано элементы равно пустой список
ожидается вариант «Пустое»
тотальная функция «Есть число»
принимает дерево: «Дерево чисел», число: число
возвращает признак
обеспечивает «в пустом дереве не находится ничего» если (дерево равен (вариант «Пустое»)) то (результат равен нет) иначе да
обеспечивает «поиск не выдумывает чисел, а в дереве из одной развилки и не промахивается» (если результат то ((«Обход по порядку» от дерево) содержит число) иначе да) и притом (если (((«Обход по порядку» от дерево) содержит число) и притом ((«Высота» от дерево) не больше 1)) то результат иначе да)
пример «В пустом дереве нет ничего»
дано дерево равно вариант «Пустое»
дано число равно 1
ожидается нет
тотальная функция «Обход по порядку»
принимает дерево: «Дерево чисел»
возвращает список числа
обеспечивает «обход не короче высоты дерева» («Высота» от дерево) не больше (длина результат)
обеспечивает «у пустого дерева обход пуст» если (дерево равен (вариант «Пустое»)) то (результат равен пустой список) иначе да
пример «Пустое дерево — пустой список»
дано дерево равно вариант «Пустое»
ожидается пустой список
тотальная функция «Сортировать деревом»
принимает элементы: список числа
возвращает список числа
обеспечивает «сортировка деревом не теряет и не добавляет чисел» (длина результат) равен (длина элементы)
обеспечивает «отсортированное начинается наименьшим и кончается наибольшим» если (1 не больше (длина элементы)) то (((длина результат) равен (длина элементы)) и притом ((длина (отфильтровать результат где э → (э меньше (элемент 1 в результат)))) равен 0) и притом ((длина (отфильтровать результат где э → ((элемент (длина результат) в результат) меньше э))) равен 0)) иначе да
пример «Обратный порядок»
дано элементы равно [3, 1, 2]
ожидается [1, 2, 3]
тотальная функция «Высота»
принимает дерево: «Дерево чисел»
возвращает число
обеспечивает «высота дерева неотрицательна» результат не меньше 0
обеспечивает «у пустого дерева высота ноль» если (дерево равен (вариант «Пустое»)) то (результат равен 0) иначе да
обеспечивает «у непустого дерева высота не меньше единицы» если дерево равен (вариант «Пустое») то да иначе (1 не больше результат)
пример «У пустого дерева высота ноль»
дано дерево равно вариант «Пустое»
ожидается 0
| Function | Termination | Claims |
|---|---|---|
| «Добавить число» | доказано структурой | доказано 1 из 3; «добавленное число в дереве находится» — сетка; «добавление растит дерево ровно на одно число» — сетка |
| «Дерево из чисел» | доказано композицией | доказано 0 из 1; «в дереве ровно столько чисел, сколько в списке» — сетка |
| «Есть число» | доказано структурой | доказано 1 из 2; «поиск не выдумывает чисел, а в дереве из одной развилки и не промахивается» — сетка |
| «Обход по порядку» | доказано структурой | доказано 1 из 2; «обход не короче высоты дерева» — сетка |
| «Сортировать деревом» | доказано композицией | доказано 1 из 2; «отсортированное начинается наименьшим и кончается наибольшим» — сетка |
| «Высота» | доказано структурой | доказано 3 из 3 |
«Optional»
flang/stdlib/optional.flang — functions 11; the kernel ledger was taken from this version of the file
тип «Возможно» от «А»
вариант «Есть» содержит значение: «А»
вариант «Нет»
тотальная функция «Обернуть» от «А»
принимает значение: «А»
возвращает «Возможно» от «А»
обеспечивает «обёрнутое значение всегда есть» («Есть значение» от результат) равен да
пример «Число становится значением»
дано значение равно 7
ожидается вариант «Есть» с значение равным 7
тотальная функция «Есть значение» от «А»
принимает опция: «Возможно» от «А»
возвращает признак
обеспечивает «у пустой опции значения нет» (не (опция равен (вариант «Нет»))) или (результат равен нет)
обеспечивает «у непустой опции значение есть» (опция равен (вариант «Нет»)) или (результат равен да)
пример «Значение есть»
дано опция равно вариант «Есть» с значение равным 3
ожидается да
тотальная функция «Значение или запасное» от «А»
принимает опция: «Возможно» от «А», запасное: «А»
возвращает «А»
обеспечивает «у пустой опции берётся запасное» (не (опция равен (вариант «Нет»))) или (результат равен запасное)
обеспечивает «у полной опции берётся ровно то, что внутри» (опция равен (вариант «Нет»)) или (опция равен (вариант «Есть» с значение равным результат))
пример «Берётся значение»
дано опция равно вариант «Есть» с значение равным 3
дано запасное равно 99
ожидается 3
тотальная функция «Первый элемент» от «А»
принимает элементы: список «А»
возвращает «Возможно» от «А»
обеспечивает «первый элемент есть ровно у непустого списка» («Есть значение» от результат) равен ((длина элементы) больше 0)
пример «Голова непустого»
дано элементы равно [4, 5]
ожидается вариант «Есть» с значение равным 4
тотальная функция «Первый элемент или запасное» от «А»
принимает элементы: список «А», запасное: «А»
возвращает «А»
обеспечивает «у пустого списка — запасное, у непустого — ровно первый элемент» если ((длина элементы) равен 0) то (результат равен запасное) иначе (результат равен (элемент 1 в элементы))
обеспечивает «у пустого списка головы нет — берётся запасное» (не ((«Первый элемент» от элементы) равен (вариант «Нет»))) или (результат равен запасное)
обеспечивает «у непустого списка берётся ровно то, что в голове» ((«Первый элемент» от элементы) равен (вариант «Нет»)) или ((«Первый элемент» от элементы) равен (вариант «Есть» с значение равным результат))
пример «Список не пуст»
дано элементы равно [4, 5]
дано запасное равно 0
ожидается 4
тотальная функция «Последний элемент» от «А»
принимает элементы: список «А»
возвращает «Возможно» от «А»
обеспечивает «последний элемент есть ровно у непустого списка» («Есть значение» от результат) равен ((длина элементы) больше 0)
пример «Последний из трёх»
дано элементы равно [4, 5, 6]
ожидается вариант «Есть» с значение равным 6
тотальная функция «Последний элемент или запасное» от «А»
принимает элементы: список «А», запасное: «А»
возвращает «А»
обеспечивает «у пустого списка — запасное, у непустого — ровно последний элемент» если ((длина элементы) равен 0) то (результат равен запасное) иначе (результат равен (элемент (длина элементы) в элементы))
обеспечивает «у пустого списка хвоста нет — берётся запасное» (не ((«Последний элемент» от элементы) равен (вариант «Нет»))) или (результат равен запасное)
обеспечивает «у непустого списка берётся ровно то, что в конце» ((«Последний элемент» от элементы) равен (вариант «Нет»)) или ((«Последний элемент» от элементы) равен (вариант «Есть» с значение равным результат))
пример «Список не пуст»
дано элементы равно [4, 5]
дано запасное равно 0
ожидается 5
тотальная функция «Найти не меньше»
принимает элементы: список числа, порог: число
возвращает «Возможно» от числа
обеспечивает «значение есть ровно тогда, когда в списке нашлось не меньшее порога, и оно само не меньше порога» ((«Есть значение» от результат) равен (1 не больше (длина (отфильтровать элементы где э → (э не меньше порог))))) и притом (если («Есть значение» от результат) то ((«Значение или запасное» от результат и порог) не меньше порог) иначе да)
пример «Нашли первое подходящее»
дано элементы равно [1, 7, 9]
дано порог равно 5
ожидается вариант «Есть» с значение равным 7
тотальная функция «Найти не меньше или запасное»
принимает элементы: список числа, порог: число, запасное: число
возвращает число
обеспечивает «нашли — не меньше порога, не нашли — запасное» если (1 не больше (длина (отфильтровать элементы где э → (э не меньше порог)))) то (результат не меньше порог) иначе (результат равен запасное)
обеспечивает «не нашли — берётся запасное» (не ((«Найти не меньше» от элементы и порог) равен (вариант «Нет»))) или (результат равен запасное)
обеспечивает «нашли — берётся ровно найденное» ((«Найти не меньше» от элементы и порог) равен (вариант «Нет»)) или ((«Найти не меньше» от элементы и порог) равен (вариант «Есть» с значение равным результат))
пример «Нашли»
дано элементы равно [1, 7, 9]
дано порог равно 5
дано запасное равно 0
ожидается 7
тотальная функция «Умножить значение»
принимает опция: «Возможно» от числа, множитель: число
возвращает «Возможно» от числа
обеспечивает «умножение не создаёт и не теряет значения» («Есть значение» от результат) равен («Есть значение» от опция)
обеспечивает «значение и правда умножено» (опция равен (вариант «Нет»)) или (результат равен (вариант «Есть» с значение равным ((«Значение или запасное» от опция и 0) умножить на множитель)))
пример «Значение умножается»
дано опция равно вариант «Есть» с значение равным 3
дано множитель равно 4
ожидается вариант «Есть» с значение равным 12
тотальная функция «Первый удвоенный или запасное»
принимает элементы: список числа, запасное: число
возвращает число
обеспечивает «первый удваивается, а у пустого списка берётся запасное» если ((длина элементы) равен 0) то (результат равен запасное) иначе (результат равен ((«Значение или запасное» от («Первый элемент» от элементы) и 0) умножить на 2))
обеспечивает «у пустого списка удваивать нечего — берётся запасное» (не ((«Умножить значение» от («Первый элемент» от элементы) и 2) равен (вариант «Нет»))) или (результат равен запасное)
обеспечивает «у непустого списка берётся ровно удвоенное» ((«Умножить значение» от («Первый элемент» от элементы) и 2) равен (вариант «Нет»)) или ((«Умножить значение» от («Первый элемент» от элементы) и 2) равен (вариант «Есть» с значение равным результат))
пример «Есть первый»
дано элементы равно [3, 4]
дано запасное равно 0
ожидается 6
| Function | Termination | Claims |
|---|---|---|
| «Обернуть» | доказано композицией | доказано 1 из 1 |
| «Есть значение» | доказано композицией | доказано 2 из 2 |
| «Значение или запасное» | доказано композицией | доказано 2 из 2 |
| «Первый элемент» | доказано композицией | доказано 0 из 1; «первый элемент есть ровно у непустого списка» — сетка |
| «Первый элемент или запасное» | доказано композицией | доказано 2 из 3; «у пустого списка — запасное, у непустого — ровно первый элемент» — сетка |
| «Последний элемент» | доказано композицией | доказано 0 из 1; «последний элемент есть ровно у непустого списка» — сетка |
| «Последний элемент или запасное» | доказано композицией | доказано 2 из 3; «у пустого списка — запасное, у непустого — ровно последний элемент» — сетка |
| «Найти не меньше» | доказано структурой | доказано 0 из 1; «значение есть ровно тогда, когда в списке нашлось не меньшее порога, и оно само не меньше порога» — сетка |
| «Найти не меньше или запасное» | доказано композицией | доказано 2 из 3; «нашли — не меньше порога, не нашли — запасное» — сетка |
| «Умножить значение» | доказано композицией | доказано 2 из 2 |
| «Первый удвоенный или запасное» | доказано композицией | доказано 2 из 3; «первый удваивается, а у пустого списка берётся запасное» — сетка |
«Postgres»
flang/stdlib/postgres.flang — functions 67; the kernel ledger was taken from this version of the file
тип «Поле»
вариант «Поле» содержит текст: строка
тип «Беда базы»
вариант «Беда» содержит важность: строка, код: строка, сообщение: строка
тип «Весть»
вариант «Готов» содержит лад: строка
вариант «Вход разрешён»
вариант «Нужен пароль»
вариант «Вход не поддержан» содержит способ: число
вариант «Нужен SASL» содержит способы: строка
вариант «Продолжение SASL» содержит вызов: строка
вариант «Конец SASL» содержит проверка: строка
вариант «Настройка» содержит имя: строка, значение: строка
вариант «Ключ отмены»
вариант «Разбор принят»
вариант «Привязка принята»
вариант «Строка данных» содержит ячейки: список «Поле»
вариант «Дело сделано» содержит метка: строка
вариант «Отказ базы» содержит беда: «Беда базы»
вариант «Замечание базы» содержит беда: «Беда базы»
вариант «Запрос был пуст»
вариант «Данных не будет»
вариант «Портал приостановлен»
вариант «Описание строк» содержит колонок: число
вариант «Весть незнакома» содержит метка: строка
тип «Разбор вести»
вариант «Весть разобрана» содержит весть: «Весть», остальное: список строки
вариант «Вести мало»
вариант «Кадр испорчен» содержит причина: строка
тип «Разбор потока»
вариант «Поток разобран» содержит вести: список «Весть», остальное: список строки
вариант «Поток оборван» содержит вести: список «Весть», причина: строка
тип «Значение»
вариант «Текстом» содержит текст: строка
вариант «Целым» содержит значение: число
вариант «Истиной» содержит признак: признак
вариант «Дробным текстом» содержит текст: строка
вариант «Тип не разобран» содержит оид: число, текст: строка
тотальная функция «Кадр»
принимает метка: строка, тело: строка
возвращает «Печать»
обеспечивает «кадр — метка, четыре октета длины и тело, а названное непечатаемым число есть та самая длина» разбор результат
случай вариант «Напечатано» с текст как текст
то ((«Байтов в тексте» от текст) равен ((«Байтов в тексте» от метка) плюс (4 плюс («Байтов в тексте» от тело)))) и притом (текст начинается с метка)
случай вариант «Число непечатаемо» с значение как названо
то названо равен (4 плюс («Байтов в тексте» от тело))
обеспечивает «записанная в кадре длина читается обратно и равна четырём плюс тело» разбор результат
случай вариант «Напечатано» с текст как текст
то (не ((длина метка) равен 1)) или ((«Число из целого» от («Взять целое» от (хвост («Знаки текста» от текст)) и 4 и 0)) равен (4 плюс («Байтов в тексте» от тело)))
случай вариант «Число непечатаемо» с значение как названо
то да
обеспечивает «печатаемая длина даёт кадр из метки, четырёх октетов длины и тела» (не («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от тело)))) или (результат равен (вариант «Напечатано» с текст равным (соединить (соединить метка с («Четыре октета» от (4 плюс («Байтов в тексте» от тело)))) с тело)))
обеспечивает «непечатаемая длина названа числом, и это та самая длина» («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от тело))) или (результат равен (вариант «Число непечатаемо» с значение равным (4 плюс («Байтов в тексте» от тело))))
пример «пустое тело — только длина»
дано метка равно "S"
дано тело равно ""
ожидается вариант «Напечатано» с текст равным "S\u0000\u0000\u0000\u0004"
тотальная функция «Пуск»
принимает пользователь: строка, база: строка
возвращает «Печать»
обеспечивает «пусковое сообщение — четыре октета длины и тело, и записанная длина есть весь его размер в байтах» разбор результат
случай вариант «Напечатано» с текст как текст
то ((«Байтов в тексте» от текст) равен (4 плюс («Байтов в тексте» от («Тело пуска» от пользователь и база)))) и притом ((«Число из целого» от («Взять целое» от («Знаки текста» от текст) и 4 и 0)) равен («Байтов в тексте» от текст))
случай вариант «Число непечатаемо» с значение как названо
то названо равен (4 плюс («Байтов в тексте» от («Тело пуска» от пользователь и база)))
обеспечивает «печатаемая длина даёт пуск из четырёх октетов длины и тела» (не («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от («Тело пуска» от пользователь и база))))) или (результат равен (вариант «Напечатано» с текст равным (соединить («Четыре октета» от (4 плюс («Байтов в тексте» от («Тело пуска» от пользователь и база)))) с («Тело пуска» от пользователь и база))))
обеспечивает «непечатаемая длина пуска названа числом, и это его размер вместе с длиной» («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от («Тело пуска» от пользователь и база)))) или (результат равен (вариант «Число непечатаемо» с значение равным (4 плюс («Байтов в тексте» от («Тело пуска» от пользователь и база)))))
пример «пуск называет пользователя и базу»
дано пользователь равно "f"
дано база равно "p"
ожидается вариант «Напечатано» с текст равным "\u0000\u0000\u0000\u001B\u0000\u0003\u0000\u0000user\u0000f\u0000database\u0000p\u0000\u0000"
тотальная функция «Тело пуска»
принимает пользователь: строка, база: строка
возвращает строка
обеспечивает «тело пуска длиннее обоих имён на двадцать один знак» ((длина результат) равен (((длина пользователь) плюс (длина база)) плюс 21))
обеспечивает «тело пуска начинается версией протокола» (результат начинается с (соединить («Два октета» от 3) с («Два октета» от 0)))
пример «версия протокола три ноль, потом пары»
дано пользователь равно "f"
дано база равно "p"
ожидается "\u0000\u0003\u0000\u0000user\u0000f\u0000database\u0000p\u0000\u0000"
тотальная функция «Простой запрос»
принимает запрос: строка
возвращает «Печать»
обеспечивает «простой запрос едет буквой Q, а вместе с длиной и завершающим нулём весит на шесть байтов больше самого запроса» разбор результат
случай вариант «Напечатано» с текст как текст
то (текст начинается с "Q") и притом ((«Байтов в тексте» от текст) равен (6 плюс («Байтов в тексте» от запрос)))
случай вариант «Число непечатаемо» с значение как названо
то названо равен (5 плюс («Байтов в тексте» от запрос))
обеспечивает «простой запрос едет кадром Q со строкой с нулём» (не («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от («Строка с нулём» от запрос))))) или (результат равен (вариант «Напечатано» с текст равным (соединить (соединить "Q" с («Четыре октета» от (4 плюс («Байтов в тексте» от («Строка с нулём» от запрос))))) с («Строка с нулём» от запрос))))
обеспечивает «непечатаемая длина простого запроса названа числом» («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от («Строка с нулём» от запрос)))) или (результат равен (вариант «Число непечатаемо» с значение равным (4 плюс («Байтов в тексте» от («Строка с нулём» от запрос)))))
пример «запрос едет буквой Q»
дано запрос равно "a"
ожидается вариант «Напечатано» с текст равным "Q\u0000\u0000\u0000\u0006a\u0000"
тотальная функция «Начало SASL»
принимает способ: строка, ответ: строка
возвращает «Печать»
обеспечивает «первое сообщение SASL едет буквой p, а вместе с двумя длинами, именем способа и его нулём весит на десять байтов больше способа и ответа вместе» разбор результат
случай вариант «Напечатано» с текст как текст
то (текст начинается с "p") и притом ((«Байтов в тексте» от текст) равен ((10 плюс («Байтов в тексте» от способ)) плюс («Байтов в тексте» от ответ)))
случай вариант «Число непечатаемо» с значение как названо
то да
обеспечивает «имя способа стоит сразу за длиной кадра» разбор результат
случай вариант «Напечатано» с текст как текст
то не (текст начинается с (соединить "p" с («Четыре октета» от ((10 плюс («Байтов в тексте» от способ)) плюс («Байтов в тексте» от ответ))))) или (текст начинается с (соединить (соединить "p" с («Четыре октета» от (((10 плюс («Байтов в тексте» от способ)) плюс («Байтов в тексте» от ответ)) минус 1))) с способ))
случай вариант «Число непечатаемо» с значение как названо
то да
обеспечивает «печатаемая длина ответа даёт кадр p со способом, длиной ответа и ответом» (не («Четыре октета печатаются» от («Байтов в тексте» от ответ))) или (результат равен («Кадр» от "p" и (соединить (соединить («Строка с нулём» от способ) с («Четыре октета» от («Байтов в тексте» от ответ))) с ответ)))
обеспечивает «непечатаемая длина ответа названа своим числом» («Четыре октета печатаются» от («Байтов в тексте» от ответ)) или (результат равен (вариант «Число непечатаемо» с значение равным («Байтов в тексте» от ответ)))
пример «первое сообщение SCRAM — разговор из RFC 7677, кадр как его шлёт libpq»
дано способ равно "SCRAM-SHA-256"
дано ответ равно "n,,n=,r=abcdefghijkl"
ожидается вариант «Напечатано» с текст равным "p\u0000\u0000\u0000*SCRAM-SHA-256\u0000\u0000\u0000\u0000\u0014n,,n=,r=abcdefghijkl"
тотальная функция «Ответ SASL»
принимает ответ: строка
возвращает «Печать»
обеспечивает «ответ SASL едет буквой p, а вместе с длиной весит на пять байтов больше самого ответа» разбор результат
случай вариант «Напечатано» с текст как текст
то (текст начинается с "p") и притом ((«Байтов в тексте» от текст) равен (5 плюс («Байтов в тексте» от ответ)))
случай вариант «Число непечатаемо» с значение как названо
то названо равен (4 плюс («Байтов в тексте» от ответ))
обеспечивает «за буквой и длиной идёт сам ответ, а не что-нибудь ещё» разбор результат
случай вариант «Напечатано» с текст как текст
то текст равен (соединить (соединить "p" с («Четыре октета» от (4 плюс («Байтов в тексте» от ответ)))) с ответ)
случай вариант «Число непечатаемо» с значение как названо
то да
обеспечивает «ответ SASL едет кадром p с самим ответом» (не («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от ответ)))) или (результат равен (вариант «Напечатано» с текст равным (соединить (соединить "p" с («Четыре октета» от (4 плюс («Байтов в тексте» от ответ)))) с ответ)))
обеспечивает «непечатаемая длина ответа SASL названа числом» («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от ответ))) или (результат равен (вариант «Число непечатаемо» с значение равным (4 плюс («Байтов в тексте» от ответ))))
пример «последнее сообщение клиента едет буквой p и без имени способа»
дано ответ равно "c=biws,r=ab,p=cd"
ожидается вариант «Напечатано» с текст равным "p\u0000\u0000\u0000\u0014c=biws,r=ab,p=cd"
тотальная функция «Пароль открытым текстом»
принимает пароль: строка
возвращает «Печать»
обеспечивает «пароль едет малой буквой p, а вместе с длиной и завершающим нулём весит на шесть байтов больше самого пароля» разбор результат
случай вариант «Напечатано» с текст как текст
то (текст начинается с "p") и притом ((«Байтов в тексте» от текст) равен (6 плюс («Байтов в тексте» от пароль)))
случай вариант «Число непечатаемо» с значение как названо
то названо равен (5 плюс («Байтов в тексте» от пароль))
обеспечивает «пароль едет кадром p со строкой с нулём» (не («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от («Строка с нулём» от пароль))))) или (результат равен (вариант «Напечатано» с текст равным (соединить (соединить "p" с («Четыре октета» от (4 плюс («Байтов в тексте» от («Строка с нулём» от пароль))))) с («Строка с нулём» от пароль))))
обеспечивает «непечатаемая длина пароля названа числом» («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от («Строка с нулём» от пароль)))) или (результат равен (вариант «Число непечатаемо» с значение равным (4 плюс («Байтов в тексте» от («Строка с нулём» от пароль)))))
пример «пароль едет малой буквой p»
дано пароль равно "a"
ожидается вариант «Напечатано» с текст равным "p\u0000\u0000\u0000\u0006a\u0000"
тотальная функция «Прощание»
возвращает «Печать»
обеспечивает «прощание — буква X и записанная длина четыре, а всего пять байтов» разбор результат
случай вариант «Напечатано» с текст как текст
то (текст равен "X\u0000\u0000\u0000\u0004") и притом ((«Число из целого» от («Взять целое» от (хвост («Знаки текста» от текст)) и 4 и 0)) равен ((«Байтов в тексте» от текст) минус 1))
случай вариант «Число непечатаемо» с значение как названо
то нет
пример «прощание — четыре байта длины и буква X»
ожидается вариант «Напечатано» с текст равным "X\u0000\u0000\u0000\u0004"
тотальная функция «Согласование»
возвращает «Печать»
обеспечивает «согласование — буква S и записанная длина четыре, а всего пять байтов» разбор результат
случай вариант «Напечатано» с текст как текст
то (текст равен "S\u0000\u0000\u0000\u0004") и притом ((«Число из целого» от («Взять целое» от (хвост («Знаки текста» от текст)) и 4 и 0)) равен ((«Байтов в тексте» от текст) минус 1))
случай вариант «Число непечатаемо» с значение как названо
то нет
пример «согласование — буква S без тела»
ожидается вариант «Напечатано» с текст равным "S\u0000\u0000\u0000\u0004"
тотальная функция «Подготовка»
принимает запрос: строка
возвращает «Печать»
обеспечивает «подготовка едет буквой P с безымянным запросом и без объявленных типов: на девять байтов больше самого запроса» разбор результат
случай вариант «Напечатано» с текст как текст
то (текст начинается с "P") и притом ((«Байтов в тексте» от текст) равен (9 плюс («Байтов в тексте» от запрос)))
случай вариант «Число непечатаемо» с значение как названо
то названо равен (8 плюс («Байтов в тексте» от запрос))
обеспечивает «подготовка едет кадром P с безымянным запросом и нулём типов» (не («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от (соединить (соединить («Строка с нулём» от "") с («Строка с нулём» от запрос)) с («Два октета» от 0)))))) или (результат равен (вариант «Напечатано» с текст равным (соединить (соединить "P" с («Четыре октета» от (4 плюс («Байтов в тексте» от (соединить (соединить («Строка с нулём» от "") с («Строка с нулём» от запрос)) с («Два октета» от 0)))))) с (соединить (соединить («Строка с нулём» от "") с («Строка с нулём» от запрос)) с («Два октета» от 0)))))
обеспечивает «непечатаемая длина подготовки названа числом» («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от (соединить (соединить («Строка с нулём» от "") с («Строка с нулём» от запрос)) с («Два октета» от 0))))) или (результат равен (вариант «Число непечатаемо» с значение равным (4 плюс («Байтов в тексте» от (соединить (соединить («Строка с нулём» от "") с («Строка с нулём» от запрос)) с («Два октета» от 0))))))
пример «подготовка не объявляет типов параметров»
дано запрос равно "a"
ожидается вариант «Напечатано» с текст равным "P\u0000\u0000\u0000\u0009\u0000a\u0000\u0000\u0000"
тотальная функция «Привязка»
принимает значения: список строки
возвращает «Печать»
обеспечивает «привязка едет буквой B и весит на пять байтов больше своего тела, а непечатаемой бывает лишь от негодных значений или от негодной длины» разбор результат
случай вариант «Напечатано» с текст как текст
то ((текст начинается с "B") и притом («Значения привязываются» от значения)) и притом ((«Байтов в тексте» от текст) равен (5 плюс («Байтов в тексте» от («Тело привязки» от значения))))
случай вариант «Число непечатаемо» с значение как названо
то не ((«Значения привязываются» от значения) и притом («Четыре октета печатаются» от (4 плюс («Байтов в тексте» от («Тело привязки» от значения)))))
обеспечивает «негодные значения названы своим числом» («Значения привязываются» от значения) или (результат равен (вариант «Число непечатаемо» с значение равным (длина значения)))
обеспечивает «годные значения едут кадром B с телом привязки» (не («Значения привязываются» от значения)) или (результат равен («Кадр» от "B" и («Тело привязки» от значения)))
пример «привязка без параметров»
дано значения равно []
ожидается вариант «Напечатано» с текст равным "B\u0000\u0000\u0000\u000C\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
тотальная функция «Значения привязываются»
принимает значения: список строки
возвращает признак
обеспечивает «пустой список привязывается» ((не ((длина значения) равен 0)) или результат)
обеспечивает «список от ста двадцати восьми значений не привязывается» ((не ((длина значения) не меньше 128)) или (не результат))
пример «короткие значения годятся»
дано значения равно ["ab"]
ожидается да
тотальная функция «Тело привязки»
принимает значения: список строки
возвращает строка
обеспечивает «тело привязки — два безымянных имени, ноль форматов, число значений и ноль форматов ответа: восемь знаков сверх самих значений» (не ((длина значения) меньше 128)) или (((длина результат) равен (8 плюс (длина («Значения параметров» от значения)))) и притом ((«Байтов в тексте» от результат) равен (8 плюс («Байтов в тексте» от («Значения параметров» от значения)))))
пример «без параметров — четыре пары нулей»
дано значения равно []
ожидается "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
тотальная функция «Шаг значений параметров»
принимает набрано: список строки, значение: строка
возвращает список строки
обеспечивает «шаг удлиняет набранное ровно на один» (длина результат) равен ((длина набрано) плюс 1)
пример «шаг дописывает значение с четырьмя октетами длины впереди»
дано набрано равно []
дано значение равно "ab"
ожидается ["\u0000\u0000\u0000\u0002ab"]
тотальная функция «Значения параметров»
принимает значения: список строки
возвращает строка
обеспечивает «значения едут подряд, и каждое несёт впереди четыре октета своей длины» (не («Значения привязываются» от значения)) или ((длина результат) равен (свёртка значения начиная с 0 как набрано и значение → набрано плюс (4 плюс (длина значение))))
пример «два значения едут подряд»
дано значения равно ["a"]
ожидается "\u0000\u0000\u0000\u0001a"
тотальная функция «Значение с длиной впереди»
принимает значение: строка
возвращает строка
обеспечивает «перед значением стоят четыре октета его длины в байтах, и они читаются обратно тем же числом» (не («Четыре октета печатаются» от («Байтов в тексте» от значение))) или (((длина результат) равен (4 плюс (длина значение))) и притом ((«Число из целого» от («Взять целое» от («Знаки текста» от результат) и 4 и 0)) равен («Байтов в тексте» от значение)))
пример «перед значением стоит его длина в байтах»
дано значение равно "ab"
ожидается "\u0000\u0000\u0000\u0002ab"
тотальная функция «Исполнение»
возвращает «Печать»
обеспечивает «исполнение — буква E, безымянный портал, нулевой предел строк, и записанная длина сходится с размером» разбор результат
случай вариант «Напечатано» с текст как текст
то (текст равен "E\u0000\u0000\u0000\u0009\u0000\u0000\u0000\u0000\u0000") и притом ((«Число из целого» от («Взять целое» от (хвост («Знаки текста» от текст)) и 4 и 0)) равен ((«Байтов в тексте» от текст) минус 1))
случай вариант «Число непечатаемо» с значение как названо
то нет
пример «исполнение безымянного портала без предела»
ожидается вариант «Напечатано» с текст равным "E\u0000\u0000\u0000\u0009\u0000\u0000\u0000\u0000\u0000"
тотальная функция «Дополнить запрос»
принимает запрос: строка, надбавка: число, запас: неотрицательное
возвращает строка
обеспечивает «дополненный запрос остаётся началом» (результат начинается с запрос)
обеспечивает «дополнение не укорачивает запрос» ((длина запрос) не больше (длина результат))
обеспечивает «дополнение растит длину не больше чем на запас» ((длина результат) не больше ((длина запрос) плюс запас))
обеспечивает «пробелы сыплются, пока длина не станет записываемой, и перестают только когда запас вышел весь» («Четыре октета печатаются» от (надбавка плюс («Байтов в тексте» от результат))) или ((длина результат) равен ((длина запрос) плюс запас))
пример «годная длина не трогается»
дано запрос равно "a"
дано надбавка равно 6
дано запас равно 200
ожидается "a"
обеспечивает «вышедший запас оставляет запрос как есть» если (запас не больше 0) то (результат равен запрос) иначе да
тотальная функция «Разобрать весть»
принимает знаки: список строки
возвращает «Разбор вести»
обеспечивает «разобранная весть съедает из потока не меньше пяти знаков, а ждать велят лишь там, где знаков меньше, чем обещала длина» разбор результат
случай вариант «Весть разобрана» с весть как весть и остальное как дальше
то (длина дальше) не больше ((длина знаки) минус 5)
случай вариант «Вести мало»
то ((длина знаки) меньше 5) или ((длина знаки) меньше ((«Число из целого» от («Взять целое» от (хвост знаки) и 4 и 0)) плюс 1))
случай вариант «Кадр испорчен» с причина как причина
то не (причина равен "")
пример «готовность разбирается целиком»
дано знаки равно ["Z", "\u0000", "\u0000", "\u0000", "\u0005", "I"]
ожидается вариант «Весть разобрана» с весть равным (вариант «Готов» с лад равным "I") и остальное равным []
обеспечивает «меньше пяти знаков — вести мало» если ((длина знаки) меньше 5) то (результат равен (вариант «Вести мало»)) иначе да
обеспечивает «от пяти знаков весть разбирается по метке и длине» если не ((длина знаки) меньше 5) то (результат равен («Разобрать весть по длине» от (элемент 1 в знаки) и («Взять целое» от (хвост знаки) и 4 и 0))) иначе да
тотальная функция «Разобрать весть по длине»
принимает метка: строка, целое: «Разбор целого»
возвращает «Разбор вести»
обеспечивает «испорченная длина и длина меньше четырёх дают порчу кадра с названной причиной, и никак иначе» разбор результат
случай вариант «Кадр испорчен» с причина как причина
то не (причина равен "")
случай любое
то разбор целое
случай вариант «Целое испорчено»
то нет
случай вариант «Целое взято» с значение как сколько и остальное как дальше
то сколько не меньше 4
обеспечивает «испорченная длина названа порчей кадра» (не (целое равен (вариант «Целое испорчено»))) или (результат равен (вариант «Кадр испорчен» с причина равным "длина сообщения пришла испорченной"))
обеспечивает «длина меньше четырёх названа порчей кадра» если (целое равен (вариант «Целое взято» с значение равным («Число из целого» от целое) и остальное равным («Остаток целого» от целое))) и притом ((«Число из целого» от целое) меньше 4) то (результат равен (вариант «Кадр испорчен» с причина равным "длина сообщения меньше четырёх")) иначе да
пример «испорченная длина — порча кадра»
дано метка равно "Z"
дано целое равно (вариант «Целое испорчено»)
ожидается вариант «Кадр испорчен» с причина равным "длина сообщения пришла испорченной"
тотальная функция «Разобрать весть по телу»
принимает метка: строка, набор: «Набор байтов»
возвращает «Разбор вести»
обеспечивает «весть выходит только из целого тела без знака замены, нехватка байтов значит ждать, а знак поперёк границы — порчу» разбор результат
случай вариант «Весть разобрана» с весть как весть и остальное как дальше
то разбор набор
случай вариант «Набрано» с взято как тело и остальное как хвостик
то (не («Есть порча» от тело)) и притом ((длина дальше) равен (длина хвостик))
случай любое
то нет
случай вариант «Вести мало»
то разбор набор
случай вариант «Байтов не хватило»
то да
случай любое
то нет
случай вариант «Кадр испорчен» с причина как причина
то разбор набор
случай вариант «Байтов не хватило»
то нет
случай любое
то не (причина равен "")
обеспечивает «нехватка байтов значит ждать» (не (набор равен (вариант «Байтов не хватило»))) или (результат равен (вариант «Вести мало»))
обеспечивает «знак поперёк границы назван порчей» (не (набор равен (вариант «Знак поперёк границы»))) или (результат равен (вариант «Кадр испорчен» с причина равным "знак не уместился в границу сообщения"))
пример «тело ещё не приехало»
дано метка равно "Z"
дано набор равно (вариант «Байтов не хватило»)
ожидается вариант «Вести мало»
тотальная функция «Разобрать тело»
принимает метка: строка, тело: список строки
возвращает «Весть»
обеспечивает «незнакомой буква названа своим именем и только тогда, когда она и вправду не из четырнадцати понятых» разбор результат
случай вариант «Весть незнакома» с метка как названо
то (названо равен метка) и притом (не (((((метка равен "Z") или (метка равен "R")) или ((метка равен "S") или (метка равен "K"))) или (((метка равен "1") или (метка равен "2")) или ((метка равен "C") или (метка равен "D")))) или ((((метка равен "E") или (метка равен "N")) или ((метка равен "I") или (метка равен "n"))) или ((метка равен "s") или (метка равен "T")))))
случай любое
то да
обеспечивает «буква Z даёт готовность с ладом из знаков тела» если (метка равен "Z") то (результат равен (вариант «Готов» с лад равным («Текст знаков» от тело))) иначе да
обеспечивает «буква R разбирается как вход» (метка равен "Z") или ((не (метка равен "R")) или (результат равен («Разобрать вход» от («Взять целое» от тело и 4 и 0))))
обеспечивает «буква S разбирается как настройка» (метка равен "Z") или ((метка равен "R") или ((не (метка равен "S")) или (результат равен («Разобрать настройку» от («Взять строку» от тело)))))
обеспечивает «буква K — ключ отмены» (метка равен "Z") или ((метка равен "R") или ((метка равен "S") или ((не (метка равен "K")) или (результат равен (вариант «Ключ отмены»)))))
пример «Z — готовность»
дано метка равно "Z"
дано тело равно ["I"]
ожидается вариант «Готов» с лад равным "I"
тотальная функция «Разобрать тело дальше»
принимает метка: строка, тело: список строки
возвращает «Весть»
обеспечивает «здесь понимают восемь букв, и всякая другая выходит наружу своим именем» разбор результат
случай вариант «Весть незнакома» с метка как названо
то (названо равен метка) и притом (не ((((метка равен "C") или (метка равен "D")) или ((метка равен "E") или (метка равен "N"))) или (((метка равен "I") или (метка равен "n")) или ((метка равен "s") или (метка равен "T")))))
случай любое
то да
обеспечивает «буква C даёт сделанное дело с текстом до нуля» если (метка равен "C") то (результат равен (вариант «Дело сделано» с метка равным («Текст до нуля» от тело))) иначе да
обеспечивает «буква D — строка данных» (метка равен "C") или ((не (метка равен "D")) или (результат равен (вариант «Строка данных» с ячейки равным («Разобрать поля» от («Взять целое» от тело и 2 и 0) и 1000))))
обеспечивает «буква E — отказ базы» (метка равен "C") или ((метка равен "D") или ((не (метка равен "E")) или (результат равен (вариант «Отказ базы» с беда равным («Разобрать беду» от тело)))))
обеспечивает «буква N — замечание базы» (метка равен "C") или ((метка равен "D") или ((метка равен "E") или ((не (метка равен "N")) или (результат равен (вариант «Замечание базы» с беда равным («Разобрать беду» от тело))))))
пример «C — дело сделано»
дано метка равно "C"
дано тело равно ["O", "K", "\u0000"]
ожидается вариант «Дело сделано» с метка равным "OK"
тотальная функция «Текст взятой строки»
принимает исход: «Разбор строки»
возвращает строка
обеспечивает «где нуля не нашлось, текста нет» (не (исход равен (вариант «Нуля не нашлось»))) или (результат равен "")
пример «взятая строка отдаёт свой текст»
дано исход равно (вариант «Строка взята» с текст равным "a" и остальное равным ["b"])
ожидается "a"
тотальная функция «Остаток взятой строки»
принимает исход: «Разбор строки»
возвращает список строки
обеспечивает «где нуля не нашлось, остатка нет» (не (исход равен (вариант «Нуля не нашлось»))) или (результат равен пустой список)
пример «взятая строка отдаёт свой остаток»
дано исход равно (вариант «Строка взята» с текст равным "a" и остальное равным ["b"])
ожидается ["b"]
тотальная функция «Метка сделанного дела»
принимает весть: «Весть»
возвращает строка
обеспечивает «весть о том, что данных не будет, метки не несёт» если весть равен (вариант «Данных не будет») то (результат равен "") иначе да
пример «сделанное дело отдаёт свою метку»
дано весть равно (вариант «Дело сделано» с метка равным "OK")
ожидается "OK"
тотальная функция «Беда вести»
принимает весть: «Весть»
возвращает «Беда базы»
обеспечивает «весть о том, что данных не будет, беды не несёт» если весть равен (вариант «Данных не будет») то (результат равен (вариант «Беда» с важность равным "" и код равным "" и сообщение равным "")) иначе да
пример «отказ отдаёт свою беду»
дано весть равно (вариант «Отказ базы» с беда равным (вариант «Беда» с важность равным "ERROR" и код равным "42P01" и сообщение равным "нет"))
ожидается вариант «Беда» с важность равным "ERROR" и код равным "42P01" и сообщение равным "нет"
тотальная функция «Ячейки строки данных»
принимает весть: «Весть»
возвращает список «Поле»
обеспечивает «весть о том, что данных не будет, ячеек не несёт» если весть равен (вариант «Данных не будет») то (результат равен пустой список) иначе да
пример «строка данных отдаёт свои ячейки»
дано весть равно (вариант «Строка данных» с ячейки равным [вариант «Поле» с текст равным "a"])
ожидается [вариант «Поле» с текст равным "a"]
тотальная функция «Имя настройки вести»
принимает весть: «Весть»
возвращает строка
обеспечивает «весть о том, что данных не будет, имени настройки не несёт» если весть равен (вариант «Данных не будет») то (результат равен "") иначе да
пример «настройка отдаёт своё имя»
дано весть равно (вариант «Настройка» с имя равным "a" и значение равным "b")
ожидается "a"
тотальная функция «Значение настройки вести»
принимает весть: «Весть»
возвращает строка
обеспечивает «весть о том, что данных не будет, значения настройки не несёт» если весть равен (вариант «Данных не будет») то (результат равен "") иначе да
пример «настройка отдаёт своё значение»
дано весть равно (вариант «Настройка» с имя равным "a" и значение равным "b")
ожидается "b"
тотальная функция «Остаток потока»
принимает поток: «Разбор потока»
возвращает список строки
обеспечивает «оборванный поток остатка не несёт» если поток равен (вариант «Поток оборван» с вести равным («Вести потока» от поток) и причина равным («Причина обрыва» от поток)) то (результат равен пустой список) иначе да
пример «разобранный поток отдаёт свой остаток»
дано поток равно (вариант «Поток разобран» с вести равным [] и остальное равным ["z"])
ожидается ["z"]
тотальная функция «Остаток целого»
принимает целое: «Разбор целого»
возвращает список строки
обеспечивает «у испорченного целого остатка нет» (не (целое равен (вариант «Целое испорчено»))) или (результат равен пустой список)
пример «взятое целое отдаёт свой остаток»
дано целое равно (вариант «Целое взято» с значение равным 3 и остальное равным ["z"])
ожидается ["z"]
тотальная функция «Разобрать вход»
принимает целое: «Разбор целого»
возвращает «Весть»
обеспечивает «нулём вход разрешён, тройкой просят пароль, десяткой предлагают SASL, одиннадцатой продолжают, двенадцатой кончают — и груз каждой из трёх приезжает целиком; всякий иной способ назван своим числом, а испорченное целое — минус единицей» разбор результат
случай вариант «Вход разрешён»
то разбор целое
случай вариант «Целое взято» с значение как способ и остальное как дальше
то способ равен 0
случай вариант «Целое испорчено»
то нет
случай вариант «Нужен пароль»
то разбор целое
случай вариант «Целое взято» с значение как способ и остальное как дальше
то способ равен 3
случай вариант «Целое испорчено»
то нет
случай вариант «Нужен SASL» с способы как названо
то разбор целое
случай вариант «Целое взято» с значение как способ и остальное как дальше
то (способ равен 10) и притом (названо равен («Текст до нуля» от дальше))
случай вариант «Целое испорчено»
то нет
случай вариант «Продолжение SASL» с вызов как названо
то разбор целое
случай вариант «Целое взято» с значение как способ и остальное как дальше
то (способ равен 11) и притом (названо равен («Текст знаков» от дальше))
случай вариант «Целое испорчено»
то нет
случай вариант «Конец SASL» с проверка как названо
то разбор целое
случай вариант «Целое взято» с значение как способ и остальное как дальше
то (способ равен 12) и притом (названо равен («Текст знаков» от дальше))
случай вариант «Целое испорчено»
то нет
случай вариант «Вход не поддержан» с способ как названо
то разбор целое
случай вариант «Целое взято» с значение как способ и остальное как дальше
то (названо равен способ) и притом (((не (способ равен 0)) и притом (не (способ равен 3))) и притом (((не (способ равен 10)) и притом (не (способ равен 11))) и притом (не (способ равен 12))))
случай вариант «Целое испорчено»
то названо равен (0 минус 1)
случай любое
то нет
обеспечивает «испорченное целое названо минус единицей» (не (целое равен (вариант «Целое испорчено»))) или (результат равен (вариант «Вход не поддержан» с способ равным (0 минус 1)))
обеспечивает «нулевой способ — вход разрешён» если (целое равен (вариант «Целое взято» с значение равным («Число из целого» от целое) и остальное равным («Остаток целого» от целое))) и притом ((«Число из целого» от целое) равен 0) то (результат равен (вариант «Вход разрешён»)) иначе да
обеспечивает «третий способ — просят пароль» если (целое равен (вариант «Целое взято» с значение равным («Число из целого» от целое) и остальное равным («Остаток целого» от целое))) и притом ((не ((«Число из целого» от целое) равен 0)) и притом ((«Число из целого» от целое) равен 3)) то (результат равен (вариант «Нужен пароль»)) иначе да
обеспечивает «десятый способ — предложен SASL, и список способов приезжает текстом до нуля» если (целое равен (вариант «Целое взято» с значение равным («Число из целого» от целое) и остальное равным («Остаток целого» от целое))) и притом (((не ((«Число из целого» от целое) равен 0)) и притом (не ((«Число из целого» от целое) равен 3))) и притом ((«Число из целого» от целое) равен 10)) то (результат равен (вариант «Нужен SASL» с способы равным («Текст до нуля» от («Остаток целого» от целое)))) иначе да
пример «ноль — вход разрешён»
дано целое равно (вариант «Целое взято» с значение равным 0 и остальное равным [])
ожидается вариант «Вход разрешён»
тотальная функция «Разобрать настройку»
принимает исход: «Разбор строки»
возвращает «Весть»
обеспечивает «имя настройки — это взятая строка, значение — текст до следующего нуля, а без нуля настройка безымянна и пуста» разбор исход
случай вариант «Строка взята» с текст как имя и остальное как дальше
то результат равен (вариант «Настройка» с имя равным имя и значение равным («Текст до нуля» от дальше))
случай вариант «Нуля не нашлось»
то результат равен (вариант «Настройка» с имя равным "" и значение равным "")
обеспечивает «без нуля настройка безымянна и пуста» (не (исход равен (вариант «Нуля не нашлось»))) или (результат равен (вариант «Настройка» с имя равным "" и значение равным ""))
обеспечивает «взятая строка становится именем настройки, а её остаток до следующего нуля — значением» если исход равен (вариант «Строка взята» с текст равным («Текст взятой строки» от исход) и остальное равным («Остаток взятой строки» от исход)) то (результат равен (вариант «Настройка» с имя равным («Текст взятой строки» от исход) и значение равным («Текст до нуля» от («Остаток взятой строки» от исход)))) иначе да
пример «имя и значение настройки»
дано исход равно (вариант «Строка взята» с текст равным "a" и остальное равным ["b", "\u0000"])
ожидается вариант «Настройка» с имя равным "a" и значение равным "b"
тотальная функция «Разобрать поля»
принимает целое: «Разбор целого», запас: неотрицательное
возвращает список «Поле»
обеспечивает «полей выходит не больше, чем обещало их число, и не больше запаса, а испорченное число полей не даёт ни одного» разбор целое
случай вариант «Целое взято» с значение как сколько и остальное как дальше
то ((длина результат) не больше сколько) и притом ((длина результат) не больше запас)
случай вариант «Целое испорчено»
то (длина результат) равен 0
обеспечивает «испорченное число полей не даёт ни одного поля» (не (целое равен (вариант «Целое испорчено»))) или ((длина результат) равен 0)
обеспечивает «целое число полей собирается с того места, где оно кончилось» если целое равен (вариант «Целое взято» с значение равным («Число из целого» от целое) и остальное равным («Остаток целого» от целое)) то (результат равен («Собрать поля» от («Остаток целого» от целое) и («Число из целого» от целое) и запас)) иначе да
пример «одно поле»
дано целое равно (вариант «Целое взято» с значение равным 1 и остальное равным ["\u0000", "\u0000", "\u0000",
"\u0001", "x"])
дано запас равно 1000
ожидается [вариант «Поле» с текст равным "x"]
тотальная функция «Собрать поля»
принимает знаки: список строки, сколько: число, запас: неотрицательное
возвращает список «Поле»
обеспечивает «полей не больше, чем просили» ((длина результат) не больше (если сколько не больше 0 то 0 иначе сколько))
обеспечивает «нулевое число полей не даёт ни одного» если (сколько не больше 0) то ((длина результат) равен 0) иначе да
обеспечивает «полей не больше запаса» ((длина результат) не больше запас)
обеспечивает «поле нулевой длины — тоже поле: пока просят и запас не вышел, оно выходит наружу» (не ((4 не больше (длина знаки)) и притом ((не (сколько не больше 0)) и притом (не (запас не больше 0))))) или ((не («Коды нулевые» от [элемент 1 в знаки, элемент 2 в знаки, элемент 3 в знаки, элемент 4 в знаки])) или (1 не больше (длина результат)))
пример «нулевое число полей — пустой список»
дано знаки равно []
дано сколько равно 0
дано запас равно 1000
ожидается []
тотальная функция «Разобрать беду»
принимает тело: список строки
возвращает «Беда базы»
обеспечивает «метка S в начале тела становится важностью беды» не ((длина тело) больше 1 и притом ((элемент 1 в тело) равен "S")) или (результат.важность равен («Текст до нуля» от (хвост тело)))
обеспечивает «беда складывается из трёх полей тела, взятых по своим меткам» результат равен (вариант «Беда» с важность равным («Поле беды» от тело и "S" и 100) и код равным («Поле беды» от тело и "C" и 100) и сообщение равным («Поле беды» от тело и "M" и 100))
пример «важность, код и сообщение»
дано тело равно ["S", "E", "R", "R", "O", "R", "\u0000", "C", "4", "2", "P", "0", "1", "\u0000", "M", "н", "е", "т",
"\u0000", "\u0000"]
ожидается вариант «Беда» с важность равным "ERROR" и код равным "42P01" и сообщение равным "нет"
тотальная функция «Поле беды»
принимает тело: список строки, метка: строка, запас: неотрицательное
возвращает строка
обеспечивает «поле беды — текст до нуля сразу за искомой меткой» (не (((длина тело) больше 0) и притом (((длина метка) больше 0) и притом (не (запас не больше 0))))) или ((не (((элемент 1 в тело) равен метка) и притом (не ((код символа метка) равен 0)))) или (результат равен («Текст до нуля» от (хвост тело))))
обеспечивает «без запаса поля нет» (не (запас не больше 0)) или (результат равен "")
пример «первое ячейка находится»
дано тело равно ["S", "a", "\u0000", "\u0000"]
дано метка равно "S"
дано запас равно 100
ожидается "a"
тотальная функция «Разобрать поток»
принимает знаки: список строки, запас: неотрицательное
возвращает «Разбор потока»
обеспечивает «вестей выходит не больше запаса, остаток не длиннее входа, а оборван поток бывает только с названной причиной» разбор результат
случай вариант «Поток разобран» с вести как вести и остальное как дальше
то ((длина вести) не больше запас) и притом ((длина дальше) не больше (длина знаки))
случай вариант «Поток оборван» с вести как вести и причина как причина
то ((длина вести) не больше запас) и притом (не (причина равен ""))
обеспечивает «полный кадр готовности разбирается ровно в одну весть без остатка» разбор результат
случай вариант «Поток разобран» с вести как вести и остальное как дальше
то если ((длина знаки) равен 6) и притом (не (запас не больше 0))
то (не («Это готовность» от знаки)) или (((длина вести) равен 1) и притом ((длина дальше) равен 0))
иначе да
случай вариант «Поток оборван» с вести как вести и причина как причина
то если ((длина знаки) равен 6) и притом (не (запас не больше 0))
то не («Это готовность» от знаки)
иначе да
обеспечивает «пока вести мало, поток разобран без единой вести и вход не тронут» (не ((«Разобрать весть» от знаки) равен (вариант «Вести мало»))) или (результат равен (вариант «Поток разобран» с вести равным [] и остальное равным знаки))
пример «одна готовность и пустой хвост»
дано знаки равно ["Z", "\u0000", "\u0000", "\u0000", "\u0005", "I"]
дано запас равно 1000
ожидается вариант «Поток разобран» с вести равным [вариант «Готов» с лад равным "I"] и остальное равным []
тотальная функция «Приписать весть»
принимает весть: «Весть», поток: «Разбор потока»
возвращает «Разбор потока»
обеспечивает «приписка удлиняет список вестей ровно на одну, исхода потока не меняет и ни остатка, ни причины не трогает» разбор результат
случай вариант «Поток разобран» с вести как стало и остальное как дальше
то разбор поток
случай вариант «Поток разобран» с вести как было и остальное как хвост
то ((длина стало) равен ((длина было) плюс 1)) и притом ((длина дальше) равен (длина хвост))
случай любое
то нет
случай вариант «Поток оборван» с вести как стало и причина как причина
то разбор поток
случай вариант «Поток оборван» с вести как было и причина как былапричина
то ((длина стало) равен ((длина было) плюс 1)) и притом (причина равен былапричина)
случай любое
то нет
пример «весть встаёт первой»
дано весть равно (вариант «Данных не будет»)
дано поток равно (вариант «Поток разобран» с вести равным [] и остальное равным [])
ожидается вариант «Поток разобран» с вести равным [вариант «Данных не будет»] и остальное равным []
обеспечивает «к разобранному потоку весть приписывается спереди, а остаток остаётся тем же» если поток равен (вариант «Поток разобран» с вести равным («Вести потока» от поток) и остальное равным («Остаток потока» от поток)) то (результат равен (вариант «Поток разобран» с вести равным (приписать весть к («Вести потока» от поток)) и остальное равным («Остаток потока» от поток))) иначе да
обеспечивает «к оборванному потоку весть приписывается спереди, а причина остаётся той же» если поток равен (вариант «Поток оборван» с вести равным («Вести потока» от поток) и причина равным («Причина обрыва» от поток)) то (результат равен (вариант «Поток оборван» с вести равным (приписать весть к («Вести потока» от поток)) и причина равным («Причина обрыва» от поток))) иначе да
тотальная функция «Ответ дочитан»
принимает знаки: список строки
возвращает признак
обеспечивает «проверка на шесть знаков здесь лишняя: её делает сама проверка на готовность» результат равен («Это готовность» от («Последние» от знаки и 6))
обеспечивает «от шести знаков ответ дочитан ровно по готовности хвоста» ((длина знаки) меньше 6) или (результат равен («Это готовность» от («Последние» от знаки и 6)))
пример «хвост — готовность»
дано знаки равно ["a", "Z", "\u0000", "\u0000", "\u0000", "\u0005", "I"]
ожидается да
обеспечивает «короче шести знаков хвоста готовности не бывает» если ((длина знаки) меньше 6) то (результат равен нет) иначе да
обеспечивает «от шести знаков отвечает готовность хвоста» если не ((длина знаки) меньше 6) то (результат равен («Это готовность» от («Последние» от знаки и 6))) иначе да
тотальная функция «Это готовность»
принимает знаки: список строки
возвращает признак
обеспечивает «готовность — шесть знаков, из которых первые пять есть Z и длина пять; шестой не проверяется вовсе» (не ((длина («Текст знаков» от знаки)) равен (длина знаки))) или (результат равен (((длина знаки) равен 6) и притом ((«Текст знаков» от знаки) начинается с "Z\u0000\u0000\u0000\u0005")))
пример «шесть октетов готовности»
дано знаки равно ["Z", "\u0000", "\u0000", "\u0000", "\u0005", "I"]
ожидается да
обеспечивает «не шесть знаков — не готовность» если ((длина знаки) не равен 6) то (результат равен нет) иначе да
тотальная функция «Пароль спрошен»
принимает знаки: список строки
возвращает признак
обеспечивает «проверка на девять знаков здесь лишняя: её делает сама проверка на просьбу» результат равен («Это просьба о пароле» от («Последние» от знаки и 9))
обеспечивает «от девяти знаков пароль спрошен ровно по просьбе в хвосте» ((длина знаки) меньше 9) или (результат равен («Это просьба о пароле» от («Последние» от знаки и 9)))
пример «хвост — просьба о пароле»
дано знаки равно ["R", "\u0000", "\u0000", "\u0000", "\u0008", "\u0000", "\u0000", "\u0000", "\u0003"]
ожидается да
обеспечивает «короче девяти знаков хвоста просьбы не бывает» если ((длина знаки) меньше 9) то (результат равен нет) иначе да
обеспечивает «от девяти знаков отвечает просьба в хвосте» если не ((длина знаки) меньше 9) то (результат равен («Это просьба о пароле» от («Последние» от знаки и 9))) иначе да
тотальная функция «Это просьба о пароле»
принимает знаки: список строки
возвращает признак
обеспечивает «просьба о пароле — ровно девять знаков R 00 00 00 08 00 00 00 03, и ни один не оставлен на волю» (не ((длина («Текст знаков» от знаки)) равен (длина знаки))) или (результат равен ((«Текст знаков» от знаки) равен "R\u0000\u0000\u0000\u0008\u0000\u0000\u0000\u0003"))
пример «девять октетов просьбы»
дано знаки равно ["R", "\u0000", "\u0000", "\u0000", "\u0008", "\u0000", "\u0000", "\u0000", "\u0003"]
ожидается да
обеспечивает «не девять знаков — не просьба о пароле» если ((длина знаки) не равен 9) то (результат равен нет) иначе да
тотальная функция «Шаг поиска отказа»
принимает набрано: признак, весть: «Весть»
возвращает признак
обеспечивает «однажды найденный отказ уже не теряется» если набрано то (результат равен да) иначе да
обеспечивает «пока не найдено, отвечает сама весть» если не набрано то (результат равен («Это отказ» от весть)) иначе да
пример «найденный отказ уже не теряется»
дано набрано равно да
дано весть равно (вариант «Данных не будет»)
ожидается да
тотальная функция «Есть отказ»
принимает вести: список «Весть»
возвращает признак
обеспечивает «у пустого списка отказа нет» (не ((длина вести) равен 0)) или (не результат)
обеспечивает «на одной вести отказ — это отказ самой вести» (не ((длина вести) равен 1)) или (результат равен («Это отказ» от (элемент 1 в вести)))
пример «отказ виден»
дано вести равно [вариант «Отказ базы» с беда равным (вариант «Беда» с важность равным "ERROR" и код равным "42P01" и сообщение равным "нет")]
ожидается да
тотальная функция «Это отказ»
принимает весть: «Весть»
возвращает признак
обеспечивает «отказ узнаётся по варианту вести, и только по нему» разбор весть
случай вариант «Отказ базы» с беда как беда
то результат равен да
случай любое
то результат равен нет
пример «отказ есть отказ»
дано весть равно (вариант «Отказ базы» с беда равным (вариант «Беда» с важность равным "ERROR" и код равным "42P01" и сообщение равным "нет"))
ожидается да
обеспечивает «весть об отказе базы отказом и зовётся» если весть равен (вариант «Отказ базы» с беда равным («Беда вести» от весть)) то (результат равен да) иначе да
обеспечивает «весть о том, что данных не будет, отказом не зовётся» если весть равен (вариант «Данных не будет») то (результат равен нет) иначе да
тотальная функция «Шаг поиска разрешения»
принимает набрано: признак, весть: «Весть»
возвращает признак
обеспечивает «однажды найденное разрешение уже не теряется» если набрано то (результат равен да) иначе да
обеспечивает «пока не найдено, отвечает сама весть» если не набрано то (результат равен («Это разрешение» от весть)) иначе да
пример «найденное разрешение уже не теряется»
дано набрано равно да
дано весть равно (вариант «Данных не будет»)
ожидается да
тотальная функция «Вход прошёл»
принимает вести: список «Весть»
возвращает признак
обеспечивает «у пустого списка разрешения нет» (не ((длина вести) равен 0)) или (не результат)
обеспечивает «на одной вести оно — разрешение самой вести» (не ((длина вести) равен 1)) или (результат равен («Это разрешение» от (элемент 1 в вести)))
пример «разрешение видно»
дано вести равно [вариант «Вход разрешён»]
ожидается да
тотальная функция «Это разрешение»
принимает весть: «Весть»
возвращает признак
обеспечивает «разрешение узнаётся по варианту вести, и только по нему» разбор весть
случай вариант «Вход разрешён»
то результат равен да
случай любое
то результат равен нет
обеспечивает «разрешение входа узнаётся по варианту вести» (не (весть равен (вариант «Вход разрешён»))) или (результат равен да)
обеспечивает «весть о том, что данных не будет, разрешением не зовётся» если весть равен (вариант «Данных не будет») то (результат равен нет) иначе да
пример «разрешение»
дано весть равно (вариант «Вход разрешён»)
ожидается да
тотальная функция «Строки ответа»
принимает вести: список «Весть»
возвращает список строки
обеспечивает «строк выходит ровно столько, сколько среди вестей строк данных» (длина результат) равен (свёртка вести начиная с 0 как набрано и весть → набрано плюс (длина («Досыпать строку» от весть и [])))
пример «строка данных склеивается через табуляцию»
дано вести равно [
вариант «Строка данных» с ячейки равным [вариант «Поле» с текст равным "a", вариант «Поле» с текст равным "b"]]
ожидается ["a\tb"]
тотальная функция «Досыпать строку»
принимает весть: «Весть», собрано: список строки
возвращает список строки
обеспечивает «строка данных досыпается в конец ровно одна, прочее проносит собранное нетронутым, и собранное всегда остаётся началом» разбор весть
случай вариант «Строка данных» с ячейки как ячейки
то ((длина результат) равен ((длина собрано) плюс 1)) и притом ((соединить результат по "|") начинается с (соединить собрано по "|"))
случай любое
то ((длина результат) равен (длина собрано)) и притом ((соединить результат по "|") равен (соединить собрано по "|"))
пример «строка данных досыпается»
дано весть равно (вариант «Строка данных» с ячейки равным [вариант «Поле» с текст равным "a"])
дано собрано равно []
ожидается ["a"]
обеспечивает «строка данных досыпается строкой своих полей» если весть равен (вариант «Строка данных» с ячейки равным («Ячейки строки данных» от весть)) то (результат равен (добавить («Строка полей» от («Ячейки строки данных» от весть)) к собрано)) иначе да
обеспечивает «весть о том, что данных не будет, проносит собранное нетронутым» если весть равен (вариант «Данных не будет») то (результат равен собрано) иначе да
тотальная функция «Шаг строки полей»
принимает набрано: список строки, ячейка: «Поле»
возвращает список строки
обеспечивает «шаг удлиняет набранное ровно на один» (длина результат) равен ((длина набрано) плюс 1)
пример «шаг дописывает текст ячейки»
дано набрано равно []
дано ячейка равно (вариант «Поле» с текст равным "a")
ожидается ["a"]
тотальная функция «Строка полей»
принимает ячейки: список «Поле»
возвращает строка
обеспечивает «поля склеены табуляциями: длина есть сумма длин полей плюс разделители» (длина результат) равен (если (длина ячейки) равен 0 то 0 иначе (((свёртка ячейки начиная с 0 как набрано и ячейка → набрано плюс (длина («Текст поля» от ячейка))) плюс (длина ячейки)) минус 1))
пример «поля склеиваются через табуляцию»
дано ячейки равно [вариант «Поле» с текст равным "a", вариант «Поле» с текст равным "b"]
ожидается "a\tb"
тотальная функция «Текст поля»
принимает ячейка: «Поле»
возвращает строка
обеспечивает «текст поля — это записанный в поле текст» результат равен ячейка.текст
пример «текст поля»
дано ячейка равно (вариант «Поле» с текст равным "a")
ожидается "a"
тотальная функция «Итог дела»
принимает вести: список «Весть»
возвращает строка
обеспечивает «у пустого списка итога нет» ((не ((длина вести) равен 0)) или (результат равен ""))
обеспечивает «на одной вести итог — её же досыпка к пустому» ((не ((длина вести) равен 1)) или (результат равен («Досыпать метку» от (элемент 1 в вести) и "")))
пример «метка завершения»
дано вести равно [вариант «Дело сделано» с метка равным "INSERT 0 1"]
ожидается "INSERT 0 1"
тотальная функция «Досыпать метку»
принимает весть: «Весть», собрано: строка
возвращает строка
обеспечивает «метку берёт только весть о сделанном деле, прочее проносит собранное нетронутым» разбор весть
случай вариант «Дело сделано» с метка как метка
то результат равен метка
случай любое
то результат равен собрано
пример «метка берётся»
дано весть равно (вариант «Дело сделано» с метка равным "OK")
дано собрано равно ""
ожидается "OK"
обеспечивает «весть о сделанном деле отдаёт свою метку» если весть равен (вариант «Дело сделано» с метка равным («Метка сделанного дела» от весть)) то (результат равен («Метка сделанного дела» от весть)) иначе да
обеспечивает «весть о том, что данных не будет, проносит собранную метку нетронутой» если весть равен (вариант «Данных не будет») то (результат равен собрано) иначе да
тотальная функция «Текст отказа»
принимает вести: список «Весть»
возвращает строка
обеспечивает «текст отказа пуст ровно тогда, когда отказа среди вестей нет» (результат равен "") равен (не («Есть отказ» от вести))
пример «отказ читается состоянием и сообщением»
дано вести равно [вариант «Отказ базы» с беда равным (вариант «Беда» с важность равным "ERROR" и код равным "42P01" и сообщение равным "нет такой таблицы")]
ожидается "ERROR 42P01 нет такой таблицы"
тотальная функция «Досыпать отказ»
принимает весть: «Весть», собрано: строка
возвращает строка
обеспечивает «текст берёт только весть об отказе, прочее проносит собранное нетронутым» разбор весть
случай вариант «Отказ базы» с беда как беда
то результат равен («Текст беды» от беда)
случай любое
то результат равен собрано
пример «отказ берётся»
дано весть равно (вариант «Отказ базы» с беда равным (вариант «Беда» с важность равным "ERROR" и код равным "42P01" и сообщение равным "нет"))
дано собрано равно ""
ожидается "ERROR 42P01 нет"
обеспечивает «весть об отказе отдаёт текст своей беды» если весть равен (вариант «Отказ базы» с беда равным («Беда вести» от весть)) то (результат равен («Текст беды» от («Беда вести» от весть))) иначе да
обеспечивает «весть о том, что данных не будет, проносит собранный текст нетронутым» если весть равен (вариант «Данных не будет») то (результат равен собрано) иначе да
тотальная функция «Текст беды»
принимает беда: «Беда базы»
возвращает строка
обеспечивает «текст беды — важность, код и сообщение через два пробела, и начинается он с важности» разбор беда
случай вариант «Беда» с важность как важность и код как код и сообщение как сообщение
то ((длина результат) равен ((((длина важность) плюс (длина код)) плюс (длина сообщение)) плюс 2)) и притом (результат начинается с важность)
обеспечивает «текст беды складывается из важности, кода и сообщения через пробел» результат равен (соединить (соединить (соединить (соединить беда.важность с " ") с беда.код) с " ") с беда.сообщение)
пример «важность, код, сообщение»
дано беда равно (вариант «Беда» с важность равным "ERROR" и код равным "42P01" и сообщение равным "нет")
ожидается "ERROR 42P01 нет"
тотальная функция «Значение поля»
принимает оид: число, текст: строка
возвращает «Значение»
обеспечивает «логическая колонка истинна ровно на букве t» (не (оид равен 16)) или (результат равен (вариант «Истиной» с признак равным (текст равен "t")))
обеспечивает «дробная колонка остаётся текстом» (не ((оид равен 700) или (оид равен 701) или (оид равен 1700))) или (результат равен (вариант «Дробным текстом» с текст равным текст))
обеспечивает «двоичная строка приезжает нетронутой со своим номером» (не (оид равен 17)) или (результат равен (вариант «Тип не разобран» с оид равным оид и текст равным текст))
обеспечивает «целая колонка разбирается целым значением» (оид равен 16) или ((не ((оид равен 20) или (оид равен 21) или (оид равен 23))) или (результат равен («Целое значение» от текст и оид)))
обеспечивает «неразобранный тип приезжает со своим номером и нетронутым текстом» (оид равен 16) или (((оид равен 20) или (оид равен 21) или (оид равен 23)) или (((оид равен 700) или (оид равен 701) или (оид равен 1700)) или ((«Текстовый тип» от оид) или (результат равен (вариант «Тип не разобран» с оид равным оид и текст равным текст)))))
пример «текстовая колонка»
дано оид равно 25
дано текст равно "привет"
ожидается вариант «Текстом» с текст равным "привет"
тотальная функция «Текстовый тип»
принимает оид: число
возвращает признак
обеспечивает «текст — текстовый тип» (не (оид равен 25)) или результат
обеспечивает «переменная строка — текстовый тип» (не (оид равен 1043)) или результат
обеспечивает «логический — не текстовый тип» (не (оид равен 16)) или (не результат)
обеспечивает «целый — не текстовый тип» (не (оид равен 23)) или (не результат)
обеспечивает «двоичный — не текстовый тип» (не (оид равен 17)) или (не результат)
пример «текст»
дано оид равно 25
ожидается да
тотальная функция «Целое значение»
принимает текст: строка, оид: число
возвращает «Значение»
обеспечивает «пустой текст целым не становится и приезжает нетронутым» (не ((длина текст) равен 0)) или (результат равен (вариант «Тип не разобран» с оид равным оид и текст равным текст))
обеспечивает «одна цифра становится целым» (не ((длина текст) равен 1 и притом ("0123456789" содержит текст))) или (результат равен (вариант «Целым» с значение равным ((код символа текст) минус 48)))
пример «целое разобралось»
дано текст равно "7"
дано оид равно 23
ожидается вариант «Целым» с значение равным 7
тотальная функция «Вести потока»
принимает поток: «Разбор потока»
возвращает список «Весть»
обеспечивает «вестей выходит ровно столько, сколько поток успел разобрать — и у целого потока, и у оборванного» разбор поток
случай вариант «Поток разобран» с вести как вести и остальное как дальше
то (длина результат) равен (длина вести)
случай вариант «Поток оборван» с вести как вести и причина как причина
то (длина результат) равен (длина вести)
пример «разобранные вести»
дано поток равно (вариант «Поток разобран» с вести равным [вариант «Данных не будет»] и остальное равным [])
ожидается [вариант «Данных не будет»]
тотальная функция «Причина обрыва»
принимает поток: «Разбор потока»
возвращает строка
обеспечивает «у целого потока причины нет» если поток равен (вариант «Поток разобран» с вести равным («Вести потока» от поток) и остальное равным («Остаток потока» от поток)) то (результат равен "") иначе да
обеспечивает «у целого потока причины нет, у оборванного она — та самая, что записана» разбор поток
случай вариант «Поток разобран» с вести как вести и остальное как дальше
то результат равен ""
случай вариант «Поток оборван» с вести как вести и причина как причина
то результат равен причина
пример «целый поток обрыва не имеет»
дано поток равно (вариант «Поток разобран» с вести равным [] и остальное равным [])
ожидается ""
тотальная функция «Настройки потока»
принимает вести: список «Весть»
возвращает список строки
обеспечивает «пар выходит ровно столько, сколько среди вестей настроек» (длина результат) равен (свёртка вести начиная с 0 как набрано и весть → набрано плюс (длина («Досыпать настройку» от весть и [])))
пример «настройка выходит парой»
дано вести равно [вариант «Настройка» с имя равным "server_encoding" и значение равным "UTF8"]
ожидается ["server_encoding=UTF8"]
тотальная функция «Досыпать настройку»
принимает весть: «Весть», собрано: список строки
возвращает список строки
обеспечивает «настройка досыпается в конец одной парой из имени, знака равенства и значения, прочее проносит собранное нетронутым» разбор весть
случай вариант «Настройка» с имя как имя и значение как значение
то ((длина результат) равен ((длина собрано) плюс 1)) и притом ((элемент (длина результат) в результат) равен (соединить (соединить имя с "=") с значение))
случай любое
то ((длина результат) равен (длина собрано)) и притом ((соединить результат по "|") равен (соединить собрано по "|"))
пример «настройка досыпается»
дано весть равно (вариант «Настройка» с имя равным "a" и значение равным "b")
дано собрано равно []
ожидается ["a=b"]
обеспечивает «настройка досыпается парой имени и значения через знак равенства» если весть равен (вариант «Настройка» с имя равным («Имя настройки вести» от весть) и значение равным («Значение настройки вести» от весть)) то (результат равен (добавить (соединить (соединить («Имя настройки вести» от весть) с "=") с («Значение настройки вести» от весть)) к собрано)) иначе да
обеспечивает «весть о том, что данных не будет, проносит собранные настройки нетронутыми» если весть равен (вариант «Данных не будет») то (результат равен собрано) иначе да
| Function | Termination | Claims |
|---|---|---|
| «Кадр» | доказано композицией | доказано 2 из 4; «кадр — метка, четыре октета длины и тело, а названное непечатаемым число есть та самая длина» — сетка; «записанная в кадре длина читается обратно и равна четырём плюс тело» — сетка |
| «Пуск» | доказано композицией | доказано 2 из 3; «пусковое сообщение — четыре октета длины и тело, и записанная длина есть весь его размер в байтах» — сетка |
| «Тело пуска» | доказано композицией | доказано 0 из 2; «тело пуска длиннее обоих имён на двадцать один знак» — сетка; «тело пуска начинается версией протокола» — сетка |
| «Простой запрос» | доказано композицией | доказано 2 из 3; «простой запрос едет буквой Q, а вместе с длиной и завершающим нулём весит на шесть байтов больше самого запроса» — сетка |
| «Начало SASL» | доказано композицией | доказано 2 из 4; «первое сообщение SASL едет буквой p, а вместе с двумя длинами, именем способа и его нулём весит на десять байтов больше способа и ответа вместе» — сетка; «имя способа стоит сразу за длиной кадра» — сетка |
| «Ответ SASL» | доказано композицией | доказано 2 из 4; «ответ SASL едет буквой p, а вместе с длиной весит на пять байтов больше самого ответа» — сетка; «за буквой и длиной идёт сам ответ, а не что-нибудь ещё» — сетка |
| «Пароль открытым текстом» | доказано композицией | доказано 2 из 3; «пароль едет малой буквой p, а вместе с длиной и завершающим нулём весит на шесть байтов больше самого пароля» — сетка |
| «Прощание» | доказано композицией | доказано 1 из 1 |
| «Согласование» | доказано композицией | доказано 1 из 1 |
| «Подготовка» | доказано композицией | доказано 2 из 3; «подготовка едет буквой P с безымянным запросом и без объявленных типов: на девять байтов больше самого запроса» — сетка |
| «Привязка» | доказано композицией | доказано 2 из 3; «привязка едет буквой B и весит на пять байтов больше своего тела, а непечатаемой бывает лишь от негодных значений или от негодной длины» — сетка |
| «Значения привязываются» | доказано композицией | доказано 1 из 2; «пустой список привязывается» — сетка |
| «Тело привязки» | доказано композицией | доказано 0 из 1; «тело привязки — два безымянных имени, ноль форматов, число значений и ноль форматов ответа: восемь знаков сверх самих значений» — сетка |
| «Шаг значений параметров» | доказано композицией | доказано 1 из 1 |
| «Значения параметров» | доказано композицией | доказано 0 из 1; «значения едут подряд, и каждое несёт впереди четыре октета своей длины» — сетка |
| «Значение с длиной впереди» | доказано композицией | доказано 0 из 1; «перед значением стоят четыре октета его длины в байтах, и они читаются обратно тем же числом» — сетка |
| «Исполнение» | доказано композицией | доказано 1 из 1 |
| «Дополнить запрос» | доказано точным шагом | доказано 3 из 5; «дополнение растит длину не больше чем на запас» — сетка; «пробелы сыплются, пока длина не станет записываемой, и перестают только когда запас вышел весь» — сетка |
| «Разобрать весть» | доказано композицией | доказано 2 из 3; «разобранная весть съедает из потока не меньше пяти знаков, а ждать велят лишь там, где знаков меньше, чем обещала длина» — сетка |
| «Разобрать весть по длине» | доказано композицией | доказано 2 из 3; «испорченная длина и длина меньше четырёх дают порчу кадра с названной причиной, и никак иначе» — сетка |
| «Разобрать весть по телу» | доказано композицией | доказано 2 из 3; «весть выходит только из целого тела без знака замены, нехватка байтов значит ждать, а знак поперёк границы — порчу» — сетка |
| «Разобрать тело» | доказано композицией | доказано 4 из 5; «незнакомой буква названа своим именем и только тогда, когда она и вправду не из четырнадцати понятых» — сетка |
| «Разобрать тело дальше» | доказано композицией | доказано 4 из 5; «здесь понимают восемь букв, и всякая другая выходит наружу своим именем» — сетка |
| «Текст взятой строки» | доказано композицией | доказано 1 из 1 |
| «Остаток взятой строки» | доказано композицией | доказано 1 из 1 |
| «Метка сделанного дела» | доказано композицией | доказано 1 из 1 |
| «Беда вести» | доказано композицией | доказано 1 из 1 |
| «Ячейки строки данных» | доказано композицией | доказано 1 из 1 |
| «Имя настройки вести» | доказано композицией | доказано 1 из 1 |
| «Значение настройки вести» | доказано композицией | доказано 1 из 1 |
| «Остаток потока» | доказано композицией | доказано 1 из 1 |
| «Остаток целого» | доказано композицией | доказано 1 из 1 |
| «Разобрать вход» | доказано композицией | доказано 4 из 5; «нулём вход разрешён, тройкой просят пароль, десяткой предлагают SASL, одиннадцатой продолжают, двенадцатой кончают — и груз каждой из трёх приезжает целиком; всякий иной способ назван своим числом, а испорченное целое — минус единицей» — сетка |
| «Разобрать настройку» | доказано композицией | доказано 2 из 3; «имя настройки — это взятая строка, значение — текст до следующего нуля, а без нуля настройка безымянна и пуста» — сетка |
| «Разобрать поля» | доказано композицией | доказано 1 из 3; «полей выходит не больше, чем обещало их число, и не больше запаса, а испорченное число полей не даёт ни одного» — сетка; «целое число полей собирается с того места, где оно кончилось» — сетка |
| «Собрать поля» | доказано постоянным шагом | доказано 1 из 4; «полей не больше, чем просили» — сетка; «полей не больше запаса» — сетка; «поле нулевой длины — тоже поле: пока просят и запас не вышел, оно выходит наружу» — сетка |
| «Разобрать беду» | доказано композицией | доказано 1 из 2; «метка S в начале тела становится важностью беды» — сетка |
| «Поле беды» | доказано точным шагом | доказано 1 из 2; «поле беды — текст до нуля сразу за искомой меткой» — сетка |
| «Разобрать поток» | доказано точным шагом | доказано 1 из 3; «вестей выходит не больше запаса, остаток не длиннее входа, а оборван поток бывает только с названной причиной» — сетка; «полный кадр готовности разбирается ровно в одну весть без остатка» — сетка |
| «Приписать весть» | доказано композицией | доказано 0 из 3; «приписка удлиняет список вестей ровно на одну, исхода потока не меняет и ни остатка, ни причины не трогает» — сетка; «к разобранному потоку весть приписывается спереди, а остаток остаётся тем же» — сетка; «к оборванному потоку весть приписывается спереди, а причина остаётся той же» — сетка |
| «Ответ дочитан» | доказано композицией | доказано 3 из 4; «проверка на шесть знаков здесь лишняя: её делает сама проверка на готовность» — сетка |
| «Это готовность» | доказано композицией | доказано 1 из 2; «готовность — шесть знаков, из которых первые пять есть Z и длина пять; шестой не проверяется вовсе» — сетка |
| «Пароль спрошен» | доказано композицией | доказано 3 из 4; «проверка на девять знаков здесь лишняя: её делает сама проверка на просьбу» — сетка |
| «Это просьба о пароле» | доказано композицией | доказано 1 из 2; «просьба о пароле — ровно девять знаков R 00 00 00 08 00 00 00 03, и ни один не оставлен на волю» — сетка |
| «Шаг поиска отказа» | доказано композицией | доказано 2 из 2 |
| «Есть отказ» | доказано композицией | доказано 0 из 2; «у пустого списка отказа нет» — сетка; «на одной вести отказ — это отказ самой вести» — сетка |
| «Это отказ» | доказано композицией | доказано 2 из 3; «отказ узнаётся по варианту вести, и только по нему» — сетка |
| «Шаг поиска разрешения» | доказано композицией | доказано 2 из 2 |
| «Вход прошёл» | доказано композицией | доказано 0 из 2; «у пустого списка разрешения нет» — сетка; «на одной вести оно — разрешение самой вести» — сетка |
| «Это разрешение» | доказано композицией | доказано 2 из 3; «разрешение узнаётся по варианту вести, и только по нему» — сетка |
| «Строки ответа» | доказано композицией | доказано 0 из 1; «строк выходит ровно столько, сколько среди вестей строк данных» — сетка |
| «Досыпать строку» | доказано композицией | доказано 1 из 3; «строка данных досыпается в конец ровно одна, прочее проносит собранное нетронутым, и собранное всегда остаётся началом» — сетка; «строка данных досыпается строкой своих полей» — сетка |
| «Шаг строки полей» | доказано композицией | доказано 1 из 1 |
| «Строка полей» | доказано композицией | доказано 0 из 1; «поля склеены табуляциями: длина есть сумма длин полей плюс разделители» — сетка |
| «Текст поля» | доказано композицией | доказано 1 из 1 |
| «Итог дела» | доказано композицией | доказано 1 из 2; «на одной вести итог — её же досыпка к пустому» — сетка |
| «Досыпать метку» | доказано композицией | доказано 1 из 3; «метку берёт только весть о сделанном деле, прочее проносит собранное нетронутым» — сетка; «весть о сделанном деле отдаёт свою метку» — сетка |
| «Текст отказа» | доказано композицией | доказано 0 из 1; «текст отказа пуст ровно тогда, когда отказа среди вестей нет» — сетка |
| «Досыпать отказ» | доказано композицией | доказано 1 из 3; «текст берёт только весть об отказе, прочее проносит собранное нетронутым» — сетка; «весть об отказе отдаёт текст своей беды» — сетка |
| «Текст беды» | доказано композицией | доказано 1 из 2; «текст беды — важность, код и сообщение через два пробела, и начинается он с важности» — сетка |
| «Значение поля» | доказано композицией | доказано 5 из 5 |
| «Текстовый тип» | доказано композицией | доказано 2 из 5; «логический — не текстовый тип» — сетка; «целый — не текстовый тип» — сетка; «двоичный — не текстовый тип» — сетка |
| «Целое значение» | доказано композицией | доказано 1 из 2; «одна цифра становится целым» — сетка |
| «Вести потока» | доказано композицией | доказано 0 из 1; «вестей выходит ровно столько, сколько поток успел разобрать — и у целого потока, и у оборванного» — сетка |
| «Причина обрыва» | доказано композицией | доказано 1 из 2; «у целого потока причины нет, у оборванного она — та самая, что записана» — сетка |
| «Настройки потока» | доказано композицией | доказано 0 из 1; «пар выходит ровно столько, сколько среди вестей настроек» — сетка |
| «Досыпать настройку» | доказано композицией | доказано 1 из 3; «настройка досыпается в конец одной парой из имени, знака равенства и значения, прочее проносит собранное нетронутым» — сетка; «настройка досыпается парой имени и значения через знак равенства» — сетка |
«Protobuf»
flang/stdlib/protobuf.flang — functions 33; the kernel ledger was taken from this version of the file
тип «Итог varint»
вариант «Varint взят» содержит значение: число, остальное: список числа
вариант «Байты кончились»
вариант «Число шире 2^53»
тип «Итог тега»
вариант «Тег взят» содержит номер: число, тип: число, остальное: список числа
вариант «Байты тега кончились»
вариант «Тег шире 2^53»
тип «Поле провода»
вариант «Поле» содержит номер: число, тип: число, значение: число, байты: список числа
тип «Итог шага»
вариант «Поле взято» содержит графа: «Поле провода», остальное: список числа
вариант «Шаг сорван» содержит причина: строка
тип «Итог сообщения»
вариант «Сообщение разобрано» содержит графы: список «Поле провода»
вариант «Сообщение испорчено» содержит причина: строка, место: число
тотальная функция «Целое в отрезке»
принимает значение: число, верх: число
возвращает признак
обеспечивает «годное значение неотрицательно» (не результат) или (значение не меньше 0)
обеспечивает «годное значение не выше верха» (не результат) или (значение не больше верх)
обеспечивает «годное значение целое» (не результат) или (((значение остаток от 1) плюс 0) равен 0)
пример «255 в отрезке до 255»
дано значение равно 255
дано верх равно 255
ожидается да
тотальная функция «Октет годен»
принимает байт: число
возвращает признак
обеспечивает «годный октет неотрицателен» (не результат) или (байт не меньше 0)
обеспечивает «годный октет не больше 255» (не результат) или (байт не больше 255)
пример «255 — октет»
дано байт равно 255
ожидается да
тотальная функция «Октеты годны»
принимает байты: список числа
возвращает признак
обеспечивает «пусто — годно» если (длина байты) равен 0 то результат иначе да
обеспечивает «один байт годен ровно тогда, когда он октет» если (длина байты) равен 1 то (результат равен («Октет годен» от (элемент 1 в байты))) иначе да
пример «Пусто — годно»
дано байты равно пустой список
ожидается да
тотальная функция «Байты varint»
принимает значение: число, витков: неотрицательное
возвращает список числа
обеспечивает «байтов не больше витков» (длина результат) не больше витков
обеспечивает «без витков — пусто» если витков не больше 0 то ((длина результат) равен 0) иначе да
обеспечивает «при витках байт хотя бы один» если витков больше 0 то ((длина результат) не меньше 1) иначе да
пример «Без витков — пусто»
дано значение равно 300
дано витков равно 0
ожидается пустой список
тотальная функция «Varint правильно оформлен»
принимает байты: список числа
возвращает признак
обеспечивает «пусто — не varint» если (длина байты) равен 0 то (результат равен нет) иначе да
обеспечивает «один байт оформлен правильно ровно тогда, когда он меньше 128» если (длина байты) равен 1 то (результат равен ((элемент 1 в байты) меньше 128)) иначе да
пример «AC 02 оформлен правильно»
дано байты равно [172, 2]
ожидается да
тотальная функция «Закодировать varint»
принимает значение: неотрицательное
возвращает список числа
обеспечивает «каждый байт кроме последнего не меньше 128, последний меньше 128» «Varint правильно оформлен» от результат
обеспечивает «байтов не больше восьми» (длина результат) не больше 8
обеспечивает «байт хотя бы один» (длина результат) не меньше 1
обеспечивает «разбор закодированного возвращает значение и пустой остаток» («Разобрать varint» от результат) равен (вариант «Varint взят» с значение равным (значение плюс 0) и остальное равным пустой список)
пример «Ноль — один байт»
дано значение равно 0
ожидается [0]
тотальная функция «Собрать varint»
принимает байты: список числа, множитель: число, набрано: число, счёт: число
возвращает «Итог varint»
обеспечивает «пусто — байты кончились» если (длина байты) равен 0 то (результат равен (вариант «Байты кончились»)) иначе да
обеспечивает «девятый байт — отказ, что бы в нём ни было» если (счёт не меньше 8) и притом ((длина байты) больше 0) то (результат равен (вариант «Число шире 2^53»)) иначе да
обеспечивает «остаток взятого короче входа» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то (длина остальное) меньше (длина байты)
случай любое
то да
обеспечивает «конечное взятое значение не больше 2^53−1» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то (не ((значение минус значение) равен 0)) или (значение не больше 9007199254740991)
случай любое
то да
пример «Пусто — байты кончились»
дано байты равно пустой список
дано множитель равно 1
дано набрано равно 0
дано счёт равно 0
ожидается вариант «Байты кончились»
тотальная функция «Разобрать varint»
принимает байты: список числа
возвращает «Итог varint»
обеспечивает «пусто — байты кончились» если (длина байты) равен 0 то (результат равен (вариант «Байты кончились»)) иначе да
обеспечивает «остаток взятого короче входа» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то (длина остальное) меньше (длина байты)
случай любое
то да
обеспечивает «взятое из октетов значение лежит в отрезке неотрицательного» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то (не («Октеты годны» от байты)) или («Целое в отрезке» от значение и 9007199254740991)
случай любое
то да
пример «Ноль»
дано байты равно [0]
ожидается вариант «Varint взят» с значение равным 0 и остальное равным пустой список
тотальная функция «Байты тега»
принимает номер: число, провод: число
возвращает список числа
обеспечивает «байт хотя бы один» (длина результат) не меньше 1
обеспечивает «тег не длиннее восьми байт» (длина результат) не больше 8
пример «Поле 1, varint — восьмёрка»
дано номер равно 1
дано провод равно 0
ожидается [8]
тотальная функция «Закодировать тег»
принимает номер: неотрицательное, провод: число
возвращает список числа
обеспечивает «тег оформлен как varint» «Varint правильно оформлен» от результат
обеспечивает «тег не длиннее восьми байт» (длина результат) не больше 8
обеспечивает «тег из целого номера и типа провода читается обратно» (не ((«Целое в отрезке» от номер и 1125899906842623) и притом («Целое в отрезке» от провод и 7))) или ((«Разобрать тег» от результат) равен (вариант «Тег взят» с номер равным номер и тип равным провод и остальное равным пустой список))
пример «Поле 1, varint — восьмёрка»
дано номер равно 1
дано провод равно 0
ожидается [8]
тотальная функция «Тег из varint»
принимает итог: «Итог varint»
возвращает «Итог тега»
обеспечивает «отказы varint переходят в отказы тега, взятый varint — во взятый тег с тем же остатком» разбор итог
случай вариант «Varint взят» с значение как значение и остальное как дальше
то результат равен (вариант «Тег взят» с номер равным («Целочисленное деление» от значение и 8) и тип равным (значение остаток от 8) и остальное равным дальше)
случай вариант «Байты кончились»
то результат равен (вариант «Байты тега кончились»)
случай вариант «Число шире 2^53»
то результат равен (вариант «Тег шире 2^53»)
обеспечивает «кончившиеся байты дают кончившийся тег» если итог равен (вариант «Байты кончились») то (результат равен (вариант «Байты тега кончились»)) иначе да
пример «Восьмёрка — поле 1, тип 0»
дано итог равно вариант «Varint взят» с значение равным 8 и остальное равным [150, 1]
ожидается вариант «Тег взят» с номер равным 1 и тип равным 0 и остальное равным [150, 1]
тотальная функция «Разобрать тег»
принимает байты: список числа
возвращает «Итог тега»
обеспечивает «пусто — тега нет» если (длина байты) равен 0 то (результат равен (вариант «Байты тега кончились»)) иначе да
обеспечивает «тип тега из октетов неотрицателен и меньше восьми» разбор результат
случай вариант «Тег взят» с номер как номер и тип как провод и остальное как остальное
то (не («Октеты годны» от байты)) или ((провод не меньше 0) и притом (провод меньше 8))
случай любое
то да
обеспечивает «номер тега из октетов — неотрицательное целое» разбор результат
случай вариант «Тег взят» с номер как номер и тип как провод и остальное как остальное
то (не («Октеты годны» от байты)) или («Целое в отрезке» от номер и 1125899906842623)
случай любое
то да
обеспечивает «остаток взятого тега короче входа» разбор результат
случай вариант «Тег взят» с номер как номер и тип как провод и остальное как остальное
то (длина остальное) меньше (длина байты)
случай любое
то да
пример «Восьмёрка — поле 1, varint»
дано байты равно [8]
ожидается вариант «Тег взят» с номер равным 1 и тип равным 0 и остальное равным пустой список
тотальная функция «Байты младшим вперёд»
принимает значение: число, ширина: неотрицательное
возвращает список числа
обеспечивает «байтов ровно ширина» (не (((ширина остаток от 1) плюс 0) равен 0)) или ((длина результат) равен ширина)
обеспечивает «неотрицательное целое ложится октетами» (не ((значение не меньше 0) и притом (((значение остаток от 1) плюс 0) равен 0))) или («Октеты годны» от результат)
пример «Нулевая ширина — пусто»
дано значение равно 5
дано ширина равно 0
ожидается пустой список
тотальная функция «Закодировать fixed32»
принимает значение: неотрицательное
возвращает список числа
обеспечивает «ровно четыре байта» (длина результат) равен 4
обеспечивает «целое до 2^32 читается обратно с пустым остатком» (не («Целое в отрезке» от значение и 4294967295)) или ((«Разобрать fixed32» от результат) равен (вариант «Varint взят» с значение равным значение и остальное равным пустой список))
пример «Единица — младший байт вперёд»
дано значение равно 1
ожидается [1, 0, 0, 0]
тотальная функция «Закодировать fixed64»
принимает значение: неотрицательное
возвращает список числа
обеспечивает «ровно восемь байт» (длина результат) равен 8
обеспечивает «целое до 2^53−1 читается обратно с пустым остатком» (не («Целое в отрезке» от значение и 9007199254740991)) или ((«Разобрать fixed64» от результат) равен (вариант «Varint взят» с значение равным значение и остальное равным пустой список))
пример «Двойка — восемь байт, младший вперёд»
дано значение равно 2
ожидается [2, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Накопленное fixed»
принимает набрано: число, остальное: список числа
возвращает «Итог varint»
обеспечивает «шире 2^53−1 — отказ» если набрано больше 9007199254740991 то (результат равен (вариант «Число шире 2^53»)) иначе да
обеспечивает «в отрезке — взято с тем же остатком» если набрано больше 9007199254740991 то да иначе (результат равен (вариант «Varint взят» с значение равным набрано и остальное равным остальное))
пример «Единица с остатком»
дано набрано равно 1
дано остальное равно [9]
ожидается вариант «Varint взят» с значение равным 1 и остальное равным [9]
тотальная функция «Собрать младшим вперёд»
принимает байты: список числа, ширина: неотрицательное, множитель: число, набрано: число
возвращает «Итог varint»
обеспечивает «байтов меньше ширины — байты кончились» если (длина байты) меньше ширина то (результат равен (вариант «Байты кончились»)) иначе да
обеспечивает «нулевая ширина входа не трогает» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то (не (ширина не больше 0)) или ((длина остальное) равен (длина байты))
случай любое
то да
обеспечивает «взятое съедает ровно ширину» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то (не (((ширина остаток от 1) плюс 0) равен 0)) или (((длина байты) минус (длина остальное)) равен ширина)
случай любое
то да
пример «Ширина исчерпана — накопленное отдаётся с остатком»
дано байты равно [9]
дано ширина равно 0
дано множитель равно 256
дано набрано равно 1
ожидается вариант «Varint взят» с значение равным 1 и остальное равным [9]
тотальная функция «Разобрать fixed32»
принимает байты: список числа
возвращает «Итог varint»
обеспечивает «меньше четырёх байт — байты кончились» если (длина байты) меньше 4 то (результат равен (вариант «Байты кончились»)) иначе да
обеспечивает «взятое съедает ровно четыре байта» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то ((длина байты) минус (длина остальное)) равен 4
случай любое
то да
обеспечивает «взятое из октетов — целое до 2^32» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то (не («Октеты годны» от байты)) или («Целое в отрезке» от значение и 4294967295)
случай любое
то да
пример «Единица из четырёх байт»
дано байты равно [1, 0, 0, 0]
ожидается вариант «Varint взят» с значение равным 1 и остальное равным пустой список
тотальная функция «Разобрать fixed64»
принимает байты: список числа
возвращает «Итог varint»
обеспечивает «меньше восьми байт — байты кончились» если (длина байты) меньше 8 то (результат равен (вариант «Байты кончились»)) иначе да
обеспечивает «взятое съедает ровно восемь байт» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то ((длина байты) минус (длина остальное)) равен 8
случай любое
то да
обеспечивает «взятое из октетов — целое до 2^53−1» разбор результат
случай вариант «Varint взят» с значение как значение и остальное как остальное
то (не («Октеты годны» от байты)) или («Целое в отрезке» от значение и 9007199254740991)
случай любое
то да
пример «Двойка из восьми байт»
дано байты равно [2, 0, 0, 0, 0, 0, 0, 0]
ожидается вариант «Varint взят» с значение равным 2 и остальное равным пустой список
тотальная функция «Сцепить байты»
принимает первые: список числа, вторые: список числа
возвращает список числа
обеспечивает «длина сцепки — сумма длин» (длина результат) равен ((длина первые) плюс (длина вторые))
обеспечивает «пустой хвост ничего не меняет» если (длина вторые) равен 0 то (результат равен первые) иначе да
пример «Два и один»
дано первые равно [1, 2]
дано вторые равно [3]
ожидается [1, 2, 3]
тотальная функция «Первые байты»
принимает байты: список числа, сколько: число
возвращает список числа
обеспечивает «первых не больше, чем есть» (длина результат) не больше (длина байты)
обеспечивает «первых не больше, чем просили» (не («Целое в отрезке» от сколько и 9007199254740991)) или ((длина результат) не больше сколько)
пример «Два из трёх»
дано байты равно [1, 2, 3]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Байты без первых»
принимает байты: список числа, сколько: число
возвращает список числа
обеспечивает «остаток не длиннее входа» (длина результат) не больше (длина байты)
обеспечивает «первые и остаток вместе дают вход» («Сцепить байты» от («Первые байты» от байты и сколько) и результат) равен байты
пример «Без двух из трёх»
дано байты равно [1, 2, 3]
дано сколько равно 2
ожидается [3]
тотальная функция «Закодировать поле»
принимает графа: «Поле провода»
возвращает список числа
обеспечивает «годное поле читается обратно одним шагом с пустым остатком» (не («Поле годно» от графа)) или ((«Шаг разбора поля» от результат) равен (вариант «Поле взято» с графа равным графа и остальное равным пустой список))
обеспечивает «тип провода вне четырёх известных — пусто» разбор графа
случай вариант «Поле» с номер как номер и тип как провод и значение как значение и байты как байты
то ((провод равен 0) или ((провод равен 1) или ((провод равен 2) или (провод равен 5)))) или ((длина результат) равен 0)
пример «Поле 1, varint 150 — пример из документации protobuf»
дано графа равно вариант «Поле» с номер равным 1 и тип равным 0 и значение равным 150 и байты равным пустой список
ожидается [8, 150, 1]
тотальная функция «Закодировать сообщение»
принимает графы: список «Поле провода»
возвращает список числа
обеспечивает «без полей — пусто» если (длина графы) равен 0 то ((длина результат) равен 0) иначе да
обеспечивает «одно поле кодируется как само поле» если (длина графы) равен 1 то (результат равен («Закодировать поле» от (элемент 1 в графы))) иначе да
обеспечивает «годные поля читаются обратно тем же списком» (не («Поля годны» от графы)) или ((«Разобрать сообщение» от результат) равен (вариант «Сообщение разобрано» с графы равным графы))
пример «Без полей — пусто»
дано графы равно пустой список
ожидается пустой список
тотальная функция «Поле из числа»
принимает номер: число, провод: число, итог: «Итог varint»
возвращает «Итог шага»
обеспечивает «отказы переходят в срыв, взятое число — в поле без байтов с тем же остатком» разбор итог
случай вариант «Varint взят» с значение как значение и остальное как дальше
то результат равен (вариант «Поле взято» с графа равным (вариант «Поле» с номер равным номер и тип равным провод и значение равным значение и байты равным пустой список) и остальное равным дальше)
случай вариант «Байты кончились»
то результат равен (вариант «Шаг сорван» с причина равным "байты кончились")
случай вариант «Число шире 2^53»
то результат равен (вариант «Шаг сорван» с причина равным "число шире 2^53")
обеспечивает «кончившиеся байты срывают шаг» если итог равен (вариант «Байты кончились») то (результат равен (вариант «Шаг сорван» с причина равным "байты кончились")) иначе да
пример «Взятый varint становится полем без байтов»
дано номер равно 1
дано провод равно 0
дано итог равно вариант «Varint взят» с значение равным 150 и остальное равным [18]
ожидается вариант «Поле взято» с графа равным (вариант «Поле» с номер равным 1 и тип равным 0 и значение равным 150 и байты равным пустой список) и остальное равным [18]
тотальная функция «Поле из длины»
принимает номер: число, итог: «Итог varint»
возвращает «Итог шага»
обеспечивает «длина больше остатка — срыв, отказы длины — срыв» разбор итог
случай вариант «Varint взят» с значение как сколько и остальное как дальше
то (не (сколько больше (длина дальше))) или (результат равен (вариант «Шаг сорван» с причина равным "длина больше остатка"))
случай вариант «Байты кончились»
то результат равен (вариант «Шаг сорван» с причина равным "байты кончились")
случай вариант «Число шире 2^53»
то результат равен (вариант «Шаг сорван» с причина равным "число шире 2^53")
обеспечивает «у взятого поля длины значение равно числу байтов» разбор результат
случай вариант «Поле взято» с графа как графа и остальное как остальное
то графа.значение равен (длина графа.байты)
случай любое
то да
пример «Семь байт testing отрезаются от остатка»
дано номер равно 2
дано итог равно вариант «Varint взят» с значение равным 7 и остальное равным [116, 101, 115, 116, 105, 110, 103, 29]
ожидается вариант «Поле взято» с графа равным (вариант «Поле» с номер равным 2 и тип равным 2 и значение равным 7 и байты равным [116, 101, 115, 116, 105, 110, 103]) и остальное равным [29]
тотальная функция «Значение поля»
принимает номер: число, провод: число, байты: список числа
возвращает «Итог шага»
обеспечивает «тип провода вне 0, 1, 2 и 5 — срыв с названной причиной» ((провод равен 0) или ((провод равен 1) или ((провод равен 2) или (провод равен 5)))) или (результат равен (вариант «Шаг сорван» с причина равным "тип провода не опознан"))
обеспечивает «остаток взятого короче входа» разбор результат
случай вариант «Поле взято» с графа как графа и остальное как остальное
то (длина остальное) меньше (длина байты)
случай любое
то да
пример «Тип 0 — varint»
дано номер равно 1
дано провод равно 0
дано байты равно [150, 1]
ожидается вариант «Поле взято» с графа равным (вариант «Поле» с номер равным 1 и тип равным 0 и значение равным 150 и байты равным пустой список) и остальное равным пустой список
тотальная функция «Шаг разбора поля»
принимает байты: список числа
возвращает «Итог шага»
обеспечивает «пусто — байты кончились» если (длина байты) равен 0 то (результат равен (вариант «Шаг сорван» с причина равным "байты кончились")) иначе да
обеспечивает «остаток взятого поля короче входа» разбор результат
случай вариант «Поле взято» с графа как графа и остальное как остальное
то (длина остальное) меньше (длина байты)
случай любое
то да
обеспечивает «поле, взятое из октетов, годно» разбор результат
случай вариант «Поле взято» с графа как графа и остальное как остальное
то (не («Октеты годны» от байты)) или («Поле годно» от графа)
случай любое
то да
пример «Первое поле снимается, остаток — со второго тега»
дано байты равно [8, 150, 1, 18]
ожидается вариант «Поле взято» с графа равным (вариант «Поле» с номер равным 1 и тип равным 0 и значение равным 150 и байты равным пустой список) и остальное равным [18]
тотальная функция «Разобрать поля»
принимает байты: список числа, собрано: список «Поле провода», место: число, запас: неотрицательное
возвращает «Итог сообщения»
обеспечивает «пусто — собранное отдаётся» если (длина байты) равен 0 то (результат равен (вариант «Сообщение разобрано» с графы равным собрано)) иначе да
обеспечивает «разобранных полей не меньше собранных» разбор результат
случай вариант «Сообщение разобрано» с графы как графы
то (длина графы) не меньше (длина собрано)
случай любое
то да
обеспечивает «разобранных полей не больше собранных вместе с байтами» разбор результат
случай вариант «Сообщение разобрано» с графы как графы
то (длина графы) не больше ((длина собрано) плюс (длина байты))
случай любое
то да
обеспечивает «место порчи не раньше начала» разбор результат
случай вариант «Сообщение испорчено» с причина как причина и место как позиция
то (не ((место минус место) равен 0)) или (позиция не меньше место)
случай любое
то да
пример «Пусто — собранное отдаётся»
дано байты равно пустой список
дано собрано равно [
вариант «Поле» с номер равным 1 и тип равным 0 и значение равным 150 и байты равным пустой список]
дано место равно 4
дано запас равно 0
ожидается вариант «Сообщение разобрано» с графы равным [
вариант «Поле» с номер равным 1 и тип равным 0 и значение равным 150 и байты равным пустой список]
тотальная функция «Разобрать сообщение»
принимает байты: список числа
возвращает «Итог сообщения»
обеспечивает «пусто — сообщение без полей» если (длина байты) равен 0 то (результат равен (вариант «Сообщение разобрано» с графы равным пустой список)) иначе да
обеспечивает «полей не больше, чем байтов» разбор результат
случай вариант «Сообщение разобрано» с графы как графы
то (длина графы) не больше (длина байты)
случай любое
то да
обеспечивает «место порчи — номер байта внутри сообщения» разбор результат
случай вариант «Сообщение испорчено» с причина как причина и место как позиция
то (позиция не меньше 1) и притом (позиция не больше (длина байты))
случай любое
то да
обеспечивает «причина порчи — одна из четырёх названных» разбор результат
случай вариант «Сообщение испорчено» с причина как причина и место как позиция
то (причина равен "байты кончились") или ((причина равен "число шире 2^53") или ((причина равен "тип провода не опознан") или (причина равен "длина больше остатка")))
случай любое
то да
пример «Пусто — сообщение без полей»
дано байты равно пустой список
ожидается вариант «Сообщение разобрано» с графы равным пустой список
тотальная функция «Перекодировать сообщение»
принимает байты: список числа
возвращает список числа
обеспечивает «пусто перекодируется в пусто» если (длина байты) равен 0 то ((длина результат) равен 0) иначе да
обеспечивает «перекодировка октетов не длиннее входа» (не («Октеты годны» от байты)) или ((длина результат) не больше (длина байты))
обеспечивает «перекодировка октетов устойчива: второй раз даёт то же» (не («Октеты годны» от байты)) или ((«Перекодировать сообщение» от результат) равен результат)
пример «Тридцать байт пяти полей разбираются и собираются байт в байт»
дано байты равно [8, 150, 1, 18, 7, 116, 101, 115, 116, 105, 110, 103, 29, 1, 0, 0, 0, 33, 2, 0, 0, 0, 0, 0, 0, 0,
42, 2, 8, 1]
ожидается [8, 150, 1, 18, 7, 116, 101, 115, 116, 105, 110, 103, 29, 1, 0, 0, 0, 33, 2, 0, 0, 0, 0, 0, 0, 0, 42, 2,
8, 1]
тотальная функция «Поле годно»
принимает графа: «Поле провода»
возвращает признак
обеспечивает «годное поле кодируется непустым» (не результат) или ((длина («Закодировать поле» от графа)) не меньше 1)
пример «Varint 150 в поле 1 — годно»
дано графа равно вариант «Поле» с номер равным 1 и тип равным 0 и значение равным 150 и байты равным пустой список
ожидается да
тотальная функция «Поля годны»
принимает графы: список «Поле провода»
возвращает признак
обеспечивает «без полей — годно» если (длина графы) равен 0 то результат иначе да
обеспечивает «одно поле годно ровно тогда, когда годно само» если (длина графы) равен 1 то (результат равен («Поле годно» от (элемент 1 в графы))) иначе да
пример «Без полей — годно»
дано графы равно пустой список
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Целое в отрезке» | доказано композицией | доказано 3 из 3 |
| «Октет годен» | доказано композицией | доказано 2 из 2 |
| «Октеты годны» | доказано композицией | доказано 0 из 2; «пусто — годно» — сетка; «один байт годен ровно тогда, когда он октет» — сетка |
| «Байты varint» | доказано точным шагом | доказано 2 из 3; «байтов не больше витков» — сетка |
| «Varint правильно оформлен» | доказано структурой | доказано 1 из 2; «один байт оформлен правильно ровно тогда, когда он меньше 128» — сетка |
| «Закодировать varint» | доказано композицией | доказано 0 из 4; «каждый байт кроме последнего не меньше 128, последний меньше 128» — сетка; «байтов не больше восьми» — сетка; «байт хотя бы один» — сетка; «разбор закодированного возвращает значение и пустой остаток» — сетка |
| «Собрать varint» | доказано структурой | доказано 2 из 4; «остаток взятого короче входа» — сетка; «конечное взятое значение не больше 2^53−1» — сетка |
| «Разобрать varint» | доказано композицией | доказано 1 из 3; «остаток взятого короче входа» — сетка; «взятое из октетов значение лежит в отрезке неотрицательного» — сетка |
| «Байты тега» | доказано композицией | доказано 0 из 2; «байт хотя бы один» — сетка; «тег не длиннее восьми байт» — сетка |
| «Закодировать тег» | доказано композицией | доказано 0 из 3; «тег оформлен как varint» — сетка; «тег не длиннее восьми байт» — сетка; «тег из целого номера и типа провода читается обратно» — сетка |
| «Тег из varint» | доказано композицией | доказано 1 из 2; «отказы varint переходят в отказы тега, взятый varint — во взятый тег с тем же остатком» — сетка |
| «Разобрать тег» | доказано композицией | доказано 1 из 4; «тип тега из октетов неотрицателен и меньше восьми» — сетка; «номер тега из октетов — неотрицательное целое» — сетка; «остаток взятого тега короче входа» — сетка |
| «Байты младшим вперёд» | доказано точным шагом | доказано 0 из 2; «байтов ровно ширина» — сетка; «неотрицательное целое ложится октетами» — сетка |
| «Закодировать fixed32» | доказано композицией | доказано 0 из 2; «ровно четыре байта» — сетка; «целое до 2^32 читается обратно с пустым остатком» — сетка |
| «Закодировать fixed64» | доказано композицией | доказано 0 из 2; «ровно восемь байт» — сетка; «целое до 2^53−1 читается обратно с пустым остатком» — сетка |
| «Накопленное fixed» | доказано композицией | доказано 2 из 2 |
| «Собрать младшим вперёд» | доказано структурой | доказано 0 из 3; «байтов меньше ширины — байты кончились» — сетка; «нулевая ширина входа не трогает» — сетка; «взятое съедает ровно ширину» — сетка |
| «Разобрать fixed32» | доказано композицией | доказано 0 из 3; «меньше четырёх байт — байты кончились» — сетка; «взятое съедает ровно четыре байта» — сетка; «взятое из октетов — целое до 2^32» — сетка |
| «Разобрать fixed64» | доказано композицией | доказано 0 из 3; «меньше восьми байт — байты кончились» — сетка; «взятое съедает ровно восемь байт» — сетка; «взятое из октетов — целое до 2^53−1» — сетка |
| «Сцепить байты» | доказано композицией | доказано 2 из 2 |
| «Первые байты» | доказано структурой | доказано 1 из 2; «первых не больше, чем просили» — сетка |
| «Байты без первых» | доказано структурой | доказано 1 из 2; «первые и остаток вместе дают вход» — сетка |
| «Закодировать поле» | доказано композицией | доказано 0 из 2; «годное поле читается обратно одним шагом с пустым остатком» — сетка; «тип провода вне четырёх известных — пусто» — сетка |
| «Закодировать сообщение» | доказано композицией | доказано 1 из 3; «одно поле кодируется как само поле» — сетка; «годные поля читаются обратно тем же списком» — сетка |
| «Поле из числа» | доказано композицией | доказано 1 из 2; «отказы переходят в срыв, взятое число — в поле без байтов с тем же остатком» — сетка |
| «Поле из длины» | доказано композицией | доказано 1 из 2; «длина больше остатка — срыв, отказы длины — срыв» — сетка |
| «Значение поля» | доказано композицией | доказано 1 из 2; «остаток взятого короче входа» — сетка |
| «Шаг разбора поля» | доказано композицией | доказано 1 из 3; «остаток взятого поля короче входа» — сетка; «поле, взятое из октетов, годно» — сетка |
| «Разобрать поля» | доказано точным шагом | доказано 1 из 4; «разобранных полей не меньше собранных» — сетка; «разобранных полей не больше собранных вместе с байтами» — сетка; «место порчи не раньше начала» — сетка |
| «Разобрать сообщение» | доказано композицией | доказано 1 из 4; «полей не больше, чем байтов» — сетка; «место порчи — номер байта внутри сообщения» — сетка; «причина порчи — одна из четырёх названных» — сетка |
| «Перекодировать сообщение» | доказано композицией | доказано 1 из 3; «перекодировка октетов не длиннее входа» — сетка; «перекодировка октетов устойчива: второй раз даёт то же» — сетка |
| «Поле годно» | доказано композицией | доказано 0 из 1; «годное поле кодируется непустым» — сетка |
| «Поля годны» | доказано композицией | доказано 0 из 2; «без полей — годно» — сетка; «одно поле годно ровно тогда, когда годно само» — сетка |
«Rationals»
flang/stdlib/rationals.flang — functions 17; the kernel ledger was taken from this version of the file
объект «Дробь»
«отрицательна»: признак
«числитель»: список числа
«знаменатель»: список числа
тотальная функция «Ненулевое длинное»
принимает разряды: список числа
возвращает признак
пример «Ноль старшими нулями — всё ещё ноль»
дано разряды равно [0, 0]
ожидается нет
тотальная функция «Сократить»
принимает отрицательна: признак, числитель: список числа, знаменатель: список числа
возвращает «Дробь»
обеспечивает «ноль не бывает отрицательным» (не результат.«отрицательна») или («Ненулевое длинное» от результат.«числитель»)
обеспечивает «знак берётся только из заказанного» (не результат.«отрицательна») или отрицательна
обеспечивает «заказанный знак у ненулевого сохраняется» (не отрицательна) или (результат.«отрицательна» или (не («Ненулевое длинное» от результат.«числитель»)))
пример «Шесть восьмых — три четверти»
дано отрицательна равно нет
дано числитель равно [6]
дано знаменатель равно [8]
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [3] и «знаменатель» равным [4]
тотальная функция «Дробь из целых»
принимает числитель: целое, знаменатель: неотрицательное
возвращает «Дробь»
требует «знаменатель не меньше единицы» знаменатель не меньше 1
обеспечивает «знак дроби — знак числителя» (не результат.«отрицательна») или (числитель меньше 0)
пример «Минус две шестых — минус одна третья»
дано числитель равно -2
дано знаменатель равно 6
ожидается запись «Дробь» с «отрицательна» равным да и «числитель» равным [1] и «знаменатель» равным [3]
тотальная функция «Дробь из записей»
принимает отрицательна: признак, числитель: строка, знаменатель: строка
возвращает «Дробь»
пример «Двадцать цифр на десять — сокращается до целого»
дано отрицательна равно нет
дано числитель равно "12345678901234567890"
дано знаменатель равно "1234567890"
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [779265, 2384] и «знаменатель» равным [1]
тотальная функция «Ноль дробью»
возвращает «Дробь»
обеспечивает «у нуля знаменатель единица» результат.«знаменатель» равен [1]
пример «Ноль»
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [] и «знаменатель» равным [1]
тотальная функция «Противоположная»
принимает дробь: «Дробь»
возвращает «Дробь»
обеспечивает «противоположная к нулю — снова ноль, а не минус ноль» (не результат.«отрицательна») или («Ненулевое длинное» от результат.«числитель»)
обеспечивает «числитель не меняется» результат.«числитель» равен дробь.«числитель»
обеспечивает «знаменатель не меняется» результат.«знаменатель» равен дробь.«знаменатель»
пример «Минус половина»
дано дробь равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [2]
ожидается запись «Дробь» с «отрицательна» равным да и «числитель» равным [1] и «знаменатель» равным [2]
тотальная функция «Знак суммы»
принимает первая: признак, вторая: признак, втораяБольше: признак
возвращает признак
обеспечивает «из двух неотрицательных неотрицательный» (не результат) или (первая или вторая)
обеспечивает «из двух отрицательных отрицательный» (не (первая и притом вторая)) или результат
пример «Оба неотрицательны»
дано первая равно нет
дано вторая равно нет
дано втораяБольше равно да
ожидается нет
тотальная функция «Сложить дроби»
принимает первая: «Дробь», вторая: «Дробь»
возвращает «Дробь»
пример «Половина и треть»
дано первая равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [2]
дано вторая равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [3]
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [5] и «знаменатель» равным [6]
тотальная функция «Вычесть дроби»
принимает уменьшаемое: «Дробь», вычитаемое: «Дробь»
возвращает «Дробь»
пример «Половина без трети»
дано уменьшаемое равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [2]
дано вычитаемое равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [3]
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [6]
тотальная функция «Умножить дроби»
принимает первая: «Дробь», вторая: «Дробь»
возвращает «Дробь»
обеспечивает «произведение отрицательно только при разных знаках» (не результат.«отрицательна») или (не (первая.«отрицательна» равен вторая.«отрицательна»))
обеспечивает «нулевое произведение не отрицательно» (не результат.«отрицательна») или («Ненулевое длинное» от результат.«числитель»)
пример «Две трети на три четверти — половина»
дано первая равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [2] и «знаменатель» равным [3]
дано вторая равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [3] и «знаменатель» равным [4]
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [2]
тотальная функция «Разделить дроби»
принимает делимое: «Дробь», делитель: «Дробь»
возвращает «Дробь»
обеспечивает «частное отрицательно только при разных знаках» (не результат.«отрицательна») или (не (делимое.«отрицательна» равен делитель.«отрицательна»))
требует «делитель не ноль» «Ненулевое длинное» от делитель.«числитель»
пример «Половина на четверть — два»
дано делимое равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [2]
дано делитель равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [4]
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [2] и «знаменатель» равным [1]
тотальная функция «Меньше дроби»
принимает первая: «Дробь», вторая: «Дробь»
возвращает признак
пример «Треть меньше половины»
дано первая равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [3]
дано вторая равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [2]
ожидается да
тотальная функция «Дроби равны»
принимает первая: «Дробь», вторая: «Дробь»
возвращает признак
пример «Половина равна половине»
дано первая равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [2]
дано вторая равно запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [2]
ожидается да
тотальная функция «Дробь записью»
принимает дробь: «Дробь»
возвращает строка
пример «Минус три четверти»
дано дробь равно запись «Дробь» с «отрицательна» равным да и «числитель» равным [3] и «знаменатель» равным [4]
ожидается "-3/4"
тотальная функция «Единица на следующее»
принимает номер: неотрицательное
возвращает «Дробь»
пример «Единица на четыре»
дано номер равно 3
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [1] и «знаменатель» равным [4]
тотальная функция «Гармоническая сумма»
принимает слагаемых: неотрицательное
возвращает «Дробь»
пример «Без слагаемых — ноль»
дано слагаемых равно 0
ожидается запись «Дробь» с «отрицательна» равным нет и «числитель» равным [] и «знаменатель» равным [1]
тотальная функция «Гармоническая сумма записью»
принимает слагаемых: неотрицательное
возвращает строка
пример «Тридцать слагаемых — точная дробь без округления»
дано слагаемых равно 30
ожидается "9304682830147/2329089562800"
| Function | Termination | Claims |
|---|---|---|
| «Ненулевое длинное» | доказано композицией | — |
| «Сократить» | доказано композицией | доказано 3 из 3 |
| «Дробь из целых» | доказано композицией | доказано 1 из 1 |
| «Дробь из записей» | доказано композицией | — |
| «Ноль дробью» | доказано композицией | доказано 1 из 1 |
| «Противоположная» | доказано композицией | доказано 3 из 3 |
| «Знак суммы» | доказано композицией | доказано 2 из 2 |
| «Сложить дроби» | доказано композицией | — |
| «Вычесть дроби» | доказано композицией | — |
| «Умножить дроби» | доказано композицией | доказано 2 из 2 |
| «Разделить дроби» | доказано композицией | доказано 1 из 1 |
| «Меньше дроби» | доказано композицией | — |
| «Дроби равны» | доказано композицией | — |
| «Дробь записью» | доказано композицией | — |
| «Единица на следующее» | доказано композицией | — |
| «Гармоническая сумма» | доказано точным шагом | — |
| «Гармоническая сумма записью» | доказано композицией | — |
«Redis»
flang/stdlib/redis.flang — functions 41; the kernel ledger was taken from this version of the file
тип «Ответ Redis»
вариант «Слово Redis» содержит текст: строка
вариант «Беда Redis» содержит сообщение: строка
вариант «Счёт Redis» содержит значение: число
вариант «Груз Redis» содержит текст: строка
вариант «Ничего Redis»
вариант «Набор Redis» содержит части: список «Ответ Redis»
тип «Разбор Redis»
вариант «Ответ разобран» содержит ответ: «Ответ Redis», остальное: список строки
вариант «Ответа мало»
вариант «Ответ испорчен» содержит причина: строка
тип «Край Redis»
вариант «Край взят» содержит текст: строка, остальное: список строки
вариант «Края нет»
тип «Поток Redis»
вариант «Поток Redis разобран» содержит ответы: список «Ответ Redis», остальное: список строки
вариант «Поток Redis оборван» содержит ответы: список «Ответ Redis», причина: строка
тотальная функция «Край строки»
возвращает строка
обеспечивает «край длиной в два знака» ((длина результат) равен 2)
обеспечивает «первый знак края — тринадцатый код» ((код символа (элемент 1 в («Знаки текста» от результат))) равен 13)
обеспечивает «второй знак края — десятый код» ((код символа (элемент 2 в («Знаки текста» от результат))) равен 10)
пример «край длиной в два знака»
ожидается "\r\n"
тотальная функция «Груз строкой»
принимает текст: строка
возвращает строка
обеспечивает «груз начинается с доллара» результат начинается с "$"
обеспечивает «груз несёт сам текст» результат содержит текст
обеспечивает «груз длиннее текста на доллар, запись длины и два края» (длина результат) равен ((длина текст) плюс ((длина (к строке («Байтов в тексте» от текст))) плюс 5))
пример «латиница: длина в октетах равна числу знаков»
дано текст равно "GET"
ожидается "$3\r\nGET\r\n"
тотальная функция «Грузы»
принимает части: список строки
возвращает строка
обеспечивает «пустой список частей даёт пустую запись» (не ((длина части) равен 0)) или ((длина результат) равен 0)
обеспечивает «всякая часть весит не меньше пяти знаков» (длина результат) не меньше (5 умножить на (длина части))
пример «две части подряд»
дано части равно ["GET", "k"]
ожидается "$3\r\nGET\r\n$1\r\nk\r\n"
тотальная функция «Команда»
принимает части: список строки
возвращает строка
обеспечивает «команда начинается со звёздочки и числа частей» результат начинается с (соединить "*" с (к строке (длина части)))
обеспечивает «команда длиной равна шапке вместе с грузами» (длина результат) равен ((длина («Грузы» от части)) плюс ((длина (к строке (длина части))) плюс 3))
пример «команда из одной части»
дано части равно ["PING"]
ожидается "*1\r\n$4\r\nPING\r\n"
тотальная функция «Отклик»
возвращает строка
обеспечивает «отклик — команда из одной части, и часть эта PING» ((результат начинается с "*1") и притом (результат содержит "PING"))
пример «PING одной частью»
ожидается "*1\r\n$4\r\nPING\r\n"
тотальная функция «Вход»
принимает пароль: строка
возвращает строка
обеспечивает «вход — команда из двух частей» результат начинается с "*2"
обеспечивает «во входе стоит слово AUTH» результат содержит "AUTH"
обеспечивает «во входе стоит сам пароль» результат содержит пароль
пример «вход одним паролем, и длина его считается в октетах»
дано пароль равно "тайна"
ожидается "*2\r\n$4\r\nAUTH\r\n$10\r\nтайна\r\n"
тотальная функция «Вход с именем»
принимает имя: строка, пароль: строка
возвращает строка
обеспечивает «вход с именем — команда из трёх частей» результат начинается с "*3"
обеспечивает «во входе с именем стоит само имя» результат содержит имя
обеспечивает «во входе с именем стоит пароль» результат содержит пароль
пример «имя и пароль»
дано имя равно "flang"
дано пароль равно "тайна"
ожидается "*3\r\n$4\r\nAUTH\r\n$5\r\nflang\r\n$10\r\nтайна\r\n"
тотальная функция «Положить в Redis»
принимает ключ: строка, значение: строка
возвращает строка
обеспечивает «запись — команда из трёх частей» результат начинается с "*3"
обеспечивает «в записи стоит ключ» результат содержит ключ
обеспечивает «в записи стоит значение» результат содержит значение
пример «запись значения по ключу»
дано ключ равно "k"
дано значение равно "v"
ожидается "*3\r\n$3\r\nSET\r\n$1\r\nk\r\n$1\r\nv\r\n"
тотальная функция «Взять значение»
принимает ключ: строка
возвращает строка
обеспечивает «чтение — команда из двух частей» результат начинается с "*2"
обеспечивает «в чтении стоит слово GET» результат содержит "GET"
обеспечивает «в чтении стоит ключ» результат содержит ключ
пример «чтение по ключу»
дано ключ равно "k"
ожидается "*2\r\n$3\r\nGET\r\n$1\r\nk\r\n"
тотальная функция «Убрать ключ»
принимает ключ: строка
возвращает строка
обеспечивает «удаление — команда из двух частей» результат начинается с "*2"
обеспечивает «в удалении стоит слово DEL» результат содержит "DEL"
обеспечивает «в удалении стоит ключ» результат содержит ключ
пример «удаление по ключу»
дано ключ равно "k"
ожидается "*2\r\n$3\r\nDEL\r\n$1\r\nk\r\n"
тотальная функция «Сколько ключей»
возвращает строка
обеспечивает «счёт ключей — команда из одной части» ((результат начинается с "*1") и притом (результат содержит "DBSIZE"))
пример «DBSIZE одной частью»
ожидается "*1\r\n$6\r\nDBSIZE\r\n"
тотальная функция «Выбрать базу»
принимает номер: неотрицательное
возвращает строка
обеспечивает «выбор базы — команда из двух частей» результат начинается с "*2"
обеспечивает «в выборе базы стоит слово SELECT» результат содержит "SELECT"
обеспечивает «номер базы записан десятичной записью» результат содержит (к строке номер)
пример «вторая база»
дано номер равно 2
ожидается "*2\r\n$6\r\nSELECT\r\n$1\r\n2\r\n"
тотальная функция «Проститься»
возвращает строка
обеспечивает «прощание — команда из одной части» ((результат начинается с "*1") и притом (результат содержит "QUIT"))
пример «QUIT одной частью»
ожидается "*1\r\n$4\r\nQUIT\r\n"
тотальная функция «Сообщение беды Redis»
принимает ответ: «Ответ Redis»
возвращает строка
обеспечивает «у отсутствия значения сообщения беды нет» если ответ равен (вариант «Ничего Redis») то (результат равен "") иначе да
пример «беда отдаёт своё сообщение»
дано ответ равно (вариант «Беда Redis» с сообщение равным "ERR nope")
ожидается "ERR nope"
тотальная функция «Части набора Redis»
принимает ответ: «Ответ Redis»
возвращает список «Ответ Redis»
обеспечивает «у отсутствия значения частей нет» если ответ равен (вариант «Ничего Redis») то (результат равен пустой список) иначе да
пример «набор отдаёт свои части»
дано ответ равно (вариант «Набор Redis» с части равным [вариант «Слово Redis» с текст равным "a"])
ожидается [вариант «Слово Redis» с текст равным "a"]
тотальная функция «Текст взятого края»
принимает край: «Край Redis»
возвращает строка
обеспечивает «у отсутствующего края текста нет» (не (край равен (вариант «Края нет»))) или (результат равен "")
пример «взятый край отдаёт свой текст»
дано край равно (вариант «Край взят» с текст равным "OK" и остальное равным [])
ожидается "OK"
тотальная функция «Остаток взятого края»
принимает край: «Край Redis»
возвращает список строки
обеспечивает «у отсутствующего края остатка нет» (не (край равен (вариант «Края нет»))) или (результат равен пустой список)
пример «взятый край отдаёт свой остаток»
дано край равно (вариант «Край взят» с текст равным "OK" и остальное равным ["z"])
ожидается ["z"]
тотальная функция «Число ответа Redis»
принимает исход: «Разбор числа»
возвращает число
обеспечивает «неразобранное число отдаётся нулём» (не (исход равен (вариант «Не число»))) или (результат равен 0)
пример «разобранное число отдаётся собой»
дано исход равно (вариант «Число разобрано» с значение равным 42)
ожидается 42
тотальная функция «Дописать знак к краю»
принимает знак: строка, исход: «Край Redis»
возвращает «Край Redis»
обеспечивает «дописка к краю исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает» разбор результат
случай вариант «Край взят» с текст как стало и остальное как хвостик
то разбор исход
случай вариант «Край взят» с текст как было и остальное как хвост
то ((длина стало) равен ((длина было) плюс (длина знак))) и притом ((длина хвостик) равен (длина хвост))
случай вариант «Края нет»
то нет
случай вариант «Края нет»
то разбор исход
случай вариант «Край взят» с текст как было и остальное как хвост
то нет
случай вариант «Края нет»
то да
обеспечивает «отсутствие края дописку переживает» (не (исход равен (вариант «Края нет»))) или (результат равен (вариант «Края нет»))
обеспечивает «взятый край дописку принимает знаком спереди, остатка не трогая» если исход равен (вариант «Край взят» с текст равным («Текст взятого края» от исход) и остальное равным («Остаток взятого края» от исход)) то (результат равен (вариант «Край взят» с текст равным (соединить знак с («Текст взятого края» от исход)) и остальное равным («Остаток взятого края» от исход))) иначе да
пример «знак становится первым»
дано знак равно "a"
дано исход равно (вариант «Край взят» с текст равным "b" и остальное равным [])
ожидается вариант «Край взят» с текст равным "ab" и остальное равным []
тотальная функция «Взять край»
принимает знаки: список строки
возвращает «Край Redis»
обеспечивает «взятый текст — начало входа, а остаток короче входа ровно на этот текст и два знака края» разбор результат
случай вариант «Край взят» с текст как текст и остальное как дальше
то ((«Текст знаков» от знаки) начинается с текст) и притом ((длина («Текст знаков» от дальше)) равен (((длина («Текст знаков» от знаки)) минус (длина текст)) минус 2))
случай вариант «Края нет»
то (длина («Текст знаков» от знаки)) не меньше 0
пример «строка кончается краем»
дано знаки равно ["O", "K", "\r", "\n", "b"]
ожидается вариант «Край взят» с текст равным "OK" и остальное равным ["b"]
тотальная функция «Край за возвратом»
принимает хвост: список строки
возвращает «Край Redis»
обеспечивает «край берётся только при переводе строки следом, и снимает он ровно один знак» разбор результат
случай вариант «Край взят» с текст как текст и остальное как дальше
то ((длина текст) равен 0) и притом ((длина дальше) равен ((длина хвост) минус 1))
случай вариант «Края нет»
то (не ((длина хвост) больше 0)) или (не ((код символа (элемент 1 в хвост)) равен 10))
пример «перевод строки следом — край взят»
дано хвост равно ["\n", "z"]
ожидается вариант «Край взят» с текст равным "" и остальное равным ["z"]
обеспечивает «перевод строки следом снимает ровно один знак, а без него края нет» если (((длина хвост) больше 0) и притом ((код символа (элемент 1 в хвост)) равен 10)) то (результат равен (вариант «Край взят» с текст равным "" и остальное равным («Без первых» от хвост и 1))) иначе (результат равен (вариант «Края нет»))
обеспечивает «за возвратом стоит перевод — край взят и пуст» если ((длина хвост) больше 0) и притом ((код символа (элемент 1 в хвост)) равен 10) то (результат равен (вариант «Край взят» с текст равным "" и остальное равным («Без первых» от хвост и 1))) иначе да
обеспечивает «нет перевода за возвратом — края нет» если не (((длина хвост) больше 0) и притом ((код символа (элемент 1 в хвост)) равен 10)) то (результат равен (вариант «Края нет»)) иначе да
тотальная функция «Ответ числом»
принимает исход: «Разбор числа», дальше: список строки
возвращает «Разбор Redis»
обеспечивает «разобранное целое становится счётом с тем же значением, а неразобранное — названной порчей» разбор исход
случай вариант «Число разобрано» с значение как значение
то результат равен (вариант «Ответ разобран» с ответ равным (вариант «Счёт Redis» с значение равным значение) и остальное равным дальше)
случай вариант «Не число»
то разбор результат
случай вариант «Ответ испорчен» с причина как причина
то (длина причина) больше 0
случай любое
то нет
обеспечивает «неразобранное целое ответа названо порчей» (не (исход равен (вариант «Не число»))) или (результат равен (вариант «Ответ испорчен» с причина равным "целое ответа не разобрано"))
обеспечивает «разобранное целое становится счётом с тем же значением» если исход равен (вариант «Число разобрано» с значение равным («Число ответа Redis» от исход)) то (результат равен (вариант «Ответ разобран» с ответ равным (вариант «Счёт Redis» с значение равным («Число ответа Redis» от исход)) и остальное равным дальше)) иначе да
пример «целое становится счётом»
дано исход равно (вариант «Число разобрано» с значение равным 42)
дано дальше равно []
ожидается вариант «Ответ разобран» с ответ равным (вариант «Счёт Redis» с значение равным 42) и остальное равным []
тотальная функция «Груз с краем»
принимает текст: строка, край: «Край Redis»
возвращает «Разбор Redis»
обеспечивает «край сразу за телом даёт груз с тем же текстом, край с лишними знаками — названную порчу, а отсутствие края — нехватку» разбор край
случай вариант «Края нет»
то результат равен (вариант «Ответа мало»)
случай вариант «Край взят» с текст как хвостовой и остальное как дальше
то если (длина хвостовой) равен 0
то результат равен (вариант «Ответ разобран» с ответ равным (вариант «Груз Redis» с текст равным текст) и остальное равным дальше)
иначе разбор результат
случай вариант «Ответ испорчен» с причина как причина
то (длина причина) больше 0
случай любое
то нет
обеспечивает «без края груза нет — байты ещё едут» (не (край равен (вариант «Края нет»))) или (результат равен (вариант «Ответа мало»))
обеспечивает «лишние знаки между телом и краем названы порчей» если (край равен (вариант «Край взят» с текст равным («Текст взятого края» от край) и остальное равным («Остаток взятого края» от край))) и притом (не ((длина («Текст взятого края» от край)) равен 0)) то (результат равен (вариант «Ответ испорчен» с причина равным "груз не кончился краем строки")) иначе да
пример «край сразу за телом»
дано текст равно "v"
дано край равно (вариант «Край взят» с текст равным "" и остальное равным ["z"])
ожидается вариант «Ответ разобран» с ответ равным (вариант «Груз Redis» с текст равным "v") и остальное равным ["z"]
тотальная функция «Груз по набору»
принимает набор: «Набор байтов»
возвращает «Разбор Redis»
обеспечивает «недобранные байты значат нехватку, а не порчу» разбор набор
случай вариант «Набрано» с взято как взято и остальное как хвостик
то (длина взято) не меньше 0
случай любое
то результат равен (вариант «Ответа мало»)
обеспечивает «нехватка байтов груза значит нехватку ответа» (не (набор равен (вариант «Байтов не хватило»))) или (результат равен (вариант «Ответа мало»))
обеспечивает «знак поперёк границы груза значит нехватку ответа» (не (набор равен (вариант «Знак поперёк границы»))) или (результат равен (вариант «Ответа мало»))
пример «набранное тело становится грузом»
дано набор равно (вариант «Набрано» с взято равным ["v"] и остальное равным ["\r", "\n"])
ожидается вариант «Ответ разобран» с ответ равным (вариант «Груз Redis» с текст равным "v") и остальное равным []
тотальная функция «Ответ грузом»
принимает исход: «Разбор числа», дальше: список строки
возвращает «Разбор Redis»
обеспечивает «отрицательная длина даёт отсутствие значения, неразобранная — названную порчу» разбор исход
случай вариант «Не число»
то разбор результат
случай вариант «Ответ испорчен» с причина как причина
то (длина причина) больше 0
случай любое
то нет
случай вариант «Число разобрано» с значение как сколько
то (не (сколько меньше 0)) или (результат равен (вариант «Ответ разобран» с ответ равным (вариант «Ничего Redis») и остальное равным дальше))
обеспечивает «неразобранная длина груза названа порчей» (не (исход равен (вариант «Не число»))) или (результат равен (вариант «Ответ испорчен» с причина равным "длина груза не разобрана"))
обеспечивает «отрицательная длина груза даёт отсутствие значения, а не пустую строку» если (исход равен (вариант «Число разобрано» с значение равным («Число ответа Redis» от исход))) и притом ((«Число ответа Redis» от исход) меньше 0) то (результат равен (вариант «Ответ разобран» с ответ равным (вариант «Ничего Redis») и остальное равным дальше)) иначе да
пример «минус единица — значения нет»
дано исход равно (вариант «Число разобрано» с значение равным -1)
дано дальше равно []
ожидается вариант «Ответ разобран» с ответ равным (вариант «Ничего Redis») и остальное равным []
тотальная функция «Разобрать по метке»
принимает метка: строка, край: «Край Redis»
возвращает «Разбор Redis»
обеспечивает «плюс даёт слово, минус — беду, а без края разбирать нечего» разбор край
случай вариант «Края нет»
то результат равен (вариант «Ответа мало»)
случай вариант «Край взят» с текст как текст и остальное как дальше
то ((не (метка равен "+")) или (результат равен (вариант «Ответ разобран» с ответ равным (вариант «Слово Redis» с текст равным текст) и остальное равным дальше))) и притом ((не (метка равен "-")) или (результат равен (вариант «Ответ разобран» с ответ равным (вариант «Беда Redis» с сообщение равным текст) и остальное равным дальше)))
обеспечивает «без края по метке разбирать нечего» (не (край равен (вариант «Края нет»))) или (результат равен (вариант «Ответа мало»))
пример «плюс — простое слово»
дано метка равно "+"
дано край равно (вариант «Край взят» с текст равным "OK" и остальное равным [])
ожидается вариант «Ответ разобран» с ответ равным (вариант «Слово Redis» с текст равным "OK") и остальное равным []
тотальная функция «Разобрать простой ответ»
принимает знаки: список строки
возвращает «Разбор Redis»
обеспечивает «пустой поток значит нехватку» ((не ((длина знаки) равен 0)) или (результат равен (вариант «Ответа мало»)))
обеспечивает «набор внутри набора назван порчей» ((не (((длина знаки) больше 0) и притом ((элемент 1 в знаки) равен "*"))) или (результат равен (вариант «Ответ испорчен» с причина равным "вложенный набор не поддержан")))
пример «пусто — байты ещё едут»
дано знаки равно []
ожидается вариант «Ответа мало»
тотальная функция «Собрать части»
принимает знаки: список строки, осталось: число, собрано: список «Ответ Redis», запас: неотрицательное
возвращает «Разбор Redis»
обеспечивает «готовый набор несёт не меньше частей, чем уже было собрано» разбор результат
случай вариант «Ответ разобран» с ответ как ответ и остальное как дальше
то разбор ответ
случай вариант «Набор Redis» с части как части
то (длина части) не меньше (длина собрано)
случай любое
то нет
случай любое
то да
обеспечивает «запас частей кончился — названная порча» (осталось не больше 0) или ((не (запас не больше 0)) или (результат равен (вариант «Ответ испорчен» с причина равным "частей набора больше, чем запас разбора")))
обеспечивает «часть, которая не доехала, значит нехватку, а не порчу» (осталось не больше 0) или ((запас не больше 0) или ((не ((«Разобрать простой ответ» от знаки) равен (вариант «Ответа мало»))) или (результат равен (вариант «Ответа мало»))))
пример «две части подряд»
дано знаки равно ["+", "a", "\r", "\n", "+", "b", "\r", "\n"]
дано осталось равно 2
дано собрано равно []
дано запас равно 100
ожидается вариант «Ответ разобран» с ответ равным (вариант «Набор Redis» с части равным [вариант «Слово Redis» с текст равным "a", вариант «Слово Redis» с текст равным "b"]) и остальное равным []
обеспечивает «когда частей не осталось, набор — это уже собранное, а поток нетронут» если (осталось не больше 0) то (результат равен (вариант «Ответ разобран» с ответ равным (вариант «Набор Redis» с части равным собрано) и остальное равным знаки)) иначе да
тотальная функция «Набор по числу»
принимает исход: «Разбор числа», дальше: список строки, запас: неотрицательное
возвращает «Разбор Redis»
обеспечивает «неразобранное число частей — названная порча, отрицательное — отсутствие набора» разбор исход
случай вариант «Не число»
то разбор результат
случай вариант «Ответ испорчен» с причина как причина
то (длина причина) больше 0
случай любое
то нет
случай вариант «Число разобрано» с значение как сколько
то (не (сколько меньше 0)) или (результат равен (вариант «Ответ разобран» с ответ равным (вариант «Ничего Redis») и остальное равным дальше))
обеспечивает «неразобранное число частей названо порчей» (не (исход равен (вариант «Не число»))) или (результат равен (вариант «Ответ испорчен» с причина равным "число частей набора не разобрано"))
обеспечивает «отрицательное число частей даёт отсутствие набора» если (исход равен (вариант «Число разобрано» с значение равным («Число ответа Redis» от исход))) и притом ((«Число ответа Redis» от исход) меньше 0) то (результат равен (вариант «Ответ разобран» с ответ равным (вариант «Ничего Redis») и остальное равным дальше)) иначе да
пример «минус единица — набора нет»
дано исход равно (вариант «Число разобрано» с значение равным -1)
дано дальше равно []
дано запас равно 100
ожидается вариант «Ответ разобран» с ответ равным (вариант «Ничего Redis») и остальное равным []
тотальная функция «Разобрать набор»
принимает край: «Край Redis», запас: неотрицательное
возвращает «Разбор Redis»
обеспечивает «без края набора нет — байты ещё едут» разбор край
случай вариант «Края нет»
то результат равен (вариант «Ответа мало»)
случай вариант «Край взят» с текст как текст и остальное как дальше
то (длина текст) не меньше 0
пример «набор из одного слова»
дано край равно (вариант «Край взят» с текст равным "1" и остальное равным ["+", "a", "\r", "\n"])
дано запас равно 100
ожидается вариант «Ответ разобран» с ответ равным (вариант «Набор Redis» с части равным [
вариант «Слово Redis» с текст равным "a"]) и остальное равным []
тотальная функция «Разобрать ответ»
принимает знаки: список строки, запас: неотрицательное
возвращает «Разбор Redis»
обеспечивает «пустой поток значит нехватку» (не ((длина знаки) равен 0)) или (результат равен (вариант «Ответа мало»))
пример «пусто — байты ещё едут»
дано знаки равно []
дано запас равно 100
ожидается вариант «Ответа мало»
тотальная функция «Разобрать поток Redis»
принимает знаки: список строки, ответы: список «Ответ Redis», запас: неотрицательное
возвращает «Поток Redis»
обеспечивает «разобранных ответов не меньше, чем было накоплено» разбор результат
случай вариант «Поток Redis разобран» с ответы как вышло и остальное как дальше
то (длина вышло) не меньше (длина ответы)
случай вариант «Поток Redis оборван» с ответы как вышло и причина как причина
то (длина вышло) не меньше (длина ответы)
обеспечивает «обрыв потока всегда назван причиной» разбор результат
случай вариант «Поток Redis разобран» с ответы как вышло и остальное как дальше
то да
случай вариант «Поток Redis оборван» с ответы как вышло и причина как причина
то (длина причина) больше 0
обеспечивает «недоехавший хвост возвращается нетронутым» (запас не больше 0) или ((не ((«Разобрать ответ» от знаки и запас) равен (вариант «Ответа мало»))) или (результат равен (вариант «Поток Redis разобран» с ответы равным ответы и остальное равным знаки)))
пример «два ответа подряд»
дано знаки равно ["+", "O", "K", "\r", "\n", ":", "1", "\r", "\n"]
дано ответы равно []
дано запас равно 100
ожидается вариант «Поток Redis разобран» с ответы равным [вариант «Слово Redis» с текст равным "OK",
вариант «Счёт Redis» с значение равным 1] и остальное равным []
обеспечивает «вышедший запас рвёт поток названной причиной, а накопленное отдаёт нетронутым» если (запас не больше 0) то (результат равен (вариант «Поток Redis оборван» с ответы равным ответы и причина равным "ответов больше, чем запас разбора")) иначе да
тотальная функция «Текст простого ответа»
принимает ответ: «Ответ Redis»
возвращает строка
обеспечивает «слово и груз отдают свой текст, отказ помечен словом, отсутствие значения названо, а не подменено пустотой» разбор ответ
случай вариант «Слово Redis» с текст как текст
то результат равен текст
случай вариант «Груз Redis» с текст как текст
то результат равен текст
случай вариант «Ничего Redis»
то (длина результат) больше 0
случай вариант «Беда Redis» с сообщение как сообщение
то (результат содержит сообщение) и притом ((длина результат) больше (длина сообщение))
случай любое
то да
обеспечивает «отсутствие значения названо словами» (не (ответ равен (вариант «Ничего Redis»))) или (результат равен "(значения нет)")
обеспечивает «набор печатается одним словом, а не своими частями» если ответ равен (вариант «Набор Redis» с части равным («Части набора Redis» от ответ)) то (результат равен "(набор)") иначе да
пример «слово отдаётся как есть»
дано ответ равно (вариант «Слово Redis» с текст равным "OK")
ожидается "OK"
тотальная функция «Шаг текстов частей»
принимает собрано: список строки, часть: «Ответ Redis»
возвращает список строки
обеспечивает «шаг удлиняет набранное ровно на один» (длина результат) равен ((длина собрано) плюс 1)
пример «шаг дописывает текст части»
дано собрано равно []
дано часть равно (вариант «Слово Redis» с текст равным "OK")
ожидается ["OK"]
тотальная функция «Тексты частей»
принимает части: список «Ответ Redis»
возвращает строка
обеспечивает «пустой набор даёт пустую запись» (не ((длина части) равен 0)) или ((длина результат) равен 0)
пример «две части через запятую»
дано части равно [вариант «Слово Redis» с текст равным "a", вариант «Слово Redis» с текст равным "b"]
ожидается "a, b"
тотальная функция «Текст ответа»
принимает ответ: «Ответ Redis»
возвращает строка
обеспечивает «набор берётся в скобки и ровно на них длиннее своего содержимого, а всё прочее печатается как простой ответ» разбор ответ
случай вариант «Набор Redis» с части как части
то ((длина результат) равен ((длина («Тексты частей» от части)) плюс 2)) и притом (результат начинается с "[")
случай любое
то результат равен («Текст простого ответа» от ответ)
обеспечивает «отсутствие значения печатается как простой ответ» (не (ответ равен (вариант «Ничего Redis»))) или (результат равен («Текст простого ответа» от ответ))
обеспечивает «набор печатается своими частями в квадратных скобках» если ответ равен (вариант «Набор Redis» с части равным («Части набора Redis» от ответ)) то (результат равен (соединить ["[", («Тексты частей» от («Части набора Redis» от ответ)), "]"] по "")) иначе да
пример «набор берётся в скобки»
дано ответ равно (вариант «Набор Redis» с части равным [вариант «Слово Redis» с текст равным "a",
вариант «Слово Redis» с текст равным "b"])
ожидается "[a, b]"
тотальная функция «Шаг текстов ответов»
принимает собрано: список строки, ответ: «Ответ Redis»
возвращает список строки
обеспечивает «шаг удлиняет набранное ровно на один» (длина результат) равен ((длина собрано) плюс 1)
пример «шаг дописывает текст ответа»
дано собрано равно []
дано ответ равно (вариант «Слово Redis» с текст равным "OK")
ожидается ["OK"]
тотальная функция «Тексты ответов»
принимает ответы: список «Ответ Redis»
возвращает строка
обеспечивает «пустой список даёт пустую запись» (не ((длина ответы) равен 0)) или ((длина результат) равен 0)
пример «два ответа через разделитель»
дано ответы равно [вариант «Слово Redis» с текст равным "OK", вариант «Счёт Redis» с значение равным 1]
ожидается "OK | 1"
тотальная функция «Это отказ Redis»
принимает ответ: «Ответ Redis»
возвращает признак
обеспечивает «отказом считается только беда» разбор ответ
случай вариант «Беда Redis» с сообщение как сообщение
то результат
случай любое
то не результат
обеспечивает «отсутствие значения отказом не считается» (не (ответ равен (вариант «Ничего Redis»))) или (результат равен нет)
пример «беда — отказ»
дано ответ равно (вариант «Беда Redis» с сообщение равным "ERR")
ожидается да
обеспечивает «беда отказом и зовётся» если ответ равен (вариант «Беда Redis» с сообщение равным («Сообщение беды Redis» от ответ)) то (результат равен да) иначе да
обеспечивает «слово отказом не зовётся» если ответ равен (вариант «Слово Redis» с текст равным («Текст простого ответа» от ответ)) то (результат равен нет) иначе да
обеспечивает «груз отказом не зовётся» если ответ равен (вариант «Груз Redis» с текст равным («Текст простого ответа» от ответ)) то (результат равен нет) иначе да
обеспечивает «набор отказом не зовётся» если ответ равен (вариант «Набор Redis» с части равным («Части набора Redis» от ответ)) то (результат равен нет) иначе да
тотальная функция «Шаг поиска отказа Redis»
принимает найдено: признак, ответ: «Ответ Redis»
возвращает признак
обеспечивает «однажды найденный отказ уже не теряется» если найдено то (результат равен да) иначе да
обеспечивает «пока не найдено, отвечает сам ответ» если не найдено то (результат равен («Это отказ Redis» от ответ)) иначе да
пример «найденный отказ уже не теряется»
дано найдено равно да
дано ответ равно (вариант «Слово Redis» с текст равным "OK")
ожидается да
тотальная функция «Есть отказ Redis»
принимает ответы: список «Ответ Redis»
возвращает признак
обеспечивает «в пустом списке отказа нет» (не ((длина ответы) равен 0)) или (не результат)
пример «отказ среди ответов виден»
дано ответы равно [вариант «Слово Redis» с текст равным "OK", вариант «Беда Redis» с сообщение равным "ERR"]
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Край строки» | доказано композицией | доказано 3 из 3 |
| «Груз строкой» | доказано композицией | доказано 0 из 3; «груз начинается с доллара» — сетка; «груз несёт сам текст» — сетка; «груз длиннее текста на доллар, запись длины и два края» — сетка |
| «Грузы» | доказано композицией | доказано 1 из 2; «всякая часть весит не меньше пяти знаков» — сетка |
| «Команда» | доказано композицией | доказано 0 из 2; «команда начинается со звёздочки и числа частей» — сетка; «команда длиной равна шапке вместе с грузами» — сетка |
| «Отклик» | доказано композицией | доказано 1 из 1 |
| «Вход» | доказано композицией | доказано 0 из 3; «вход — команда из двух частей» — сетка; «во входе стоит слово AUTH» — сетка; «во входе стоит сам пароль» — сетка |
| «Вход с именем» | доказано композицией | доказано 0 из 3; «вход с именем — команда из трёх частей» — сетка; «во входе с именем стоит само имя» — сетка; «во входе с именем стоит пароль» — сетка |
| «Положить в Redis» | доказано композицией | доказано 0 из 3; «запись — команда из трёх частей» — сетка; «в записи стоит ключ» — сетка; «в записи стоит значение» — сетка |
| «Взять значение» | доказано композицией | доказано 0 из 3; «чтение — команда из двух частей» — сетка; «в чтении стоит слово GET» — сетка; «в чтении стоит ключ» — сетка |
| «Убрать ключ» | доказано композицией | доказано 0 из 3; «удаление — команда из двух частей» — сетка; «в удалении стоит слово DEL» — сетка; «в удалении стоит ключ» — сетка |
| «Сколько ключей» | доказано композицией | доказано 1 из 1 |
| «Выбрать базу» | доказано композицией | доказано 0 из 3; «выбор базы — команда из двух частей» — сетка; «в выборе базы стоит слово SELECT» — сетка; «номер базы записан десятичной записью» — сетка |
| «Проститься» | доказано композицией | доказано 1 из 1 |
| «Сообщение беды Redis» | доказано композицией | доказано 1 из 1 |
| «Части набора Redis» | доказано композицией | доказано 1 из 1 |
| «Текст взятого края» | доказано композицией | доказано 1 из 1 |
| «Остаток взятого края» | доказано композицией | доказано 1 из 1 |
| «Число ответа Redis» | доказано композицией | доказано 1 из 1 |
| «Дописать знак к краю» | доказано композицией | доказано 1 из 3; «дописка к краю исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает» — сетка; «взятый край дописку принимает знаком спереди, остатка не трогая» — сетка |
| «Взять край» | доказано структурой | доказано 0 из 1; «взятый текст — начало входа, а остаток короче входа ровно на этот текст и два знака края» — сетка |
| «Край за возвратом» | доказано композицией | доказано 3 из 4; «край берётся только при переводе строки следом, и снимает он ровно один знак» — сетка |
| «Ответ числом» | доказано композицией | доказано 1 из 3; «разобранное целое становится счётом с тем же значением, а неразобранное — названной порчей» — сетка; «разобранное целое становится счётом с тем же значением» — сетка |
| «Груз с краем» | доказано композицией | доказано 2 из 3; «край сразу за телом даёт груз с тем же текстом, край с лишними знаками — названную порчу, а отсутствие края — нехватку» — сетка |
| «Груз по набору» | доказано композицией | доказано 2 из 3; «недобранные байты значат нехватку, а не порчу» — сетка |
| «Ответ грузом» | доказано композицией | доказано 2 из 3; «отрицательная длина даёт отсутствие значения, неразобранная — названную порчу» — сетка |
| «Разобрать по метке» | доказано композицией | доказано 1 из 2; «плюс даёт слово, минус — беду, а без края разбирать нечего» — сетка |
| «Разобрать простой ответ» | доказано композицией | доказано 1 из 2; «набор внутри набора назван порчей» — сетка |
| «Собрать части» | доказано постоянным шагом | доказано 3 из 4; «готовый набор несёт не меньше частей, чем уже было собрано» — сетка |
| «Набор по числу» | доказано композицией | доказано 2 из 3; «неразобранное число частей — названная порча, отрицательное — отсутствие набора» — сетка |
| «Разобрать набор» | доказано композицией | доказано 1 из 1 |
| «Разобрать ответ» | доказано композицией | доказано 1 из 1 |
| «Разобрать поток Redis» | доказано точным шагом | доказано 2 из 4; «разобранных ответов не меньше, чем было накоплено» — сетка; «обрыв потока всегда назван причиной» — сетка |
| «Текст простого ответа» | доказано композицией | доказано 2 из 3; «слово и груз отдают свой текст, отказ помечен словом, отсутствие значения названо, а не подменено пустотой» — сетка |
| «Шаг текстов частей» | доказано композицией | доказано 1 из 1 |
| «Тексты частей» | доказано композицией | доказано 1 из 1 |
| «Текст ответа» | доказано композицией | доказано 1 из 3; «набор берётся в скобки и ровно на них длиннее своего содержимого, а всё прочее печатается как простой ответ» — сетка; «набор печатается своими частями в квадратных скобках» — сетка |
| «Шаг текстов ответов» | доказано композицией | доказано 1 из 1 |
| «Тексты ответов» | доказано композицией | доказано 1 из 1 |
| «Это отказ Redis» | доказано композицией | доказано 5 из 6; «отказом считается только беда» — сетка |
| «Шаг поиска отказа Redis» | доказано композицией | доказано 2 из 2 |
| «Есть отказ Redis» | доказано композицией | доказано 0 из 1; «в пустом списке отказа нет» — сетка |
«Registry»
flang/stdlib/registry.flang — functions 44; the kernel ledger was taken from this version of the file
тотальная функция «Цифра ли»
принимает знак: строка
возвращает признак
пример «Цифра»
дано знак равно "7"
ожидается да
тотальная функция «Только цифры»
принимает текст: строка
возвращает признак
обеспечивает «пустой текст цифрами не считается» если текст равен "" то (результат равен нет) иначе да
пример «Число»
дано текст равно "142"
ожидается да
тотальная функция «Число из цифр»
принимает текст: строка
возвращает число
пример «Три цифры»
дано текст равно "142"
ожидается 142
тотальная функция «Пробелы вместо переводов»
принимает текст: строка
возвращает строка
пример «Перевод строки становится пробелом»
дано текст равно "1.1\n"
ожидается "1.1 "
тотальная функция «Обрезать»
принимает текст: строка
возвращает строка
пример «Пробелы по краям сняты»
дано текст равно " 1.4.2 "
ожидается "1.4.2"
тотальная функция «После метки»
принимает текст: строка, метка: строка
возвращает строка
пример «За меткой — остаток»
дано текст равно "не ниже 1.2"
дано метка равно "не ниже "
ожидается "1.2"
объект «Версия»
«старшая»: число
«средняя»: число
«младшая»: число
тип «Разбор версии»
вариант «Версия годна» содержит версия: «Версия»
вариант «Версия негодна» содержит причина: строка
тотальная функция «Часть версии»
принимает части: список строки, номер: число
возвращает строка
обеспечивает «часть в пределах списка — это она и есть» если ((длина части) не меньше номер) и притом (номер не меньше 1) то (результат равен (элемент номер в части)) иначе да
обеспечивает «за пределами списка часть читается нулём» если не (((длина части) не меньше номер) и притом (номер не меньше 1)) то (результат равен "0") иначе да
пример «Есть часть»
дано части равно ["1", "4"]
дано номер равно 2
ожидается "4"
тотальная функция «Все цифры»
принимает части: список строки
возвращает признак
пример «Все три части — числа»
дано части равно ["1", "4", "2"]
ожидается да
тотальная функция «Разобрать версию»
принимает текст: строка
возвращает «Разбор версии»
пример «Три числа»
дано текст равно "1.4.2"
ожидается вариант «Версия годна» с версия равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 4 и «младшая» равным 2)
тотальная функция «Версия строкой»
принимает верс: «Версия»
возвращает строка
пример «Три числа через точку»
дано верс равно запись «Версия» с «старшая» равным 1 и «средняя» равным 4 и «младшая» равным 2
ожидается "1.4.2"
тотальная функция «Версия раньше»
принимает а: «Версия», б: «Версия»
возвращает признак
обеспечивает «меньшая старшая часть решает дело сразу» если (а.«старшая») меньше (б.«старшая») то (результат равен да) иначе да
обеспечивает «большая старшая часть тоже решает дело сразу» если не ((а.«старшая») меньше (б.«старшая»)) то (если ((а.«старшая») больше (б.«старшая»)) то (результат равен нет) иначе да) иначе да
пример «Младшая раньше старшей»
дано а равно запись «Версия» с «старшая» равным 1 и «средняя» равным 9 и «младшая» равным 9
дано б равно запись «Версия» с «старшая» равным 2 и «средняя» равным 0 и «младшая» равным 0
ожидается да
тотальная функция «Версии равны»
принимает а: «Версия», б: «Версия»
возвращает признак
пример «Совпали»
дано а равно запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0
дано б равно запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0
ожидается да
тип «Диапазон»
вариант «Любая версия»
вариант «Ровно» содержит версия: «Версия»
вариант «Не ниже» содержит версия: «Версия»
вариант «В пределах» содержит старшая: число, средняя: число, точность: число
тип «Разбор диапазона»
вариант «Диапазон годен» содержит диапазон: «Диапазон»
вариант «Диапазон негоден» содержит причина: строка
тотальная функция «Годится»
принимает верс: «Версия», д: «Диапазон»
возвращает признак
пример «Не ниже 1.2 берёт 1.4.2»
дано верс равно запись «Версия» с «старшая» равным 1 и «средняя» равным 4 и «младшая» равным 2
дано д равно вариант «Не ниже» с версия равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 2 и «младшая» равным 0)
ожидается да
тотальная функция «Диапазон строкой»
принимает д: «Диапазон»
возвращает строка
пример «Не ниже печатается словами»
дано д равно вариант «Не ниже» с версия равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 2 и «младшая» равным 0)
ожидается "не ниже 1.2.0"
тотальная функция «Диапазон из версии»
принимает текст: строка, род: строка
возвращает «Разбор диапазона»
тотальная функция «Разобрать ветку»
принимает текст: строка
возвращает «Разбор диапазона»
пример «Ветка старшей»
дано текст равно "1.x"
ожидается вариант «Диапазон годен» с диапазон равным (вариант «В пределах» с старшая равным 1 и средняя равным 0 и точность равным 1)
тотальная функция «Разобрать диапазон»
принимает текст: строка
возвращает «Разбор диапазона»
обеспечивает «слово любая читается как любая версия» если («Обрезать» от текст) равен "любая" то (результат равен (вариант «Диапазон годен» с диапазон равным (вариант «Любая версия»))) иначе да
пример «Не ниже»
дано текст равно "не ниже 1.2"
ожидается вариант «Диапазон годен» с диапазон равным (вариант «Не ниже» с версия равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 2 и «младшая» равным 0))
объект «Нужда»
«имя»: строка
«диапазон»: «Диапазон»
«кто»: строка
объект «Запись реестра»
«имя»: строка
«версия»: «Версия»
«отпечаток»: строка
«адрес»: строка
«нужды»: список «Нужда»
объект «Сбор нужд»
«нужды»: список «Нужда»
«беда»: строка
тотальная функция «Учесть нужду»
принимает сбор: «Сбор нужд», текст: строка, кто: строка
возвращает «Сбор нужд»
обеспечивает «пустая нужда ничего к сбору не добавляет» если («Обрезать» от текст) равен "" то (результат равен сбор) иначе да
пример «Пустая нужда сбор не меняет»
дано сбор равно запись «Сбор нужд» с «нужды» равным пустой список и «беда» равным ""
дано текст равно " "
дано кто равно "запрос"
ожидается запись «Сбор нужд» с «нужды» равным пустой список и «беда» равным ""
тотальная функция «Разобрать нужды»
принимает текст: строка, кто: строка
возвращает «Сбор нужд»
пример «Две нужды через точку с запятой»
дано текст равно "Логика: не ниже 1.0; Множество строк: в пределах 1.x"
дано кто равно "запрос"
ожидается запись «Сбор нужд» с «нужды» равным [запись «Нужда» с «имя» равным "Логика" и «диапазон» равным (вариант «Не ниже» с версия равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0)) и «кто» равным "запрос", запись «Нужда» с «имя» равным "Множество строк" и «диапазон» равным (вариант «В пределах» с старшая равным 1 и средняя равным 0 и точность равным 1) и «кто» равным "запрос"] и «беда» равным ""
тип «Разбор записи»
вариант «Запись годна» содержит запись: «Запись реестра»
вариант «Запись негодна» содержит причина: строка
тотальная функция «Поле записи»
принимает куски: список строки, номер: число
возвращает строка
обеспечивает «поле в пределах строки — это оно и есть» если ((длина куски) не меньше номер) и притом (номер не меньше 1) то (результат равен (элемент номер в куски)) иначе да
обеспечивает «за пределами строки поле пусто» если не (((длина куски) не меньше номер) и притом (номер не меньше 1)) то (результат равен "") иначе да
пример «Поле в пределах строки»
дано куски равно ["Логика", "1.0.0", "ab12", "primer/logika.flang-package"]
дано номер равно 2
ожидается "1.0.0"
тотальная функция «Разобрать строку реестра»
принимает строчка: строка
возвращает «Разбор записи»
пример «Запись без нужд»
дано строчка равно "Логика | 1.0.0 | ab12 | primer/logika.flang-package"
ожидается вариант «Запись годна» с запись равным (запись «Запись реестра» с «имя» равным "Логика" и «версия» равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0) и «отпечаток» равным "ab12" и «адрес» равным "primer/logika.flang-package" и «нужды» равным пустой список)
объект «Реестр»
«записи»: список «Запись реестра»
«беды»: список строки
тотальная функция «Учесть строку реестра»
принимает реестр: «Реестр», строчка: строка
возвращает «Реестр»
обеспечивает «пустая строка и комментарий реестр не меняют» если ((«Обрезать» от строчка) равен "") или (строчка начинается с "#") то (результат равен реестр) иначе да
пример «Комментарий реестр не меняет»
дано реестр равно запись «Реестр» с «записи» равным пустой список и «беды» равным пустой список
дано строчка равно "# реестр flang, схема 1"
ожидается запись «Реестр» с «записи» равным пустой список и «беды» равным пустой список
тотальная функция «Разобрать реестр»
принимает текст: строка
возвращает «Реестр»
тотальная функция «Нужды строкой»
принимает нужды: список «Нужда»
возвращает строка
тотальная функция «Запись строкой»
принимает з: «Запись реестра»
возвращает строка
пример «Печать сходится с разбором»
дано з равно запись «Запись реестра» с «имя» равным "Логика" и «версия» равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0) и «отпечаток» равным "ab12" и «адрес» равным "primer/logika.flang-package" и «нужды» равным пустой список
ожидается "Логика | 1.0.0 | ab12 | primer/logika.flang-package | "
тотальная функция «Шапка реестра»
возвращает строка
тотальная функция «Реестр строкой»
принимает записи: список «Запись реестра»
возвращает строка
тотальная функция «Найти по имени»
принимает записи: список «Запись реестра», кусок: строка
возвращает список «Запись реестра»
обеспечивает «найдено не больше, чем есть в реестре» (длина результат) не больше (длина записи)
пример «Частичное совпадение»
дано записи равно [запись «Запись реестра» с «имя» равным "Списки строк" и «версия» равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0) и «отпечаток» равным "a" и «адрес» равным "b" и «нужды» равным пустой список]
дано кусок равно "Списки"
ожидается [запись «Запись реестра» с «имя» равным "Списки строк" и «версия» равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0) и «отпечаток» равным "a" и «адрес» равным "b" и «нужды» равным пустой список]
объект «Выбор»
«имя»: строка
«версия»: «Версия»
«отпечаток»: строка
«адрес»: строка
тип «Исход разрешения»
вариант «Разрешено» содержит выбор: список «Выбор»
вариант «Не разрешено» содержит причина: строка
тотальная функция «Нужды имени»
принимает нужды: список «Нужда», имя: строка
возвращает список «Нужда»
обеспечивает «нужд по имени не больше, чем нужд всего» (длина результат) не больше (длина нужды)
пример «По имени отобраны только свои»
дано нужды равно [
запись «Нужда» с «имя» равным "Логика" и «диапазон» равным (вариант «Любая версия») и «кто» равным "запрос",
запись «Нужда» с «имя» равным "Списки" и «диапазон» равным (вариант «Любая версия») и «кто» равным "запрос"]
дано имя равно "Логика"
ожидается [
запись «Нужда» с «имя» равным "Логика" и «диапазон» равным (вариант «Любая версия») и «кто» равным "запрос"]
тотальная функция «Все годятся»
принимает верс: «Версия», нужды: список «Нужда»
возвращает признак
тотальная функция «Кандидаты»
принимает записи: список «Запись реестра», имя: строка
возвращает список «Запись реестра»
обеспечивает «кандидатов не больше, чем записей в реестре» (длина результат) не больше (длина записи)
пример «Кандидат по точному имени»
дано записи равно [запись «Запись реестра» с «имя» равным "Логика" и «версия» равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0) и «отпечаток» равным "ab12" и «адрес» равным "primer/logika.flang-package" и «нужды» равным пустой список]
дано имя равно "Логика"
ожидается [запись «Запись реестра» с «имя» равным "Логика" и «версия» равным (запись «Версия» с «старшая» равным 1 и «средняя» равным 0 и «младшая» равным 0) и «отпечаток» равным "ab12" и «адрес» равным "primer/logika.flang-package" и «нужды» равным пустой список]
тотальная функция «Наибольшая»
принимает записи: список «Запись реестра», первая: «Запись реестра»
возвращает «Запись реестра»
тотальная функция «Требования словами»
принимает нужды: список «Нужда»
возвращает строка
тотальная функция «Версии словами»
принимает записи: список «Запись реестра»
возвращает строка
обеспечивает «пустому списку версий отвечает ни одной» если (длина записи) равен 0 то (результат равен "ни одной") иначе да
пример «Пустому списку — ни одной»
дано записи равно пустой список
ожидается "ни одной"
тип «Выбор имени»
вариант «Выбрано» содержит запись: «Запись реестра»
вариант «Не выбрано» содержит причина: строка
тотальная функция «Выбрать версию»
принимает записи: список «Запись реестра», нужды: список «Нужда», имя: строка
возвращает «Выбор имени»
тотальная функция «Добавить имя»
принимает набор: список строки, имя: строка
возвращает список строки
обеспечивает «уже известное имя набор не меняет» если (длина (отфильтровать набор где слово → слово равен имя)) больше 0 то (результат равен набор) иначе да
обеспечивает «новое имя дописывается в конец набора» если не ((длина (отфильтровать набор где слово → слово равен имя)) больше 0) то (результат равен (добавить имя к набор)) иначе да
пример «Новое имя дописывается в конец»
дано набор равно ["Логика"]
дано имя равно "Списки"
ожидается ["Логика", "Списки"]
тотальная функция «Имена нужд»
принимает нужды: список «Нужда»
возвращает список строки
тотальная функция «Нужда строкой»
принимает н: «Нужда»
возвращает строка
тотальная функция «Добавить нужду»
принимает нужды: список «Нужда», н: «Нужда»
возвращает список «Нужда»
обеспечивает «повторная нужда список нужд не меняет» если (длина (отфильтровать нужды где была → («Нужда строкой» от была) равен («Нужда строкой» от н))) больше 0 то (результат равен нужды) иначе да
обеспечивает «новая нужда дописывается в конец» если не ((длина (отфильтровать нужды где была → («Нужда строкой» от была) равен («Нужда строкой» от н))) больше 0) то (результат равен (добавить н к нужды)) иначе да
пример «Новая нужда дописывается в конец»
дано нужды равно пустой список
дано н равно запись «Нужда» с «имя» равным "Логика" и «диапазон» равным (вариант «Любая версия») и «кто» равным "запрос"
ожидается [
запись «Нужда» с «имя» равным "Логика" и «диапазон» равным (вариант «Любая версия») и «кто» равным "запрос"]
объект «Круг»
«выбор»: список «Выбор»
«нужды»: список «Нужда»
«беда»: строка
тотальная функция «Учесть имя»
принимает круг: «Круг», записи: список «Запись реестра», имя: строка
возвращает «Круг»
обеспечивает «после первой беды круг больше не трогается» если не ((круг.«беда») равен "") то (результат равен круг) иначе да
пример «После беды круг не трогается»
дано круг равно запись «Круг» с «выбор» равным пустой список и «нужды» равным пустой список и «беда» равным "требования вместе не выполнимы"
дано записи равно пустой список
дано имя равно "Логика"
ожидается запись «Круг» с «выбор» равным пустой список и «нужды» равным пустой список и «беда» равным "требования вместе не выполнимы"
тотальная функция «Пройти круг»
принимает записи: список «Запись реестра», нужды: список «Нужда»
возвращает «Круг»
тотальная функция «Разрешить»
принимает записи: список «Запись реестра», нужды: список «Нужда», топливо: число
возвращает «Исход разрешения»
обеспечивает «без топлива разрешение отказывает названной причиной» если топливо не больше 0 то (результат равен (вариант «Не разрешено» с причина равным "разрешение не сошлось за отведённое число кругов: нужды продолжают прибывать")) иначе да
пример «Без топлива — отказ названной причиной»
дано записи равно пустой список
дано нужды равно пустой список
дано топливо равно 0
ожидается вариант «Не разрешено» с причина равным "разрешение не сошлось за отведённое число кругов: нужды продолжают прибывать"
тотальная функция «Выбор строкой»
принимает верс: «Выбор»
возвращает строка
тотальная функция «Выборы строкой»
принимает выбор: список «Выбор»
возвращает строка
| Function | Termination | Claims |
|---|---|---|
| «Цифра ли» | доказано композицией | — |
| «Только цифры» | доказано композицией | доказано 1 из 1 |
| «Число из цифр» | доказано композицией | — |
| «Пробелы вместо переводов» | доказано композицией | — |
| «Обрезать» | доказано композицией | — |
| «После метки» | доказано композицией | — |
| «Часть версии» | доказано композицией | доказано 2 из 2 |
| «Все цифры» | доказано композицией | — |
| «Разобрать версию» | доказано композицией | — |
| «Версия строкой» | доказано композицией | — |
| «Версия раньше» | доказано композицией | доказано 2 из 2 |
| «Версии равны» | доказано композицией | — |
| «Годится» | доказано композицией | — |
| «Диапазон строкой» | доказано композицией | — |
| «Диапазон из версии» | доказано композицией | — |
| «Разобрать ветку» | доказано композицией | — |
| «Разобрать диапазон» | доказано композицией | доказано 1 из 1 |
| «Учесть нужду» | доказано композицией | доказано 1 из 1 |
| «Разобрать нужды» | доказано композицией | — |
| «Поле записи» | доказано композицией | доказано 2 из 2 |
| «Разобрать строку реестра» | доказано композицией | — |
| «Учесть строку реестра» | доказано композицией | доказано 1 из 1 |
| «Разобрать реестр» | доказано композицией | — |
| «Нужды строкой» | доказано композицией | — |
| «Запись строкой» | доказано композицией | — |
| «Шапка реестра» | доказано композицией | — |
| «Реестр строкой» | доказано композицией | — |
| «Найти по имени» | доказано композицией | доказано 1 из 1 |
| «Нужды имени» | доказано композицией | доказано 1 из 1 |
| «Все годятся» | доказано композицией | — |
| «Кандидаты» | доказано композицией | доказано 1 из 1 |
| «Наибольшая» | доказано композицией | — |
| «Требования словами» | доказано композицией | — |
| «Версии словами» | доказано композицией | доказано 1 из 1 |
| «Выбрать версию» | доказано композицией | — |
| «Добавить имя» | доказано композицией | доказано 2 из 2 |
| «Имена нужд» | доказано композицией | — |
| «Нужда строкой» | доказано композицией | — |
| «Добавить нужду» | доказано композицией | доказано 2 из 2 |
| «Учесть имя» | доказано композицией | доказано 1 из 1 |
| «Пройти круг» | доказано композицией | — |
| «Разрешить» | доказано постоянным шагом | доказано 1 из 1 |
| «Выбор строкой» | доказано композицией | — |
| «Выборы строкой» | доказано композицией | — |
«Result»
flang/stdlib/result.flang — functions 11; the kernel ledger was taken from this version of the file
тип «Результат» от «Значение» и «Беда»
вариант «Успех» содержит значение: «Значение»
вариант «Ошибка» содержит сообщение: «Беда»
тотальная функция «Успешный результат» от «Значение» и «Беда»
принимает значение: «Значение»
возвращает «Результат» от «Значение» и «Беда»
обеспечивает «успешный результат успешен» («Успешно» от результат) равен да
пример «Число становится успехом»
дано значение равно 5
ожидается вариант «Успех» с значение равным 5
тотальная функция «Ошибочный результат» от «Значение» и «Беда»
принимает сообщение: «Беда»
возвращает «Результат» от «Значение» и «Беда»
обеспечивает «ошибочный результат не успешен» («Успешно» от результат) равен нет
пример «Сообщение становится ошибкой»
дано сообщение равно "не вышло"
ожидается вариант «Ошибка» с сообщение равным "не вышло"
тотальная функция «Успешно» от «Значение» и «Беда»
принимает итог: «Результат» от «Значение» и «Беда»
возвращает признак
обеспечивает «успех узнаётся по варианту, и только по нему» разбор итог
случай вариант «Успех» с значение как зн
то результат равен да
случай вариант «Ошибка» с сообщение как текст
то результат равен нет
пример «Успех»
дано итог равно вариант «Успех» с значение равным 1
ожидается да
тотальная функция «Успех или запасное» от «Значение» и «Беда»
принимает итог: «Результат» от «Значение» и «Беда», запасное: «Значение»
возвращает «Значение»
обеспечивает «у успеха берётся ровно его значение, у ошибки — запасное» если («Успешно» от итог) то (итог равен (вариант «Успех» с значение равным результат)) иначе (результат равен запасное)
пример «Берётся значение успеха»
дано итог равно вариант «Успех» с значение равным 8
дано запасное равно 0
ожидается 8
тотальная функция «Сообщение или пусто» от «Значение»
принимает итог: «Результат» от «Значение» и строки
возвращает строка
обеспечивает «у успеха сообщение пусто, у ошибки — ровно её сообщение» если («Успешно» от итог) то (результат равен "") иначе (итог равен (вариант «Ошибка» с сообщение равным результат))
пример «У ошибки есть сообщение»
дано итог равно вариант «Ошибка» с сообщение равным "деление на ноль"
ожидается "деление на ноль"
тотальная функция «Безопасное деление»
принимает делимое: число, делитель: число
возвращает «Результат» от числа и строки
обеспечивает «на нулевом делителе выходит ошибка, и в ней сказано про деление на ноль» (не (делитель равен 0)) или (результат равен (вариант «Ошибка» с сообщение равным "деление на ноль"))
обеспечивает «в успехе лежит именно частное» (делитель равен 0) или (результат равен (вариант «Успех» с значение равным (делимое делить на делитель)))
пример «Обычное деление»
дано делимое равно 10
дано делитель равно 2
ожидается вариант «Успех» с значение равным 5
тотальная функция «Деление или запасное»
принимает делимое: число, делитель: число, запасное: число
возвращает число
обеспечивает «нулевой делитель даёт запасное» (не (делитель равен 0)) или (результат равен запасное)
обеспечивает «ненулевой делитель даёт частное» (делитель равен 0) или (результат равен (делимое делить на делитель))
пример «Обычное деление»
дано делимое равно 10
дано делитель равно 2
дано запасное равно 0
ожидается 5
тотальная функция «Сообщение деления»
принимает делимое: число, делитель: число
возвращает строка
обеспечивает «на нулевом делителе сообщение названо» (не (делитель равен 0)) или (результат равен "деление на ноль")
обеспечивает «при ненулевом делителе сообщения нет» (делитель равен 0) или (результат равен "")
пример «Успех молчит»
дано делимое равно 10
дано делитель равно 2
ожидается ""
тотальная функция «Разобрать цифру»
принимает текст: строка
возвращает «Результат» от числа и строки
обеспечивает «разбор успешен ровно на одиночной цифре» если ((длина текст) не равен 1) то (не («Успешно» от результат)) иначе (если ("0123456789" содержит текст) то («Успешно» от результат) иначе (не («Успешно» от результат)))
обеспечивает «на цифре разбирается именно её число» если ((длина текст) не равен 1) то да иначе (если ("0123456789" содержит текст) то ((«Успех или запасное» от результат и (0 минус 1)) равен (к числу текст)) иначе да)
пример «Цифра»
дано текст равно "7"
ожидается вариант «Успех» с значение равным 7
тотальная функция «Цифра или запасное»
принимает текст: строка, запасное: число
возвращает число
обеспечивает «цифра разбирается в своё число, прочее даёт запасное» если ((длина текст) не равен 1) то (результат равен запасное) иначе (если ("0123456789" содержит текст) то (результат равен (к числу текст)) иначе (результат равен запасное))
пример «Цифра разобрана»
дано текст равно "7"
дано запасное равно -1
ожидается 7
тотальная функция «Ошибка разбора»
принимает текст: строка
возвращает строка
обеспечивает «сообщение называет причину: не одна — так не цифра» если ((длина текст) не равен 1) то (результат равен "ожидалась одна цифра") иначе (если ("0123456789" содержит текст) то (результат равен "") иначе (результат равен "это не цифра"))
пример «Не цифра»
дано текст равно "ж"
ожидается "это не цифра"
| Function | Termination | Claims |
|---|---|---|
| «Успешный результат» | доказано композицией | доказано 1 из 1 |
| «Ошибочный результат» | доказано композицией | доказано 1 из 1 |
| «Успешно» | доказано композицией | доказано 1 из 1 |
| «Успех или запасное» | доказано композицией | доказано 1 из 1 |
| «Сообщение или пусто» | доказано композицией | доказано 1 из 1 |
| «Безопасное деление» | доказано композицией | доказано 2 из 2 |
| «Деление или запасное» | доказано композицией | доказано 2 из 2 |
| «Сообщение деления» | доказано композицией | доказано 2 из 2 |
| «Разобрать цифру» | доказано композицией | доказано 2 из 2 |
| «Цифра или запасное» | доказано композицией | доказано 1 из 1 |
| «Ошибка разбора» | доказано композицией | доказано 1 из 1 |
«RSA signature»
flang/stdlib/rsa.flang — functions 61; the kernel ledger was taken from this version of the file
тип «Перенос RSA»
вариант «Перенос RSA» содержит столбцы: список числа, перенос: число
тип «Заём RSA»
вариант «Заём RSA» содержит столбцы: список числа, заём: число
тип «Ход Монтгомери»
вариант «Ход Монтгомери» содержит остаток: список числа, перенос: число
тип «Хеш подписи»
вариант «SHA-1»
вариант «SHA-256»
тип «Ход маски»
вариант «Ход маски» содержит номер: число, набрано: список числа
тотальная функция «Нулей»
принимает сколько: число
возвращает список числа
обеспечивает «нулей не просили — список пуст» если сколько не больше 0 то (длина результат) равен 0 иначе да
пример «Три нуля»
дано сколько равно 3
ожидается [0, 0, 0]
тотальная функция «Повторить октет»
принимает значение: число, сколько: число
возвращает список числа
пример «Три раза по 255»
дано значение равно 255
дано сколько равно 3
ожидается [255, 255, 255]
тотальная функция «Разряд RSA»
принимает разряды: список числа, номер: число
возвращает число
пример «Второй разряд»
дано разряды равно [7, 8, 9]
дано номер равно 2
ожидается 8
тотальная функция «Отбросить RSA»
принимает разряды: список числа, сколько: число
возвращает список числа
обеспечивает «отброшенное не удлиняет» (длина результат) не больше (длина разряды)
пример «Без первого»
дано разряды равно [1, 2, 3]
дано сколько равно 1
ожидается [2, 3]
тотальная функция «Сложить RSA»
принимает первые: список числа, вторые: список числа
возвращает список числа
пример «Разной длины — хвост едет как есть»
дано первые равно [1, 2]
дано вторые равно [10, 20, 30]
ожидается [11, 22, 30]
тотальная функция «Добавить RSA»
принимает разряды: список числа, добавка: число
возвращает список числа
обеспечивает «добавка не меняет числа разрядов» (длина результат) равен (длина разряды)
пример «Добавка ложится на младший разряд»
дано разряды равно [1, 2]
дано добавка равно 5
ожидается [6, 2]
тотальная функция «Приписать список»
принимает первые: список числа, вторые: список числа
возвращает список числа
пример «Два и один»
дано первые равно [1, 2]
дано вторые равно [3]
ожидается [1, 2, 3]
тотальная функция «Перевернуть»
принимает разряды: список числа
возвращает список числа
обеспечивает «переворот не меняет длины» (длина результат) равен (длина разряды)
пример «Три знака наоборот»
дано разряды равно [1, 2, 3]
ожидается [3, 2, 1]
тотальная функция «Списки равны»
принимает первые: список числа, вторые: список числа
возвращает признак
пример «Равны»
дано первые равно [1, 2]
дано вторые равно [1, 2]
ожидается да
тотальная функция «Перенести RSA»
принимает ход: «Перенос RSA», разряд: число
возвращает «Перенос RSA»
обеспечивает «шаг переноса ставит ровно один столбец» (длина (результат.«столбцы»)) равен ((длина (ход.«столбцы»)) плюс 1)
пример «Малый разряд ложится столбцом, переноса нет»
дано ход равно (вариант «Перенос RSA» с столбцы равным пустой список и перенос равным 0)
дано разряд равно 5
ожидается вариант «Перенос RSA» с столбцы равным [5] и перенос равным 0
тотальная функция «Уложить RSA»
принимает разряды: список числа
возвращает «Перенос RSA»
обеспечивает «столбцов ровно столько, сколько разрядов» (длина (результат.«столбцы»)) равен (длина разряды)
пример «Три разряда в сетке — ни один не тронут»
дано разряды равно [1, 2, 3]
ожидается вариант «Перенос RSA» с столбцы равным [1, 2, 3] и перенос равным 0
тотальная функция «Вычесть RSA»
принимает первые: список числа, вторые: список числа, заём: число
возвращает «Заём RSA»
тотальная функция «Меньше разрядами»
принимает первые: список числа, вторые: список числа
возвращает признак
пример «Меньше в старшем разряде»
дано первые равно [0, 1]
дано вторые равно [0, 2]
ожидается да
тотальная функция «Шаг Ньютона»
принимает м: число, х: число
возвращает число
пример «Один шаг от единицы для 65535»
дано м равно 65535
дано х равно 1
ожидается 3
тотальная функция «Обратный по 65536»
принимает м: число
возвращает число
пример «Обратный к единице — единица»
дано м равно 1
ожидается 1
тотальная функция «Обратный со знаком минус»
принимает делитель: список числа
возвращает число
пример «Модуль с младшим разрядом 3»
дано делитель равно [3, 1]
ожидается 21845
тотальная функция «Свёртка RSA»
принимает а: список числа, б: список числа
возвращает список числа
пример «Двойка на тройку»
дано а равно [2]
дано б равно [3]
ожидается [6]
тотальная функция «Шаг Монтгомери»
принимает ход: «Ход Монтгомери», делитель: список числа, обратный: число
возвращает «Ход Монтгомери»
тотальная функция «Приведение Монтгомери»
принимает произведение: список числа, делитель: список числа, обратный: число
возвращает список числа
тотальная функция «Умножение Монтгомери»
принимает а: список числа, б: список числа, делитель: список числа, обратный: число
возвращает список числа
тотальная функция «Единица разрядами»
принимает делитель: список числа
возвращает список числа
обеспечивает «единица той же длины, что модуль» (длина результат) равен (длина делитель)
пример «Единица при модуле из двух разрядов»
дано делитель равно [7, 1]
ожидается [1, 0]
тотальная функция «R по модулю»
принимает делитель: список числа
возвращает список числа
обеспечивает «остаток той же длины, что модуль» (длина результат) равен (длина делитель)
пример «При модуле 65535 остаток единица»
дано делитель равно [65535]
ожидается [1]
тотальная функция «Удвоить по модулю»
принимает разряды: список числа, делитель: список числа
возвращает список числа
пример «Удвоение без выхода за модуль»
дано разряды равно [3]
дано делитель равно [65535]
ожидается [6]
тотальная функция «R по любому модулю»
принимает делитель: список числа
возвращает список числа
пример «При модуле 65535 остаток единица»
дано делитель равно [65535]
ожидается [1]
тотальная функция «Удвоить n раз»
принимает разряды: список числа, делитель: список числа
возвращает список числа
тотальная функция «R в квадрате»
принимает делитель: список числа, обратный: число
возвращает список числа
тотальная функция «Биты по счёту»
принимает н: число, счётчик: список числа
возвращает список числа
обеспечивает «битов ровно столько, сколько в счётчике» (длина результат) равен (длина счётчик)
пример «Пять тремя битами»
дано н равно 5
дано счётчик равно [0, 0, 0]
ожидается [1, 0, 1]
тотальная функция «Отбросить нули спереди»
принимает биты: список числа
возвращает список числа
обеспечивает «отброшенное не удлиняет» (длина результат) не больше (длина биты)
пример «Ведущие нули уходят»
дано биты равно [0, 0, 1, 0]
ожидается [1, 0]
тотальная функция «Значащие биты»
принимает н: число
возвращает список числа
пример «65537 — единица, пятнадцать нулей, единица»
дано н равно 65537
ожидается [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
тотальная функция «Шаг степени»
принимает акк: список числа, бит: число, основание: список числа, делитель: список числа, обратный: число
возвращает список числа
обеспечивает «на единичном бите к квадрату домножается основание» если не (бит равен 0) то (результат равен («Умножение Монтгомери» от («Умножение Монтгомери» от акк и акк и делитель и обратный) и основание и делитель и обратный)) иначе да
обеспечивает «на нулевом бите остаётся один квадрат» если бит равен 0 то результат равен («Умножение Монтгомери» от акк и акк и делитель и обратный) иначе да
пример «Нулевой бит: только квадрат»
дано акк равно [3]
дано бит равно 0
дано основание равно [5]
дано делитель равно [65535]
дано обратный равно 1
ожидается [9]
тотальная функция «Степень по модулю»
принимает основание: список числа, показатель: число, делитель: список числа
возвращает список числа
тотальная функция «Разряды из младших байтов»
принимает байты: список числа
возвращает список числа
пример «Два байта — один разряд»
дано байты равно [1, 1]
ожидается [257]
тотальная функция «Разряды из байтов»
принимает байты: список числа
возвращает список числа
пример «Два байта старшим вперёд»
дано байты равно [1, 1]
ожидается [257]
тотальная функция «Байты из разрядов»
принимает разряды: список числа
возвращает список числа
обеспечивает «на каждый разряд по два байта» (длина результат) равен (2 умножить на (длина разряды))
пример «Один разряд — два байта старшим вперёд»
дано разряды равно [258]
ожидается [1, 2]
тотальная функция «Метка SHA-256»
возвращает список числа
обеспечивает «метка длиной девятнадцать байтов» (длина результат) равен 19
пример «Та самая девятнадцатибайтовая обёртка»
ожидается [48, 49, 48, 13, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 1, 5, 0, 4, 32]
тотальная функция «Ожидаемая набивка»
принимает хеш: список числа, размер: число
возвращает список числа
пример «Набивка на игрушечный ключ в 55 байтов»
дано хеш равно [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32]
дано размер равно 55
ожидается [0, 1, 255, 0, 48, 49, 48, 13, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 1, 5, 0, 4, 32, 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
тотальная функция «Восстановленная набивка»
принимает подпись: список числа, делитель: список числа, показатель: число
возвращает список числа
тотальная функция «Подпись верна»
принимает подпись: список числа, делитель: список числа, показатель: число, хеш: список числа
возвращает признак
обеспечивает «подпись не той длины, что модуль, верной не бывает» если не ((длина подпись) равен (длина делитель)) то (не результат) иначе да
пример «Настоящая подпись игрушечного ключа в 448 бит сходится»
дано подпись равно [97, 31, 20, 59, 59, 15, 189, 143, 253, 131, 145, 77, 226, 59, 167, 216, 209, 191, 38, 237, 133,
230, 226, 86, 219, 55, 194, 247, 199, 210, 222, 132, 104, 17, 234, 60, 202, 48, 80, 158, 134, 243, 66, 32, 164,
221, 153, 44, 96, 236, 0, 119, 82, 229, 207, 100]
дано делитель равно [158, 130, 2, 6, 14, 228, 235, 102, 117, 168, 76, 207, 46, 117, 156, 132, 35, 164, 131, 166, 80,
240, 33, 215, 232, 189, 227, 50, 169, 182, 158, 16, 36, 161, 32, 113, 144, 185, 115, 207, 205, 197, 22, 207, 105,
30, 155, 112, 39, 146, 208, 182, 106, 172, 192, 187]
дано показатель равно 65537
дано хеш равно [188, 130, 227, 13, 129, 112, 155, 38, 242, 200, 3, 3, 0, 120, 78, 149, 0, 63, 27, 150, 142, 30, 215,
132, 47, 167, 23, 133, 142, 73, 115, 54]
ожидается да
тотальная функция «Длина хеша»
принимает вид: «Хеш подписи»
возвращает число
пример «SHA-1 — двадцать октетов»
дано вид равно вариант «SHA-1»
ожидается 20
тотальная функция «Хеш вида»
принимает вид: «Хеш подписи», байты: список числа
возвращает список числа
пример «SHA-1 от abc — вектор FIPS 180-4»
дано вид равно вариант «SHA-1»
дано байты равно [97, 98, 99]
ожидается [169, 153, 62, 54, 71, 6, 129, 106, 186, 62, 37, 113, 120, 80, 194, 108, 156, 208, 216, 157]
тотальная функция «Счётчик MGF1»
принимает номер: число
возвращает список числа
обеспечивает «счётчик — четыре октета» (длина результат) равен 4
пример «нулевой счётчик»
дано номер равно 0
ожидается [0, 0, 0, 0]
тотальная функция «Шаг маски»
принимает вид: «Хеш подписи», зерно: список числа, ход: «Ход маски»
возвращает «Ход маски»
тотальная функция «Маска MGF1»
принимает вид: «Хеш подписи», зерно: список числа, сколько: число
возвращает список числа
обеспечивает «маска не длиннее заказа» (длина результат) не больше (если сколько не больше 0 то 0 иначе сколько)
пример «MGF1-SHA-1 от пустого зерна — первые четыре октета SHA-1 от четырёх нулевых октетов»
дано вид равно вариант «SHA-1»
дано зерно равно пустой список
дано сколько равно 4
ожидается [144, 105, 202, 120]
тотальная функция «Битов в октете»
принимает октет: число
возвращает число
обеспечивает «битов не больше восьми» результат не больше 8
пример «единица — один бит»
дано октет равно 1
ожидается 1
тотальная функция «Множитель шага»
принимает шаг: число, показатель: число
возвращает число
пример «шаг в пределах показателя удваивает»
дано шаг равно 3
дано показатель равно 7
ожидается 2
тотальная функция «Удвоить столько раз»
принимает разряды: список числа, делитель: список числа, раз: число
возвращает список числа
пример «единица, удвоенная трижды по модулю 7»
дано разряды равно [1]
дано делитель равно [7]
дано раз равно 3
ожидается [1]
тотальная функция «Степень двойки»
принимает показатель: число
возвращает число
пример «два в седьмой»
дано показатель равно 7
ожидается 128
тотальная функция «Октеты длиной»
принимает разряды: список числа, сколько: число
возвращает список числа
пример «один разряд в один октет»
дано разряды равно [258]
дано сколько равно 1
ожидается [2]
тотальная функция «Высота верхнего октета»
принимает делитель: список числа
возвращает число
пример «модуль 1024 бита — в верхнем октете семь битов кодировки»
дано делитель равно [165, 110]
ожидается 7
тотальная функция «Граница верхнего октета»
принимает высота: число
возвращает число
пример «высота ноль — октет целиком свободен»
дано высота равно 0
ожидается 256
тотальная функция «Сбросить верх»
принимает октеты: список числа, граница: число
возвращает список числа
пример «старший бит сброшен»
дано октеты равно [255, 1]
дано граница равно 128
ожидается [127, 1]
тотальная функция «Все нули»
принимает октеты: список числа
возвращает признак
пример «нули»
дано октеты равно [0, 0]
ожидается да
тотальная функция «Кодировка PSS сходится»
принимает вид: «Хеш подписи», кодировка: список числа, граница: число, хеш: список числа
возвращает признак
тотальная функция «Октеты PSS сходятся»
принимает вид: «Хеш подписи», октеты: список числа, делитель: список числа, хеш: список числа
возвращает признак
тотальная функция «Подпись PSS верна»
принимает вид: «Хеш подписи», подпись: список числа, делитель: список числа, показатель: число, хеш: список числа
возвращает признак
обеспечивает «подпись чужой длины неверна» если не ((длина подпись) равен (длина делитель)) то (не результат) иначе да
пример «подпись короче модуля верной не бывает»
дано вид равно вариант «SHA-256»
дано подпись равно [0, 1]
дано делитель равно [0, 1, 2]
дано показатель равно 65537
дано хеш равно пустой список
ожидается нет
тотальная функция «Строчные шестнадцать»
возвращает строка
обеспечивает «в азбуке шестнадцать знаков» (длина результат) равен 16
пример «Строчная азбука целиком»
ожидается "0123456789abcdef"
тотальная функция «Прописные шестнадцать»
возвращает строка
обеспечивает «в азбуке шестнадцать знаков» (длина результат) равен 16
пример «Прописная азбука целиком»
ожидается "0123456789ABCDEF"
тотальная функция «Значение знака 16»
принимает знак: строка
возвращает число
пример «Строчная a — это десять»
дано знак равно "a"
ожидается 10
тотальная функция «Байт по счёту»
принимает текст: строка, номер: число
возвращает число
пример «Первый байт из ff00»
дано текст равно "ff00"
дано номер равно 1
ожидается 255
тотальная функция «Байты до места»
принимает текст: строка, место: число
возвращает список числа
тотальная функция «Байты из шестнадцатеричного»
принимает текст: строка
возвращает список числа
пример «Четыре знака — два байта»
дано текст равно "00ff"
ожидается [0, 255]
| Function | Termination | Claims |
|---|---|---|
| «Нулей» | доказано постоянным шагом | доказано 1 из 1 |
| «Повторить октет» | доказано постоянным шагом | — |
| «Разряд RSA» | доказано структурой | — |
| «Отбросить RSA» | доказано структурой | доказано 1 из 1 |
| «Сложить RSA» | доказано структурой | — |
| «Добавить RSA» | доказано композицией | доказано 1 из 1 |
| «Приписать список» | доказано структурой | — |
| «Перевернуть» | доказано композицией | доказано 1 из 1 |
| «Списки равны» | доказано структурой | — |
| «Перенести RSA» | доказано композицией | доказано 1 из 1 |
| «Уложить RSA» | доказано композицией | доказано 1 из 1 |
| «Вычесть RSA» | доказано структурой | — |
| «Меньше разрядами» | доказано композицией | — |
| «Шаг Ньютона» | доказано композицией | — |
| «Обратный по 65536» | доказано композицией | — |
| «Обратный со знаком минус» | доказано композицией | — |
| «Свёртка RSA» | доказано структурой | — |
| «Шаг Монтгомери» | доказано композицией | — |
| «Приведение Монтгомери» | доказано композицией | — |
| «Умножение Монтгомери» | доказано композицией | — |
| «Единица разрядами» | доказано композицией | доказано 1 из 1 |
| «R по модулю» | доказано композицией | доказано 1 из 1 |
| «Удвоить по модулю» | доказано композицией | — |
| «R по любому модулю» | доказано композицией | — |
| «Удвоить n раз» | доказано композицией | — |
| «R в квадрате» | доказано композицией | — |
| «Биты по счёту» | доказано структурой | доказано 1 из 1 |
| «Отбросить нули спереди» | доказано структурой | доказано 1 из 1 |
| «Значащие биты» | доказано композицией | — |
| «Шаг степени» | доказано композицией | доказано 2 из 2 |
| «Степень по модулю» | доказано композицией | — |
| «Разряды из младших байтов» | доказано структурой | — |
| «Разряды из байтов» | доказано композицией | — |
| «Байты из разрядов» | доказано композицией | доказано 0 из 1; «на каждый разряд по два байта» — сетка |
| «Метка SHA-256» | доказано композицией | доказано 1 из 1 |
| «Ожидаемая набивка» | доказано композицией | — |
| «Восстановленная набивка» | доказано композицией | — |
| «Подпись верна» | доказано композицией | доказано 1 из 1 |
| «Длина хеша» | доказано композицией | — |
| «Хеш вида» | доказано композицией | — |
| «Счётчик MGF1» | доказано композицией | доказано 1 из 1 |
| «Шаг маски» | доказано композицией | — |
| «Маска MGF1» | доказано композицией | доказано 0 из 1; «маска не длиннее заказа» — сетка |
| «Битов в октете» | доказано композицией | доказано 0 из 1; «битов не больше восьми» — сетка |
| «Множитель шага» | доказано композицией | — |
| «Удвоить столько раз» | доказано композицией | — |
| «Степень двойки» | доказано композицией | — |
| «Октеты длиной» | доказано композицией | — |
| «Высота верхнего октета» | доказано композицией | — |
| «Граница верхнего октета» | доказано композицией | — |
| «Сбросить верх» | доказано композицией | — |
| «Все нули» | доказано композицией | — |
| «Кодировка PSS сходится» | доказано композицией | — |
| «Октеты PSS сходятся» | доказано композицией | — |
| «Подпись PSS верна» | доказано композицией | доказано 1 из 1 |
| «Строчные шестнадцать» | доказано композицией | доказано 1 из 1 |
| «Прописные шестнадцать» | доказано композицией | доказано 1 из 1 |
| «Значение знака 16» | доказано композицией | — |
| «Байт по счёту» | доказано композицией | — |
| «Байты до места» | доказано постоянным шагом | — |
| «Байты из шестнадцатеричного» | доказано композицией | — |
«Samples»
flang/stdlib/samples.flang — functions 34; the kernel ledger was taken from this version of the file
тип «Класс»
вариант «Кириллица»
вариант «Латиница»
вариант «Цифры»
вариант «Хань»
вариант «Буквы»
вариант «Словесные»
вариант «Пробелы»
вариант «Ничто»
тотальная функция «Точка кириллицы»
принимает точка: число
возвращает признак
пример «строчная а»
дано точка равно 1072
ожидается да
тотальная функция «Точка латиницы»
принимает точка: число
возвращает признак
пример «строчная a»
дано точка равно 97
ожидается да
тотальная функция «Точка цифры»
принимает точка: число
возвращает признак
пример «ноль»
дано точка равно 48
ожидается да
тотальная функция «Точка ханя»
принимает точка: число
возвращает признак
пример «иероглиф 语»
дано точка равно 35821
ожидается да
тотальная функция «Точка буквы»
принимает точка: число
возвращает признак
пример «латиница»
дано точка равно 113
ожидается да
тотальная функция «Точка пробела»
принимает точка: число
возвращает признак
пример «обычный пробел»
дано точка равно 32
ожидается да
тотальная функция «В классе»
принимает класс: «Класс», точка: число
возвращает признак
обеспечивает «класс кириллицы спрашивает точку кириллицы» (не (класс равен (вариант «Кириллица»))) или (результат равен («Точка кириллицы» от точка))
обеспечивает «класс латиницы спрашивает точку латиницы» (не (класс равен (вариант «Латиница»))) или (результат равен («Точка латиницы» от точка))
обеспечивает «класс цифр спрашивает точку цифры» (не (класс равен (вариант «Цифры»))) или (результат равен («Точка цифры» от точка))
обеспечивает «класс ханя спрашивает точку ханя» (не (класс равен (вариант «Хань»))) или (результат равен («Точка ханя» от точка))
обеспечивает «класс букв спрашивает точку буквы» (не (класс равен (вариант «Буквы»))) или (результат равен («Точка буквы» от точка))
обеспечивает «класс словесных — это буква или цифра» (не (класс равен (вариант «Словесные»))) или (результат равен ((«Точка буквы» от точка) или («Точка цифры» от точка)))
обеспечивает «класс пробелов спрашивает точку пробела» (не (класс равен (вариант «Пробелы»))) или (результат равен («Точка пробела» от точка))
пример «кириллическая буква в классе кириллицы»
дано класс равно вариант «Кириллица»
дано точка равно 1084
ожидается да
тотальная функция «Точка вниз»
принимает точка: число
возвращает число
обеспечивает «латинская заглавная опускается ровно на 32» если (точка не меньше 65) и притом (точка не больше 90) то (результат равен (точка плюс 32)) иначе да
обеспечивает «кириллическая заглавная опускается ровно на 32» если не ((точка не меньше 65) и притом (точка не больше 90)) то (если (точка не меньше 1040) и притом (точка не больше 1071) то (результат равен (точка плюс 32)) иначе да) иначе да
пример «латинская A»
дано точка равно 65
ожидается 97
тотальная функция «Знак вниз»
принимает знак: строка
возвращает строка
обеспечивает «пустой знак сводится в пустой» если (длина знак) равен 0 то (результат равен "") иначе да
обеспечивает «половина суррогатной пары отдаётся как есть» если не ((длина знак) равен 0) то (если ((код символа знак) не меньше 55296) и притом ((код символа знак) не больше 57343) то (результат равен знак) иначе да) иначе да
обеспечивает «прочий знак опускается своей кодовой точкой» ((длина знак) равен 0) или ((((код символа знак) не меньше 55296) и притом ((код символа знак) не больше 57343)) или (результат равен (символ по коду («Точка вниз» от (код символа знак)))))
пример «латиница»
дано знак равно "A"
ожидается "a"
тотальная функция «Вниз»
принимает текст: строка
возвращает строка
обеспечивает «свод регистра не меняет длины» (длина результат) равен (длина текст)
обеспечивает «на одном знаке свод совпадает с побуквенным» ((длина текст) не равен 1) или (результат равен («Знак вниз» от текст))
пример «смешанный текст»
дано текст равно "ЭталоН Ab"
ожидается "эталон ab"
тотальная функция «Точка вверх»
принимает точка: число
возвращает число
обеспечивает «латинская строчная поднимается ровно на 32» если (точка не меньше 97) и притом (точка не больше 122) то (результат равен (точка минус 32)) иначе да
обеспечивает «кириллическая строчная поднимается ровно на 32» если не ((точка не меньше 97) и притом (точка не больше 122)) то (если (точка не меньше 1072) и притом (точка не больше 1103) то (результат равен (точка минус 32)) иначе да) иначе да
обеспечивает «спуск после подъёма возвращает строчную латинскую точку» если (точка не меньше 97) и притом (точка не больше 122) то ((«Точка вниз» от результат) равен точка) иначе да
обеспечивает «спуск после подъёма возвращает строчную кириллическую точку» если не ((точка не меньше 97) и притом (точка не больше 122)) то (если (точка не меньше 1072) и притом (точка не больше 1103) то ((«Точка вниз» от результат) равен точка) иначе да) иначе да
обеспечивает «спуск после подъёма возвращает ё» если точка равен 1105 то ((«Точка вниз» от результат) равен точка) иначе да
пример «латинская a»
дано точка равно 97
ожидается 65
тотальная функция «Знак вверх»
принимает знак: строка
возвращает строка
обеспечивает «пустой знак поднимается в пустой» если (длина знак) равен 0 то (результат равен "") иначе да
обеспечивает «половина суррогатной пары не поднимается» если не ((длина знак) равен 0) то (если ((код символа знак) не меньше 55296) и притом ((код символа знак) не больше 57343) то (результат равен знак) иначе да) иначе да
обеспечивает «прочий знак поднимается своей кодовой точкой» ((длина знак) равен 0) или ((((код символа знак) не меньше 55296) и притом ((код символа знак) не больше 57343)) или (результат равен (символ по коду («Точка вверх» от (код символа знак)))))
пример «латиница»
дано знак равно "a"
ожидается "A"
тотальная функция «Вверх»
принимает текст: строка
возвращает строка
обеспечивает «подъём регистра не меняет длины» (длина результат) равен (длина текст)
обеспечивает «на одном знаке подъём совпадает с побуквенным» ((длина текст) не равен 1) или (результат равен («Знак вверх» от текст))
обеспечивает «спуск после подъёма даёт тот же нижний, что и один спуск» («Вниз» от результат) равен («Вниз» от текст)
пример «смешанный текст»
дано текст равно "ЭталоН Ab"
ожидается "ЭТАЛОН AB"
тотальная функция «Точка в месте»
принимает текст: строка, место: число
возвращает число
обеспечивает «за краем строки — минус один, и только там» (результат равен -1) равен ((место меньше 1) или (место больше (длина текст)))
обеспечивает «за краем строки стоит минус один» если (место меньше 1) или (место больше (длина текст)) то (результат равен -1) иначе да
обеспечивает «внутри строки стоит код знака этого места» если не ((место меньше 1) или (место больше (длина текст))) то (результат равен (код символа (символ место в текст))) иначе да
пример «первый знак»
дано текст равно "мир"
дано место равно 1
ожидается 1084
тотальная функция «Совпало с места»
принимает текст: строка, место: число, кусок: строка
возвращает признак
обеспечивает «пустой кусок совпадает где угодно» если (длина кусок) равен 0 то (результат равен да) иначе да
обеспечивает «внутри строки совпадение — это равенство подстроки куску» если не ((длина кусок) равен 0) то (если не ((место меньше 1) или ((место плюс ((длина кусок) минус 1)) больше (длина текст))) то (результат равен ((подстрока текст с место по (место плюс ((длина кусок) минус 1))) равен кусок)) иначе да) иначе да
обеспечивает «кусок за концом строки не совпадает» если не ((длина кусок) равен 0) то (если (место меньше 1) или ((место плюс ((длина кусок) минус 1)) больше (длина текст)) то (результат равен нет) иначе да) иначе да
обеспечивает «совпадение с первого места — это начало строки» ((длина кусок) равен 0) или ((место не равен 1) или (результат равен (текст начинается с кусок)))
пример «в середине»
дано текст равно "абвг"
дано место равно 3
дано кусок равно "вг"
ожидается да
тотальная функция «Граница слева»
принимает текст: строка, место: число, класс: «Класс»
возвращает признак
обеспечивает «начало строки — всегда граница» (место не равен 1) или результат
пример «начало строки»
дано текст равно "эталон"
дано место равно 1
дано класс равно вариант «Кириллица»
ожидается да
тотальная функция «Граница справа»
принимает текст: строка, конец: число, класс: «Класс»
возвращает признак
обеспечивает «конец строки — всегда граница» (конец не равен (длина текст)) или результат
пример «конец строки»
дано текст равно "свод"
дано конец равно 4
дано класс равно вариант «Кириллица»
ожидается да
тип «Ход поиска»
вариант «Поиск» содержит место: число, найдено: число
тотальная функция «Найдено»
принимает ход: «Ход поиска»
возвращает число
пример «ничего не нашлось»
дано ход равно вариант «Поиск» с место равным 4 и найдено равным 0
ожидается 0
тотальная функция «Шаг поиска»
принимает ход: «Ход поиска», текст: строка, кусок: строка, слева: «Класс», справа: «Класс»
возвращает «Ход поиска»
обеспечивает «шаг поиска двигает место ровно на один» (результат.место) равен ((ход.место) плюс 1)
обеспечивает «найденное шагом поиска не перебивается» (не ((ход.найдено) больше 0)) или ((результат.найдено) равен (ход.найдено))
обеспечивает «первое совпадение с границами и есть найденное место» если (((ход.найдено) не больше 0) и притом ((«Совпало с места» от текст и ((ход.место) плюс 1) и кусок) и притом ((«Граница слева» от текст и ((ход.место) плюс 1) и слева) и притом («Граница справа» от текст и (((ход.место) плюс 1) плюс ((длина кусок) минус 1)) и справа)))) то ((результат.найдено) равен ((ход.место) плюс 1)) иначе да
пример «первое совпадение запоминается»
дано ход равно вариант «Поиск» с место равным 0 и найдено равным 0
дано текст равно "свод"
дано кусок равно "свод"
дано слева равно вариант «Кириллица»
дано справа равно вариант «Ничто»
ожидается вариант «Поиск» с место равным 1 и найдено равным 1
тотальная функция «Место образца»
принимает текст: строка, кусок: строка, слева: «Класс», справа: «Класс»
возвращает число
обеспечивает «пустой кусок не ищется» если (длина кусок) равен 0 то (результат равен 0) иначе да
обеспечивает «найденное место лежит внутри строки» (результат равен 0) или ((результат не меньше 1) и притом (результат не больше (длина текст)))
обеспечивает «на найденном месте кусок и правда стоит» (результат равен 0) или («Совпало с места» от текст и результат и кусок)
обеспечивает «слева от найденного места граница держится» (результат равен 0) или («Граница слева» от текст и результат и слева)
пример «в середине, с границей слева»
дано текст равно "тот эталон"
дано кусок равно "эталон"
дано слева равно вариант «Кириллица»
дано справа равно вариант «Ничто»
ожидается 5
тотальная функция «Есть основа»
принимает текст: строка, основа: строка, слева: «Класс»
возвращает признак
обеспечивает «пустая основа не ловится» ((длина основа) больше 0) или (не результат)
пример «слово целиком»
дано текст равно "эталон сверен"
дано основа равно "эталон"
дано слева равно вариант «Кириллица»
ожидается да
тотальная функция «Есть слово»
принимает текст: строка, слово: строка, класс: «Класс»
возвращает признак
обеспечивает «пустое слово не ловится» ((длина слово) больше 0) или (не результат)
обеспечивает «что поймано словом, то поймано и основой» (не результат) или («Есть основа» от текст и слово и класс)
пример «слово целиком»
дано текст равно "тот свод здесь"
дано слово равно "свод"
дано класс равно вариант «Словесные»
ожидается да
тотальная функция «Есть с окончаниями»
принимает текст: строка, основа: строка, окончания: список строки, класс: «Класс»
возвращает признак
обеспечивает «голая основа ловится и без окончаний» (не («Есть слово» от текст и основа и класс)) или результат
пример «голая основа»
дано текст равно "этот свод"
дано основа равно "свод"
дано окончания равно ["а", "е", "ом", "ы", "ов"]
дано класс равно вариант «Кириллица»
ожидается да
тотальная функция «Есть основа со знаком»
принимает текст: строка, основа: строка, знаки: строка, слева: «Класс»
возвращает признак
обеспечивает «пустой набор знаков не ловит ничего» ((длина знаки) больше 0) или (не результат)
пример «близнец»
дано текст равно "близнец отстаёт"
дано основа равно "близне"
дано знаки равно "цч"
дано слева равно вариант «Кириллица»
ожидается да
тотальная функция «Есть кусок»
принимает текст: строка, кусок: строка
возвращает признак
пример «есть»
дано текст равно "сверено byte-for-byte и всё"
дано кусок равно "byte-for-byte"
ожидается да
тотальная функция «Есть любое»
принимает текст: строка, куски: список строки
возвращает признак
обеспечивает «пустое чередование не ловит ничего» ((длина куски) больше 0) или (не результат)
пример «второй вариант»
дано текст равно "сверено byte by byte"
дано куски равно ["byte-for-byte", "byte for byte", "byte-by-byte", "byte by byte"]
ожидается да
тотальная функция «Второе близко»
принимает текст: строка, конец: число, второе: строка, зазор: неотрицательное
возвращает признак
обеспечивает «второе ровно за зазором — это да» (не («Совпало с места» от текст и (конец плюс (1 плюс зазор)) и второе)) или результат
обеспечивает «при нулевом зазоре ответ есть совпадение вплотную» (не (зазор не больше 0)) или (результат равен («Совпало с места» от текст и (конец плюс (1 плюс зазор)) и второе))
пример «вплотную»
дано текст равно "abcd"
дано конец равно 2
дано второе равно "cd"
дано зазор равно 0
ожидается да
тотальная функция «Шаг рядом»
принимает ход: «Ход поиска», текст: строка, первое: строка, второе: строка, зазор: неотрицательное, слева: «Класс»
возвращает «Ход поиска»
обеспечивает «шаг поиска рядом двигает место ровно на один» (результат.место) равен ((ход.место) плюс 1)
обеспечивает «найденное шагом рядом не перебивается» (не ((ход.найдено) больше 0)) или ((результат.найдено) равен (ход.найдено))
обеспечивает «первая основа с границей и вторая в зазоре дают найденное место» если (((ход.найдено) не больше 0) и притом ((«Совпало с места» от текст и ((ход.место) плюс 1) и первое) и притом ((«Граница слева» от текст и ((ход.место) плюс 1) и слева) и притом («Второе близко» от текст и (((ход.место) плюс 1) плюс ((длина первое) минус 1)) и второе и зазор)))) то ((результат.найдено) равен ((ход.место) плюс 1)) иначе да
пример «сошлось на первом же месте»
дано ход равно вариант «Поиск» с место равным 0 и найдено равным 0
дано текст равно "неподвижная точка"
дано первое равно "неподвижн"
дано второе равно "точк"
дано зазор равно 4
дано слева равно вариант «Кириллица»
ожидается вариант «Поиск» с место равным 1 и найдено равным 1
тотальная функция «Есть рядом»
принимает текст: строка, первое: строка, второе: строка, зазор: неотрицательное, слева: «Класс»
возвращает признак
обеспечивает «пустая первая основа не ловится» если (длина первое) равен 0 то (результат равен нет) иначе да
пример «неподвижная точка»
дано текст равно "здесь неподвижная точка"
дано первое равно "неподвижн"
дано второе равно "точк"
дано зазор равно 4
дано слева равно вариант «Кириллица»
ожидается да
тотальная функция «Всё в классе»
принимает текст: строка, класс: «Класс»
возвращает признак
обеспечивает «в пустой строке ничего целиком не лежит» ((длина текст) больше 0) или (не результат)
пример «только цифры»
дано текст равно "1204"
дано класс равно вариант «Цифры»
ожидается да
тотальная функция «Есть точка класса»
принимает текст: строка, класс: «Класс»
возвращает признак
обеспечивает «в пустой строке точек нет» ((длина текст) больше 0) или (не результат)
обеспечивает «что лежит целиком, то лежит и хоть где-то» (не («Всё в классе» от текст и класс)) или результат
пример «иероглиф в имени»
дано текст равно "语言"
дано класс равно вариант «Хань»
ожидается да
тотальная функция «Смесь алфавитов»
принимает слово: строка
возвращает признак
обеспечивает «слово из одного алфавита смесью не бывает» (не («Всё в классе» от слово и (вариант «Кириллица»))) или (не результат)
обеспечивает «при кириллице в слове смесь равна наличию латиницы» (не («Есть точка класса» от слово и (вариант «Кириллица»))) или (результат равен («Есть точка класса» от слово и (вариант «Латиница»)))
пример «латинская k посреди кириллицы»
дано слово равно "сборkа"
ожидается да
объект «Ход замены»
«место»: число
«пропуск»: число
«вывод»: строка
тотальная функция «Шаг замены»
принимает текст: строка, кусок: строка, чем: строка, слева: «Класс», справа: «Класс», ход: «Ход замены», знак: строка
возвращает «Ход замены»
обеспечивает «на пропуске знак в вывод не попадает» если (ход.«пропуск») больше 0 то (результат равен (запись «Ход замены» с «место» равным ((ход.«место») плюс 1) и «пропуск» равным ((ход.«пропуск») минус 1) и «вывод» равным (ход.«вывод»))) иначе да
обеспечивает «шаг замены двигает место ровно на один» (результат.«место») равен ((ход.«место») плюс 1)
обеспечивает «совпадение кладёт в пропуск кусок без первого знака» если ((не ((ход.«пропуск») больше 0)) и притом ((«Совпало с места» от текст и ((ход.«место») плюс 1) и кусок) и притом ((«Граница слева» от текст и ((ход.«место») плюс 1) и слева) и притом («Граница справа» от текст и (((ход.«место») плюс 1) плюс ((длина кусок) минус 1)) и справа)))) то ((результат.«пропуск») равен ((длина кусок) минус 1)) иначе да
обеспечивает «совпадение дописывает в вывод замену» если ((не ((ход.«пропуск») больше 0)) и притом ((«Совпало с места» от текст и ((ход.«место») плюс 1) и кусок) и притом ((«Граница слева» от текст и ((ход.«место») плюс 1) и слева) и притом («Граница справа» от текст и (((ход.«место») плюс 1) плюс ((длина кусок) минус 1)) и справа)))) то ((результат.«вывод») равен (соединить [(ход.«вывод»), чем] по "")) иначе да
обеспечивает «вне совпадения в вывод идёт сам знак» ((ход.«пропуск») больше 0) или (((«Совпало с места» от текст и ((ход.«место») плюс 1) и кусок) и притом ((«Граница слева» от текст и ((ход.«место») плюс 1) и слева) и притом («Граница справа» от текст и (((ход.«место») плюс 1) плюс ((длина кусок) минус 1)) и справа))) или ((результат.«вывод») равен (соединить [(ход.«вывод»), знак] по "")))
пример «знак вне совпадения переписывается как есть»
дано текст равно "абв"
дано кусок равно "яя"
дано чем равно "-"
дано слева равно вариант «Ничто»
дано справа равно вариант «Ничто»
дано ход равно запись «Ход замены» с «место» равным 0 и «пропуск» равным 0 и «вывод» равным ""
дано знак равно "а"
ожидается запись «Ход замены» с «место» равным 1 и «пропуск» равным 0 и «вывод» равным "а"
тотальная функция «Заменить кусок»
принимает текст: строка, кусок: строка, чем: строка, слева: «Класс», справа: «Класс»
возвращает строка
обеспечивает «пустой кусок ничего не меняет» если (длина кусок) равен 0 то (результат равен текст) иначе да
пример «одно вхождение»
дано текст равно "тот эталон здесь"
дано кусок равно "эталон"
дано чем равно "образец"
дано слева равно вариант «Кириллица»
дано справа равно вариант «Кириллица»
ожидается "тот образец здесь"
| Function | Termination | Claims |
|---|---|---|
| «Точка кириллицы» | доказано композицией | — |
| «Точка латиницы» | доказано композицией | — |
| «Точка цифры» | доказано композицией | — |
| «Точка ханя» | доказано композицией | — |
| «Точка буквы» | доказано композицией | — |
| «Точка пробела» | доказано композицией | — |
| «В классе» | доказано композицией | доказано 7 из 7 |
| «Точка вниз» | доказано композицией | доказано 2 из 2 |
| «Знак вниз» | доказано композицией | доказано 3 из 3 |
| «Вниз» | доказано композицией | доказано 0 из 2; «свод регистра не меняет длины» — сетка; «на одном знаке свод совпадает с побуквенным» — сетка |
| «Точка вверх» | доказано композицией | доказано 3 из 5; «спуск после подъёма возвращает строчную латинскую точку» — сетка; «спуск после подъёма возвращает строчную кириллическую точку» — сетка |
| «Знак вверх» | доказано композицией | доказано 3 из 3 |
| «Вверх» | доказано композицией | доказано 0 из 3; «подъём регистра не меняет длины» — сетка; «на одном знаке подъём совпадает с побуквенным» — сетка; «спуск после подъёма даёт тот же нижний, что и один спуск» — сетка |
| «Точка в месте» | доказано композицией | доказано 2 из 3; «за краем строки — минус один, и только там» — сетка |
| «Совпало с места» | доказано композицией | доказано 3 из 4; «совпадение с первого места — это начало строки» — сетка |
| «Граница слева» | доказано композицией | доказано 0 из 1; «начало строки — всегда граница» — сетка |
| «Граница справа» | доказано композицией | доказано 0 из 1; «конец строки — всегда граница» — сетка |
| «Найдено» | доказано композицией | — |
| «Шаг поиска» | доказано композицией | доказано 3 из 3 |
| «Место образца» | доказано композицией | доказано 1 из 4; «найденное место лежит внутри строки» — сетка; «на найденном месте кусок и правда стоит» — сетка; «слева от найденного места граница держится» — сетка |
| «Есть основа» | доказано композицией | доказано 0 из 1; «пустая основа не ловится» — сетка |
| «Есть слово» | доказано композицией | доказано 0 из 2; «пустое слово не ловится» — сетка; «что поймано словом, то поймано и основой» — сетка |
| «Есть с окончаниями» | доказано композицией | доказано 1 из 1 |
| «Есть основа со знаком» | доказано композицией | доказано 0 из 1; «пустой набор знаков не ловит ничего» — сетка |
| «Есть кусок» | доказано композицией | — |
| «Есть любое» | доказано композицией | доказано 1 из 1 |
| «Второе близко» | доказано точным шагом | доказано 2 из 2 |
| «Шаг рядом» | доказано композицией | доказано 3 из 3 |
| «Есть рядом» | доказано композицией | доказано 1 из 1 |
| «Всё в классе» | доказано композицией | доказано 1 из 1 |
| «Есть точка класса» | доказано композицией | доказано 0 из 2; «в пустой строке точек нет» — сетка; «что лежит целиком, то лежит и хоть где-то» — сетка |
| «Смесь алфавитов» | доказано композицией | доказано 1 из 2; «слово из одного алфавита смесью не бывает» — сетка |
| «Шаг замены» | доказано композицией | доказано 5 из 5 |
| «Заменить кусок» | доказано композицией | доказано 1 из 1 |
«SCRAM»
flang/stdlib/scram.flang — functions 20; the kernel ledger was taken from this version of the file
тотальная функция «Октеты ASCII»
принимает текст: строка
возвращает список числа
обеспечивает «октетов ровно столько, сколько знаков» (длина результат) равен (длина текст)
обеспечивает «пустая строка не даёт ни одного октета» (если (длина текст) равен 0 то (длина результат) равен 0
иначе да)
пример «Пусто»
дано текст равно ""
ожидается пустой список
тотальная функция «Строка только из ASCII»
принимает текст: строка
возвращает признак
обеспечивает «строка, начинающаяся знаком за пределом ASCII, признаётся негодной» (если ((длина текст) больше 0) и притом ((код символа текст) не меньше 128) то не результат иначе да)
пример «Обычный вызов сервера»
дано текст равно "r=abc,s=ZGVm,i=4096"
ожидается да
тотальная функция «Поле сообщения»
принимает сообщение: строка, имя: строка
возвращает строка
пример «Соль»
дано сообщение равно "r=abcdef,s=ZGVm,i=4096"
дано имя равно "s"
ожидается "ZGVm"
тотальная функция «Цифра знака»
принимает знак: строка
возвращает число
обеспечивает «цифра знака — это код минус сорок восемь, пока знак и правда цифра» (не (((код символа знак) не меньше 48) и притом ((код символа знак) не больше 57))) или (результат равен ((код символа знак) минус 48))
обеспечивает «цифра знака условной записью — это код минус сорок восемь» если ((код символа знак) не меньше 48) и притом ((код символа знак) не больше 57) то (результат равен ((код символа знак) минус 48)) иначе да
обеспечивает «не цифра даёт ровно ноль» если не (((код символа знак) не меньше 48) и притом ((код символа знак) не больше 57)) то (результат равен 0) иначе да
пример «Ноль»
дано знак равно "0"
ожидается 0
тотальная функция «Число из текста»
принимает текст: строка
возвращает число
обеспечивает «пустая запись даёт ноль» (если (длина текст) равен 0 то результат равен 0 иначе да)
обеспечивает «однозначная запись даёт ровно свою цифру» (если (длина текст) равен 1 то результат равен («Цифра знака» от текст) иначе да)
пример «Четыре тысячи девяносто шесть»
дано текст равно "4096"
ожидается 4096
тотальная функция «Соль вызова»
принимает вызов: строка
возвращает список числа
пример «Соль раскодируется из основания 64»
дано вызов равно "r=abc,s=ZGVm,i=1"
ожидается [100, 101, 102]
тотальная функция «Витков вызова»
принимает вызов: строка
возвращает число
пример «Витки берутся числом, а не строкой»
дано вызов равно "r=abc,s=ZGVm,i=4096"
ожидается 4096
тотальная функция «Одноразовое вызова»
принимает вызов: строка
возвращает строка
пример «Одноразовое сервера начинается одноразовым клиента»
дано вызов равно "r=abcXYZ,s=ZGVm,i=1"
ожидается "abcXYZ"
тотальная функция «Первое клиента без заголовка»
принимает пользователь: строка, одноразовое: строка
возвращает строка
обеспечивает «первое сообщение начинается именем и несёт одноразовое целиком» ((«Поле сообщения» от результат и "n") равен пользователь) и притом ((«Поле сообщения» от результат и "r") равен одноразовое)
пример «Пустое имя, как шлёт libpq»
дано пользователь равно ""
дано одноразовое равно "abc"
ожидается "n=,r=abc"
тотальная функция «Первое клиента»
принимает пользователь: строка, одноразовое: строка
возвращает строка
обеспечивает «заголовок GS2 стоит впереди, и это ровно три знака» ((длина результат) равен ((длина («Первое клиента без заголовка» от пользователь и одноразовое)) плюс 3)) и притом (результат начинается с "n,,")
обеспечивает «заголовок GS2 удлиняет сообщение ровно на три знака» (длина результат) равен ((длина («Первое клиента без заголовка» от пользователь и одноразовое)) плюс 3)
пример «Заголовок и тело»
дано пользователь равно ""
дано одноразовое равно "abc"
ожидается "n,,n=,r=abc"
тотальная функция «Последнее без подписи»
принимает вызов: строка
возвращает строка
обеспечивает «последнее сообщение возвращает серверу его же одноразовое и заголовок GS2» ((«Поле сообщения» от результат и "r") равен («Поле сообщения» от вызов и "r")) и притом ((«Поле сообщения» от результат и "c") равен "biws")
пример «Одноразовое сервера возвращается серверу»
дано вызов равно "r=abcXYZ,s=ZGVm,i=1"
ожидается "c=biws,r=abcXYZ"
тотальная функция «Сообщение подписи»
принимает пользователь: строка, одноразовое: строка, вызов: строка
возвращает строка
обеспечивает «в сообщение подписи входит вызов сервера целиком» результат содержит вызов
пример «Три части через запятую»
дано пользователь равно ""
дано одноразовое равно "abc"
дано вызов равно "r=abcXYZ,s=ZGVm,i=1"
ожидается "n=,r=abc,r=abcXYZ,s=ZGVm,i=1,c=biws,r=abcXYZ"
тотальная функция «Солёный пароль»
принимает пароль: список числа, вызов: строка
возвращает список числа
обеспечивает «солёный пароль — ровно тридцать два байта» (длина результат) равен 32
пример «Пустой пароль, пустая соль, один виток — самый дешёвый настоящий счёт»
дано пароль равно пустой список
дано вызов равно "r=a,s=,i=1"
ожидается [247, 206, 11, 101, 61, 45, 114, 164, 16, 140, 245, 171, 233, 18, 255, 221, 119, 118, 22, 219, 187, 39,
167, 14, 130, 4, 243, 174, 45, 15, 111, 173]
тотальная функция «Ключ клиента»
принимает солёный: список числа
возвращает список числа
обеспечивает «ключ клиента — ровно тридцать два байта» (длина результат) равен 32
пример «Ключ клиента от солёного пароля пустой пары»
дано солёный равно [247, 206, 11, 101, 61, 45, 114, 164, 16, 140, 245, 171, 233, 18, 255, 221, 119, 118, 22, 219,
187, 39, 167, 14, 130, 4, 243, 174, 45, 15, 111, 173]
ожидается [174, 251, 130, 206, 150, 113, 173, 155, 249, 22, 41, 164, 196, 20, 84, 37, 187, 53, 54, 208, 245, 233,
71, 152, 214, 119, 153, 40, 195, 154, 105, 162]
тотальная функция «Серверный ключ»
принимает солёный: список числа
возвращает список числа
обеспечивает «серверный ключ — ровно тридцать два байта» (длина результат) равен 32
пример «Серверный ключ от того же солёного пароля»
дано солёный равно [247, 206, 11, 101, 61, 45, 114, 164, 16, 140, 245, 171, 233, 18, 255, 221, 119, 118, 22, 219,
187, 39, 167, 14, 130, 4, 243, 174, 45, 15, 111, 173]
ожидается [157, 219, 129, 221, 4, 222, 20, 20, 32, 15, 128, 101, 79, 54, 190, 127, 50, 18, 189, 128, 50, 72, 189,
67, 185, 78, 1, 71, 2, 190, 177, 71]
тотальная функция «Хранимый ключ»
принимает клиентский: список числа
возвращает список числа
обеспечивает «хранимый ключ — свод SHA-256 от ключа клиента» («Байты шестнадцатеричным» от результат) равен («Свод шестнадцатеричным» от («Свод байтов» от клиентский))
пример «Свод пустого ключа — известное значение FIPS»
дано клиентский равно пустой список
ожидается [227, 176, 196, 66, 152, 252, 28, 20, 154, 251, 244, 200, 153, 111, 185, 36, 39, 174, 65, 228, 100, 155,
147, 76, 164, 149, 153, 27, 120, 82, 184, 85]
тотальная функция «Доказательство клиента»
принимает пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка
возвращает список числа
обеспечивает «доказательство — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Последнее клиента»
принимает пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка
возвращает строка
обеспечивает «последнее сообщение начинается тем же, что и без подписи» результат начинается с («Последнее без подписи» от вызов)
пример «Пустой пароль, пустая соль, один виток — самый дешёвый настоящий счёт»
дано пароль равно пустой список
дано пользователь равно ""
дано одноразовое равно "a"
дано вызов равно "r=a,s=,i=1"
ожидается "c=biws,r=a,p=zOKOAVsUxPOLiXcczSi4FVTGlkCmOdySvZtoejEdiZs="
тотальная функция «Подпись сервера»
принимает пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка
возвращает строка
обеспечивает «подпись сервера — поле v и ровно сорок четыре знака основания 64» (результат начинается с "v=") и притом ((длина результат) равен 46)
тотальная функция «Проверка сервера сошлась»
принимает пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка, проверка: строка
возвращает признак
обеспечивает «пустая проверка не сходится никогда» (если (длина проверка) равен 0 то не результат иначе да)
обеспечивает «проверка без поля v не сходится никогда» (если не (проверка начинается с "v=") то не результат иначе да)
обеспечивает «проверка без поля v равна нет» если не (проверка начинается с "v=") то (результат равен нет) иначе да
пример «Пустая проверка не сходится, и счёта для этого не нужно»
дано пароль равно пустой список
дано пользователь равно ""
дано одноразовое равно "a"
дано вызов равно "r=a,s=,i=1"
дано проверка равно ""
ожидается нет
| Function | Termination | Claims |
|---|---|---|
| «Октеты ASCII» | доказано композицией | доказано 2 из 2 |
| «Строка только из ASCII» | доказано композицией | доказано 0 из 1; «строка, начинающаяся знаком за пределом ASCII, признаётся негодной» — сетка |
| «Поле сообщения» | доказано композицией | — |
| «Цифра знака» | доказано композицией | доказано 3 из 3 |
| «Число из текста» | доказано композицией | доказано 0 из 2; «пустая запись даёт ноль» — сетка; «однозначная запись даёт ровно свою цифру» — сетка |
| «Соль вызова» | доказано композицией | — |
| «Витков вызова» | доказано композицией | — |
| «Одноразовое вызова» | доказано композицией | — |
| «Первое клиента без заголовка» | доказано композицией | доказано 0 из 1; «первое сообщение начинается именем и несёт одноразовое целиком» — сетка |
| «Первое клиента» | доказано композицией | доказано 2 из 2 |
| «Последнее без подписи» | доказано композицией | доказано 0 из 1; «последнее сообщение возвращает серверу его же одноразовое и заголовок GS2» — сетка |
| «Сообщение подписи» | доказано композицией | доказано 0 из 1; «в сообщение подписи входит вызов сервера целиком» — сетка |
| «Солёный пароль» | доказано композицией | доказано 1 из 1 |
| «Ключ клиента» | доказано композицией | доказано 1 из 1 |
| «Серверный ключ» | доказано композицией | доказано 1 из 1 |
| «Хранимый ключ» | доказано композицией | доказано 1 из 1 |
| «Доказательство клиента» | доказано композицией | доказано 0 из 1; «доказательство — ровно тридцать два байта» — объявлено, не доказано |
| «Последнее клиента» | доказано композицией | доказано 1 из 1 |
| «Подпись сервера» | доказано композицией | доказано 0 из 1; «подпись сервера — поле v и ровно сорок четыре знака основания 64» — объявлено, не доказано |
| «Проверка сервера сошлась» | доказано композицией | доказано 2 из 3; «пустая проверка не сходится никогда» — сетка |
«String sets»
flang/stdlib/sets.flang — functions 16; the kernel ledger was taken from this version of the file
тотальная функция «Шаг поиска в множестве»
принимает найдено: признак, эл: строка, искомое: строка
возвращает признак
обеспечивает «совпавший элемент даёт да» если эл равно искомое то результат равен да иначе да
обеспечивает «однажды найденное не теряется» если найдено равен да то результат равен да иначе да
обеспечивает «несовпавший элемент оставляет накопленное» если не (эл равно искомое) то (результат равен найдено) иначе да
обеспечивает «шаг отдаёт да или накопленное» (результат равен да) или (результат равен найдено)
пример «Совпало — да»
дано найдено равно нет
дано эл равно "б"
дано искомое равно "б"
ожидается да
тотальная функция «Есть в множестве»
принимает множество: список строки, искомое: строка
возвращает признак
обеспечивает «есть в множестве — это встроенная проверка вхождения» результат равен (множество содержит искомое)
пример «Элемент есть»
дано множество равно ["а", "б", "в"]
дано искомое равно "б"
ожидается да
тотальная функция «Добавить в множество»
принимает множество: список строки, новое: строка
возвращает список строки
обеспечивает «добавление не укорачивает множество» (длина множество) не больше (длина результат)
обеспечивает «добавление растит множество не больше чем на один» (длина результат) не больше (1 плюс (длина множество))
обеспечивает «после добавления новое в множестве есть» (результат содержит новое) равен да
обеспечивает «новое растит множество ровно на один, прежнее не растит вовсе» если («Есть в множестве» от множество и новое) то ((длина результат) равен (длина множество)) иначе ((длина результат) равен (1 плюс (длина множество)))
обеспечивает «уже бывшее множество не меняет» если «Есть в множестве» от множество и новое то (результат равен множество) иначе да
обеспечивает «небывшее дописывается в конец» если не («Есть в множестве» от множество и новое) то (результат равен (добавить новое к множество)) иначе да
пример «Нового элемента не было»
дано множество равно ["а"]
дано новое равно "б"
ожидается ["а", "б"]
тотальная функция «Шаг убирания из множества»
принимает оставшиеся: список строки, эл: строка, лишнее: строка
возвращает список строки
обеспечивает «убирание растит остаток не больше чем на один» (длина результат) не больше (1 плюс (длина оставшиеся))
обеспечивает «лишний элемент в остаток не переносится» если эл равно лишнее то (результат равен оставшиеся) иначе да
обеспечивает «прочее дописывается в конец остатка» если не (эл равно лишнее) то (результат равен (добавить эл к оставшиеся)) иначе да
обеспечивает «шаг отдаёт остаток или остаток с дописанным» (результат равен оставшиеся) или (результат равен (добавить эл к оставшиеся))
пример «Лишний пропускается»
дано оставшиеся равно ["а"]
дано эл равно "б"
дано лишнее равно "б"
ожидается ["а"]
тотальная функция «Убрать из множества»
принимает множество: список строки, лишнее: строка
возвращает список строки
обеспечивает «удаление не удлиняет множество» (длина результат) не больше (длина множество)
обеспечивает «убранного больше нет, а прочее осталось» ((результат содержит лишнее) равен нет) и притом ((длина (отфильтровать множество где э → ((не (э равен лишнее)) и притом (не (результат содержит э))))) равен 0)
пример «Элемент убирается»
дано множество равно ["а", "б", "в"]
дано лишнее равно "б"
ожидается ["а", "в"]
тотальная функция «Шаг сбора множества»
принимает собранное: список строки, эл: строка
возвращает список строки
обеспечивает «сбор растит множество не больше чем на один» (длина результат) не больше (1 плюс (длина собранное))
пример «Новое дописывается»
дано собранное равно ["а"]
дано эл равно "б"
ожидается ["а", "б"]
тотальная функция «Из списка»
принимает элементы: список строки
возвращает список строки
обеспечивает «множество из списка не длиннее списка» (длина результат) не больше (длина элементы)
обеспечивает «множество из списка — те же элементы и ни одного дважды» ((длина (отфильтровать элементы где э → (не (результат содержит э)))) равен 0) и притом ((длина (отфильтровать результат где э → (не (элементы содержит э)))) равен 0) и притом ((длина (отфильтровать результат где э → (2 не больше (длина (отфильтровать результат где д → (д равен э)))))) равен 0)
пример «Повторы выброшены»
дано элементы равно ["а", "б", "а", "в", "б"]
ожидается ["а", "б", "в"]
тотальная функция «Объединение»
принимает первое: список строки, второе: список строки
возвращает список строки
обеспечивает «объединение не короче первого множества» (длина первое) не больше (длина результат)
обеспечивает «объединение содержит оба множества и ничего сверх них» ((длина (отфильтровать первое где э → (не (результат содержит э)))) равен 0) и притом ((длина (отфильтровать второе где э → (не (результат содержит э)))) равен 0) и притом ((длина (отфильтровать результат где э → ((не (первое содержит э)) и притом (не (второе содержит э))))) равен 0)
пример «Общие элементы не удваиваются»
дано первое равно ["а", "б"]
дано второе равно ["б", "в"]
ожидается ["а", "б", "в"]
тотальная функция «Шаг пересечения»
принимает итог: список строки, эл: строка, второе: список строки
возвращает список строки
обеспечивает «пересечение растит итог не больше чем на один» (длина результат) не больше (1 плюс (длина итог))
обеспечивает «чужой элемент ничего не добавляет» если не («Есть в множестве» от второе и эл) то (результат равен итог) иначе да
обеспечивает «общий элемент добавляется» если «Есть в множестве» от второе и эл то (результат равен («Добавить в множество» от итог и эл)) иначе да
обеспечивает «шаг отдаёт итог или итог с добавленным» (результат равен итог) или (результат равен («Добавить в множество» от итог и эл))
пример «Общий добавляется»
дано итог равно ["а"]
дано эл равно "б"
дано второе равно ["б", "в"]
ожидается ["а", "б"]
тотальная функция «Пересечение»
принимает первое: список строки, второе: список строки
возвращает список строки
обеспечивает «пересечение не длиннее первого множества» (длина результат) не больше (длина первое)
обеспечивает «пересечение — ровно общие элементы, и не длиннее меньшего» ((длина (отфильтровать результат где э → ((не (первое содержит э)) или (не (второе содержит э))))) равен 0) и притом ((длина (отфильтровать первое где э → ((второе содержит э) и притом (не (результат содержит э))))) равен 0) и притом ((длина результат) не больше (длина второе))
пример «Только общие»
дано первое равно ["а", "б", "в"]
дано второе равно ["б", "в", "г"]
ожидается ["б", "в"]
тотальная функция «Шаг разности»
принимает итог: список строки, эл: строка, второе: список строки
возвращает список строки
обеспечивает «разность растит итог не больше чем на один» (длина результат) не больше (1 плюс (длина итог))
обеспечивает «элемент вычитаемого пропускается» если «Есть в множестве» от второе и эл то (результат равен итог) иначе да
обеспечивает «свой элемент остаётся» если не («Есть в множестве» от второе и эл) то (результат равен («Добавить в множество» от итог и эл)) иначе да
обеспечивает «шаг отдаёт итог или итог с добавленным» (результат равен итог) или (результат равен («Добавить в множество» от итог и эл))
пример «Вычитаемый пропускается»
дано итог равно ["а"]
дано эл равно "б"
дано второе равно ["б"]
ожидается ["а"]
тотальная функция «Разность»
принимает первое: список строки, второе: список строки
возвращает список строки
обеспечивает «разность не длиннее уменьшаемого» (длина результат) не больше (длина первое)
обеспечивает «разность — ровно то из первого, чего нет во втором» ((длина (отфильтровать результат где э → ((не (первое содержит э)) или (второе содержит э)))) равен 0) и притом ((длина (отфильтровать первое где э → ((не (второе содержит э)) и притом (не (результат содержит э))))) равен 0)
пример «Убираются те, что во втором»
дано первое равно ["а", "б", "в"]
дано второе равно ["б"]
ожидается ["а", "в"]
тотальная функция «Шаг подмножества»
принимает итог: признак, эл: строка, большее: список строки
возвращает признак
обеспечивает «однажды опровергнутое не воскресает» если (не итог) то (результат равен нет) иначе да
обеспечивает «лишний элемент рушит вхождение» если не («Есть в множестве» от большее и эл) то (результат равен нет) иначе да
обеспечивает «свой элемент накопленное не меняет» если «Есть в множестве» от большее и эл то (результат равен итог) иначе да
обеспечивает «шаг отдаёт итог или нет» (результат равен итог) или (результат равен нет)
пример «Свой не мешает»
дано итог равно да
дано эл равно "а"
дано большее равно ["а", "б"]
ожидается да
тотальная функция «Подмножество»
принимает меньшее: список строки, большее: список строки
возвращает признак
обеспечивает «подмножество — это когда лишних элементов нет» результат равен ((длина (отфильтровать меньшее где э → (не (большее содержит э)))) равен 0)
пример «Часть входит в целое»
дано меньшее равно ["а", "б"]
дано большее равно ["а", "б", "в"]
ожидается да
тотальная функция «Шаг счёта элементов»
принимает сколько: число, эл: строка
возвращает число
обеспечивает «счёт растёт ровно на один» результат равен (сколько плюс 1)
пример «Счёт прибавляется»
дано сколько равно 1
дано эл равно "б"
ожидается 2
тотальная функция «Размер множества»
принимает множество: список строки
возвращает число
обеспечивает «размер множества неотрицателен» результат не меньше 0
обеспечивает «размер множества не больше длины его списка» результат не больше (длина множество)
обеспечивает «размер — это длина списка» результат равен (длина множество)
пример «Три элемента»
дано множество равно ["а", "б", "в"]
ожидается 3
| Function | Termination | Claims |
|---|---|---|
| «Шаг поиска в множестве» | доказано композицией | доказано 4 из 4 |
| «Есть в множестве» | доказано композицией | доказано 0 из 1; «есть в множестве — это встроенная проверка вхождения» — сетка |
| «Добавить в множество» | доказано композицией | доказано 5 из 6; «после добавления новое в множестве есть» — сетка |
| «Шаг убирания из множества» | доказано композицией | доказано 4 из 4 |
| «Убрать из множества» | доказано композицией | доказано 1 из 2; «убранного больше нет, а прочее осталось» — сетка |
| «Шаг сбора множества» | доказано композицией | доказано 1 из 1 |
| «Из списка» | доказано композицией | доказано 0 из 2; «множество из списка не длиннее списка» — сетка; «множество из списка — те же элементы и ни одного дважды» — сетка |
| «Объединение» | доказано композицией | доказано 0 из 2; «объединение не короче первого множества» — сетка; «объединение содержит оба множества и ничего сверх них» — сетка |
| «Шаг пересечения» | доказано композицией | доказано 4 из 4 |
| «Пересечение» | доказано композицией | доказано 0 из 2; «пересечение не длиннее первого множества» — сетка; «пересечение — ровно общие элементы, и не длиннее меньшего» — сетка |
| «Шаг разности» | доказано композицией | доказано 4 из 4 |
| «Разность» | доказано композицией | доказано 0 из 2; «разность не длиннее уменьшаемого» — сетка; «разность — ровно то из первого, чего нет во втором» — сетка |
| «Шаг подмножества» | доказано композицией | доказано 4 из 4 |
| «Подмножество» | доказано композицией | доказано 0 из 1; «подмножество — это когда лишних элементов нет» — сетка |
| «Шаг счёта элементов» | доказано композицией | доказано 1 из 1 |
| «Размер множества» | доказано композицией | доказано 3 из 3 |
«SHA-1»
flang/stdlib/sha1.flang — functions 22; the kernel ledger was taken from this version of the file
тип «Свод SHA-1»
вариант «Свод1» содержит н0: число, н1: число, н2: число, н3: число, н4: число
тип «Ход блока SHA-1»
вариант «Ход блока SHA-1» содержит расписание: «Расписание», свод: «Свод SHA-1»
тип «Ход хеша SHA-1»
вариант «Ход хеша SHA-1» содержит свод: «Свод SHA-1», буфер: список числа, набрано: число
тотальная функция «Начальный свод SHA-1»
возвращает «Свод SHA-1»
обеспечивает «все пять слов начального свода SHA-1 — настоящие тридцатидвухразрядные слова, и все пять различны» (результат.н0 равен («Свести к слову» от результат.н0)) и притом (результат.н1 равен («Свести к слову» от результат.н1)) и притом (результат.н2 равен («Свести к слову» от результат.н2)) и притом (результат.н3 равен («Свести к слову» от результат.н3)) и притом (результат.н4 равен («Свести к слову» от результат.н4)) и притом (не (результат.н0 равен результат.н1)) и притом (не (результат.н0 равен результат.н2)) и притом (не (результат.н0 равен результат.н3)) и притом (не (результат.н0 равен результат.н4)) и притом (не (результат.н1 равен результат.н2)) и притом (не (результат.н1 равен результат.н3)) и притом (не (результат.н1 равен результат.н4)) и притом (не (результат.н2 равен результат.н3)) и притом (не (результат.н2 равен результат.н4)) и притом (не (результат.н3 равен результат.н4))
пример «67452301 efcdab89 98badcfe 10325476 c3d2e1f0»
ожидается вариант «Свод1» с н0 равным 1732584193 и н1 равным 4023233417 и н2 равным 2562383102 и н3 равным 271733878 и н4 равным 3285377520
тотальная функция «Номера раундов SHA-1»
возвращает список числа
обеспечивает «раундов ровно восемьдесят» (длина результат) равен 80
пример «от нуля до семидесяти девяти»
ожидается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
тотальная функция «Постоянная раунда SHA-1»
принимает номер: число
возвращает число
обеспечивает «постоянная неотрицательна» результат не меньше 0
обеспечивает «первая четверть SHA-1 берёт 5A827999» если номер меньше 20 то (результат равен 1518500249) иначе да
обеспечивает «вторая четверть SHA-1 берёт 6ED9EBA1» если не (номер меньше 20) то (если номер меньше 40 то (результат равен 1859775393) иначе да) иначе да
обеспечивает «третья четверть SHA-1 берёт 8F1BBCDC» если не (номер меньше 20) то (если не (номер меньше 40) то (если номер меньше 60 то (результат равен 2400959708) иначе да) иначе да) иначе да
обеспечивает «четвёртая четверть SHA-1 берёт CA62C1D6» если не (номер меньше 20) то (если не (номер меньше 40) то (если не (номер меньше 60) то (результат равен 3395469782) иначе да) иначе да) иначе да
пример «первая четверть»
дано номер равно 0
ожидается 1518500249
тотальная функция «Смесь раунда SHA-1»
принимает номер: число, второе: число, третье: число, четвёртое: число
возвращает число
обеспечивает «первая четверть SHA-1 выбирает» если номер меньше 20 то (результат равен («Выбор» от второе и третье и четвёртое)) иначе да
обеспечивает «вторая четверть SHA-1 складывает по модулю два» если не (номер меньше 20) то (если номер меньше 40 то (результат равен («Исключающее или трёх» от второе и третье и четвёртое)) иначе да) иначе да
обеспечивает «третья четверть SHA-1 берёт большинство» если не (номер меньше 20) то (если не (номер меньше 40) то (если номер меньше 60 то (результат равен («Большинство» от второе и третье и четвёртое)) иначе да) иначе да) иначе да
обеспечивает «четвёртая четверть SHA-1 складывает по модулю два» если не (номер меньше 20) то (если не (номер меньше 40) то (если не (номер меньше 60) то (результат равен («Исключающее или трёх» от второе и третье и четвёртое)) иначе да) иначе да) иначе да
пример «первая четверть выбирает»
дано номер равно 0
дано второе равно 4294967295
дано третье равно 305419896
дано четвёртое равно 0
ожидается 305419896
тотальная функция «Следующее слово SHA-1»
принимает расписание: «Расписание»
возвращает число
обеспечивает «следующее слово — слово сверху» результат меньше 4294967296
пример «пустое расписание рождает ноль»
дано расписание равно вариант «Расписание» с с0 равным 0 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 0 и с15 равным 0
ожидается 0
тотальная функция «Шаг раунда SHA-1»
принимает ход: «Ход блока SHA-1», номер: число
возвращает «Ход блока SHA-1»
обеспечивает «раунд SHA-1: второе слово берёт прежнее первое» результат.свод.н1 равен ход.свод.н0
обеспечивает «раунд SHA-1: третье слово — прежнее второе, повёрнутое влево на тридцать» результат.свод.н2 равен («Поворот вправо» от ход.свод.н1 и 4)
обеспечивает «раунд SHA-1: четвёртое слово берёт прежнее третье» результат.свод.н3 равен ход.свод.н2
обеспечивает «раунд SHA-1: пятое слово берёт прежнее четвёртое» результат.свод.н4 равен ход.свод.н3
обеспечивает «раунд SHA-1: первое слово — сведённая к слову смесь раунда» результат.свод.н0 равен («Свести к слову» от ((«Поворот вправо» от ход.свод.н0 и 134217728) плюс («Смесь раунда SHA-1» от номер и ход.свод.н1 и ход.свод.н2 и ход.свод.н3) плюс ход.свод.н4 плюс («Постоянная раунда SHA-1» от номер) плюс ход.расписание.с0))
обеспечивает «раунд SHA-1: окно, поле 0 берёт прежнее поле 1» (результат.расписание.с0 равен ход.расписание.с1)
обеспечивает «раунд SHA-1: окно, поле 1 берёт прежнее поле 2» (результат.расписание.с1 равен ход.расписание.с2)
обеспечивает «раунд SHA-1: окно, поле 2 берёт прежнее поле 3» (результат.расписание.с2 равен ход.расписание.с3)
обеспечивает «раунд SHA-1: окно, поле 3 берёт прежнее поле 4» (результат.расписание.с3 равен ход.расписание.с4)
обеспечивает «раунд SHA-1: окно, поле 4 берёт прежнее поле 5» (результат.расписание.с4 равен ход.расписание.с5)
обеспечивает «раунд SHA-1: окно, поле 5 берёт прежнее поле 6» (результат.расписание.с5 равен ход.расписание.с6)
обеспечивает «раунд SHA-1: окно, поле 6 берёт прежнее поле 7» (результат.расписание.с6 равен ход.расписание.с7)
обеспечивает «раунд SHA-1: окно, поле 7 берёт прежнее поле 8» (результат.расписание.с7 равен ход.расписание.с8)
обеспечивает «раунд SHA-1: окно, поле 8 берёт прежнее поле 9» (результат.расписание.с8 равен ход.расписание.с9)
обеспечивает «раунд SHA-1: окно, поле 9 берёт прежнее поле 10» (результат.расписание.с9 равен ход.расписание.с10)
обеспечивает «раунд SHA-1: окно, поле 10 берёт прежнее поле 11» (результат.расписание.с10 равен ход.расписание.с11)
обеспечивает «раунд SHA-1: окно, поле 11 берёт прежнее поле 12» (результат.расписание.с11 равен ход.расписание.с12)
обеспечивает «раунд SHA-1: окно, поле 12 берёт прежнее поле 13» (результат.расписание.с12 равен ход.расписание.с13)
обеспечивает «раунд SHA-1: окно, поле 13 берёт прежнее поле 14» (результат.расписание.с13 равен ход.расписание.с14)
обеспечивает «раунд SHA-1: окно, поле 14 берёт прежнее поле 15» (результат.расписание.с14 равен ход.расписание.с15)
пример «Нулевой раунд следа FIPS 180-4, A.1 на сообщении abc: A становится 0116FC33»
дано ход равно вариант «Ход блока SHA-1» с расписание равным (вариант «Расписание» с с0 равным 1633837952 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 0 и с15 равным 24) и свод равным (вариант «Свод1» с н0 равным 1732584193 и н1 равным 4023233417 и н2 равным 2562383102 и н3 равным 271733878 и н4 равным 3285377520)
дано номер равно 0
ожидается вариант «Ход блока SHA-1» с расписание равным (вариант «Расписание» с с0 равным 0 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 24 и с15 равным 3267675904) и свод равным (вариант «Свод1» с н0 равным 18283571 и н1 равным 1732584193 и н2 равным 2079550178 и н3 равным 2562383102 и н4 равным 271733878)
тотальная функция «Сложить своды SHA-1»
принимает первый: «Свод SHA-1», второй: «Свод SHA-1»
возвращает «Свод SHA-1»
обеспечивает «сложение сводов SHA-1: первое слово складывается по модулю два в тридцать второй» результат.н0 равен («Свести к слову» от (первый.н0 плюс второй.н0))
обеспечивает «сложение сводов SHA-1: второе слово складывается по модулю два в тридцать второй» результат.н1 равен («Свести к слову» от (первый.н1 плюс второй.н1))
обеспечивает «сложение сводов SHA-1: третье слово складывается по модулю два в тридцать второй» результат.н2 равен («Свести к слову» от (первый.н2 плюс второй.н2))
обеспечивает «сложение сводов SHA-1: четвёртое слово складывается по модулю два в тридцать второй» результат.н3 равен («Свести к слову» от (первый.н3 плюс второй.н3))
обеспечивает «сложение сводов SHA-1: пятое слово складывается по модулю два в тридцать второй» результат.н4 равен («Свести к слову» от (первый.н4 плюс второй.н4))
пример «ноль плюс начальный свод — начальный свод»
дано первый равно вариант «Свод1» с н0 равным 0 и н1 равным 0 и н2 равным 0 и н3 равным 0 и н4 равным 0
дано второй равно вариант «Свод1» с н0 равным 1732584193 и н1 равным 4023233417 и н2 равным 2562383102 и н3 равным 271733878 и н4 равным 3285377520
ожидается вариант «Свод1» с н0 равным 1732584193 и н1 равным 4023233417 и н2 равным 2562383102 и н3 равным 271733878 и н4 равным 3285377520
тотальная функция «Сжать блок SHA-1»
принимает свод: «Свод SHA-1», блок: список числа
возвращает «Свод SHA-1»
тотальная функция «Шаг байта SHA-1»
принимает ход: «Ход хеша SHA-1», байт: число
возвращает «Ход хеша SHA-1»
обеспечивает «шестьдесят четвёртый байт SHA-1 закрывает блок: буфер пустеет, счёт обнуляется» не (ход.набрано не меньше 63) или ((результат.набрано равен 0) и притом ((длина результат.буфер) равен 0))
обеспечивает «до шестьдесят четвёртого SHA-1: счёт растёт на один» (ход.набрано не меньше 63) или (результат.набрано равен (ход.набрано плюс 1))
обеспечивает «до шестьдесят четвёртого SHA-1: буфер длиннее на один» (ход.набрано не меньше 63) или ((длина результат.буфер) равен ((длина ход.буфер) плюс 1))
обеспечивает «до шестьдесят четвёртого SHA-1: первое слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н0 равен ход.свод.н0)
обеспечивает «до шестьдесят четвёртого SHA-1: второе слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н1 равен ход.свод.н1)
обеспечивает «до шестьдесят четвёртого SHA-1: третье слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н2 равен ход.свод.н2)
обеспечивает «до шестьдесят четвёртого SHA-1: четвёртое слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н3 равен ход.свод.н3)
обеспечивает «до шестьдесят четвёртого SHA-1: пятое слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н4 равен ход.свод.н4)
пример «первый байт только копится»
дано ход равно вариант «Ход хеша SHA-1» с свод равным (вариант «Свод1» с н0 равным 1732584193 и н1 равным 4023233417 и н2 равным 2562383102 и н3 равным 271733878 и н4 равным 3285377520) и буфер равным пустой список и набрано равным 0
дано байт равно 97
ожидается вариант «Ход хеша SHA-1» с свод равным (вариант «Свод1» с н0 равным 1732584193 и н1 равным 4023233417 и н2 равным 2562383102 и н3 равным 271733878 и н4 равным 3285377520) и буфер равным [97] и набрано равным 1
тотальная функция «Свод байтов SHA-1»
принимает байты: список числа
возвращает «Свод SHA-1»
тотальная функция «Байты свода SHA-1»
принимает свод: «Свод SHA-1»
возвращает список числа
обеспечивает «свод SHA-1 занимает ровно двадцать байтов» (длина результат) равен 20
пример «свод сообщения abc байтами — счёта здесь нет, свод приезжает готовым»
дано свод равно вариант «Свод1» с н0 равным 2845392438 и н1 равным 1191608682 и н2 равным 3124634993 и н3 равным 2018558572 и н4 равным 2630932637
ожидается [169, 153, 62, 54, 71, 6, 129, 106, 186, 62, 37, 113, 120, 80, 194, 108, 156, 208, 216, 157]
тотальная функция «Хеш байтов SHA-1»
принимает байты: список числа
возвращает строка
обеспечивает «хеш SHA-1 — ровно сорок знаков» (длина результат) равен 40
пример «пустое сообщение — официальный вектор FIPS»
дано байты равно пустой список
ожидается "da39a3ee5e6b4b0d3255bfef95601890afd80709"
тип «Ход вывода SHA-1»
вариант «Ход вывода SHA-1» содержит текущий: список числа, накоплено: список числа
тотальная функция «Ключ блока SHA-1»
принимает ключ: список числа
возвращает список числа
обеспечивает «ключ SHA-1 приведён ровно к блоку хеша» (длина результат) равен 64
обеспечивает «ключ SHA-1 длиннее блока сначала хешируется» (если (длина ключ) больше 64 то («Начало списка» от результат и 20) равен («Байты свода SHA-1» от («Свод байтов SHA-1» от ключ)) иначе да)
обеспечивает «ключ SHA-1 не длиннее блока стоит в начале как есть» (если (длина ключ) не больше 64 то («Начало списка» от результат и (длина ключ)) равен ключ иначе да)
пример «короткий ключ дополняется нулями справа»
дано ключ равно [1, 2, 3]
ожидается [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Подпись байтами SHA-1»
принимает ключ: список числа, сообщение: список числа
возвращает список числа
обеспечивает «подпись SHA-1 — ровно двадцать байтов» (длина результат) равен 20
пример «RFC 2202, случай 1, байтами: без примера утверждение о длине считает рантайм»
дано ключ равно [11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11]
дано сообщение равно [72, 105, 32, 84, 104, 101, 114, 101]
ожидается [182, 23, 49, 134, 85, 5, 114, 100, 226, 139, 192, 182, 251, 55, 140, 142, 241, 70, 190, 0]
тотальная функция «Подпись SHA-1 шестнадцатеричным»
принимает ключ: список числа, сообщение: список числа
возвращает строка
обеспечивает «подпись печатается ровно сорока знаками» (длина результат) равен 40
пример «RFC 2202, случай 1: ключ из двадцати 0x0b, сообщение Hi There»
дано ключ равно [11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11]
дано сообщение равно [72, 105, 32, 84, 104, 101, 114, 101]
ожидается "b617318655057264e28bc0b6fb378c8ef146be00"
тотальная функция «Дописать номер SHA-1»
принимает меньшие: список числа, байтов: число
возвращает список числа
обеспечивает «на границе куска номер дописывается: список длиннее на один» (не ((байтов остаток от 20) равен 1)) или ((длина результат) равен ((длина меньшие) плюс 1))
обеспечивает «внутри куска список не трогается» ((байтов остаток от 20) равен 1) или ((длина результат) равен (длина меньшие))
пример «граница куска — номер дописывается»
дано меньшие равно [1]
дано байтов равно 21
ожидается [1, 2]
тотальная функция «Номера кусков SHA-1»
принимает байтов: неотрицательное
возвращает список числа
обеспечивает «кусков SHA-1 хватает на заказанную длину» ((длина результат) умножить на 20) не меньше байтов
обеспечивает «на нулевой заказ кусков SHA-1 нет вовсе» если байтов не больше 0 то (результат равен пустой список) иначе да
пример «ничего не заказано — ни куска»
дано байтов равно 0
ожидается пустой список
тотальная функция «Шаг витка SHA-1»
принимает пароль: список числа, ход: «Ход вывода SHA-1»
возвращает «Ход вывода SHA-1»
обеспечивает «шаг витка SHA-1 кладёт в текущее подпись прежнего текущего» результат.текущий равен («Подпись байтами SHA-1» от пароль и ход.текущий)
обеспечивает «шаг витка SHA-1 сливает накопленное с новой подписью» результат.накоплено равен («Исключающее или списков» от ход.накоплено и («Подпись байтами SHA-1» от пароль и ход.текущий))
тотальная функция «Витки вывода SHA-1»
принимает пароль: список числа, ход: «Ход вывода SHA-1», осталось: число
возвращает «Ход вывода SHA-1»
обеспечивает «нечего повторять — ход SHA-1 возвращается как есть» если осталось не больше 0 то (результат равен ход) иначе да
пример «Повторять нечего — ход возвращается тем же»
дано пароль равно [112, 97, 115, 115, 119, 111, 114, 100]
дано ход равно вариант «Ход вывода SHA-1» с текущий равным [12, 96, 200, 15, 150, 31, 14, 113, 243, 169, 181, 36,
175, 96, 18, 6, 47, 224, 55, 166] и накоплено равным [12, 96, 200, 15, 150, 31, 14, 113, 243, 169, 181, 36, 175,
96, 18, 6, 47, 224, 55, 166]
дано осталось равно 0
ожидается вариант «Ход вывода SHA-1» с текущий равным [12, 96, 200, 15, 150, 31, 14, 113, 243, 169, 181, 36, 175,
96, 18, 6, 47, 224, 55, 166] и накоплено равным [12, 96, 200, 15, 150, 31, 14, 113, 243, 169, 181, 36, 175, 96,
18, 6, 47, 224, 55, 166]
тотальная функция «Итог витков SHA-1»
принимает ход: «Ход вывода SHA-1»
возвращает список числа
обеспечивает «итог витков длиной в накопленное» (длина результат) равен (длина ход.накоплено)
обеспечивает «итог витков SHA-1 — это накопленное хода» результат равен (ход.накоплено)
пример «итог витков — накопленное, а не текущее»
дано ход равно вариант «Ход вывода SHA-1» с текущий равным [1, 2] и накоплено равным [3]
ожидается [3]
тотальная функция «Кусок вывода SHA-1»
принимает пароль: список числа, соль: список числа, повторов: число, номер: число
возвращает список числа
обеспечивает «кусок — ровно двадцать байтов» (длина результат) равен 20
обеспечивает «один виток SHA-1 — это ровно одна подпись соли с номером» (если повторов не больше 1 то результат равен («Подпись байтами SHA-1» от пароль и («Досыпать байты» от соль и («Байты слова» от номер))) иначе да)
пример «первый кусок вектора RFC 6070 №1»
дано пароль равно [112, 97, 115, 115, 119, 111, 114, 100]
дано соль равно [115, 97, 108, 116]
дано повторов равно 1
дано номер равно 1
ожидается [12, 96, 200, 15, 150, 31, 14, 113, 243, 169, 181, 36, 175, 96, 18, 6, 47, 224, 55, 166]
тотальная функция «Вывод ключа SHA-1»
принимает пароль: список числа, соль: список числа, повторов: число, байтов: неотрицательное
возвращает список числа
обеспечивает «ключ SHA-1 ровно заказанной длины» (длина результат) равен байтов
пример «RFC 6070, случай 1: password, salt, один виток, двадцать байтов»
дано пароль равно [112, 97, 115, 115, 119, 111, 114, 100]
дано соль равно [115, 97, 108, 116]
дано повторов равно 1
дано байтов равно 20
ожидается [12, 96, 200, 15, 150, 31, 14, 113, 243, 169, 181, 36, 175, 96, 18, 6, 47, 224, 55, 166]
| Function | Termination | Claims |
|---|---|---|
| «Начальный свод SHA-1» | доказано композицией | доказано 1 из 1 |
| «Номера раундов SHA-1» | доказано композицией | доказано 1 из 1 |
| «Постоянная раунда SHA-1» | доказано композицией | доказано 5 из 5 |
| «Смесь раунда SHA-1» | доказано композицией | доказано 4 из 4 |
| «Следующее слово SHA-1» | доказано композицией | доказано 0 из 1; «следующее слово — слово сверху» — сетка |
| «Шаг раунда SHA-1» | доказано композицией | доказано 20 из 20 |
| «Сложить своды SHA-1» | доказано композицией | доказано 5 из 5 |
| «Сжать блок SHA-1» | доказано композицией | — |
| «Шаг байта SHA-1» | доказано композицией | доказано 8 из 8 |
| «Свод байтов SHA-1» | доказано композицией | — |
| «Байты свода SHA-1» | доказано композицией | доказано 1 из 1 |
| «Хеш байтов SHA-1» | доказано композицией | доказано 1 из 1 |
| «Ключ блока SHA-1» | доказано композицией | доказано 0 из 3; «ключ SHA-1 приведён ровно к блоку хеша» — сетка; «ключ SHA-1 длиннее блока сначала хешируется» — сетка; «ключ SHA-1 не длиннее блока стоит в начале как есть» — сетка |
| «Подпись байтами SHA-1» | доказано композицией | доказано 0 из 1; «подпись SHA-1 — ровно двадцать байтов» — сетка |
| «Подпись SHA-1 шестнадцатеричным» | доказано композицией | доказано 1 из 1 |
| «Дописать номер SHA-1» | доказано композицией | доказано 2 из 2 |
| «Номера кусков SHA-1» | доказано точным шагом | доказано 1 из 2; «кусков SHA-1 хватает на заказанную длину» — сетка |
| «Шаг витка SHA-1» | доказано композицией | доказано 2 из 2 |
| «Витки вывода SHA-1» | доказано постоянным шагом | доказано 1 из 1 |
| «Итог витков SHA-1» | доказано композицией | доказано 2 из 2 |
| «Кусок вывода SHA-1» | доказано композицией | доказано 0 из 2; «кусок — ровно двадцать байтов» — сетка; «один виток SHA-1 — это ровно одна подпись соли с номером» — сетка |
| «Вывод ключа SHA-1» | доказано композицией | доказано 0 из 1; «ключ SHA-1 ровно заказанной длины» — сетка |
«SHA-256»
flang/stdlib/sha256.flang — functions 37; the kernel ledger was taken from this version of the file
тип «Свод sha256»
вариант «Свод» содержит н0: число, н1: число, н2: число, н3: число, н4: число, н5: число, н6: число, н7: число
тип «Расписание»
вариант «Расписание» содержит с0: число, с1: число, с2: число, с3: число, с4: число, с5: число, с6: число, с7: число, с8: число, с9: число, с10: число, с11: число, с12: число, с13: число, с14: число, с15: число
тип «Ход блока»
вариант «Ход блока» содержит расписание: «Расписание», свод: «Свод sha256»
тип «Сбор слов»
вариант «Сбор слов» содержит расписание: «Расписание», копилка: число, набрано: число
тип «Ход хеша»
вариант «Ход хеша» содержит свод: «Свод sha256», буфер: список числа, набрано: число
тотальная функция «Веса слова»
возвращает список числа
обеспечивает «разрядов ровно тридцать два» (длина результат) равен 32
пример «Тридцать два веса, от единицы до двух в тридцать первой»
ожидается [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144,
524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912,
1073741824, 2147483648]
тотальная функция «Бит»
принимает слово: число, вес: число
возвращает число
обеспечивает «младший бит целого слова — остаток от двойки» не (вес равен 1 и притом ((слово остаток от 1) плюс 0) равен 0) или (результат равен ((слово остаток от 2) плюс 0))
обеспечивает «бит — ноль или единица, и единица ровно тогда, когда остаток от двойного веса дотянул до веса» не (вес больше 0 и притом слово не меньше 0 и притом ((слово минус слово) равен 0)) или ((результат равен 0 или результат равен 1) и притом ((результат равен 1) равен ((слово остаток от (вес умножить на 2)) не меньше вес)))
пример «Младший бит пятёрки»
дано слово равно 5
дано вес равно 1
ожидается 1
тотальная функция «Четвёрка»
принимает слово: число, вес: число
возвращает число
обеспечивает «младшая четвёрка целого слова — остаток от шестнадцати» не (вес равен 1 и притом ((слово остаток от 1) плюс 0) равен 0) или (результат равен ((слово остаток от 16) плюс 0))
обеспечивает «четвёрка складывается ровно из четырёх своих битов» не (вес больше 0 и притом слово не меньше 0 и притом ((слово минус слово) равен 0)) или (результат равен ((«Бит» от слово и вес) плюс (2 умножить на («Бит» от слово и (вес умножить на 2))) плюс (4 умножить на («Бит» от слово и (вес умножить на 4))) плюс (8 умножить на («Бит» от слово и (вес умножить на 8)))))
пример «Младшая четвёрка»
дано слово равно 255
дано вес равно 1
ожидается 15
тотальная функция «Свести к слову»
принимает х: число
возвращает число
обеспечивает «слово неотрицательно, пока это число» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «слово меньше двух в тридцать второй, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Ноль»
дано х равно 0
ожидается 0
тотальная функция «Свести к байту»
принимает байт: число
возвращает число
обеспечивает «байт неотрицателен, пока это число» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «байт меньше двухсот пятидесяти шести» результат меньше 256
обеспечивает «за отрезком байта остаётся ноль» если байт не меньше 0 и притом байт не больше 255 то да иначе (результат равен 0)
обеспечивает «за отрезком байта остаётся ноль, дизъюнкцией» (байт не меньше 0 и притом байт не больше 255) или (результат равен 0)
пример «Ноль»
дано байт равно 0
ожидается 0
тотальная функция «Шаг байтовости»
принимает акк: признак, байт: число
возвращает признак
обеспечивает «после первого не байта байтовость уже не вернётся» если акк то да иначе (результат равен нет)
обеспечивает «пока всё байты, решает сведение самого числа» если акк то (результат равен ((«Свести к байту» от байт) равен байт)) иначе да
пример «Байт при истинном накопителе»
дано акк равно да
дано байт равно 7
ожидается да
тотальная функция «Это байты»
принимает байты: список числа
возвращает признак
обеспечивает «у пустого списка байтовость истинна» не ((длина байты) равен 0) или (результат равен да)
обеспечивает «на одном числе байтовость — это сведение к байту, не изменившее его» не ((длина байты) равен 1) или (результат равен ((«Свести к байту» от (элемент 1 в байты)) равен (элемент 1 в байты)))
пример «Пусто — байты»
дано байты равно пустой список
ожидается да
тотальная функция «Исключающее или трёх»
принимает первое: число, второе: число, третье: число
возвращает число
обеспечивает «результат — слово снизу, пока это число» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «результат — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Ноль с нулём и нулём»
дано первое равно 0
дано второе равно 0
дано третье равно 0
ожидается 0
тотальная функция «Выбор»
принимает условие: число, единичное: число, нулевое: число
возвращает число
обеспечивает «выбор — слово снизу, пока это число» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «выбор — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Условие сплошь нули — весь третий»
дано условие равно 0
дано единичное равно 4294967295
дано нулевое равно 305419896
ожидается 305419896
тотальная функция «Большинство»
принимает первое: число, второе: число, третье: число
возвращает число
обеспечивает «большинство — слово снизу, пока это число» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «большинство — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Все нули»
дано первое равно 0
дано второе равно 0
дано третье равно 0
ожидается 0
тотальная функция «Поворот вправо»
принимает слово: число, степень: число
возвращает число
обеспечивает «поворот — слово снизу, пока это число» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «поворот — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Поворот единицы на один разряд даёт старший бит»
дано слово равно 1
дано степень равно 2
ожидается 2147483648
тотальная функция «Сдвиг вправо»
принимает слово: число, степень: число
возвращает число
обеспечивает «сдвиг — слово снизу, пока это число» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «сдвиг — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Сдвиг на три разряда»
дано слово равно 255
дано степень равно 8
ожидается 31
тотальная функция «Большая сигма ноль»
принимает слово: число
возвращает число
обеспечивает «большая сигма ноль — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Ноль»
дано слово равно 0
ожидается 0
тотальная функция «Большая сигма один»
принимает слово: число
возвращает число
обеспечивает «большая сигма один — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Ноль»
дано слово равно 0
ожидается 0
тотальная функция «Малая сигма ноль»
принимает слово: число
возвращает число
обеспечивает «малая сигма ноль — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Ноль»
дано слово равно 0
ожидается 0
тотальная функция «Малая сигма один»
принимает слово: число
возвращает число
обеспечивает «малая сигма один — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Ноль»
дано слово равно 0
ожидается 0
тотальная функция «Начальный свод»
возвращает «Свод sha256»
обеспечивает «все восемь слов начального свода — настоящие тридцатидвухразрядные слова, и все восемь различны» (результат.н0 равен («Свести к слову» от результат.н0)) и притом (результат.н1 равен («Свести к слову» от результат.н1)) и притом (результат.н2 равен («Свести к слову» от результат.н2)) и притом (результат.н3 равен («Свести к слову» от результат.н3)) и притом (результат.н4 равен («Свести к слову» от результат.н4)) и притом (результат.н5 равен («Свести к слову» от результат.н5)) и притом (результат.н6 равен («Свести к слову» от результат.н6)) и притом (результат.н7 равен («Свести к слову» от результат.н7)) и притом (не (результат.н0 равен результат.н1)) и притом (не (результат.н0 равен результат.н2)) и притом (не (результат.н0 равен результат.н3)) и притом (не (результат.н0 равен результат.н4)) и притом (не (результат.н0 равен результат.н5)) и притом (не (результат.н0 равен результат.н6)) и притом (не (результат.н0 равен результат.н7)) и притом (не (результат.н1 равен результат.н2)) и притом (не (результат.н1 равен результат.н3)) и притом (не (результат.н1 равен результат.н4)) и притом (не (результат.н1 равен результат.н5)) и притом (не (результат.н1 равен результат.н6)) и притом (не (результат.н1 равен результат.н7)) и притом (не (результат.н2 равен результат.н3)) и притом (не (результат.н2 равен результат.н4)) и притом (не (результат.н2 равен результат.н5)) и притом (не (результат.н2 равен результат.н6)) и притом (не (результат.н2 равен результат.н7)) и притом (не (результат.н3 равен результат.н4)) и притом (не (результат.н3 равен результат.н5)) и притом (не (результат.н3 равен результат.н6)) и притом (не (результат.н3 равен результат.н7)) и притом (не (результат.н4 равен результат.н5)) и притом (не (результат.н4 равен результат.н6)) и притом (не (результат.н4 равен результат.н7)) и притом (не (результат.н5 равен результат.н6)) и притом (не (результат.н5 равен результат.н7)) и притом (не (результат.н6 равен результат.н7))
пример «6a09e667 bb67ae85 3c6ef372 a54ff53a 510e527f 9b05688c 1f83d9ab 5be0cd19»
ожидается вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225
тотальная функция «Постоянные раунда»
возвращает список числа
обеспечивает «постоянных ровно шестьдесят четыре» (длина результат) равен 64
пример «Первая — 428a2f98, последняя — c67178f2»
ожидается [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221,
3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401,
4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349,
2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372,
1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771,
3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479,
3329325298]
тотальная функция «Пустое расписание»
возвращает «Расписание»
обеспечивает «у пустого расписания все шестнадцать слов — нули» (результат.с0 равен 0) и притом (результат.с1 равен 0) и притом (результат.с2 равен 0) и притом (результат.с3 равен 0) и притом (результат.с4 равен 0) и притом (результат.с5 равен 0) и притом (результат.с6 равен 0) и притом (результат.с7 равен 0) и притом (результат.с8 равен 0) и притом (результат.с9 равен 0) и притом (результат.с10 равен 0) и притом (результат.с11 равен 0) и притом (результат.с12 равен 0) и притом (результат.с13 равен 0) и притом (результат.с14 равен 0) и притом (результат.с15 равен 0)
пример «Шестнадцать нулей»
ожидается вариант «Расписание» с с0 равным 0 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 0 и с15 равным 0
тотальная функция «Сдвинуть расписание»
принимает расписание: «Расписание», слово: число
возвращает «Расписание»
обеспечивает «сдвиг: поле 1 берёт прежнее поле 2» (результат.с1 равен расписание.с2)
обеспечивает «сдвиг: поле 2 берёт прежнее поле 3» (результат.с2 равен расписание.с3)
обеспечивает «сдвиг: поле 3 берёт прежнее поле 4» (результат.с3 равен расписание.с4)
обеспечивает «сдвиг: поле 4 берёт прежнее поле 5» (результат.с4 равен расписание.с5)
обеспечивает «сдвиг: поле 5 берёт прежнее поле 6» (результат.с5 равен расписание.с6)
обеспечивает «сдвиг: поле 6 берёт прежнее поле 7» (результат.с6 равен расписание.с7)
обеспечивает «сдвиг: поле 7 берёт прежнее поле 8» (результат.с7 равен расписание.с8)
обеспечивает «сдвиг: поле 8 берёт прежнее поле 9» (результат.с8 равен расписание.с9)
обеспечивает «сдвиг: поле 9 берёт прежнее поле 10» (результат.с9 равен расписание.с10)
обеспечивает «сдвиг: поле 10 берёт прежнее поле 11» (результат.с10 равен расписание.с11)
обеспечивает «сдвиг: поле 11 берёт прежнее поле 12» (результат.с11 равен расписание.с12)
обеспечивает «сдвиг: поле 12 берёт прежнее поле 13» (результат.с12 равен расписание.с13)
обеспечивает «сдвиг: поле 13 берёт прежнее поле 14» (результат.с13 равен расписание.с14)
обеспечивает «сдвиг: поле 14 берёт прежнее поле 15» (результат.с14 равен расписание.с15)
обеспечивает «сдвиг: поле 0 берёт прежнее поле 1» (результат.с0 равен расписание.с1)
обеспечивает «сдвиг: последним полем встаёт новое слово» (результат.с15 равен слово)
пример «Всё съезжает на одно поле, новое встаёт последним»
дано расписание равно вариант «Расписание» с с0 равным 1 и с1 равным 2 и с2 равным 3 и с3 равным 4 и с4 равным 5 и с5 равным 6 и с6 равным 7 и с7 равным 8 и с8 равным 9 и с9 равным 10 и с10 равным 11 и с11 равным 12 и с12 равным 13 и с13 равным 14 и с14 равным 15 и с15 равным 16
дано слово равно 17
ожидается вариант «Расписание» с с0 равным 2 и с1 равным 3 и с2 равным 4 и с3 равным 5 и с4 равным 6 и с5 равным 7 и с6 равным 8 и с7 равным 9 и с8 равным 10 и с9 равным 11 и с10 равным 12 и с11 равным 13 и с12 равным 14 и с13 равным 15 и с14 равным 16 и с15 равным 17
тотальная функция «Следующее слово»
принимает расписание: «Расписание»
возвращает число
обеспечивает «следующее слово — слово сверху, пока это число» не ((результат минус результат) равен 0) или (результат меньше 4294967296)
пример «Пустое расписание рождает ноль»
дано расписание равно вариант «Расписание» с с0 равным 0 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 0 и с15 равным 0
ожидается 0
тотальная функция «Шаг сбора слов»
принимает сбор: «Сбор слов», байт: число
возвращает «Сбор слов»
обеспечивает «четвёртый байт замыкает слово: копилка обнуляется, а слово встаёт последним в расписании» не (сбор.набрано не меньше 3) или ((результат.набрано равен 0) и притом (результат.копилка равен 0) и притом (результат.расписание.с15 равен ((сбор.копилка умножить на 256) плюс («Свести к байту» от байт))))
обеспечивает «четвёртый байт: счёт обнуляется» не (сбор.набрано не меньше 3) или (результат.набрано равен 0)
обеспечивает «четвёртый байт: копилка обнуляется» не (сбор.набрано не меньше 3) или (результат.копилка равен 0)
обеспечивает «четвёртый байт: собранное слово встаёт последним полем расписания» не (сбор.набрано не меньше 3) или (результат.расписание.с15 равен ((сбор.копилка умножить на 256) плюс («Свести к байту» от байт)))
обеспечивает «до четвёртого байт только вдвигается в копилку слева, а расписание не трогается» (сбор.набрано не меньше 3) или ((результат.набрано равен (сбор.набрано плюс 1)) и притом (результат.копилка равен ((сбор.копилка умножить на 256) плюс («Свести к байту» от байт))) и притом (результат.расписание.с15 равен сбор.расписание.с15) и притом (результат.расписание.с0 равен сбор.расписание.с0))
пример «Первый байт только копится»
дано сбор равно вариант «Сбор слов» с расписание равным (вариант «Расписание» с с0 равным 0 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 0 и с15 равным 0) и копилка равным 0 и набрано равным 0
дано байт равно 97
ожидается вариант «Сбор слов» с расписание равным (вариант «Расписание» с с0 равным 0 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 0 и с15 равным 0) и копилка равным 97 и набрано равным 1
тотальная функция «Расписание блока»
принимает блок: список числа
возвращает «Расписание»
обеспечивает «четыре байта складываются в одно слово старшим байтом вперёд и встают последним полем» не ((длина блок) равен 4) или ((результат.с15 равен (((«Свести к байту» от (элемент 1 в блок)) умножить на 16777216) плюс ((«Свести к байту» от (элемент 2 в блок)) умножить на 65536) плюс ((«Свести к байту» от (элемент 3 в блок)) умножить на 256) плюс («Свести к байту» от (элемент 4 в блок)))) и притом (результат.с14 равен 0))
обеспечивает «блок короче четырёх байтов слова не даёт: расписание остаётся нулевым» не ((длина блок) меньше 4) или ((результат.с15 равен 0) и притом (результат.с0 равен 0))
пример «Пустой блок даёт нули»
дано блок равно пустой список
ожидается вариант «Расписание» с с0 равным 0 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 0 и с15 равным 0
тотальная функция «Шаг раунда»
принимает ход: «Ход блока», постоянная: число
возвращает «Ход блока»
обеспечивает «раунд задвигает свод на одно место: а становится б, б — в, и так далее» (результат.свод.н1 равен ход.свод.н0) и притом (результат.свод.н2 равен ход.свод.н1) и притом (результат.свод.н3 равен ход.свод.н2) и притом (результат.свод.н5 равен ход.свод.н4) и притом (результат.свод.н6 равен ход.свод.н5) и притом (результат.свод.н7 равен ход.свод.н6)
обеспечивает «раунд: слово 1 свода берёт прежнее слово 0» (результат.свод.н1 равен ход.свод.н0)
обеспечивает «раунд: слово 7 свода берёт прежнее слово 6» (результат.свод.н7 равен ход.свод.н6)
обеспечивает «раунд: слово 2 свода берёт прежнее слово 1» (результат.свод.н2 равен ход.свод.н1)
обеспечивает «раунд: слово 3 свода берёт прежнее слово 2» (результат.свод.н3 равен ход.свод.н2)
обеспечивает «раунд: слово 5 свода берёт прежнее слово 4» (результат.свод.н5 равен ход.свод.н4)
обеспечивает «раунд: слово 6 свода берёт прежнее слово 5» (результат.свод.н6 равен ход.свод.н5)
обеспечивает «раунд двигает окно расписания на одно слово вперёд, и на освободившееся место встаёт настоящее слово» (результат.расписание.с0 равен ход.расписание.с1) и притом (результат.расписание.с1 равен ход.расписание.с2) и притом (результат.расписание.с2 равен ход.расписание.с3) и притом (результат.расписание.с3 равен ход.расписание.с4) и притом (результат.расписание.с4 равен ход.расписание.с5) и притом (результат.расписание.с5 равен ход.расписание.с6) и притом (результат.расписание.с6 равен ход.расписание.с7) и притом (результат.расписание.с7 равен ход.расписание.с8) и притом (результат.расписание.с8 равен ход.расписание.с9) и притом (результат.расписание.с9 равен ход.расписание.с10) и притом (результат.расписание.с10 равен ход.расписание.с11) и притом (результат.расписание.с11 равен ход.расписание.с12) и притом (результат.расписание.с12 равен ход.расписание.с13) и притом (результат.расписание.с13 равен ход.расписание.с14) и притом (результат.расписание.с14 равен ход.расписание.с15) и притом (не ((результат.расписание.с15 минус результат.расписание.с15) равен 0) или ((результат.расписание.с15 не меньше 0) и притом (результат.расписание.с15 меньше 4294967296)))
обеспечивает «раунд: окно, поле 0 берёт прежнее поле 1» (результат.расписание.с0 равен ход.расписание.с1)
обеспечивает «раунд: окно, поле 1 берёт прежнее поле 2» (результат.расписание.с1 равен ход.расписание.с2)
обеспечивает «раунд: окно, поле 2 берёт прежнее поле 3» (результат.расписание.с2 равен ход.расписание.с3)
обеспечивает «раунд: окно, поле 3 берёт прежнее поле 4» (результат.расписание.с3 равен ход.расписание.с4)
обеспечивает «раунд: окно, поле 4 берёт прежнее поле 5» (результат.расписание.с4 равен ход.расписание.с5)
обеспечивает «раунд: окно, поле 5 берёт прежнее поле 6» (результат.расписание.с5 равен ход.расписание.с6)
обеспечивает «раунд: окно, поле 6 берёт прежнее поле 7» (результат.расписание.с6 равен ход.расписание.с7)
обеспечивает «раунд: окно, поле 7 берёт прежнее поле 8» (результат.расписание.с7 равен ход.расписание.с8)
обеспечивает «раунд: окно, поле 8 берёт прежнее поле 9» (результат.расписание.с8 равен ход.расписание.с9)
обеспечивает «раунд: окно, поле 9 берёт прежнее поле 10» (результат.расписание.с9 равен ход.расписание.с10)
обеспечивает «раунд: окно, поле 10 берёт прежнее поле 11» (результат.расписание.с10 равен ход.расписание.с11)
обеспечивает «раунд: окно, поле 11 берёт прежнее поле 12» (результат.расписание.с11 равен ход.расписание.с12)
обеспечивает «раунд: окно, поле 12 берёт прежнее поле 13» (результат.расписание.с12 равен ход.расписание.с13)
обеспечивает «раунд: окно, поле 13 берёт прежнее поле 14» (результат.расписание.с13 равен ход.расписание.с14)
обеспечивает «раунд: окно, поле 14 берёт прежнее поле 15» (результат.расписание.с14 равен ход.расписание.с15)
пример «Первый раунд блока abc из FIPS»
дано ход равно вариант «Ход блока» с расписание равным (вариант «Расписание» с с0 равным 1633837952 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 0 и с15 равным 24) и свод равным (вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225)
дано постоянная равно 1116352408
ожидается вариант «Ход блока» с расписание равным (вариант «Расписание» с с0 равным 0 и с1 равным 0 и с2 равным 0 и с3 равным 0 и с4 равным 0 и с5 равным 0 и с6 равным 0 и с7 равным 0 и с8 равным 0 и с9 равным 0 и с10 равным 0 и с11 равным 0 и с12 равным 0 и с13 равным 0 и с14 равным 24 и с15 равным 1633837952) и свод равным (вариант «Свод» с н0 равным 1567288269 и н1 равным 1779033703 и н2 равным 3144134277 и н3 равным 1013904242 и н4 равным 4197074466 и н5 равным 1359893119 и н6 равным 2600822924 и н7 равным 528734635)
тотальная функция «Сложить своды»
принимает первый: «Свод sha256», второй: «Свод sha256»
возвращает «Свод sha256»
обеспечивает «своды складываются покомпонентно по модулю два в тридцать второй, и слагаемые можно свести заранее» (результат.н0 равен («Свести к слову» от ((«Свести к слову» от первый.н0) плюс («Свести к слову» от второй.н0)))) и притом (результат.н1 равен («Свести к слову» от ((«Свести к слову» от первый.н1) плюс («Свести к слову» от второй.н1)))) и притом (результат.н2 равен («Свести к слову» от ((«Свести к слову» от первый.н2) плюс («Свести к слову» от второй.н2)))) и притом (результат.н3 равен («Свести к слову» от ((«Свести к слову» от первый.н3) плюс («Свести к слову» от второй.н3)))) и притом (результат.н4 равен («Свести к слову» от ((«Свести к слову» от первый.н4) плюс («Свести к слову» от второй.н4)))) и притом (результат.н5 равен («Свести к слову» от ((«Свести к слову» от первый.н5) плюс («Свести к слову» от второй.н5)))) и притом (результат.н6 равен («Свести к слову» от ((«Свести к слову» от первый.н6) плюс («Свести к слову» от второй.н6)))) и притом (результат.н7 равен («Свести к слову» от ((«Свести к слову» от первый.н7) плюс («Свести к слову» от второй.н7))))
обеспечивает «сложение: слово 0 — сумма прежних слов 0, сведённая к слову» (результат.н0 равен («Свести к слову» от (первый.н0 плюс второй.н0)))
обеспечивает «сложение: слово 1 — сумма прежних слов 1, сведённая к слову» (результат.н1 равен («Свести к слову» от (первый.н1 плюс второй.н1)))
обеспечивает «сложение: слово 2 — сумма прежних слов 2, сведённая к слову» (результат.н2 равен («Свести к слову» от (первый.н2 плюс второй.н2)))
обеспечивает «сложение: слово 3 — сумма прежних слов 3, сведённая к слову» (результат.н3 равен («Свести к слову» от (первый.н3 плюс второй.н3)))
обеспечивает «сложение: слово 4 — сумма прежних слов 4, сведённая к слову» (результат.н4 равен («Свести к слову» от (первый.н4 плюс второй.н4)))
обеспечивает «сложение: слово 5 — сумма прежних слов 5, сведённая к слову» (результат.н5 равен («Свести к слову» от (первый.н5 плюс второй.н5)))
обеспечивает «сложение: слово 6 — сумма прежних слов 6, сведённая к слову» (результат.н6 равен («Свести к слову» от (первый.н6 плюс второй.н6)))
обеспечивает «сложение: слово 7 — сумма прежних слов 7, сведённая к слову» (результат.н7 равен («Свести к слову» от (первый.н7 плюс второй.н7)))
пример «Ноль плюс начальный свод — начальный свод»
дано первый равно вариант «Свод» с н0 равным 0 и н1 равным 0 и н2 равным 0 и н3 равным 0 и н4 равным 0 и н5 равным 0 и н6 равным 0 и н7 равным 0
дано второй равно вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225
ожидается вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225
тотальная функция «Сжать блок»
принимает свод: «Свод sha256», блок: список числа
возвращает «Свод sha256»
обеспечивает «сжатие нулевого свода нулевым блоком нулей не оставляет» не ((длина блок) равен 0 и притом (свод.н0 равен 0) и притом (свод.н1 равен 0) и притом (свод.н2 равен 0) и притом (свод.н3 равен 0) и притом (свод.н4 равен 0) и притом (свод.н5 равен 0) и притом (свод.н6 равен 0) и притом (свод.н7 равен 0)) или ((не (результат.н0 равен 0)) и притом (не (результат.н7 равен 0)))
пример «Единственный блок сообщения abc — это и есть весь хеш abc»
дано свод равно вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225
дано блок равно [97, 98, 99, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24]
ожидается вариант «Свод» с н0 равным 3128432319 и н1 равным 2399260650 и н2 равным 1094795486 и н3 равным 1571693091 и н4 равным 2953011619 и н5 равным 2518121116 и н6 равным 3021012833 и н7 равным 4060091821
тотальная функция «Нули»
принимает сколько: неотрицательное
возвращает список числа
обеспечивает «нулей не бывает меньше нуля» (длина результат) не меньше 0
пример «Нисколько»
дано сколько равно 0
ожидается пустой список
тотальная функция «Байт разряда»
принимает число: число, степень: число
возвращает число
обеспечивает «младший байт целого числа — остаток от двухсот пятидесяти шести» не (степень равен 1 и притом ((число остаток от 1) плюс 0) равен 0) или (результат равен ((число остаток от 256) плюс 0))
обеспечивает «байт складывается ровно из двух своих четвёрок» не (степень больше 0 и притом число не меньше 0 и притом ((число минус число) равен 0)) или (результат равен ((16 умножить на («Четвёрка» от число и (степень умножить на 16))) плюс («Четвёрка» от число и степень)))
пример «Младший байт»
дано число равно 305419896
дано степень равно 1
ожидается 120
тотальная функция «Байты длины»
принимает битов: число
возвращает список числа
обеспечивает «длина занимает ровно восемь байтов» (длина результат) равен 8
пример «Двадцать четыре бита — сообщение abc»
дано битов равно 24
ожидается [0, 0, 0, 0, 0, 0, 0, 24]
тотальная функция «Дополнить сообщение»
принимает байты: список числа
возвращает список числа
обеспечивает «дополненное сообщение делится на блоки нацело» ((длина результат) остаток от 64) равен 0
обеспечивает «дополнение только удлиняет» (длина результат) больше (длина байты)
пример «Пустое сообщение — один блок»
дано байты равно пустой список
ожидается [128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Шаг байта»
принимает ход: «Ход хеша», байт: число
возвращает «Ход хеша»
обеспечивает «шестьдесят четвёртый байт закрывает блок: буфер пустеет, счёт обнуляется» не (ход.набрано не меньше 63) или ((результат.набрано равен 0) и притом ((длина результат.буфер) равен 0))
обеспечивает «до шестьдесят четвёртого байт ложится в хвост буфера, а свод не трогается» (ход.набрано не меньше 63) или ((результат.набрано равен (ход.набрано плюс 1)) и притом ((длина результат.буфер) равен ((длина ход.буфер) плюс 1)) и притом ((элемент (длина результат.буфер) в результат.буфер) равен («Свести к байту» от байт)) и притом (результат.свод.н0 равен ход.свод.н0) и притом (результат.свод.н7 равен ход.свод.н7))
обеспечивает «до шестьдесят четвёртого: счёт растёт на один» (ход.набрано не меньше 63) или (результат.набрано равен (ход.набрано плюс 1))
обеспечивает «до шестьдесят четвёртого: буфер длиннее на один» (ход.набрано не меньше 63) или ((длина результат.буфер) равен ((длина ход.буфер) плюс 1))
обеспечивает «до шестьдесят четвёртого: байт лёг последним в буфер» (ход.набрано не меньше 63) или ((элемент (длина результат.буфер) в результат.буфер) равен («Свести к байту» от байт))
обеспечивает «до шестьдесят четвёртого: первое слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н0 равен ход.свод.н0)
обеспечивает «до шестьдесят четвёртого: последнее слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н7 равен ход.свод.н7)
обеспечивает «до шестьдесят четвёртого: второе слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н1 равен ход.свод.н1)
обеспечивает «до шестьдесят четвёртого: третье слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н2 равен ход.свод.н2)
обеспечивает «до шестьдесят четвёртого: четвёртое слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н3 равен ход.свод.н3)
обеспечивает «до шестьдесят четвёртого: пятое слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н4 равен ход.свод.н4)
обеспечивает «до шестьдесят четвёртого: шестое слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н5 равен ход.свод.н5)
обеспечивает «до шестьдесят четвёртого: седьмое слово свода не тронуто» (ход.набрано не меньше 63) или (результат.свод.н6 равен ход.свод.н6)
пример «Первый байт только копится»
дано ход равно вариант «Ход хеша» с свод равным (вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225) и буфер равным пустой список и набрано равным 0
дано байт равно 97
ожидается вариант «Ход хеша» с свод равным (вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225) и буфер равным [97] и набрано равным 1
тотальная функция «Свод байтов»
принимает байты: список числа
возвращает «Свод sha256»
обеспечивает «свод пустого сообщения — тот самый e3b0c442 из FIPS 180-4» не ((длина байты) равен 0) или ((результат.н0 равен 3820012610) и притом (результат.н1 равен 2566659092) и притом (результат.н7 равен 2018687061))
пример «Пустое сообщение»
дано байты равно пустой список
ожидается вариант «Свод» с н0 равным 3820012610 и н1 равным 2566659092 и н2 равным 2600203464 и н3 равным 2574235940 и н4 равным 665731556 и н5 равным 1687917388 и н6 равным 2761267483 и н7 равным 2018687061
тотальная функция «Азбука 16»
возвращает строка
обеспечивает «в азбуке шестнадцать знаков» (длина результат) равен 16
пример «Строчные, как в digest hex»
ожидается "0123456789abcdef"
тотальная функция «Цифра 16»
принимает н: число
возвращает строка
обеспечивает «цифра — ровно один знак» (длина результат) равен 1
пример «Ноль»
дано н равно 0
ожидается "0"
тотальная функция «Слово шестнадцатеричным»
принимает слово: число
возвращает строка
обеспечивает «слово печатается ровно восемью знаками» (длина результат) равен 8
пример «Ноль»
дано слово равно 0
ожидается "00000000"
тотальная функция «Свод шестнадцатеричным»
принимает свод: «Свод sha256»
возвращает строка
обеспечивает «хеш печатается ровно шестьюдесятью четырьмя знаками» (длина результат) равен 64
пример «Начальный свод»
дано свод равно вариант «Свод» с н0 равным 1779033703 и н1 равным 3144134277 и н2 равным 1013904242 и н3 равным 2773480762 и н4 равным 1359893119 и н5 равным 2600822924 и н6 равным 528734635 и н7 равным 1541459225
ожидается "6a09e667bb67ae853c6ef372a54ff53a510e527f9b05688c1f83d9ab5be0cd19"
тотальная функция «Хеш байтов»
принимает байты: список числа
возвращает строка
обеспечивает «хеш — ровно шестьдесят четыре знака» (длина результат) равен 64
пример «Пустое сообщение — первый официальный вектор FIPS»
дано байты равно пустой список
ожидается "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
| Function | Termination | Claims |
|---|---|---|
| «Веса слова» | доказано композицией | доказано 1 из 1 |
| «Бит» | доказано композицией | доказано 0 из 2; «младший бит целого слова — остаток от двойки» — сетка; «бит — ноль или единица, и единица ровно тогда, когда остаток от двойного веса дотянул до веса» — сетка |
| «Четвёрка» | доказано композицией | доказано 0 из 2; «младшая четвёрка целого слова — остаток от шестнадцати» — сетка; «четвёрка складывается ровно из четырёх своих битов» — сетка |
| «Свести к слову» | доказано композицией | доказано 0 из 2; «слово неотрицательно, пока это число» — сетка; «слово меньше двух в тридцать второй, пока это число» — сетка |
| «Свести к байту» | доказано композицией | доказано 2 из 4; «байт неотрицателен, пока это число» — сетка; «байт меньше двухсот пятидесяти шести» — сетка |
| «Шаг байтовости» | доказано композицией | доказано 2 из 2 |
| «Это байты» | доказано композицией | доказано 1 из 2; «на одном числе байтовость — это сведение к байту, не изменившее его» — сетка |
| «Исключающее или трёх» | доказано композицией | доказано 0 из 2; «результат — слово снизу, пока это число» — сетка; «результат — слово сверху, пока это число» — сетка |
| «Выбор» | доказано композицией | доказано 0 из 2; «выбор — слово снизу, пока это число» — сетка; «выбор — слово сверху, пока это число» — сетка |
| «Большинство» | доказано композицией | доказано 0 из 2; «большинство — слово снизу, пока это число» — сетка; «большинство — слово сверху, пока это число» — сетка |
| «Поворот вправо» | доказано композицией | доказано 0 из 2; «поворот — слово снизу, пока это число» — сетка; «поворот — слово сверху, пока это число» — сетка |
| «Сдвиг вправо» | доказано композицией | доказано 0 из 2; «сдвиг — слово снизу, пока это число» — сетка; «сдвиг — слово сверху, пока это число» — сетка |
| «Большая сигма ноль» | доказано композицией | доказано 1 из 1 |
| «Большая сигма один» | доказано композицией | доказано 1 из 1 |
| «Малая сигма ноль» | доказано композицией | доказано 1 из 1 |
| «Малая сигма один» | доказано композицией | доказано 1 из 1 |
| «Начальный свод» | доказано композицией | доказано 1 из 1 |
| «Постоянные раунда» | доказано композицией | доказано 1 из 1 |
| «Пустое расписание» | доказано композицией | доказано 1 из 1 |
| «Сдвинуть расписание» | доказано композицией | доказано 16 из 16 |
| «Следующее слово» | доказано композицией | доказано 0 из 1; «следующее слово — слово сверху, пока это число» — сетка |
| «Шаг сбора слов» | доказано композицией | доказано 5 из 5 |
| «Расписание блока» | доказано композицией | доказано 0 из 2; «четыре байта складываются в одно слово старшим байтом вперёд и встают последним полем» — сетка; «блок короче четырёх байтов слова не даёт: расписание остаётся нулевым» — сетка |
| «Шаг раунда» | доказано композицией | доказано 21 из 23; «раунд задвигает свод на одно место: а становится б, б — в, и так далее» — сетка; «раунд двигает окно расписания на одно слово вперёд, и на освободившееся место встаёт настоящее слово» — сетка |
| «Сложить своды» | доказано композицией | доказано 8 из 9; «своды складываются покомпонентно по модулю два в тридцать второй, и слагаемые можно свести заранее» — сетка |
| «Сжать блок» | доказано композицией | доказано 0 из 1; «сжатие нулевого свода нулевым блоком нулей не оставляет» — сетка |
| «Нули» | доказано точным шагом | доказано 1 из 1 |
| «Байт разряда» | доказано композицией | доказано 0 из 2; «младший байт целого числа — остаток от двухсот пятидесяти шести» — сетка; «байт складывается ровно из двух своих четвёрок» — сетка |
| «Байты длины» | доказано композицией | доказано 1 из 1 |
| «Дополнить сообщение» | доказано композицией | доказано 0 из 2; «дополненное сообщение делится на блоки нацело» — сетка; «дополнение только удлиняет» — сетка |
| «Шаг байта» | доказано композицией | доказано 12 из 13; «до шестьдесят четвёртого байт ложится в хвост буфера, а свод не трогается» — сетка |
| «Свод байтов» | доказано композицией | доказано 0 из 1; «свод пустого сообщения — тот самый e3b0c442 из FIPS 180-4» — сетка |
| «Азбука 16» | доказано композицией | доказано 1 из 1 |
| «Цифра 16» | доказано композицией | доказано 1 из 1 |
| «Слово шестнадцатеричным» | доказано композицией | доказано 0 из 1; «слово печатается ровно восемью знаками» — сетка |
| «Свод шестнадцатеричным» | доказано композицией | доказано 0 из 1; «хеш печатается ровно шестьюдесятью четырьмя знаками» — сетка |
| «Хеш байтов» | доказано композицией | доказано 1 из 1 |
«SQLite»
flang/stdlib/sqlite.flang — functions 101; the kernel ledger was taken from this version of the file
тип «Варинт»
вариант «Взятый варинт» содержит значение: число, взято: число
тип «Сбор варинтов»
вариант «Собираем варинты» содержит текущее: число, набрано: список числа
тип «Сбор указателей»
вариант «Собираем указатели» содержит старший: число, половина: признак, набрано: список числа
тип «Значение»
вариант «Ничего»
вариант «Целое» содержит значение: число
вариант «Дробное» содержит значение: число
вариант «Текст» содержит текст: строка
вариант «Двоичное» содержит октеты: список числа
тип «Ряд»
вариант «Строка таблицы» содержит номер: число, значения: список «Значение»
тип «Таблица»
вариант «Таблица базы» содержит имя: строка, корень: число, определение: строка
тотальная функция «Отбросить октеты»
принимает октеты: список числа, сколько: число
возвращает список числа
обеспечивает «отброшено не больше, чем было» (длина результат) не больше (длина октеты)
обеспечивает «при неположительном счёте не отброшено ничего» если сколько не больше 0 то (длина результат) равен (длина октеты) иначе да
пример «два октета с головы»
дано октеты равно [1, 2, 3, 4]
дано сколько равно 2
ожидается [3, 4]
тотальная функция «Взять октеты»
принимает октеты: список числа, сколько: число
возвращает список числа
обеспечивает «взято не больше, чем было» (длина результат) не больше (длина октеты)
обеспечивает «неположительный счёт даёт ровно пустой список» если сколько не больше 0 то результат равен пустой список иначе да
обеспечивает «целое N внутри длины даёт ровно N октетов» не (((сколько остаток от 1) равен 0) и притом ((сколько не меньше 0) и притом (сколько не больше (длина октеты)))) или ((длина результат) равен сколько)
пример «два октета с головы»
дано октеты равно [1, 2, 3, 4]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Кусок октетов»
принимает октеты: список числа, смещение: число, сколько: число
возвращает список числа
обеспечивает «кусок не длиннее заказанного» если сколько не меньше 0 то (длина результат) не больше сколько иначе да
обеспечивает «неположительный счёт даёт ровно пустой список» если сколько не больше 0 то результат равен пустой список иначе да
обеспечивает «смещение за концом октетов даёт ровно пустой список» если не (сколько не больше 0) то (если (смещение меньше 0) или (смещение не меньше (длина октеты)) то результат равен пустой список иначе да) иначе да
пример «середина»
дано октеты равно [1, 2, 3, 4, 5]
дано смещение равно 1
дано сколько равно 3
ожидается [2, 3, 4]
тип «Сбор октетов»
вариант «Собираем октеты» содержит осталось: число, набрано: список числа
тотальная функция «Шаг взятия»
принимает ход: «Сбор октетов», октет: число
возвращает «Сбор октетов»
обеспечивает «за шаг набирается не больше одного октета» (длина результат.набрано) не больше ((длина ход.набрано) плюс 1)
тотальная функция «Голова октетов»
принимает октеты: список числа, сколько: число
возвращает список числа
пример «два октета с головы»
дано октеты равно [1, 2, 3, 4]
дано сколько равно 2
ожидается [1, 2]
тип «Сброс октетов»
вариант «Сбрасываем октеты» содержит осталось: число, набрано: список числа
тотальная функция «Шаг сброса»
принимает ход: «Сброс октетов», октет: число
возвращает «Сброс октетов»
обеспечивает «за шаг набирается не больше одного октета» (длина результат.набрано) не больше ((длина ход.набрано) плюс 1)
тотальная функция «Хвост октетов»
принимает октеты: список числа, сколько: число
возвращает список числа
пример «два октета с головы долой»
дано октеты равно [1, 2, 3, 4]
дано сколько равно 2
ожидается [3, 4]
тотальная функция «Крупный кусок»
принимает октеты: список числа, смещение: число, сколько: число
возвращает список числа
пример «середина»
дано октеты равно [1, 2, 3, 4, 5]
дано смещение равно 1
дано сколько равно 3
ожидается [2, 3, 4]
тотальная функция «Целое из октетов»
принимает октеты: список числа
возвращает число
обеспечивает «пустые октеты дают ноль» если пусто октеты то результат равен 0 иначе да
обеспечивает «один октет даёт сам себя» если (длина октеты) равен 1 то результат равен (голова октеты) иначе да
пример «два октета: 4096»
дано октеты равно [16, 0]
ожидается 4096
тотальная функция «Целое у смещения»
принимает октеты: список числа, смещение: число, ширина: число
возвращает число
обеспечивает «целое неотрицательно, пока октеты неотрицательны» если пусто октеты то результат равен 0 иначе да
пример «размер страницы лежит по смещению 16»
дано октеты равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0]
дано смещение равно 16
дано ширина равно 2
ожидается 4096
тотальная функция «Двойка вверх»
принимает степень: число
возвращает число
обеспечивает «двойка в неотрицательной степени не меньше единицы» результат не меньше 1
обеспечивает «нулевая и отрицательная степень дают ровно единицу» если степень не больше 0 то результат равен 1 иначе да
обеспечивает «положительная степень — ровно вдвое от предыдущей» если не (степень не больше 0) то результат равен (2 умножить на («Двойка вверх» от (степень минус 1))) иначе да
пример «два в третьей»
дано степень равно 3
ожидается 8
тотальная функция «Двойка вниз»
принимает степень: число
возвращает число
обеспечивает «двойка в отрицательной степени положительна» результат больше 0
обеспечивает «нулевая и отрицательная степень вниз дают ровно единицу» если степень не больше 0 то результат равен 1 иначе да
обеспечивает «положительная степень вниз — ровно половина предыдущей» если не (степень не больше 0) то результат равен ((«Двойка вниз» от (степень минус 1)) делить на 2) иначе да
обеспечивает «двойка в отрицательной степени не больше единицы» результат не больше 1
пример «два в минус третьей»
дано степень равно 3
ожидается 0.125
тотальная функция «Двойка в степени»
принимает показатель: число
возвращает число
обеспечивает «степень двойки положительна» результат больше 0
обеспечивает «неотрицательный показатель считается вверх» если показатель не меньше 0 то результат равен («Двойка вверх» от показатель) иначе да
обеспечивает «отрицательный показатель считается вниз» если не (показатель не меньше 0) то результат равен («Двойка вниз» от (0 минус показатель)) иначе да
пример «положительный показатель»
дано показатель равно 10
ожидается 1024
тотальная функция «Дробное из октетов»
принимает октеты: список числа
возвращает число
обеспечивает «восемь нулевых октетов дают ноль» если («Целое из октетов» от октеты) равен 0 то результат равен 0 иначе да
пример «единица»
дано октеты равно [63, 240, 0, 0, 0, 0, 0, 0]
ожидается 1
тотальная функция «Текст октетов»
принимает октеты: список числа
возвращает строка
обеспечивает «пустые октеты дают пустой текст» если пусто октеты то (длина результат) равен 0 иначе да
пример «латиница»
дано октеты равно [116, 97, 98, 108, 101]
ожидается "table"
тотальная функция «Магия базы»
возвращает строка
обеспечивает «магия ровно в пятнадцать знаков» (длина результат) равен 15
пример «магия названа целиком»
ожидается "SQLite format 3"
тотальная функция «Это база SQLite»
принимает октеты: список числа
возвращает признак
обеспечивает «короче магии — не база» если (длина октеты) меньше 16 то не результат иначе да
обеспечивает «не короче магии — ответ ровно по магии и нулевому шестнадцатому октету» если не ((длина октеты) меньше 16) то (результат равен (((«Текст октетов» от («Взять октеты» от октеты и 15)) равен («Магия базы»)) и притом ((элемент 16 в октеты) равен 0))) иначе да
пример «пустое — не база»
дано октеты равно пустой список
ожидается нет
тотальная функция «Размер страницы»
принимает октеты: список числа
возвращает число
обеспечивает «размер страницы у настоящей базы не меньше пятисот двенадцати» если («Это база SQLite» от октеты) то результат не меньше 512 иначе да
обеспечивает «единица в поле размера значит ровно шестьдесят пять тысяч пятьсот тридцать шесть» если («Целое у смещения» от октеты и 16 и 2) равен 1 то результат равен 65536 иначе да
обеспечивает «всякое другое поле размера отдаётся как есть» если не ((«Целое у смещения» от октеты и 16 и 2) равен 1) то результат равен («Целое у смещения» от октеты и 16 и 2) иначе да
пример «обычные четыре килобайта»
дано октеты равно [83, 81, 76, 105, 116, 101, 32, 102, 111, 114, 109, 97, 116, 32, 51, 0, 16, 0]
ожидается 4096
тотальная функция «Страниц в базе»
принимает октеты: список числа
возвращает число
обеспечивает «страниц ровно столько, сколько их влезает в файл, пока заголовок не врёт» (не («Это база SQLite» от октеты)) или (не ((результат умножить на («Размер страницы» от октеты)) равен (длина октеты))) или (результат не меньше 1)
тотальная функция «Начало страницы»
принимает октеты: список числа, номер: число
возвращает число
обеспечивает «первая страница начинается с нулевого октета» если номер равен 1 то результат равен 0 иначе да
тотальная функция «Смещение заголовка страницы»
принимает номер: число
возвращает число
обеспечивает «сто на первой странице, ноль на всякой другой» результат равен (если номер равен 1 то 100 иначе 0)
пример «первая страница»
дано номер равно 1
ожидается 100
тотальная функция «Вид страницы»
принимает октеты: список числа, номер: число
возвращает число
обеспечивает «вид неотрицателен» результат не меньше 0
тотальная функция «Это лист таблицы»
принимает октеты: список числа, номер: число
возвращает признак
обеспечивает «лист таблицы — это ровно вид 13» результат равен ((«Вид страницы» от октеты и номер) равен 13)
пример «в пустом образе страница листом не зовётся»
дано октеты равно []
дано номер равно 1
ожидается нет
тотальная функция «Ячеек на странице»
принимает октеты: список числа, номер: число
возвращает число
обеспечивает «ячеек не больше, чем указателей влезает в страницу» (результат умножить на 2) не больше («Размер страницы» от октеты)
тотальная функция «Длина заголовка страницы»
принимает вид: число
возвращает число
обеспечивает «восемь у листьев, двенадцать у внутренних» результат равен (если (вид равен 13) или (вид равен 10) то 8
иначе 12)
пример «лист таблицы»
дано вид равно 13
ожидается 8
тотальная функция «Шаг указателя»
принимает ход: «Сбор указателей», октет: число
возвращает «Сбор указателей»
обеспечивает «первый октет пары только копится, второй даёт указатель» (длина результат.набрано) равен (если ход.половина то ((длина ход.набрано) плюс 1) иначе (длина ход.набрано))
пример «первый октет пары только копится»
дано ход равно (вариант «Собираем указатели» с старший равным 0 и половина равным нет и набрано равным пустой список)
дано октет равно 15
ожидается вариант «Собираем указатели» с старший равным 15 и половина равным да и набрано равным пустой список
тотальная функция «Указатели из октетов»
принимает октеты: список числа
возвращает список числа
обеспечивает «указателей ровно половина от числа октетов, когда их чётно» если ((длина октеты) остаток от 2) равен 0 то (длина результат) равен ((длина октеты) делить на 2) иначе да
пример «два указателя из четырёх октетов»
дано октеты равно [15, 244, 15, 230]
ожидается [4084, 4070]
тотальная функция «Указатели ячеек»
принимает октеты: список числа, номер: число
возвращает список числа
обеспечивает «указателей ровно столько, сколько ячеек названо заголовком страницы» (длина результат) равен («Ячеек на странице» от октеты и номер)
тотальная функция «Варинт из октетов»
принимает октеты: список числа, набрано: число, взято: число
возвращает «Варинт»
обеспечивает «на непустом входе варинт съедает хотя бы один октет» если не (пусто октеты) то результат.взято больше взято иначе да
обеспечивает «варинт съедает не больше девяти октетов» если не (пусто октеты) то результат.взято не больше 9 иначе да
пример «однооктетный варинт — сам себе значение»
дано октеты равно [3, 99]
дано набрано равно 0
дано взято равно 0
ожидается вариант «Взятый варинт» с значение равным 3 и взято равным 1
тотальная функция «Взять варинт»
принимает октеты: список числа
возвращает «Варинт»
обеспечивает «на пустом входе не взято ничего» если пусто октеты то результат.взято равен 0 иначе да
пример «номер строки 1»
дано октеты равно [1, 7]
ожидается вариант «Взятый варинт» с значение равным 1 и взято равным 1
тотальная функция «Шаг варинта»
принимает ход: «Сбор варинтов», октет: число
возвращает «Сбор варинтов»
обеспечивает «замыкающий октет добавляет ровно одно число, продолжающий — ни одного» (длина результат.набрано) равен (если октет меньше 128 то ((длина ход.набрано) плюс 1) иначе (длина ход.набрано))
пример «замыкающий октет добавляет ровно одно число»
дано ход равно (вариант «Собираем варинты» с текущее равным 0 и набрано равным пустой список)
дано октет равно 25
ожидается вариант «Собираем варинты» с текущее равным 0 и набрано равным [25]
тотальная функция «Варинты подряд»
принимает октеты: список числа
возвращает список числа
обеспечивает «варинтов не больше, чем октетов» (длина результат) не больше (длина октеты)
пример «три серийных типа: текст из шести октетов, целое, текст»
дано октеты равно [25, 1, 27]
ожидается [25, 1, 27]
тотальная функция «Ширина по типу»
принимает серийный: число
возвращает число
обеспечивает «ширина неотрицательна» результат не меньше 0
обеспечивает «у серийного типа ноль ширина ровно ноль» если серийный равен 0 то результат равен 0 иначе да
обеспечивает «типы от одного до четырёх — ширина ровно сам тип» если не (серийный равен 0) то (если серийный не больше 4 то результат равен серийный иначе да) иначе да
обеспечивает «пятый тип — ровно шесть октетов» если не (серийный равен 0) то (если не (серийный не больше 4) то (если серийный равен 5 то результат равен 6 иначе да) иначе да) иначе да
обеспечивает «шестой тип — ровно восемь октетов» если не (серийный равен 0) то (если не (серийный не больше 4) то (если не (серийный равен 5) то (если серийный равен 6 то результат равен 8 иначе да) иначе да) иначе да) иначе да
пример «целое одним октетом»
дано серийный равно 1
ожидается 1
тотальная функция «Значение по типу»
принимает серийный: число, октеты: список числа
возвращает «Значение»
обеспечивает «ничто выходит ровно у серийного типа 0» (серийный равен 0) равен (результат равен (вариант «Ничего»))
обеспечивает «серийный тип ноль даёт ровно ничто» если серийный равен 0 то результат равен (вариант «Ничего») иначе да
обеспечивает «типы от одного до шести дают ровно целое из октетов» если не (серийный равен 0) то (если серийный не больше 6 то результат равен (вариант «Целое» с значение равным («Целое из октетов» от октеты)) иначе да) иначе да
обеспечивает «седьмой тип даёт ровно дробное из октетов» если не (серийный равен 0) то (если не (серийный не больше 6) то (если серийный равен 7 то результат равен (вариант «Дробное» с значение равным («Дробное из октетов» от октеты)) иначе да) иначе да) иначе да
обеспечивает «восьмой тип даёт ровно целое ноль» если не (серийный равен 0) то (если не (серийный не больше 6) то (если не (серийный равен 7) то (если серийный равен 8 то результат равен (вариант «Целое» с значение равным 0) иначе да) иначе да) иначе да) иначе да
пример «целое одним октетом»
дано серийный равно 1
дано октеты равно [31]
ожидается вариант «Целое» с значение равным 31
тотальная функция «Значения записи»
принимает типы: список числа, тело: список числа
возвращает список «Значение»
обеспечивает «значений ровно столько, сколько серийных типов» (длина результат) равен (длина типы)
пример «целое и текст»
дано типы равно [1, 25]
дано тело равно [31, 208, 144, 208, 189, 209, 143]
ожидается [вариант «Целое» с значение равным 31, вариант «Текст» с текст равным "Аня"]
тотальная функция «Разобрать запись»
принимает нагрузка: список числа
возвращает список «Значение»
обеспечивает «значений ровно столько, сколько серийных типов в заголовке записи» (длина результат) равен (длина («Варинты подряд» от («Кусок октетов» от нагрузка и («Взять варинт» от нагрузка).взято и (((«Взять варинт» от нагрузка).значение) минус («Взять варинт» от нагрузка).взято))))
пример «запись из двух колонок: имя и лет»
дано нагрузка равно [3, 25, 1, 208, 144, 208, 189, 209, 143, 31]
ожидается [вариант «Текст» с текст равным "Аня", вариант «Целое» с значение равным 31]
тотальная функция «Полезный размер»
принимает октеты: список числа
возвращает число
обеспечивает «полезного места не больше страницы» результат не больше («Размер страницы» от октеты)
пример «резерва нет — полезно всё»
дано октеты равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0]
ожидается 1024
тотальная функция «Местная нагрузка»
принимает полезный: число, всего: число
возвращает число
обеспечивает «местного не больше, чем всего» результат не больше всего
пример «короткая запись лежит целиком»
дано полезный равно 1024
дано всего равно 40
ожидается 40
тотальная функция «Хвост переполнения»
принимает октеты: список числа, номер: число, осталось: число, запас: число
возвращает список числа
тотальная функция «Нагрузка ячейки»
принимает октеты: список числа, смещение: число, всего: число
возвращает список числа
обеспечивает «нагрузка не длиннее заявленной» (длина результат) не больше (если всего больше 0 то всего иначе 0)
пример «нагрузка целиком на странице — переполнения нет»
дано октеты равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 8, 9]
дано смещение равно 21
дано всего равно 3
ожидается [7, 8, 9]
тотальная функция «Строка ячейки»
принимает октеты: список числа, смещение: число
возвращает «Ряд»
обеспечивает «номер строки неотрицателен» результат.номер не меньше 0
тотальная функция «Строки листа»
принимает октеты: список числа, номер: число
возвращает список «Ряд»
обеспечивает «строк выдано ровно столько, сколько ячеек на листе» (длина результат) равен (если («Это лист таблицы» от октеты и номер) то («Ячеек на странице» от октеты и номер) иначе 0)
обеспечивает «страница не лист — строк ровно пусто» если не («Это лист таблицы» от октеты и номер) то результат равен пустой список иначе да
обеспечивает «на листе строк ровно столько, сколько указателей ячеек» если («Это лист таблицы» от октеты и номер) то (длина результат) равен (длина («Указатели ячеек» от октеты и номер)) иначе да
пример «страница не лист — строк ровно пусто»
дано октеты равно []
дано номер равно 1
ожидается пустой список
тотальная функция «Это внутренняя страница таблицы»
принимает октеты: список числа, номер: число
возвращает признак
обеспечивает «внутренняя страница таблицы — это ровно вид 5» результат равен ((«Вид страницы» от октеты и номер) равен 5)
пример «в пустом образе страница внутренней не зовётся»
дано октеты равно []
дано номер равно 1
ожидается нет
тотальная функция «Правый потомок»
принимает октеты: список числа, номер: число
возвращает число
обеспечивает «номер страницы неотрицателен» результат не меньше 0
тотальная функция «Потомок ячейки»
принимает октеты: список числа, смещение: число
возвращает число
обеспечивает «номер страницы неотрицателен» результат не меньше 0
тотальная функция «Потомки страницы»
принимает октеты: список числа, номер: число
возвращает список числа
обеспечивает «потомков ровно на одного больше, чем ячеек названо заголовком страницы» (длина результат) равен ((«Ячеек на странице» от октеты и номер) плюс 1)
обеспечивает «потомков ровно на одного больше, чем указателей ячеек» (длина результат) равен (1 плюс (длина («Указатели ячеек» от октеты и номер)))
пример «без ячеек потомок один — правый»
дано октеты равно []
дано номер равно 1
ожидается [0]
тотальная функция «Слить числа»
принимает первый: список числа, второй: список числа
возвращает список числа
обеспечивает «длина склейки — сумма длин» (длина результат) равен ((длина первый) плюс (длина второй))
пример «два и один»
дано первый равно [3, 4]
дано второй равно [5]
ожидается [3, 4, 5]
тотальная функция «Слить ряды»
принимает первый: список «Ряд», второй: список «Ряд»
возвращает список «Ряд»
обеспечивает «длина склейки — сумма длин» (длина результат) равен ((длина первый) плюс (длина второй))
пример «один ряд и ни одного»
дано первый равно [
вариант «Строка таблицы» с номер равным 1 и значения равным [вариант «Целое» с значение равным 31]]
дано второй равно []
ожидается [вариант «Строка таблицы» с номер равным 1 и значения равным [вариант «Целое» с значение равным 31]]
тотальная функция «Потомки или сама»
принимает октеты: список числа, номер: число
возвращает список числа
обеспечивает «лист остаётся собой, одним номером» (не («Это лист таблицы» от октеты и номер)) или ((длина результат) равен 1)
обеспечивает «лист отдаёт ровно свой номер, одним списком» если («Это лист таблицы» от октеты и номер) то результат равен [номер] иначе да
пример «страница чужого вида не даёт ни листа, ни потомков»
дано октеты равно []
дано номер равно 1
ожидается пустой список
тотальная функция «Шаг вглубь»
принимает октеты: список числа, страницы: список числа
возвращает список числа
обеспечивает «пустой уровень никуда не ведёт» если пусто страницы то пусто результат иначе да
тотальная функция «Все листья»
принимает октеты: список числа, страницы: список числа
возвращает признак
обеспечивает «пустому уровню спускаться некуда» если пусто страницы то результат иначе да
тотальная функция «Листья уровнями»
принимает октеты: список числа, страницы: список числа, запас: число
возвращает список числа
обеспечивает «пустой уровень листьев не даёт» если пусто страницы то пусто результат иначе да
обеспечивает «исчерпанный запас отдаёт уровень как есть» если запас не больше 0 то результат равен страницы иначе да
пример «исчерпанный запас отдаёт уровень как есть»
дано октеты равно []
дано страницы равно [7]
дано запас равно 0
ожидается [7]
тотальная функция «Листья дерева»
принимает октеты: список числа, корень: число
возвращает список числа
обеспечивает «у неназванного корня листьев нет» если корень не больше 0 то пусто результат иначе да
обеспечивает «у неназванного корня список листьев ровно пуст» если корень не больше 0 то результат равен пустой список иначе да
пример «у неназванного корня листьев нет»
дано октеты равно []
дано корень равно 0
ожидается пустой список
тотальная функция «Строки листьев»
принимает октеты: список числа, листья: список числа
возвращает список «Ряд»
обеспечивает «строк выдано не меньше, чем ячеек на первом листе» если не (пусто листья) то (длина результат) не меньше («Ячеек на странице» от октеты и (голова листья)) иначе да
тотальная функция «Строки страницы»
принимает октеты: список числа, номер: число
возвращает список «Ряд»
обеспечивает «пустая база строк не даёт» если пусто октеты то (длина результат) равен 0 иначе да
обеспечивает «страница с листьями под ней строк не теряет: их не меньше, чем ячеек на первом листе» если не (пусто («Листья дерева» от октеты и номер)) то (длина результат) не меньше («Ячеек на странице» от октеты и (голова («Листья дерева» от октеты и номер))) иначе да
тотальная функция «Строки схемы»
принимает октеты: список числа
возвращает список «Ряд»
обеспечивает «пока страница-схема лист, строк ровно столько, сколько на ней ячеек» если («Это лист таблицы» от октеты и 1) то (длина результат) равен («Ячеек на странице» от октеты и 1) иначе да
тотальная функция «Текст значения»
принимает значение: «Значение»
возвращает строка
обеспечивает «у нетекстового значения текста нет» (не (значение равен (вариант «Ничего»))) или ((длина результат) равен 0)
обеспечивает «у ничто текст ровно пустой» если значение равен (вариант «Ничего») то результат равен "" иначе да
пример «текст отдаётся собой»
дано значение равно вариант «Текст» с текст равным "люди"
ожидается "люди"
тотальная функция «Число значения»
принимает значение: «Значение»
возвращает число
обеспечивает «у нецелого значения числа нет» (не (значение равен (вариант «Ничего»))) или (результат равен 0)
обеспечивает «у ничто число ровно ноль» если значение равен (вариант «Ничего») то результат равен 0 иначе да
обеспечивает «у текста число ровно ноль» если значение равен (вариант «Текст» с текст равным («Текст значения» от значение)) то результат равен 0 иначе да
пример «целое отдаётся собой»
дано значение равно вариант «Целое» с значение равным 31
ожидается 31
тотальная функция «Колонка строки»
принимает ряд: «Ряд», номер: число
возвращает «Значение»
обеспечивает «за пределами строки — ничто» ((номер не меньше 1) и притом (номер не больше (длина ряд.значения))) или (результат равен (вариант «Ничего»))
обеспечивает «внутри строки — ровно элемент по номеру» если (номер не меньше 1) и притом (номер не больше (длина ряд.значения)) то результат равен (элемент номер в ряд.значения) иначе да
пример «внутри строки — ровно элемент по номеру»
дано ряд равно (вариант «Строка таблицы» с номер равным 1 и значения равным [вариант «Целое» с значение равным 31])
дано номер равно 1
ожидается вариант «Целое» с значение равным 31
тотальная функция «Таблица из строки схемы»
принимает ряд: «Ряд»
возвращает «Таблица»
обеспечивает «корень неотрицателен» результат.корень не меньше 0
тотальная функция «Таблицы схемы»
принимает октеты: список числа
возвращает список «Таблица»
обеспечивает «пока страница-схема лист, таблиц не больше, чем на ней ячеек» если («Это лист таблицы» от октеты и 1) то (длина результат) не больше («Ячеек на странице» от октеты и 1) иначе да
тотальная функция «Имена таблиц»
принимает октеты: список числа
возвращает список строки
обеспечивает «имён ровно столько, сколько таблиц» (длина результат) равен (длина («Таблицы схемы» от октеты))
пример «в пустом образе таблиц нет»
дано октеты равно []
ожидается пустой список
тотальная функция «Корень таблицы»
принимает октеты: список числа, имя: строка
возвращает число
обеспечивает «корень неотрицателен, а ноль значит: такой таблицы нет» результат не меньше 0
тотальная функция «Строки таблицы»
принимает октеты: список числа, имя: строка
возвращает список «Ряд»
обеспечивает «у ненайденной таблицы строк нет» («Корень таблицы» от октеты и имя) больше 0 или ((длина результат) равен 0)
обеспечивает «у ненайденной таблицы список строк ровно пуст» («Корень таблицы» от октеты и имя) больше 0 или (результат равен пустой список)
обеспечивает «у найденной таблицы строк не меньше, чем ячеек на первом листе её дерева» если не (пусто («Листья дерева» от октеты и («Корень таблицы» от октеты и имя))) то (длина результат) не меньше («Ячеек на странице» от октеты и (голова («Листья дерева» от октеты и («Корень таблицы» от октеты и имя)))) иначе да
пример «у ненайденной таблицы список строк ровно пуст»
дано октеты равно []
дано имя равно "люди"
ожидается пустой список
тотальная функция «Делить нацело»
принимает делимое: число, делитель: число
возвращает число
обеспечивает «неположительный делитель даёт ровно ноль» если делитель не больше 0 то результат равен 0 иначе да
пример «сто на семь»
дано делимое равно 100
дано делитель равно 7
ожидается 14
тотальная функция «Степень 256»
принимает разряд: число
возвращает число
обеспечивает «степень положительна» результат больше 0
обеспечивает «нулевой и отрицательный разряд — ровно единица» если разряд не больше 0 то результат равен 1 иначе да
обеспечивает «первый разряд — ровно двести пятьдесят шесть» если не (разряд не больше 0) то (если разряд равен 1 то результат равен 256 иначе да) иначе да
обеспечивает «второй разряд — ровно шестьдесят пять тысяч пятьсот тридцать шесть» если не (разряд не больше 0) то (если не (разряд равен 1) то (если разряд равен 2 то результат равен 65536 иначе да) иначе да) иначе да
обеспечивает «третий разряд — ровно шестнадцать миллионов семьсот семьдесят семь тысяч двести шестнадцать» если не (разряд не больше 0) то (если не (разряд равен 1) то (если не (разряд равен 2) то (если разряд равен 3 то результат равен 16777216 иначе да) иначе да) иначе да) иначе да
пример «нулевой разряд — единица»
дано разряд равно 0
ожидается 1
тотальная функция «Октет разряда»
принимает значение: число, разряд: число
возвращает число
обеспечивает «октет неотрицателен» результат не меньше 0
обеспечивает «октет меньше двухсот пятидесяти шести» результат меньше 256
пример «младший октет тысячи»
дано значение равно 1000
дано разряд равно 0
ожидается 232
тотальная функция «Целое октетами»
принимает значение: число, ширина: число
возвращает список числа
обеспечивает «октетов не больше восьми» (длина результат) не больше 8
обеспечивает «ширина не больше одного октета даёт ровно один октет» если ширина не больше 1 то результат равен [значение остаток от 256] иначе да
обеспечивает «ширина два даёт ровно два октета» если не (ширина не больше 1) то (если ширина равен 2 то (длина результат) равен 2 иначе да) иначе да
обеспечивает «ширина четыре даёт ровно четыре октета» если не (ширина не больше 1) то (если не (ширина равен 2) то (если не (ширина равен 3) то (если ширина равен 4 то (длина результат) равен 4 иначе да) иначе да) иначе да) иначе да
обеспечивает «ширина три даёт ровно три октета» если не (ширина не больше 1) то (если не (ширина равен 2) то (если ширина равен 3 то (длина результат) равен 3 иначе да) иначе да) иначе да
пример «размер страницы двумя октетами»
дано значение равно 4096
дано ширина равно 2
ожидается [16, 0]
тотальная функция «Варинт октетами»
принимает значение: число
возвращает список числа
обеспечивает «варинт хотя бы в один октет» (длина результат) не меньше 1
обеспечивает «число меньше ста двадцати восьми ложится ровно одним октетом, собой» если значение меньше 128 то результат равен [значение] иначе да
обеспечивает «варинт не длиннее четырёх октетов» (длина результат) не больше 4
обеспечивает «числа от ста двадцати восьми до шестнадцати тысяч ложатся ровно двумя октетами» если не (значение меньше 128) то (если значение меньше 16384 то (длина результат) равен 2 иначе да) иначе да
обеспечивает «числа до двух миллионов ложатся ровно тремя октетами» если не (значение меньше 128) то (если не (значение меньше 16384) то (если значение меньше 2097152 то (длина результат) равен 3 иначе да) иначе да) иначе да
обеспечивает «всё остальное ложится ровно четырьмя октетами» если не (значение меньше 128) то (если не (значение меньше 16384) то (если не (значение меньше 2097152) то (длина результат) равен 4 иначе да) иначе да) иначе да
пример «однооктетный»
дано значение равно 3
ожидается [3]
тотальная функция «Серийный тип целого»
принимает число: число
возвращает число
обеспечивает «тип целого не меньше единицы» результат не меньше 1
обеспечивает «тип целого — восемь, девять или не больше шести» (результат равен 8) или ((результат равен 9) или (результат не больше 6))
обеспечивает «ноль — ровно восьмой серийный тип» если число равен 0 то результат равен 8 иначе да
обеспечивает «единица — ровно девятый серийный тип» если не (число равен 0) то (если число равен 1 то результат равен 9 иначе да) иначе да
обеспечивает «один октет вмещает ровно первый серийный тип» если не (число равен 0) то (если не (число равен 1) то (если (число не меньше (0 минус 128)) и притом (число не больше 127) то результат равен 1 иначе да) иначе да) иначе да
пример «ноль — сам себе тип»
дано число равно 0
ожидается 8
тотальная функция «Серийный тип значения»
принимает значение: «Значение»
возвращает число
обеспечивает «серийный тип неотрицателен» результат не меньше 0
обеспечивает «у ничто серийный тип ровно ноль» если значение равен (вариант «Ничего») то результат равен 0 иначе да
обеспечивает «у текста серийный тип считается по его октетам» если значение равен (вариант «Текст» с текст равным («Текст значения» от значение)) то результат равен (13 плюс (2 умножить на (длина («Байты текста» от («Текст значения» от значение))))) иначе да
пример «ничто — тип ноль»
дано значение равно вариант «Ничего»
ожидается 0
тотальная функция «Целое значением»
принимает число: число
возвращает список числа
обеспечивает «нолю и единице тела не нужно» если (число равен 0) или (число равен 1) то (длина результат) равен 0 иначе да
обеспечивает «нулевая ширина даёт ровно пустой список» если («Ширина по типу» от («Серийный тип целого» от число)) не больше 0 то результат равен пустой список иначе да
пример «тридцать один — один октет»
дано число равно 31
ожидается [31]
тотальная функция «Октеты значения»
принимает значение: «Значение»
возвращает список числа
обеспечивает «у ничто тела нет» (не (значение равен (вариант «Ничего»))) или ((длина результат) равен 0)
обеспечивает «у ничто тело ровно пустой список» если значение равен (вариант «Ничего») то результат равен пустой список иначе да
обеспечивает «у текста тело — его октеты UTF-8» если значение равен (вариант «Текст» с текст равным («Текст значения» от значение)) то результат равен («Байты текста» от («Текст значения» от значение)) иначе да
обеспечивает «у целого тело — его число октетами» если значение равен (вариант «Целое» с значение равным («Число значения» от значение)) то результат равен («Целое значением» от («Число значения» от значение)) иначе да
пример «текст ложится своими октетами UTF-8»
дано значение равно вариант «Текст» с текст равным "Аня"
ожидается [208, 144, 208, 189, 209, 143]
тотальная функция «Запись октетами»
принимает значения: список «Значение»
возвращает список числа
обеспечивает «запись непуста, пока есть хоть одно значение» если не (пусто значения) то (длина результат) больше 0 иначе да
пример «имя и лет — та же запись, что разбирается обратно»
дано значения равно [вариант «Текст» с текст равным "Аня", вариант «Целое» с значение равным 31]
ожидается [3, 25, 1, 208, 144, 208, 189, 209, 143, 31]
тотальная функция «Ячейка октетами»
принимает номер: число, нагрузка: список числа
возвращает список числа
обеспечивает «ячейка длиннее нагрузки: перед ней два варинта» (длина результат) больше (длина нагрузка)
пример «ячейка первой строки»
дано номер равно 1
дано нагрузка равно [3, 25, 1, 208, 144, 208, 189, 209, 143, 31]
ожидается [10, 1, 3, 25, 1, 208, 144, 208, 189, 209, 143, 31]
тотальная функция «Восемь нулей»
возвращает список числа
обеспечивает «ровно восемь» (длина результат) равен 8
пример «ровно восемь нулей»
ожидается [0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Вдвое длиннее»
принимает часть: список числа
возвращает список числа
обеспечивает «длина удвоилась» (длина результат) равен (2 умножить на (длина часть))
обеспечивает «длина — сумма двух одинаковых половин» (длина результат) равен ((длина часть) плюс (длина часть))
пример «два нуля становятся четырьмя»
дано часть равно [0, 0]
ожидается [0, 0, 0, 0]
тотальная функция «Полоса нулей»
возвращает список числа
обеспечивает «полосы хватает на страницу любого разрешённого размера, до 4096» (длина результат) равен 4096
тип «Ячейка»
вариант «Ячейка страницы» содержит октеты: список числа
тип «Сбор смещений»
вариант «Собираем смещения» содержит текущее: число, набрано: список числа
тип «Лист»
вариант «Лист рядов» содержит ряды: список «Ряд»
тип «Раскладка»
вариант «Раскладываем ряды» содержит текущие: список «Ряд», листы: список «Лист», осталось: число
тип «Сбор внутренних»
вариант «Собираем внутренние» содержит номер: число, всего: число, набрано: список «Ячейка»
тотальная функция «Ячейка внутренней»
принимает ребёнок: число, ключ: число
возвращает «Ячейка»
обеспечивает «четыре октета номера потомка и варинт ключа» (длина результат.октеты) равен (4 плюс (длина («Варинт октетами» от ключ)))
обеспечивает «длина ячейки — номер потомка и ключ» (длина результат.октеты) равен ((длина («Целое октетами» от ребёнок и 4)) плюс (длина («Варинт октетами» от ключ)))
пример «четыре октета потомка и однооктетный варинт ключа»
дано ребёнок равно 2
дано ключ равно 1
ожидается вариант «Ячейка страницы» с октеты равным [0, 0, 0, 2, 1]
тотальная функция «Ячейки рядов»
принимает ряды: список «Ряд»
возвращает список «Ячейка»
обеспечивает «ячеек ровно столько, сколько рядов» (длина результат) равен (длина ряды)
пример «ни одного ряда — ни одной ячейки»
дано ряды равно []
ожидается пустой список
тотальная функция «Длина ячеек»
принимает ячейки: список «Ячейка»
возвращает число
обеспечивает «длина неотрицательна» результат не меньше 0
пример «у пустого списка ячеек длина ноль»
дано ячейки равно []
ожидается 0
тотальная функция «Октеты ячеек»
принимает ячейки: список «Ячейка»
возвращает список числа
обеспечивает «октетов ровно столько, сколько насчитано длиной ячеек» (длина результат) равен («Длина ячеек» от ячейки)
тотальная функция «Смещения ячеек»
принимает ячейки: список «Ячейка», начало: число
возвращает список числа
обеспечивает «смещений ровно столько, сколько ячеек» (длина результат) равен (длина ячейки)
тотальная функция «Октеты указателей»
принимает смещения: список числа
возвращает список числа
обеспечивает «по два октета на указатель» (длина результат) равен (2 умножить на (длина смещения))
тотальная функция «Собрать страницу»
принимает вид: число, ячейки: список «Ячейка», правый: число, размер: число, отступ: число, полоса: список числа
возвращает список числа
обеспечивает «место не ушло в минус: ячейки поместились на страницу» ((размер минус отступ) минус ((«Длина заголовка страницы» от вид) плюс ((2 умножить на (длина ячейки)) плюс («Длина ячеек» от ячейки)))) не меньше 0
обеспечивает «страница ровно в размер, за вычетом отступа» (длина результат) равен (размер минус отступ)
тотальная функция «Заголовок файла»
принимает размер: число, страниц: число
возвращает список числа
обеспечивает «заголовок ровно в сто октетов» (длина результат) равен 100
обеспечивает «свой же заголовок опознаётся как база SQLite» «Это база SQLite» от результат
обеспечивает «свой же заголовок называет тот же размер страницы» («Размер страницы» от результат) равен размер
обеспечивает «свой же заголовок называет то же число страниц» («Страниц в базе» от результат) равен страниц
тотальная функция «Ряд схемы»
принимает имя: строка, корень: число, определение: строка
возвращает «Ряд»
обеспечивает «в строке схемы ровно пять колонок» (длина результат.значения) равен 5
обеспечивает «своя же строка схемы читается обратно тем же именем» («Таблица из строки схемы» от результат).имя равен имя
обеспечивает «своя же строка схемы читается обратно тем же корнем» («Таблица из строки схемы» от результат).корень равен корень
пример «строка схемы — пять колонок: вид, имя, имя таблицы, корень и SQL»
дано имя равно "люди"
дано корень равно 2
дано определение равно "CREATE TABLE люди(имя TEXT)"
ожидается вариант «Строка таблицы» с номер равным 1 и значения равным [(вариант «Текст» с текст равным "table"),
(вариант «Текст» с текст равным "люди"), (вариант «Текст» с текст равным "люди"),
(вариант «Целое» с значение равным 2), (вариант «Текст» с текст равным "CREATE TABLE люди(имя TEXT)")]
тотальная функция «Листы рядов»
принимает ряды: список «Ряд», сколько: число
возвращает список «Лист»
обеспечивает «листов не больше, чем рядов» (длина результат) не больше (длина ряды)
обеспечивает «пустой список рядов не даёт ни одного листа» если пусто ряды то (длина результат) равен 0 иначе да
тотальная функция «Наибольший номер листа»
принимает лист: «Лист»
возвращает число
обеспечивает «у пустого листа ключа нет» если пусто лист.ряды то результат равен 0 иначе да
тотальная функция «Ячейки корня»
принимает листы: список «Лист»
возвращает список «Ячейка»
обеспечивает «ячеек на одну меньше, чем листов» (длина результат) равен (если (длина листы) больше 0 то ((длина листы) минус 1) иначе 0)
тотальная функция «Октеты листов»
принимает листы: список «Лист», размер: число, полоса: список числа
возвращает список числа
обеспечивает «на каждый лист ровно страница» (длина результат) равен ((длина листы) умножить на размер)
тотальная функция «Собрать базу»
принимает имя: строка, определение: строка, ряды: список «Ряд», размер: число, на_лист: число
возвращает список числа
обеспечивает «образ ровно в целое число страниц» (длина результат) равен ((2 плюс (длина («Листы рядов» от ряды и на_лист))) умножить на размер)
обеспечивает «свой же образ опознаётся как база SQLite» «Это база SQLite» от результат
обеспечивает «свой же образ отдаёт ровно те ряды, что записаны» (длина («Строки таблицы» от результат и имя)) равен (длина ряды)
тотальная функция «Вписать октеты»
принимает октеты: список числа, смещение: число, кусок: список числа
возвращает список числа
пример «два октета в середину»
дано октеты равно [1, 2, 3, 4, 5]
дано смещение равно 1
дано кусок равно [9, 9]
ожидается [1, 9, 9, 4, 5]
тотальная функция «Вписать целое»
принимает октеты: список числа, смещение: число, ширина: число, значение: число
возвращает список числа
пример «число ячеек на месте»
дано октеты равно [0, 0, 0, 0, 0]
дано смещение равно 1
дано ширина равно 2
дано значение равно 258
ожидается [0, 1, 2, 0, 0]
тотальная функция «Последний номер»
принимает октеты: список числа, имя: строка
возвращает число
обеспечивает «номер неотрицателен» результат не меньше 0
пример «в пустом образе последнего номера нет — ровно ноль»
дано октеты равно пустой список
дано имя равно "люди"
ожидается 0
тотальная функция «Следующий номер»
принимает октеты: список числа, имя: строка
возвращает число
обеспечивает «следующий номер положителен» результат больше 0
пример «в пустом образе первая строка была бы первой»
дано октеты равно пустой список
дано имя равно "люди"
ожидается 1
тотальная функция «Счётчик правок вперёд»
принимает октеты: список числа
возвращает список числа
обеспечивает «на файле не короче заголовка длина не меняется» если (длина октеты) не меньше 100 то (длина результат) равен (длина октеты) иначе да
пример «на огрызке короче заголовка счётчику некуда лечь, и образ РАСТЁТ — оттого обещание и под условием»
дано октеты равно [1, 2]
ожидается [1, 2, 0, 0, 0, 1, 0, 0, 0, 1]
тотальная функция «Ячейка помещается»
принимает октеты: список числа, корень: число, ячейка: список числа
возвращает признак
пример «в пустом образе не помещается ничто»
дано октеты равно пустой список
дано корень равно 0
дано ячейка равно пустой список
ожидается нет
тотальная функция «База со строкой»
принимает октеты: список числа, имя: строка, номер: число, значения: список «Значение»
возвращает список числа
обеспечивает «либо отказ пустотой, либо файл прежней длины» ((длина результат) равен 0) или ((длина результат) равен (длина октеты))
пример «в пустом образе вписывать некуда — отказ пустотой»
дано октеты равно пустой список
дано имя равно "люди"
дано номер равно 1
дано значения равно пустой список
ожидается пустой список
тотальная функция «Значение строкой»
принимает значение: «Значение»
возвращает строка
обеспечивает «ничто печатается словом ничто» если значение равен (вариант «Ничего») то результат равен "ничто" иначе да
обеспечивает «текст печатается собой» если значение равен (вариант «Текст» с текст равным («Текст значения» от значение)) то результат равен («Текст значения» от значение) иначе да
пример «целое печатается числом»
дано значение равно вариант «Целое» с значение равным 44
ожидается "44"
тотальная функция «Строка текстом»
принимает ряд: «Ряд»
возвращает строка
обеспечивает «печать непуста, пока в строке есть хоть одно значение» если не (пусто ряд.значения) то (длина результат) больше 0 иначе да
пример «строка печатается номером и значениями»
дано ряд равно вариант «Строка таблицы» с номер равным 1 и значения равным [вариант «Текст» с текст равным "Аня",
вариант «Целое» с значение равным 31]
ожидается "1 | Аня | 31"
| Function | Termination | Claims |
|---|---|---|
| «Отбросить октеты» | доказано структурой | доказано 2 из 2 |
| «Взять октеты» | доказано структурой | доказано 2 из 3; «целое N внутри длины даёт ровно N октетов» — сетка |
| «Кусок октетов» | доказано постоянным шагом | доказано 2 из 3; «кусок не длиннее заказанного» — сетка |
| «Шаг взятия» | доказано композицией | доказано 1 из 1 |
| «Голова октетов» | доказано композицией | — |
| «Шаг сброса» | доказано композицией | доказано 1 из 1 |
| «Хвост октетов» | доказано композицией | — |
| «Крупный кусок» | доказано композицией | — |
| «Целое из октетов» | доказано композицией | доказано 1 из 2; «один октет даёт сам себя» — сетка |
| «Целое у смещения» | доказано композицией | доказано 0 из 1; «целое неотрицательно, пока октеты неотрицательны» — сетка |
| «Двойка вверх» | доказано постоянным шагом | доказано 2 из 3; «двойка в неотрицательной степени не меньше единицы» — сетка |
| «Двойка вниз» | доказано постоянным шагом | доказано 2 из 4; «двойка в отрицательной степени положительна» — сетка; «двойка в отрицательной степени не больше единицы» — сетка |
| «Двойка в степени» | доказано композицией | доказано 2 из 3; «степень двойки положительна» — сетка |
| «Дробное из октетов» | доказано композицией | доказано 0 из 1; «восемь нулевых октетов дают ноль» — сетка |
| «Текст октетов» | доказано композицией | доказано 0 из 1; «пустые октеты дают пустой текст» — сетка |
| «Магия базы» | доказано композицией | доказано 1 из 1 |
| «Это база SQLite» | доказано композицией | доказано 2 из 2 |
| «Размер страницы» | доказано композицией | доказано 2 из 3; «размер страницы у настоящей базы не меньше пятисот двенадцати» — сетка |
| «Страниц в базе» | доказано композицией | доказано 0 из 1; «страниц ровно столько, сколько их влезает в файл, пока заголовок не врёт» — объявлено, не доказано |
| «Начало страницы» | доказано композицией | доказано 0 из 1; «первая страница начинается с нулевого октета» — объявлено, не доказано |
| «Смещение заголовка страницы» | доказано композицией | доказано 1 из 1 |
| «Вид страницы» | доказано композицией | доказано 0 из 1; «вид неотрицателен» — объявлено, не доказано |
| «Это лист таблицы» | доказано композицией | доказано 1 из 1 |
| «Ячеек на странице» | доказано композицией | доказано 0 из 1; «ячеек не больше, чем указателей влезает в страницу» — объявлено, не доказано |
| «Длина заголовка страницы» | доказано композицией | доказано 1 из 1 |
| «Шаг указателя» | доказано композицией | доказано 1 из 1 |
| «Указатели из октетов» | доказано композицией | доказано 0 из 1; «указателей ровно половина от числа октетов, когда их чётно» — сетка |
| «Указатели ячеек» | доказано композицией | доказано 0 из 1; «указателей ровно столько, сколько ячеек названо заголовком страницы» — объявлено, не доказано |
| «Варинт из октетов» | доказано структурой | доказано 0 из 2; «на непустом входе варинт съедает хотя бы один октет» — сетка; «варинт съедает не больше девяти октетов» — сетка |
| «Взять варинт» | доказано композицией | доказано 0 из 1; «на пустом входе не взято ничего» — сетка |
| «Шаг варинта» | доказано композицией | доказано 1 из 1 |
| «Варинты подряд» | доказано композицией | доказано 0 из 1; «варинтов не больше, чем октетов» — сетка |
| «Ширина по типу» | доказано композицией | доказано 4 из 5; «ширина неотрицательна» — сетка |
| «Значение по типу» | доказано композицией | доказано 4 из 5; «ничто выходит ровно у серийного типа 0» — сетка |
| «Значения записи» | доказано структурой | доказано 1 из 1 |
| «Разобрать запись» | доказано композицией | доказано 0 из 1; «значений ровно столько, сколько серийных типов в заголовке записи» — сетка |
| «Полезный размер» | доказано композицией | доказано 0 из 1; «полезного места не больше страницы» — сетка |
| «Местная нагрузка» | доказано композицией | доказано 0 из 1; «местного не больше, чем всего» — сетка |
| «Хвост переполнения» | доказано постоянным шагом | — |
| «Нагрузка ячейки» | доказано композицией | доказано 0 из 1; «нагрузка не длиннее заявленной» — сетка |
| «Строка ячейки» | доказано композицией | доказано 0 из 1; «номер строки неотрицателен» — объявлено, не доказано |
| «Строки листа» | доказано композицией | доказано 2 из 3; «строк выдано ровно столько, сколько ячеек на листе» — сетка |
| «Это внутренняя страница таблицы» | доказано композицией | доказано 1 из 1 |
| «Правый потомок» | доказано композицией | доказано 0 из 1; «номер страницы неотрицателен» — объявлено, не доказано |
| «Потомок ячейки» | доказано композицией | доказано 0 из 1; «номер страницы неотрицателен» — объявлено, не доказано |
| «Потомки страницы» | доказано композицией | доказано 1 из 2; «потомков ровно на одного больше, чем ячеек названо заголовком страницы» — сетка |
| «Слить числа» | доказано композицией | доказано 1 из 1 |
| «Слить ряды» | доказано композицией | доказано 1 из 1 |
| «Потомки или сама» | доказано композицией | доказано 2 из 2 |
| «Шаг вглубь» | доказано композицией | доказано 0 из 1; «пустой уровень никуда не ведёт» — объявлено, не доказано |
| «Все листья» | доказано композицией | доказано 0 из 1; «пустому уровню спускаться некуда» — объявлено, не доказано |
| «Листья уровнями» | доказано постоянным шагом | доказано 1 из 2; «пустой уровень листьев не даёт» — сетка |
| «Листья дерева» | доказано композицией | доказано 1 из 2; «у неназванного корня листьев нет» — сетка |
| «Строки листьев» | доказано композицией | доказано 0 из 1; «строк выдано не меньше, чем ячеек на первом листе» — объявлено, не доказано |
| «Строки страницы» | доказано композицией | доказано 0 из 2; «пустая база строк не даёт» — объявлено, не доказано; «страница с листьями под ней строк не теряет: их не меньше, чем ячеек на первом листе» — объявлено, не доказано |
| «Строки схемы» | доказано композицией | доказано 0 из 1; «пока страница-схема лист, строк ровно столько, сколько на ней ячеек» — объявлено, не доказано |
| «Текст значения» | доказано композицией | доказано 2 из 2 |
| «Число значения» | доказано композицией | доказано 3 из 3 |
| «Колонка строки» | доказано композицией | доказано 2 из 2 |
| «Таблица из строки схемы» | доказано композицией | доказано 0 из 1; «корень неотрицателен» — объявлено, не доказано |
| «Таблицы схемы» | доказано композицией | доказано 0 из 1; «пока страница-схема лист, таблиц не больше, чем на ней ячеек» — объявлено, не доказано |
| «Имена таблиц» | доказано композицией | доказано 1 из 1 |
| «Корень таблицы» | доказано композицией | доказано 0 из 1; «корень неотрицателен, а ноль значит: такой таблицы нет» — объявлено, не доказано |
| «Строки таблицы» | доказано композицией | доказано 2 из 3; «у найденной таблицы строк не меньше, чем ячеек на первом листе её дерева» — сетка |
| «Делить нацело» | доказано композицией | доказано 1 из 1 |
| «Степень 256» | доказано композицией | доказано 5 из 5 |
| «Октет разряда» | доказано композицией | доказано 0 из 2; «октет неотрицателен» — сетка; «октет меньше двухсот пятидесяти шести» — сетка |
| «Целое октетами» | доказано композицией | доказано 5 из 5 |
| «Варинт октетами» | доказано композицией | доказано 6 из 6 |
| «Серийный тип целого» | доказано композицией | доказано 5 из 5 |
| «Серийный тип значения» | доказано композицией | доказано 2 из 3; «у текста серийный тип считается по его октетам» — сетка |
| «Целое значением» | доказано композицией | доказано 2 из 2 |
| «Октеты значения» | доказано композицией | доказано 2 из 4; «у текста тело — его октеты UTF-8» — сетка; «у целого тело — его число октетами» — сетка |
| «Запись октетами» | доказано композицией | доказано 0 из 1; «запись непуста, пока есть хоть одно значение» — сетка |
| «Ячейка октетами» | доказано композицией | доказано 0 из 1; «ячейка длиннее нагрузки: перед ней два варинта» — сетка |
| «Восемь нулей» | доказано композицией | доказано 1 из 1 |
| «Вдвое длиннее» | доказано композицией | доказано 1 из 2; «длина удвоилась» — сетка |
| «Полоса нулей» | доказано композицией | доказано 1 из 1 |
| «Ячейка внутренней» | доказано композицией | доказано 1 из 2; «четыре октета номера потомка и варинт ключа» — сетка |
| «Ячейки рядов» | доказано композицией | доказано 1 из 1 |
| «Длина ячеек» | доказано композицией | доказано 1 из 1 |
| «Октеты ячеек» | доказано композицией | доказано 0 из 1; «октетов ровно столько, сколько насчитано длиной ячеек» — объявлено, не доказано |
| «Смещения ячеек» | доказано композицией | доказано 0 из 1; «смещений ровно столько, сколько ячеек» — объявлено, не доказано |
| «Октеты указателей» | доказано композицией | доказано 0 из 1; «по два октета на указатель» — объявлено, не доказано |
| «Собрать страницу» | доказано композицией | доказано 0 из 2; «место не ушло в минус: ячейки поместились на страницу» — объявлено, не доказано; «страница ровно в размер, за вычетом отступа» — объявлено, не доказано |
| «Заголовок файла» | доказано композицией | доказано 0 из 4; «заголовок ровно в сто октетов» — объявлено, не доказано; «свой же заголовок опознаётся как база SQLite» — объявлено, не доказано; «свой же заголовок называет тот же размер страницы» — объявлено, не доказано; «свой же заголовок называет то же число страниц» — объявлено, не доказано |
| «Ряд схемы» | доказано композицией | доказано 1 из 3; «своя же строка схемы читается обратно тем же именем» — сетка; «своя же строка схемы читается обратно тем же корнем» — сетка |
| «Листы рядов» | доказано композицией | доказано 1 из 2; «листов не больше, чем рядов» — объявлено, не доказано |
| «Наибольший номер листа» | доказано композицией | доказано 1 из 1 |
| «Ячейки корня» | доказано композицией | доказано 0 из 1; «ячеек на одну меньше, чем листов» — объявлено, не доказано |
| «Октеты листов» | доказано композицией | доказано 0 из 1; «на каждый лист ровно страница» — объявлено, не доказано |
| «Собрать базу» | доказано композицией | доказано 0 из 3; «образ ровно в целое число страниц» — объявлено, не доказано; «свой же образ опознаётся как база SQLite» — объявлено, не доказано; «свой же образ отдаёт ровно те ряды, что записаны» — объявлено, не доказано |
| «Вписать октеты» | доказано композицией | — |
| «Вписать целое» | доказано композицией | — |
| «Последний номер» | доказано композицией | доказано 0 из 1; «номер неотрицателен» — сетка |
| «Следующий номер» | доказано композицией | доказано 0 из 1; «следующий номер положителен» — сетка |
| «Счётчик правок вперёд» | доказано композицией | доказано 0 из 1; «на файле не короче заголовка длина не меняется» — сетка |
| «Ячейка помещается» | доказано композицией | — |
| «База со строкой» | доказано композицией | доказано 0 из 1; «либо отказ пустотой, либо файл прежней длины» — сетка |
| «Значение строкой» | доказано композицией | доказано 1 из 2; «текст печатается собой» — сетка |
| «Строка текстом» | доказано композицией | доказано 0 из 1; «печать непуста, пока в строке есть хоть одно значение» — сетка |
«Statistics»
flang/stdlib/stats.flang — functions 16; the kernel ledger was taken from this version of the file
тотальная функция «Это число»
принимает значение: число
возвращает признак
обеспечивает «число сравнимо с собой» если результат то (значение не больше значение) иначе да
обеспечивает «конечное признаётся числом» не ((значение минус значение) равен 0) или результат
пример «Единица — число»
дано значение равно 1
ожидается да
тотальная функция «Среднее»
принимает элементы: список числа
возвращает число
обеспечивает «среднее пустого — ноль» если (длина элементы) равен 0 то (результат равен 0) иначе да
обеспечивает «среднее одного — оно само, приведённое к плюс нулю» если (длина элементы) равен 1 то (результат равен ((«Элемент» от элементы и 1) плюс 0)) иначе да
пример «Среднее восьми чисел — пять»
дано элементы равно [2, 4, 4, 4, 5, 5, 7, 9]
ожидается 5
тотальная функция «Среднее с не-числом»
возвращает признак
обеспечивает «средним не число не лечится» результат равен («Это число» от (0 делить на 0))
пример «Среднее списка с не-числом — не число»
ожидается нет
тотальная функция «Медиана»
принимает элементы: список числа
возвращает число
обеспечивает «медиана пустого — ноль» если (длина элементы) равен 0 то (результат равен 0) иначе да
обеспечивает «медиана одного — оно само» если (длина элементы) равен 1 то (результат равен («Элемент» от элементы и 1)) иначе да
обеспечивает «медиана пары — их полусумма» если (длина элементы) равен 2 то (результат равен (((«Элемент» от элементы и 1) плюс («Элемент» от элементы и 2)) делить на 2)) иначе да
пример «Медиана чётного счёта — полусумма двух средних»
дано элементы равно [1, 2, 3, 4]
ожидается 2.5
тотальная функция «Шаг моды»
принимает элементы: список числа, лучшее: число, кандидат: число
возвращает число
обеспечивает «кандидат, встреченный чаще, вытесняет» если («Считать вхождения» от элементы и кандидат) больше («Считать вхождения» от элементы и лучшее) то (результат равен кандидат) иначе да
обеспечивает «при равной частоте побеждает меньшее» если ((«Считать вхождения» от элементы и кандидат) равен («Считать вхождения» от элементы и лучшее)) и притом (кандидат меньше лучшее) то (результат равен кандидат) иначе да
обеспечивает «кандидат, встреченный реже, не вытесняет» если («Считать вхождения» от элементы и кандидат) меньше («Считать вхождения» от элементы и лучшее) то (результат равен лучшее) иначе да
пример «Двойка встречается чаще единицы»
дано элементы равно [1, 2, 2, 3]
дано лучшее равно 1
дано кандидат равно 2
ожидается 2
тотальная функция «Мода»
принимает элементы: список числа
возвращает число
обеспечивает «мода пустого — ноль» если (длина элементы) равен 0 то (результат равен 0) иначе да
обеспечивает «мода взята из списка» если (длина элементы) больше 0 то (элементы содержит результат) иначе да
обеспечивает «мода встречается не реже первого элемента» если (длина элементы) больше 0 то ((«Считать вхождения» от элементы и результат) не меньше («Считать вхождения» от элементы и («Элемент» от элементы и 1))) иначе да
пример «Мода — самое частое»
дано элементы равно [1, 2, 2, 3]
ожидается 2
тотальная функция «Шаг суммы квадратов отклонений»
принимает итог: число, наблюдение: число, центр: число
возвращает число
обеспечивает «шаг прибавляет квадрат отклонения» результат равен (итог плюс ((наблюдение минус центр) умножить на (наблюдение минус центр)))
обеспечивает «конечный шаг итога не убавляет» не ((результат минус результат) равен 0) или (результат не меньше итог)
пример «Отклонение на три прибавляет девять»
дано итог равно 1
дано наблюдение равно 5
дано центр равно 2
ожидается 10
тотальная функция «Сумма квадратов отклонений»
принимает элементы: список числа, центр: число
возвращает число
обеспечивает «на пустом — ноль» если (длина элементы) равен 0 то (результат равен 0) иначе да
обеспечивает «конечная сумма квадратов неотрицательна» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «на одном элементе — квадрат его отклонения» если (длина элементы) равен 1 то (результат равен (((«Элемент» от элементы и 1) минус центр) умножить на ((«Элемент» от элементы и 1) минус центр))) иначе да
пример «Отклонения от пяти»
дано элементы равно [2, 4, 4, 4, 5, 5, 7, 9]
дано центр равно 5
ожидается 32
тотальная функция «Дисперсия по совокупности»
принимает элементы: список числа
возвращает число
обеспечивает «дисперсия пустого — ноль» если (длина элементы) равен 0 то (результат равен 0) иначе да
обеспечивает «дисперсия одного конечного — ноль» если ((длина элементы) равен 1) и притом («Это число» от («Элемент» от элементы и 1)) то (результат равен 0) иначе да
обеспечивает «делитель — счёт элементов, n» если (длина элементы) больше 0 то (результат равен ((«Сумма квадратов отклонений» от элементы и («Среднее» от элементы)) делить на (длина элементы))) иначе да
обеспечивает «конечная дисперсия неотрицательна» не ((результат минус результат) равен 0) или (результат не меньше 0)
пример «Дисперсия восьми чисел по совокупности — четыре»
дано элементы равно [2, 4, 4, 4, 5, 5, 7, 9]
ожидается 4
тотальная функция «Дисперсия по выборке»
принимает элементы: список числа
возвращает число
обеспечивает «на пустом и на одном — ноль охраной» если (длина элементы) не больше 1 то (результат равен 0) иначе да
обеспечивает «делитель — счёт элементов без одного, n минус 1» если (длина элементы) больше 1 то (результат равен ((«Сумма квадратов отклонений» от элементы и («Среднее» от элементы)) делить на ((длина элементы) минус 1))) иначе да
обеспечивает «конечная выборочная дисперсия неотрицательна» не ((результат минус результат) равен 0) или (результат не меньше 0)
обеспечивает «выборочная не меньше дисперсии по совокупности» не ((результат минус результат) равен 0) или (результат не меньше («Дисперсия по совокупности» от элементы))
пример «Дисперсия восьми чисел по выборке — тридцать две седьмых»
дано элементы равно [2, 4, 4, 4, 5, 5, 7, 9]
ожидается 4.571428571428571
тотальная функция «Шаг корня»
принимает значение: число, приближение: число, витков: неотрицательное
возвращает число
обеспечивает «без витков отдаётся приближение как есть» если витков не больше 0 то (результат равен приближение) иначе да
обеспечивает «один виток — полусумма приближения и частного» если витков равен 1 то (результат равен ((приближение плюс (значение делить на приближение)) делить на 2)) иначе да
пример «Без витков — приближение как есть»
дано значение равно 4
дано приближение равно 2.5
дано витков равно 0
ожидается 2.5
тотальная функция «Корень»
принимает значение: число
возвращает число
обеспечивает «неположительное даёт ноль» если значение не больше 0 то (результат равен 0) иначе да
обеспечивает «конечное даёт неотрицательное» не ((значение минус значение) равен 0) или (результат не меньше 0)
обеспечивает «корень единицы — единица» если значение равен 1 то (результат равен 1) иначе да
пример «Корень четырёх — ровно два»
дано значение равно 4
ожидается 2
тотальная функция «Корень близок»
принимает значение: число, ожидаемое: число
возвращает признак
обеспечивает «точное совпадение конечных — близко» если ((«Корень» от значение) равен ожидаемое) и притом («Это число» от ожидаемое) то результат иначе да
обеспечивает «расхождение на единицу и больше — не близко» если ((«Корень» от значение) минус ожидаемое) не меньше 1 то (результат равен нет) иначе да
пример «Корень двух близок к 1.4142135623730951 в пределах 1e-12, Ньютон отстаёт на один разряд»
дано значение равно 2
дано ожидаемое равно 1.4142135623730951
ожидается да
тотальная функция «Стандартное отклонение по совокупности»
принимает элементы: список числа
возвращает число
обеспечивает «на пустом — ноль» если (длина элементы) равен 0 то (результат равен 0) иначе да
обеспечивает «это корень дисперсии по совокупности» результат равен («Корень» от («Дисперсия по совокупности» от элементы))
обеспечивает «конечное отклонение неотрицательно» не ((результат минус результат) равен 0) или (результат не меньше 0)
пример «Отклонение восьми чисел по совокупности — два»
дано элементы равно [2, 4, 4, 4, 5, 5, 7, 9]
ожидается 2
тотальная функция «Стандартное отклонение по выборке»
принимает элементы: список числа
возвращает число
обеспечивает «на пустом и на одном — ноль» если (длина элементы) не больше 1 то (результат равен 0) иначе да
обеспечивает «это корень дисперсии по выборке» результат равен («Корень» от («Дисперсия по выборке» от элементы))
обеспечивает «конечное отклонение неотрицательно» не ((результат минус результат) равен 0) или (результат не меньше 0)
пример «Отклонение по выборке от 1, 3, 5 — два»
дано элементы равно [1, 3, 5]
ожидается 2
тотальная функция «Квантиль»
принимает упорядоченные: список числа, доля: число
возвращает число
обеспечивает «на пустом — ноль» если (длина упорядоченные) равен 0 то (результат равен 0) иначе да
обеспечивает «доля не выше нуля — первый элемент» если ((длина упорядоченные) больше 0) и притом (доля не больше 0) то (результат равен («Элемент» от упорядоченные и 1)) иначе да
обеспечивает «доля не ниже единицы — последний элемент» если ((длина упорядоченные) больше 0) и притом (доля не меньше 1) то (результат равен («Элемент» от упорядоченные и (длина упорядоченные))) иначе да
пример «Квантиль половины от четырёх — 2.5, то же, что медиана»
дано упорядоченные равно [1, 2, 3, 4]
дано доля равно 0.5
ожидается 2.5
| Function | Termination | Claims |
|---|---|---|
| «Это число» | доказано композицией | доказано 2 из 2 |
| «Среднее» | доказано композицией | доказано 1 из 2; «среднее одного — оно само, приведённое к плюс нулю» — сетка |
| «Среднее с не-числом» | доказано композицией | доказано 1 из 1 |
| «Медиана» | доказано композицией | доказано 1 из 3; «медиана одного — оно само» — сетка; «медиана пары — их полусумма» — сетка |
| «Шаг моды» | доказано композицией | доказано 3 из 3 |
| «Мода» | доказано композицией | доказано 1 из 3; «мода взята из списка» — сетка; «мода встречается не реже первого элемента» — сетка |
| «Шаг суммы квадратов отклонений» | доказано композицией | доказано 1 из 2; «конечный шаг итога не убавляет» — сетка |
| «Сумма квадратов отклонений» | доказано композицией | доказано 1 из 3; «конечная сумма квадратов неотрицательна» — сетка; «на одном элементе — квадрат его отклонения» — сетка |
| «Дисперсия по совокупности» | доказано композицией | доказано 2 из 4; «дисперсия одного конечного — ноль» — сетка; «конечная дисперсия неотрицательна» — сетка |
| «Дисперсия по выборке» | доказано композицией | доказано 2 из 4; «конечная выборочная дисперсия неотрицательна» — сетка; «выборочная не меньше дисперсии по совокупности» — сетка |
| «Шаг корня» | доказано точным шагом | доказано 1 из 2; «один виток — полусумма приближения и частного» — сетка |
| «Корень» | доказано композицией | доказано 2 из 3; «конечное даёт неотрицательное» — сетка |
| «Корень близок» | доказано композицией | доказано 0 из 2; «точное совпадение конечных — близко» — сетка; «расхождение на единицу и больше — не близко» — сетка |
| «Стандартное отклонение по совокупности» | доказано композицией | доказано 2 из 3; «конечное отклонение неотрицательно» — сетка |
| «Стандартное отклонение по выборке» | доказано композицией | доказано 2 из 3; «конечное отклонение неотрицательно» — сетка |
| «Квантиль» | доказано композицией | доказано 2 из 3; «доля не ниже единицы — последний элемент» — сетка |
«Strings»
flang/stdlib/strings.flang — functions 39; the kernel ledger was taken from this version of the file
тотальная функция «Приписать строку в начало»
принимает первая: строка, элементы: список строки
возвращает список строки
обеспечивает «приписывание удлиняет список ровно на один» (длина результат) равен ((длина элементы) плюс 1)
обеспечивает «приписанное встало головой, а не хвостом» (голова результат) равен первая
обеспечивает «приписанное стоит в результате» результат содержит первая
пример «В пустой список»
дано первая равно "а"
дано элементы равно пустой список
ожидается ["а"]
тотальная функция «Шаг склейки строк»
принимает ход: строка, разделитель: строка, часть: строка
возвращает строка
обеспечивает «шаг склейки растит длину на разделитель и часть» (длина результат) равен (((длина ход) плюс (длина разделитель)) плюс (длина часть))
пример «Разделитель между частями»
дано ход равно "а"
дано разделитель равно "-"
дано часть равно "б"
ожидается "а-б"
тотальная функция «Соединить строки»
принимает части: список строки, разделитель: строка
возвращает строка
обеспечивает «склейка начинается первой частью» (пусто части) или (результат начинается с (голова части))
обеспечивает «одна часть склеивается сама в себя» если (длина части) равен 1 то (результат равен (голова части)) иначе да
пример «Три части»
дано части равно ["а", "б", "в"]
дано разделитель равно "-"
ожидается "а-б-в"
тотальная функция «Разбить по символу»
принимает текст: строка, разделитель: строка
возвращает список строки
обеспечивает «разбиение даёт хотя бы одну часть» 1 не больше (длина результат)
обеспечивает «разрезал и склеил тем же разделителем — исходное» («Соединить строки» от результат и разделитель) равен текст
пример «Три части»
дано текст равно "а,б,в"
дано разделитель равно ","
ожидается ["а", "б", "в"]
тотальная функция «Заменить»
принимает текст: строка, что: строка, чем: строка
возвращает строка
обеспечивает «кусков по новому разделителю не меньше, чем было по старому» если (длина чем) больше 0 то ((длина (разделить результат по чем)) не меньше (длина (разделить текст по что))) иначе да
пример «Замена всех вхождений»
дано текст равно "а-б-в"
дано что равно "-"
дано чем равно "+"
ожидается "а+б+в"
тотальная функция «Считать символ»
принимает текст: строка, буква: строка
возвращает число
обеспечивает «ноль ровно тогда, когда вхождения нет» (результат равен 0) равен (не (текст содержит буква))
пример «Две буквы а»
дано текст равно "абаб"
дано буква равно "а"
ожидается 2
тотальная функция «Позиция подстроки»
принимает текст: строка, часть: строка
возвращает число
обеспечивает «позиция вхождения неотрицательна» 0 не больше результат
обеспечивает «ноль значит нет вхождения» (результат равен 0) равен (не (текст содержит часть))
обеспечивает «единица значит вхождение с самого начала» (результат равен 1) равен (текст начинается с часть)
обеспечивает «нет вхождения — ответ ноль» если не (текст содержит часть) то (результат равен 0) иначе да
обеспечивает «есть вхождение — ответ на один больше куска перед ним» если текст содержит часть то (результат равен ((длина (голова (разделить текст по часть))) плюс 1)) иначе да
пример «В середине»
дано текст равно "абвг"
дано часть равно "вг"
ожидается 3
тотальная функция «Начинается с»
принимает текст: строка, префикс: строка
возвращает признак
обеспечивает «начинается — значит префикс либо пуст, либо в тексте есть» если результат то (((длина префикс) равен 0) или (текст содержит префикс)) иначе да
обеспечивает «начинается — значит перед первым вхождением ничего нет» если результат то (((длина префикс) равен 0) или ((длина (голова (разделить текст по префикс))) равен 0)) иначе да
обеспечивает «пусто перед первым вхождением — значит начинается» если (((длина префикс) равен 0) или ((текст содержит префикс) и притом ((длина (голова (разделить текст по префикс))) равен 0))) то результат иначе да
пример «Начинается»
дано текст равно "привет"
дано префикс равно "при"
ожидается да
тотальная функция «Заканчивается на»
принимает текст: строка, суффикс: строка
возвращает признак
обеспечивает «заканчивается — значит суффикс не длиннее текста» если результат то ((длина суффикс) не больше (длина текст)) иначе да
обеспечивает «заканчивается — значит отрезал и приклеил обратно исходное» если результат то ((соединить (если (длина текст) равен (длина суффикс) то "" иначе (подстрока текст с 1 по ((длина текст) минус (длина суффикс)))) с суффикс) равен текст) иначе да
обеспечивает «сошлось обратной склейкой — значит заканчивается» если (((длина суффикс) не больше (длина текст)) и притом ((соединить (если (длина текст) равен (длина суффикс) то "" иначе (подстрока текст с 1 по ((длина текст) минус (длина суффикс)))) с суффикс) равен текст)) то результат иначе да
обеспечивает «суффикс длиннее текста — не заканчивается» если ((длина текст) минус (длина суффикс) плюс 1) меньше 1 то (не результат) иначе да
обеспечивает «суффикс помещается — сравнивается ровно хвост той же длины» если ((длина текст) минус (длина суффикс) плюс 1) не меньше 1 то (результат равен ((подстрока текст с ((длина текст) минус (длина суффикс) плюс 1) по (длина текст)) равен суффикс)) иначе да
обеспечивает «ответ — нет или сличение хвоста той же длины» (результат равен нет) или (результат равен ((подстрока текст с ((длина текст) минус (длина суффикс) плюс 1) по (длина текст)) равен суффикс))
пример «Заканчивается»
дано текст равно "привет"
дано суффикс равно "вет"
ожидается да
тотальная функция «Заглавная буква»
принимает буква: строка
возвращает строка
обеспечивает «строчная латинская буква поднимается ровно на 32 кода» если ((длина буква) равен 1) и притом ("abcdefghijklmnopqrstuvwxyz" содержит буква) то ((код символа результат) равен ((код символа буква) минус 32)) иначе да
обеспечивает «в верхний и обратно — исходное, и держится это только на латинице» если ((длина буква) равен 1) и притом ("abcdefghijklmnopqrstuvwxyz" содержит буква) то ((«Строчная буква» от результат) равен буква) иначе да
обеспечивает «вне строчной латиницы знак остаётся собой» если («Позиция подстроки» от "abcdefghijklmnopqrstuvwxyz" и буква) равен 0 то (результат равен буква) иначе да
обеспечивает «строчная латинская берётся с той же позиции из заглавного алфавита» если («Позиция подстроки» от "abcdefghijklmnopqrstuvwxyz" и буква) больше 0 то (результат равен (подстрока "ABCDEFGHIJKLMNOPQRSTUVWXYZ" с («Позиция подстроки» от "abcdefghijklmnopqrstuvwxyz" и буква) по («Позиция подстроки» от "abcdefghijklmnopqrstuvwxyz" и буква))) иначе да
обеспечивает «заглавная — либо сам знак, либо знак с той же позиции» (результат равен буква) или (результат равен (подстрока "ABCDEFGHIJKLMNOPQRSTUVWXYZ" с («Позиция подстроки» от "abcdefghijklmnopqrstuvwxyz" и буква) по («Позиция подстроки» от "abcdefghijklmnopqrstuvwxyz" и буква)))
пример «Строчная становится заглавной»
дано буква равно "c"
ожидается "C"
тотальная функция «Строчная буква»
принимает буква: строка
возвращает строка
обеспечивает «заглавная латинская буква опускается ровно на 32 кода» если ((длина буква) равен 1) и притом ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" содержит буква) то ((код символа результат) равен ((код символа буква) плюс 32)) иначе да
обеспечивает «вне заглавной латиницы знак остаётся собой» если («Позиция подстроки» от "ABCDEFGHIJKLMNOPQRSTUVWXYZ" и буква) равен 0 то (результат равен буква) иначе да
обеспечивает «заглавная латинская берётся с той же позиции из строчного алфавита» если («Позиция подстроки» от "ABCDEFGHIJKLMNOPQRSTUVWXYZ" и буква) больше 0 то (результат равен (подстрока "abcdefghijklmnopqrstuvwxyz" с («Позиция подстроки» от "ABCDEFGHIJKLMNOPQRSTUVWXYZ" и буква) по («Позиция подстроки» от "ABCDEFGHIJKLMNOPQRSTUVWXYZ" и буква))) иначе да
обеспечивает «строчная — либо сам знак, либо знак с той же позиции» (результат равен буква) или (результат равен (подстрока "abcdefghijklmnopqrstuvwxyz" с («Позиция подстроки» от "ABCDEFGHIJKLMNOPQRSTUVWXYZ" и буква) по («Позиция подстроки» от "ABCDEFGHIJKLMNOPQRSTUVWXYZ" и буква)))
пример «Заглавная становится строчной»
дано буква равно "C"
ожидается "c"
тотальная функция «Шаг в верхний регистр»
принимает ход: строка, буква: строка
возвращает строка
обеспечивает «буквы нет — ход не трогается» если не (ход содержит буква) то результат равен ход иначе да
обеспечивает «буква есть — весь ход заменяется заглавной» если ход содержит буква то (результат равен («Заменить» от ход и буква и («Заглавная буква» от буква))) иначе да
обеспечивает «шаг отдаёт ход или ход с заменой на заглавную» (результат равен ход) или (результат равен («Заменить» от ход и буква и («Заглавная буква» от буква)))
пример «Буквы нет — ничего не меняется»
дано ход равно "АБ"
дано буква равно "a"
ожидается "АБ"
тотальная функция «В верхний регистр»
принимает текст: строка
возвращает строка
обеспечивает «верхний регистр не меняет длины» (длина результат) равен (длина текст)
обеспечивает «в верхний и обратно даёт тот же нижний» («В нижний регистр» от результат) равен («В нижний регистр» от текст)
пример «Слово целиком»
дано текст равно "abc"
ожидается "ABC"
тотальная функция «Шаг в нижний регистр»
принимает ход: строка, буква: строка
возвращает строка
обеспечивает «буквы нет — ход не трогается» если не (ход содержит буква) то результат равен ход иначе да
обеспечивает «буква есть — весь ход заменяется строчной» если ход содержит буква то (результат равен («Заменить» от ход и буква и («Строчная буква» от буква))) иначе да
обеспечивает «шаг отдаёт ход или ход с заменой на строчную» (результат равен ход) или (результат равен («Заменить» от ход и буква и («Строчная буква» от буква)))
пример «Буквы нет — ничего не меняется»
дано ход равно "аб"
дано буква равно "A"
ожидается "аб"
тотальная функция «В нижний регистр»
принимает текст: строка
возвращает строка
обеспечивает «нижний регистр не меняет длины» (длина результат) равен (длина текст)
обеспечивает «на одном знаке нижний регистр совпадает с побуквенным» если (длина текст) равен 1 то (результат равен («Строчная буква» от текст)) иначе да
пример «Слово целиком»
дано текст равно "ABC"
ожидается "abc"
тотальная функция «Символы»
принимает текст: строка
возвращает список строки
обеспечивает «символов ровно столько, какова длина строки» (длина результат) равен (длина текст)
обеспечивает «разложил и склеил без разделителя — исходное» (соединить результат по "") равен текст
пример «Три символа»
дано текст равно "абв"
ожидается ["а", "б", "в"]
тотальная функция «Шаг обращения строки»
принимает ход: строка, буква: строка
возвращает строка
обеспечивает «шаг обращения растит длину ровно на длину буквы» (длина результат) равен ((длина ход) плюс (длина буква))
пример «Буква ложится впереди»
дано ход равно "ба"
дано буква равно "в"
ожидается "вба"
тотальная функция «Обратить строку»
принимает текст: строка
возвращает строка
обеспечивает «обращение не удлиняет строку» (длина результат) не больше (длина текст)
обеспечивает «обращение сохраняет пустоту» ((длина результат) равен 0) равен ((длина текст) равен 0)
обеспечивает «при сохранённой длине первый знак обращённого — последний знак исходного» если ((длина результат) равен (длина текст)) и притом ((длина текст) больше 0) то ((подстрока результат с 1 по 1) равен (подстрока текст с (длина текст) по (длина текст))) иначе да
пример «Слово»
дано текст равно "абв"
ожидается "вба"
тотальная функция «Палиндром»
принимает текст: строка
возвращает признак
обеспечивает «разложить на знаки и склеить обратно — ответ тот же» результат равен ((соединить («Символы» от текст) по "") равен («Обратить строку» от текст))
пример «Палиндром»
дано текст равно "довод"
ожидается да
тотальная функция «Повторить»
принимает текст: строка, раз: число
возвращает строка
обеспечивает «положительный повтор начинается исходным текстом» если раз больше 0 то (результат начинается с текст) иначе да
обеспечивает «повтор не длиннее числа раз плюс один» если раз больше 0 то ((длина результат) не больше ((длина текст) умножить на (раз плюс 1))) иначе да
обеспечивает «неположительный повтор даёт пустую строку» если раз не больше 0 то (результат равен "") иначе да
обеспечивает «положительный повтор — текст и повтор на один меньше» если раз больше 0 то (результат равен (соединить текст с («Повторить» от текст и (раз минус 1)))) иначе да
обеспечивает «повтор — пусто или текст с повтором на один меньше» (результат равен "") или (результат равен (соединить текст с («Повторить» от текст и (раз минус 1))))
пример «Трижды»
дано текст равно "ab"
дано раз равно 3
ожидается "ababab"
объект «Обрезка слева»
«началось»: признак
«готово»: строка
тотальная функция «Шаг обрезки слева»
принимает ход: «Обрезка слева», знак: строка
возвращает «Обрезка слева»
обеспечивает «начатое дальше не прерывается» если ход.«началось» то результат.«началось» равен да иначе да
обеспечивает «начатое берёт знак как есть» если ход.«началось» то (результат равен (запись «Обрезка слева» с «началось» равным да и «готово» равным (соединить ход.«готово» с знак))) иначе да
обеспечивает «не начатое ведущий пробел отбрасывает» если не (ход.«началось») то (если знак равен " " то (результат равен ход) иначе да) иначе да
обеспечивает «непробел ход начинает» если не (знак равен " ") то (результат.«началось» равен да) иначе да
обеспечивает «не начатое непробел начинает им одним» если не (ход.«началось») то (если не (знак равен " ") то (результат равен (запись «Обрезка слева» с «началось» равным да и «готово» равным знак)) иначе да) иначе да
обеспечивает «шаг либо не трогает ход, либо начат» (результат равен ход) или (результат.«началось» равен да)
пример «Начатое берёт пробел как есть»
дано ход равно запись «Обрезка слева» с «началось» равным да и «готово» равным "а"
дано знак равно " "
ожидается запись «Обрезка слева» с «началось» равным да и «готово» равным "а "
тотальная функция «Обрезать слева»
принимает текст: строка
возвращает строка
обеспечивает «приставить обратно отнятые пробелы — получить исходное» (соединить («Повторить» от " " и ((длина текст) минус (длина результат))) с результат) равен текст
обеспечивает «ведущего пробела не осталось» не (результат начинается с " ")
пример «Ведущие пробелы»
дано текст равно " аб"
ожидается "аб"
объект «Обрезка справа»
«готово»: строка
«пробелы»: строка
тотальная функция «Шаг обрезки справа»
принимает ход: «Обрезка справа», знак: строка
возвращает «Обрезка справа»
обеспечивает «пробел готовое не трогает» если знак равен " " то (результат.«готово» равен ход.«готово») иначе да
обеспечивает «пробел копится в отдельном поле» если знак равен " " то (результат равен (запись «Обрезка справа» с «готово» равным ход.«готово» и «пробелы» равным (соединить ход.«пробелы» с знак))) иначе да
обеспечивает «непробел копившиеся пробелы сбрасывает» если не (знак равен " ") то (результат.«пробелы» равен "") иначе да
обеспечивает «непробел выливает накопленные пробелы в готовое» если не (знак равен " ") то (результат равен (запись «Обрезка справа» с «готово» равным (соединить (соединить ход.«готово» с ход.«пробелы») с знак) и «пробелы» равным "")) иначе да
обеспечивает «шаг либо не трогает готовое, либо сбрасывает пробелы» (результат.«готово» равен ход.«готово») или (результат.«пробелы» равен "")
пример «Пробел копится отдельно»
дано ход равно запись «Обрезка справа» с «готово» равным "а" и «пробелы» равным ""
дано знак равно " "
ожидается запись «Обрезка справа» с «готово» равным "а" и «пробелы» равным " "
тотальная функция «Обрезать справа»
принимает текст: строка
возвращает строка
обеспечивает «дописать обратно отнятые пробелы — получить исходное» (соединить результат с («Повторить» от " " и ((длина текст) минус (длина результат)))) равен текст
обеспечивает «хвостового пробела не осталось» если (длина результат) больше 0 то (не ((подстрока результат с (длина результат) по (длина результат)) равен " ")) иначе да
пример «Хвостовые пробелы»
дано текст равно "аб "
ожидается "аб"
тотальная функция «Обрезать пробелы»
принимает текст: строка
возвращает строка
обеспечивает «убраны только пробелы» («Без знака» от текст и " ") равен («Без знака» от результат и " ")
обеспечивает «слева у обрезанного пробела не осталось» если (длина результат) больше 0 то (не (результат начинается с " ")) иначе да
обеспечивает «справа у обрезанного пробела не осталось» если (длина результат) больше 0 то (не ((подстрока результат с (длина результат) по (длина результат)) равен " ")) иначе да
пример «С двух сторон»
дано текст равно " аб "
ожидается "аб"
тотальная функция «Первый символ»
принимает текст: строка
возвращает строка
обеспечивает «первый символ длиной не больше знака» (длина результат) не больше 1
обеспечивает «первый символ начинает строку» текст начинается с результат
обеспечивает «первый символ пуст ровно у пустой» ((длина результат) равен 0) равен ((длина текст) равен 0)
пример «Слово»
дано текст равно "абв"
ожидается "а"
тотальная функция «Шаг последнего символа»
принимает ход: строка, знак: строка
возвращает строка
обеспечивает «шаг берёт свежий знак, а накопленное отбрасывает» результат равен знак
пример «Накопленное отброшено»
дано ход равно "а"
дано знак равно "б"
ожидается "б"
тотальная функция «Последний символ»
принимает текст: строка
возвращает строка
обеспечивает «последний символ длиной не больше знака» (длина результат) не больше 1
обеспечивает «последний символ пуст ровно у пустой» ((длина результат) равен 0) равен ((длина текст) равен 0)
обеспечивает «последний символ кончает строку» если (длина текст) больше 0 то (результат равен (подстрока текст с (длина текст) по (длина текст))) иначе да
пример «Слово»
дано текст равно "абв"
ожидается "в"
тотальная функция «Это цифра»
принимает знак: строка
возвращает признак
обеспечивает «цифра — это ровно один знак» если результат то ((длина знак) равен 1) иначе да
обеспечивает «цифра находится поиском позиции среди десяти» если результат то ((«Позиция подстроки» от "0123456789" и знак) больше 0) иначе да
обеспечивает «цифра стоит среди десяти знаков» если результат то ("0123456789" содержит знак) иначе да
обеспечивает «нашлось позицией среди десяти при длине один — цифра» если ((длина знак) равен 1) и притом ((«Позиция подстроки» от "0123456789" и знак) больше 0) то результат иначе да
пример «Цифра»
дано знак равно "7"
ожидается да
тотальная функция «Это пробел»
принимает знак: строка
возвращает признак
обеспечивает «пробел — это ровно один знак» если результат то ((длина знак) равен 1) иначе да
обеспечивает «пробел находится поиском позиции среди четырёх» если результат то ((«Позиция подстроки» от " \t\n\r" и знак) больше 0) иначе да
обеспечивает «пробел стоит среди четырёх знаков» если результат то (" \t\n\r" содержит знак) иначе да
обеспечивает «нашлось позицией среди четырёх при длине один — пробел» если ((длина знак) равен 1) и притом ((«Позиция подстроки» от " \t\n\r" и знак) больше 0) то результат иначе да
пример «Пробел»
дано знак равно " "
ожидается да
тотальная функция «Это латинская буква»
принимает знак: строка
возвращает признак
обеспечивает «латинская буква — это ровно один знак» если результат то ((длина знак) равен 1) иначе да
обеспечивает «у латинской буквы меняется регистр» если результат то (((«Заглавная буква» от знак) не равен знак) или ((«Строчная буква» от знак) не равен знак)) иначе да
обеспечивает «латинская буква стоит в одном из двух алфавитов» если результат то (("abcdefghijklmnopqrstuvwxyz" содержит знак) или ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" содержит знак)) иначе да
обеспечивает «меняется регистр при длине один — латинская буква» если ((длина знак) равен 1) и притом (((«Заглавная буква» от знак) не равен знак) или ((«Строчная буква» от знак) не равен знак)) то результат иначе да
пример «Строчная»
дано знак равно "c"
ожидается да
тотальная функция «Шаг только цифр»
принимает ход: признак, знак: строка
возвращает признак
обеспечивает «однажды сорванное не восстанавливается» если ход равен нет то результат равен нет иначе да
обеспечивает «несорванное отвечает по свежему знаку» если не (ход равен нет) то (результат равен («Это цифра» от знак)) иначе да
обеспечивает «шаг отвечает нет или по свежему знаку» (результат равен нет) или (результат равен («Это цифра» от знак))
пример «Сорванное держится»
дано ход равно нет
дано знак равно "7"
ожидается нет
тотальная функция «Только цифры»
принимает текст: строка
возвращает признак
обеспечивает «строка из одних цифр непуста» если результат то ((длина текст) больше 0) иначе да
обеспечивает «пустая строка одними цифрами не считается» если (длина текст) равен 0 то (не результат) иначе да
обеспечивает «убери из текста все десять цифр — у одних цифр не останется ничего» если результат то ((длина («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от текст и "0") и "1") и "2") и "3") и "4") и "5") и "6") и "7") и "8") и "9")) равен 0) иначе да
обеспечивает «непустое, из которого десять удалений не оставили ничего, — одни цифры» если (((длина текст) больше 0) и притом ((длина («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от («Без знака» от текст и "0") и "1") и "2") и "3") и "4") и "5") и "6") и "7") и "8") и "9")) равен 0)) то результат иначе да
пример «Число»
дано текст равно "2026"
ожидается да
тотальная функция «Цифра числом»
принимает знак: строка
возвращает число
обеспечивает «неотрицательный ответ показывает на тот самый знак» если результат не меньше 0 то ((подстрока "0123456789" с (результат плюс 1) по (результат плюс 1)) равен знак) иначе да
обеспечивает «не цифра даёт ровно минус один» («Это цифра» от знак) или (результат равен (0 минус 1))
обеспечивает «не цифра даёт минус один, охраной из тела» если не («Это цифра» от знак) то (результат равен (0 минус 1)) иначе да
обеспечивает «цифра даёт позицию среди десяти без единицы» если («Это цифра» от знак) то (результат равен ((«Позиция подстроки» от "0123456789" и знак) минус 1)) иначе да
пример «Семёрка»
дано знак равно "7"
ожидается 7
тотальная функция «Сколько дополнить»
принимает ширина: неотрицательное, набрано: неотрицательное
возвращает число
обеспечивает «дополнение — это ровно недостача, а при достатке ноль» если ширина больше набрано то (результат равен (ширина минус набрано)) иначе (результат равен 0)
обеспечивает «набранное вместе с дополнением покрывает ширину» ширина не больше (набрано плюс результат)
пример «Не хватает трёх»
дано ширина равно 5
дано набрано равно 2
ожидается 3
тотальная функция «Дополнить слева»
принимает текст: строка, ширина: неотрицательное, знак: строка
возвращает строка
обеспечивает «исходное целиком стоит в дополненном слева» результат содержит текст
обеспечивает «дополнением слева в один знак ширина не превышена» если (длина знак) равен 1 то ((длина результат) не больше ((длина текст) плюс («Сколько дополнить» от ширина и (длина текст)))) иначе да
пример «Число нулями»
дано текст равно "7"
дано ширина равно 5
дано знак равно "0"
ожидается "00007"
тотальная функция «Дополнить справа»
принимает текст: строка, ширина: неотрицательное, знак: строка
возвращает строка
обеспечивает «дополненное справа начинается исходным» результат начинается с текст
обеспечивает «дополнением справа в один знак ширина не превышена» если (длина знак) равен 1 то ((длина результат) не больше ((длина текст) плюс («Сколько дополнить» от ширина и (длина текст)))) иначе да
пример «Слово точками»
дано текст равно "имя"
дано ширина равно 6
дано знак равно "."
ожидается "имя..."
тотальная функция «Без знака»
принимает текст: строка, знак: строка
возвращает строка
обеспечивает «нечего убирать — текст не тронут» если не (текст содержит знак) то (результат равен текст) иначе да
обеспечивает «убранное укоротило на счёт вхождений» если (длина знак) больше 0 то (((длина результат) плюс ((«Считать символ» от текст и знак) умножить на (длина знак))) не больше (длина текст)) иначе да
обеспечивает «пустой знак убирать нечего» если (длина знак) равен 0 то (результат равен текст) иначе да
обеспечивает «непустой знак убирается заменой его на пустое» если (длина знак) больше 0 то (результат равен («Заменить» от текст и знак и "")) иначе да
обеспечивает «без знака — либо текст, либо текст с заменой» (результат равен текст) или (результат равен («Заменить» от текст и знак и ""))
пример «Убрать пробелы»
дано текст равно "а б в"
дано знак равно " "
ожидается "абв"
тотальная функция «Урезать»
принимает текст: строка, предел: неотрицательное
возвращает строка
обеспечивает «урезанное — начало исходного» текст начинается с результат
обеспечивает «урезанное упёрто либо в предел, либо в конец текста» если не ((длина результат) равен предел) то ((длина результат) равен (длина текст)) иначе да
обеспечивает «текст не длиннее предела не режется» если (длина текст) не больше предел то (результат равен текст) иначе да
обеспечивает «при неположительном пределе от длинного текста остаётся пусто» если ((длина текст) больше предел) и притом (предел не больше 0) то (результат равен "") иначе да
обеспечивает «длинный текст при положительном пределе режется ровно по предел» если ((длина текст) больше предел) и притом (предел больше 0) то (результат равен (подстрока текст с 1 по предел)) иначе да
обеспечивает «урезанное — текст, пустое или начало по предел» (результат равен текст) или ((результат равен "") или (результат равен (подстрока текст с 1 по предел)))
пример «Короткое остаётся собой»
дано текст равно "аб"
дано предел равно 4
ожидается "аб"
| Function | Termination | Claims |
|---|---|---|
| «Приписать строку в начало» | доказано композицией | доказано 2 из 3; «приписанное встало головой, а не хвостом» — сетка |
| «Шаг склейки строк» | доказано композицией | доказано 1 из 1 |
| «Соединить строки» | доказано композицией | доказано 0 из 2; «склейка начинается первой частью» — сетка; «одна часть склеивается сама в себя» — сетка |
| «Разбить по символу» | доказано композицией | доказано 0 из 2; «разбиение даёт хотя бы одну часть» — сетка; «разрезал и склеил тем же разделителем — исходное» — сетка |
| «Заменить» | доказано композицией | доказано 0 из 1; «кусков по новому разделителю не меньше, чем было по старому» — сетка |
| «Считать символ» | доказано композицией | доказано 0 из 1; «ноль ровно тогда, когда вхождения нет» — сетка |
| «Позиция подстроки» | доказано композицией | доказано 3 из 5; «ноль значит нет вхождения» — сетка; «единица значит вхождение с самого начала» — сетка |
| «Начинается с» | доказано композицией | доказано 0 из 3; «начинается — значит префикс либо пуст, либо в тексте есть» — сетка; «начинается — значит перед первым вхождением ничего нет» — сетка; «пусто перед первым вхождением — значит начинается» — сетка |
| «Заканчивается на» | доказано композицией | доказано 3 из 6; «заканчивается — значит суффикс не длиннее текста» — сетка; «заканчивается — значит отрезал и приклеил обратно исходное» — сетка; «сошлось обратной склейкой — значит заканчивается» — сетка |
| «Заглавная буква» | доказано композицией | доказано 3 из 5; «строчная латинская буква поднимается ровно на 32 кода» — сетка; «в верхний и обратно — исходное, и держится это только на латинице» — сетка |
| «Строчная буква» | доказано композицией | доказано 3 из 4; «заглавная латинская буква опускается ровно на 32 кода» — сетка |
| «Шаг в верхний регистр» | доказано композицией | доказано 3 из 3 |
| «В верхний регистр» | доказано композицией | доказано 0 из 2; «верхний регистр не меняет длины» — сетка; «в верхний и обратно даёт тот же нижний» — сетка |
| «Шаг в нижний регистр» | доказано композицией | доказано 3 из 3 |
| «В нижний регистр» | доказано композицией | доказано 0 из 2; «нижний регистр не меняет длины» — сетка; «на одном знаке нижний регистр совпадает с побуквенным» — сетка |
| «Символы» | доказано композицией | доказано 2 из 2 |
| «Шаг обращения строки» | доказано композицией | доказано 1 из 1 |
| «Обратить строку» | доказано композицией | доказано 0 из 3; «обращение не удлиняет строку» — сетка; «обращение сохраняет пустоту» — сетка; «при сохранённой длине первый знак обращённого — последний знак исходного» — сетка |
| «Палиндром» | доказано композицией | доказано 1 из 1 |
| «Повторить» | доказано постоянным шагом | доказано 4 из 5; «повтор не длиннее числа раз плюс один» — сетка |
| «Шаг обрезки слева» | доказано композицией | доказано 6 из 6 |
| «Обрезать слева» | доказано композицией | доказано 0 из 2; «приставить обратно отнятые пробелы — получить исходное» — сетка; «ведущего пробела не осталось» — сетка |
| «Шаг обрезки справа» | доказано композицией | доказано 5 из 5 |
| «Обрезать справа» | доказано композицией | доказано 0 из 2; «дописать обратно отнятые пробелы — получить исходное» — сетка; «хвостового пробела не осталось» — сетка |
| «Обрезать пробелы» | доказано композицией | доказано 0 из 3; «убраны только пробелы» — сетка; «слева у обрезанного пробела не осталось» — сетка; «справа у обрезанного пробела не осталось» — сетка |
| «Первый символ» | доказано композицией | доказано 1 из 3; «первый символ начинает строку» — сетка; «первый символ пуст ровно у пустой» — сетка |
| «Шаг последнего символа» | доказано композицией | доказано 1 из 1 |
| «Последний символ» | доказано композицией | доказано 1 из 3; «последний символ пуст ровно у пустой» — сетка; «последний символ кончает строку» — сетка |
| «Это цифра» | доказано композицией | доказано 3 из 4; «нашлось позицией среди десяти при длине один — цифра» — сетка |
| «Это пробел» | доказано композицией | доказано 3 из 4; «нашлось позицией среди четырёх при длине один — пробел» — сетка |
| «Это латинская буква» | доказано композицией | доказано 2 из 4; «у латинской буквы меняется регистр» — сетка; «меняется регистр при длине один — латинская буква» — сетка |
| «Шаг только цифр» | доказано композицией | доказано 3 из 3 |
| «Только цифры» | доказано композицией | доказано 1 из 4; «строка из одних цифр непуста» — сетка; «убери из текста все десять цифр — у одних цифр не останется ничего» — сетка; «непустое, из которого десять удалений не оставили ничего, — одни цифры» — сетка |
| «Цифра числом» | доказано композицией | доказано 3 из 4; «неотрицательный ответ показывает на тот самый знак» — сетка |
| «Сколько дополнить» | доказано композицией | доказано 1 из 2; «набранное вместе с дополнением покрывает ширину» — сетка |
| «Дополнить слева» | доказано композицией | доказано 0 из 2; «исходное целиком стоит в дополненном слева» — сетка; «дополнением слева в один знак ширина не превышена» — сетка |
| «Дополнить справа» | доказано композицией | доказано 1 из 2; «дополнением справа в один знак ширина не превышена» — сетка |
| «Без знака» | доказано композицией | доказано 3 из 5; «нечего убирать — текст не тронут» — сетка; «убранное укоротило на счёт вхождений» — сетка |
| «Урезать» | доказано композицией | доказано 4 из 6; «урезанное — начало исходного» — сетка; «урезанное упёрто либо в предел, либо в конец текста» — сетка |
«String lists»
flang/stdlib/strlists.flang — functions 13; the kernel ledger was taken from this version of the file
тотальная функция «Первая строка»
принимает части: список строки
возвращает строка
обеспечивает «первая строка есть строка номер один» результат равен («Строка по номеру» от части и 1 и "")
пример «Две части»
дано части равно ["автор", "Стругацкие"]
ожидается "автор"
тотальная функция «Шаг последней строки»
принимает ход: строка, часть: строка
возвращает строка
обеспечивает «шаг берёт свежую часть, а накопленное отбрасывает» результат равен часть
пример «Накопленное отброшено»
дано ход равно "а"
дано часть равно "б"
ожидается "б"
тотальная функция «Последняя строка»
принимает части: список строки
возвращает строка
обеспечивает «последняя — это строка с номером, равным длине списка» (пусто части) или (результат равен (элемент (длина части) в части))
пример «Три части»
дано части равно ["а", "б", "в"]
ожидается "в"
тотальная функция «Хвост строк»
принимает части: список строки
возвращает список строки
обеспечивает «хвост короче ровно на одну, и первая с хвостом склеиваются в исходное» (пусто части) или (((длина результат) равен ((длина части) минус 1)) и притом ((соединить (приписать («Первая строка» от части) к результат) по "") равен (соединить части по "")))
пример «Три части»
дано части равно ["а", "б", "в"]
ожидается ["б", "в"]
тотальная функция «Строка по номеру»
принимает части: список строки, номер: неотрицательное, запасная: строка
возвращает строка
обеспечивает «номер в списке даёт элемент этого номера» ((номер меньше 1) или (номер больше (длина части))) или (результат равен (элемент номер в части))
обеспечивает «номер вне списка даёт запасную» если (номер меньше 1) или (номер больше (длина части)) то (результат равен запасная) иначе да
обеспечивает «номер в списке даёт элемент этого номера, охраной из тела» если не ((номер меньше 1) или (номер больше (длина части))) то (результат равен (элемент номер в части)) иначе да
обеспечивает «отдаётся запасная или элемент этого номера» (результат равен запасная) или (результат равен (элемент номер в части))
пример «Вторая из трёх»
дано части равно ["а", "б", "в"]
дано номер равно 2
дано запасная равно "?"
ожидается "б"
тотальная функция «Номер строки»
принимает части: список строки, искомая: строка
возвращает число
обеспечивает «ноль ровно тогда, когда строки нет, а ненулевой номер показывает на неё» ((результат равен 0) равен (не (части содержит искомая))) и притом ((результат равен 0) или ((элемент результат в части) равен искомая))
пример «Вторая»
дано части равно ["а", "б", "в"]
дано искомая равно "б"
ожидается 2
тотальная функция «Дописать строку»
принимает части: список строки, новая: строка
возвращает список строки
обеспечивает «дописывание удлиняет список ровно на один» (длина результат) равен ((длина части) плюс 1)
обеспечивает «дописанное встало последним, а не первым» (элемент (длина результат) в результат) равен новая
обеспечивает «дописанное стоит в результате» результат содержит новая
пример «В непустой список»
дано части равно ["а", "б"]
дано новая равно "в"
ожидается ["а", "б", "в"]
тотальная функция «Склеить»
принимает части: список строки
возвращает строка
обеспечивает «склейка начинается первой частью, а одна часть склеивается сама в себя» ((пусто части) или (результат начинается с (голова части))) и притом (((длина части) не равен 1) или (результат равен (голова части)))
пример «Три части»
дано части равно ["а", "б", "в"]
ожидается "абв"
тотальная функция «Хвост через»
принимает части: список строки, разделитель: строка
возвращает строка
обеспечивает «это ровно склейка того хвоста, который отдаёт функция хвоста» (пусто части) или (результат равен (соединить («Хвост строк» от части) по разделитель))
пример «Две части»
дано части равно ["автор", "Стругацкие"]
дано разделитель равно "="
ожидается "Стругацкие"
тотальная функция «Непустые»
принимает части: список строки
возвращает список строки
обеспечивает «склейка непустых та же, что склейка всех» (соединить результат по "") равен (соединить части по "")
обеспечивает «непустых не больше, чем было частей» (длина результат) не больше (длина части)
обеспечивает «пустой строки среди непустых не осталось» не (результат содержит "")
пример «Пустые куски выброшены»
дано части равно ["", "автор=Стругацкие", ""]
ожидается ["автор=Стругацкие"]
тотальная функция «Общее начало двух»
принимает первая: строка, вторая: строка
возвращает строка
обеспечивает «общее начало начинает обе строки и дальше них не тянется» (первая начинается с результат) и притом (вторая начинается с результат) и притом (((длина результат) равен (длина первая)) или ((длина результат) равен (длина вторая)) или ((подстрока первая с ((длина результат) плюс 1) по ((длина результат) плюс 1)) не равен (подстрока вторая с ((длина результат) плюс 1) по ((длина результат) плюс 1))))
пример «Общий кусок»
дано первая равно "привет"
дано вторая равно "приказ"
ожидается "при"
тотальная функция «Общее начало»
принимает части: список строки
возвращает строка
обеспечивает «начинает первую и последнюю часть, не длиннее их общего начала, а на одной и на двух частях совпадает с ним точно» (пусто части) или ((((«Первая строка» от части) начинается с результат) и притом ((«Последняя строка» от части) начинается с результат)) и притом (((длина части) не равен 1) или (результат равен («Первая строка» от части))) и притом ((длина результат) не больше (длина («Общее начало двух» от («Первая строка» от части) и («Последняя строка» от части)))) и притом (((длина части) не равен 2) или (результат равен («Общее начало двух» от («Первая строка» от части) и («Последняя строка» от части)))))
пример «Три слова»
дано части равно ["полёт", "полка", "полено"]
ожидается "пол"
тотальная функция «Слова»
принимает текст: строка
возвращает список строки
обеспечивает «склейка слов та же, что склейка кусков» (соединить результат по "") равен (соединить (разделить текст по " ") по "")
обеспечивает «слов не больше, чем кусков» (длина результат) не больше (длина (разделить текст по " "))
обеспечивает «пустого слова среди слов нет» не (результат содержит "")
пример «Три слова»
дано текст равно "а б в"
ожидается ["а", "б", "в"]
| Function | Termination | Claims |
|---|---|---|
| «Первая строка» | доказано композицией | доказано 0 из 1; «первая строка есть строка номер один» — сетка |
| «Шаг последней строки» | доказано композицией | доказано 1 из 1 |
| «Последняя строка» | доказано композицией | доказано 1 из 1 |
| «Хвост строк» | доказано композицией | доказано 0 из 1; «хвост короче ровно на одну, и первая с хвостом склеиваются в исходное» — сетка |
| «Строка по номеру» | доказано композицией | доказано 4 из 4 |
| «Номер строки» | доказано структурой | доказано 0 из 1; «ноль ровно тогда, когда строки нет, а ненулевой номер показывает на неё» — сетка |
| «Дописать строку» | доказано композицией | доказано 3 из 3 |
| «Склеить» | доказано композицией | доказано 0 из 1; «склейка начинается первой частью, а одна часть склеивается сама в себя» — сетка |
| «Хвост через» | доказано композицией | доказано 0 из 1; «это ровно склейка того хвоста, который отдаёт функция хвоста» — сетка |
| «Непустые» | доказано композицией | доказано 1 из 3; «склейка непустых та же, что склейка всех» — сетка; «пустой строки среди непустых не осталось» — сетка |
| «Общее начало двух» | доказано структурой | доказано 0 из 1; «общее начало начинает обе строки и дальше них не тянется» — сетка |
| «Общее начало» | доказано композицией | доказано 0 из 1; «начинает первую и последнюю часть, не длиннее их общего начала, а на одной и на двух частях совпадает с ним точно» — сетка |
| «Слова» | доказано композицией | доказано 1 из 3; «склейка слов та же, что склейка кусков» — сетка; «пустого слова среди слов нет» — сетка |
«Text decoding»
flang/stdlib/text-decoding.flang — functions 29; the kernel ledger was never taken; take it: docs:library-status
тип «Итог раскодирования»
вариант «Раскодировано» содержит текст: строка
вариант «Отказ раскодирования» содержит место: число, причина: строка
объект «Ход раскодирования»
«точки»: список числа
«копилка»: число
«осталось»: число
«низ»: число
«верх»: число
«начало»: число
«место»: число
«отказ»: число
«причина»: строка
тотальная функция «Начало раскодирования»
возвращает «Ход раскодирования»
пример «Пустой ход»
ожидается (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным 0 и
«низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 0 и «отказ» равным 0 и «причина»
равным "")
тотальная функция «Текст точек»
принимает точки: список числа
возвращает строка
пример «Буквы»
дано точки равно [1052, 1080, 1088]
ожидается "Мир"
тотальная функция «Байт ли»
принимает значение: число
возвращает признак
пример «Байт»
дано значение равно 255
ожидается да
тотальная функция «Первый не байт»
принимает байты: список числа
возвращает число
пример «Все байты»
дано байты равно [1, 2]
ожидается 0
тотальная функция «Шаг поиска не байта»
принимает счёт: список числа, байт: число
возвращает список числа
пример «Первый негодный запоминается»
дано счёт равно [1, 0]
дано байт равно -1
ожидается [2, 2]
тотальная функция «Отказ хода»
принимает ход: «Ход раскодирования», место: число, причина: строка
возвращает «Ход раскодирования»
пример «Первый отказ запоминается»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным
0 и «низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 1 и «отказ» равным 0 и «причина»
равным "")
дано место равно 1
дано причина равно "негодный байт"
ожидается (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным 0 и
«низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 1 и «отказ» равным 1 и «причина»
равным "негодный байт")
тотальная функция «С точкой»
принимает ход: «Ход раскодирования», точка: число
возвращает «Ход раскодирования»
пример «Точка дописывается, ожидание сбрасывается»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 5 и «осталось» равным
1 и «низ» равным 160 и «верх» равным 191 и «начало» равным 1 и «место» равным 2 и «отказ» равным 0 и «причина»
равным "")
дано точка равно 65
ожидается (запись «Ход раскодирования» с «точки» равным [65] и «копилка» равным 0 и «осталось» равным 0 и «низ»
равным 128 и «верх» равным 191 и «начало» равным 2 и «место» равным 2 и «отказ» равным 0 и «причина» равным "")
тотальная функция «Ждать продолжения»
принимает ход: «Ход раскодирования», копилка: число, осталось: число, низ: число, верх: число
возвращает «Ход раскодирования»
пример «Ждём два байта»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным
0 и «низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 1 и «отказ» равным 0 и «причина»
равным "")
дано копилка равно 0
дано осталось равно 2
дано низ равно 160
дано верх равно 191
ожидается (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным 2 и
«низ» равным 160 и «верх» равным 191 и «начало» равным 1 и «место» равным 1 и «отказ» равным 0 и «причина»
равным "")
тотальная функция «Сдвинуть место»
принимает ход: «Ход раскодирования», шаг: число
возвращает «Ход раскодирования»
пример «На байт вперёд»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным
0 и «низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 0 и «отказ» равным 0 и «причина»
равным "")
дано шаг равно 1
ожидается (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным 0 и
«низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 1 и «отказ» равным 0 и «причина»
равным "")
тотальная функция «Вид первого байта utf8»
принимает байт: число
возвращает число
пример «ASCII»
дано байт равно 65
ожидается 0
тотальная функция «Начать знак utf8»
принимает ход: «Ход раскодирования», байт: число
возвращает «Ход раскодирования»
пример «Однобайтовый знак»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным
0 и «низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 1 и «отказ» равным 0 и «причина»
равным "")
дано байт равно 65
ожидается (запись «Ход раскодирования» с «точки» равным [65] и «копилка» равным 0 и «осталось» равным 0 и «низ»
равным 128 и «верх» равным 191 и «начало» равным 1 и «место» равным 1 и «отказ» равным 0 и «причина» равным "")
тотальная функция «Продолжить знак utf8»
принимает ход: «Ход раскодирования», байт: число
возвращает «Ход раскодирования»
пример «Последний байт знака»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 16 и «осталось» равным
1 и «низ» равным 128 и «верх» равным 191 и «начало» равным 1 и «место» равным 2 и «отказ» равным 0 и «причина»
равным "")
дано байт равно 156
ожидается (запись «Ход раскодирования» с «точки» равным [1052] и «копилка» равным 0 и «осталось» равным 0 и «низ»
равным 128 и «верх» равным 191 и «начало» равным 2 и «место» равным 2 и «отказ» равным 0 и «причина» равным "")
тотальная функция «Шаг utf8»
принимает ход: «Ход раскодирования», байт: число
возвращает «Ход раскодирования»
пример «Начало знака»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным
0 и «низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 0 и «отказ» равным 0 и «причина»
равным "")
дано байт равно 208
ожидается (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 16 и «осталось» равным 1 и
«низ» равным 128 и «верх» равным 191 и «начало» равным 1 и «место» равным 1 и «отказ» равным 0 и «причина»
равным "")
тотальная функция «Единица ли суррогатом»
принимает ед: число, низ: число
возвращает признак
пример «Высокая половина»
дано ед равно 55357
дано низ равно 55296
ожидается да
тотальная функция «Шаг utf16»
принимает ход: «Ход раскодирования», ед: число
возвращает «Ход раскодирования»
пример «Пара половин даёт одну точку»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 55357 и «осталось»
равным 1 и «низ» равным 128 и «верх» равным 191 и «начало» равным 1 и «место» равным 2 и «отказ» равным 0 и
«причина» равным "")
дано ед равно 56832
ожидается (запись «Ход раскодирования» с «точки» равным [128512] и «копилка» равным 0 и «осталось» равным 0 и «низ»
равным 128 и «верх» равным 191 и «начало» равным 4 и «место» равным 4 и «отказ» равным 0 и «причина» равным "")
тотальная функция «Шаг utf32»
принимает ход: «Ход раскодирования», ед: число
возвращает «Ход раскодирования»
пример «Смайлик»
дано ход равно (запись «Ход раскодирования» с «точки» равным пустой список и «копилка» равным 0 и «осталось» равным
0 и «низ» равным 128 и «верх» равным 191 и «начало» равным 0 и «место» равным 0 и «отказ» равным 0 и «причина»
равным "")
дано ед равно 128512
ожидается (запись «Ход раскодирования» с «точки» равным [128512] и «копилка» равным 0 и «осталось» равным 0 и «низ»
равным 128 и «верх» равным 191 и «начало» равным 4 и «место» равным 4 и «отказ» равным 0 и «причина» равным "")
тотальная функция «Единицы»
принимает байты: список числа, ширина: число, «старшим вперёд»: признак
возвращает список числа
пример «Две единицы UTF-16LE»
дано байты равно [65, 0, 30, 4]
дано ширина равно 2
дано «старшим вперёд» равно нет
ожидается [65, 1054]
тотальная функция «Шаг единиц»
принимает ход: список список числа, байт: число, ширина: число, «старшим вперёд»: признак
возвращает список список числа
пример «Последний байт единицы»
дано ход равно [пустой список, [65, 1, 256]]
дано байт равно 0
дано ширина равно 2
дано «старшим вперёд» равно нет
ожидается [[65], [0, 0, 1]]
тотальная функция «Итог хода»
принимает ход: «Ход раскодирования», «длина байтов»: число
возвращает «Итог раскодирования»
пример «Всё раскодировано»
дано ход равно (запись «Ход раскодирования» с «точки» равным [65] и «копилка» равным 0 и «осталось» равным 0 и «низ»
равным 128 и «верх» равным 191 и «начало» равным 1 и «место» равным 1 и «отказ» равным 0 и «причина» равным "")
дано «длина байтов» равно 1
ожидается вариант «Раскодировано» с текст равным "A"
тотальная функция «Раскодировать единицами»
принимает байты: список числа, ширина: число, «старшим вперёд»: признак
возвращает «Итог раскодирования»
пример «UTF-16BE»
дано байты равно [4, 28, 4, 56, 4, 64]
дано ширина равно 2
дано «старшим вперёд» равно да
ожидается вариант «Раскодировано» с текст равным "Мир"
тотальная функция «Порядок по метке»
принимает байты: список числа, ширина: число
возвращает число
пример «Метка UTF-16LE»
дано байты равно [255, 254, 65, 0]
дано ширина равно 2
ожидается 1
тотальная функция «Первые байты»
принимает байты: список числа, сколько: число
возвращает список числа
пример «Два первых»
дано байты равно [1, 2, 3]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Без первых»
принимает байты: список числа, сколько: число
возвращает список числа
пример «Без двух»
дано байты равно [1, 2, 3]
дано сколько равно 2
ожидается [3]
тотальная функция «Шаг пропуска»
принимает ход: список список числа, байт: число, сколько: число
возвращает список список числа
пример «Пропуск»
дано ход равно [пустой список, [0]]
дано байт равно 7
дано сколько равно 1
ожидается [пустой список, [1]]
тотальная функция «Раскодировать с меткой»
принимает байты: список числа, ширина: число
возвращает «Итог раскодирования»
пример «UTF-16 с меткой младшим вперёд»
дано байты равно [255, 254, 65, 0]
дано ширина равно 2
ожидается вариант «Раскодировано» с текст равным "A"
тотальная функция «Сместить отказ»
принимает итог: «Итог раскодирования», сдвиг: число
возвращает «Итог раскодирования»
пример «Место отказа считается от начала с меткой»
дано итог равно вариант «Отказ раскодирования» с место равным 1 и причина равным "x"
дано сдвиг равно 2
ожидается вариант «Отказ раскодирования» с место равным 3 и причина равным "x"
тотальная функция «Раскодировать страницей»
принимает байты: список числа, верхняя: список числа
возвращает «Итог раскодирования»
пример «Кириллица CP1251»
дано байты равно [204, 232, 240]
дано верхняя равно [1026, 1027, 8218, 1107, 8222, 8230, 8224, 8225, 8364, 8240, 1033, 8249, 1034, 1036, 1035, 1039,
1106, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 152, 8482, 1113, 8250, 1114, 1116, 1115, 1119, 160, 1038, 1118,
1032, 164, 1168, 166, 167, 1025, 169, 1028, 171, 172, 173, 174, 1031, 176, 177, 1030, 1110, 1169, 181, 182, 183,
1105, 8470, 1108, 187, 1112, 1029, 1109, 1111, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050,
1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068,
1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103]
ожидается вариант «Раскодировано» с текст равным "Мир"
тотальная функция «Раскодировать из»
принимает кодировка: строка, байты: список числа
возвращает «Итог раскодирования»
пример «UTF-8»
дано кодировка равно "UTF-8"
дано байты равно [208, 156, 208, 184, 209, 128]
ожидается вариант «Раскодировано» с текст равным "Мир"
тотальная функция «Раскодировать байты»
принимает кодировка: строка, байты: список числа
возвращает «Итог раскодирования»
пример «Windows-1251 — второе имя CP1251»
дано кодировка равно "windows-1251"
дано байты равно [204]
ожидается вариант «Раскодировано» с текст равным "М"
«TLS client»
flang/stdlib/tls-client.flang — functions 78; the kernel ledger was taken from this version of the file
тип «Вид записи TLS»
вариант «Смена шифра»
вариант «Тревога»
вариант «Рукопожатие»
вариант «Закрытая»
вариант «Чужая»
объект «Примета записи»
«тип»: число
«вид»: «Вид записи TLS»
объект «Ход полёта»
«номер»: число
«поток»: список числа
«видно»: число
«итог»: число
объект «Пара»
«клиент»: список числа
«сервер»: список числа
объект «Полёт»
«сервер»: список числа
«поток»: список числа
«рук»: «Пара»
«дан»: «Пара»
«конец»: число
тип «Итог полёта»
вариант «Полёт готов» содержит полёт: «Полёт»
вариант «Полёт ждёт»
вариант «Полёт отвергнут» содержит код: строка, слова: строка
объект «Доверие»
«корни»: список «Корень доверия»
«сейчас»: число
«узел»: строка
тип «Итог рукопожатия»
вариант «Ждать»
вариант «Отказ рукопожатия» содержит код: строка, слова: строка
вариант «Рукопожатие готово» содержит октеты: список числа, ключ: список числа, вектор: список числа, записей: число
объект «Отбор записей»
«номер»: число
«записи»: список список числа
объект «Ход строки»
«набрано»: строка
«кончено»: признак
объект «Ход ответа»
«номер»: число
«текст»: список числа
«закрыто»: признак
«испорчено»: признак
тотальная функция «Расширения привета клиента»
принимает открытый: список числа, имя: список числа
возвращает список числа
обеспечивает «обвязка, имя и ключ» (длина результат) равен ((длина имя) плюс (длина открытый) плюс 42)
пример «имя из одного знака без ключа»
дано открытый равно пустой список
дано имя равно [97]
ожидается [0, 0, 0, 6, 0, 4, 0, 0, 1, 97, 0, 43, 0, 3, 2, 3, 4, 0, 10, 0, 4, 0, 2, 0, 29, 0, 13, 0, 4, 0, 2, 8, 4,
0, 51, 0, 38, 0, 36, 0, 29, 0, 32]
тотальная функция «Привет клиента»
принимает случайное: список числа, открытый: список числа, имя: список числа
возвращает список числа
обеспечивает «сообщение помечено типом 1, ClientHello» (элемент 1 в результат) равен 1
пример «обвязка привета без случайного, ключа и имени»
дано случайное равно пустой список
дано открытый равно пустой список
дано имя равно пустой список
ожидается [1, 0, 0, 53, 3, 3, 0, 0, 2, 19, 1, 1, 0, 0, 42, 0, 0, 0, 5, 0, 3, 0, 0, 0, 0, 43, 0, 3, 2, 3, 4, 0, 10,
0, 4, 0, 2, 0, 29, 0, 13, 0, 4, 0, 2, 8, 4, 0, 51, 0, 38, 0, 36, 0, 29, 0, 32]
тотальная функция «Запись привета»
принимает сообщение: список числа
возвращает список числа
обеспечивает «запись на пять октетов длиннее сообщения» (длина результат) равен (5 плюс (длина сообщение))
пример «пустое сообщение — один заголовок»
дано сообщение равно пустой список
ожидается [22, 3, 1, 0, 0]
тотальная функция «Приметы записей»
возвращает список «Примета записи»
пример «четыре типа записи TLS 1.3»
ожидается [запись «Примета записи» с «тип» равным 20 и «вид» равным (вариант «Смена шифра»),
запись «Примета записи» с «тип» равным 21 и «вид» равным (вариант «Тревога»),
запись «Примета записи» с «тип» равным 22 и «вид» равным (вариант «Рукопожатие»),
запись «Примета записи» с «тип» равным 23 и «вид» равным (вариант «Закрытая»)]
тотальная функция «Вид записи»
принимает кадр: список числа
возвращает «Вид записи TLS»
пример «23 — закрытая запись»
дано кадр равно [23, 3, 3, 0, 0]
ожидается вариант «Закрытая»
тотальная функция «Запись с места»
принимает лента: список числа, место: число
возвращает список числа
пример «вторая запись ленты»
дано лента равно [23, 3, 3, 0, 1, 7, 22, 3, 3, 0, 2, 8, 9]
дано место равно 7
ожидается [22, 3, 3, 0, 2, 8, 9]
тотальная функция «Записи ленты»
принимает лента: список числа
возвращает список список числа
пример «две целые записи и обрывок»
дано лента равно [23, 3, 3, 0, 1, 7, 22, 3, 3, 0, 2, 8, 9, 23, 3]
ожидается [[23, 3, 3, 0, 1, 7], [22, 3, 3, 0, 2, 8, 9]]
тотальная функция «Есть Finished»
принимает поток: список числа
возвращает признак
пример «EncryptedExtensions и Finished»
дано поток равно [8, 0, 0, 2, 0, 0, 20, 0, 0, 1, 7]
ожидается да
тотальная функция «Ход»
принимает номер: число, поток: список числа, видно: число, итог: число
возвращает «Ход полёта»
пример «ход собирается из четырёх полей»
дано номер равно 1
дано поток равно [7]
дано видно равно 2
дано итог равно 0
ожидается запись «Ход полёта» с «номер» равным 1 и «поток» равным [7] и «видно» равным 2 и «итог» равным 0
тотальная функция «Шаг полёта»
принимает ход: «Ход полёта», кадр: список числа, ключ: список числа, вектор: список числа
возвращает «Ход полёта»
пример «пройденный полёт дальше не идёт»
дано ход равно запись «Ход полёта» с «номер» равным 1 и «поток» равным [] и «видно» равным 3 и «итог» равным 1
дано кадр равно [20, 3, 3, 0, 1, 1]
дано ключ равно пустой список
дано вектор равно пустой список
ожидается запись «Ход полёта» с «номер» равным 1 и «поток» равным [] и «видно» равным 3 и «итог» равным 1
тотальная функция «Шаг по виду»
принимает ход: «Ход полёта», кадр: список числа, ключ: список числа, вектор: список числа
возвращает «Ход полёта»
пример «смена шифра только считается»
дано ход равно запись «Ход полёта» с «номер» равным 0 и «поток» равным [] и «видно» равным 1 и «итог» равным 0
дано кадр равно [20, 3, 3, 0, 1, 1]
дано ключ равно пустой список
дано вектор равно пустой список
ожидается запись «Ход полёта» с «номер» равным 0 и «поток» равным [] и «видно» равным 2 и «итог» равным 0
тотальная функция «Шаг закрытой записи»
принимает ход: «Ход полёта», исход: «Исход GCM»
возвращает «Ход полёта»
пример «тег не сошёлся — полёт испорчен»
дано ход равно запись «Ход полёта» с «номер» равным 0 и «поток» равным [] и «видно» равным 2 и «итог» равным 0
дано исход равно вариант «Тег не сошёлся» с посчитан равным пустой список и предъявлен равным пустой список
ожидается запись «Ход полёта» с «номер» равным 1 и «поток» равным [] и «видно» равным 3 и «итог» равным 2
тотальная функция «Шаг потока»
принимает ход: «Ход полёта», открытое: список числа, видно: число
возвращает «Ход полёта»
пример «рукопожатие с Finished закрывает полёт»
дано ход равно запись «Ход полёта» с «номер» равным 0 и «поток» равным [] и «видно» равным 2 и «итог» равным 0
дано открытое равно [20, 0, 0, 1, 7, 22]
дано видно равно 3
ожидается запись «Ход полёта» с «номер» равным 1 и «поток» равным [20, 0, 0, 1,
7] и «видно» равным 3 и «итог» равным 1
тотальная функция «Начало полёта»
возвращает «Ход полёта»
пример «полёт начинается за приветом сервера»
ожидается запись «Ход полёта» с «номер» равным 0 и «поток» равным [] и «видно» равным 1 и «итог» равным 0
тотальная функция «Пройти полёт»
принимает записи: список список числа, ключ: список числа, вектор: список числа
возвращает «Ход полёта»
пример «за приветом ничего — полёт не найден»
дано записи равно [[22, 3, 3, 0, 0]]
дано ключ равно пустой список
дано вектор равно пустой список
ожидается запись «Ход полёта» с «номер» равным 0 и «поток» равным [] и «видно» равным 1 и «итог» равным 0
тотальная функция «Случайное повтора»
возвращает список числа
обеспечивает «тридцать два октета» (длина результат) равен 32
пример «HelloRetryRequest узнаётся по случайному из RFC 8446, 4.1.3»
ожидается [207, 33, 173, 116, 229, 154, 97, 17, 190, 29, 140, 2, 30, 101, 184, 145, 194, 162, 17, 22, 122, 187, 140,
94, 7, 158, 9, 226, 200, 168, 51, 156]
тотальная функция «Привет сервера годен»
принимает привет: список числа
возвращает «Приговор пути»
пример «пустой привет — не ServerHello»
дано привет равно пустой список
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_PROTOCOL" и слова равным "первым пришёл не ServerHello"
тотальная функция «Тревога словом»
принимает кадр: список числа
возвращает строка
пример «тревога handshake_failure»
дано кадр равно [21, 3, 3, 0, 2, 2, 40]
ожидается "тревога, уровень 2, код 40"
тотальная функция «Полёт сервера»
принимает тайна: список числа, привет: список числа, лента: список числа
возвращает «Итог полёта»
пример «пустая лента — ждать дальше»
дано тайна равно пустой список
дано привет равно пустой список
дано лента равно пустой список
ожидается вариант «Полёт ждёт»
тотальная функция «Полёт по первой»
принимает тайна: список числа, привет: список числа, записи: список список числа, первая: список числа
возвращает «Итог полёта»
пример «сервер сразу ответил тревогой»
дано тайна равно пустой список
дано привет равно пустой список
дано записи равно пустой список
дано первая равно [21, 3, 3, 0, 2, 2, 40]
ожидается вариант «Полёт отвергнут» с код равным "FLANG_TLS_ALERT" и слова равным "тревога, уровень 2, код 40"
тотальная функция «Полёт за приветом»
принимает тайна: список числа, привет: список числа, записи: список список числа, сервер: список числа
возвращает «Итог полёта»
тотальная функция «Полёт с ключом»
принимает тайна: список числа, привет: список числа, записи: список список числа, сервер: список числа
возвращает «Итог полёта»
тотальная функция «Приговор хода»
принимает ход: «Ход полёта»
возвращает «Приговор пути»
пример «испорченный полёт — отказ по записи»
дано ход равно запись «Ход полёта» с «номер» равным 1 и «поток» равным [] и «видно» равным 3 и «итог» равным 2
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_RECORD" и слова равным "запись не прошла проверку тега"
тотальная функция «Полёт по ходу»
принимает ход: «Ход полёта», рук: список числа, пара: «Пара», приветы: список числа, сервер: список числа
возвращает «Итог полёта»
тотальная функция «Итог полёта по коду»
принимает код: строка, слова: строка
возвращает «Итог полёта»
пример «ЕЩЁ — ждать»
дано код равно "ЕЩЁ"
дано слова равно ""
ожидается вариант «Полёт ждёт»
тотальная функция «Собрать полёт»
принимает сер: список числа, пот: список числа, рук: «Пара», дан: «Пара», кон: число
возвращает «Полёт»
пример «полёт из пустых частей»
дано сер равно [1]
дано пот равно [2]
дано рук равно запись «Пара» с «клиент» равным [] и «сервер» равным []
дано дан равно запись «Пара» с «клиент» равным [] и «сервер» равным []
дано кон равно 3
ожидается запись «Полёт» с «сервер» равным [1] и «поток» равным [
2] и «рук» равным (запись «Пара» с «клиент» равным [] и «сервер» равным [
]) и «дан» равным (запись «Пара» с «клиент» равным [] и «сервер» равным [
]) и «конец» равным 3
тотальная функция «Полёт из хода»
принимает ход: «Ход полёта», рук: список числа, пара: «Пара», приветы: список числа, сервер: список числа
возвращает «Полёт»
тотальная функция «Номера сертификатов»
принимает сообщение: список числа
возвращает список числа
пример «один сертификат — один номер»
дано сообщение равно [11, 0, 0, 9, 0, 0, 0, 5, 0, 0, 2, 48, 0, 0, 0]
ожидается [1]
тотальная функция «Сертификаты сообщения»
принимает сообщение: список числа
возвращает список список числа
пример «один сертификат из двух октетов DER»
дано сообщение равно [11, 0, 0, 9, 0, 0, 0, 5, 0, 0, 2, 48, 0, 0, 0]
ожидается [[48, 0]]
тотальная функция «Подпись из проверки»
принимает проверка: список числа
возвращает список числа
пример «подпись из двух октетов»
дано проверка равно [15, 0, 0, 6, 8, 4, 0, 2, 7, 9]
ожидается [7, 9]
тотальная функция «Тип сообщения»
принимает сообщения: список числа, номер: число
возвращает число
пример «второе сообщение — Finished»
дано сообщения равно [8, 0, 0, 0, 20, 0, 0, 0]
дано номер равно 2
ожидается 20
тотальная функция «Сообщения полёта годны»
принимает сообщения: список числа
возвращает «Приговор пути»
пример «запрос сертификата клиента не поддержан»
дано сообщения равно [8, 0, 0, 0, 13, 0, 0, 0]
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_PROTOCOL" и слова равным "нужен сертификат клиента"
тотальная функция «PSS сервера верна»
принимает лист: список числа, проверка: список числа, стенограмма: список числа
возвращает признак
тотальная функция «Проверка подписи сервера»
принимает лист: список числа, проверка: список числа, стенограмма: список числа
возвращает «Приговор пути»
пример «чужой способ подписи отвергнут до счёта»
дано лист равно пустой список
дано проверка равно [15, 0, 0, 6, 4, 3, 0, 2, 7, 9]
дано стенограмма равно пустой список
ожидается вариант «Путь отвергнут» с код равным "FLANG_TLS_SIGNATURE" и слова равным "способ подписи 1027"
тотальная функция «Первый сертификат»
принимает серты: список список числа
возвращает список числа
пример «нет сертификатов — пусто»
дано серты равно пустой список
ожидается пустой список
тотальная функция «До проверки»
принимает полёт: «Полёт», привет: список числа
возвращает список числа
тотальная функция «Проверить полёт»
принимает полёт: «Полёт», привет: список числа, доверие: «Доверие»
возвращает «Приговор пути»
тотальная функция «Проверить путь полёта»
принимает полёт: «Полёт», привет: список числа, доверие: «Доверие»
возвращает «Приговор пути»
тотальная функция «Проверить подпись полёта»
принимает полёт: «Полёт», привет: список числа, лист: список числа
возвращает «Приговор пути»
тотальная функция «Финиш сервера сошёлся»
принимает полёт: «Полёт», привет: список числа
возвращает «Приговор пути»
тотальная функция «Финиш клиента записью»
принимает полёт: «Полёт», привет: список числа
возвращает список числа
тотальная функция «Запрос записью»
принимает полёт: «Полёт», запрос: список числа
возвращает список числа
тотальная функция «Ответ клиента»
принимает полёт: «Полёт», привет: список числа, запрос: список числа
возвращает список числа
тотальная функция «Готово с ключами»
принимает полёт: «Полёт», октеты: список числа
возвращает «Итог рукопожатия»
тотальная функция «Отказ по приговору»
принимает приговор: «Приговор пути»
возвращает «Итог рукопожатия»
пример «годный приговор отказом не бывает — ждать»
дано приговор равно вариант «Путь годен»
ожидается вариант «Ждать»
тотальная функция «Финиш по готовому»
принимает полёт: «Полёт», привет: список числа
возвращает «Итог рукопожатия»
тотальная функция «Шаг финиша по полёту»
принимает итог: «Итог полёта», привет: список числа
возвращает «Итог рукопожатия»
пример «ждать»
дано итог равно вариант «Полёт ждёт»
дано привет равно пустой список
ожидается вариант «Ждать»
тотальная функция «Шаг финиша»
принимает тайна: список числа, привет: список числа, лента: список числа
возвращает «Итог рукопожатия»
пример «пустая лента — ждать»
дано тайна равно пустой список
дано привет равно пустой список
дано лента равно пустой список
ожидается вариант «Ждать»
тотальная функция «Запрос по готовому»
принимает полёт: «Полёт», привет: список числа, доверие: «Доверие», запрос: список числа
возвращает «Итог рукопожатия»
тотальная функция «Запрос по проверенному»
принимает полёт: «Полёт», привет: список числа, доверие: «Доверие», запрос: список числа
возвращает «Итог рукопожатия»
тотальная функция «Шаг рукопожатия»
принимает тайна: список числа, привет: список числа, лента: список числа, доверие: «Доверие», запрос: список числа
возвращает «Итог рукопожатия»
пример «пустая лента — ждать»
дано тайна равно пустой список
дано привет равно пустой список
дано лента равно пустой список
дано доверие равно запись «Доверие» с «корни» равным пустой список и «сейчас» равным 0 и «узел» равным ""
дано запрос равно пустой список
ожидается вариант «Ждать»
тотальная функция «Ответ»
принимает номер: число, текст: список числа, конец: признак, порча: признак
возвращает «Ход ответа»
пример «ответ из четырёх полей»
дано номер равно 0
дано текст равно [1]
дано конец равно нет
дано порча равно нет
ожидается запись «Ход ответа» с «номер» равным 0 и «текст» равным [
1] и «закрыто» равным нет и «испорчено» равным нет
тотальная функция «Начало ответа»
возвращает «Ход ответа»
пример «ответ начинается с нулевого номера»
ожидается запись «Ход ответа» с «номер» равным 0 и «текст» равным [] и «закрыто» равным нет и «испорчено» равным нет
тотальная функция «Шаг ответа»
принимает ход: «Ход ответа», кадр: список числа, ключ: список числа, вектор: список числа
возвращает «Ход ответа»
пример «после закрытия записи не читаются»
дано ход равно запись «Ход ответа» с «номер» равным 2 и «текст» равным [
1] и «закрыто» равным да и «испорчено» равным нет
дано кадр равно [23, 3, 3, 0, 0]
дано ключ равно пустой список
дано вектор равно пустой список
ожидается запись «Ход ответа» с «номер» равным 2 и «текст» равным [1] и «закрыто» равным да и «испорчено» равным нет
тотальная функция «Шаг открытого ответа»
принимает ход: «Ход ответа», исход: «Исход GCM»
возвращает «Ход ответа»
пример «данные приложения дописываются к тексту»
дано ход равно запись «Ход ответа» с «номер» равным 0 и «текст» равным [
72] и «закрыто» равным нет и «испорчено» равным нет
дано исход равно вариант «Расшифровано» с текст равным [84, 23]
ожидается запись «Ход ответа» с «номер» равным 1 и «текст» равным [72,
84] и «закрыто» равным нет и «испорчено» равным нет
тотальная функция «Ответ по тексту»
принимает ход: «Ход ответа», номер: число, открытое: список числа
возвращает «Ход ответа»
пример «тревога закрывает ответ»
дано ход равно запись «Ход ответа» с «номер» равным 3 и «текст» равным [
72] и «закрыто» равным нет и «испорчено» равным нет
дано номер равно 4
дано открытое равно [1, 0, 21]
ожидается запись «Ход ответа» с «номер» равным 4 и «текст» равным [
72] и «закрыто» равным да и «испорчено» равным нет
тотальная функция «Отобрать»
принимает ход: «Отбор записей», кадр: список числа, сколько: число
возвращает «Отбор записей»
пример «первая запись пропускается»
дано ход равно запись «Отбор записей» с «номер» равным 0 и «записи» равным []
дано кадр равно [1]
дано сколько равно 1
ожидается запись «Отбор записей» с «номер» равным 1 и «записи» равным []
тотальная функция «Записи после»
принимает записи: список список числа, сколько: число
возвращает список список числа
пример «первая пропущена»
дано записи равно [[1], [2], [3]]
дано сколько равно 1
ожидается [[2], [3]]
тотальная функция «Ответ сервера»
принимает ключ: список числа, вектор: список числа, лента: список числа, пропустить: число
возвращает «Ход ответа»
пример «за полётом записей нет — пустой ответ»
дано ключ равно пустой список
дано вектор равно пустой список
дано лента равно пустой список
дано пропустить равно 0
ожидается запись «Ход ответа» с «номер» равным 0 и «текст» равным [] и «закрыто» равным нет и «испорчено» равным нет
тотальная функция «Шестнадцатеричная строка»
принимает октеты: список числа
возвращает строка
обеспечивает «на каждый октет ровно два знака» (длина результат) равен ((длина октеты) умножить на 2)
пример «три октета»
дано октеты равно [1, 171, 255]
ожидается "01ABFF"
тотальная функция «Знак ASCII»
принимает октет: число
возвращает строка
пример «буква H»
дано октет равно 72
ожидается "H"
тотальная функция «Шаг строки»
принимает ход: «Ход строки», октет: число
возвращает «Ход строки»
пример «возврат каретки кончает строку»
дано ход равно запись «Ход строки» с «набрано» равным "H" и «кончено» равным нет
дано октет равно 13
ожидается запись «Ход строки» с «набрано» равным "H" и «кончено» равным да
тотальная функция «Первая строка»
принимает октеты: список числа
возвращает строка
пример «строка состояния HTTP до возврата каретки»
дано октеты равно [72, 84, 13, 10, 88]
ожидается "HT"
тотальная функция «Запрос GET»
принимает узел: строка, путь: строка
возвращает список числа
пример «запрос к узлу a по пути /»
дано узел равно "a"
дано путь равно "/"
ожидается [71, 69, 84, 32, 47, 32, 72, 84, 84, 80, 47, 49, 46, 49, 13, 10, 72, 111, 115, 116, 58, 32, 97, 13, 10,
85, 115, 101, 114, 45, 65, 103, 101, 110, 116, 58, 32, 102, 108, 97, 110, 103, 13, 10, 67, 111, 110, 110, 101,
99, 116, 105, 111, 110, 58, 32, 99, 108, 111, 115, 101, 13, 10, 13, 10]
тотальная функция «Октеты привета»
принимает привет: строка
возвращает список числа
пример «заголовок записи снят»
дано привет равно "16030100020100"
ожидается [1, 0]
тотальная функция «Доверие из слов»
принимает связка: строка, миллисекунды: число, узел: строка
возвращает «Доверие»
пример «пустая связка»
дано связка равно ""
дано миллисекунды равно 1791374400000
дано узел равно "a"
ожидается запись «Доверие» с «корни» равным [] и «сейчас» равным 20261007120000 и «узел» равным "a"
тотальная функция «Привет клиента шестнадцатеричным»
принимает тайна: строка, случайное: строка, узел: строка
возвращает строка
тотальная функция «Итог словом»
принимает итог: «Итог рукопожатия»
возвращает строка
пример «ждать»
дано итог равно вариант «Ждать»
ожидается "ЕЩЁ"
тотальная функция «Полёт словами»
принимает полёт: «Полёт»
возвращает строка
тотальная функция «Финиш готового словом»
принимает полёт: «Полёт», привет: список числа
возвращает строка
тотальная функция «Финиш словом»
принимает тайна: строка, привет: строка, лента: строка
возвращает строка
пример «сервер ещё ничего не прислал»
дано тайна равно ""
дано привет равно ""
дано лента равно ""
ожидается "ЕЩЁ"
тотальная функция «Полёт из слов»
принимает части: список строки
возвращает «Полёт»
пример «пустые части — пустой полёт»
дано части равно ["", "", "", "", "", "3"]
ожидается запись «Полёт» с «сервер» равным [] и «поток» равным [] и «рук» равным (запись «Пара» с «клиент» равным [
] и «сервер» равным []) и «дан» равным (запись «Пара» с «клиент» равным [] и «сервер» равным [
]) и «конец» равным 3
тотальная функция «Байт-список»
принимает списки: список список числа, номер: число
возвращает список числа
пример «второй список»
дано списки равно [[1], [2, 3]]
дано номер равно 2
ожидается [2, 3]
тотальная функция «Строка по счёту»
принимает строки: список строки, номер: число
возвращает строка
пример «вторая строка»
дано строки равно ["а", "б"]
дано номер равно 2
ожидается "б"
тотальная функция «Запрос по полёту словом»
принимает привет: строка, части: список строки, связка: строка, миллисекунды: число, узел: строка, путь: строка
возвращает строка
пример «пустой полёт — не тот порядок сообщений»
дано привет равно ""
дано части равно ["", "", "", "", "", "3"]
дано связка равно ""
дано миллисекунды равно 0
дано узел равно "a"
дано путь равно "/"
ожидается "ОТКАЗ FLANG_TLS_PROTOCOL нет EncryptedExtensions"
тотальная функция «Ответ сервера словом»
принимает ключ: строка, вектор: строка, лента: строка, пропустить: число
возвращает строка
пример «ответа ещё нет»
дано ключ равно ""
дано вектор равно ""
дано лента равно ""
дано пропустить равно 0
ожидается "ЕЩЁ 0 "
тотальная функция «Запрос по полёту октетами»
принимает привет: строка, части: список строки, связка: строка, миллисекунды: число, узел: строка, запрос: строка
возвращает строка
пример «пустой полёт — не тот порядок сообщений, каков бы ни был запрос»
дано привет равно ""
дано части равно ["", "", "", "", "", "3"]
дано связка равно ""
дано миллисекунды равно 0
дано узел равно "a"
дано запрос равно "474554"
ожидается "ОТКАЗ FLANG_TLS_PROTOCOL нет EncryptedExtensions"
тотальная функция «Ответ сервера октетами»
принимает ключ: строка, вектор: строка, лента: строка, пропустить: число
возвращает строка
пример «ответа ещё нет — пустой текст»
дано ключ равно ""
дано вектор равно ""
дано лента равно ""
дано пропустить равно 0
ожидается "ЕЩЁ "
| Function | Termination | Claims |
|---|---|---|
| «Расширения привета клиента» | доказано композицией | доказано 0 из 1; «обвязка, имя и ключ» — сетка |
| «Привет клиента» | доказано композицией | доказано 0 из 1; «сообщение помечено типом 1, ClientHello» — сетка |
| «Запись привета» | доказано композицией | доказано 1 из 1 |
| «Приметы записей» | доказано композицией | — |
| «Вид записи» | доказано композицией | — |
| «Запись с места» | доказано композицией | — |
| «Записи ленты» | доказано композицией | — |
| «Есть Finished» | доказано композицией | — |
| «Ход» | доказано композицией | — |
| «Шаг полёта» | доказано композицией | — |
| «Шаг по виду» | доказано композицией | — |
| «Шаг закрытой записи» | доказано композицией | — |
| «Шаг потока» | доказано композицией | — |
| «Начало полёта» | доказано композицией | — |
| «Пройти полёт» | доказано композицией | — |
| «Случайное повтора» | доказано композицией | доказано 1 из 1 |
| «Привет сервера годен» | доказано композицией | — |
| «Тревога словом» | доказано композицией | — |
| «Полёт сервера» | доказано композицией | — |
| «Полёт по первой» | доказано композицией | — |
| «Полёт за приветом» | доказано композицией | — |
| «Полёт с ключом» | доказано композицией | — |
| «Приговор хода» | доказано композицией | — |
| «Полёт по ходу» | доказано композицией | — |
| «Итог полёта по коду» | доказано композицией | — |
| «Собрать полёт» | доказано композицией | — |
| «Полёт из хода» | доказано композицией | — |
| «Номера сертификатов» | доказано композицией | — |
| «Сертификаты сообщения» | доказано композицией | — |
| «Подпись из проверки» | доказано композицией | — |
| «Тип сообщения» | доказано композицией | — |
| «Сообщения полёта годны» | доказано композицией | — |
| «PSS сервера верна» | доказано композицией | — |
| «Проверка подписи сервера» | доказано композицией | — |
| «Первый сертификат» | доказано композицией | — |
| «До проверки» | доказано композицией | — |
| «Проверить полёт» | доказано композицией | — |
| «Проверить путь полёта» | доказано композицией | — |
| «Проверить подпись полёта» | доказано композицией | — |
| «Финиш сервера сошёлся» | доказано композицией | — |
| «Финиш клиента записью» | доказано композицией | — |
| «Запрос записью» | доказано композицией | — |
| «Ответ клиента» | доказано композицией | — |
| «Готово с ключами» | доказано композицией | — |
| «Отказ по приговору» | доказано композицией | — |
| «Финиш по готовому» | доказано композицией | — |
| «Шаг финиша по полёту» | доказано композицией | — |
| «Шаг финиша» | доказано композицией | — |
| «Запрос по готовому» | доказано композицией | — |
| «Запрос по проверенному» | доказано композицией | — |
| «Шаг рукопожатия» | доказано композицией | — |
| «Ответ» | доказано композицией | — |
| «Начало ответа» | доказано композицией | — |
| «Шаг ответа» | доказано композицией | — |
| «Шаг открытого ответа» | доказано композицией | — |
| «Ответ по тексту» | доказано композицией | — |
| «Отобрать» | доказано композицией | — |
| «Записи после» | доказано композицией | — |
| «Ответ сервера» | доказано композицией | — |
| «Шестнадцатеричная строка» | доказано композицией | доказано 0 из 1; «на каждый октет ровно два знака» — сетка |
| «Знак ASCII» | доказано композицией | — |
| «Шаг строки» | доказано композицией | — |
| «Первая строка» | доказано композицией | — |
| «Запрос GET» | доказано композицией | — |
| «Октеты привета» | доказано композицией | — |
| «Доверие из слов» | доказано композицией | — |
| «Привет клиента шестнадцатеричным» | доказано композицией | — |
| «Итог словом» | доказано композицией | — |
| «Полёт словами» | доказано композицией | — |
| «Финиш готового словом» | доказано композицией | — |
| «Финиш словом» | доказано композицией | — |
| «Полёт из слов» | доказано композицией | — |
| «Байт-список» | доказано композицией | — |
| «Строка по счёту» | доказано композицией | — |
| «Запрос по полёту словом» | доказано композицией | — |
| «Ответ сервера словом» | доказано композицией | — |
| «Запрос по полёту октетами» | доказано композицией | — |
| «Ответ сервера октетами» | доказано композицией | — |
«TLS handshake»
flang/stdlib/tls-handshake.flang — functions 54; ведомость не снялась: код 1 — FLANG_UNKNOWN_NAME, строка 87, столбец 3: неизвестная функция «Взять начало»
тип «Ход хвоста»
вариант «Ход хвоста» содержит место: число, последнее: число
тотальная функция «Начало хвоста»
возвращает «Ход хвоста»
обеспечивает «начало хвоста стоит на нуле» (результат.место) равен 0
обеспечивает «в начале ненулевого не найдено» (результат.последнее) равен 0
тотальная функция «Шаг хвоста»
принимает ход: «Ход хвоста», октет: число
возвращает «Ход хвоста»
обеспечивает «место двигается ровно на один» (результат.место) равен ((ход.место) плюс 1)
обеспечивает «нулевой октет последнего ненулевого не двигает» если октет равен 0 то ((результат.последнее) равен (ход.последнее)) иначе да
обеспечивает «ненулевой октет становится последним ненулевым» если не (октет равен 0) то ((результат.последнее) равен ((ход.место) плюс 1)) иначе да
пример «Нуль набивки последнего ненулевого не двигает»
дано ход равно вариант «Ход хвоста» с место равным 4 и последнее равным 3
дано октет равно 0
ожидается вариант «Ход хвоста» с место равным 5 и последнее равным 3
тотальная функция «Ход хвоста октетов»
принимает октеты: список числа
возвращает «Ход хвоста»
обеспечивает «пройдены все октеты» (результат.место) равен (длина октеты)
пример «Пустой кусок — ход остаётся в начале»
дано октеты равно пустой список
ожидается вариант «Ход хвоста» с место равным 0 и последнее равным 0
тотальная функция «Последний ненулевой»
принимает октеты: список числа
возвращает число
обеспечивает «место не за концом куска» результат не больше (длина октеты)
пример «Тип на самом конце, набивки нет»
дано октеты равно [1, 2, 22]
ожидается 3
тотальная функция «Внутренний тип»
принимает кусок: список числа
возвращает число
обеспечивает «ненулевых нет — типа нет» если («Последний ненулевой» от кусок) равен 0 то (результат равен 0) иначе да
пример «Рукопожатие под набивкой»
дано кусок равно [8, 0, 0, 2, 22, 0, 0]
ожидается 22
тотальная функция «Открытое без набивки»
принимает кусок: список числа
возвращает список числа
обеспечивает «открытого не больше, чем всего куска» (длина результат) не больше (длина кусок)
пример «Набивка и тип сняты»
дано кусок равно [8, 0, 0, 2, 22, 0, 0]
ожидается [8, 0, 0, 2]
тотальная функция «Внутренняя запись»
принимает содержимое: список числа, метка: число
возвращает список числа
обеспечивает «внутренняя запись на октет длиннее содержимого» (длина результат) равен ((длина содержимое) плюс 1)
пример «Рукопожатие»
дано содержимое равно [20, 0, 0, 2]
дано метка равно 22
ожидается [20, 0, 0, 2, 22]
тотальная функция «Добавочные записи»
принимает внутренних: число
возвращает список числа
обеспечивает «добавочные данные — пять октетов» (длина результат) равен 5
обеспечивает «наружный тип записи — 23, ApplicationData» (элемент 1 в результат) равен 23
пример «Тридцать семь октетов внутреннего текста»
дано внутренних равно 37
ожидается [23, 3, 3, 0, 53]
тотальная функция «Закрытая запись»
принимает ключ: список числа, вектор: список числа, номер: число, содержимое: список числа, метка: число
возвращает список числа
обеспечивает «запись длиннее содержимого ровно на двадцать два октета: пять заголовка, октет типа и шестнадцать тега» (длина результат) равен ((длина содержимое) плюс 22)
пример «RFC 8448, раздел 3: клиентская тревога close_notify, ключ данных клиента, запись номер один»
дано ключ равно [23, 66, 45, 218, 89, 110, 213, 217, 172, 216, 144, 227, 198, 63, 80, 81]
дано вектор равно [91, 120, 146, 61, 238, 8, 87, 144, 51, 229, 35, 217]
дано номер равно 1
дано содержимое равно [1, 0]
дано метка равно 21
ожидается [23, 3, 3, 0, 19, 201, 135, 39, 96, 101, 86, 102, 183, 77, 127, 241, 21, 62, 253, 109, 182, 208, 176, 227]
тотальная функция «Ключ Finished»
принимает секрет: список числа
возвращает список числа
обеспечивает «ключ Finished — ровно тридцать два октета» (длина результат) равен 32
пример «RFC 8448, раздел 3: ключ Finished сервера из секрета рукопожатия сервера»
дано секрет равно [182, 123, 125, 105, 12, 193, 108, 78, 117, 229, 66, 19, 203, 45, 55, 180, 233, 201, 18, 188, 222,
217, 16, 93, 66, 190, 253, 89, 211, 145, 173, 56]
ожидается [0, 141, 59, 102, 248, 22, 234, 85, 159, 150, 181, 55, 232, 133, 195, 31, 192, 104, 191, 73, 44, 101, 47,
1, 242, 136, 161, 216, 205, 193, 159, 200]
тотальная функция «Свод Finished по своду»
принимает секрет: список числа, свод: список числа
возвращает список числа
обеспечивает «свод Finished — ровно тридцать два октета» (длина результат) равен 32
тотальная функция «Свод Finished»
принимает секрет: список числа, стенограмма: список числа
возвращает список числа
обеспечивает «свод Finished — ровно тридцать два октета» (длина результат) равен 32
тип «Ход сверки»
вариант «Ход сверки» содержит место: число, сошлось: признак
тотальная функция «Начало сверки»
возвращает «Ход сверки»
обеспечивает «сверка начинается с первого места» (результат.место) равен 1
обеспечивает «до первого расхождения сверка сходится» (результат.сошлось) равен да
тотальная функция «Шаг сверки»
принимает ход: «Ход сверки», октет: число, другие: список числа
возвращает «Ход сверки»
обеспечивает «место двигается ровно на один» (результат.место) равен ((ход.место) плюс 1)
обеспечивает «разошедшееся не сходится обратно» если не (ход.сошлось) то ((результат.сошлось) равен нет) иначе да
пример «Октеты те же — сверка идёт дальше»
дано ход равно вариант «Ход сверки» с место равным 1 и сошлось равным да
дано октет равно 7
дано другие равно [7, 8]
ожидается вариант «Ход сверки» с место равным 2 и сошлось равным да
тотальная функция «Ход сверки октетов»
принимает первые: список числа, вторые: список числа
возвращает «Ход сверки»
обеспечивает «пройдены все октеты первого списка» (результат.место) равен ((длина первые) плюс 1)
пример «Два пустых списка — сверять нечего, и они сошлись»
дано первые равно пустой список
дано вторые равно пустой список
ожидается вариант «Ход сверки» с место равным 1 и сошлось равным да
тотальная функция «Октеты сошлись»
принимает первые: список числа, вторые: список числа
возвращает признак
обеспечивает «списки разной длины не сходятся» если не ((длина первые) равен (длина вторые)) то (результат равен нет) иначе да
пример «Те же октеты»
дано первые равно [1, 2, 3]
дано вторые равно [1, 2, 3]
ожидается да
тотальная функция «Finished сошёлся»
принимает секрет: список числа, свод: список числа, предъявлено: список числа
возвращает признак
обеспечивает «предъявленное не в тридцать два октета не сходится» если не ((длина предъявлено) равен 32) то (результат равен нет) иначе да
тотальная функция «Привязка подписи сервера»
возвращает список числа
обеспечивает «привязка — девяносто восемь октетов: 64 пробела, 33 знака и нулевой октет» (длина результат) равен 98
обеспечивает «привязка начинается с пробела» (элемент 1 в результат) равен 32
обеспечивает «шестьдесят четвёртый октет ещё пробел» (элемент 64 в результат) равен 32
обеспечивает «шестьдесят пятый октет — буква T» (элемент 65 в результат) равен 84
обеспечивает «привязка кончается нулевым октетом» (элемент 98 в результат) равен 0
тотальная функция «Подписываемое сервером по своду»
принимает свод: список числа
возвращает список числа
обеспечивает «подписываемое — привязка и свод» (длина результат) равен (98 плюс (длина свод))
тотальная функция «Подписываемое сервером»
принимает стенограмма: список числа
возвращает список числа
обеспечивает «подписываемое — сто тридцать октетов: 98 привязки и 32 свода» (длина результат) равен 130
тотальная функция «Два октета с места»
принимает лента: список числа, место: число
возвращает число
пример «Пятьдесят три»
дано лента равно [23, 3, 3, 0, 53]
дано место равно 4
ожидается 53
тотальная функция «Три октета с места»
принимает лента: список числа, место: число
возвращает число
пример «Четыреста тридцать два»
дано лента равно [0, 1, 176]
дано место равно 1
ожидается 432
тип «Обход записей»
вариант «Обход записей» содержит места: список числа, место: число
тотальная функция «Начало обхода записей»
возвращает «Обход записей»
обеспечивает «обход начинается с первого октета» (результат.место) равен 1
обеспечивает «в начале мест не отмечено» (результат.места) равен пустой список
тотальная функция «Длина записи с места»
принимает лента: список числа, место: число
возвращает число
пример «Пятьдесят три октета тела»
дано лента равно [23, 3, 3, 0, 53]
дано место равно 1
ожидается 53
тотальная функция «Запись с места целая»
принимает лента: список числа, место: число
возвращает признак
обеспечивает «за концом ленты целой записи нет» если место больше (длина лента) то (результат равен нет) иначе да
пример «Запись пришла целиком»
дано лента равно [23, 3, 3, 0, 2, 9, 9]
дано место равно 1
ожидается да
тотальная функция «Шаг обхода записей»
принимает ход: «Обход записей», лента: список числа
возвращает «Обход записей»
обеспечивает «мест прирастает не больше чем на одно» (длина результат.места) не больше ((длина ход.места) плюс 1)
обеспечивает «неполная запись обход останавливает» если не («Запись с места целая» от лента и (ход.место)) то (результат равен ход) иначе да
пример «Пустая лента — обход стоит на месте»
дано ход равно вариант «Обход записей» с места равным пустой список и место равным 1
дано лента равно пустой список
ожидается вариант «Обход записей» с места равным пустой список и место равным 1
тотальная функция «Ход по записям»
принимает лента: список числа
возвращает «Обход записей»
тотальная функция «Места записей»
принимает лента: список числа
возвращает список числа
пример «Две записи подряд»
дано лента равно [23, 3, 3, 0, 1, 7, 22, 3, 3, 0, 2, 8, 9]
ожидается [1, 7]
тотальная функция «Записей в ленте»
принимает лента: список числа
возвращает число
пример «Две записи»
дано лента равно [23, 3, 3, 0, 1, 7, 22, 3, 3, 0, 2, 8, 9]
ожидается 2
тотальная функция «Запись по счёту»
принимает лента: список числа, номер: число
возвращает список числа
обеспечивает «запись не длиннее ленты» (длина результат) не больше (длина лента)
обеспечивает «записи с таким номером нет — ни одного октета» если («Октет» от («Места записей» от лента) и номер) равен 0 то (результат равен пустой список) иначе да
пример «Вторая запись»
дано лента равно [23, 3, 3, 0, 1, 7, 22, 3, 3, 0, 2, 8, 9]
дано номер равно 2
ожидается [22, 3, 3, 0, 2, 8, 9]
тотальная функция «Октетов в целых записях»
принимает лента: список числа
возвращает число
пример «Вторая пришла не вся»
дано лента равно [23, 3, 3, 0, 1, 7, 22, 3, 3, 0, 9, 8]
ожидается 6
тотальная функция «Хвост ленты»
принимает лента: список числа
возвращает список числа
обеспечивает «хвост не длиннее ленты» (длина результат) не больше (длина лента)
пример «Недобранная вторая запись остаётся хвостом»
дано лента равно [23, 3, 3, 0, 1, 7, 22, 3, 3, 0, 9, 8]
ожидается [22, 3, 3, 0, 9, 8]
тип «Обход сообщений»
вариант «Обход сообщений» содержит места: список числа, место: число
тотальная функция «Начало обхода сообщений»
возвращает «Обход сообщений»
обеспечивает «обход начинается с первого октета» (результат.место) равен 1
обеспечивает «в начале мест не отмечено» (результат.места) равен пустой список
тотальная функция «Длина сообщения с места»
принимает тело: список числа, место: число
возвращает число
пример «Тридцать два октета Finished»
дано тело равно [20, 0, 0, 32]
дано место равно 1
ожидается 32
тотальная функция «Сообщение с места целое»
принимает тело: список числа, место: число
возвращает признак
обеспечивает «за концом тела целого сообщения нет» если место больше (длина тело) то (результат равен нет) иначе да
пример «Сообщение пришло целиком»
дано тело равно [8, 0, 0, 2, 0, 0]
дано место равно 1
ожидается да
тотальная функция «Шаг обхода сообщений»
принимает ход: «Обход сообщений», тело: список числа
возвращает «Обход сообщений»
обеспечивает «мест прирастает не больше чем на одно» (длина результат.места) не больше ((длина ход.места) плюс 1)
обеспечивает «неполное сообщение обход останавливает» если не («Сообщение с места целое» от тело и (ход.место)) то (результат равен ход) иначе да
пример «Пустое тело — обход стоит на месте»
дано ход равно вариант «Обход сообщений» с места равным пустой список и место равным 1
дано тело равно пустой список
ожидается вариант «Обход сообщений» с места равным пустой список и место равным 1
тотальная функция «Ход по сообщениям»
принимает тело: список числа
возвращает «Обход сообщений»
тотальная функция «Места сообщений»
принимает тело: список числа
возвращает список числа
пример «Два сообщения подряд»
дано тело равно [8, 0, 0, 2, 0, 0, 20, 0, 0, 1, 7]
ожидается [1, 7]
тотальная функция «Сообщений в теле»
принимает тело: список числа
возвращает число
пример «Два сообщения»
дано тело равно [8, 0, 0, 2, 0, 0, 20, 0, 0, 1, 7]
ожидается 2
тотальная функция «Сообщение по счёту»
принимает тело: список числа, номер: число
возвращает список числа
обеспечивает «сообщение не длиннее тела» (длина результат) не больше (длина тело)
обеспечивает «сообщения с таким номером нет — ни одного октета» если («Октет» от («Места сообщений» от тело) и номер) равен 0 то (результат равен пустой список) иначе да
пример «Второе сообщение»
дано тело равно [8, 0, 0, 2, 0, 0, 20, 0, 0, 1, 7]
дано номер равно 2
ожидается [20, 0, 0, 1, 7]
тотальная функция «Длина справки о запросе»
принимает сообщение: список числа
возвращает число
пример «Справка пуста»
дано сообщение равно [11, 0, 1, 185, 0]
ожидается 0
тотальная функция «Место первого сертификата»
принимает сообщение: список числа
возвращает число
пример «Справка пуста — перечень с девятого октета»
дано сообщение равно [11, 0, 1, 185, 0, 0, 1, 181, 0, 1, 176]
ожидается 9
тотальная функция «Длина сертификата с места»
принимает сообщение: список числа, место: число
возвращает число
пример «Четыреста тридцать два октета DER»
дано сообщение равно [11, 0, 1, 185, 0, 0, 1, 181, 0, 1, 176]
дано место равно 9
ожидается 432
тотальная функция «Сертификат с места целый»
принимает сообщение: список числа, место: число
возвращает признак
обеспечивает «за концом сообщения целого сертификата нет» если место больше (длина сообщение) то (результат равен нет) иначе да
пример «Сертификат и его расширения пришли целиком»
дано сообщение равно [11, 0, 0, 12, 0, 0, 0, 8, 0, 0, 2, 48, 1, 0, 0]
дано место равно 9
ожидается да
тотальная функция «Шаг обхода сертификатов»
принимает ход: «Обход сообщений», сообщение: список числа
возвращает «Обход сообщений»
обеспечивает «мест прирастает не больше чем на одно» (длина результат.места) не больше ((длина ход.места) плюс 1)
обеспечивает «неполный сертификат обход останавливает» если не («Сертификат с места целый» от сообщение и (ход.место)) то (результат равен ход) иначе да
пример «Пустое сообщение — обход стоит на месте»
дано ход равно вариант «Обход сообщений» с места равным пустой список и место равным 1
дано сообщение равно пустой список
ожидается вариант «Обход сообщений» с места равным пустой список и место равным 1
тотальная функция «Ход по сертификатам»
принимает сообщение: список числа
возвращает «Обход сообщений»
тотальная функция «Места сертификатов»
принимает сообщение: список числа
возвращает список числа
пример «Один сертификат в два октета»
дано сообщение равно [11, 0, 0, 12, 0, 0, 0, 8, 0, 0, 2, 48, 1, 0, 0]
ожидается [9]
тотальная функция «Сертификатов в сообщении»
принимает сообщение: список числа
возвращает число
пример «Один сертификат»
дано сообщение равно [11, 0, 0, 12, 0, 0, 0, 8, 0, 0, 2, 48, 1, 0, 0]
ожидается 1
тотальная функция «Сертификат по счёту»
принимает сообщение: список числа, номер: число
возвращает список числа
обеспечивает «сертификат не длиннее сообщения» (длина результат) не больше (длина сообщение)
обеспечивает «сертификата с таким номером нет — ни одного октета» если («Октет» от («Места сертификатов» от сообщение) и номер) равен 0 то (результат равен пустой список) иначе да
пример «Первый сертификат»
дано сообщение равно [11, 0, 0, 12, 0, 0, 0, 8, 0, 0, 2, 48, 1, 0, 0]
дано номер равно 1
ожидается [48, 1]
тотальная функция «Расширение имени узла»
принимает имя: список числа
возвращает список числа
обеспечивает «девять октетов обвязки и само имя» (длина результат) равен (9 плюс (длина имя))
пример «Имя из шести знаков — server»
дано имя равно [115, 101, 114, 118, 101, 114]
ожидается [0, 0, 0, 11, 0, 9, 0, 0, 6, 115, 101, 114, 118, 101, 114]
тотальная функция «Расширение подписей двух видов»
возвращает список числа
обеспечивает «десять октетов» (длина результат) равен 10
обеспечивает «номер расширения — 13, signature_algorithms» (элемент 2 в результат) равен 13
тотальная функция «Расширения привета с именем»
принимает открытый: список числа, имя: список числа
возвращает список числа
обеспечивает «расширений ровно на обвязку имени, три постоянных и долю ключа» (длина результат) равен ((((9 плюс (длина имя)) плюс 7) плюс 8) плюс (10 плюс (10 плюс (длина открытый))))
тотальная функция «Тело привета с именем»
принимает случайное: список числа, сессия: список числа, открытый: список числа, имя: список числа
возвращает список числа
тотальная функция «Привет с именем»
принимает случайное: список числа, сессия: список числа, открытый: список числа, имя: список числа
возвращает список числа
обеспечивает «запись на пять октетов длиннее тела рукопожатия» (длина результат) равен (5 плюс (длина («Тело привета с именем» от случайное и сессия и открытый и имя)))
| Function | Termination | Claims |
|---|---|---|
| «Начало хвоста» | — | — |
| «Шаг хвоста» | — | — |
| «Ход хвоста октетов» | — | — |
| «Последний ненулевой» | — | — |
| «Внутренний тип» | — | — |
| «Открытое без набивки» | — | — |
| «Внутренняя запись» | — | — |
| «Добавочные записи» | — | — |
| «Закрытая запись» | — | — |
| «Ключ Finished» | — | — |
| «Свод Finished по своду» | — | — |
| «Свод Finished» | — | — |
| «Начало сверки» | — | — |
| «Шаг сверки» | — | — |
| «Ход сверки октетов» | — | — |
| «Октеты сошлись» | — | — |
| «Finished сошёлся» | — | — |
| «Привязка подписи сервера» | — | — |
| «Подписываемое сервером по своду» | — | — |
| «Подписываемое сервером» | — | — |
| «Два октета с места» | — | — |
| «Три октета с места» | — | — |
| «Начало обхода записей» | — | — |
| «Длина записи с места» | — | — |
| «Запись с места целая» | — | — |
| «Шаг обхода записей» | — | — |
| «Ход по записям» | — | — |
| «Места записей» | — | — |
| «Записей в ленте» | — | — |
| «Запись по счёту» | — | — |
| «Октетов в целых записях» | — | — |
| «Хвост ленты» | — | — |
| «Начало обхода сообщений» | — | — |
| «Длина сообщения с места» | — | — |
| «Сообщение с места целое» | — | — |
| «Шаг обхода сообщений» | — | — |
| «Ход по сообщениям» | — | — |
| «Места сообщений» | — | — |
| «Сообщений в теле» | — | — |
| «Сообщение по счёту» | — | — |
| «Длина справки о запросе» | — | — |
| «Место первого сертификата» | — | — |
| «Длина сертификата с места» | — | — |
| «Сертификат с места целый» | — | — |
| «Шаг обхода сертификатов» | — | — |
| «Ход по сертификатам» | — | — |
| «Места сертификатов» | — | — |
| «Сертификатов в сообщении» | — | — |
| «Сертификат по счёту» | — | — |
| «Расширение имени узла» | — | — |
| «Расширение подписей двух видов» | — | — |
| «Расширения привета с именем» | — | — |
| «Тело привета с именем» | — | — |
| «Привет с именем» | — | — |
«TLS records»
flang/stdlib/tls.flang — functions 103; ведомость не снялась: код 1 — FLANG_UNKNOWN_NAME, строка 87, столбец 3: неизвестная функция «Взять начало»
тотальная функция «Знак шестнадцати»
принимает н: число
возвращает строка
обеспечивает «знак — ровно один» (длина результат) равен 1
обеспечивает «вне азбуки — вопросительный знак» если (н меньше 0) или (н больше 15) то (результат равен "?") иначе да
пример «Ноль»
дано н равно 0
ожидается "0"
тотальная функция «Октет заглавными»
принимает октет: число
возвращает строка
обеспечивает «октет печатается ровно двумя знаками» (длина результат) равен 2
пример «Ноль»
дано октет равно 0
ожидается "00"
тотальная функция «Шаг октетов заглавными»
принимает набрано: строка, октет: число
возвращает строка
обеспечивает «набранное не укорачивается» (длина набрано) не больше (длина результат)
обеспечивает «шаг прибавляет ровно два знака» (длина результат) равен ((длина набрано) плюс 2)
пример «К пустому приписывается пара заглавных знаков»
дано набрано равно ""
дано октет равно 22
ожидается "16"
тотальная функция «Октеты заглавными»
принимает октеты: список числа
возвращает строка
обеспечивает «на каждый октет ровно два знака» (длина результат) равен ((длина октеты) умножить на 2)
пример «Пусто»
дано октеты равно пустой список
ожидается ""
тотальная функция «Шаг слития»
принимает набрано: список числа, октет: число
возвращает список числа
обеспечивает «шаг удлиняет ровно на один» (длина результат) равен ((длина набрано) плюс 1)
пример «Октет дописывается в хвост»
дано набрано равно [22, 3]
дано октет равно 1
ожидается [22, 3, 1]
тотальная функция «Слить октеты»
принимает первый: список числа, второй: список числа
возвращает список числа
обеспечивает «длина склейки — сумма длин» (длина результат) равен ((длина первый) плюс (длина второй))
пример «Заголовок и тело»
дано первый равно [22, 3, 1]
дано второй равно [0, 5]
ожидается [22, 3, 1, 0, 5]
тотальная функция «Тип записи»
принимает октеты: список числа
возвращает число
обеспечивает «тип — один октет, значит меньше двухсот пятидесяти шести» результат меньше 256
обеспечивает «за концом ленты тип нулевой» если (1 меньше 1) или (1 больше (длина октеты)) то результат равен 0 иначе да
пример «Рукопожатие»
дано октеты равно [22, 3, 1, 0, 5]
ожидается 22
тотальная функция «Имя типа записи»
принимает метка: число
возвращает строка
обеспечивает «имя не пустое» (длина результат) больше 0
обеспечивает «чужой тип записи назван чужим» если (метка меньше 20) или (метка больше 24) то результат равен "неизвестный тип" иначе да
обеспечивает «свой тип записи берётся из таблицы» если не ((метка меньше 20) или (метка больше 24)) то (результат равен (элемент (метка минус 19) в ["ChangeCipherSpec", "Alert", "Handshake", "ApplicationData", "Heartbeat"])) иначе да
пример «Двадцать два — рукопожатие»
дано метка равно 22
ожидается "Handshake"
тотальная функция «Версия записи»
принимает октеты: список числа
возвращает число
обеспечивает «версия — два октета, значит меньше 65536» результат меньше 65536
пример «0x0301 — так помечена первая запись клиента»
дано октеты равно [22, 3, 1, 0, 5]
ожидается 769
тотальная функция «Версия словом»
принимает версия: число
возвращает строка
обеспечивает «имя не пустое» (длина результат) больше 0
обеспечивает «чужая версия названа чужой» если (версия меньше 768) или (версия больше 772) то результат равен "неизвестная версия" иначе да
обеспечивает «своя версия берётся из таблицы» если не ((версия меньше 768) или (версия больше 772)) то (результат равен (элемент (версия минус 767) в ["SSL 3.0", "TLS 1.0", "TLS 1.1", "TLS 1.2", "TLS 1.3"])) иначе да
пример «772 — это TLS 1.3»
дано версия равно 772
ожидается "TLS 1.3"
тотальная функция «Длина записи»
принимает октеты: список числа
возвращает число
обеспечивает «длина — два октета, значит меньше 65536» результат меньше 65536
пример «Пять»
дано октеты равно [22, 3, 1, 0, 5]
ожидается 5
тотальная функция «Тело записи»
принимает октеты: список числа
возвращает список числа
обеспечивает «тело не длиннее заявленного» (длина результат) не больше («Длина записи» от октеты)
обеспечивает «тело не длиннее всей ленты» (длина результат) не больше (длина октеты)
пример «Три октета тела»
дано октеты равно [22, 3, 1, 0, 3, 1, 2, 3]
ожидается [1, 2, 3]
тотальная функция «Запись целая»
принимает октеты: список числа
возвращает признак
обеспечивает «целая запись длиной не меньше пяти» если результат то (длина октеты) не меньше 5 иначе да
пример «Пришло ровно столько, сколько обещано»
дано октеты равно [22, 3, 1, 0, 3, 1, 2, 3]
ожидается да
тотальная функция «Заголовок записи»
принимает метка: число, версия: число, сколько: число
возвращает список числа
обеспечивает «длина заголовка пять октетов» (длина результат) равен 5
пример «Рукопожатие, TLS 1.0, двести двадцать один октет»
дано метка равно 22
дано версия равно 769
дано сколько равно 221
ожидается [22, 3, 1, 0, 221]
тотальная функция «Собрать запись»
принимает метка: число, версия: число, тело: список числа
возвращает список числа
обеспечивает «собранная запись на пять октетов длиннее тела» (длина результат) равен ((длина тело) плюс 5)
пример «Смена шифра — один октет тела»
дано метка равно 20
дано версия равно 771
дано тело равно [1]
ожидается [20, 3, 3, 0, 1, 1]
тотальная функция «Тип рукопожатия»
принимает тело: список числа
возвращает число
обеспечивает «тип — один октет» результат меньше 256
обеспечивает «за концом тела тип рукопожатия нулевой» если (1 меньше 1) или (1 больше (длина тело)) то результат равен 0 иначе да
пример «Единица — привет клиента»
дано тело равно [1, 0, 0, 217, 3, 3]
ожидается 1
тотальная функция «Имя типа рукопожатия»
принимает метка: число
возвращает строка
обеспечивает «имя не пустое» (длина результат) больше 0
обеспечивает «чужое сообщение названо чужим» если (метка меньше 1) или (метка больше 20) то результат равен "неизвестное сообщение" иначе да
обеспечивает «своё сообщение берётся из таблицы» если не ((метка меньше 1) или (метка больше 20)) то (результат равен (элемент метка в ["ClientHello", "ServerHello", "неизвестное сообщение", "NewSessionTicket", "EndOfEarlyData", "неизвестное сообщение", "неизвестное сообщение", "EncryptedExtensions", "неизвестное сообщение", "неизвестное сообщение", "Certificate", "неизвестное сообщение", "CertificateRequest", "неизвестное сообщение", "CertificateVerify", "неизвестное сообщение", "неизвестное сообщение", "неизвестное сообщение", "неизвестное сообщение", "Finished"])) иначе да
пример «Привет клиента»
дано метка равно 1
ожидается "ClientHello"
тотальная функция «Длина рукопожатия»
принимает тело: список числа
возвращает число
обеспечивает «длина — три октета, значит меньше 16777216» результат меньше 16777216
пример «Двести семнадцать»
дано тело равно [1, 0, 0, 217, 3, 3]
ожидается 217
тотальная функция «Версия привета»
принимает тело: список числа
возвращает число
обеспечивает «версия — два октета» результат меньше 65536
пример «0x0303 — обе стороны TLS 1.3 пишут здесь 1.2»
дано тело равно [1, 0, 0, 217, 3, 3, 12, 8]
ожидается 771
тотальная функция «Метка времени привета»
принимает тело: список числа
возвращает число
обеспечивает «метка — четыре октета» результат меньше 4294967296
пример «0x0C08F5B3»
дано тело равно [1, 0, 0, 217, 3, 3, 12, 8, 245, 179, 170]
ожидается 201913779
тотальная функция «Случайное число»
принимает тело: список числа
возвращает список числа
обеспечивает «случайное число не длиннее тридцати двух октетов» (длина результат) не больше 32
обеспечивает «случайное число не длиннее тела» (длина результат) не больше (длина тело)
пример «Короткого тела не хватает на тридцать два октета»
дано тело равно [1, 0, 0, 217, 3, 3, 12, 8]
ожидается [12, 8]
тотальная функция «Случайные октеты»
принимает тело: список числа
возвращает список числа
обеспечивает «случайных октетов не больше двадцати восьми» (длина результат) не больше 28
обеспечивает «случайных октетов не больше, чем всего тела» (длина результат) не больше (длина тело)
пример «Короткого тела не хватает и на них»
дано тело равно [1, 0, 0, 217, 3, 3, 12, 8, 245, 179, 170, 75]
ожидается [170, 75]
тотальная функция «Длина сессии»
принимает тело: список числа
возвращает число
обеспечивает «длина сессии — один октет» результат меньше 256
обеспечивает «за концом тела длина сессии нулевая» если (39 меньше 1) или (39 больше (длина тело)) то результат равен 0 иначе да
пример «Тридцать два — так шлют и клиент, и сервер»
дано тело равно [1, 0, 0, 217, 3, 3, 12, 8, 245, 179, 170, 75, 167, 250, 124, 194, 206, 223, 189, 145, 169, 199,
230, 29, 51, 212, 71, 87, 134, 207, 120, 191, 124, 22, 86, 144, 95, 93, 32]
ожидается 32
тотальная функция «Идентификатор сессии»
принимает тело: список числа
возвращает список числа
обеспечивает «идентификатор не длиннее заявленного» (длина результат) не больше («Длина сессии» от тело)
обеспечивает «идентификатор не длиннее тела» (длина результат) не больше (длина тело)
пример «Пустого тела хватает на пустой идентификатор»
дано тело равно пустой список
ожидается пустой список
тотальная функция «Место после сессии»
принимает тело: список числа
возвращает число
обеспечивает «место после сессии не раньше сорокового октета» результат не меньше 40
пример «Идентификатор в тридцать два октета»
дано тело равно [1, 0, 0, 217, 3, 3, 12, 8, 245, 179, 170, 75, 167, 250, 124, 194, 206, 223, 189, 145, 169, 199,
230, 29, 51, 212, 71, 87, 134, 207, 120, 191, 124, 22, 86, 144, 95, 93, 32]
ожидается 72
тотальная функция «Длина наборов»
принимает тело: список числа
возвращает число
обеспечивает «длина наборов — два октета» результат меньше 65536
пример «Пустое тело — ноль, а не падение»
дано тело равно пустой список
ожидается 0
тотальная функция «Наборы шифров»
принимает тело: список числа
возвращает список числа
обеспечивает «наборов не больше заявленного» (длина результат) не больше («Длина наборов» от тело)
обеспечивает «наборы не длиннее тела» (длина результат) не больше (длина тело)
пример «Пустое тело — ни одного набора»
дано тело равно пустой список
ожидается пустой список
тотальная функция «Место сжатия»
принимает тело: список числа
возвращает число
обеспечивает «место сжатия за наборами» результат больше («Место после сессии» от тело)
пример «Шесть октетов наборов»
дано тело равно пустой список
ожидается 42
тотальная функция «Длина сжатия»
принимает тело: список числа
возвращает число
обеспечивает «длина сжатия — один октет» результат меньше 256
обеспечивает «за концом тела длина сжатия нулевая» если ((«Место сжатия» от тело) меньше 1) или ((«Место сжатия» от тело) больше (длина тело)) то результат равен 0 иначе да
пример «Пустое тело — ноль»
дано тело равно пустой список
ожидается 0
тотальная функция «Место расширений клиента»
принимает тело: список числа
возвращает число
обеспечивает «расширения за сжатием» результат больше («Место сжатия» от тело)
пример «Пустое тело»
дано тело равно пустой список
ожидается 43
тотальная функция «Длина расширений клиента»
принимает тело: список числа
возвращает число
обеспечивает «длина расширений — два октета» результат меньше 65536
пример «Пустое тело — ноль»
дано тело равно пустой список
ожидается 0
тотальная функция «Расширения клиента»
принимает тело: список числа
возвращает список числа
обеспечивает «расширений не больше заявленного» (длина результат) не больше («Длина расширений клиента» от тело)
обеспечивает «расширения клиента не длиннее тела» (длина результат) не больше (длина тело)
пример «Пустое тело — ни одного расширения»
дано тело равно пустой список
ожидается пустой список
тотальная функция «Набор сервера»
принимает тело: список числа
возвращает число
обеспечивает «набор — два октета» результат меньше 65536
пример «Пустое тело — ноль»
дано тело равно пустой список
ожидается 0
тотальная функция «Сжатие сервера»
принимает тело: список числа
возвращает число
обеспечивает «способ сжатия — один октет» результат меньше 256
обеспечивает «за концом тела способ сжатия нулевой» если ((2 плюс («Место после сессии» от тело)) меньше 1) или ((2 плюс («Место после сессии» от тело)) больше (длина тело)) то результат равен 0 иначе да
пример «Пустое тело — ноль, он же способ без сжатия»
дано тело равно пустой список
ожидается 0
тотальная функция «Место расширений сервера»
принимает тело: список числа
возвращает число
обеспечивает «расширения за набором и сжатием» результат равен (3 плюс («Место после сессии» от тело))
пример «Пустое тело»
дано тело равно пустой список
ожидается 43
тотальная функция «Длина расширений сервера»
принимает тело: список числа
возвращает число
обеспечивает «длина расширений — два октета» результат меньше 65536
пример «Пустое тело — ноль»
дано тело равно пустой список
ожидается 0
тотальная функция «Расширения сервера»
принимает тело: список числа
возвращает список числа
обеспечивает «расширений не больше заявленного» (длина результат) не больше («Длина расширений сервера» от тело)
обеспечивает «расширения сервера не длиннее тела» (длина результат) не больше (длина тело)
пример «Пустое тело — ни одного расширения»
дано тело равно пустой список
ожидается пустой список
объект «Ход пар»
«старший»: число
«ждём младший»: признак
«пары»: список числа
тотальная функция «Шаг пар»
принимает ход: «Ход пар», октет: число
возвращает «Ход пар»
обеспечивает «после каждого шага ждём меняется на противоположное» результат.«ждём младший» равен (не ход.«ждём младший»)
обеспечивает «ждали младший — пар стало на одну больше» если ход.«ждём младший» то ((длина результат.«пары») равен ((длина ход.«пары») плюс 1)) иначе да
обеспечивает «ждали старший — пары не тронуты» если не (ход.«ждём младший») то (результат.«пары» равен ход.«пары») иначе да
обеспечивает «ждали старший — октет запоминается старшим» если не (ход.«ждём младший») то (результат.«старший» равен октет) иначе да
обеспечивает «пар прирастает не больше чем на одну» (длина результат.«пары») не больше ((длина ход.«пары») плюс 1)
пример «Старший октет запоминается»
дано ход равно запись «Ход пар» с «старший» равным 0 и «ждём младший» равным нет и «пары» равным пустой список
дано октет равно 19
ожидается запись «Ход пар» с «старший» равным 19 и «ждём младший» равным да и «пары» равным пустой список
тотальная функция «Ход по парам»
принимает октеты: список числа
возвращает «Ход пар»
обеспечивает «набранных пар не больше, чем октетов» (длина результат.«пары») не больше (длина октеты)
пример «Три набора шифров»
дано октеты равно [19, 2, 19, 3, 19, 1]
ожидается запись «Ход пар» с «старший» равным 19 и «ждём младший» равным нет и «пары» равным [4866, 4867, 4865]
тотальная функция «Пары октетов»
принимает октеты: список числа
возвращает список числа
обеспечивает «пар вдвое меньше октетов» (длина результат) равен («Делить нацело» от (длина октеты) и 2)
обеспечивает «пар не больше, чем октетов» (длина результат) не больше (длина октеты)
пример «Три набора шифров»
дано октеты равно [19, 2, 19, 3, 19, 1]
ожидается [4866, 4867, 4865]
тотальная функция «Набор словом»
принимает код: число
возвращает строка
обеспечивает «имя не пустое» (длина результат) больше 0
обеспечивает «чужой набор назван чужим» если (код меньше 4865) или (код больше 4869) то результат равен "неизвестный набор" иначе да
обеспечивает «свой набор берётся из таблицы» если не ((код меньше 4865) или (код больше 4869)) то (результат равен (элемент (код минус 4864) в ["TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256", "TLS_AES_128_CCM_SHA256", "TLS_AES_128_CCM_8_SHA256"])) иначе да
пример «0x1301»
дано код равно 4865
ожидается "TLS_AES_128_GCM_SHA256"
тотальная функция «Группа словом»
принимает код: число
возвращает строка
обеспечивает «имя не пустое» (длина результат) больше 0
обеспечивает «двадцать три — P-256» если код равен 23 то (результат равен "secp256r1 (P-256)") иначе да
обеспечивает «двадцать четыре — P-384» если не (код равен 23) то (если код равен 24 то (результат равен "secp384r1 (P-384)") иначе да) иначе да
обеспечивает «двадцать пять — P-521» если не (код равен 23) то (если не (код равен 24) то (если код равен 25 то (результат равен "secp521r1 (P-521)") иначе да) иначе да) иначе да
обеспечивает «двадцать девять — x25519» если не (код равен 23) то (если не (код равен 24) то (если не (код равен 25) то (если код равен 29 то (результат равен "ecdh_x25519") иначе да) иначе да) иначе да) иначе да
пример «Двадцать девять — x25519, тот самый, что уже есть в дереве»
дано код равно 29
ожидается "ecdh_x25519"
тотальная функция «Имя расширения»
принимает метка: число
возвращает строка
обеспечивает «имя не пустое» (длина результат) больше 0
обеспечивает «чужое расширение названо чужим» если (метка меньше 0) или (метка больше 51) то результат равен "неизвестное расширение" иначе да
обеспечивает «свой номер расширения берётся из таблицы» если не ((метка меньше 0) или (метка больше 51)) то (результат равен (элемент (метка плюс 1) в [
"server_name", "max_fragment_length", "неизвестное расширение", "неизвестное расширение",
"неизвестное расширение", "status_request", "неизвестное расширение", "неизвестное расширение",
"неизвестное расширение", "неизвестное расширение", "supported_groups", "ec_point_formats",
"неизвестное расширение", "signature_algorithms", "use_srtp", "heartbeat",
"application_layer_protocol_negotiation", "неизвестное расширение", "signed_certificate_timestamp",
"client_certificate_type",
"server_certificate_type", "padding", "encrypt_then_mac", "extended_master_secret",
"неизвестное расширение", "неизвестное расширение", "неизвестное расширение", "compress_certificate",
"record_size_limit", "неизвестное расширение", "неизвестное расширение", "неизвестное расширение",
"неизвестное расширение", "неизвестное расширение", "неизвестное расширение", "session_ticket",
"неизвестное расширение", "неизвестное расширение", "неизвестное расширение", "неизвестное расширение",
"неизвестное расширение", "pre_shared_key", "early_data", "supported_versions",
"cookie", "psk_key_exchange_modes", "неизвестное расширение", "certificate_authorities",
"oid_filters", "post_handshake_auth", "signature_algorithms_cert", "key_share"])) иначе да
пример «Ноль — имя сервера»
дано метка равно 0
ожидается "server_name"
тотальная функция «Печать наборов»
принимает коды: список числа
возвращает строка
обеспечивает «пустой перечень печатается пусто» если (длина коды) равен 0 то (длина результат) равен 0 иначе да
пример «Три набора видом openssl»
дано коды равно [4866, 4867, 4865]
ожидается "\n {0x13, 0x02} TLS_AES_256_GCM_SHA384\n {0x13, 0x03} TLS_CHACHA20_POLY1305_SHA256\n {0x13, 0x01} TLS_AES_128_GCM_SHA256"
тотальная функция «Печать версий»
принимает коды: список числа
возвращает строка
обеспечивает «пустой перечень печатается пусто» если (длина коды) равен 0 то (длина результат) равен 0 иначе да
пример «Одна версия видом openssl»
дано коды равно [772]
ожидается "\n TLS 1.3 (772)"
тотальная функция «Тип расширения в месте»
принимает расширения: список числа, место: число
возвращает число
обеспечивает «тип — два октета» результат меньше 65536
пример «Первое расширение — ec_point_formats»
дано расширения равно [0, 11, 0, 4, 3, 0, 1, 2]
дано место равно 1
ожидается 11
тотальная функция «Длина расширения в месте»
принимает расширения: список числа, место: число
возвращает число
обеспечивает «длина — два октета» результат меньше 65536
пример «Первое расширение — четыре октета содержимого»
дано расширения равно [0, 11, 0, 4, 3, 0, 1, 2]
дано место равно 1
ожидается 4
объект «Ход расширений»
«номер»: число
«место»: число
«сколько»: число
«печать»: строка
тотальная функция «Шаг расширений»
принимает ход: «Ход расширений», расширения: список числа
возвращает «Ход расширений»
обеспечивает «номер подвинулся ровно на один» результат.«номер» равен (ход.«номер» плюс 1)
обеспечивает «октет вне заголовка места не двигает» если не (ход.«номер» равен ход.«место») то (результат.«место» равен ход.«место») иначе да
обеспечивает «октет вне заголовка расширений не прибавляет» если не (ход.«номер» равен ход.«место») то (результат.«сколько» равен ход.«сколько») иначе да
обеспечивает «октет вне заголовка печати не трогает» если не (ход.«номер» равен ход.«место») то (результат.«печать» равен ход.«печать») иначе да
обеспечивает «октет, начинающий расширение, прибавляет ровно одно» если ход.«номер» равен ход.«место» то (результат.«сколько» равен (ход.«сколько» плюс 1)) иначе да
пример «Октет вне заголовка ничего не меняет, кроме номера»
дано ход равно запись «Ход расширений» с «номер» равным 2 и «место» равным 1 и «сколько» равным 0 и «печать» равным ""
дано расширения равно [0, 11, 0, 4, 3, 0, 1, 2]
ожидается запись «Ход расширений» с «номер» равным 3 и «место» равным 1 и «сколько» равным 0 и «печать» равным ""
тотальная функция «Обход расширений»
принимает расширения: список числа
возвращает «Ход расширений»
обеспечивает «пройден весь перечень, номер стал длиной плюс один» результат.«номер» равен ((длина расширения) плюс 1)
пример «Одно расширение»
дано расширения равно [0, 11, 0, 4, 3, 0, 1, 2]
ожидается запись «Ход расширений» с «номер» равным 9 и «место» равным 9 и «сколько» равным 1 и «печать» равным "\n extension_type=ec_point_formats(11), length=4"
тотальная функция «Печать расширений»
принимает расширения: список числа
возвращает строка
обеспечивает «пустой перечень печатается пусто» если (длина расширения) равен 0 то (длина результат) равен 0 иначе да
пример «Два расширения подряд»
дано расширения равно [0, 43, 0, 2, 3, 4, 0, 51, 0, 0]
ожидается "\n extension_type=supported_versions(43), length=2\n extension_type=key_share(51), length=0"
тотальная функция «Сколько расширений»
принимает расширения: список числа
возвращает число
обеспечивает «расширений не больше, чем четвертей перечня» результат не больше (длина расширения)
пример «Два расширения»
дано расширения равно [0, 43, 0, 2, 3, 4, 0, 51, 0, 0]
ожидается 2
объект «Ход поиска»
«номер»: число
«место»: число
«начало»: число
«длина»: число
«есть»: признак
тотальная функция «Шаг поиска»
принимает ход: «Ход поиска», расширения: список числа, искомый: число
возвращает «Ход поиска»
обеспечивает «номер подвинулся ровно на один» результат.«номер» равен (ход.«номер» плюс 1)
обеспечивает «октет вне заголовка места поиска не двигает» если не (ход.«номер» равен ход.«место») то (результат.«место» равен ход.«место») иначе да
обеспечивает «октет вне заголовка находки не меняет» если не (ход.«номер» равен ход.«место») то (результат.«есть» равен ход.«есть») иначе да
обеспечивает «октет вне заголовка начала не меняет» если не (ход.«номер» равен ход.«место») то (результат.«начало» равен ход.«начало») иначе да
обеспечивает «октет вне заголовка длины не меняет» если не (ход.«номер» равен ход.«место») то (результат.«длина» равен ход.«длина») иначе да
пример «Не то расширение — место сдвигается, находка не меняется»
дано ход равно запись «Ход поиска» с «номер» равным 1 и «место» равным 1 и «начало» равным 0 и «длина» равным 0 и «есть» равным нет
дано расширения равно [0, 11, 0, 4, 3, 0, 1, 2]
дано искомый равно 43
ожидается запись «Ход поиска» с «номер» равным 2 и «место» равным 9 и «начало» равным 0 и «длина» равным 0 и «есть» равным нет
тотальная функция «Поиск расширения»
принимает расширения: список числа, метка: число
возвращает «Ход поиска»
обеспечивает «пройден весь перечень, номер стал длиной плюс один» результат.«номер» равен ((длина расширения) плюс 1)
пример «Расширение нашлось вторым»
дано расширения равно [0, 11, 0, 1, 0, 0, 43, 0, 2, 3, 4]
дано метка равно 43
ожидается запись «Ход поиска» с «номер» равным 12 и «место» равным 12 и «начало» равным 10 и «длина» равным 2 и «есть» равным да
тотальная функция «Есть расширение»
принимает расширения: список числа, метка: число
возвращает признак
пример «Такого расширения нет»
дано расширения равно [0, 11, 0, 1, 0]
дано метка равно 43
ожидается нет
тотальная функция «Содержимое расширения»
принимает расширения: список числа, метка: число
возвращает список числа
обеспечивает «содержимое не длиннее перечня» (длина результат) не больше (длина расширения)
обеспечивает «нет такого расширения — нет и содержимого» если не ((«Поиск расширения» от расширения и метка).«есть») то (длина результат) равен 0 иначе да
обеспечивает «нет такого расширения — содержимое пустой список» если не ((«Поиск расширения» от расширения и метка).«есть») то (результат равен пустой список) иначе да
пример «Содержимое supported_versions сервера — две версии одним числом»
дано расширения равно [0, 11, 0, 1, 0, 0, 43, 0, 2, 3, 4]
дано метка равно 43
ожидается [3, 4]
тотальная функция «Версии клиента»
принимает расширения: список числа
возвращает список числа
обеспечивает «версий не больше половины содержимого» (длина результат) не больше (длина расширения)
пример «Одна версия — TLS 1.3»
дано расширения равно [0, 43, 0, 3, 2, 3, 4]
ожидается [772]
тотальная функция «Версия сервера»
принимает расширения: список числа
возвращает число
обеспечивает «версия — два октета» результат меньше 65536
пример «TLS 1.3»
дано расширения равно [0, 43, 0, 2, 3, 4]
ожидается 772
тотальная функция «Группа клиента»
принимает расширения: список числа
возвращает число
обеспечивает «группа — два октета» результат меньше 65536
пример «x25519»
дано расширения равно [0, 51, 0, 8, 0, 6, 0, 29, 0, 2, 7, 8]
ожидается 29
тотальная функция «Ключ клиента»
принимает расширения: список числа
возвращает список числа
обеспечивает «ключ не длиннее содержимого расширения» (длина результат) не больше (длина («Содержимое расширения» от расширения и 51))
пример «Ключ в два октета»
дано расширения равно [0, 51, 0, 8, 0, 6, 0, 29, 0, 2, 7, 8]
ожидается [7, 8]
тотальная функция «Группа сервера»
принимает расширения: список числа
возвращает число
обеспечивает «группа — два октета» результат меньше 65536
пример «x25519»
дано расширения равно [0, 51, 0, 6, 0, 29, 0, 2, 7, 8]
ожидается 29
тотальная функция «Ключ сервера»
принимает расширения: список числа
возвращает список числа
обеспечивает «ключ не длиннее содержимого расширения» (длина результат) не больше (длина («Содержимое расширения» от расширения и 51))
пример «Ключ в два октета»
дано расширения равно [0, 51, 0, 6, 0, 29, 0, 2, 7, 8]
ожидается [7, 8]
тотальная функция «Два октета»
принимает н: число
возвращает список числа
обеспечивает «ровно два октета» (длина результат) равен 2
пример «Ноль»
дано н равно 0
ожидается [0, 0]
тотальная функция «Приставка меток»
возвращает список числа
обеспечивает «шесть октетов» (длина результат) равен 6
обеспечивает «приставка начинается с буквы t» (элемент 1 в результат) равен 116
обеспечивает «приставка кончается пробелом» (элемент 6 в результат) равен 32
пример «Приставка tls13 с пробелом на конце»
ожидается [116, 108, 115, 49, 51, 32]
тотальная функция «Справка вывода»
принимает байтов: число, метка: список числа, привязка: список числа
возвращает список числа
обеспечивает «длина справки складывается из четырёх полей» (длина результат) равен (4 плюс (длина метка) плюс 6 плюс (длина привязка))
пример «Метка key без привязки на шестнадцать байтов»
дано байтов равно 16
дано метка равно [107, 101, 121]
дано привязка равно пустой список
ожидается [0, 16, 9, 116, 108, 115, 49, 51, 32, 107, 101, 121, 0]
тотальная функция «Растянуть»
принимает ключ: список числа, справка: список числа, байтов: число
возвращает список числа
обеспечивает «выдано ровно столько, сколько заказано, пока заказ не больше двух кусков» не (байтов не больше 64) или ((длина результат) равен (если байтов не больше 0 то 0 иначе байтов))
обеспечивает «короткий заказ берётся из первого куска» если байтов не больше 32 то (результат равен («Начало списка» от («Подпись байтами» от ключ и («Слить октеты» от справка и [1])) и байтов)) иначе да
пример «Нулевой заказ выдаёт пустоту, а не первый кусок»
дано ключ равно пустой список
дано справка равно пустой список
дано байтов равно 0
ожидается пустой список
тотальная функция «Вывести с меткой»
принимает секрет: список числа, метка: список числа, привязка: список числа, байтов: число
возвращает список числа
тотальная функция «Вывести секрет»
принимает секрет: список числа, метка: список числа, сообщения: список числа
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Метка derived»
возвращает список числа
обеспечивает «октетов ровно 7» (длина результат) равен 7
обеспечивает «метка начинается с буквы d» (элемент 1 в результат) равен 100
пример «Слово derived октетами»
ожидается [100, 101, 114, 105, 118, 101, 100]
тотальная функция «Метка c hs traffic»
возвращает список числа
обеспечивает «октетов ровно 12» (длина результат) равен 12
обеспечивает «метка начинается с буквы c» (элемент 1 в результат) равен 99
пример «Метка секрета клиента рукопожатия октетами»
ожидается [99, 32, 104, 115, 32, 116, 114, 97, 102, 102, 105, 99]
тотальная функция «Метка s hs traffic»
возвращает список числа
обеспечивает «октетов ровно 12» (длина результат) равен 12
обеспечивает «метка начинается с буквы s» (элемент 1 в результат) равен 115
пример «Метка секрета сервера рукопожатия октетами»
ожидается [115, 32, 104, 115, 32, 116, 114, 97, 102, 102, 105, 99]
тотальная функция «Метка c ap traffic»
возвращает список числа
обеспечивает «октетов ровно 12» (длина результат) равен 12
обеспечивает «метка начинается с буквы c» (элемент 1 в результат) равен 99
пример «Метка секрета клиента данных октетами»
ожидается [99, 32, 97, 112, 32, 116, 114, 97, 102, 102, 105, 99]
тотальная функция «Метка s ap traffic»
возвращает список числа
обеспечивает «октетов ровно 12» (длина результат) равен 12
обеспечивает «метка начинается с буквы s» (элемент 1 в результат) равен 115
пример «Метка секрета сервера данных октетами»
ожидается [115, 32, 97, 112, 32, 116, 114, 97, 102, 102, 105, 99]
тотальная функция «Метка key»
возвращает список числа
обеспечивает «октетов ровно 3» (длина результат) равен 3
обеспечивает «метка начинается с буквы k» (элемент 1 в результат) равен 107
пример «Слово key октетами»
ожидается [107, 101, 121]
тотальная функция «Метка iv»
возвращает список числа
обеспечивает «октетов ровно 2» (длина результат) равен 2
обеспечивает «метка начинается с буквы i» (элемент 1 в результат) равен 105
пример «Слово iv октетами»
ожидается [105, 118]
тотальная функция «Метка finished»
возвращает список числа
обеспечивает «октетов ровно 8» (длина результат) равен 8
обеспечивает «метка начинается с буквы f» (элемент 1 в результат) равен 102
пример «Слово finished октетами»
ожидается [102, 105, 110, 105, 115, 104, 101, 100]
тотальная функция «Ранний секрет»
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
пример «Известное значение TLS 1.3 без PSK»
ожидается [51, 173, 10, 28, 96, 126, 192, 59, 9, 230, 205, 152, 147, 104, 12, 226, 16, 173, 243, 0, 170, 31, 38, 96,
225, 178, 46, 16, 241, 112, 249, 42]
тотальная функция «Производный ранний»
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Секрет рукопожатия»
принимает общий: список числа
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Секрет клиента рукопожатия»
принимает рукопожатие: список числа, стенограмма: список числа
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Секрет сервера рукопожатия»
принимает рукопожатие: список числа, стенограмма: список числа
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Главный секрет»
принимает рукопожатие: список числа
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Секрет клиента данных»
принимает главный: список числа, стенограмма: список числа
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Секрет сервера данных»
принимает главный: список числа, стенограмма: список числа
возвращает список числа
обеспечивает «секрет — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Ключ записи»
принимает секрет: список числа
возвращает список числа
обеспечивает «ключ AES-128 — шестнадцать октетов» (длина результат) равен 16
тотальная функция «Вектор записи»
принимает секрет: список числа
возвращает список числа
обеспечивает «вектор — двенадцать октетов» (длина результат) равен 12
тотальная функция «Вектор с номером»
принимает вектор: список числа, номер: число
возвращает список числа
обеспечивает «вектор с номером той же длины» (длина результат) равен (длина вектор)
пример «Нулевой номер вектора не меняет»
дано вектор равно [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
дано номер равно 0
ожидается [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
тотальная функция «Шифротекст записи»
принимает лента: список числа
возвращает список числа
тотальная функция «Тег записи»
принимает лента: список числа
возвращает список числа
обеспечивает «тег не длиннее ленты» (длина результат) не больше (длина лента)
пример «Пустая лента не роняет, а даёт пустой тег»
дано лента равно пустой список
ожидается пустой список
тотальная функция «Расшифровать запись»
принимает ключ: список числа, вектор: список числа, номер: число, лента: список числа
возвращает «Исход GCM»
тотальная функция «Открытое записи»
принимает ключ: список числа, вектор: список числа, номер: число, лента: список числа
возвращает список числа
тотальная функция «Секрет сервера из журнала»
возвращает список числа
обеспечивает «тридцать два октета» (длина результат) равен 32
обеспечивает «первый октет секрета из журнала — 79» (элемент 1 в результат) равен 79
пример «Секрет из keylogfile, снятый с настоящего соединения»
ожидается [79, 162, 179, 240, 212, 15, 68, 252, 170, 235, 113, 251, 73, 209, 5, 124, 12, 11, 40, 49, 250, 91, 0,
233, 0, 108, 255, 175, 123, 206, 191, 214]
тотальная функция «Первая закрытая запись сервера»
возвращает список числа
обеспечивает «двадцать восемь октетов» (длина результат) равен 28
обеспечивает «запись помечена типом 23, ApplicationData» (элемент 1 в результат) равен 23
обеспечивает «в заголовке записи заявлено 23 октета тела» (элемент 5 в результат) равен 23
пример «Запись, снятая с провода посредником»
ожидается [23, 3, 3, 0, 23, 55, 50, 77, 58, 155, 255, 94, 199, 109, 5, 68, 243, 221, 13, 230, 80, 29, 82, 123, 232,
50, 183, 246]
тотальная функция «Ключ сервера рукопожатия»
возвращает строка
тотальная функция «Вектор сервера рукопожатия»
возвращает строка
тотальная функция «Открытое первой записи»
возвращает строка
тотальная функция «Три октета»
принимает н: число
возвращает список числа
обеспечивает «ровно три октета» (длина результат) равен 3
пример «Сто сорок»
дано н равно 140
ожидается [0, 0, 140]
тотальная функция «Расширение версий клиента»
возвращает список числа
обеспечивает «семь октетов» (длина результат) равен 7
обеспечивает «номер расширения — 43, supported_versions» (элемент 2 в результат) равен 43
пример «supported_versions с одной версией TLS 1.3»
ожидается [0, 43, 0, 3, 2, 3, 4]
тотальная функция «Расширение групп клиента»
возвращает список числа
обеспечивает «восемь октетов» (длина результат) равен 8
обеспечивает «номер расширения — 10, supported_groups» (элемент 2 в результат) равен 10
пример «supported_groups с одной группой x25519»
ожидается [0, 10, 0, 4, 0, 2, 0, 29]
тотальная функция «Расширение подписей клиента»
возвращает список числа
обеспечивает «восемь октетов» (длина результат) равен 8
обеспечивает «номер расширения — 13, signature_algorithms» (элемент 2 в результат) равен 13
пример «signature_algorithms с одной схемой 0x0804»
ожидается [0, 13, 0, 4, 0, 2, 8, 4]
тотальная функция «Расширение ключа клиента»
принимает открытый: список числа
возвращает список числа
обеспечивает «десять октетов обвязки и сам ключ» (длина результат) равен (10 плюс (длина открытый))
пример «Без открытого ключа остаётся одна обвязка key_share»
дано открытый равно пустой список
ожидается [0, 51, 0, 38, 0, 36, 0, 29, 0, 32]
тотальная функция «Расширения своего привета»
принимает открытый: список числа
возвращает список числа
тотальная функция «Тело своего привета»
принимает случайное: список числа, сессия: список числа, открытый: список числа
возвращает список числа
тотальная функция «Свой привет»
принимает случайное: список числа, сессия: список числа, открытый: список числа
возвращает список числа
обеспечивает «запись на пять октетов длиннее тела рукопожатия» (длина результат) равен (5 плюс (длина («Тело своего привета» от случайное и сессия и открытый)))
пример «Обвязка привета целиком, когда случайное, сессия и ключ пусты»
дано случайное равно пустой список
дано сессия равно пустой список
дано открытый равно пустой список
ожидается [22, 3, 1, 0, 48, 1, 0, 0, 44, 3, 3, 0, 0, 2, 19, 1, 1, 0, 0, 33, 0, 43, 0, 3, 2, 3, 4, 0, 10, 0, 4, 0, 2,
0, 29, 0, 13, 0, 4, 0, 2, 8, 4, 0, 51, 0, 38, 0, 36, 0, 29, 0, 32]
| Function | Termination | Claims |
|---|---|---|
| «Знак шестнадцати» | — | — |
| «Октет заглавными» | — | — |
| «Шаг октетов заглавными» | — | — |
| «Октеты заглавными» | — | — |
| «Шаг слития» | — | — |
| «Слить октеты» | — | — |
| «Тип записи» | — | — |
| «Имя типа записи» | — | — |
| «Версия записи» | — | — |
| «Версия словом» | — | — |
| «Длина записи» | — | — |
| «Тело записи» | — | — |
| «Запись целая» | — | — |
| «Заголовок записи» | — | — |
| «Собрать запись» | — | — |
| «Тип рукопожатия» | — | — |
| «Имя типа рукопожатия» | — | — |
| «Длина рукопожатия» | — | — |
| «Версия привета» | — | — |
| «Метка времени привета» | — | — |
| «Случайное число» | — | — |
| «Случайные октеты» | — | — |
| «Длина сессии» | — | — |
| «Идентификатор сессии» | — | — |
| «Место после сессии» | — | — |
| «Длина наборов» | — | — |
| «Наборы шифров» | — | — |
| «Место сжатия» | — | — |
| «Длина сжатия» | — | — |
| «Место расширений клиента» | — | — |
| «Длина расширений клиента» | — | — |
| «Расширения клиента» | — | — |
| «Набор сервера» | — | — |
| «Сжатие сервера» | — | — |
| «Место расширений сервера» | — | — |
| «Длина расширений сервера» | — | — |
| «Расширения сервера» | — | — |
| «Шаг пар» | — | — |
| «Ход по парам» | — | — |
| «Пары октетов» | — | — |
| «Набор словом» | — | — |
| «Группа словом» | — | — |
| «Имя расширения» | — | — |
| «Печать наборов» | — | — |
| «Печать версий» | — | — |
| «Тип расширения в месте» | — | — |
| «Длина расширения в месте» | — | — |
| «Шаг расширений» | — | — |
| «Обход расширений» | — | — |
| «Печать расширений» | — | — |
| «Сколько расширений» | — | — |
| «Шаг поиска» | — | — |
| «Поиск расширения» | — | — |
| «Есть расширение» | — | — |
| «Содержимое расширения» | — | — |
| «Версии клиента» | — | — |
| «Версия сервера» | — | — |
| «Группа клиента» | — | — |
| «Ключ клиента» | — | — |
| «Группа сервера» | — | — |
| «Ключ сервера» | — | — |
| «Два октета» | — | — |
| «Приставка меток» | — | — |
| «Справка вывода» | — | — |
| «Растянуть» | — | — |
| «Вывести с меткой» | — | — |
| «Вывести секрет» | — | — |
| «Метка derived» | — | — |
| «Метка c hs traffic» | — | — |
| «Метка s hs traffic» | — | — |
| «Метка c ap traffic» | — | — |
| «Метка s ap traffic» | — | — |
| «Метка key» | — | — |
| «Метка iv» | — | — |
| «Метка finished» | — | — |
| «Ранний секрет» | — | — |
| «Производный ранний» | — | — |
| «Секрет рукопожатия» | — | — |
| «Секрет клиента рукопожатия» | — | — |
| «Секрет сервера рукопожатия» | — | — |
| «Главный секрет» | — | — |
| «Секрет клиента данных» | — | — |
| «Секрет сервера данных» | — | — |
| «Ключ записи» | — | — |
| «Вектор записи» | — | — |
| «Вектор с номером» | — | — |
| «Шифротекст записи» | — | — |
| «Тег записи» | — | — |
| «Расшифровать запись» | — | — |
| «Открытое записи» | — | — |
| «Секрет сервера из журнала» | — | — |
| «Первая закрытая запись сервера» | — | — |
| «Ключ сервера рукопожатия» | — | — |
| «Вектор сервера рукопожатия» | — | — |
| «Открытое первой записи» | — | — |
| «Три октета» | — | — |
| «Расширение версий клиента» | — | — |
| «Расширение групп клиента» | — | — |
| «Расширение подписей клиента» | — | — |
| «Расширение ключа клиента» | — | — |
| «Расширения своего привета» | — | — |
| «Тело своего привета» | — | — |
| «Свой привет» | — | — |
«TOML»
flang/stdlib/toml.flang — functions 45; the kernel ledger was taken from this version of the file
тип «Значение toml»
вариант «Строка toml» содержит текст: строка
вариант «Целое toml» содержит величина: число
вариант «Вещественное toml» содержит величина: число
вариант «Признак toml» содержит истина: признак
вариант «Массив toml» содержит элементы: список «Значение toml»
вариант «Таблица toml» содержит состав: список «Пара toml»
тип «Пара toml»
вариант «Пара toml» содержит имя: строка, содержимое: «Значение toml»
тип «Причина toml»
вариант «Строка не закрыта»
вариант «Таблица объявлена дважды» содержит путь: строка
вариант «Число записано неверно» содержит текст: строка
вариант «Нет знака равенства»
вариант «Ключ повторён» содержит имя: строка
вариант «Ключ записан неверно» содержит текст: строка
вариант «Массив не закрыт»
вариант «Скобка заголовка не закрыта»
вариант «Синтаксис вне подмножества» содержит что: строка
вариант «Значение не опознано» содержит текст: строка
тип «Итог toml»
вариант «Разобран toml» содержит значение: «Значение toml»
вариант «Не разобран toml» содержит причина: «Причина toml», строка: число
тип «Возможное значение toml»
вариант «Есть значение toml» содержит значение: «Значение toml»
вариант «Нет значения toml»
тип «Взятие значения toml»
вариант «Значение взято» содержит значение: «Значение toml»
вариант «Значение не взято» содержит причина: «Причина toml»
тип «Взятие ключа toml»
вариант «Ключ взят» содержит имя: строка
вариант «Ключ не взят» содержит причина: «Причина toml»
тип «Строка документа toml»
вариант «Пустая строка toml»
вариант «Заголовок toml» содержит путь: список строки
вариант «Строка пары toml» содержит пара: «Пара toml»
вариант «Строка с отказом toml» содержит причина: «Причина toml»
тип «Вставка toml»
вариант «Вставлено toml» содержит состав: список «Пара toml»
вариант «Не вставлено toml» содержит причина: «Причина toml»
тип «Лад кавычек toml»
вариант «Вне кавычек toml»
вариант «В строке toml»
вариант «После обратной косой toml»
вариант «В литерале toml»
тип «Резка toml»
вариант «Резка toml» содержит куски: список строки, кусок: строка, лад: «Лад кавычек toml»
тип «Этап числа toml»
вариант «Перед числом toml»
вариант «После знака числа toml»
вариант «Ведущий ноль toml»
вариант «Цифры целой части toml»
вариант «Черта целой части toml»
вариант «После точки toml»
вариант «Цифры дроби toml»
вариант «Черта дроби toml»
вариант «После буквы порядка toml»
вариант «После знака порядка toml»
вариант «Цифры порядка toml»
вариант «Черта порядка toml»
вариант «Число сломано toml»
тип «Этап строки toml»
вариант «Внутри строки toml»
вариант «После косой в строке toml»
вариант «За кавычкой toml»
вариант «Строка испорчена toml» содержит причина: «Причина toml»
тип «Чтение строки toml»
вариант «Чтение строки toml» содержит этап: «Этап строки toml», собрано: строка, хвост: строка
тип «Беда хода toml»
вариант «Беды нет toml»
вариант «Беда случилась toml» содержит причина: «Причина toml»
тип «Ход toml»
вариант «Ход toml» содержит документ: список «Пара toml», путь: список строки, объявлены: список строки, номер: число, беда: «Беда хода toml»
тотальная функция «Это таблица toml»
принимает значение: «Значение toml»
возвращает признак
обеспечивает «таблицей признаётся ровно вариант таблицы» разбор значение
случай вариант «Таблица toml» с состав как состав
то результат
случай любое
то не результат
пример «Пустая таблица — таблица»
дано значение равно вариант «Таблица toml» с состав равным пустой список
ожидается да
тотальная функция «Пробельный знак toml»
принимает знак: строка
возвращает признак
обеспечивает «пробельный знак — ровно один знак» (не результат) или ((длина знак) равен 1)
пример «Пробел пробельный»
дано знак равно " "
ожидается да
тотальная функция «Снять пробелы слева toml»
принимает текст: строка
возвращает строка
обеспечивает «снятие не удлиняет» (длина результат) не больше (длина текст)
обеспечивает «слева пробела не осталось» (не (результат начинается с " ")) и притом (не (результат начинается с "\t"))
пример «Пробелы и табуляция слева снимаются, справа остаются»
дано текст равно " \tа б "
ожидается "а б "
тотальная функция «Обратить строку toml»
принимает текст: строка
возвращает строка
обеспечивает «обращение длины не меняет» (длина результат) равен (длина текст)
пример «Три знака задом наперёд»
дано текст равно "абв"
ожидается "вба"
тотальная функция «Обрезать пробелы toml»
принимает текст: строка
возвращает строка
обеспечивает «обрезка не удлиняет» (длина результат) не больше (длина текст)
обеспечивает «слева пробела не осталось» (не (результат начинается с " ")) и притом (не (результат начинается с "\t"))
пример «С двух сторон, вместе с возвратом каретки»
дано текст равно " \t x = 1 \r"
ожидается "x = 1"
тотальная функция «Шаг резки toml»
принимает резка: «Резка toml», знак: строка, разделитель: строка
возвращает «Резка toml»
обеспечивает «шаг кусков не теряет» (длина результат.куски) не меньше (длина резка.куски)
обеспечивает «шаг прибавляет не больше одного куска» (длина результат.куски) не больше ((длина резка.куски) плюс 1)
пример «Разделитель вне кавычек закрывает кусок»
дано резка равно вариант «Резка toml» с куски равным пустой список и кусок равным "a" и лад равным (вариант «Вне кавычек toml»)
дано знак равно ","
дано разделитель равно ","
ожидается вариант «Резка toml» с куски равным ["a"] и кусок равным "" и лад равным (вариант «Вне кавычек toml»)
тотальная функция «Разрезать вне кавычек toml»
принимает текст: строка, разделитель: строка
возвращает список строки
обеспечивает «кусок хотя бы один» (длина результат) не меньше 1
обеспечивает «куски, склеенные разделителем, дают исходный текст» («Склеить через toml» от результат и разделитель) равен текст
пример «Знак равенства внутри строки не режет»
дано текст равно "a = \"b = c\" # d"
дано разделитель равно "="
ожидается ["a ", " \"b = c\" # d"]
тотальная функция «Склеить через toml»
принимает части: список строки, разделитель: строка
возвращает строка
обеспечивает «одна часть склеивается сама в себя» если (длина части) равен 1 то (результат равен (голова части)) иначе да
пример «Три части через знак равенства»
дано части равно ["a", "b", "c"]
дано разделитель равно "="
ожидается "a=b=c"
тотальная функция «Знак голого ключа toml»
принимает знак: строка
возвращает признак
обеспечивает «годный знак — ровно один знак» (не результат) или ((длина знак) равен 1)
пример «Латинская буква годится»
дано знак равно "a"
ожидается да
тотальная функция «Голый ключ toml»
принимает текст: строка
возвращает признак
обеспечивает «голый ключ непуст» (не результат) или ((длина текст) больше 0)
пример «Буквы, цифры, черта и дефис»
дано текст равно "server_1-a"
ожидается да
тотальная функция «Шаг чтения строки toml»
принимает чтение: «Чтение строки toml», знак: строка
возвращает «Чтение строки toml»
обеспечивает «испорченное чтение не меняется» разбор (чтение.этап)
случай вариант «Строка испорчена toml» с причина как причина
то результат равен чтение
случай любое
то да
обеспечивает «за кавычкой собранное не растёт» (не ((чтение.этап) равен (вариант «За кавычкой toml»))) или ((результат.собрано) равен (чтение.собрано))
пример «Обратная косая ждёт экранируемый знак»
дано чтение равно вариант «Чтение строки toml» с этап равным (вариант «Внутри строки toml») и собрано равным "a" и хвост равным ""
дано знак равно "\\"
ожидается вариант «Чтение строки toml» с этап равным (вариант «После косой в строке toml») и собрано равным "a" и хвост равным ""
тотальная функция «Разобрать строку в кавычках toml»
принимает текст: строка
возвращает «Взятие значения toml»
обеспечивает «взятая строка короче своей записи» разбор результат
случай вариант «Значение взято» с значение как взятое
то разбор взятое
случай вариант «Строка toml» с текст как собранное
то (длина собранное) меньше (длина текст)
случай любое
то нет
случай любое
то да
пример «Четыре экрана подмножества: кавычка, косая, перевод строки»
дано текст равно "\"a\\\"b\\\\c\\n\""
ожидается вариант «Значение взято» с значение равным (вариант «Строка toml» с текст равным "a\"b\\c\n")
тотальная функция «Разобрать литерал toml»
принимает текст: строка
возвращает «Взятие значения toml»
обеспечивает «взятый литерал короче записи на две кавычки или больше» разбор результат
случай вариант «Значение взято» с значение как взятое
то разбор взятое
случай вариант «Строка toml» с текст как собранное
то ((длина собранное) плюс 2) не больше (длина текст)
случай любое
то нет
случай любое
то да
пример «Обратная косая в литерале остаётся как есть»
дано текст равно "'C:\\Users'"
ожидается вариант «Значение взято» с значение равным (вариант «Строка toml» с текст равным "C:\\Users")
тотальная функция «Цифра toml»
принимает знак: строка
возвращает признак
обеспечивает «цифра — ровно один знак» (не результат) или ((длина знак) равен 1)
пример «Семь — цифра»
дано знак равно "7"
ожидается да
тотальная функция «Этап первой цифры toml»
принимает знак: строка
возвращает «Этап числа toml»
обеспечивает «первая цифра число не ломает, прочий знак ломает» (результат равен (вариант «Число сломано toml»)) равен (не («Цифра toml» от знак))
пример «Ноль — ведущий ноль»
дано знак равно "0"
ожидается вариант «Ведущий ноль toml»
тотальная функция «Шаг этапа числа toml»
принимает этап: «Этап числа toml», знак: строка
возвращает «Этап числа toml»
обеспечивает «сломанное число не чинится» (не (этап равен (вариант «Число сломано toml»))) или (результат равен (вариант «Число сломано toml»))
обеспечивает «знак не из записи числа ломает число» ("0123456789+-._eE" содержит знак) или (результат равен (вариант «Число сломано toml»))
пример «Черта после цифры ждёт цифру»
дано этап равно вариант «Цифры целой части toml»
дано знак равно "_"
ожидается вариант «Черта целой части toml»
тотальная функция «Похоже на дату toml»
принимает текст: строка
возвращает признак
обеспечивает «на дату похоже только то, что не короче трёх знаков» (не результат) или ((длина текст) не меньше 3)
пример «Дата 1979-05-27»
дано текст равно "1979-05-27"
ожидается да
тотальная функция «Разобрать число toml»
принимает текст: строка
возвращает «Взятие значения toml»
обеспечивает «целое toml — без дробной части и не шире 2^53−1» разбор результат
случай вариант «Значение взято» с значение как взятое
то разбор взятое
случай вариант «Целое toml» с величина как величина
то (((величина остаток от 1) плюс 0) равен 0) и притом (величина не больше 9007199254740991) и притом (величина не меньше (0 минус 9007199254740991))
случай любое
то да
случай любое
то да
обеспечивает «пустая запись — число записано неверно» (не (текст равен "")) или (результат равен (вариант «Значение не взято» с причина равным (вариант «Число записано неверно» с текст равным "")))
пример «Единица без точки — целое»
дано текст равно "1"
ожидается вариант «Значение взято» с значение равным (вариант «Целое toml» с величина равным 1)
тотальная функция «Разобрать скаляр toml»
принимает текст: строка
возвращает «Взятие значения toml»
обеспечивает «пустое значение не опознано» (не (текст равен "")) или (результат равен (вариант «Значение не взято» с причина равным (вариант «Значение не опознано» с текст равным "")))
обеспечивает «слово true — признак да» (не (текст равен "true")) или (результат равен (вариант «Значение взято» с значение равным (вариант «Признак toml» с истина равным да)))
пример «true — признак да»
дано текст равно "true"
ожидается вариант «Значение взято» с значение равным (вариант «Признак toml» с истина равным да)
тотальная функция «Шаг сбора массива toml»
принимает итог: «Взятие значения toml», кусок: строка, всего: число
возвращает «Взятие значения toml»
обеспечивает «отказ липкий» разбор итог
случай вариант «Значение не взято» с причина как причина
то результат равен итог
случай любое
то да
пример «Элемент дописывается в массив»
дано итог равно вариант «Значение взято» с значение равным (вариант «Массив toml» с элементы равным [вариант «Целое toml» с величина равным 1])
дано кусок равно "2"
дано всего равно 3
ожидается вариант «Значение взято» с значение равным (вариант «Массив toml» с элементы равным [вариант «Целое toml» с величина равным 1, вариант «Целое toml» с величина равным 2])
тотальная функция «Разобрать массив toml»
принимает текст: строка
возвращает «Взятие значения toml»
обеспечивает «без закрывающей скобки — массив не закрыт» (((длина текст) не меньше 2) и притом ((символ (длина текст) в текст) равен "]")) или (результат равен (вариант «Значение не взято» с причина равным (вариант «Массив не закрыт»)))
обеспечивает «взятое — всегда массив» разбор результат
случай вариант «Значение взято» с значение как взятое
то разбор взятое
случай вариант «Массив toml» с элементы как элементы
то да
случай любое
то нет
случай любое
то да
пример «Три порта»
дано текст равно "[ 8000, 8001, 8002 ]"
ожидается вариант «Значение взято» с значение равным (вариант «Массив toml» с элементы равным [
вариант «Целое toml» с величина равным 8000, вариант «Целое toml» с величина равным 8001,
вариант «Целое toml» с величина равным 8002])
тотальная функция «Разобрать значение toml»
принимает текст: строка
возвращает «Взятие значения toml»
обеспечивает «значение в скобках разбирается как массив» (не ((«Обрезать пробелы toml» от текст) начинается с "[")) или (результат равен («Разобрать массив toml» от («Обрезать пробелы toml» от текст)))
пример «Массив узнаётся по скобке»
дано текст равно " [1] "
ожидается вариант «Значение взято» с значение равным (вариант «Массив toml» с элементы равным [
вариант «Целое toml» с величина равным 1])
тотальная функция «Разобрать ключ toml»
принимает текст: строка
возвращает «Взятие ключа toml»
обеспечивает «голый ключ берётся как есть» (не («Голый ключ toml» от текст)) или (результат равен (вариант «Ключ взят» с имя равным текст))
пример «Голый ключ»
дано текст равно "title"
ожидается вариант «Ключ взят» с имя равным "title"
тотальная функция «Шаг пути заголовка toml»
принимает итог: «Строка документа toml», кусок: строка
возвращает «Строка документа toml»
обеспечивает «отказ липкий» разбор итог
случай вариант «Строка с отказом toml» с причина как причина
то результат равен итог
случай любое
то да
пример «Кусок пути дописывается»
дано итог равно вариант «Заголовок toml» с путь равным ["servers"]
дано кусок равно " alpha "
ожидается вариант «Заголовок toml» с путь равным ["servers", "alpha"]
тотальная функция «Разобрать заголовок toml»
принимает текст: строка
возвращает «Строка документа toml»
обеспечивает «двойная скобка — массив таблиц вне подмножества» (не (текст начинается с "[[")) или (результат равен (вариант «Строка с отказом toml» с причина равным (вариант «Синтаксис вне подмножества» с что равным "массив таблиц [[имя]]")))
пример «Заголовок вложенной таблицы»
дано текст равно "[servers.alpha]"
ожидается вариант «Заголовок toml» с путь равным ["servers", "alpha"]
тотальная функция «Разобрать строку toml»
принимает текст: строка
возвращает «Строка документа toml»
обеспечивает «пустая после обрезки строка — пустая» (не ((«Обрезать пробелы toml» от текст) равен "")) или (результат равен (вариант «Пустая строка toml»))
обеспечивает «строка пары и заголовок печатаются и разбираются снова в то же» разбор результат
случай вариант «Строка пары toml» с пара как пара
то («Разобрать строку toml» от (соединить (соединить («Напечатать ключ toml» от (пара.имя)) с " = ") с («Напечатать значение toml» от (пара.содержимое)))) равен результат
случай вариант «Заголовок toml» с путь как путь
то («Разобрать строку toml» от (соединить (соединить "[" с («Имя пути toml» от путь)) с "]")) равен результат
случай любое
то да
пример «Пустая строка»
дано текст равно ""
ожидается вариант «Пустая строка toml»
тотальная функция «Шаг поиска в таблице toml»
принимает найдено: «Возможное значение toml», звено: «Пара toml», имя: строка
возвращает «Возможное значение toml»
обеспечивает «найденное не теряется» разбор найдено
случай вариант «Есть значение toml» с значение как прежнее
то результат равен найдено
случай любое
то да
пример «Совпало имя — значение найдено»
дано найдено равно вариант «Нет значения toml»
дано звено равно вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1)
дано имя равно "x"
ожидается вариант «Есть значение toml» с значение равным (вариант «Целое toml» с величина равным 1)
тотальная функция «Найти в таблице toml»
принимает состав: список «Пара toml», имя: строка
возвращает «Возможное значение toml»
обеспечивает «найдено ровно то, что есть в таблице» (результат равен (вариант «Нет значения toml»)) равен (не («Есть в таблице toml» от состав и имя))
пример «Ключ есть»
дано состав равно [
вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1),
вариант «Пара toml» с имя равным "y" и содержимое равным (вариант «Целое toml» с величина равным 2)]
дано имя равно "y"
ожидается вариант «Есть значение toml» с значение равным (вариант «Целое toml» с величина равным 2)
тотальная функция «Есть в таблице toml»
принимает состав: список «Пара toml», имя: строка
возвращает признак
обеспечивает «в пустой таблице ключей нет» (не ((длина состав) равен 0)) или (не результат)
пример «Ключ есть»
дано состав равно [
вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1)]
дано имя равно "x"
ожидается да
тотальная функция «Заменить в таблице toml»
принимает состав: список «Пара toml», имя: строка, значение: «Значение toml»
возвращает список «Пара toml»
обеспечивает «замена длины не меняет» (длина результат) равен (длина состав)
пример «Значение заменяется на месте»
дано состав равно [
вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1),
вариант «Пара toml» с имя равным "y" и содержимое равным (вариант «Целое toml» с величина равным 2)]
дано имя равно "x"
дано значение равно вариант «Целое toml» с величина равным 9
ожидается [вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 9),
вариант «Пара toml» с имя равным "y" и содержимое равным (вариант «Целое toml» с величина равным 2)]
тотальная функция «Вставить по порядку toml»
принимает состав: список «Пара toml», пара: «Пара toml»
возвращает список «Пара toml»
обеспечивает «вставка прибавляет ровно одну пару» (длина результат) равен ((длина состав) плюс 1)
пример «Скаляр встаёт перед таблицами»
дано состав равно [
вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1),
вариант «Пара toml» с имя равным "t" и содержимое равным (вариант «Таблица toml» с состав равным пустой список)]
дано пара равно вариант «Пара toml» с имя равным "y" и содержимое равным (вариант «Целое toml» с величина равным 2)
ожидается [вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1),
вариант «Пара toml» с имя равным "y" и содержимое равным (вариант «Целое toml» с величина равным 2),
вариант «Пара toml» с имя равным "t" и содержимое равным (вариант «Таблица toml» с состав равным пустой список)]
тотальная функция «Вписать пару toml»
принимает состав: список «Пара toml», путь: список строки, пара: «Пара toml»
возвращает «Вставка toml»
обеспечивает «вписывание пар верхнего уровня не теряет» разбор результат
случай вариант «Вставлено toml» с состав как новый
то (длина новый) не меньше (длина состав)
случай любое
то да
пример «В пустую таблицу верхнего уровня»
дано состав равно пустой список
дано путь равно пустой список
дано пара равно вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1)
ожидается вариант «Вставлено toml» с состав равным [вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1)]
тотальная функция «Открыть таблицу toml»
принимает состав: список «Пара toml», путь: список строки
возвращает «Вставка toml»
обеспечивает «открытие пар верхнего уровня не теряет» разбор результат
случай вариант «Вставлено toml» с состав как новый
то (длина новый) не меньше (длина состав)
случай любое
то да
пример «Две вложенные таблицы создаются пустыми»
дано состав равно пустой список
дано путь равно ["a", "b"]
ожидается вариант «Вставлено toml» с состав равным [вариант «Пара toml» с имя равным "a" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "b" и содержимое равным (вариант «Таблица toml» с состав равным пустой список)])]
тотальная функция «Заслонить знак toml»
принимает знак: строка
возвращает строка
обеспечивает «заслонение не укорачивает» (длина результат) не меньше (длина знак)
пример «Кавычка заслоняется»
дано знак равно "\""
ожидается "\\\""
тотальная функция «Напечатать строку toml»
принимает текст: строка
возвращает строка
обеспечивает «печать строки — кавычки и не меньше знаков, чем было» (длина результат) не меньше ((длина текст) плюс 2)
пример «Кавычка и косая внутри»
дано текст равно "a\"b\\c"
ожидается "\"a\\\"b\\\\c\""
тотальная функция «Напечатать ключ toml»
принимает имя: строка
возвращает строка
обеспечивает «голый ключ печатается как есть» (не («Голый ключ toml» от имя)) или (результат равен имя)
обеспечивает «прочий ключ печатается в кавычках» («Голый ключ toml» от имя) или (результат начинается с "\"")
пример «Голый ключ печатается как есть»
дано имя равно "title"
ожидается "title"
тотальная функция «Имя пути toml»
принимает путь: список строки
возвращает строка
обеспечивает «пустой путь — пустое имя» (не ((длина путь) равен 0)) или (результат равен "")
пример «Путь через точку»
дано путь равно ["servers", "alpha"]
ожидается "servers.alpha"
тотальная функция «Напечатать число toml»
принимает величина: число, дробное: признак
возвращает строка
обеспечивает «конечное вещественное печатается с точкой или порядком» (не (дробное и притом ((величина минус величина) равен 0))) или ((результат содержит ".") или (результат содержит "e"))
пример «Целое печатается без точки»
дано величина равно 5000
дано дробное равно нет
ожидается "5000"
тотальная функция «Напечатать значение toml»
принимает значение: «Значение toml»
возвращает строка
обеспечивает «напечатанное значение непусто» (длина результат) больше 0
пример «Массив через запятую с пробелом»
дано значение равно вариант «Массив toml» с элементы равным [вариант «Целое toml» с величина равным 8000, вариант «Целое toml» с величина равным 8001]
ожидается "[8000, 8001]"
тотальная функция «Напечатать раздел toml»
принимает путь: список строки, значение: «Значение toml»
возвращает строка
обеспечивает «не таблица печатается строчной записью значения» разбор значение
случай вариант «Таблица toml» с состав как состав
то да
случай любое
то результат равен («Напечатать значение toml» от значение)
пример «Сначала пары, потом вложенные таблицы с заголовками»
дано путь равно ["servers"]
дано значение равно вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "n" и содержимое равным (вариант «Целое toml» с величина равным 2), вариант «Пара toml» с имя равным "alpha" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "ip" и содержимое равным (вариант «Строка toml» с текст равным "10.0.0.1")])]
ожидается "n = 2\n\n[servers.alpha]\nip = \"10.0.0.1\"\n"
тотальная функция «Напечатать toml»
принимает таблица: «Значение toml»
возвращает строка
обеспечивает «печать не начинается пустой строкой» не (результат начинается с "\n")
пример «Документ README спецификации печатается в подмножество»
дано таблица равно вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "title" и содержимое равным (вариант «Строка toml» с текст равным "TOML Example"), вариант «Пара toml» с имя равным "owner" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "name" и содержимое равным (вариант «Строка toml» с текст равным "Tom Preston-Werner"), вариант «Пара toml» с имя равным "organization" и содержимое равным (вариант «Строка toml» с текст равным "GitHub")]), вариант «Пара toml» с имя равным "database" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "enabled" и содержимое равным (вариант «Признак toml» с истина равным да), вариант «Пара toml» с имя равным "ports" и содержимое равным (вариант «Массив toml» с элементы равным [вариант «Целое toml» с величина равным 8000, вариант «Целое toml» с величина равным 8001, вариант «Целое toml» с величина равным 8002]), вариант «Пара toml» с имя равным "connection_max" и содержимое равным (вариант «Целое toml» с величина равным 5000), вариант «Пара toml» с имя равным "temperature" и содержимое равным (вариант «Вещественное toml» с величина равным 79.5)]), вариант «Пара toml» с имя равным "servers" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "alpha" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "ip" и содержимое равным (вариант «Строка toml» с текст равным "10.0.0.1"), вариант «Пара toml» с имя равным "role" и содержимое равным (вариант «Строка toml» с текст равным "frontend")]), вариант «Пара toml» с имя равным "beta" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "ip" и содержимое равным (вариант «Строка toml» с текст равным "10.0.0.2"), вариант «Пара toml» с имя равным "role" и содержимое равным (вариант «Строка toml» с текст равным "backend")])])]
ожидается "title = \"TOML Example\"\n\n[owner]\nname = \"Tom Preston-Werner\"\norganization = \"GitHub\"\n\n[database]\nenabled = true\nports = [8000, 8001, 8002]\nconnection_max = 5000\ntemperature = 79.5\n\n[servers]\n\n[servers.alpha]\nip = \"10.0.0.1\"\nrole = \"frontend\"\n\n[servers.beta]\nip = \"10.0.0.2\"\nrole = \"backend\"\n"
тотальная функция «Шаг разбора toml»
принимает ход: «Ход toml», строчка: строка
возвращает «Ход toml»
обеспечивает «после беды ход не меняется» ((ход.беда) равен (вариант «Беды нет toml»)) или (результат равен ход)
обеспечивает «номер растёт не больше чем на один» (результат.номер) не больше ((ход.номер) плюс 1)
пример «Пара ложится в текущую таблицу»
дано ход равно вариант «Ход toml» с документ равным [вариант «Пара toml» с имя равным "a" и содержимое равным (вариант «Таблица toml» с состав равным пустой список)] и путь равным ["a"] и объявлены равным ["a"] и номер равным 1 и беда равным (вариант «Беды нет toml»)
дано строчка равно "x = 1"
ожидается вариант «Ход toml» с документ равным [вариант «Пара toml» с имя равным "a" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "x" и содержимое равным (вариант «Целое toml» с величина равным 1)])] и путь равным ["a"] и объявлены равным ["a"] и номер равным 2 и беда равным (вариант «Беды нет toml»)
тотальная функция «Разобрать toml»
принимает текст: строка
возвращает «Итог toml»
обеспечивает «отказ несёт номер строки от единицы до числа строк» разбор результат
случай вариант «Не разобран toml» с причина как причина и строка как номер
то (номер не меньше 1) и притом (номер не больше (длина (разделить текст по "\n")))
случай любое
то да
обеспечивает «разобранное печатается и разбирается снова в то же значение» разбор результат
случай вариант «Разобран toml» с значение как документ
то («Разобрать toml» от («Напечатать toml» от документ)) равен результат
случай любое
то да
пример «Документ README спецификации, урезанный до подмножества, разбирается целиком»
дано текст равно "# Это TOML-документ\ntitle = \"TOML Example\"\n\n[owner]\nname = \"Tom Preston-Werner\"\norganization = 'GitHub'\n\n[database]\nenabled = true\nports = [ 8000, 8001, 8002 ]\nconnection_max = 5_000\ntemperature = 79.5\n\n[servers]\n\n[servers.alpha]\nip = \"10.0.0.1\"\nrole = \"frontend\"\n\n[servers.beta]\nip = \"10.0.0.2\"\nrole = \"backend\"\n"
ожидается вариант «Разобран toml» с значение равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "title" и содержимое равным (вариант «Строка toml» с текст равным "TOML Example"), вариант «Пара toml» с имя равным "owner" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "name" и содержимое равным (вариант «Строка toml» с текст равным "Tom Preston-Werner"), вариант «Пара toml» с имя равным "organization" и содержимое равным (вариант «Строка toml» с текст равным "GitHub")]), вариант «Пара toml» с имя равным "database" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "enabled" и содержимое равным (вариант «Признак toml» с истина равным да), вариант «Пара toml» с имя равным "ports" и содержимое равным (вариант «Массив toml» с элементы равным [вариант «Целое toml» с величина равным 8000, вариант «Целое toml» с величина равным 8001, вариант «Целое toml» с величина равным 8002]), вариант «Пара toml» с имя равным "connection_max" и содержимое равным (вариант «Целое toml» с величина равным 5000), вариант «Пара toml» с имя равным "temperature" и содержимое равным (вариант «Вещественное toml» с величина равным 79.5)]), вариант «Пара toml» с имя равным "servers" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "alpha" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "ip" и содержимое равным (вариант «Строка toml» с текст равным "10.0.0.1"), вариант «Пара toml» с имя равным "role" и содержимое равным (вариант «Строка toml» с текст равным "frontend")]), вариант «Пара toml» с имя равным "beta" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "ip" и содержимое равным (вариант «Строка toml» с текст равным "10.0.0.2"), вариант «Пара toml» с имя равным "role" и содержимое равным (вариант «Строка toml» с текст равным "backend")])])])
тотальная функция «Значение по пути»
принимает таблица: «Значение toml», путь: список строки
возвращает «Возможное значение toml»
обеспечивает «пустой путь даёт саму таблицу» (не ((длина путь) равен 0)) или (результат равен (вариант «Есть значение toml» с значение равным таблица))
пример «Два шага вглубь»
дано таблица равно вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "a" и содержимое равным (вариант «Таблица toml» с состав равным [вариант «Пара toml» с имя равным "b" и содержимое равным (вариант «Целое toml» с величина равным 1)])]
дано путь равно ["a", "b"]
ожидается вариант «Есть значение toml» с значение равным (вариант «Целое toml» с величина равным 1)
тотальная функция «Значение по пути в тексте toml»
принимает текст: строка, путь: список строки
возвращает «Возможное значение toml»
обеспечивает «неразобранный текст значения не даёт» разбор («Разобрать toml» от текст)
случай вариант «Не разобран toml» с причина как причина и строка как номер
то результат равен (вариант «Нет значения toml»)
случай любое
то да
пример «title — строка TOML Example»
дано текст равно "# Это TOML-документ\ntitle = \"TOML Example\"\n\n[owner]\nname = \"Tom Preston-Werner\"\norganization = 'GitHub'\n\n[database]\nenabled = true\nports = [ 8000, 8001, 8002 ]\nconnection_max = 5_000\ntemperature = 79.5\n\n[servers]\n\n[servers.alpha]\nip = \"10.0.0.1\"\nrole = \"frontend\"\n\n[servers.beta]\nip = \"10.0.0.2\"\nrole = \"backend\"\n"
дано путь равно ["title"]
ожидается вариант «Есть значение toml» с значение равным (вариант «Строка toml» с текст равным "TOML Example")
| Function | Termination | Claims |
|---|---|---|
| «Это таблица toml» | доказано композицией | доказано 0 из 1; «таблицей признаётся ровно вариант таблицы» — сетка |
| «Пробельный знак toml» | доказано композицией | доказано 1 из 1 |
| «Снять пробелы слева toml» | доказано структурой | доказано 1 из 2; «слева пробела не осталось» — сетка |
| «Обратить строку toml» | доказано композицией | доказано 0 из 1; «обращение длины не меняет» — сетка |
| «Обрезать пробелы toml» | доказано композицией | доказано 0 из 2; «обрезка не удлиняет» — сетка; «слева пробела не осталось» — сетка |
| «Шаг резки toml» | доказано композицией | доказано 0 из 2; «шаг кусков не теряет» — сетка; «шаг прибавляет не больше одного куска» — сетка |
| «Разрезать вне кавычек toml» | доказано композицией | доказано 0 из 2; «кусок хотя бы один» — сетка; «куски, склеенные разделителем, дают исходный текст» — сетка |
| «Склеить через toml» | доказано композицией | доказано 0 из 1; «одна часть склеивается сама в себя» — сетка |
| «Знак голого ключа toml» | доказано композицией | доказано 1 из 1 |
| «Голый ключ toml» | доказано композицией | доказано 0 из 1; «голый ключ непуст» — сетка |
| «Шаг чтения строки toml» | доказано композицией | доказано 1 из 2; «испорченное чтение не меняется» — сетка |
| «Разобрать строку в кавычках toml» | доказано композицией | доказано 0 из 1; «взятая строка короче своей записи» — сетка |
| «Разобрать литерал toml» | доказано композицией | доказано 0 из 1; «взятый литерал короче записи на две кавычки или больше» — сетка |
| «Цифра toml» | доказано композицией | доказано 1 из 1 |
| «Этап первой цифры toml» | доказано композицией | доказано 1 из 1 |
| «Шаг этапа числа toml» | доказано композицией | доказано 1 из 2; «знак не из записи числа ломает число» — сетка |
| «Похоже на дату toml» | доказано композицией | доказано 1 из 1 |
| «Разобрать число toml» | доказано композицией | доказано 0 из 2; «целое toml — без дробной части и не шире 2^53−1» — сетка; «пустая запись — число записано неверно» — сетка |
| «Разобрать скаляр toml» | доказано композицией | доказано 2 из 2 |
| «Шаг сбора массива toml» | доказано композицией | доказано 0 из 1; «отказ липкий» — сетка |
| «Разобрать массив toml» | доказано композицией | доказано 1 из 2; «взятое — всегда массив» — сетка |
| «Разобрать значение toml» | доказано композицией | доказано 1 из 1 |
| «Разобрать ключ toml» | доказано композицией | доказано 0 из 1; «голый ключ берётся как есть» — сетка |
| «Шаг пути заголовка toml» | доказано композицией | доказано 0 из 1; «отказ липкий» — сетка |
| «Разобрать заголовок toml» | доказано композицией | доказано 1 из 1 |
| «Разобрать строку toml» | доказано композицией | доказано 0 из 2; «пустая после обрезки строка — пустая» — сетка; «строка пары и заголовок печатаются и разбираются снова в то же» — сетка |
| «Шаг поиска в таблице toml» | доказано композицией | доказано 0 из 1; «найденное не теряется» — сетка |
| «Найти в таблице toml» | доказано композицией | доказано 0 из 1; «найдено ровно то, что есть в таблице» — сетка |
| «Есть в таблице toml» | доказано композицией | доказано 0 из 1; «в пустой таблице ключей нет» — сетка |
| «Заменить в таблице toml» | доказано композицией | доказано 1 из 1 |
| «Вставить по порядку toml» | доказано композицией | доказано 0 из 1; «вставка прибавляет ровно одну пару» — сетка |
| «Вписать пару toml» | доказано структурой | доказано 0 из 1; «вписывание пар верхнего уровня не теряет» — сетка |
| «Открыть таблицу toml» | доказано структурой | доказано 0 из 1; «открытие пар верхнего уровня не теряет» — сетка |
| «Заслонить знак toml» | доказано композицией | доказано 0 из 1; «заслонение не укорачивает» — сетка |
| «Напечатать строку toml» | доказано композицией | доказано 0 из 1; «печать строки — кавычки и не меньше знаков, чем было» — сетка |
| «Напечатать ключ toml» | доказано композицией | доказано 1 из 2; «прочий ключ печатается в кавычках» — сетка |
| «Имя пути toml» | доказано композицией | доказано 0 из 1; «пустой путь — пустое имя» — сетка |
| «Напечатать число toml» | доказано композицией | доказано 0 из 1; «конечное вещественное печатается с точкой или порядком» — сетка |
| «Напечатать значение toml» | доказано структурой | доказано 0 из 1; «напечатанное значение непусто» — сетка |
| «Напечатать раздел toml» | доказано структурой | доказано 0 из 1; «не таблица печатается строчной записью значения» — сетка |
| «Напечатать toml» | доказано композицией | доказано 0 из 1; «печать не начинается пустой строкой» — сетка |
| «Шаг разбора toml» | доказано композицией | доказано 0 из 2; «после беды ход не меняется» — сетка; «номер растёт не больше чем на один» — сетка |
| «Разобрать toml» | доказано композицией | доказано 0 из 2; «отказ несёт номер строки от единицы до числа строк» — сетка; «разобранное печатается и разбирается снова в то же значение» — сетка |
| «Значение по пути» | доказано структурой | доказано 1 из 1 |
| «Значение по пути в тексте toml» | доказано композицией | доказано 0 из 1; «неразобранный текст значения не даёт» — сетка |
«Tree map»
flang/stdlib/tree.flang — functions 20; the kernel ledger was taken from this version of the file
тотальная функция «Строка раньше»
принимает первая: строка, вторая: строка
возвращает признак
обеспечивает «пустая раньше всякой непустой» если (длина первая) равен 0 то (результат равен (1 не больше (длина вторая))) иначе да
обеспечивает «непустая не раньше пустой» если ((длина первая) больше 0) и притом ((длина вторая) равен 0) то (не результат) иначе да
обеспечивает «пустая не раньше пустой» если ((длина первая) равен 0) и притом ((длина вторая) равен 0) то (не результат) иначе да
пример «Пустая раньше непустой»
дано первая равно ""
дано вторая равно "а"
ожидается да
тотальная функция «Шаг хеша строки»
принимает акк: число, знак: строка
возвращает число
обеспечивает «шаг хеша — сложение, умножение и остаток от модуля» результат равен (((акк плюс (код символа знак)) умножить на 61803399) остаток от 100000007)
пример «Первый знак от начала свёртки»
дано акк равно 7
дано знак равно "a"
ожидается 27553048
тотальная функция «Хеш строки»
принимает текст: строка
возвращает число
обеспечивает «хеш неотрицателен» результат не меньше 0
обеспечивает «хеш меньше модуля 100000007» результат не больше 100000006
обеспечивает «хеш строго меньше модуля» результат меньше 100000007
обеспечивает «у пустой строки хеш — начало свёртки, семь» если (длина текст) равен 0 то (результат равен 7) иначе да
пример «Пустая строка»
дано текст равно ""
ожидается 7
тип «Дерево»
вариант «Лист»
вариант «Узел» содержит ключ: строка, значение: строка, приоритет: число, слева: «Дерево», справа: «Дерево»
тотальная функция «Это дерево поиска»
принимает дерево: «Дерево»
возвращает признак
обеспечивает «лист — дерево поиска» если дерево равен (вариант «Лист») то (результат равен да) иначе да
обеспечивает «у узла — порядок ключей в обоих поддеревьях и они сами деревья поиска» если дерево равен (вариант «Узел» с ключ равным («Ключ корня» от дерево) и значение равным («Значение корня» от дерево) и приоритет равным («Приоритет» от дерево) и слева равным («Левое поддерево» от дерево) и справа равным («Правое поддерево» от дерево)) то (результат равен (((длина (отфильтровать («Ключи дерева» от («Левое поддерево» от дерево)) где кк → (не («Строка раньше» от кк и («Ключ корня» от дерево))))) равен 0) и притом ((длина (отфильтровать («Ключи дерева» от («Правое поддерево» от дерево)) где кк → (не («Строка раньше» от («Ключ корня» от дерево) и кк)))) равен 0) и притом («Это дерево поиска» от («Левое поддерево» от дерево)) и притом («Это дерево поиска» от («Правое поддерево» от дерево)))) иначе да
пример «Пустое дерево — дерево поиска»
дано дерево равно вариант «Лист»
ожидается да
тотальная функция «Приоритет»
принимает дерево: «Дерево»
возвращает число
обеспечивает «у листа приоритета нет, а у узла он — записанный в узле» разбор дерево
случай вариант «Лист»
то результат равен 0
случай вариант «Узел» с ключ как кл и значение как зн и приоритет как пр и слева как л и справа как п
то результат равен пр
пример «У листа приоритета нет»
дано дерево равно вариант «Лист»
ожидается 0
тотальная функция «Ключ корня»
принимает дерево: «Дерево»
возвращает строка
обеспечивает «у листа ключа нет» если дерево равен (вариант «Лист») то (результат равен "") иначе да
пример «У листа ключа нет»
дано дерево равно вариант «Лист»
ожидается ""
тотальная функция «Значение корня»
принимает дерево: «Дерево»
возвращает строка
обеспечивает «у листа значения нет» если дерево равен (вариант «Лист») то (результат равен "") иначе да
пример «У листа значения нет»
дано дерево равно вариант «Лист»
ожидается ""
тотальная функция «Левое поддерево»
принимает дерево: «Дерево»
возвращает «Дерево»
обеспечивает «у листа левого поддерева нет» если дерево равен (вариант «Лист») то (результат равен (вариант «Лист»)) иначе да
пример «У листа левого поддерева нет»
дано дерево равно вариант «Лист»
ожидается вариант «Лист»
тотальная функция «Правое поддерево»
принимает дерево: «Дерево»
возвращает «Дерево»
обеспечивает «у листа правого поддерева нет» если дерево равен (вариант «Лист») то (результат равен (вариант «Лист»)) иначе да
пример «У листа правого поддерева нет»
дано дерево равно вариант «Лист»
ожидается вариант «Лист»
тотальная функция «Уравновесить слева»
принимает узел: «Дерево»
возвращает «Дерево»
обеспечивает «уравновешивание слева не заводит и не хоронит узлов» («Размер дерева» от результат) равен («Размер дерева» от узел)
обеспечивает «после уравновешивания слева приоритет корня не ниже прежнего» («Приоритет» от результат) не меньше («Приоритет» от узел)
обеспечивает «уравновешивать слева в дереве без узлов нечего» если («Размер дерева» от узел) равен 0 то (результат равен узел) иначе да
обеспечивает «лист уравновешивать слева нечем» если узел равен (вариант «Лист») то (результат равен узел) иначе да
обеспечивает «узел без левого ребёнка уравновешивать слева нечем» если (узел равен (вариант «Узел» с ключ равным («Ключ корня» от узел) и значение равным («Значение корня» от узел) и приоритет равным («Приоритет» от узел) и слева равным («Левое поддерево» от узел) и справа равным («Правое поддерево» от узел))) и притом ((«Левое поддерево» от узел) равен (вариант «Лист»)) то (результат равен узел) иначе да
обеспечивает «узел без левого ребёнка не меняет размера» если (узел равен (вариант «Узел» с ключ равным («Ключ корня» от узел) и значение равным («Значение корня» от узел) и приоритет равным («Приоритет» от узел) и слева равным («Левое поддерево» от узел) и справа равным («Правое поддерево» от узел))) и притом ((«Левое поддерево» от узел) равен (вариант «Лист»)) то ((«Размер дерева» от результат) равен («Размер дерева» от узел)) иначе да
обеспечивает «узел без левого ребёнка не меняет приоритета корня» если (узел равен (вариант «Узел» с ключ равным («Ключ корня» от узел) и значение равным («Значение корня» от узел) и приоритет равным («Приоритет» от узел) и слева равным («Левое поддерево» от узел) и справа равным («Правое поддерево» от узел))) и притом ((«Левое поддерево» от узел) равен (вариант «Лист»)) то ((«Приоритет» от результат) равен («Приоритет» от узел)) иначе да
пример «Лист остаётся листом»
дано узел равно вариант «Лист»
ожидается вариант «Лист»
тотальная функция «Уравновесить справа»
принимает узел: «Дерево»
возвращает «Дерево»
обеспечивает «уравновешивание справа не заводит и не хоронит узлов» («Размер дерева» от результат) равен («Размер дерева» от узел)
обеспечивает «после уравновешивания справа приоритет корня не ниже прежнего» («Приоритет» от результат) не меньше («Приоритет» от узел)
обеспечивает «уравновешивать справа в дереве без узлов нечего» если («Размер дерева» от узел) равен 0 то (результат равен узел) иначе да
обеспечивает «лист уравновешивать справа нечем» если узел равен (вариант «Лист») то (результат равен узел) иначе да
обеспечивает «узел без правого ребёнка уравновешивать справа нечем» если (узел равен (вариант «Узел» с ключ равным («Ключ корня» от узел) и значение равным («Значение корня» от узел) и приоритет равным («Приоритет» от узел) и слева равным («Левое поддерево» от узел) и справа равным («Правое поддерево» от узел))) и притом ((«Правое поддерево» от узел) равен (вариант «Лист»)) то (результат равен узел) иначе да
обеспечивает «узел без правого ребёнка не меняет размера» если (узел равен (вариант «Узел» с ключ равным («Ключ корня» от узел) и значение равным («Значение корня» от узел) и приоритет равным («Приоритет» от узел) и слева равным («Левое поддерево» от узел) и справа равным («Правое поддерево» от узел))) и притом ((«Правое поддерево» от узел) равен (вариант «Лист»)) то ((«Размер дерева» от результат) равен («Размер дерева» от узел)) иначе да
обеспечивает «узел без правого ребёнка не меняет приоритета корня» если (узел равен (вариант «Узел» с ключ равным («Ключ корня» от узел) и значение равным («Значение корня» от узел) и приоритет равным («Приоритет» от узел) и слева равным («Левое поддерево» от узел) и справа равным («Правое поддерево» от узел))) и притом ((«Правое поддерево» от узел) равен (вариант «Лист»)) то ((«Приоритет» от результат) равен («Приоритет» от узел)) иначе да
пример «Лист остаётся листом»
дано узел равно вариант «Лист»
ожидается вариант «Лист»
тотальная функция «Положить в дерево»
принимает дерево: «Дерево», ключ: строка, значение: строка
возвращает «Дерево»
обеспечивает «положенный ключ в дереве есть» «Есть ключ в дереве» от результат и ключ
обеспечивает «по положенному ключу лежит положенное значение» («Найти в дереве» от результат и ключ и "") равен значение
обеспечивает «прежний ключ дерева не растит» если («Есть ключ в дереве» от дерево и ключ) то ((«Размер дерева» от результат) равен («Размер дерева» от дерево)) иначе да
обеспечивает «новый ключ растит дерево ровно на один узел» если не («Есть ключ в дереве» от дерево и ключ) то ((«Размер дерева» от результат) равен (1 плюс («Размер дерева» от дерево))) иначе да
обеспечивает «в лист кладётся один узел с этим ключом, значением и хешем ключа» если дерево равен (вариант «Лист») то (результат равен (вариант «Узел» с ключ равным ключ и значение равным значение и приоритет равным («Хеш строки» от ключ) и слева равным (вариант «Лист») и справа равным (вариант «Лист»))) иначе да
пример «В пустое дерево»
дано дерево равно вариант «Лист»
дано ключ равно "имя"
дано значение равно "Марат"
ожидается вариант «Узел» с ключ равным "имя" и значение равным "Марат" и приоритет равным 97745194 и слева равным (вариант «Лист») и справа равным (вариант «Лист»)
тотальная функция «Найти в дереве»
принимает дерево: «Дерево», искомый: строка, запасное: строка
возвращает строка
обеспечивает «чего нет среди ключей, того поиск не выдумывает: отдаётся запасное» если не ((«Ключи дерева» от дерево) содержит искомый) то (результат равен запасное) иначе да
обеспечивает «в дереве без узлов находится только запасное» если («Размер дерева» от дерево) равен 0 то (результат равен запасное) иначе да
обеспечивает «в листе находится только запасное» если дерево равен (вариант «Лист») то (результат равен запасное) иначе да
пример «В пустом дереве — запасное»
дано дерево равно вариант «Лист»
дано искомый равно "имя"
дано запасное равно "неизвестно"
ожидается "неизвестно"
тотальная функция «Есть ключ в дереве»
принимает дерево: «Дерево», искомый: строка
возвращает признак
обеспечивает «в дереве поиска ответ да значит ключ среди ключей» если («Это дерево поиска» от дерево) и притом результат то ((«Ключи дерева» от дерево) содержит искомый) иначе да
обеспечивает «в дереве поиска ключ среди ключей значит ответ да» если («Это дерево поиска» от дерево) и притом ((«Ключи дерева» от дерево) содержит искомый) то результат иначе да
обеспечивает «есть ключ — значит запасное не проступает» если результат то ((«Найти в дереве» от дерево и искомый и "◆одно") равен («Найти в дереве» от дерево и искомый и "◆другое")) иначе да
обеспечивает «запасное не проступает — значит ключ есть» если ((«Найти в дереве» от дерево и искомый и "◆одно") равен («Найти в дереве» от дерево и искомый и "◆другое")) то результат иначе да
обеспечивает «в дереве без узлов ключа нет» если («Размер дерева» от дерево) равен 0 то (не результат) иначе да
обеспечивает «в листе ключей нет» если дерево равен (вариант «Лист») то (результат равен нет) иначе да
пример «В пустом дереве ключей нет»
дано дерево равно вариант «Лист»
дано искомый равно "имя"
ожидается нет
тотальная функция «Размер дерева»
принимает дерево: «Дерево»
возвращает число
обеспечивает «размер неотрицателен» результат не меньше 0
обеспечивает «дерево с ненулевым приоритетом корня — не пустое» если (не ((«Приоритет» от дерево) равен 0)) то (1 не больше результат) иначе да
обеспечивает «у листа размер ноль» если дерево равен (вариант «Лист») то (результат равен 0) иначе да
обеспечивает «у узла размер — единица и оба поддерева» если дерево равен (вариант «Узел» с ключ равным («Ключ корня» от дерево) и значение равным («Значение корня» от дерево) и приоритет равным («Приоритет» от дерево) и слева равным («Левое поддерево» от дерево) и справа равным («Правое поддерево» от дерево)) то (результат равен (1 плюс («Размер дерева» от («Левое поддерево» от дерево)) плюс («Размер дерева» от («Правое поддерево» от дерево)))) иначе да
пример «Пустое дерево»
дано дерево равно вариант «Лист»
ожидается 0
тотальная функция «Глубина дерева»
принимает дерево: «Дерево»
возвращает число
обеспечивает «без ключей глубина ноль» если ((длина («Ключи дерева» от дерево)) равен 0) то (результат равен 0) иначе да
обеспечивает «есть ключи — глубина не меньше одного» если ((длина («Ключи дерева» от дерево)) больше 0) то (1 не больше результат) иначе да
обеспечивает «глубина неотрицательна» результат не меньше 0
обеспечивает «у дерева без узлов глубина ноль» если («Размер дерева» от дерево) равен 0 то (результат равен 0) иначе да
обеспечивает «у листа глубина ноль» если дерево равен (вариант «Лист») то (результат равен 0) иначе да
обеспечивает «у узла глубина — глубже обоих поддеревьев» если дерево равен (вариант «Узел» с ключ равным («Ключ корня» от дерево) и значение равным («Значение корня» от дерево) и приоритет равным («Приоритет» от дерево) и слева равным («Левое поддерево» от дерево) и справа равным («Правое поддерево» от дерево)) то (результат равен («Глубже» от («Глубина дерева» от («Левое поддерево» от дерево)) и («Глубина дерева» от («Правое поддерево» от дерево)))) иначе да
пример «У пустого дерева глубины нет»
дано дерево равно вариант «Лист»
ожидается 0
тотальная функция «Глубже»
принимает слева: число, справа: число
возвращает число
обеспечивает «левая не мельче правой — глубже не мельче левой» если ((слева не меньше 0 и притом справа не меньше 0) и притом (слева не меньше справа)) то (слева не больше результат) иначе да
обеспечивает «правая глубже левой — глубже всё равно не мельче левой» если ((слева не меньше 0 и притом справа не меньше 0) и притом (не (слева не меньше справа))) то (слева не больше результат) иначе да
обеспечивает «глубже не мельче правой половины» если (слева не меньше 0 и притом справа не меньше 0) то (справа не больше результат) иначе да
обеспечивает «левая не мельче — ответ на один больше левой» если слева не меньше справа то (результат равен (1 плюс слева)) иначе да
обеспечивает «правая глубже — ответ на один больше правой» если слева меньше справа то (результат равен (1 плюс справа)) иначе да
обеспечивает «глубже — на один больше одной из половин» (результат равен (1 плюс слева)) или (результат равен (1 плюс справа))
пример «Левое глубже»
дано слева равно 3
дано справа равно 1
ожидается 4
тотальная функция «Шаг сбора ключей дерева»
принимает акк: список строки, эл: строка
возвращает список строки
обеспечивает «сбор растёт ровно на один» (длина результат) равен ((длина акк) плюс 1)
обеспечивает «дописанный ключ в сборе есть» результат содержит эл
пример «Ключ дописывается в конец»
дано акк равно ["а"]
дано эл равно "б"
ожидается ["а", "б"]
тотальная функция «Ключи дерева»
принимает дерево: «Дерево»
возвращает список строки
обеспечивает «ключей ровно столько, сколько узлов» (длина результат) равен («Размер дерева» от дерево)
обеспечивает «у дерева без узлов ключей нет» если («Размер дерева» от дерево) равен 0 то ((длина результат) равен 0) иначе да
обеспечивает «у листа ключей нет» если дерево равен (вариант «Лист») то (результат равен пустой список) иначе да
обеспечивает «у узла ключи — левые, свой сверху, и правые поверх» если дерево равен (вариант «Узел» с ключ равным («Ключ корня» от дерево) и значение равным («Значение корня» от дерево) и приоритет равным («Приоритет» от дерево) и слева равным («Левое поддерево» от дерево) и справа равным («Правое поддерево» от дерево)) то (результат равен (свёртка («Ключи дерева» от («Правое поддерево» от дерево)) начиная с (добавить («Ключ корня» от дерево) к («Ключи дерева» от («Левое поддерево» от дерево))) как акк и эл → «Шаг сбора ключей дерева» от акк и эл)) иначе да
пример «У пустого дерева ключей нет»
дано дерево равно вариант «Лист»
ожидается пустой список
тотальная функция «Дерево из ключей»
принимает ключи: список строки
возвращает «Дерево»
обеспечивает «из пустого списка — пустое дерево» если ((длина ключи) равен 0) то ((«Размер дерева» от результат) равен 0) иначе да
обеспечивает «из непустого списка — непустое дерево» если ((длина ключи) больше 0) то (1 не больше («Размер дерева» от результат)) иначе да
пример «Из пустого списка — пустое дерево»
дано ключи равно пустой список
ожидается вариант «Лист»
| Function | Termination | Claims |
|---|---|---|
| «Строка раньше» | доказано структурой | доказано 0 из 3; «пустая раньше всякой непустой» — сетка; «непустая не раньше пустой» — сетка; «пустая не раньше пустой» — сетка |
| «Шаг хеша строки» | доказано композицией | доказано 1 из 1 |
| «Хеш строки» | доказано композицией | доказано 0 из 4; «хеш неотрицателен» — сетка; «хеш меньше модуля 100000007» — сетка; «хеш строго меньше модуля» — сетка; «у пустой строки хеш — начало свёртки, семь» — сетка |
| «Это дерево поиска» | доказано структурой | доказано 2 из 2 |
| «Приоритет» | доказано композицией | доказано 1 из 1 |
| «Ключ корня» | доказано композицией | доказано 1 из 1 |
| «Значение корня» | доказано композицией | доказано 1 из 1 |
| «Левое поддерево» | доказано композицией | доказано 1 из 1 |
| «Правое поддерево» | доказано композицией | доказано 1 из 1 |
| «Уравновесить слева» | доказано композицией | доказано 4 из 7; «уравновешивание слева не заводит и не хоронит узлов» — сетка; «после уравновешивания слева приоритет корня не ниже прежнего» — сетка; «уравновешивать слева в дереве без узлов нечего» — сетка |
| «Уравновесить справа» | доказано композицией | доказано 4 из 7; «уравновешивание справа не заводит и не хоронит узлов» — сетка; «после уравновешивания справа приоритет корня не ниже прежнего» — сетка; «уравновешивать справа в дереве без узлов нечего» — сетка |
| «Положить в дерево» | доказано структурой | доказано 1 из 5; «положенный ключ в дереве есть» — сетка; «по положенному ключу лежит положенное значение» — сетка; «прежний ключ дерева не растит» — сетка; «новый ключ растит дерево ровно на один узел» — сетка |
| «Найти в дереве» | доказано структурой | доказано 1 из 3; «чего нет среди ключей, того поиск не выдумывает: отдаётся запасное» — сетка; «в дереве без узлов находится только запасное» — сетка |
| «Есть ключ в дереве» | доказано структурой | доказано 1 из 6; «в дереве поиска ответ да значит ключ среди ключей» — сетка; «в дереве поиска ключ среди ключей значит ответ да» — сетка; «есть ключ — значит запасное не проступает» — сетка; «запасное не проступает — значит ключ есть» — сетка; «в дереве без узлов ключа нет» — сетка |
| «Размер дерева» | доказано структурой | доказано 4 из 4 |
| «Глубина дерева» | доказано структурой | доказано 4 из 6; «без ключей глубина ноль» — сетка; «у дерева без узлов глубина ноль» — сетка |
| «Глубже» | доказано композицией | доказано 5 из 6; «правая глубже левой — глубже всё равно не мельче левой» — сетка |
| «Шаг сбора ключей дерева» | доказано композицией | доказано 2 из 2 |
| «Ключи дерева» | доказано структурой | доказано 2 из 4; «ключей ровно столько, сколько узлов» — сетка; «у дерева без узлов ключей нет» — сетка |
| «Дерево из ключей» | доказано композицией | доказано 1 из 2; «из непустого списка — непустое дерево» — сетка |
«Trust store»
flang/stdlib/trust-store.flang — functions 22; the kernel ledger was taken from this version of the file
тип «Ход связки»
вариант «Ход связки» содержит номер: число, внутри: признак, набрано: строка
тотальная функция «Начало связки»
возвращает «Ход связки»
обеспечивает «в начале не встречено ни одного сертификата» (результат.номер) равен 0
обеспечивает «в начале ход не внутри блока» (результат.внутри) равен нет
обеспечивает «в начале ничего не набрано» (результат.набрано) равен ""
тотальная функция «Шаг связки»
принимает ход: «Ход связки», строчка: строка, нужен: число
возвращает «Ход связки»
обеспечивает «начало блока увеличивает счёт ровно на один» если («Начинается с» от строчка и "-----BEGIN") то ((результат.номер) равен ((ход.номер) плюс 1)) иначе да
обеспечивает «начало блока ничего не набирает» если («Начинается с» от строчка и "-----BEGIN") то ((результат.набрано) равен (ход.набрано)) иначе да
пример «Начало блока считается»
дано ход равно вариант «Ход связки» с номер равным 0 и внутри равным нет и набрано равным ""
дано строчка равно "-----BEGIN CERTIFICATE-----"
дано нужен равно 1
ожидается вариант «Ход связки» с номер равным 1 и внутри равным да и набрано равным ""
тотальная функция «Ход по связке»
принимает связка: строка, нужен: число
возвращает «Ход связки»
тотальная функция «Корней в связке»
принимает связка: строка
возвращает число
пример «Пустая связка»
дано связка равно ""
ожидается 0
тотальная функция «Тело корня по счёту»
принимает связка: строка, номер: число
возвращает строка
обеспечивает «тело не длиннее всей связки» (длина результат) не больше (длина связка)
пример «Второй блок»
дано связка равно "-----BEGIN CERTIFICATE-----\nMAE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMAI=\n-----END CERTIFICATE-----\n"
дано номер равно 2
ожидается "MAI="
тотальная функция «Корень по счёту»
принимает связка: строка, номер: число
возвращает список числа
обеспечивает «октетов корня не больше, чем знаков во всей связке» (длина результат) не больше (длина связка)
пример «Первый корень — два октета DER»
дано связка равно "-----BEGIN CERTIFICATE-----\nMAE=\n-----END CERTIFICATE-----\n"
дано номер равно 1
ожидается [48, 1]
тотальная функция «Доверять некому»
принимает связка: строка
возвращает признак
обеспечивает «пустой связке не доверяют никому» если («Корней в связке» от связка) не больше 0 то (результат равен да) иначе да
пример «Пустая связка не доверяет никому»
дано связка равно ""
ожидается да
тотальная функция «Октеты подписанного тела»
принимает сертификат: список числа
возвращает список числа
обеспечивает «подписанное тело не длиннее всего сертификата» (длина результат) не больше (длина сертификат)
пример «Тело простого сертификата вместе с заголовком»
дано сертификат равно [48, 8, 48, 3, 2, 1, 2, 48, 1, 5]
ожидается [48, 3, 2, 1, 2]
тотальная функция «Место подписи сертификата»
принимает сертификат: список числа
возвращает число
обеспечивает «место подписи либо ноль, либо внутри сертификата» (результат равен 0) или (результат не больше (длина сертификат))
тотальная функция «Октеты подписи сертификата»
принимает сертификат: список числа
возвращает список числа
обеспечивает «подпись не длиннее всего сертификата» (длина результат) не больше (длина сертификат)
тотальная функция «Издатель октетами»
принимает сертификат: список числа
возвращает список числа
обеспечивает «издатель не длиннее всего сертификата» (длина результат) не больше (длина сертификат)
тотальная функция «Субъект октетами»
принимает сертификат: список числа
возвращает список числа
обеспечивает «субъект не длиннее всего сертификата» (длина результат) не больше (длина сертификат)
тип «Ход сверки имён»
вариант «Ход сверки имён» содержит место: число, сошлось: признак
тотальная функция «Начало сверки имён»
возвращает «Ход сверки имён»
обеспечивает «сверка начинается с первого места» (результат.место) равен 1
обеспечивает «до первого расхождения сверка сходится» (результат.сошлось) равен да
тотальная функция «Шаг сверки имён»
принимает ход: «Ход сверки имён», октет: число, другие: список числа
возвращает «Ход сверки имён»
обеспечивает «место двигается ровно на один» (результат.место) равен ((ход.место) плюс 1)
обеспечивает «разошедшееся не сходится обратно» если не (ход.сошлось) то ((результат.сошлось) равен нет) иначе да
пример «Октеты те же»
дано ход равно вариант «Ход сверки имён» с место равным 1 и сошлось равным да
дано октет равно 48
дано другие равно [48, 1]
ожидается вариант «Ход сверки имён» с место равным 2 и сошлось равным да
тотальная функция «Ход сверки октетов имён»
принимает первые: список числа, вторые: список числа
возвращает «Ход сверки имён»
обеспечивает «пройдены все октеты первого имени» (результат.место) равен ((длина первые) плюс 1)
тотальная функция «Имена сошлись»
принимает первые: список числа, вторые: список числа
возвращает признак
обеспечивает «имена разной длины не сходятся» если не ((длина первые) равен (длина вторые)) то (результат равен нет) иначе да
пример «Те же октеты»
дано первые равно [48, 6, 49, 4]
дано вторые равно [48, 6, 49, 4]
ожидается да
тотальная функция «Звено связано»
принимает нижний: список числа, верхний: список числа
возвращает признак
тотальная функция «Сам себе издатель»
принимает сертификат: список числа
возвращает признак
тотальная функция «Без ведущего нуля»
принимает октеты: список числа
возвращает список числа
обеспечивает «без ведущего нуля не длиннее исходного» (длина результат) не больше (длина октеты)
обеспечивает «нет ведущего нуля — список тот же» если не ((«Октет» от октеты и 1) равен 0) то (результат равен октеты) иначе да
пример «Ведущий ноль снят»
дано октеты равно [0, 178, 5]
ожидается [178, 5]
тотальная функция «Октеты открытого ключа»
принимает сертификат: список числа
возвращает список числа
обеспечивает «октеты ключа не длиннее всего сертификата» (длина результат) не больше (длина сертификат)
тотальная функция «Модуль ключа RSA»
принимает сертификат: список числа
возвращает список числа
обеспечивает «модуль не длиннее всего сертификата» (длина результат) не больше (длина сертификат)
тотальная функция «Показатель ключа RSA»
принимает сертификат: список числа
возвращает число
| Function | Termination | Claims |
|---|---|---|
| «Начало связки» | доказано композицией | доказано 3 из 3 |
| «Шаг связки» | доказано композицией | доказано 2 из 2 |
| «Ход по связке» | доказано композицией | — |
| «Корней в связке» | доказано композицией | — |
| «Тело корня по счёту» | доказано композицией | доказано 0 из 1; «тело не длиннее всей связки» — сетка |
| «Корень по счёту» | доказано композицией | доказано 0 из 1; «октетов корня не больше, чем знаков во всей связке» — сетка |
| «Доверять некому» | доказано композицией | доказано 1 из 1 |
| «Октеты подписанного тела» | доказано композицией | доказано 1 из 1 |
| «Место подписи сертификата» | доказано композицией | доказано 0 из 1; «место подписи либо ноль, либо внутри сертификата» — объявлено, не доказано |
| «Октеты подписи сертификата» | доказано композицией | доказано 0 из 1; «подпись не длиннее всего сертификата» — объявлено, не доказано |
| «Издатель октетами» | доказано композицией | доказано 0 из 1; «издатель не длиннее всего сертификата» — объявлено, не доказано |
| «Субъект октетами» | доказано композицией | доказано 0 из 1; «субъект не длиннее всего сертификата» — объявлено, не доказано |
| «Начало сверки имён» | доказано композицией | доказано 2 из 2 |
| «Шаг сверки имён» | доказано композицией | доказано 2 из 2 |
| «Ход сверки октетов имён» | доказано композицией | доказано 1 из 1 |
| «Имена сошлись» | доказано композицией | доказано 1 из 1 |
| «Звено связано» | доказано композицией | — |
| «Сам себе издатель» | доказано композицией | — |
| «Без ведущего нуля» | доказано композицией | доказано 2 из 2 |
| «Октеты открытого ключа» | доказано композицией | доказано 0 из 1; «октеты ключа не длиннее всего сертификата» — объявлено, не доказано |
| «Модуль ключа RSA» | доказано композицией | доказано 0 из 1; «модуль не длиннее всего сертификата» — объявлено, не доказано |
| «Показатель ключа RSA» | доказано композицией | — |
«Unicode case data»
flang/stdlib/unicode-case-data.flang — functions 17; the kernel ledger was never taken; take it: docs:library-status
тотальная функция «Версия данных регистра»
возвращает строка
пример «Версия Юникода, из которой сняты таблицы»
ожидается "17.0.0"
тотальная функция «Таблица свёртки регистра»
возвращает «Таблица юникода»
обеспечивает «записей в таблице 1585» результат.«всего» равен 1585
тотальная функция «Таблица свёртки регистра: куски»
возвращает список строки
обеспечивает «кусков 12» (длина результат) равен 12
тотальная функция «Кусок свёртки регистра 1»
возвращает строка
тотальная функция «Кусок свёртки регистра 2»
возвращает строка
тотальная функция «Кусок свёртки регистра 3»
возвращает строка
тотальная функция «Кусок свёртки регистра 4»
возвращает строка
тотальная функция «Кусок свёртки регистра 5»
возвращает строка
тотальная функция «Кусок свёртки регистра 6»
возвращает строка
тотальная функция «Кусок свёртки регистра 7»
возвращает строка
тотальная функция «Кусок свёртки регистра 8»
возвращает строка
тотальная функция «Кусок свёртки регистра 9»
возвращает строка
тотальная функция «Кусок свёртки регистра 10»
возвращает строка
тотальная функция «Кусок свёртки регистра 11»
возвращает строка
тотальная функция «Кусок свёртки регистра 12»
возвращает строка
тотальная функция «Таблица свёртки регистра: страницы»
возвращает список строки
обеспечивает «кусков 1» (длина результат) равен 1
тотальная функция «Кусок свёртки регистра страниц 1»
возвращает строка
«Unicode case folding»
flang/stdlib/unicode-case.flang — functions 6; the kernel ledger was never taken; take it: docs:library-status
тотальная функция «Свёртка точки»
принимает точка: число
возвращает список числа
пример «Заглавная латинская»
дано точка равно 65
ожидается [97]
тотальная функция «Свёртка точки по таблице»
принимает точка: число
возвращает список числа
пример «Знак микро сворачивается в мю»
дано точка равно 181
ожидается [956]
тотальная функция «Точки свёртки»
принимает таблица: «Таблица юникода», номер: число
возвращает список числа
тотальная функция «Свернуть регистр»
принимает текст: строка
возвращает строка
пример «Латиница»
дано текст равно "Straße"
ожидается "strasse"
тотальная функция «Ключ без регистра»
принимает текст: строка
возвращает строка
пример «Составная и разложенная É дают один ключ»
дано текст равно "É"
ожидается "é"
тотальная функция «Равны без учёта регистра»
принимает первый: строка, второй: строка
возвращает признак
пример «Регистр не важен»
дано первый равно "Москва"
дано второй равно "МОСКВА"
ожидается да
«Unicode grapheme data»
flang/stdlib/unicode-grapheme-data.flang — functions 17; the kernel ledger was never taken; take it: docs:library-status
тотальная функция «Версия данных графем»
возвращает строка
пример «Версия Юникода, из которой сняты таблицы»
ожидается "17.0.0"
тотальная функция «Таблица графем»
возвращает «Таблица юникода»
обеспечивает «записей в таблице 2168» результат.«всего» равен 2168
тотальная функция «Таблица графем: куски»
возвращает список строки
обеспечивает «кусков 8» (длина результат) равен 8
тотальная функция «Кусок графем 1»
возвращает строка
тотальная функция «Кусок графем 2»
возвращает строка
тотальная функция «Кусок графем 3»
возвращает строка
тотальная функция «Кусок графем 4»
возвращает строка
тотальная функция «Кусок графем 5»
возвращает строка
тотальная функция «Кусок графем 6»
возвращает строка
тотальная функция «Кусок графем 7»
возвращает строка
тотальная функция «Кусок графем 8»
возвращает строка
тотальная функция «Таблица графем: страницы»
возвращает список строки
обеспечивает «кусков 5» (длина результат) равен 5
тотальная функция «Кусок графем страниц 1»
возвращает строка
тотальная функция «Кусок графем страниц 2»
возвращает строка
тотальная функция «Кусок графем страниц 3»
возвращает строка
тотальная функция «Кусок графем страниц 4»
возвращает строка
тотальная функция «Кусок графем страниц 5»
возвращает строка
«Unicode graphemes»
flang/stdlib/unicode-graphemes.flang — functions 11; the kernel ledger was never taken; take it: docs:library-status
объект «Свойства графемы»
«вид»: число
«пиктограмма»: признак
«связка»: число
объект «Ход графем»
«готово»: список строки
«текущая»: строка
«прежний вид»: число
«флагов подряд»: число
«эмодзи»: число
«связка»: число
тотальная функция «Свойства знака графемы»
принимает точка: число
возвращает «Свойства графемы»
пример «Латинская буква»
дано точка равно 97
ожидается запись «Свойства графемы» с «вид» равным 0 и «пиктограмма» равным нет и «связка» равным 0
тотальная функция «Обрыв перед знаком»
принимает ход: «Ход графем», знак: «Свойства графемы»
возвращает признак
пример «Между двумя буквами — обрыв»
дано ход равно (запись «Ход графем» с «готово» равным пустой список и «текущая» равным "a" и «прежний вид» равным 0
и «флагов подряд» равным 0 и «эмодзи» равным 0 и «связка» равным 0)
дано знак равно запись «Свойства графемы» с «вид» равным 0 и «пиктограмма» равным нет и «связка» равным 0
ожидается да
тип «Исход правила»
вариант «Правило найдено» содержит обрыв: признак
вариант «Правила нет»
объект «Правило графемы»
«годится»: признак
«обрыв»: признак
тотальная функция «Первое правило»
принимает правила: список «Правило графемы»
возвращает «Исход правила»
пример «Первое годное»
дано правила равно [(запись «Правило графемы» с «годится» равным нет и «обрыв» равным да), (запись «Правило графемы»
с «годится» равным да и «обрыв» равным нет)]
ожидается вариант «Правило найдено» с обрыв равным нет
тотальная функция «Правило»
принимает годится: признак, обрыв: признак
возвращает «Правило графемы»
пример «Запрет обрыва»
дано годится равно да
дано обрыв равно нет
ожидается запись «Правило графемы» с «годится» равным да и «обрыв» равным нет
тотальная функция «Управляющий вид»
принимает вид: число
возвращает признак
пример «Возврат каретки»
дано вид равно 1
ожидается да
тотальная функция «Правила обрыва»
принимает ход: «Ход графем», знак: «Свойства графемы», прежний: число, вид: число
возвращает список «Правило графемы»
пример «Начало текста»
дано ход равно (запись «Ход графем» с «готово» равным пустой список и «текущая» равным "" и «прежний вид» равным 0 и
«флагов подряд» равным 0 и «эмодзи» равным 0 и «связка» равным 0)
дано знак равно запись «Свойства графемы» с «вид» равным 0 и «пиктограмма» равным нет и «связка» равным 0
дано прежний равно 0
дано вид равно 0
ожидается [(запись «Правило графемы» с «годится» равным да и «обрыв» равным нет), (запись «Правило графемы» с
«годится» равным нет и «обрыв» равным нет), (запись «Правило графемы» с «годится» равным нет и «обрыв» равным
да), (запись «Правило графемы» с «годится» равным нет и «обрыв» равным да), (запись «Правило графемы» с
«годится» равным нет и «обрыв» равным нет), (запись «Правило графемы» с «годится» равным нет и «обрыв» равным
нет), (запись «Правило графемы» с «годится» равным нет и «обрыв» равным нет), (запись «Правило графемы» с
«годится» равным нет и «обрыв» равным нет), (запись «Правило графемы» с «годится» равным нет и «обрыв» равным
нет), (запись «Правило графемы» с «годится» равным нет и «обрыв» равным нет), (запись «Правило графемы» с
«годится» равным нет и «обрыв» равным нет), (запись «Правило графемы» с «годится» равным нет и «обрыв» равным
нет), (запись «Правило графемы» с «годится» равным нет и «обрыв» равным нет)]
тотальная функция «Следующее эмодзи»
принимает было: число, знак: «Свойства графемы»
возвращает число
пример «Пиктограмма открывает цепочку»
дано было равно 0
дано знак равно запись «Свойства графемы» с «вид» равным 0 и «пиктограмма» равным да и «связка» равным 0
ожидается 1
тотальная функция «Следующая связка»
принимает было: число, знак: «Свойства графемы»
возвращает число
пример «Согласная открывает»
дано было равно 0
дано знак равно запись «Свойства графемы» с «вид» равным 0 и «пиктограмма» равным нет и «связка» равным 1
ожидается 1
тотальная функция «Шаг графем»
принимает ход: «Ход графем», буква: строка
возвращает «Ход графем»
пример «Знак ударения пристаёт к букве»
дано ход равно (запись «Ход графем» с «готово» равным пустой список и «текущая» равным "e" и «прежний вид» равным 0
и «флагов подряд» равным 0 и «эмодзи» равным 0 и «связка» равным 0)
дано буква равно "\u0301"
ожидается (запись «Ход графем» с «готово» равным пустой список и «текущая» равным "e\u0301" и «прежний вид» равным 4
и «флагов подряд» равным 0 и «эмодзи» равным 0 и «связка» равным 0)
тотальная функция «Графемы»
принимает текст: строка
возвращает список строки
пример «Буква со знаком ударения — одна графема»
дано текст равно "e\u0301a"
ожидается ["e\u0301", "a"]
тотальная функция «Длина в графемах»
принимает текст: строка
возвращает число
пример «Е с ударением — один знак для глаза»
дано текст равно "\u0435\u0301"
ожидается 1
«Unicode normalization data»
flang/stdlib/unicode-normalization-data.flang — functions 82; the kernel ledger was never taken; take it: docs:library-status
тотальная функция «Версия данных нормализации»
возвращает строка
пример «Версия Юникода, из которой сняты таблицы»
ожидается "17.0.0"
тотальная функция «Таблица нормализации»
возвращает «Таблица юникода»
обеспечивает «записей в таблице 6959» результат.«всего» равен 6959
тотальная функция «Таблица нормализации: куски»
возвращает список строки
обеспечивает «кусков 51» (длина результат) равен 51
тотальная функция «Кусок нормализации 1»
возвращает строка
тотальная функция «Кусок нормализации 2»
возвращает строка
тотальная функция «Кусок нормализации 3»
возвращает строка
тотальная функция «Кусок нормализации 4»
возвращает строка
тотальная функция «Кусок нормализации 5»
возвращает строка
тотальная функция «Кусок нормализации 6»
возвращает строка
тотальная функция «Кусок нормализации 7»
возвращает строка
тотальная функция «Кусок нормализации 8»
возвращает строка
тотальная функция «Кусок нормализации 9»
возвращает строка
тотальная функция «Кусок нормализации 10»
возвращает строка
тотальная функция «Кусок нормализации 11»
возвращает строка
тотальная функция «Кусок нормализации 12»
возвращает строка
тотальная функция «Кусок нормализации 13»
возвращает строка
тотальная функция «Кусок нормализации 14»
возвращает строка
тотальная функция «Кусок нормализации 15»
возвращает строка
тотальная функция «Кусок нормализации 16»
возвращает строка
тотальная функция «Кусок нормализации 17»
возвращает строка
тотальная функция «Кусок нормализации 18»
возвращает строка
тотальная функция «Кусок нормализации 19»
возвращает строка
тотальная функция «Кусок нормализации 20»
возвращает строка
тотальная функция «Кусок нормализации 21»
возвращает строка
тотальная функция «Кусок нормализации 22»
возвращает строка
тотальная функция «Кусок нормализации 23»
возвращает строка
тотальная функция «Кусок нормализации 24»
возвращает строка
тотальная функция «Кусок нормализации 25»
возвращает строка
тотальная функция «Кусок нормализации 26»
возвращает строка
тотальная функция «Кусок нормализации 27»
возвращает строка
тотальная функция «Кусок нормализации 28»
возвращает строка
тотальная функция «Кусок нормализации 29»
возвращает строка
тотальная функция «Кусок нормализации 30»
возвращает строка
тотальная функция «Кусок нормализации 31»
возвращает строка
тотальная функция «Кусок нормализации 32»
возвращает строка
тотальная функция «Кусок нормализации 33»
возвращает строка
тотальная функция «Кусок нормализации 34»
возвращает строка
тотальная функция «Кусок нормализации 35»
возвращает строка
тотальная функция «Кусок нормализации 36»
возвращает строка
тотальная функция «Кусок нормализации 37»
возвращает строка
тотальная функция «Кусок нормализации 38»
возвращает строка
тотальная функция «Кусок нормализации 39»
возвращает строка
тотальная функция «Кусок нормализации 40»
возвращает строка
тотальная функция «Кусок нормализации 41»
возвращает строка
тотальная функция «Кусок нормализации 42»
возвращает строка
тотальная функция «Кусок нормализации 43»
возвращает строка
тотальная функция «Кусок нормализации 44»
возвращает строка
тотальная функция «Кусок нормализации 45»
возвращает строка
тотальная функция «Кусок нормализации 46»
возвращает строка
тотальная функция «Кусок нормализации 47»
возвращает строка
тотальная функция «Кусок нормализации 48»
возвращает строка
тотальная функция «Кусок нормализации 49»
возвращает строка
тотальная функция «Кусок нормализации 50»
возвращает строка
тотальная функция «Кусок нормализации 51»
возвращает строка
тотальная функция «Таблица нормализации: страницы»
возвращает список строки
обеспечивает «кусков 1» (длина результат) равен 1
тотальная функция «Кусок нормализации страниц 1»
возвращает строка
тотальная функция «Точки разложений»
возвращает «Таблица юникода»
обеспечивает «записей в таблице 9222» результат.«всего» равен 9222
тотальная функция «Точки разложений: куски»
возвращает список строки
обеспечивает «кусков 17» (длина результат) равен 17
тотальная функция «Кусок точек разложений 1»
возвращает строка
тотальная функция «Кусок точек разложений 2»
возвращает строка
тотальная функция «Кусок точек разложений 3»
возвращает строка
тотальная функция «Кусок точек разложений 4»
возвращает строка
тотальная функция «Кусок точек разложений 5»
возвращает строка
тотальная функция «Кусок точек разложений 6»
возвращает строка
тотальная функция «Кусок точек разложений 7»
возвращает строка
тотальная функция «Кусок точек разложений 8»
возвращает строка
тотальная функция «Кусок точек разложений 9»
возвращает строка
тотальная функция «Кусок точек разложений 10»
возвращает строка
тотальная функция «Кусок точек разложений 11»
возвращает строка
тотальная функция «Кусок точек разложений 12»
возвращает строка
тотальная функция «Кусок точек разложений 13»
возвращает строка
тотальная функция «Кусок точек разложений 14»
возвращает строка
тотальная функция «Кусок точек разложений 15»
возвращает строка
тотальная функция «Кусок точек разложений 16»
возвращает строка
тотальная функция «Кусок точек разложений 17»
возвращает строка
тотальная функция «Таблица композиций»
возвращает «Таблица юникода»
обеспечивает «записей в таблице 961» результат.«всего» равен 961
тотальная функция «Таблица композиций: куски»
возвращает список строки
обеспечивает «кусков 5» (длина результат) равен 5
тотальная функция «Кусок композиций 1»
возвращает строка
тотальная функция «Кусок композиций 2»
возвращает строка
тотальная функция «Кусок композиций 3»
возвращает строка
тотальная функция «Кусок композиций 4»
возвращает строка
тотальная функция «Кусок композиций 5»
возвращает строка
«Unicode normalization»
flang/stdlib/unicode-normalization.flang — functions 33; the kernel ledger was never taken; take it: docs:library-status
объект «Знак нормализации»
«точка»: число
«класс»: число
«назад»: признак
объект «Свойства нормализации»
«класс»: число
«назад»: признак
«начало»: число
«длина»: число
«начало совместимого»: число
«длина совместимого»: число
объект «Ход композиции»
«готово»: список числа
«начальный»: число
«ждут»: список числа
«последний класс»: число
тотальная функция «Точки текста»
принимает текст: строка
возвращает список числа
пример «Буква и знак ударения»
дано текст равно "e\u0301"
ожидается [101, 769]
тотальная функция «Текст из точек»
принимает точки: список числа
возвращает строка
пример «Две точки»
дано точки равно [101, 769]
ожидается "e\u0301"
тотальная функция «Без свойств»
возвращает «Свойства нормализации»
пример «Ничего»
ожидается (запись «Свойства нормализации» с «класс» равным 0 и «назад» равным нет и «начало» равным 0 и «длина»
равным 0 и «начало совместимого» равным 0 и «длина совместимого» равным 0)
тотальная функция «Свойства из записи»
принимает номер: число
возвращает «Свойства нормализации»
тотальная функция «Свойства точки»
принимает точка: число
возвращает «Свойства нормализации»
пример «Латиница без свойств»
дано точка равно 65
ожидается (запись «Свойства нормализации» с «класс» равным 0 и «назад» равным нет и «начало» равным 0 и «длина»
равным 0 и «начало совместимого» равным 0 и «длина совместимого» равным 0)
тотальная функция «Точки разложения»
принимает начало: число, длина: число
возвращает список числа
пример «Пусто»
дано начало равно 0
дано длина равно 0
ожидается пустой список
тотальная функция «Номера от»
принимает начало: число, длина: число
возвращает список числа
пример «Три номера»
дано начало равно 5
дано длина равно 3
ожидается [5, 6, 7]
тотальная функция «Слог хангыля»
принимает точка: число
возвращает признак
пример «Первый слог»
дано точка равно 44032
ожидается да
тотальная функция «Разложение слога»
принимает точка: число
возвращает список числа
пример «Слог из двух»
дано точка равно 44032
ожидается [4352, 4449]
тотальная функция «Знак по точке»
принимает точка: число
возвращает «Знак нормализации»
пример «Знак ударения»
дано точка равно 769
ожидается запись «Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да
тотальная функция «Разложение точки»
принимает точка: число, совместимое: признак
возвращает список «Знак нормализации»
пример «Буква с ударением»
дано точка равно 225
дано совместимое равно нет
ожидается [(запись «Знак нормализации» с «точка» равным 97 и «класс» равным 0 и «назад» равным нет), (запись
«Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да)]
тотальная функция «Точки замены»
принимает точка: число, свойства: «Свойства нормализации», совместимое: признак
возвращает список числа
пример «Без замены»
дано точка равно 65
дано свойства равно (запись «Свойства нормализации» с «класс» равным 0 и «назад» равным нет и «начало» равным 0 и
«длина» равным 0 и «начало совместимого» равным 0 и «длина совместимого» равным 0)
дано совместимое равно да
ожидается [65]
тотальная функция «Точки по свойствам»
принимает точка: число, свойства: «Свойства нормализации», совместимое: признак
возвращает список числа
пример «Совместимая замена берётся первой»
дано точка равно 9
дано свойства равно (запись «Свойства нормализации» с «класс» равным 0 и «назад» равным нет и «начало» равным 0 и
«длина» равным 0 и «начало совместимого» равным 0 и «длина совместимого» равным 0)
дано совместимое равно да
ожидается [9]
тотальная функция «Каноническая замена»
принимает точка: число, свойства: «Свойства нормализации»
возвращает список числа
пример «Без замены»
дано точка равно 65
дано свойства равно (запись «Свойства нормализации» с «класс» равным 0 и «назад» равным нет и «начало» равным 0 и
«длина» равным 0 и «начало совместимого» равным 0 и «длина совместимого» равным 0)
ожидается [65]
тотальная функция «Вставить по классу»
принимает знак: «Знак нормализации», обратные: список «Знак нормализации»
возвращает список «Знак нормализации»
пример «Знак с меньшим классом уходит глубже»
дано знак равно запись «Знак нормализации» с «точка» равным 803 и «класс» равным 220 и «назад» равным да
дано обратные равно [(запись «Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да),
(запись «Знак нормализации» с «точка» равным 97 и «класс» равным 0 и «назад» равным нет)]
ожидается [(запись «Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да), (запись
«Знак нормализации» с «точка» равным 803 и «класс» равным 220 и «назад» равным да), (запись «Знак нормализации»
с «точка» равным 97 и «класс» равным 0 и «назад» равным нет)]
тотальная функция «Шаг упорядочения»
принимает обратные: список «Знак нормализации», знак: «Знак нормализации»
возвращает список «Знак нормализации»
пример «Начальный знак кладётся сверху»
дано обратные равно [запись «Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да]
дано знак равно запись «Знак нормализации» с «точка» равным 97 и «класс» равным 0 и «назад» равным нет
ожидается [(запись «Знак нормализации» с «точка» равным 97 и «класс» равным 0 и «назад» равным нет), (запись
«Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да)]
тотальная функция «Разложить и упорядочить»
принимает текст: строка, совместимое: признак
возвращает список «Знак нормализации»
пример «Знаки ударения встают по классам»
дано текст равно "a\u0301\u0323"
дано совместимое равно нет
ожидается [(запись «Знак нормализации» с «точка» равным 97 и «класс» равным 0 и «назад» равным нет), (запись
«Знак нормализации» с «точка» равным 803 и «класс» равным 220 и «назад» равным да), (запись «Знак нормализации»
с «точка» равным 769 и «класс» равным 230 и «назад» равным да)]
тотальная функция «Составная пара»
принимает первая: число, вторая: число
возвращает число
пример «a и ударение»
дано первая равно 97
дано вторая равно 769
ожидается 225
тотальная функция «Составная пара по таблице»
принимает первая: число, вторая: число
возвращает число
пример «Слог без конечного и конечный чамо»
дано первая равно 44032
дано вторая равно 4520
ожидается 44033
тотальная функция «Пара из таблицы»
принимает первая: число, вторая: число
возвращает число
пример «e и ударение»
дано первая равно 101
дано вторая равно 769
ожидается 233
тип «Действие композиции»
вариант «Слить с начальным» содержит составная: число
вариант «Новый начальный»
вариант «Ждать»
объект «Правило композиции»
«годится»: признак
«действие»: «Действие композиции»
тотальная функция «Действие для знака»
принимает ход: «Ход композиции», знак: «Знак нормализации»
возвращает «Действие композиции»
пример «Ударение сливается с буквой»
дано ход равно (запись «Ход композиции» с «готово» равным пустой список и «начальный» равным 101 и «ждут» равным
пустой список и «последний класс» равным -1)
дано знак равно запись «Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да
ожидается вариант «Слить с начальным» с составная равным 233
тотальная функция «Сбросить ждущие»
принимает ход: «Ход композиции»
возвращает список числа
пример «Начальный и ждущие уходят в готовое»
дано ход равно (запись «Ход композиции» с «готово» равным [65] и «начальный» равным 101 и «ждут» равным [769] и
«последний класс» равным 230)
ожидается [65, 101, 769]
тотальная функция «Шаг композиции»
принимает ход: «Ход композиции», знак: «Знак нормализации»
возвращает «Ход композиции»
пример «Ударение сливается с буквой»
дано ход равно (запись «Ход композиции» с «готово» равным пустой список и «начальный» равным 101 и «ждут» равным
пустой список и «последний класс» равным -1)
дано знак равно запись «Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да
ожидается (запись «Ход композиции» с «готово» равным пустой список и «начальный» равным 233 и «ждут» равным
пустой список и «последний класс» равным -1)
тотальная функция «Составить»
принимает знаки: список «Знак нормализации»
возвращает список числа
пример «e и ударение — одна точка»
дано знаки равно [(запись «Знак нормализации» с «точка» равным 101 и «класс» равным 0 и «назад» равным нет), (запись
«Знак нормализации» с «точка» равным 769 и «класс» равным 230 и «назад» равным да)]
ожидается [233]
тотальная функция «Точки знаков»
принимает знаки: список «Знак нормализации»
возвращает список числа
пример «Одна точка»
дано знаки равно [запись «Знак нормализации» с «точка» равным 101 и «класс» равным 0 и «назад» равным нет]
ожидается [101]
тотальная функция «NFD»
принимает текст: строка
возвращает строка
пример «Составная é раскладывается»
дано текст равно "\u00E9"
ожидается "e\u0301"
тотальная функция «NFC»
принимает текст: строка
возвращает строка
пример «Разложенная é собирается»
дано текст равно "e\u0301"
ожидается "\u00E9"
тотальная функция «Знак NFC по виду»
принимает точка: число
возвращает признак
пример «Латиница»
дано точка равно 65
ожидается да
тотальная функция «Уже в NFC по виду»
принимает текст: строка
возвращает признак
пример «Русское имя»
дано текст равно "Сумма до"
ожидается да
тотальная функция «NFKD»
принимает текст: строка
возвращает строка
пример «Лигатура раскладывается»
дано текст равно "fi"
ожидается "fi"
тотальная функция «NFKC»
принимает текст: строка
возвращает строка
пример «Полноширинная латиница становится обычной»
дано текст равно "AB"
ожидается "AB"
тотальная функция «В NFC ли»
принимает текст: строка
возвращает признак
пример «Разложенная é — не NFC»
дано текст равно "e\u0301"
ожидается нет
тотальная функция «Равны канонически»
принимает первый: строка, второй: строка
возвращает признак
пример «Две записи одной é»
дано первый равно "\u00E9"
дано второй равно "e\u0301"
ожидается да
«Unicode tables»
flang/stdlib/unicode-tables.flang — functions 11; the kernel ledger was never taken; take it: docs:library-status
объект «Таблица юникода»
«куски»: список строки
«ширина»: число
«в куске»: число
«всего»: число
«ключ»: число
«страницы»: список строки
«страниц»: число
«страница»: число
тотальная функция «Шестнадцатеричная цифра»
принимает знак: строка
возвращает число
пример «Цифра»
дано знак равно "7"
ожидается 7
тотальная функция «Шестнадцатеричное число»
принимает текст: строка
возвращает число
пример «Шесть знаков»
дано текст равно "0300C0"
ожидается 196800
тотальная функция «Поле таблицы»
принимает таблица: «Таблица юникода», номер: число, начало: число, ширина: число
возвращает число
пример «Второе поле второй записи»
дано таблица равно (запись «Таблица юникода» с «куски» равным ["0041 01\n0042 02\n", "0043 03\n"] и «ширина» равным
8 и «в куске» равным 2 и «всего» равным 3 и «ключ» равным 4 и «страницы» равным пустой список и «страниц» равным
0 и «страница» равным 256)
дано номер равно 1
дано начало равно 6
дано ширина равно 2
ожидается 2
тотальная функция «Ключ записи»
принимает таблица: «Таблица юникода», номер: число
возвращает число
пример «Ключ второй записи»
дано таблица равно (запись «Таблица юникода» с «куски» равным ["000041 1\n000300 2\n", "000400 3\n"] и «ширина»
равным 9 и «в куске» равным 2 и «всего» равным 3 и «ключ» равным 6 и «страницы» равным пустой список и «страниц»
равным 0 и «страница» равным 256)
дано номер равно 1
ожидается 768
тотальная функция «Начало страницы»
принимает таблица: «Таблица юникода», страница: число
возвращает число
пример «Записей до четвёртой страницы»
дано таблица равно (запись «Таблица юникода» с «куски» равным ["000041 1\n000300 2\n", "000400 3\n"] и «ширина»
равным 9 и «в куске» равным 2 и «всего» равным 3 и «ключ» равным 6 и «страницы» равным
["0000\n0001\n0001\n0001\n0002\n0003\n"] и «страниц» равным 6 и «страница» равным 256)
дано страница равно 4
ожидается 2
тотальная функция «Границы поиска»
принимает таблица: «Таблица юникода», ключ: число
возвращает список числа
пример «Без страниц ищется везде»
дано таблица равно (запись «Таблица юникода» с «куски» равным ["000041 1\n000300 2\n", "000400 3\n"] и «ширина»
равным 9 и «в куске» равным 2 и «всего» равным 3 и «ключ» равным 6 и «страницы» равным пустой список и «страниц»
равным 0 и «страница» равным 256)
дано ключ равно 800
ожидается [-1, 2]
тотальная функция «Шаг поиска»
принимает таблица: «Таблица юникода», ключ: число, верх: число, найдено: число, шаг: число
возвращает число
пример «Шаг за край не делается»
дано таблица равно (запись «Таблица юникода» с «куски» равным ["000041 1\n000300 2\n", "000400 3\n"] и «ширина»
равным 9 и «в куске» равным 2 и «всего» равным 3 и «ключ» равным 6 и «страницы» равным пустой список и «страниц»
равным 0 и «страница» равным 256)
дано ключ равно 1000
дано верх равно 1
дано найдено равно 1
дано шаг равно 1
ожидается 1
тотальная функция «Последняя запись не больше»
принимает таблица: «Таблица юникода», ключ: число
возвращает число
пример «Ключ меньше всех — записи нет»
дано таблица равно (запись «Таблица юникода» с «куски» равным ["000041 1\n000300 2\n", "000400 3\n"] и «ширина»
равным 9 и «в куске» равным 2 и «всего» равным 3 и «ключ» равным 6 и «страницы» равным пустой список и «страниц»
равным 0 и «страница» равным 256)
дано ключ равно 10
ожидается -1
тотальная функция «Запись с ключом»
принимает таблица: «Таблица юникода», ключ: число
возвращает число
пример «Есть»
дано таблица равно (запись «Таблица юникода» с «куски» равным ["000041 1\n000300 2\n", "000400 3\n"] и «ширина»
равным 9 и «в куске» равным 2 и «всего» равным 3 и «ключ» равным 6 и «страницы» равным пустой список и «страниц»
равным 0 и «страница» равным 256)
дано ключ равно 1024
ожидается 2
объект «Правило числа»
«годится»: признак
«значение»: число
тотальная функция «Правило числа при»
принимает годится: признак, значение: число
возвращает «Правило числа»
пример «Годное правило»
дано годится равно да
дано значение равно 7
ожидается запись «Правило числа» с «годится» равным да и «значение» равным 7
тотальная функция «Первое годное значение»
принимает правила: список «Правило числа», запасное: число
возвращает число
пример «Первое из годных»
дано правила равно [(запись «Правило числа» с «годится» равным нет и «значение» равным 1), (запись «Правило числа» с
«годится» равным да и «значение» равным 2), (запись «Правило числа» с «годится» равным да и «значение» равным
3)]
дано запасное равно 0
ожидается 2
«UTF-8»
flang/stdlib/utf8.flang — functions 16; the kernel ledger was taken from this version of the file
тип «Ход разбора utf8»
вариант «Разбираем utf8» содержит точки: список числа, копилка: число, осталось: число, нижняя: число, верхняя: число, замещений: число
тотальная функция «Одинокий суррогат»
принимает код: число
возвращает признак
обеспечивает «блок суррогатов — ровно 2048 точек подряд, считая от D800» результат равен (((код минус 55296) не меньше 0) и притом ((код минус 55296) меньше 2048))
обеспечивает «код внутри блока — суррогат» если код не меньше 55296 и притом код не больше 57343 то (результат равен да) иначе да
обеспечивает «код ниже блока суррогатом не зовётся» если не (код не меньше 55296) то (результат равен нет) иначе да
обеспечивает «код выше блока суррогатом не зовётся» если не (код не больше 57343) то (результат равен нет) иначе да
пример «Высокая половина»
дано код равно 55357
ожидается да
тотальная функция «Байты кодовой точки»
принимает код: число
возвращает список числа
обеспечивает «байтов у точки хотя бы один» 1 не больше (длина результат)
обеспечивает «байтов у точки не больше четырёх» (длина результат) не больше 4
обеспечивает «один байт выходит ровно у ASCII» ((длина результат) равен 1) равен (((«Целая часть» от код) не меньше 0) и притом ((«Целая часть» от код) меньше 128))
обеспечивает «один байт бывает только у неотрицательного кода» ((длина результат) не равен 1) или ((«Целая часть» от код) не меньше 0)
обеспечивает «единственный байт — это ровно сам код» ((длина результат) не равен 1) или ((голова результат) равен («Целая часть» от код))
обеспечивает «негодная точка даёт знак замены целиком» если не ((((«Целая часть» от код) не меньше 0) и притом ((«Целая часть» от код) не больше 1114111)) и притом (не («Одинокий суррогат» от («Целая часть» от код)))) то (результат равен [239, 191, 189]) иначе да
обеспечивает «годная точка ниже ста двадцати восьми даёт список из себя одной» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если («Целая часть» от код) меньше 128 то (результат равен [(«Целая часть» от код)]) иначе да) иначе да
обеспечивает «годная точка ниже ста двадцати восьми даёт ровно один байт» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если («Целая часть» от код) меньше 128 то ((длина результат) равен 1) иначе да) иначе да
обеспечивает «годная точка от ста двадцати восьми и ниже двух тысяч сорока восьми даёт ровно два байта» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если не ((«Целая часть» от код) меньше 128) то (если («Целая часть» от код) меньше 2048 то ((длина результат) равен 2) иначе да) иначе да) иначе да
обеспечивает «годная точка от двух тысяч сорока восьми и ниже шестидесяти пяти тысяч пятисот тридцати шести даёт ровно три байта» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если не ((«Целая часть» от код) меньше 128) то (если не ((«Целая часть» от код) меньше 2048) то (если («Целая часть» от код) меньше 65536 то ((длина результат) равен 3) иначе да) иначе да) иначе да) иначе да
обеспечивает «годная точка от шестидесяти пяти тысяч пятисот тридцати шести даёт ровно четыре байта» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если не ((«Целая часть» от код) меньше 128) то (если не ((«Целая часть» от код) меньше 2048) то (если не ((«Целая часть» от код) меньше 65536) то ((длина результат) равен 4) иначе да) иначе да) иначе да) иначе да
пример «Латинская A — один байт»
дано код равно 65
ожидается [65]
тотальная функция «Байтов в точке»
принимает код: число
возвращает число
обеспечивает «байтов в точке хотя бы один» 1 не больше результат
обеспечивает «байтов в точке не больше четырёх» результат не больше 4
обеспечивает «негодная точка — знак замены, а он трёхбайтовый» ((((«Целая часть» от код) не меньше 0) и притом ((«Целая часть» от код) не больше 1114111)) и притом (не («Одинокий суррогат» от («Целая часть» от код)))) или (результат равен 3)
обеспечивает «годная точка ниже ста двадцати восьми весит один байт» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если («Целая часть» от код) меньше 128 то (результат равен 1) иначе да) иначе да
обеспечивает «годная точка от ста двадцати восьми и ниже двух тысяч сорока восьми весит два байта» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если не ((«Целая часть» от код) меньше 128) то (если («Целая часть» от код) меньше 2048 то (результат равен 2) иначе да) иначе да) иначе да
обеспечивает «годная точка от двух тысяч сорока восьми и ниже шестидесяти пяти тысяч пятисот тридцати шести весит три байта» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если не ((«Целая часть» от код) меньше 128) то (если не ((«Целая часть» от код) меньше 2048) то (если («Целая часть» от код) меньше 65536 то (результат равен 3) иначе да) иначе да) иначе да) иначе да
обеспечивает «годная точка от шестидесяти пяти тысяч пятисот тридцати шести весит четыре байта» если («Целая часть» от код) не меньше 0 и притом («Целая часть» от код) не больше 1114111 и притом не («Одинокий суррогат» от («Целая часть» от код)) то (если не ((«Целая часть» от код) меньше 128) то (если не ((«Целая часть» от код) меньше 2048) то (если не ((«Целая часть» от код) меньше 65536) то (результат равен 4) иначе да) иначе да) иначе да) иначе да
пример «Последняя однобайтовая»
дано код равно 127
ожидается 1
тотальная функция «Досыпать байты»
принимает готовые: список числа, добавка: список числа
возвращает список числа
обеспечивает «досыпка складывает длины» (длина результат) равен ((длина готовые) плюс (длина добавка))
обеспечивает «добавка легла ХВОСТОМ: последний байт итога — последний байт добавки» (пусто добавка) или ((элемент (длина результат) в результат) равен (элемент (длина добавка) в добавка))
пример «К пустому»
дано готовые равно пустой список
дано добавка равно [1, 2]
ожидается [1, 2]
тотальная функция «Кодовые точки текста»
принимает текст: строка
возвращает список числа
обеспечивает «точек ровно столько, сколько символов» (длина результат) равен (длина текст)
обеспечивает «первая точка — код первого знака» (пусто результат) или ((голова результат) равен (код символа текст))
пример «Пусто»
дано текст равно ""
ожидается пустой список
тотальная функция «Байты текста»
принимает текст: строка
возвращает список числа
обеспечивает «байтов не меньше, чем символов» (длина результат) не меньше (длина текст)
обеспечивает «байтов не больше четырёх на знак» (длина результат) не больше ((длина текст) умножить на 4)
обеспечивает «пусто выходит ровно у пустого» (пусто результат) равен ((длина текст) равен 0)
обеспечивает «первый байт — первый байт первого знака» ((длина текст) равен 0) или ((голова результат) равен (голова («Байты кодовой точки» от (код символа текст))))
пример «Пусто»
дано текст равно ""
ожидается пустой список
тотальная функция «Длина в байтах»
принимает текст: строка
возвращает число
обеспечивает «длина в байтах не меньше длины в символах» результат не меньше (длина текст)
обеспечивает «в байтах не больше четырёх на знак» результат не больше ((длина текст) умножить на 4)
обеспечивает «ноль байтов выходит ровно у пустого текста» (результат равен 0) равен ((длина текст) равен 0)
пример «Пусто»
дано текст равно ""
ожидается 0
тотальная функция «Текст без одиноких суррогатов»
принимает текст: строка
возвращает признак
обеспечивает «на тексте из одного знака ответ — это ответ про одинокий суррогат, взятый наоборот» ((длина текст) не равен 1) или (результат равен (не («Одинокий суррогат» от (код символа текст))))
пример «Обычный текст»
дано текст равно "Мир"
ожидается да
тотальная функция «Начало разбора utf8»
возвращает «Ход разбора utf8»
обеспечивает «начальный ход пуст: ни точек, ни недобранных байтов, ни замещений» ((длина результат.точки) равен 0) и притом (результат.осталось равен 0) и притом (результат.замещений равен 0)
обеспечивает «в начальном ходе точек нет» (длина результат.точки) равен 0
обеспечивает «в начальном ходе недобранных байтов нет» результат.осталось равен 0
обеспечивает «в начальном ходе замещений нет» результат.замещений равен 0
обеспечивает «в начальном ходе копилка пуста» результат.копилка равен 0
обеспечивает «нижняя граница байта-продолжения — 128» результат.нижняя равен 128
обеспечивает «верхняя граница байта-продолжения — 191» результат.верхняя равен 191
обеспечивает «нижняя граница продолжения меньше верхней» результат.нижняя меньше результат.верхняя
обеспечивает «замещений в начальном ходе меньше одного» результат.замещений меньше 1
обеспечивает «точек в начальном ходе меньше одной» (длина результат.точки) меньше 1
пример «Пустой ход»
ожидается вариант «Разбираем utf8» с точки равным пустой список и копилка равным 0 и осталось равным 0 и нижняя равным 128 и верхняя равным 191 и замещений равным 0
тотальная функция «Начать байт»
принимает точки: список числа, замещений: число, байт: число
возвращает «Ход разбора utf8»
обеспечивает «точек не убыло при начале байта» (длина точки) не больше (длина результат.точки)
обеспечивает «замещений не убыло» замещений не больше результат.замещений
обеспечивает «ASCII добавляет ровно одну точку» если (байт не меньше 0) и притом (байт не больше 127) то ((длина результат.точки) равен ((длина точки) плюс 1)) иначе да
обеспечивает «ASCII не оставляет недобранных байтов» если (байт не меньше 0) и притом (байт не больше 127) то (результат.осталось равен 0) иначе да
обеспечивает «ASCII кладёт ровно себя» (байт меньше 0) или (байт больше 127) или ((элемент (длина результат.точки) в результат.точки) равен байт)
обеспечивает «настоящий байт ASCII замещений не добавляет» не ((байт не меньше 0) и притом (байт не больше 127)) или (результат.замещений равен замещений)
обеспечивает «двухбайтовое начало оставляет ровно один недобранный байт» ((байт не меньше 0) и притом (байт не больше 127)) или ((не (байт не меньше 194 и притом байт не больше 223)) или (результат.осталось равен 1))
обеспечивает «трёхбайтовое начало оставляет ровно два недобранных байта» ((байт не меньше 0) и притом (байт не больше 127)) или ((байт не меньше 194 и притом байт не больше 223) или ((не (байт не меньше 224 и притом байт не больше 239)) или (результат.осталось равен 2)))
обеспечивает «двухбайтовое начало точек не добавляет» ((байт не меньше 0) и притом (байт не больше 127)) или ((не (байт не меньше 194 и притом байт не больше 223)) или ((длина результат.точки) равен (длина точки)))
обеспечивает «двухбайтовое начало замещений не добавляет» ((байт не меньше 0) и притом (байт не больше 127)) или ((не (байт не меньше 194 и притом байт не больше 223)) или (результат.замещений равен замещений))
обеспечивает «трёхбайтовое начало точек не добавляет» ((байт не меньше 0) и притом (байт не больше 127)) или ((байт не меньше 194 и притом байт не больше 223) или ((не (байт не меньше 224 и притом байт не больше 239)) или ((длина результат.точки) равен (длина точки))))
обеспечивает «трёхбайтовое начало замещений не добавляет» ((байт не меньше 0) и притом (байт не больше 127)) или ((байт не меньше 194 и притом байт не больше 223) или ((не (байт не меньше 224 и притом байт не больше 239)) или (результат.замещений равен замещений)))
обеспечивает «байт, начала не открывающий, добавляет ровно одну точку» ((байт не меньше 0) и притом (байт не больше 127)) или ((байт не меньше 194 и притом байт не больше 223) или ((байт не меньше 224 и притом байт не больше 239) или ((байт не меньше 240 и притом байт не больше 244) или ((длина результат.точки) равен ((длина точки) плюс 1)))))
обеспечивает «байт, начала не открывающий, недобранных байтов не оставляет» ((байт не меньше 0) и притом (байт не больше 127)) или ((байт не меньше 194 и притом байт не больше 223) или ((байт не меньше 224 и притом байт не больше 239) или ((байт не меньше 240 и притом байт не больше 244) или (результат.осталось равен 0))))
обеспечивает «байт, начала не открывающий, добавляет ровно одно замещение» ((байт не меньше 0) и притом (байт не больше 127)) или ((байт не меньше 194 и притом байт не больше 223) или ((байт не меньше 224 и притом байт не больше 239) или ((байт не меньше 240 и притом байт не больше 244) или (результат.замещений равен (замещений плюс 1)))))
пример «ASCII выдаёт точку сразу»
дано точки равно пустой список
дано замещений равно 0
дано байт равно 65
ожидается вариант «Разбираем utf8» с точки равным [65] и копилка равным 0 и осталось равным 0 и нижняя равным 128 и верхняя равным 191 и замещений равным 0
тотальная функция «Шаг разбора utf8»
принимает ход: «Ход разбора utf8», байт: число
возвращает «Ход разбора utf8»
обеспечивает «шаг не теряет точек» (длина ход.точки) не больше (длина результат.точки)
обеспечивает «шаг не теряет замещений» ход.замещений не больше результат.замещений
обеспечивает «чистый ход: точек не убыло» не (ход.осталось равен 0) или ((длина ход.точки) не больше (длина результат.точки))
обеспечивает «байт в границах: точек не убыло» (ход.осталось равен 0) или ((не (байт не меньше ход.нижняя и притом байт не больше ход.верхняя)) или ((длина ход.точки) не больше (длина результат.точки)))
обеспечивает «байт в границах: замещений не прибавилось» (ход.осталось равен 0) или ((не (байт не меньше ход.нижняя и притом байт не больше ход.верхняя)) или (результат.замещений равен ход.замещений))
обеспечивает «последний байт последовательности даёт ровно одну точку» (ход.осталось равен 0) или ((не (байт не меньше ход.нижняя и притом байт не больше ход.верхняя)) или ((не (ход.осталось равен 1)) или ((длина результат.точки) равен ((длина ход.точки) плюс 1))))
обеспечивает «не последний байт последовательности точек не даёт» (ход.осталось равен 0) или ((не (байт не меньше ход.нижняя и притом байт не больше ход.верхняя)) или ((ход.осталось равен 1) или ((длина результат.точки) равен (длина ход.точки))))
обеспечивает «не последний байт последовательности убавляет хвост на один» (ход.осталось равен 0) или ((не (байт не меньше ход.нижняя и притом байт не больше ход.верхняя)) или ((не (ход.осталось равен 1)) или (результат.осталось равен (ход.осталось минус 1))))
обеспечивает «чистый ход и настоящий ASCII: замещений не прибавилось» не (ход.осталось равен 0) или ((не ((байт не меньше 0) и притом (байт не больше 127))) или (результат.замещений равен ход.замещений))
обеспечивает «ASCII на чистом ходе даёт ровно одну точку» если (ход.осталось равен 0) и притом (байт не меньше 0) и притом (байт не больше 127) то ((длина результат.точки) равен ((длина ход.точки) плюс 1)) иначе да
обеспечивает «ASCII на чистом ходе не оставляет хвоста» если (ход.осталось равен 0) и притом (байт не меньше 0) и притом (байт не больше 127) то (результат.осталось равен 0) иначе да
пример «Второй байт двухбайтовой замыкает точку»
дано ход равно вариант «Разбираем utf8» с точки равным пустой список и копилка равным 16 и осталось равным 1 и нижняя равным 128 и верхняя равным 191 и замещений равным 0
дано байт равно 156
ожидается вариант «Разбираем utf8» с точки равным [1052] и копилка равным 0 и осталось равным 0 и нижняя равным 128 и верхняя равным 191 и замещений равным 0
тотальная функция «Закрыть разбор utf8»
принимает ход: «Ход разбора utf8»
возвращает список числа
обеспечивает «точек стало столько же ровно тогда, когда хвост цел» ((длина результат) равен (длина ход.точки)) равен (ход.осталось равен 0)
обеспечивает «точек не убыло при закрытии разбора» (длина ход.точки) не больше (длина результат)
обеспечивает «точек прибавилось не больше одной» (длина результат) не больше ((длина ход.точки) плюс 1)
обеспечивает «оборванный хвост кончается знаком замены» (ход.осталось равен 0) или ((элемент (длина результат) в результат) равен 65533)
обеспечивает «хвост цел — точки остались теми же» не (ход.осталось равен 0) или (результат равен ход.точки)
обеспечивает «хвост оборван — точек ровно на одну больше» (ход.осталось равен 0) или ((длина результат) равен ((длина ход.точки) плюс 1))
пример «Всё разобрано»
дано ход равно вариант «Разбираем utf8» с точки равным [65] и копилка равным 0 и осталось равным 0 и нижняя равным 128 и верхняя равным 191 и замещений равным 0
ожидается [65]
тотальная функция «Кодовые точки из байтов»
принимает байты: список числа
возвращает список числа
обеспечивает «точек не больше, чем байтов» (длина результат) не больше (длина байты)
обеспечивает «пусто выходит ровно у пустых байтов» (пусто результат) равен (пусто байты)
обеспечивает «первый байт ASCII — это сама точка» (пусто байты) или ((голова байты) меньше 0) или ((голова байты) больше 127) или ((голова результат) равен (голова байты))
пример «Пусто»
дано байты равно пустой список
ожидается пустой список
тотальная функция «Байты годны как UTF-8»
принимает байты: список числа
возвращает признак
обеспечивает «пустое годно» (не (пусто байты)) или результат
обеспечивает «один байт годен ровно тогда, когда он ASCII» ((длина байты) не равен 1) или (результат равен (((голова байты) не меньше 0) и притом ((голова байты) не больше 127)))
пример «Пусто годно»
дано байты равно пустой список
ожидается да
тотальная функция «Круговой ход держится»
принимает текст: строка
возвращает признак
обеспечивает «круговой ход держится ровно там, где одиноких суррогатов нет» результат равен («Текст без одиноких суррогатов» от текст)
пример «Латиница»
дано текст равно "Man"
ожидается да
тотальная функция «Списки точек равны»
принимает первый: список числа, второй: список числа
возвращает признак
обеспечивает «равные списки одной длины и с одной головой» (не результат) или (((длина первый) равен (длина второй)) и притом ((пусто первый) или ((голова первый) равен (голова второй))))
обеспечивает «на одиночках ответ — сравнение голов» ((длина первый) не равен 1) или ((длина второй) не равен 1) или (результат равен ((голова первый) равен (голова второй)))
пример «Совпадают»
дано первый равно [1, 2]
дано второй равно [1, 2]
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Одинокий суррогат» | доказано композицией | доказано 3 из 4; «блок суррогатов — ровно 2048 точек подряд, считая от D800» — сетка |
| «Байты кодовой точки» | доказано композицией | доказано 9 из 11; «один байт выходит ровно у ASCII» — сетка; «единственный байт — это ровно сам код» — сетка |
| «Байтов в точке» | доказано композицией | доказано 7 из 7 |
| «Досыпать байты» | доказано композицией | доказано 2 из 2 |
| «Кодовые точки текста» | доказано композицией | доказано 0 из 2; «точек ровно столько, сколько символов» — сетка; «первая точка — код первого знака» — сетка |
| «Байты текста» | доказано композицией | доказано 0 из 4; «байтов не меньше, чем символов» — сетка; «байтов не больше четырёх на знак» — сетка; «пусто выходит ровно у пустого» — сетка; «первый байт — первый байт первого знака» — сетка |
| «Длина в байтах» | доказано композицией | доказано 2 из 3; «ноль байтов выходит ровно у пустого текста» — сетка |
| «Текст без одиноких суррогатов» | доказано композицией | доказано 0 из 1; «на тексте из одного знака ответ — это ответ про одинокий суррогат, взятый наоборот» — сетка |
| «Начало разбора utf8» | доказано композицией | доказано 10 из 10 |
| «Начать байт» | доказано композицией | доказано 13 из 15; «замещений не убыло» — сетка; «ASCII кладёт ровно себя» — сетка |
| «Шаг разбора utf8» | доказано композицией | доказано 9 из 11; «шаг не теряет точек» — сетка; «шаг не теряет замещений» — сетка |
| «Закрыть разбор utf8» | доказано композицией | доказано 5 из 6; «точек стало столько же ровно тогда, когда хвост цел» — сетка |
| «Кодовые точки из байтов» | доказано композицией | доказано 0 из 3; «точек не больше, чем байтов» — сетка; «пусто выходит ровно у пустых байтов» — сетка; «первый байт ASCII — это сама точка» — сетка |
| «Байты годны как UTF-8» | доказано композицией | доказано 0 из 2; «пустое годно» — сетка; «один байт годен ровно тогда, когда он ASCII» — сетка |
| «Круговой ход держится» | доказано композицией | доказано 0 из 1; «круговой ход держится ровно там, где одиноких суррогатов нет» — сетка |
| «Списки точек равны» | доказано композицией | доказано 1 из 2; «на одиночках ответ — сравнение голов» — сетка |
«UUID»
flang/stdlib/uuid.flang — functions 29; the kernel ledger was taken from this version of the file
тип «УУИД»
вариант «УУИД» содержит октеты: список числа
тип «Итог УУИД»
вариант «УУИД разобран» содержит значение: «УУИД»
вариант «Длина не та» содержит длина: число
вариант «Дефис не на месте» содержит место: число
вариант «Не шестнадцатеричный знак» содержит место: число
тип «Ход проверки знаков УУИД»
вариант «Проверяем знаки» содержит место: число, порча: число
тип «Ход сбора октетов УУИД»
вариант «Собираем октеты» содержит готовые: список числа, старший: число
тип «Ход печати УУИД»
вариант «Печатаем октеты» содержит текст: строка, номер: число
тотальная функция «Нулевой УУИД»
возвращает «УУИД»
обеспечивает «в нулевом УУИД шестнадцать октетов» (длина результат.октеты) равен 16
обеспечивает «нулевой УУИД печатается тридцатью двумя нулями через дефисы» («Напечатать УУИД» от результат) равен "00000000-0000-0000-0000-000000000000"
пример «Шестнадцать нулевых октетов»
ожидается вариант «УУИД» с октеты равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Пространство имён DNS»
возвращает «УУИД»
обеспечивает «в пространстве DNS шестнадцать октетов» (длина результат.октеты) равен 16
обеспечивает «пространство DNS печатается как в RFC 4122» («Напечатать УУИД» от результат) равен "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
обеспечивает «пространство DNS — УУИД первой версии» («Версия УУИД» от результат) равен 1
пример «Октеты пространства DNS из RFC 4122, приложение C»
ожидается вариант «УУИД» с октеты равным [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79, 212, 48, 200]
тотальная функция «Пространство имён URL»
возвращает «УУИД»
обеспечивает «в пространстве URL шестнадцать октетов» (длина результат.октеты) равен 16
обеспечивает «пространство URL печатается как в RFC 4122» («Напечатать УУИД» от результат) равен "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
обеспечивает «пространство URL — УУИД первой версии» («Версия УУИД» от результат) равен 1
пример «Октеты пространства URL из RFC 4122, приложение C»
ожидается вариант «УУИД» с октеты равным [107, 167, 184, 17, 157, 173, 17, 209, 128, 180, 0, 192, 79, 212, 48, 200]
тотальная функция «Свести к октету»
принимает значение: число
возвращает число
обеспечивает «октет не меньше нуля» результат не меньше 0
обеспечивает «октет меньше двухсот пятидесяти шести» результат меньше 256
обеспечивает «октет — целое» ((результат остаток от 1) плюс 0) равен 0
обеспечивает «байт остаётся собой» не (значение не меньше 0 и притом значение меньше 256 и притом ((значение остаток от 1) равен 0)) или (результат равен значение)
пример «Байт остаётся собой»
дано значение равно 255
ожидается 255
тотальная функция «Первые октеты»
принимает октеты: список числа, сколько: неотрицательное
возвращает список числа
обеспечивает «первых не больше, чем просили» (длина результат) не больше сколько
обеспечивает «первых не больше, чем было» (длина результат) не больше (длина октеты)
обеспечивает «если октетов хватает, взято ровно столько, сколько просили» не ((длина октеты) не меньше сколько) или ((длина результат) равен сколько)
пример «Два из трёх»
дано октеты равно [1, 2, 3]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Дополнить октеты нулями»
принимает октеты: список числа, витков: неотрицательное
возвращает список числа
обеспечивает «дополнение не укорачивает» (длина результат) не меньше (длина октеты)
обеспечивает «вход не длиннее шестнадцати не перерастает шестнадцать» не ((длина октеты) не больше 16) или ((длина результат) не больше 16)
обеспечивает «при достатке витков итог не короче шестнадцати» не (((длина октеты) плюс витков) не меньше 16) или ((длина результат) не меньше 16)
пример «Два октета добиваются нулями до шестнадцати»
дано октеты равно [1, 2]
дано витков равно 16
ожидается [1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Ровно шестнадцать октетов»
принимает октеты: список числа
возвращает список числа
обеспечивает «ровно шестнадцать» (длина результат) равен 16
обеспечивает «каждый октет — байт» свёртка результат начиная с да как годно и октет → годно и притом (октет не меньше 0 и притом октет меньше 256)
обеспечивает «первый октет — первый октет входа, сведённый к байту» разбор октеты
случай пусто
то (элемент 1 в результат) равен 0
случай голова и хвост
то (элемент 1 в результат) равен («Свести к октету» от голова)
пример «Короткий список дополняется нулями»
дано октеты равно [1, 2, 3]
ожидается [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «УУИД равны»
принимает первый: «УУИД», второй: «УУИД»
возвращает признак
обеспечивает «равные печатаются одинаково, неравные — по-разному» результат равен ((«Напечатать УУИД» от первый) равен («Напечатать УУИД» от второй))
пример «Одинаковые октеты — равны»
дано первый равно (вариант «УУИД» с октеты равным [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79, 212,
48, 200])
дано второй равно (вариант «УУИД» с октеты равным [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79, 212,
48, 200])
ожидается да
тотальная функция «Это нулевой УУИД»
принимает значение: «УУИД»
возвращает признак
обеспечивает «нулевой — тот, что печатается нулями» результат равен ((«Напечатать УУИД» от значение) равен "00000000-0000-0000-0000-000000000000")
пример «Шестнадцать нулей — нулевой»
дано значение равно (вариант «УУИД» с октеты равным [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
ожидается да
тотальная функция «Полубайт из знака»
принимает знак: строка
возвращает число
обеспечивает «полубайт не меньше минус одного» результат не меньше (0 минус 1)
обеспечивает «полубайт меньше шестнадцати» результат меньше 16
обеспечивает «цифра даёт своё значение» не ((длина знак) равен 1 и притом (код символа знак) не меньше 48 и притом (код символа знак) не больше 57) или (результат равен ((код символа знак) минус 48))
обеспечивает «знак не из шестнадцатеричной азбуки даёт минус один» не ((длина знак) равен 1 и притом не ("0123456789abcdefABCDEF" содержит знак)) или (результат равен (0 минус 1))
пример «Ноль»
дано знак равно "0"
ожидается 0
тотальная функция «Знак полубайта»
принимает полубайт: число
возвращает строка
обеспечивает «знак полубайта — ровно один знак» (длина результат) равен 1
обеспечивает «знак полубайта — из строчной шестнадцатеричной азбуки» "0123456789abcdef" содержит результат
обеспечивает «полубайт внутри азбуки читается из неё» не (полубайт не меньше 0 и притом полубайт меньше 16 и притом ((полубайт остаток от 1) равен 0)) или (результат равен (символ (полубайт плюс 1) в "0123456789abcdef"))
пример «Ноль»
дано полубайт равно 0
ожидается "0"
тотальная функция «Шестнадцатеричный октет»
принимает октет: число
возвращает строка
обеспечивает «шестнадцатеричный октет — ровно два знака» (длина результат) равен 2
обеспечивает «пара знаков байта читается обратно в тот же байт» не (октет не меньше 0 и притом октет меньше 256 и притом ((октет остаток от 1) равен 0)) или ((((«Полубайт из знака» от (символ 1 в результат)) умножить на 16) плюс («Полубайт из знака» от (символ 2 в результат))) равен октет)
пример «Двести пятьдесят пять — ff»
дано октет равно 255
ожидается "ff"
тотальная функция «Шаг проверки знаков УУИД»
принимает ход: «Ход проверки знаков УУИД», знак: строка
возвращает «Ход проверки знаков УУИД»
обеспечивает «место растёт ровно на один» результат.место равен (ход.место плюс 1)
обеспечивает «найденная порча не затирается» не (ход.порча больше 0) или (результат.порча равен ход.порча)
обеспечивает «на местах дефисов знак не проверяется» не (ход.порча не больше 0 и притом ((ход.место плюс 1) равен 9 или (ход.место плюс 1) равен 14 или (ход.место плюс 1) равен 19 или (ход.место плюс 1) равен 24)) или (результат.порча равен 0)
обеспечивает «первый не шестнадцатеричный знак вне мест дефисов помечается своим местом» не (ход.порча не больше 0 и притом не ((ход.место плюс 1) равен 9 или (ход.место плюс 1) равен 14 или (ход.место плюс 1) равен 19 или (ход.место плюс 1) равен 24) и притом ((«Полубайт из знака» от знак) меньше 0)) или (результат.порча равен (ход.место плюс 1))
пример «Шестнадцатеричный знак только двигает место»
дано ход равно (вариант «Проверяем знаки» с место равным 6 и порча равным 0)
дано знак равно "c"
ожидается вариант «Проверяем знаки» с место равным 7 и порча равным 0
тотальная функция «Место не шестнадцатеричного знака УУИД»
принимает текст: строка
возвращает число
обеспечивает «место порчи — ноль либо место внутри текста» (результат равен 0) или (результат не меньше 1 и притом результат не больше (длина текст))
обеспечивает «у пустого текста порчи нет» не ((длина текст) равен 0) или (результат равен 0)
пример «Годная запись — порчи нет, ноль»
дано текст равно "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
ожидается 0
тотальная функция «Шаг сбора октетов УУИД»
принимает ход: «Ход сбора октетов УУИД», знак: строка
возвращает «Ход сбора октетов УУИД»
обеспечивает «не шестнадцатеричный знак ничего не меняет» не ((«Полубайт из знака» от знак) меньше 0) или (результат равен ход)
обеспечивает «первый полубайт пары откладывается, октетов не прибавляя» не ((«Полубайт из знака» от знак) не меньше 0 и притом ход.старший меньше 0) или ((результат.старший равен («Полубайт из знака» от знак)) и притом ((длина результат.готовые) равен (длина ход.готовые)))
обеспечивает «второй полубайт пары замыкает октет» не ((«Полубайт из знака» от знак) не меньше 0 и притом ход.старший не меньше 0) или ((результат.старший меньше 0) и притом ((длина результат.готовые) равен ((длина ход.готовые) плюс 1)))
пример «Первый полубайт откладывается старшим»
дано ход равно (вариант «Собираем октеты» с готовые равным пустой список и старший равным -1)
дано знак равно "6"
ожидается вариант «Собираем октеты» с готовые равным пустой список и старший равным 6
тотальная функция «Октеты из знаков УУИД»
принимает текст: строка
возвращает список числа
обеспечивает «октетов не больше половины знаков» ((длина результат) умножить на 2) не больше (длина текст)
пример «Пространство DNS по знакам»
дано текст равно "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
ожидается [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79, 212, 48, 200]
тотальная функция «Разобрать УУИД»
принимает текст: строка
возвращает «Итог УУИД»
обеспечивает «длина не та названа ровно при длине не тридцать шесть, и названа своей длиной» разбор результат
случай вариант «Длина не та» с длина как сколько
то (не (сколько равен 36)) и притом (сколько равен (длина текст))
случай любое
то (длина текст) равен 36
обеспечивает «дефис не на месте называет одно из четырёх мест дефисов» разбор результат
случай вариант «Дефис не на месте» с место как названо
то (названо равен 9) или (названо равен 14) или (названо равен 19) или (названо равен 24)
случай любое
то да
обеспечивает «не шестнадцатеричный знак назван местом внутри записи» разбор результат
случай вариант «Не шестнадцатеричный знак» с место как названо
то названо не меньше 1 и притом названо не больше 36
случай любое
то да
обеспечивает «в разобранном УУИД ровно шестнадцать октетов» разбор результат
случай вариант «УУИД разобран» с значение как разобранный
то (длина разобранный.октеты) равен 16
случай любое
то да
обеспечивает «разобранный УУИД печатается и разбирается снова в тот же итог» разбор результат
случай вариант «УУИД разобран» с значение как разобранный
то («Разобрать УУИД» от («Напечатать УУИД» от разобранный)) равен результат
случай любое
то да
пример «Заглавная запись пространства DNS разбирается»
дано текст равно "6BA7B810-9DAD-11D1-80B4-00C04FD430C8"
ожидается вариант «УУИД разобран» с значение равным (вариант «УУИД» с октеты равным [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79, 212, 48, 200])
тотальная функция «Шаг печати УУИД»
принимает ход: «Ход печати УУИД», октет: число
возвращает «Ход печати УУИД»
обеспечивает «номер растёт ровно на один» результат.номер равен (ход.номер плюс 1)
обеспечивает «текст начинается с прежнего» результат.текст начинается с ход.текст
обеспечивает «после четвёртого, шестого, восьмого и десятого октета текст длиннее на три знака» не ((ход.номер плюс 1) равен 4 или (ход.номер плюс 1) равен 6 или (ход.номер плюс 1) равен 8 или (ход.номер плюс 1) равен 10) или ((длина результат.текст) равен ((длина ход.текст) плюс 3))
обеспечивает «после прочих октетов текст длиннее на два знака» ((ход.номер плюс 1) равен 4 или (ход.номер плюс 1) равен 6 или (ход.номер плюс 1) равен 8 или (ход.номер плюс 1) равен 10) или ((длина результат.текст) равен ((длина ход.текст) плюс 2))
пример «Первый октет печатается без дефиса»
дано ход равно (вариант «Печатаем октеты» с текст равным "" и номер равным 0)
дано октет равно 107
ожидается вариант «Печатаем октеты» с текст равным "6b" и номер равным 1
тотальная функция «Напечатать УУИД»
принимает значение: «УУИД»
возвращает строка
обеспечивает «печать — тридцать шесть знаков» (длина результат) равен 36
обеспечивает «дефисы стоят на девятом, четырнадцатом, девятнадцатом и двадцать четвёртом местах» ((символ 9 в результат) равен "-") и притом ((символ 14 в результат) равен "-") и притом ((символ 19 в результат) равен "-") и притом ((символ 24 в результат) равен "-")
обеспечивает «в печати только строчные шестнадцатеричные знаки и дефисы» свёртка (разложить результат на символы) начиная с да как годно и знак → годно и притом ("0123456789abcdef-" содержит знак)
обеспечивает «печать разбирается обратно в те же шестнадцать октетов» («Разобрать УУИД» от результат) равен (вариант «УУИД разобран» с значение равным (вариант «УУИД» с октеты равным («Ровно шестнадцать октетов» от значение.октеты)))
пример «Пространство DNS печатается строчными»
дано значение равно (вариант «УУИД» с октеты равным [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79,
212, 48, 200])
ожидается "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
тотальная функция «Канонический вид УУИД»
принимает текст: строка
возвращает строка
обеспечивает «канонический вид — тридцать шесть знаков либо пустая строка» ((длина результат) равен 36) или (результат равен "")
обеспечивает «канонический вид канонического вида — он сам» («Канонический вид УУИД» от результат) равен результат
обеспечивает «пустая строка — ровно у неразобранной записи» разбор («Разобрать УУИД» от текст)
случай вариант «УУИД разобран» с значение как разобранный
то не (результат равен "")
случай любое
то результат равен ""
пример «Заглавные буквы приводятся к строчным»
дано текст равно "6BA7B810-9DAD-11D1-80B4-00C04FD430C8"
ожидается "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
тотальная функция «Версия УУИД»
принимает значение: «УУИД»
возвращает число
обеспечивает «версия не меньше нуля» результат не меньше 0
обеспечивает «версия не больше пятнадцати» результат не больше 15
обеспечивает «версия — целое» ((результат остаток от 1) плюс 0) равен 0
пример «УУИД для python.org — пятой версии»
дано значение равно (вариант «УУИД» с октеты равным [136, 99, 19, 225, 59, 138, 83, 114, 155, 144, 12, 154, 238, 25,
158, 93])
ожидается 5
тотальная функция «Вариант УУИД»
принимает значение: «УУИД»
возвращает число
обеспечивает «вариант не меньше нуля» результат не меньше 0
обеспечивает «вариант не больше трёх» результат не больше 3
обеспечивает «вариант — целое» ((результат остаток от 1) плюс 0) равен 0
пример «УУИД для python.org — вариант RFC, два»
дано значение равно (вариант «УУИД» с октеты равным [136, 99, 19, 225, 59, 138, 83, 114, 155, 144, 12, 154, 238, 25,
158, 93])
ожидается 2
тотальная функция «Правка октетов УУИД»
принимает октеты: список числа, номер: число, версия: число
возвращает список числа
обеспечивает «правка длины не меняет» (длина результат) равен (длина октеты)
обеспечивает «октет не седьмой и не девятый не трогается» разбор октеты
случай пусто
то да
случай голова и хвост
то (номер равен 7) или (номер равен 9) или ((элемент 1 в результат) равен голова)
обеспечивает «седьмой октет получает версию в старший полубайт» разбор октеты
случай пусто
то да
случай голова и хвост
то (не (номер равен 7)) или ((элемент 1 в результат) равен ((голова остаток от 16) плюс (версия умножить на 16)))
обеспечивает «девятый октет получает вариант RFC в старшие два бита» разбор октеты
случай пусто
то да
случай голова и хвост
то (не (номер равен 9)) или ((элемент 1 в результат) равен ((голова остаток от 64) плюс 128))
пример «В нулях седьмой октет получает версию, девятый — вариант»
дано октеты равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано номер равно 1
дано версия равно 4
ожидается [0, 0, 0, 0, 0, 0, 64, 0, 128, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Проставить версию УУИД»
принимает октеты: список числа, версия: число
возвращает «УУИД»
обеспечивает «в итоге шестнадцать октетов» (длина результат.октеты) равен 16
обеспечивает «версия от нуля до пятнадцати проставляется в точности» не (версия не меньше 0 и притом версия не больше 15 и притом ((версия остаток от 1) равен 0)) или ((«Версия УУИД» от результат) равен версия)
обеспечивает «вариант RFC проставлен всегда» («Вариант УУИД» от результат) равен 2
пример «Октеты 255 с версией четыре»
дано октеты равно [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
дано версия равно 4
ожидается вариант «УУИД» с октеты равным [255, 255, 255, 255, 255, 255, 79, 255, 191, 255, 255, 255, 255, 255, 255,
255]
тотальная функция «Свод SHA-1 пространства и имени»
принимает пространство: «УУИД», имя: строка
возвращает список числа
обеспечивает «свод — двадцать байтов» (длина результат) равен 20
пример «Свод пространства DNS и www.example.com до правки версии»
дано пространство равно (вариант «УУИД» с октеты равным [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79,
212, 48, 200])
дано имя равно "www.example.com"
ожидается [46, 214, 101, 125, 233, 39, 70, 139, 85, 225, 38, 101, 168, 174, 166, 162, 45, 238, 62, 53]
тотальная функция «УУИД версии 5»
принимает пространство: «УУИД», имя: строка
возвращает «УУИД»
обеспечивает «в УУИД пятой версии шестнадцать октетов» (длина результат.октеты) равен 16
обеспечивает «версия пятой версии всегда пять» («Версия УУИД» от результат) равен 5
обеспечивает «вариант пятой версии всегда RFC, два» («Вариант УУИД» от результат) равен 2
обеспечивает «первые шесть октетов — начало свода SHA-1» («Первые октеты» от результат.октеты и 6) равен («Первые октеты» от («Свод SHA-1 пространства и имени» от пространство и имя) и 6)
пример «Пространство DNS и www.example.com — RFC 9562, приложение A.4»
дано пространство равно (вариант «УУИД» с октеты равным [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79,
212, 48, 200])
дано имя равно "www.example.com"
ожидается вариант «УУИД» с октеты равным [46, 214, 101, 125, 233, 39, 86, 139, 149, 225, 38, 101, 168, 174, 166,
162]
тотальная функция «Текст УУИД версии 5»
принимает пространство: «УУИД», имя: строка
возвращает строка
обеспечивает «текст пятой версии — тридцать шесть знаков» (длина результат) равен 36
обеспечивает «пятнадцатый знак — цифра версии, пятёрка» (символ 15 в результат) равен "5"
обеспечивает «двадцатый знак — вариант RFC: 8, 9, a или b» "89ab" содержит (символ 20 в результат)
пример «DNS и www.example.com — RFC 9562, приложение A.4»
дано пространство равно (вариант «УУИД» с октеты равным [107, 167, 184, 16, 157, 173, 17, 209, 128, 180, 0, 192, 79,
212, 48, 200])
дано имя равно "www.example.com"
ожидается "2ed6657d-e927-568b-95e1-2665a8aea6a2"
тотальная функция «УУИД версии 4»
принимает случайность: список числа
возвращает «УУИД»
обеспечивает «в УУИД четвёртой версии шестнадцать октетов» (длина результат.октеты) равен 16
обеспечивает «версия четвёртой версии всегда четыре, какими бы ни были входные биты» («Версия УУИД» от результат) равен 4
обеспечивает «вариант четвёртой версии всегда RFC, какими бы ни были входные биты» («Вариант УУИД» от результат) равен 2
обеспечивает «первые шесть октетов — первые шесть октетов случайности, сведённые к байтам» («Первые октеты» от результат.октеты и 6) равен («Первые октеты» от («Ровно шестнадцать октетов» от случайность) и 6)
пример «Трёх октетов случайности мало — остальные дополняются нулями»
дано случайность равно [1, 2, 3]
ожидается вариант «УУИД» с октеты равным [1, 2, 3, 0, 0, 0, 64, 0, 128, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Текст УУИД версии 4»
принимает случайность: список числа
возвращает строка
обеспечивает «текст четвёртой версии — тридцать шесть знаков» (длина результат) равен 36
обеспечивает «пятнадцатый знак — цифра версии, четвёрка» (символ 15 в результат) равен "4"
обеспечивает «двадцатый знак — вариант RFC: 8, 9, a или b» "89ab" содержит (символ 20 в результат)
пример «Шестнадцать октетов 255 — биты версии и варианта стояли неверно и переписаны»
дано случайность равно [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
ожидается "ffffffff-ffff-4fff-bfff-ffffffffffff"
| Function | Termination | Claims |
|---|---|---|
| «Нулевой УУИД» | доказано композицией | доказано 1 из 2; «нулевой УУИД печатается тридцатью двумя нулями через дефисы» — сетка |
| «Пространство имён DNS» | доказано композицией | доказано 2 из 3; «пространство DNS печатается как в RFC 4122» — сетка |
| «Пространство имён URL» | доказано композицией | доказано 2 из 3; «пространство URL печатается как в RFC 4122» — сетка |
| «Свести к октету» | доказано композицией | доказано 0 из 4; «октет не меньше нуля» — сетка; «октет меньше двухсот пятидесяти шести» — сетка; «октет — целое» — сетка; «байт остаётся собой» — сетка |
| «Первые октеты» | доказано структурой | доказано 1 из 3; «первых не больше, чем просили» — сетка; «если октетов хватает, взято ровно столько, сколько просили» — сетка |
| «Дополнить октеты нулями» | доказано точным шагом | доказано 2 из 3; «при достатке витков итог не короче шестнадцати» — сетка |
| «Ровно шестнадцать октетов» | доказано композицией | доказано 0 из 3; «ровно шестнадцать» — сетка; «каждый октет — байт» — сетка; «первый октет — первый октет входа, сведённый к байту» — сетка |
| «УУИД равны» | доказано композицией | доказано 0 из 1; «равные печатаются одинаково, неравные — по-разному» — сетка |
| «Это нулевой УУИД» | доказано композицией | доказано 0 из 1; «нулевой — тот, что печатается нулями» — сетка |
| «Полубайт из знака» | доказано композицией | доказано 1 из 4; «полубайт не меньше минус одного» — сетка; «полубайт меньше шестнадцати» — сетка; «знак не из шестнадцатеричной азбуки даёт минус один» — сетка |
| «Знак полубайта» | доказано композицией | доказано 2 из 3; «знак полубайта — из строчной шестнадцатеричной азбуки» — сетка |
| «Шестнадцатеричный октет» | доказано композицией | доказано 1 из 2; «пара знаков байта читается обратно в тот же байт» — сетка |
| «Шаг проверки знаков УУИД» | доказано композицией | доказано 2 из 4; «на местах дефисов знак не проверяется» — сетка; «первый не шестнадцатеричный знак вне мест дефисов помечается своим местом» — сетка |
| «Место не шестнадцатеричного знака УУИД» | доказано композицией | доказано 0 из 2; «место порчи — ноль либо место внутри текста» — сетка; «у пустого текста порчи нет» — сетка |
| «Шаг сбора октетов УУИД» | доказано композицией | доказано 0 из 3; «не шестнадцатеричный знак ничего не меняет» — сетка; «первый полубайт пары откладывается, октетов не прибавляя» — сетка; «второй полубайт пары замыкает октет» — сетка |
| «Октеты из знаков УУИД» | доказано композицией | доказано 0 из 1; «октетов не больше половины знаков» — сетка |
| «Разобрать УУИД» | доказано композицией | доказано 0 из 5; «длина не та названа ровно при длине не тридцать шесть, и названа своей длиной» — сетка; «дефис не на месте называет одно из четырёх мест дефисов» — сетка; «не шестнадцатеричный знак назван местом внутри записи» — сетка; «в разобранном УУИД ровно шестнадцать октетов» — сетка; «разобранный УУИД печатается и разбирается снова в тот же итог» — сетка |
| «Шаг печати УУИД» | доказано композицией | доказано 4 из 4 |
| «Напечатать УУИД» | доказано композицией | доказано 0 из 4; «печать — тридцать шесть знаков» — сетка; «дефисы стоят на девятом, четырнадцатом, девятнадцатом и двадцать четвёртом местах» — сетка; «в печати только строчные шестнадцатеричные знаки и дефисы» — сетка; «печать разбирается обратно в те же шестнадцать октетов» — сетка |
| «Канонический вид УУИД» | доказано композицией | доказано 0 из 3; «канонический вид — тридцать шесть знаков либо пустая строка» — сетка; «канонический вид канонического вида — он сам» — сетка; «пустая строка — ровно у неразобранной записи» — сетка |
| «Версия УУИД» | доказано композицией | доказано 0 из 3; «версия не меньше нуля» — сетка; «версия не больше пятнадцати» — сетка; «версия — целое» — сетка |
| «Вариант УУИД» | доказано композицией | доказано 0 из 3; «вариант не меньше нуля» — сетка; «вариант не больше трёх» — сетка; «вариант — целое» — сетка |
| «Правка октетов УУИД» | доказано структурой | доказано 1 из 4; «октет не седьмой и не девятый не трогается» — сетка; «седьмой октет получает версию в старший полубайт» — сетка; «девятый октет получает вариант RFC в старшие два бита» — сетка |
| «Проставить версию УУИД» | доказано композицией | доказано 0 из 3; «в итоге шестнадцать октетов» — сетка; «версия от нуля до пятнадцати проставляется в точности» — сетка; «вариант RFC проставлен всегда» — сетка |
| «Свод SHA-1 пространства и имени» | доказано композицией | доказано 1 из 1 |
| «УУИД версии 5» | доказано композицией | доказано 0 из 4; «в УУИД пятой версии шестнадцать октетов» — сетка; «версия пятой версии всегда пять» — сетка; «вариант пятой версии всегда RFC, два» — сетка; «первые шесть октетов — начало свода SHA-1» — сетка |
| «Текст УУИД версии 5» | доказано композицией | доказано 0 из 3; «текст пятой версии — тридцать шесть знаков» — сетка; «пятнадцатый знак — цифра версии, пятёрка» — сетка; «двадцатый знак — вариант RFC: 8, 9, a или b» — сетка |
| «УУИД версии 4» | доказано композицией | доказано 0 из 4; «в УУИД четвёртой версии шестнадцать октетов» — сетка; «версия четвёртой версии всегда четыре, какими бы ни были входные биты» — сетка; «вариант четвёртой версии всегда RFC, какими бы ни были входные биты» — сетка; «первые шесть октетов — первые шесть октетов случайности, сведённые к байтам» — сетка |
| «Текст УУИД версии 4» | доказано композицией | доказано 0 из 3; «текст четвёртой версии — тридцать шесть знаков» — сетка; «пятнадцатый знак — цифра версии, четвёрка» — сетка; «двадцатый знак — вариант RFC: 8, 9, a или b» — сетка |
«WebSocket»
flang/stdlib/websocket.flang — functions 40; the kernel ledger was taken from this version of the file
тип «Итог рукопожатия»
вариант «Рукопожатие принято» содержит ответ: строка
вариант «Нет заголовка Upgrade»
вариант «Нет заголовка Connection»
вариант «Нет ключа»
вариант «Запрос не разобран» содержит причина: строка
тип «Кадр»
вариант «Кадр» содержит конец: признак, код: число, замаскирован: признак, маска: список числа, нагрузка: список числа
тип «Итог кадра»
вариант «Кадр разобран» содержит кадр: «Кадр», остальное: список числа
вариант «Кадр неполон»
вариант «Кадр испорчен» содержит причина: строка
тип «Итог длины»
вариант «Длина прочитана» содержит длина: число, остальное: список числа
вариант «Длина неполна»
вариант «Длина не умещается в число»
тип «Отделение»
вариант «Отделено» содержит взятые: список числа, остальное: список числа
вариант «Байтов не хватило»
тип «Ход маски»
вариант «Ход маски» содержит номер: число, снятые: список числа
тотальная функция «Волшебная строка WebSocket»
возвращает строка
обеспечивает «волшебная строка — тридцать шесть знаков GUID» (длина результат) равен 36
пример «GUID из RFC 6455 §1.3»
ожидается "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
тотальная функция «Ключ принятия»
принимает ключ: строка
возвращает строка
обеспечивает «ключ принятия — двадцать восемь знаков base64 от двадцати байт свода» (длина результат) равен 28
обеспечивает «ключ принятия кончается добивкой» (символ 28 в результат) равен "="
пример «Ключ из RFC 6455 §1.2 даёт ровно тот Sec-WebSocket-Accept, что напечатан в RFC»
дано ключ равно "dGhlIHNhbXBsZSBub25jZQ=="
ожидается "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
тотальная функция «Связь просит Upgrade»
принимает значение: строка
возвращает признак
обеспечивает «одно слово Upgrade просит апгрейда» (не («Имена совпадают» от («Обрезать края» от значение) и "Upgrade")) или результат
обеспечивает «пустое значение апгрейда не просит» (не ((длина значение) равен 0)) или (не результат)
пример «Одно слово Upgrade»
дано значение равно "Upgrade"
ожидается да
тотальная функция «Текст ответа 101»
принимает принятие: строка
возвращает строка
обеспечивает «ответ начинается строкой состояния 101» результат начинается с "HTTP/1.1 101 Switching Protocols\r\n"
обеспечивает «ответ длиннее ключа принятия ровно на сто один знак» (длина результат) равен ((длина принятие) плюс 101)
обеспечивает «ответ несёт ключ принятия» результат содержит принятие
пример «Ответ 101 собран строкой, а не печатью http: у 101 не бывает Content-Length»
дано принятие равно "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
ожидается "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n"
тотальная функция «Рукопожатие по заголовкам»
принимает заголовки: список «Заголовок»
возвращает «Итог рукопожатия»
обеспечивает «без заголовка Upgrade отказ — именно нет заголовка Upgrade» («Есть заголовок» от заголовки и "Upgrade") или (результат равен (вариант «Нет заголовка Upgrade»))
обеспечивает «принятый ответ начинается кодом 101 и несёт ключ принятия от присланного ключа» разбор результат
случай вариант «Рукопожатие принято» с ответ как ответ
то (ответ начинается с "HTTP/1.1 101 ") и притом (ответ содержит (соединить "Sec-WebSocket-Accept: " с («Ключ принятия» от («Взять заголовок» от заголовки и "Sec-WebSocket-Key"))))
случай любое
то да
пример «Три нужных заголовка — принято»
дано заголовки равно [вариант «Заголовок» с имя равным "Upgrade" и значение равным "websocket", вариант «Заголовок» с имя равным "Connection" и значение равным "Upgrade", вариант «Заголовок» с имя равным "Sec-WebSocket-Key" и значение равным "dGhlIHNhbXBsZSBub25jZQ=="]
ожидается вариант «Рукопожатие принято» с ответ равным "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n"
тотальная функция «Ответ рукопожатия»
принимает текст: строка
возвращает «Итог рукопожатия»
обеспечивает «неполный запрос не разобран, и причина названа» (не ((«Разобрать запрос» от текст) равен (вариант «Запрос неполон»))) или (результат равен (вариант «Запрос не разобран» с причина равным "запрос неполон"))
обеспечивает «принятое рукопожатие начинается кодом 101» разбор результат
случай вариант «Рукопожатие принято» с ответ как ответ
то ответ начинается с "HTTP/1.1 101 "
случай любое
то да
пример «Запрос из RFC 6455 §1.2 принят с тем же Sec-WebSocket-Accept, что в RFC»
дано текст равно "GET /chat HTTP/1.1\r\nHost: server.example.com\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nOrigin: http://example.com\r\nSec-WebSocket-Protocol: chat, superchat\r\nSec-WebSocket-Version: 13\r\n\r\n"
ожидается вариант «Рукопожатие принято» с ответ равным "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n"
тотальная функция «Свести к октету»
принимает число: число
возвращает число
обеспечивает «октет снизу» результат не меньше 0
обеспечивает «октет сверху» результат меньше 256
обеспечивает «за отрезком октета — ноль» (число не меньше 0 и притом число не больше 255) или (результат равен 0)
обеспечивает «целый октет остаётся собой» (не (число не меньше 0 и притом число не больше 255 и притом ((число остаток от 1) плюс 0) равен 0)) или (результат равен (число плюс 0))
пример «Байт остаётся собой»
дано число равно 200
ожидается 200
тотальная функция «Все октеты»
принимает байты: список числа
возвращает признак
обеспечивает «пустой список — октеты» (не (пусто байты)) или результат
обеспечивает «на одном числе октетность — это сведение к октету, его не изменившее» (не ((длина байты) равен 1)) или (результат равен ((«Свести к октету» от (голова байты)) равен (голова байты)))
пример «Пусто — октеты»
дано байты равно пустой список
ожидается да
тотальная функция «Веса разрядов байта»
возвращает список числа
обеспечивает «разрядов ровно восемь» (длина результат) равен 8
пример «Восемь весов, от единицы до ста двадцати восьми»
ожидается [1, 2, 4, 8, 16, 32, 64, 128]
тотальная функция «Исключающее или двух байтов»
принимает первый: число, второй: число
возвращает число
обеспечивает «итог — октет снизу» результат не меньше 0
обеспечивает «итог — октет сверху» результат меньше 256
обеспечивает «ноль вторым ничего не меняет у октета» (не (второй равен 0)) или (результат равен («Свести к октету» от первый))
обеспечивает «байт сам с собой даёт ноль» (не (первый равен второй)) или (результат равен 0)
пример «Ноль с нулём»
дано первый равно 0
дано второй равно 0
ожидается 0
тотальная функция «Байт маски»
принимает маска: список числа, номер: число
возвращает число
обеспечивает «пустая маска даёт ноль» (не (пусто маска)) или (результат равен 0)
обеспечивает «отрицательный номер даёт ноль» (не (номер меньше 0)) или (результат равен 0)
обеспечивает «на маске из одного байта всякий целый номер даёт этот байт» (не (((длина маска) равен 1) и притом (номер не меньше 0) и притом (((номер остаток от 1) плюс 0) равен 0))) или (результат равен (голова маска))
пример «Нулевой номер — первый байт маски»
дано маска равно [55, 250, 33, 61]
дано номер равно 0
ожидается 55
тотальная функция «Шаг маски»
принимает маска: список числа, ход: «Ход маски», байт: число
возвращает «Ход маски»
обеспечивает «счёт растёт на один» результат.номер равен (ход.номер плюс 1)
обеспечивает «снятых становится на один больше» (длина результат.снятые) равен ((длина ход.снятые) плюс 1)
пример «Первый байт провода снимается первым байтом маски, счёт растёт»
дано маска равно [55, 250, 33, 61]
дано ход равно вариант «Ход маски» с номер равным 0 и снятые равным пустой список
дано байт равно 127
ожидается вариант «Ход маски» с номер равным 1 и снятые равным [72]
тотальная функция «Наложить маску»
принимает маска: список числа, байты: список числа
возвращает список числа
обеспечивает «маска длины не меняет» (длина результат) равен (длина байты)
обеспечивает «пустая нагрузка остаётся пустой» (не (пусто байты)) или (пусто результат)
пример «Маска RFC 6455 §5.7 снимается с провода в Hello»
дано маска равно [55, 250, 33, 61]
дано байты равно [127, 159, 77, 81, 88]
ожидается [72, 101, 108, 108, 111]
тотальная функция «Отделить байты»
принимает байты: список числа, сколько: число
возвращает «Отделение»
обеспечивает «взято ровно столько, сколько просили целым, и вместе с остатком это весь вход» разбор результат
случай вариант «Отделено» с взятые как взятые и остальное как остальное
то (не ((сколько не меньше 0) и притом (((сколько остаток от 1) плюс 0) равен 0)) или ((длина взятые) равен (сколько плюс 0))) и притом (((длина взятые) плюс (длина остальное)) равен (длина байты))
случай вариант «Байтов не хватило»
то да
обеспечивает «нехватка — ровно когда конечного просили больше, чем есть» разбор результат
случай вариант «Отделено» с взятые как взятые и остальное как остальное
то (не ((сколько минус сколько) равен 0)) или (не (сколько больше (длина байты)))
случай вариант «Байтов не хватило»
то (не ((сколько минус сколько) равен 0)) или (сколько больше (длина байты))
пример «Два байта из трёх»
дано байты равно [1, 2, 3]
дано сколько равно 2
ожидается вариант «Отделено» с взятые равным [1, 2] и остальное равным [3]
тотальная функция «Приписать к отделённым»
принимает байт: число, отделение: «Отделение»
возвращает «Отделение»
обеспечивает «нехватка байтов приписку переживает» (не (отделение равен (вариант «Байтов не хватило»))) или (результат равен (вариант «Байтов не хватило»))
обеспечивает «приписка удлиняет взятые ровно на один и остатка не трогает» разбор результат
случай вариант «Отделено» с взятые как стало и остальное как хвостик
то разбор отделение
случай вариант «Отделено» с взятые как было и остальное как хвост
то ((длина стало) равен ((длина было) плюс 1)) и притом ((длина хвостик) равен (длина хвост))
случай вариант «Байтов не хватило»
то нет
случай вариант «Байтов не хватило»
то отделение равен (вариант «Байтов не хватило»)
пример «Байт встаёт первым среди взятых»
дано байт равно 1
дано отделение равно вариант «Отделено» с взятые равным [2] и остальное равным [3]
ожидается вариант «Отделено» с взятые равным [1, 2] и остальное равным [3]
тотальная функция «Первые байты»
принимает байты: список числа, сколько: число
возвращает список числа
обеспечивает «первых не больше, чем есть» (длина результат) не больше (длина байты)
пример «Первые два»
дано байты равно [1, 2, 3]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Число из байтов старшим вперёд»
принимает байты: список числа
возвращает число
обеспечивает «число из октетов неотрицательно» результат не меньше 0
обеспечивает «пусто — ноль» (не (пусто байты)) или (результат равен 0)
обеспечивает «один байт — его же октет» (не ((длина байты) равен 1)) или (результат равен («Свести к октету» от (голова байты)))
пример «Пусто — ноль»
дано байты равно пустой список
ожидается 0
тотальная функция «Длина из байтов»
принимает отделение: «Отделение»
возвращает «Итог длины»
обеспечивает «нехватка байтов длины — длина неполна» (не (отделение равен (вариант «Байтов не хватило»))) или (результат равен (вариант «Длина неполна»))
обеспечивает «прочитанная длина неотрицательна и умещается в число» разбор результат
случай вариант «Длина прочитана» с длина как длина и остальное как остальное
то (длина не меньше 0) и притом (длина меньше 9007199254740992)
случай любое
то да
пример «Два байта длины прочитаны»
дано отделение равно вариант «Отделено» с взятые равным [0, 126] и остальное равным [97]
ожидается вариант «Длина прочитана» с длина равным 126 и остальное равным [97]
тотальная функция «Длина по байту»
принимает второй: число, дальше: список числа
возвращает «Итог длины»
обеспечивает «короткая форма читает длину из самого байта, остаток не трогая» (не (((«Свести к октету» от второй) остаток от 128) меньше 126)) или (результат равен (вариант «Длина прочитана» с длина равным ((«Свести к октету» от второй) остаток от 128) и остальное равным дальше))
обеспечивает «прочитанная длина неотрицательна» разбор результат
случай вариант «Длина прочитана» с длина как длина и остальное как остальное
то длина не меньше 0
случай любое
то да
пример «Короткая форма: длина в самом байте»
дано второй равно 5
дано дальше равно [72, 101]
ожидается вариант «Длина прочитана» с длина равным 5 и остальное равным [72, 101]
тотальная функция «Длина кадра»
принимает заголовок: список числа
возвращает «Итог длины»
обеспечивает «короче двух байтов — длина неполна» (не ((длина заголовок) меньше 2)) или (результат равен (вариант «Длина неполна»))
обеспечивает «остаток после длины короче заголовка» разбор результат
случай вариант «Длина прочитана» с длина как длина и остальное как остальное
то (длина остальное) меньше (длина заголовок)
случай любое
то да
пример «Заголовок с длиной 127 значит 65536 байт»
дано заголовок равно [130, 127, 0, 0, 0, 0, 0, 1, 0, 0]
ожидается вариант «Длина прочитана» с длина равным 65536 и остальное равным пустой список
тотальная функция «Кадр из нагрузки»
принимает первый: число, замаскирован: признак, маска: список числа, отделение: «Отделение»
возвращает «Итог кадра»
обеспечивает «нехватка нагрузки — кадр неполон» (не (отделение равен (вариант «Байтов не хватило»))) или (результат равен (вариант «Кадр неполон»))
обеспечивает «разобранный кадр несёт код в четыре бита, данную маску и признак маски как дан» разбор результат
случай вариант «Кадр разобран» с кадр как кадр и остальное как остаток
то (кадр.код не меньше 0) и притом (кадр.код меньше 16) и притом (кадр.замаскирован равен замаскирован) и притом ((длина кадр.маска) равен (длина маска))
случай любое
то да
пример «Нагрузка отделена — кадр собран, маска снята»
дано первый равно 129
дано замаскирован равно да
дано маска равно [55, 250, 33, 61]
дано отделение равно вариант «Отделено» с взятые равным [127, 159, 77, 81, 88] и остальное равным пустой список
ожидается вариант «Кадр разобран» с кадр равным (вариант «Кадр» с конец равным да и код равным 1 и замаскирован равным да и маска равным [55, 250, 33, 61] и нагрузка равным [72, 101, 108, 108, 111]) и остальное равным пустой список
тотальная функция «Кадр с маской»
принимает первый: число, длина: число, отделение: «Отделение»
возвращает «Итог кадра»
обеспечивает «маска не дочитана — кадр неполон» (не (отделение равен (вариант «Байтов не хватило»))) или (результат равен (вариант «Кадр неполон»))
обеспечивает «разобранный кадр замаскирован» разбор результат
случай вариант «Кадр разобран» с кадр как кадр и остальное как остаток
то кадр.замаскирован
случай любое
то да
пример «Маска отделена, нагрузки хватило»
дано первый равно 129
дано длина равно 1
дано отделение равно вариант «Отделено» с взятые равным [55, 250, 33, 61] и остальное равным [127, 9]
ожидается вариант «Кадр разобран» с кадр равным (вариант «Кадр» с конец равным да и код равным 1 и замаскирован равным да и маска равным [55, 250, 33, 61] и нагрузка равным [72]) и остальное равным [9]
тотальная функция «Кадр по длине»
принимает первый: число, второй: число, итог: «Итог длины»
возвращает «Итог кадра»
обеспечивает «неполная длина — неполный кадр» (не (итог равен (вариант «Длина неполна»))) или (результат равен (вариант «Кадр неполон»))
обеспечивает «длина шире числа — испорченный кадр с названной причиной» (не (итог равен (вариант «Длина не умещается в число»))) или (результат равен (вариант «Кадр испорчен» с причина равным "длина 127 шире 2^53"))
обеспечивает «признак маски разобранного кадра — старший бит второго байта» разбор результат
случай вариант «Кадр разобран» с кадр как кадр и остальное как остаток
то кадр.замаскирован равен ((«Свести к октету» от второй) не меньше 128)
случай любое
то да
пример «Длина неполна — кадр неполон»
дано первый равно 129
дано второй равно 127
дано итог равно вариант «Длина неполна»
ожидается вариант «Кадр неполон»
тотальная функция «Разобрать кадр»
принимает байты: список числа
возвращает «Итог кадра»
обеспечивает «короче двух байтов — кадр неполон» (не ((длина байты) меньше 2)) или (результат равен (вариант «Кадр неполон»))
обеспечивает «разобранная нагрузка ровно объявленной длины, а остаток короче входа» разбор результат
случай вариант «Кадр разобран» с кадр как кадр и остальное как остаток
то разбор («Длина кадра» от байты)
случай вариант «Длина прочитана» с длина как длина и остальное как дальше
то ((длина кадр.нагрузка) равен длина) и притом ((длина остаток) меньше (длина байты))
случай любое
то нет
случай любое
то да
обеспечивает «код разобранного кадра — четыре бита» разбор результат
случай вариант «Кадр разобран» с кадр как кадр и остальное как остаток
то (кадр.код не меньше 0) и притом (кадр.код меньше 16)
случай любое
то да
пример «Кадр — список чисел-октетов, как в sha1 и aes, а не список строк, как в wire»
дано байты равно [129, 5, 72, 101, 108, 108, 111]
ожидается вариант «Кадр разобран» с кадр равным (вариант «Кадр» с конец равным да и код равным 1 и замаскирован равным нет и маска равным пустой список и нагрузка равным [72, 101, 108, 108, 111]) и остальное равным пустой список
тотальная функция «Октет по весу»
принимает число: число, вес: число
возвращает число
обеспечивает «октет по весу единица — младший октет целого» (не ((число не меньше 0) и притом (((число остаток от 1) плюс 0) равен 0) и притом (вес равен 1))) или (результат равен ((число остаток от 256) плюс 0))
обеспечивает «октет по весу меньше двухсот пятидесяти шести, пока конечен» (не ((результат минус результат) равен 0)) или (результат меньше 256)
пример «Младший октет 65536 — ноль»
дано число равно 65536
дано вес равно 1
ожидается 0
тотальная функция «Расширенная длина»
принимает сколько: число
возвращает список числа
обеспечивает «до ста двадцати пяти расширения нет» (не (сколько не больше 125)) или (пусто результат)
обеспечивает «средняя форма — два байта» (не (сколько больше 125 и притом сколько не больше 65535)) или ((длина результат) равен 2)
обеспечивает «длинная форма — восемь байтов» (не (сколько больше 65535)) или ((длина результат) равен 8)
пример «До 125 включительно расширения нет»
дано сколько равно 125
ожидается пустой список
тотальная функция «Байт длины и маски»
принимает сколько: число, замаскирован: признак
возвращает число
обеспечивает «байт длины — октет снизу» результат не меньше 0
обеспечивает «байт длины — октет сверху» результат меньше 256
обеспечивает «без маски байт меньше ста двадцати восьми» замаскирован или (результат меньше 128)
обеспечивает «под маской байт не меньше ста двадцати восьми» (не замаскирован) или (результат не меньше 128)
пример «Пять байт без маски»
дано сколько равно 5
дано замаскирован равно нет
ожидается 5
тотальная функция «Байт конца и кода»
принимает конец: признак, код: число
возвращает число
обеспечивает «первый байт — октет снизу» результат не меньше 0
обеспечивает «первый байт — октет сверху» результат меньше 256
обеспечивает «без конца первый байт меньше ста двадцати восьми» конец или (результат меньше 128)
обеспечивает «биты RSV в первом байте не подняты» (результат остаток от 128) меньше 16
пример «Конечный текстовый кадр — 129»
дано конец равно да
дано код равно 1
ожидается 129
тотальная функция «Кадр годен»
принимает кадр: «Кадр»
возвращает признак
обеспечивает «код годного кадра — четыре бита» (не результат) или ((кадр.код не меньше 0) и притом (кадр.код меньше 16))
обеспечивает «маска годного замаскированного кадра — четыре байта» (не результат) или (не кадр.замаскирован) или ((длина кадр.маска) равен 4)
обеспечивает «у годного незамаскированного кадра маски нет» (не результат) или кадр.замаскирован или (пусто кадр.маска)
пример «Незамаскированный Hello годен»
дано кадр равно вариант «Кадр» с конец равным да и код равным 1 и замаскирован равным нет и маска равным пустой список и нагрузка равным [72, 101, 108, 108, 111]
ожидается да
тотальная функция «Собрать кадр»
принимает кадр: «Кадр»
возвращает список числа
обеспечивает «кадр на проводе не короче двух байтов» (длина результат) не меньше 2
обеспечивает «кадр на проводе не короче заголовка с нагрузкой» (длина результат) не меньше ((длина кадр.нагрузка) плюс 2)
обеспечивает «годный кадр возвращается разбором без остатка» (не («Кадр годен» от кадр)) или ((«Разобрать кадр» от результат) равен (вариант «Кадр разобран» с кадр равным кадр и остальное равным пустой список))
пример «Незамаскированный Hello из RFC 6455 §5.7»
дано кадр равно вариант «Кадр» с конец равным да и код равным 1 и замаскирован равным нет и маска равным пустой список и нагрузка равным [72, 101, 108, 108, 111]
ожидается [129, 5, 72, 101, 108, 108, 111]
тотальная функция «Текст кадра»
принимает нагрузка: список числа
возвращает строка
обеспечивает «пустая нагрузка — пустой текст» (не (пусто нагрузка)) или (результат равен "")
обеспечивает «знаков не больше, чем байтов» (длина результат) не больше (длина нагрузка)
пример «Hello»
дано нагрузка равно [72, 101, 108, 108, 111]
ожидается "Hello"
тотальная функция «Текстовый кадр»
принимает текст: строка
возвращает «Кадр»
обеспечивает «текстовый кадр несёт код один» результат.код равен 1
обеспечивает «текстовый кадр конечный» результат.конец равен да
обеспечивает «текстовый кадр с сервера не замаскирован» результат.замаскирован равен нет
обеспечивает «текстовый кадр годен» («Кадр годен» от результат) равен да
обеспечивает «текст возвращается из нагрузки, пока в нём нет одиноких суррогатов» (не («Текст без одиноких суррогатов» от текст)) или ((«Текст кадра» от результат.нагрузка) равен текст)
пример «Hello — конечный незамаскированный кадр с кодом 1»
дано текст равно "Hello"
ожидается вариант «Кадр» с конец равным да и код равным 1 и замаскирован равным нет и маска равным пустой список и нагрузка равным [72, 101, 108, 108, 111]
тотальная функция «Повторить байт»
принимает байт: число, сколько: неотрицательное
возвращает список числа
обеспечивает «повторов ровно столько, сколько просили» (длина результат) равен сколько
пример «Три буквы a»
дано байт равно 97
дано сколько равно 3
ожидается [97, 97, 97]
тотальная функция «Кадр из 126 букв a»
возвращает «Кадр»
обеспечивает «нагрузка ровно из ста двадцати шести байт» (длина результат.нагрузка) равен 126
пример «Нагрузка ровно из 126 байт»
ожидается вариант «Кадр» с конец равным да и код равным 1 и замаскирован равным нет и маска равным пустой список и нагрузка равным [97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97]
тотальная функция «Начало провода кадра из 126 букв a»
возвращает список числа
обеспечивает «начала ровно четыре байта» (длина результат) равен 4
пример «Заголовок средней формы без маски: 129, 126, 0, 126»
ожидается [129, 126, 0, 126]
тотальная функция «Длина провода кадра из 126 букв a»
возвращает число
обеспечивает «провод длиннее нагрузки» результат больше 126
пример «Четыре байта заголовка и 126 байт нагрузки»
ожидается 130
тотальная функция «Кадр из 126 букв a идёт по кругу»
возвращает признак
обеспечивает «круг средней формы держится» результат равен да
пример «Разбор собранного кадра средней формы даёт исходный кадр без остатка»
ожидается да
тотальная функция «Кадр из 126 букв a под маской»
возвращает «Кадр»
обеспечивает «маска из четырёх байт» (длина результат.маска) равен 4
обеспечивает «кадр под маской годен» («Кадр годен» от результат) равен да
пример «Тот же кадр, замаскирован маской 1, 2, 3, 4»
ожидается вариант «Кадр» с конец равным да и код равным 1 и замаскирован равным да и маска равным [1, 2, 3, 4] и нагрузка равным [97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97]
тотальная функция «Начало провода кадра из 126 букв a под маской»
возвращает список числа
обеспечивает «начала ровно двенадцать байт» (длина результат) равен 12
пример «Заголовок, маска и первые четыре байта нагрузки на проводе: 96, 99, 98, 101»
ожидается [129, 254, 0, 126, 1, 2, 3, 4, 96, 99, 98, 101]
тотальная функция «Кадр из 126 букв a под маской идёт по кругу»
возвращает признак
обеспечивает «круг средней формы под маской держится» результат равен да
пример «Разбор собранного замаскированного кадра снимает маску и даёт 126 букв a»
ожидается да
| Function | Termination | Claims |
|---|---|---|
| «Волшебная строка WebSocket» | доказано композицией | доказано 1 из 1 |
| «Ключ принятия» | доказано композицией | доказано 0 из 2; «ключ принятия — двадцать восемь знаков base64 от двадцати байт свода» — сетка; «ключ принятия кончается добивкой» — сетка |
| «Связь просит Upgrade» | доказано композицией | доказано 0 из 2; «одно слово Upgrade просит апгрейда» — сетка; «пустое значение апгрейда не просит» — сетка |
| «Текст ответа 101» | доказано композицией | доказано 2 из 3; «ответ несёт ключ принятия» — сетка |
| «Рукопожатие по заголовкам» | доказано композицией | доказано 0 из 2; «без заголовка Upgrade отказ — именно нет заголовка Upgrade» — сетка; «принятый ответ начинается кодом 101 и несёт ключ принятия от присланного ключа» — сетка |
| «Ответ рукопожатия» | доказано композицией | доказано 1 из 2; «принятое рукопожатие начинается кодом 101» — сетка |
| «Свести к октету» | доказано композицией | доказано 1 из 4; «октет снизу» — сетка; «октет сверху» — сетка; «целый октет остаётся собой» — сетка |
| «Все октеты» | доказано композицией | доказано 0 из 2; «пустой список — октеты» — сетка; «на одном числе октетность — это сведение к октету, его не изменившее» — сетка |
| «Веса разрядов байта» | доказано композицией | доказано 1 из 1 |
| «Исключающее или двух байтов» | доказано композицией | доказано 0 из 4; «итог — октет снизу» — сетка; «итог — октет сверху» — сетка; «ноль вторым ничего не меняет у октета» — сетка; «байт сам с собой даёт ноль» — сетка |
| «Байт маски» | доказано композицией | доказано 2 из 3; «на маске из одного байта всякий целый номер даёт этот байт» — сетка |
| «Шаг маски» | доказано композицией | доказано 2 из 2 |
| «Наложить маску» | доказано композицией | доказано 0 из 2; «маска длины не меняет» — сетка; «пустая нагрузка остаётся пустой» — сетка |
| «Отделить байты» | доказано структурой | доказано 0 из 2; «взято ровно столько, сколько просили целым, и вместе с остатком это весь вход» — сетка; «нехватка — ровно когда конечного просили больше, чем есть» — сетка |
| «Приписать к отделённым» | доказано композицией | доказано 2 из 2 |
| «Первые байты» | доказано композицией | доказано 0 из 1; «первых не больше, чем есть» — сетка |
| «Число из байтов старшим вперёд» | доказано композицией | доказано 1 из 3; «число из октетов неотрицательно» — сетка; «один байт — его же октет» — сетка |
| «Длина из байтов» | доказано композицией | доказано 1 из 2; «прочитанная длина неотрицательна и умещается в число» — сетка |
| «Длина по байту» | доказано композицией | доказано 1 из 2; «прочитанная длина неотрицательна» — сетка |
| «Длина кадра» | доказано композицией | доказано 0 из 2; «короче двух байтов — длина неполна» — сетка; «остаток после длины короче заголовка» — сетка |
| «Кадр из нагрузки» | доказано композицией | доказано 1 из 2; «разобранный кадр несёт код в четыре бита, данную маску и признак маски как дан» — сетка |
| «Кадр с маской» | доказано композицией | доказано 1 из 2; «разобранный кадр замаскирован» — сетка |
| «Кадр по длине» | доказано композицией | доказано 2 из 3; «признак маски разобранного кадра — старший бит второго байта» — сетка |
| «Разобрать кадр» | доказано композицией | доказано 0 из 3; «короче двух байтов — кадр неполон» — сетка; «разобранная нагрузка ровно объявленной длины, а остаток короче входа» — сетка; «код разобранного кадра — четыре бита» — сетка |
| «Октет по весу» | доказано композицией | доказано 0 из 2; «октет по весу единица — младший октет целого» — сетка; «октет по весу меньше двухсот пятидесяти шести, пока конечен» — сетка |
| «Расширенная длина» | доказано композицией | доказано 1 из 3; «до ста двадцати пяти расширения нет» — сетка; «длинная форма — восемь байтов» — сетка |
| «Байт длины и маски» | доказано композицией | доказано 0 из 4; «байт длины — октет снизу» — сетка; «байт длины — октет сверху» — сетка; «без маски байт меньше ста двадцати восьми» — сетка; «под маской байт не меньше ста двадцати восьми» — сетка |
| «Байт конца и кода» | доказано композицией | доказано 0 из 4; «первый байт — октет снизу» — сетка; «первый байт — октет сверху» — сетка; «без конца первый байт меньше ста двадцати восьми» — сетка; «биты RSV в первом байте не подняты» — сетка |
| «Кадр годен» | доказано композицией | доказано 1 из 3; «маска годного замаскированного кадра — четыре байта» — сетка; «у годного незамаскированного кадра маски нет» — сетка |
| «Собрать кадр» | доказано композицией | доказано 1 из 3; «кадр на проводе не короче заголовка с нагрузкой» — сетка; «годный кадр возвращается разбором без остатка» — сетка |
| «Текст кадра» | доказано композицией | доказано 0 из 2; «пустая нагрузка — пустой текст» — сетка; «знаков не больше, чем байтов» — сетка |
| «Текстовый кадр» | доказано композицией | доказано 3 из 5; «текстовый кадр годен» — сетка; «текст возвращается из нагрузки, пока в нём нет одиноких суррогатов» — сетка |
| «Повторить байт» | доказано точным шагом | доказано 0 из 1; «повторов ровно столько, сколько просили» — сетка |
| «Кадр из 126 букв a» | доказано композицией | доказано 1 из 1 |
| «Начало провода кадра из 126 букв a» | доказано композицией | доказано 1 из 1 |
| «Длина провода кадра из 126 букв a» | доказано композицией | доказано 1 из 1 |
| «Кадр из 126 букв a идёт по кругу» | доказано композицией | доказано 1 из 1 |
| «Кадр из 126 букв a под маской» | доказано композицией | доказано 2 из 2 |
| «Начало провода кадра из 126 букв a под маской» | доказано композицией | доказано 1 из 1 |
| «Кадр из 126 букв a под маской идёт по кругу» | доказано композицией | доказано 1 из 1 |
«Wire»
flang/stdlib/wire.flang — functions 34; the kernel ledger was taken from this version of the file
тип «Печать»
вариант «Напечатано» содержит текст: строка
вариант «Число непечатаемо» содержит значение: число
тип «Набор байтов»
вариант «Набрано» содержит взято: список строки, остальное: список строки
вариант «Байтов не хватило»
вариант «Знак поперёк границы»
тип «Разбор целого»
вариант «Целое взято» содержит значение: число, остальное: список строки
вариант «Целое испорчено»
тип «Разбор строки»
вариант «Строка взята» содержит текст: строка, остальное: список строки
вариант «Нуля не нашлось»
тип «Разбор числа»
вариант «Число разобрано» содержит значение: число
вариант «Не число»
тотальная функция «Знак байта»
принимает байт: число
возвращает строка
обеспечивает «печатаемый байт даёт ровно один знак» (не ((байт не меньше 0) и притом (байт меньше 128))) или ((длина результат) равен 1)
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен ("")) или ((результат равен (элемент (байт плюс 1) в [ "\u0000", "\u0001", "\u0002", "\u0003", "\u0004", "\u0005", "\u0006", "\u0007", "\u0008", "\u0009", "\u000A", "\u000B", "\u000C", "\u000D", "\u000E", "\u000F", "\u0010", "\u0011", "\u0012", "\u0013", "\u0014", "\u0015", "\u0016", "\u0017", "\u0018", "\u0019", "\u001A", "\u001B", "\u001C", "\u001D", "\u001E", "\u001F", " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "\u007F" ])))
обеспечивает «непечатаемый байт не даёт ни одного знака» ((байт не меньше 0) и притом (байт меньше 128)) или ((длина результат) равен 0)
обеспечивает «непечатаемый байт даёт пустую строку» ((байт не меньше 0) и притом (байт меньше 128)) или (результат равен "")
обеспечивает «непечатаемый байт даёт пустую строку, охраной из тела» если (байт не меньше 0) и притом (байт меньше 128) то да иначе (результат равен "")
пример «шестьдесят пятый байт — буква A»
дано байт равно 65
ожидается "A"
тотальная функция «Байт печатается»
принимает байт: число
возвращает признак
обеспечивает «печатается только тот байт, у которого в таблице знак» (не результат) или ((длина («Знак байта» от байт)) равен 1)
обеспечивает «нашёлся знак — байт печатается» (не ((длина («Знак байта» от байт)) равен 1)) или результат
обеспечивает «отрицательный байт не печатается» (не (байт меньше 0)) или (результат равен нет)
пример «нулевой байт печатается»
дано байт равно 0
ожидается да
тотальная функция «Код знака байта»
принимает байт: число
возвращает число
обеспечивает «что положили байтом, то и достали кодом» (не («Байт печатается» от байт)) или (результат равен (байт плюс 0))
пример «нулевой байт даёт знак с кодом ноль»
дано байт равно 0
ожидается 0
тотальная функция «Байтов в знаке»
принимает знак: строка
возвращает число
обеспечивает «ноль байтов весит пустой знак и только он, всякий другой — от одного до четырёх» ((результат равен 0) равен ((длина знак) равен 0)) и притом (результат не больше 4)
обеспечивает «пустой знак весит ноль байтов» (не ((длина знак) равен 0)) или (результат равен 0)
обеспечивает «пустой знак весит ноль байтов, охраной из тела» если (длина знак) равен 0 то (результат равен 0) иначе да
обеспечивает «вес знака неотрицателен» результат не меньше 0
обеспечивает «знак с кодом меньше ста двадцати восьми весит один байт» ((длина знак) равен 0) или ((не ((код символа знак) меньше 128)) или (результат равен 1))
обеспечивает «знак с кодом до двух тысяч сорока восьми весит два байта» ((длина знак) равен 0) или (((код символа знак) меньше 128) или ((не ((код символа знак) меньше 2048)) или (результат равен 2)))
обеспечивает «знак с кодом до шестидесяти пяти тысяч пятисот тридцати шести весит три байта» ((длина знак) равен 0) или (((код символа знак) меньше 128) или (((код символа знак) меньше 2048) или ((не ((код символа знак) меньше 65536)) или (результат равен 3))))
обеспечивает «знак с кодом от шестидесяти пяти тысяч пятисот тридцати шести весит четыре байта» ((длина знак) равен 0) или (((код символа знак) меньше 128) или (((код символа знак) меньше 2048) или (((код символа знак) меньше 65536) или (результат равен 4))))
обеспечивает «ответ есть одна из пяти ветвей тела» (результат равен (0)) или ((результат равен (1)) или ((результат равен (2)) или ((результат равен (3)) или ((результат равен (4))))))
обеспечивает «знак с кодом меньше ста двадцати восьми весит один байт, охраной из тела» если не ((длина знак) равен 0) то (если (код символа знак) меньше 128 то (результат равен 1) иначе да) иначе да
обеспечивает «знак с кодом до двух тысяч сорока восьми весит два байта, охраной из тела» если не ((длина знак) равен 0) то (если не ((код символа знак) меньше 128) то (если (код символа знак) меньше 2048 то (результат равен 2) иначе да) иначе да) иначе да
обеспечивает «знак с кодом до шестидесяти пяти тысяч пятисот тридцати шести весит три байта, охраной из тела» если не ((длина знак) равен 0) то (если не ((код символа знак) меньше 128) то (если не ((код символа знак) меньше 2048) то (если (код символа знак) меньше 65536 то (результат равен 3) иначе да) иначе да) иначе да) иначе да
обеспечивает «знак с кодом от шестидесяти пяти тысяч пятисот тридцати шести весит четыре байта, охраной из тела» если не ((длина знак) равен 0) то (если не ((код символа знак) меньше 128) то (если не ((код символа знак) меньше 2048) то (если не ((код символа знак) меньше 65536) то (результат равен 4) иначе да) иначе да) иначе да) иначе да
пример «латинская буква — один байт»
дано знак равно "A"
ожидается 1
тотальная функция «Знак испорчен»
принимает знак: строка
возвращает признак
обеспечивает «пустой знак порчей не считается» если (длина знак) равен 0 то (результат равен нет) иначе да
обеспечивает «порча — это ровно знак с кодом замены» если (длина знак) равен 0 то да иначе (результат равен ((код символа знак) равен 65533))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (нет)) или ((результат равен ((код символа знак) равен 65533)))
пример «обычная буква цела»
дано знак равно "A"
ожидается нет
тотальная функция «Знаки текста»
принимает текст: строка
возвращает список строки
обеспечивает «знаков ровно столько, какова длина текста» (длина результат) равен (длина текст)
обеспечивает «склейка разложенного даёт тот же текст» («Текст знаков» от результат) равен текст
пример «текст раскладывается по знакам»
дано текст равно "Qa"
ожидается ["Q", "a"]
тотальная функция «Текст знаков»
принимает знаки: список строки
возвращает строка
обеспечивает «в склейке ровно столько знаков, сколько их было во всех кусках» (длина результат) равен (свёртка знаки начиная с 0 как набрано и кусок → набрано плюс (длина кусок))
пример «знаки склеиваются обратно»
дано знаки равно ["Q", "a"]
ожидается "Qa"
тотальная функция «Шаг веса текста»
принимает набрано: число, знак: строка
возвращает число
обеспечивает «пустой знак веса не добавляет» если (длина знак) равен 0 то (результат равен набрано) иначе да
обеспечивает «непустой знак добавляет ровно свой вес» если (длина знак) равен 0 то да иначе (результат равен (набрано плюс («Байтов в знаке» от знак)))
пример «пустой знак веса не добавляет»
дано набрано равно 3
дано знак равно ""
ожидается 3
тотальная функция «Шаг порчи»
принимает набрано: признак, знак: строка
возвращает признак
обеспечивает «найденная порча не теряется» если набрано то (результат равен да) иначе да
обеспечивает «пока порчи не было, всё решает знак» если набрано то да иначе (результат равен («Знак испорчен» от знак))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (да)) или ((результат равен («Знак испорчен» от знак)))
пример «порча уже была»
дано набрано равно да
дано знак равно "a"
ожидается да
тотальная функция «Шаг нулевых кодов»
принимает собрано: признак, знак: строка
возвращает признак
обеспечивает «после первого ненулевого знака уже не соберётся» если собрано то да иначе (результат равен нет)
обеспечивает «пока всё нулевое, решает код знака» если собрано то (результат равен ((код символа знак) равен 0)) иначе да
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (нет)) или ((результат равен ((код символа знак) равен 0)))
пример «нулевой знак не сбивает»
дано собрано равно да
дано знак равно "\u0000"
ожидается да
тотальная функция «Байтов в тексте»
принимает текст: строка
возвращает число
обеспечивает «байтов не меньше, чем знаков» результат не меньше (длина текст)
обеспечивает «байтов не больше, чем знаков вчетверо» результат не больше (4 умножить на (длина текст))
пример «латиница — байт на знак»
дано текст равно "abc"
ожидается 3
тотальная функция «Есть порча»
принимает знаки: список строки
возвращает признак
обеспечивает «у пустого списка знаков порчи нет» (не ((длина знаки) равен 0)) или (не результат)
обеспечивает «на одном знаке порча — это порча самого знака» (не ((длина знаки) равен 1)) или (результат равен («Знак испорчен» от (элемент 1 в знаки)))
пример «целые знаки — порчи нет»
дано знаки равно ["a", "b"]
ожидается нет
тотальная функция «Коды нулевые»
принимает знаки: список строки
возвращает признак
обеспечивает «нулевые коды значат текст из одних нулевых знаков, по знаку на звено» (не ((длина («Текст знаков» от знаки)) равен (длина знаки))) или (результат равен ((«Текст знаков» от знаки) равен (соединить (отобразить знаки как знак → "\u0000") по "")))
пример «все нули»
дано знаки равно ["\u0000", "\u0000"]
ожидается да
тотальная функция «Набрать байты»
принимает знаки: список строки, сколько: число
возвращает «Набор байтов»
обеспечивает «набранное весит ровно столько октетов, сколько просили, вместе с остатком даёт исходный поток, а отказ бывает только при непустом запросе» разбор результат
случай вариант «Набрано» с взято как взято и остальное как хвостик
то ((длина взято) равен (если сколько не больше 0 то 0 иначе сколько)) и притом ((соединить («Текст знаков» от взято) с («Текст знаков» от хвостик)) равен («Текст знаков» от знаки))
случай вариант «Байтов не хватило»
то не (сколько не больше 0)
случай вариант «Знак поперёк границы»
то нет
пример «два октета из трёх»
дано знаки равно ["a", "b", "c"]
дано сколько равно 2
ожидается вариант «Набрано» с взято равным ["a", "b"] и остальное равным ["c"]
тотальная функция «Дописать знак спереди»
принимает знак: строка, набор: «Набор байтов»
возвращает «Набор байтов»
обеспечивает «дописка исхода не меняет, удлиняет набранное ровно на один знак и остатка не трогает» разбор результат
случай вариант «Набрано» с взято как стало и остальное как хвостик
то разбор набор
случай вариант «Набрано» с взято как было и остальное как хвост
то ((длина стало) равен ((длина было) плюс 1)) и притом ((длина хвостик) равен (длина хвост))
случай любое
то нет
случай любое
то разбор набор
случай вариант «Набрано» с взято как было и остальное как хвост
то нет
случай любое
то да
обеспечивает «нехватка байтов дописку переживает» (не (набор равен (вариант «Байтов не хватило»))) или (результат равен (вариант «Байтов не хватило»))
обеспечивает «знак поперёк границы дописку переживает» (не (набор равен (вариант «Знак поперёк границы»))) или (результат равен (вариант «Знак поперёк границы»))
обеспечивает «нехватка байтов дописку переживает, охраной из тела» если набор равен (вариант «Байтов не хватило») то (результат равен (вариант «Байтов не хватило»)) иначе да
обеспечивает «знак поперёк границы дописку переживает, охраной из тела» если набор равен (вариант «Знак поперёк границы») то (результат равен (вариант «Знак поперёк границы»)) иначе да
пример «знак дописывается к набранному»
дано знак равно "a"
дано набор равно (вариант «Набрано» с взято равным ["b"] и остальное равным [])
ожидается вариант «Набрано» с взято равным ["a", "b"] и остальное равным []
тотальная функция «Взять целое»
принимает знаки: список строки, ширина: неотрицательное, набрано: число
возвращает «Разбор целого»
обеспечивает «нулевая ширина берёт накопленное и входа не трогает, а испортиться целое может только при непустой ширине» разбор результат
случай вариант «Целое взято» с значение как значение и остальное как дальше
то (не (ширина не больше 0)) или ((значение равен набрано) и притом ((длина дальше) равен (длина знаки)))
случай вариант «Целое испорчено»
то не (ширина не больше 0)
обеспечивает «взятое целое съедает ровно `ширина` знаков» разбор результат
случай вариант «Целое взято» с значение как значение и остальное как дальше
то ((длина знаки) минус (длина дальше)) равен ширина
случай вариант «Целое испорчено»
то да
пример «четыре нулевых байта и восьмёрка дают восемь»
дано знаки равно ["\u0000", "\u0000", "\u0000", "\u0008", "x"]
дано ширина равно 4
дано набрано равно 0
ожидается вариант «Целое взято» с значение равным 8 и остальное равным ["x"]
тотальная функция «Взять строку»
принимает знаки: список строки
возвращает «Разбор строки»
обеспечивает «взятая строка — начало входа, нуль съеден, а нуля не нашлось только там, где вход не начинается нулём» разбор результат
случай вариант «Строка взята» с текст как текст и остальное как дальше
то ((«Текст знаков» от знаки) начинается с текст) и притом ((длина дальше) меньше (длина знаки))
случай вариант «Нуля не нашлось»
то если (длина знаки) равен 0
то да
иначе не ((код символа (элемент 1 в знаки)) равен 0)
пример «строка кончается нулём»
дано знаки равно ["п", "a", "\u0000", "b"]
ожидается вариант «Строка взята» с текст равным "пa" и остальное равным ["b"]
тотальная функция «Дописать знак к строке»
принимает знак: строка, исход: «Разбор строки»
возвращает «Разбор строки»
обеспечивает «дописка исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает» разбор результат
случай вариант «Строка взята» с текст как стало и остальное как хвостик
то разбор исход
случай вариант «Строка взята» с текст как было и остальное как хвост
то ((длина стало) равен ((длина было) плюс (длина знак))) и притом ((длина хвостик) равен (длина хвост))
случай вариант «Нуля не нашлось»
то нет
случай вариант «Нуля не нашлось»
то разбор исход
случай вариант «Строка взята» с текст как было и остальное как хвост
то нет
случай вариант «Нуля не нашлось»
то да
обеспечивает «отсутствие нуля дописку переживает» (не (исход равен (вариант «Нуля не нашлось»))) или (результат равен (вариант «Нуля не нашлось»))
обеспечивает «отсутствие нуля дописку переживает, охраной из тела» если исход равен (вариант «Нуля не нашлось») то (результат равен (вариант «Нуля не нашлось»)) иначе да
пример «знак становится первым»
дано знак равно "a"
дано исход равно (вариант «Строка взята» с текст равным "b" и остальное равным [])
ожидается вариант «Строка взята» с текст равным "ab" и остальное равным []
тотальная функция «Текст до нуля»
принимает знаки: список строки
возвращает строка
обеспечивает «текст до нуля — начало потока» («Текст знаков» от знаки) начинается с результат
обеспечивает «до первого нуля текст доходит целиком» (не (((длина знаки) больше 1) и притом ((не ((код символа (элемент 1 в знаки)) равен 0)) и притом ((код символа (элемент 2 в знаки)) равен 0)))) или (результат равен (элемент 1 в знаки))
обеспечивает «нуля не нашлось — текст пуст» если («Взять строку» от знаки) равен (вариант «Нуля не нашлось») то (результат равен "") иначе да
обеспечивает «нуля не нашлось — текст пуст, дизъюнкцией» (не ((«Взять строку» от знаки) равен (вариант «Нуля не нашлось»))) или (результат равен "")
пример «строка до нуля»
дано знаки равно ["O", "K", "\u0000"]
ожидается "OK"
тотальная функция «Хвост после нуля»
принимает знаки: список строки, запас: неотрицательное
возвращает список строки
обеспечивает «хвост после нуля короче входа» ((длина результат) меньше (длина знаки)) или ((длина знаки) равен 0)
обеспечивает «начальный нуль снимает ровно один знак» если (длина знаки) больше 0 то ((не ((код символа (элемент 1 в знаки)) равен 0)) или ((длина результат) равен ((длина знаки) минус 1))) иначе да
пример «после нуля начинается остаток»
дано знаки равно ["a", "\u0000", "b"]
дано запас равно 10000
ожидается ["b"]
тотальная функция «Последние»
принимает знаки: список строки, сколько: число
возвращает список строки
обеспечивает «последних берётся ровно столько, сколько просили, а если столько не набралось — весь список» (не (((сколько остаток от 1) равен 0) и притом (сколько не меньше 0))) или ((длина результат) равен (если (длина знаки) не больше сколько то (длина знаки) иначе сколько))
пример «берутся последние шесть»
дано знаки равно ["a", "b", "c", "d", "e", "f", "g"]
дано сколько равно 6
ожидается ["b", "c", "d", "e", "f", "g"]
тотальная функция «Без первых»
принимает знаки: список строки, сколько: число
возвращает список строки
обеспечивает «снимается ровно столько первых, сколько просили, а больше, чем есть, не снимается» (не (((сколько остаток от 1) равен 0) и притом (сколько не меньше 0))) или ((длина результат) равен (если (длина знаки) не больше сколько то 0 иначе ((длина знаки) минус сколько)))
пример «два знака снимаются»
дано знаки равно ["a", "b", "c"]
дано сколько равно 2
ожидается ["c"]
тотальная функция «Четыре знака»
принимает значение: число
возвращает «Печать»
обеспечивает «напечатано ровно четыре знака, и печатается ровно то число, у которого печатаемы все четыре октета» разбор результат
случай вариант «Напечатано» с текст как текст
то ((длина текст) равен 4) и притом («Четыре октета печатаются» от значение)
случай вариант «Число непечатаемо» с значение как названо
то (названо равен значение) и притом (не («Четыре октета печатаются» от значение))
обеспечивает «печатаемое число печатается своими четырьмя октетами» (не («Четыре октета печатаются» от значение)) или (результат равен (вариант «Напечатано» с текст равным («Четыре октета» от значение)))
обеспечивает «непечатаемое число названо собой» («Четыре октета печатаются» от значение) или (результат равен (вариант «Число непечатаемо» с значение равным значение))
обеспечивает «печатаемое число печатается своими четырьмя октетами, охраной из тела» если («Четыре октета печатаются» от значение) то (результат равен (вариант «Напечатано» с текст равным («Четыре октета» от значение))) иначе да
обеспечивает «непечатаемое число названо собой, охраной из тела» если («Четыре октета печатаются» от значение) то да иначе (результат равен (вариант «Число непечатаемо» с значение равным значение))
обеспечивает «ответ есть одна из двух ветвей тела» (результат равен (вариант «Напечатано» с текст равным («Четыре октета» от значение))) или ((результат равен (вариант «Число непечатаемо» с значение равным значение)))
пример «восьмёрка — три нуля и восьмёрка»
дано значение равно 8
ожидается вариант «Напечатано» с текст равным "\u0000\u0000\u0000\u0008"
тотальная функция «Четыре октета печатаются»
принимает значение: число
возвращает признак
обеспечивает «отрицательное не печатается» (не (значение меньше 0)) или (не результат)
обеспечивает «не влезающее в четыре октета не печатается» (не (значение не меньше 2147483648)) или (не результат)
обеспечивает «отрицательное не печатается: ответ ровно нет» (не (значение меньше 0)) или (результат равен нет)
обеспечивает «не влезающее в четыре октета не печатается: ответ ровно нет» (не (значение не меньше 2147483648)) или (результат равен нет)
обеспечивает «малое целое с печатаемыми октетами печатается» (не (значение не меньше 0 и притом значение меньше 128 и притом (((значение остаток от 1) плюс 0) равен 0) и притом («Байт печатается» от значение) и притом («Байт печатается» от 0))) или результат
пример «восемь печатается»
дано значение равно 8
ожидается да
тотальная функция «Четыре октета»
принимает значение: число
возвращает строка
обеспечивает «печатаемое число читается из своих четырёх октетов обратно тем же числом» (не («Четыре октета печатаются» от значение)) или ((«Число из целого» от («Взять целое» от («Знаки текста» от результат) и 4 и 0)) равен (значение плюс 0))
пример «восьмёрка октетами»
дано значение равно 8
ожидается "\u0000\u0000\u0000\u0008"
тотальная функция «Два октета»
принимает значение: число
возвращает строка
обеспечивает «число, умещающееся в два печатаемых октета, читается из них обратно тем же числом» (не (((значение не меньше 0) и притом (значение меньше 65536)) и притом ((«Байт печатается» от ((«Целая часть» от (значение делить на 256)) остаток от 256)) и притом («Байт печатается» от (значение остаток от 256))))) или ((«Число из целого» от («Взять целое» от («Знаки текста» от результат) и 2 и 0)) равен (значение плюс 0))
пример «единица двумя октетами»
дано значение равно 1
ожидается "\u0000\u0001"
тотальная функция «Строка с нулём»
принимает текст: строка
возвращает строка
обеспечивает «строка с нулём длиннее текста ровно на один знак» (длина результат) равен ((длина текст) плюс 1)
обеспечивает «строка с нулём начинается тем же текстом» результат начинается с текст
обеспечивает «строка с нулём весит на один байт больше текста» («Байтов в тексте» от результат) равен ((«Байтов в тексте» от текст) плюс 1)
пример «за строкой встаёт нуль»
дано текст равно "ab"
ожидается "ab\u0000"
тотальная функция «Число из целого»
принимает целое: «Разбор целого»
возвращает число
обеспечивает «взятое целое отдаётся своим значением, испорченное — нулём» разбор целое
случай вариант «Целое взято» с значение как значение и остальное как дальше
то результат равен значение
случай вариант «Целое испорчено»
то результат равен 0
обеспечивает «испорченное целое отдаётся нулём» (не (целое равен (вариант «Целое испорчено»))) или (результат равен 0)
обеспечивает «испорченное целое отдаётся нулём, охраной из тела» если целое равен (вариант «Целое испорчено») то (результат равен 0) иначе да
пример «взятое целое отдаётся числом»
дано целое равно (вариант «Целое взято» с значение равным 3 и остальное равным [])
ожидается 3
тотальная функция «Текст печати»
принимает печать: «Печать»
возвращает строка
обеспечивает «напечатанное отдаётся своим текстом, а непечатаемое — пустой строкой» разбор печать
случай вариант «Напечатано» с текст как текст
то результат равен текст
случай вариант «Число непечатаемо» с значение как значение
то результат равен ""
пример «напечатанное отдаётся текстом»
дано печать равно (вариант «Напечатано» с текст равным "ab")
ожидается "ab"
тотальная функция «Цифра провода»
принимает знак: строка
возвращает число
обеспечивает «знак из отрезка кодов цифр даёт своё значение» если (длина знак) равен 0 то да иначе (если ((код символа знак) не меньше 48) и притом ((код символа знак) не больше 57) то (результат равен ((код символа знак) минус 48)) иначе да)
обеспечивает «знак вне отрезка кодов цифр даёт минус один» если (длина знак) равен 0 то да иначе (если ((код символа знак) не меньше 48) и притом ((код символа знак) не больше 57) то да иначе (результат равен (0 минус 1)))
обеспечивает «пустая строка даёт минус один» (не ((длина знак) равен 0)) или (результат равен (0 минус 1))
обеспечивает «пустая строка даёт минус один, охраной из тела» если (длина знак) равен 0 то (результат равен (0 минус 1)) иначе да
пример «семёрка»
дано знак равно "7"
ожидается 7
тотальная функция «Цифры числом»
принимает знаки: список строки, набрано: число
возвращает число
обеспечивает «пустой список отдаёт накопленное, цифра приписывается справа, а не цифра портит всё число» ((не ((длина знаки) равен 0)) или (результат равен набрано)) и притом ((не ((длина знаки) равен 1 и притом (не ((«Цифра провода» от (элемент 1 в знаки)) меньше 0)))) или (результат равен ((набрано умножить на 10) плюс («Цифра провода» от (элемент 1 в знаки))))) и притом ((не ((длина знаки) больше 0 и притом ((«Цифра провода» от (элемент 1 в знаки)) меньше 0))) или (результат равен (0 минус 1)))
пример «три цифры»
дано знаки равно ["1", "2", "3"]
дано набрано равно 0
ожидается 123
тотальная функция «Целое из текста»
принимает текст: строка
возвращает «Разбор числа»
обеспечивает «ответ есть одна из трёх ветвей тела» (результат равен (вариант «Не число»)) или ((результат равен («Число без знака» от (разложить текст на символы))) или ((результат равен («Отрицать число» от («Число без знака» от (хвост (разложить текст на символы)))))))
обеспечивает «пустой текст числом не считается» (не ((длина текст) равен 0)) или (результат равен (вариант «Не число»))
обеспечивает «одна цифра текстом считается собой» (не ((длина текст) равен 1 и притом ("0123456789" содержит текст))) или (результат равен (вариант «Число разобрано» с значение равным ((код символа текст) минус 48)))
обеспечивает «текст без минуса разбирается как число без знака» если (длина текст) равен 0 то да иначе (если текст начинается с "-" то да иначе (результат равен («Число без знака» от (разложить текст на символы))))
обеспечивает «текст с минусом разбирается отрицанием числа без знака» если (длина текст) равен 0 то да иначе (если текст начинается с "-" то (результат равен («Отрицать число» от («Число без знака» от (хвост (разложить текст на символы))))) иначе да)
пример «обычное число»
дано текст равно "123"
ожидается вариант «Число разобрано» с значение равным 123
тотальная функция «Число без знака»
принимает знаки: список строки
возвращает «Разбор числа»
обеспечивает «пусто и длиннее пятнадцати цифр числом не считается» (не (((длина знаки) равен 0) или ((длина знаки) больше 15))) или (результат равен (вариант «Не число»))
обеспечивает «пусто и длиннее пятнадцати цифр числом не считается, охраной из тела» если ((длина знаки) равен 0) или ((длина знаки) больше 15) то (результат равен (вариант «Не число»)) иначе да
обеспечивает «испорченные цифры числом не считаются» если ((длина знаки) равен 0) или ((длина знаки) больше 15) то да иначе (если («Цифры числом» от знаки и 0) меньше 0 то (результат равен (вариант «Не число»)) иначе да)
обеспечивает «годные цифры считаются своим числом» если ((длина знаки) равен 0) или ((длина знаки) больше 15) то да иначе (если («Цифры числом» от знаки и 0) меньше 0 то да иначе (результат равен (вариант «Число разобрано» с значение равным («Цифры числом» от знаки и 0))))
пример «цифры дают число»
дано знаки равно ["4", "2"]
ожидается вариант «Число разобрано» с значение равным 42
тотальная функция «Отрицать число»
принимает исход: «Разбор числа»
возвращает «Разбор числа»
обеспечивает «разобранное число меняет знак, а не число остаётся не числом» разбор исход
случай вариант «Число разобрано» с значение как значение
то результат равен (вариант «Число разобрано» с значение равным (0 минус значение))
случай вариант «Не число»
то результат равен (вариант «Не число»)
обеспечивает «не число отрицанием остаётся не числом» (не (исход равен (вариант «Не число»))) или (результат равен (вариант «Не число»))
обеспечивает «не число отрицанием остаётся не числом, охраной из тела» если исход равен (вариант «Не число») то (результат равен (вариант «Не число»)) иначе да
пример «пятёрка становится минус пятёркой»
дано исход равно (вариант «Число разобрано» с значение равным 5)
ожидается вариант «Число разобрано» с значение равным -5
| Function | Termination | Claims |
|---|---|---|
| «Знак байта» | доказано композицией | доказано 4 из 5; «печатаемый байт даёт ровно один знак» — сетка |
| «Байт печатается» | доказано композицией | доказано 2 из 3; «печатается только тот байт, у которого в таблице знак» — сетка |
| «Код знака байта» | доказано композицией | доказано 0 из 1; «что положили байтом, то и достали кодом» — сетка |
| «Байтов в знаке» | доказано композицией | доказано 13 из 13 |
| «Знак испорчен» | доказано композицией | доказано 3 из 3 |
| «Знаки текста» | доказано композицией | доказано 2 из 2 |
| «Текст знаков» | доказано композицией | доказано 0 из 1; «в склейке ровно столько знаков, сколько их было во всех кусках» — сетка |
| «Шаг веса текста» | доказано композицией | доказано 2 из 2 |
| «Шаг порчи» | доказано композицией | доказано 3 из 3 |
| «Шаг нулевых кодов» | доказано композицией | доказано 3 из 3 |
| «Байтов в тексте» | доказано композицией | доказано 0 из 2; «байтов не меньше, чем знаков» — сетка; «байтов не больше, чем знаков вчетверо» — сетка |
| «Есть порча» | доказано композицией | доказано 0 из 2; «у пустого списка знаков порчи нет» — сетка; «на одном знаке порча — это порча самого знака» — сетка |
| «Коды нулевые» | доказано композицией | доказано 0 из 1; «нулевые коды значат текст из одних нулевых знаков, по знаку на звено» — сетка |
| «Набрать байты» | доказано структурой | доказано 0 из 1; «набранное весит ровно столько октетов, сколько просили, вместе с остатком даёт исходный поток, а отказ бывает только при непустом запросе» — сетка |
| «Дописать знак спереди» | доказано композицией | доказано 4 из 5; «дописка исхода не меняет, удлиняет набранное ровно на один знак и остатка не трогает» — сетка |
| «Взять целое» | доказано структурой | доказано 0 из 2; «нулевая ширина берёт накопленное и входа не трогает, а испортиться целое может только при непустой ширине» — сетка; «взятое целое съедает ровно ширина знаков» — сетка |
| «Взять строку» | доказано структурой | доказано 0 из 1; «взятая строка — начало входа, нуль съеден, а нуля не нашлось только там, где вход не начинается нулём» — сетка |
| «Дописать знак к строке» | доказано композицией | доказано 2 из 3; «дописка исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает» — сетка |
| «Текст до нуля» | доказано композицией | доказано 2 из 4; «текст до нуля — начало потока» — сетка; «до первого нуля текст доходит целиком» — сетка |
| «Хвост после нуля» | доказано структурой | доказано 0 из 2; «хвост после нуля короче входа» — сетка; «начальный нуль снимает ровно один знак» — сетка |
| «Последние» | доказано композицией | доказано 0 из 1; «последних берётся ровно столько, сколько просили, а если столько не набралось — весь список» — сетка |
| «Без первых» | доказано структурой | доказано 0 из 1; «снимается ровно столько первых, сколько просили, а больше, чем есть, не снимается» — сетка |
| «Четыре знака» | доказано композицией | доказано 5 из 6; «напечатано ровно четыре знака, и печатается ровно то число, у которого печатаемы все четыре октета» — сетка |
| «Четыре октета печатаются» | доказано композицией | доказано 4 из 5; «малое целое с печатаемыми октетами печатается» — сетка |
| «Четыре октета» | доказано композицией | доказано 0 из 1; «печатаемое число читается из своих четырёх октетов обратно тем же числом» — сетка |
| «Два октета» | доказано композицией | доказано 0 из 1; «число, умещающееся в два печатаемых октета, читается из них обратно тем же числом» — сетка |
| «Строка с нулём» | доказано композицией | доказано 2 из 3; «строка с нулём весит на один байт больше текста» — сетка |
| «Число из целого» | доказано композицией | доказано 2 из 3; «взятое целое отдаётся своим значением, испорченное — нулём» — сетка |
| «Текст печати» | доказано композицией | доказано 0 из 1; «напечатанное отдаётся своим текстом, а непечатаемое — пустой строкой» — сетка |
| «Цифра провода» | доказано композицией | доказано 4 из 4 |
| «Цифры числом» | доказано структурой | доказано 0 из 1; «пустой список отдаёт накопленное, цифра приписывается справа, а не цифра портит всё число» — сетка |
| «Целое из текста» | доказано композицией | доказано 4 из 5; «одна цифра текстом считается собой» — сетка |
| «Число без знака» | доказано композицией | доказано 4 из 4 |
| «Отрицать число» | доказано композицией | доказано 2 из 3; «разобранное число меняет знак, а не число остаётся не числом» — сетка |
«X25519»
flang/stdlib/x25519.flang — functions 39; the kernel ledger was taken from this version of the file
тип «Ход переноса»
вариант «Ход переноса» содержит столбцы: список числа, перенос: число
тип «Ход займа»
вариант «Ход займа» содержит столбцы: список числа, заём: число
тип «Ход лестницы»
вариант «Ход лестницы» содержит х2: список числа, з2: список числа, х3: список числа, з3: список числа
тотальная функция «Нули поля»
принимает сколько: число
возвращает список числа
обеспечивает «нулей не просили — список пуст» если сколько не больше 0 то (длина результат) равен 0 иначе да
пример «Три нуля»
дано сколько равно 3
ожидается [0, 0, 0]
тотальная функция «Разряд»
принимает разряды: список числа, номер: число
возвращает число
пример «Второй разряд»
дано разряды равно [7, 8, 9]
дано номер равно 2
ожидается 8
тотальная функция «Взять первые»
принимает разряды: список числа, сколько: число
возвращает список числа
обеспечивает «взято не больше, чем было» (длина результат) не больше (длина разряды)
пример «Первые два»
дано разряды равно [1, 2, 3]
дано сколько равно 2
ожидается [1, 2]
тотальная функция «Отбросить первые»
принимает разряды: список числа, сколько: число
возвращает список числа
обеспечивает «отброшенное не удлиняет» (длина результат) не больше (длина разряды)
обеспечивает «нуля первых не отброшено — список тот же» если сколько не больше 0 то (длина результат) равен (длина разряды) иначе да
пример «Без первых двух»
дано разряды равно [1, 2, 3]
дано сколько равно 2
ожидается [3]
тотальная функция «Сложить по разрядам»
принимает первые: список числа, вторые: список числа
возвращает список числа
обеспечивает «длина суммы — длина длинного из слагаемых» если (длина первые) не меньше (длина вторые) то (длина результат) равен (длина первые) иначе (длина результат) равен (длина вторые)
пример «Одинаковой длины»
дано первые равно [1, 2, 3]
дано вторые равно [10, 20, 30]
ожидается [11, 22, 33]
тотальная функция «Добавить к первому»
принимает разряды: список числа, добавка: число
возвращает список числа
обеспечивает «добавка не меняет числа разрядов» (длина результат) равен (длина разряды)
пример «Добавка ложится на младший разряд»
дано разряды равно [1, 2]
дано добавка равно 5
ожидается [6, 2]
тотальная функция «Шаг переноса»
принимает ход: «Ход переноса», разряд: число
возвращает «Ход переноса»
обеспечивает «шаг переноса ставит ровно один столбец» (длина (результат.«столбцы»)) равен ((длина (ход.«столбцы»)) плюс 1)
пример «Малый разряд ложится столбцом, переноса нет»
дано ход равно (вариант «Ход переноса» с столбцы равным пустой список и перенос равным 0)
дано разряд равно 5
ожидается вариант «Ход переноса» с столбцы равным [5] и перенос равным 0
тотальная функция «Разложить»
принимает разряды: список числа
возвращает «Ход переноса»
обеспечивает «разложение ставит столбец на каждый разряд» (длина (результат.«столбцы»)) равен (длина разряды)
пример «Три разряда в сетке — ни один не тронут»
дано разряды равно [1, 2, 3]
ожидается вариант «Ход переноса» с столбцы равным [1, 2, 3] и перенос равным 0
тотальная функция «Ужать»
принимает разряды: список числа
возвращает список числа
тотальная функция «Свести»
принимает разряды: список числа
возвращает список числа
обеспечивает «сведение не меняет числа разрядов, пока их шестнадцать» не ((длина разряды) равен 16) или ((длина результат) равен 16)
пример «Перенос из младшего разряда»
дано разряды равно [65537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Ноль поля»
возвращает список числа
обеспечивает «ноль поля — шестнадцать разрядов» (длина результат) равен 16
пример «Шестнадцать нулевых разрядов»
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Единица поля»
возвращает список числа
обеспечивает «единица поля — шестнадцать разрядов» (длина результат) равен 16
пример «Единица в младшем разряде, остальные нули»
ожидается [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Простое поля»
возвращает список числа
обеспечивает «простое поля — шестнадцать разрядов» (длина результат) равен 16
пример «2^255 − 19 разрядами по шестнадцать бит»
ожидается [65517, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
32767]
тотальная функция «Четыре простых»
возвращает список числа
обеспечивает «четыре простых — шестнадцать разрядов» (длина результат) равен 16
пример «2·(2^256 − 38) разрядами по шестнадцать бит»
ожидается [130996, 131070, 131070, 131070, 131070, 131070, 131070, 131070, 131070, 131070, 131070, 131070, 131070,
131070, 131070, 131070]
тотальная функция «Из байтов»
принимает байты: список числа
возвращает список числа
обеспечивает «из тридцати двух байтов выходит шестнадцать разрядов» не ((длина байты) равен 32) или ((длина результат) равен 16)
пример «Два байта — один разряд»
дано байты равно [1, 1]
ожидается [257]
тотальная функция «Точка из байтов»
принимает байты: список числа
возвращает список числа
обеспечивает «шестнадцать разрядов из тридцати двух байтов» не ((длина байты) равен 32) или ((длина результат) равен 16)
обеспечивает «старший бит погашен» не ((длина байты) равен 32) или ((«Разряд» от результат и 16) меньше 32768)
тотальная функция «В байты»
принимает разряды: список числа
возвращает список числа
обеспечивает «на каждый разряд по два байта» (длина результат) равен (2 умножить на (длина разряды))
обеспечивает «байтов не меньше, чем разрядов» (длина разряды) не больше (длина результат)
пример «Один разряд — два байта»
дано разряды равно [258]
ожидается [2, 1]
тотальная функция «Снять старший»
принимает разряды: список числа
возвращает список числа
тотальная функция «Вычесть с займом»
принимает первые: список числа, вторые: список числа, заём: число
возвращает «Ход займа»
тотальная функция «Канон»
принимает разряды: список числа
возвращает список числа
обеспечивает «шестнадцать разрядов, пока их было шестнадцать» не ((длина разряды) равен 16) или ((длина результат) равен 16)
пример «Само простое — это ноль»
дано разряды равно [65517, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
65535, 65535, 32767]
ожидается [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Это ноль»
принимает разряды: список числа
возвращает признак
пример «Ноль»
дано разряды равно [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается да
тотальная функция «Это единица»
принимает разряды: список числа
возвращает признак
пример «Единица»
дано разряды равно [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается да
тотальная функция «Сложение»
принимает а: список числа, б: список числа
возвращает список числа
обеспечивает «сумма — те же шестнадцать разрядов» не ((длина а) равен 16 и притом (длина б) равен 16) или ((длина результат) равен 16)
пример «Два плюс три»
дано а равно [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано б равно [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Вычитание»
принимает а: список числа, б: список числа
возвращает список числа
обеспечивает «разность — те же шестнадцать разрядов» не ((длина а) равен 16 и притом (длина б) равен 16) или ((длина результат) равен 16)
пример «Пять минус три: вычет двойки, а представление не единственное — 2^256 − 36 ≡ 2»
дано а равно [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано б равно [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [65500, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
65535]
тотальная функция «Свёртка разрядов»
принимает а: список числа, б: список числа
возвращает список числа
пример «Двойка на тройку»
дано а равно [2]
дано б равно [3]
ожидается [6]
тотальная функция «Свернуть разряды»
принимает разряды: список числа
возвращает список числа
тотальная функция «Умножение»
принимает а: список числа, б: список числа
возвращает список числа
обеспечивает «произведение полей — те же шестнадцать разрядов» не ((длина а) равен 16 и притом (длина б) равен 16) или ((длина результат) равен 16)
пример «Единица нейтральна»
дано а равно [7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано б равно [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Квадрат»
принимает а: список числа
возвращает список числа
обеспечивает «квадрат — те же шестнадцать разрядов» не ((длина а) равен 16 и притом (длина а) равен 16) или ((длина результат) равен 16)
пример «Три в квадрате»
дано а равно [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ожидается [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Умножить на число»
принимает а: список числа, множитель: число
возвращает список числа
обеспечивает «произведение на число — те же шестнадцать разрядов» не ((длина а) равен 16) или ((длина результат) равен 16)
пример «Умножение на три»
дано а равно [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано множитель равно 3
ожидается [12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Квадраты»
принимает а: список числа, сколько: число
возвращает список числа
обеспечивает «нуль возведений — само число» если сколько не больше 0 то результат равен а иначе да
пример «Ни одного квадрата — само число»
дано а равно [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано сколько равно 0
ожидается [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Обращение»
принимает а: список числа
возвращает список числа
обеспечивает «обращённое — те же шестнадцать разрядов» не ((длина а) равен 16) или ((длина результат) равен 16)
обеспечивает «обращённое, умноженное на исходное, даёт единицу — кроме нуля, у которого обратного нет» («Это ноль» от а) или («Это единица» от («Умножение» от а и результат))
тотальная функция «Веса байта поля»
возвращает список числа
обеспечивает «восемь весов» (длина результат) равен 8
пример «Веса битов внутри байта»
ожидается [1, 2, 4, 8, 16, 32, 64, 128]
тотальная функция «Бит скаляра»
принимает скаляр: список числа, номер: число
возвращает число
пример «Младший бит девятки»
дано скаляр равно [9]
дано номер равно 0
ожидается 1
тотальная функция «Зажать скаляр»
принимает байты: список числа
возвращает список числа
обеспечивает «байтов столько же, сколько было» не ((длина байты) равен 32) или ((длина результат) равен 32)
обеспечивает «младший байт кратен восьми» не ((длина байты) равен 32) или (((«Разряд» от результат и 1) остаток от 8) равен 0)
обеспечивает «старший байт лежит между 64 и 127» не ((длина байты) равен 32) или (((«Разряд» от результат и 32) не меньше 64) и притом ((«Разряд» от результат и 32) не больше 127))
тотальная функция «Шаг лестницы»
принимает ход: «Ход лестницы», точка: список числа, бит: число
возвращает «Ход лестницы»
тотальная функция «Лестница»
принимает скаляр: список числа, точка: список числа, ход: «Ход лестницы», осталось: число
возвращает «Ход лестницы»
обеспечивает «витков не осталось — ход как есть» если осталось не больше 0 то результат равен ход иначе да
пример «Ноль витков — ход не тронут»
дано скаляр равно [1]
дано точка равно [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
дано ход равно (вариант «Ход лестницы» с х2 равным [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и з2 равным [0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и х3 равным [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0] и з3 равным [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
дано осталось равно 0
ожидается вариант «Ход лестницы» с х2 равным [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и з2 равным [0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и х3 равным [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и з3 равным [
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Умножить точку»
принимает скаляр: список числа, точка: список числа
возвращает список числа
обеспечивает «результат — ровно тридцать два байта» (длина результат) равен 32
тотальная функция «Основание»
возвращает список числа
обеспечивает «тридцать два байта» (длина результат) равен 32
пример «u = 9 младшим байтом вперёд»
ожидается [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
тотальная функция «Открытый ключ»
принимает тайна: список числа
возвращает список числа
обеспечивает «открытый ключ — ровно тридцать два байта» (длина результат) равен 32
| Function | Termination | Claims |
|---|---|---|
| «Нули поля» | доказано постоянным шагом | доказано 1 из 1 |
| «Разряд» | доказано структурой | — |
| «Взять первые» | доказано структурой | доказано 1 из 1 |
| «Отбросить первые» | доказано структурой | доказано 2 из 2 |
| «Сложить по разрядам» | доказано структурой | доказано 0 из 1; «длина суммы — длина длинного из слагаемых» — сетка |
| «Добавить к первому» | доказано композицией | доказано 1 из 1 |
| «Шаг переноса» | доказано композицией | доказано 1 из 1 |
| «Разложить» | доказано композицией | доказано 1 из 1 |
| «Ужать» | доказано композицией | — |
| «Свести» | доказано композицией | доказано 0 из 1; «сведение не меняет числа разрядов, пока их шестнадцать» — сетка |
| «Ноль поля» | доказано композицией | доказано 1 из 1 |
| «Единица поля» | доказано композицией | доказано 1 из 1 |
| «Простое поля» | доказано композицией | доказано 1 из 1 |
| «Четыре простых» | доказано композицией | доказано 1 из 1 |
| «Из байтов» | доказано структурой | доказано 0 из 1; «из тридцати двух байтов выходит шестнадцать разрядов» — сетка |
| «Точка из байтов» | доказано композицией | доказано 0 из 2; «шестнадцать разрядов из тридцати двух байтов» — объявлено, не доказано; «старший бит погашен» — объявлено, не доказано |
| «В байты» | доказано композицией | доказано 1 из 2; «на каждый разряд по два байта» — сетка |
| «Снять старший» | доказано композицией | — |
| «Вычесть с займом» | доказано структурой | — |
| «Канон» | доказано композицией | доказано 0 из 1; «шестнадцать разрядов, пока их было шестнадцать» — сетка |
| «Это ноль» | доказано композицией | — |
| «Это единица» | доказано композицией | — |
| «Сложение» | доказано композицией | доказано 0 из 1; «сумма — те же шестнадцать разрядов» — сетка |
| «Вычитание» | доказано композицией | доказано 0 из 1; «разность — те же шестнадцать разрядов» — сетка |
| «Свёртка разрядов» | доказано структурой | — |
| «Свернуть разряды» | доказано композицией | — |
| «Умножение» | доказано композицией | доказано 0 из 1; «произведение полей — те же шестнадцать разрядов» — сетка |
| «Квадрат» | доказано композицией | доказано 1 из 1 |
| «Умножить на число» | доказано композицией | доказано 1 из 1 |
| «Квадраты» | доказано постоянным шагом | доказано 1 из 1 |
| «Обращение» | доказано композицией | доказано 0 из 2; «обращённое — те же шестнадцать разрядов» — объявлено, не доказано; «обращённое, умноженное на исходное, даёт единицу — кроме нуля, у которого обратного нет» — объявлено, не доказано |
| «Веса байта поля» | доказано композицией | доказано 1 из 1 |
| «Бит скаляра» | доказано композицией | — |
| «Зажать скаляр» | доказано композицией | доказано 0 из 3; «байтов столько же, сколько было» — объявлено, не доказано; «младший байт кратен восьми» — объявлено, не доказано; «старший байт лежит между 64 и 127» — объявлено, не доказано |
| «Шаг лестницы» | доказано композицией | — |
| «Лестница» | доказано постоянным шагом | доказано 1 из 1 |
| «Умножить точку» | доказано композицией | доказано 0 из 1; «результат — ровно тридцать два байта» — объявлено, не доказано |
| «Основание» | доказано композицией | доказано 1 из 1 |
| «Открытый ключ» | доказано композицией | доказано 1 из 1 |
«X.509»
flang/stdlib/x509.flang — functions 26; the kernel ledger was taken from this version of the file
тотальная функция «Строка не окаймление»
принимает строчка: строка
возвращает признак
обеспечивает «окаймление начинается с дефиса» если («Начинается с» от строчка и "-") то результат равен нет иначе да
обеспечивает «строка без дефиса впереди — не окаймление» если не («Начинается с» от строчка и "-") то результат равен да иначе да
обеспечивает «не окаймление ровно тогда, когда впереди нет дефиса» результат равен (не («Начинается с» от строчка и "-"))
обеспечивает «окаймление начинается с дефиса, второй записью» не («Начинается с» от строчка и "-") или (результат равен нет)
обеспечивает «строка без дефиса впереди — не окаймление, второй записью» («Начинается с» от строчка и "-") или (результат равен да)
пример «Обычная строка основания 64»
дано строчка равно "MIIBtjCCAVugAwIBAgITBmyf1XSXNmY"
ожидается да
тотальная функция «Шаг тела PEM»
принимает набрано: строка, строчка: строка
возвращает строка
обеспечивает «строка не окаймление приписывается обрезанной» если («Строка не окаймление» от строчка) то (результат равен (соединить набрано с («Обрезать пробелы» от строчка))) иначе да
обеспечивает «окаймление в тело не попадает» если не («Строка не окаймление» от строчка) то (результат равен набрано) иначе да
обеспечивает «строка не окаймление приписывается обрезанной, второй записью» не («Строка не окаймление» от строчка) или (результат равен (соединить набрано с («Обрезать пробелы» от строчка)))
обеспечивает «окаймление в тело не попадает, второй записью» («Строка не окаймление» от строчка) или (результат равен набрано)
пример «Обычная строка приписывается»
дано набрано равно "MIIB"
дано строчка равно "tjCC"
ожидается "MIIBtjCC"
тотальная функция «Тело PEM»
принимает текст: строка
возвращает строка
обеспечивает «тело не длиннее исходного текста» (длина результат) не больше (длина текст)
пример «Окаймление отброшено, основание 64 склеено»
дано текст равно "-----BEGIN CERTIFICATE-----\nMIIB\ntjCC\n-----END CERTIFICATE-----\n"
ожидается "MIIBtjCC"
тотальная функция «Октеты сертификата из PEM»
принимает текст: строка
возвращает список числа
обеспечивает «октетов сертификата не больше, чем знаков в его тексте» (длина результат) не больше (длина текст)
обеспечивает «октетов сертификата не больше, чем знаков в теле PEM» (длина результат) не больше (длина («Тело PEM» от текст))
пример «Пустой PEM даёт ни одного октета»
дано текст равно ""
ожидается пустой список
тотальная функция «Место тела сертификата»
принимает октеты: список числа
возвращает число
обеспечивает «тело сертификата начинается не раньше третьего октета» если результат больше 0 то результат не меньше 3 иначе да
пример «Тело простого сертификата»
дано октеты равно [48, 8, 48, 3, 2, 1, 2, 48, 1, 5]
ожидается 3
тотальная функция «Сдвиг версии»
принимает октеты: список числа
возвращает число
обеспечивает «сдвиг версии сертификата — ноль или один, третьего не бывает» (результат равен 0) или (результат равен 1)
обеспечивает «метка [0] на первом месте тела — сдвиг один» если («Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160 то (результат равен 1) иначе да
обеспечивает «нет метки [0] на первом месте тела — сдвига нет» если не ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160) то (результат равен 0) иначе да
обеспечивает «метка [0] на первом месте тела — сдвиг один, второй записью» не ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160) или (результат равен 1)
обеспечивает «нет метки [0] на первом месте тела — сдвига нет, второй записью» ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160) или (результат равен 0)
пример «Версия названа — сдвиг один»
дано октеты равно [48, 8, 48, 6, 160, 3, 2, 1, 2, 5]
ожидается 1
тотальная функция «Место поля тела»
принимает октеты: список числа, номер: число
возвращает число
обеспечивает «место поля тела сертификата лежит внутри октетов или равно нулю» (результат равен 0) или (результат не больше (длина октеты))
обеспечивает «место поля тела не отрицательно» результат не меньше 0
пример «Серийный номер — первое поле после необязательной версии»
дано октеты равно [48, 10, 48, 8, 160, 3, 2, 1, 2, 2, 1, 7]
дано номер равно 1
ожидается 10
тотальная функция «Короткое имя атрибута»
принимает опр: строка
возвращает строка
обеспечивает «имя атрибута непусто, если непуст сам идентификатор» если (длина опр) больше 0 то (длина результат) больше 0 иначе да
обеспечивает «общее имя печатается как CN» если опр равен "2.5.4.3" то (результат равен "CN") иначе да
обеспечивает «страна печатается как C» если не (опр равен "2.5.4.3") то (если опр равен "2.5.4.6" то (результат равен "C") иначе да) иначе да
обеспечивает «организация печатается как O» если не (опр равен "2.5.4.3") то (если не (опр равен "2.5.4.6") то (если опр равен "2.5.4.10" то (результат равен "O") иначе да) иначе да) иначе да
обеспечивает «подразделение печатается как OU» если не (опр равен "2.5.4.3") то (если не (опр равен "2.5.4.6") то (если не (опр равен "2.5.4.10") то (если опр равен "2.5.4.11" то (результат равен "OU") иначе да) иначе да) иначе да) иначе да
обеспечивает «общее имя печатается как CN, второй записью» не (опр равен "2.5.4.3") или (результат равен "CN")
обеспечивает «страна печатается как C, второй записью» (опр равен "2.5.4.3") или ((не (опр равен "2.5.4.6")) или (результат равен "C"))
обеспечивает «организация печатается как O, второй записью» (опр равен "2.5.4.3") или ((опр равен "2.5.4.6") или ((не (опр равен "2.5.4.10")) или (результат равен "O")))
обеспечивает «подразделение печатается как OU, второй записью» (опр равен "2.5.4.3") или ((опр равен "2.5.4.6") или ((опр равен "2.5.4.10") или ((не (опр равен "2.5.4.11")) или (результат равен "OU"))))
пример «Общее имя»
дано опр равно "2.5.4.3"
ожидается "CN"
тотальная функция «Печать пары имени»
принимает октеты: список числа, место: число
возвращает строка
обеспечивает «пара печатается со знаком равенства» («Позиция подстроки» от результат и "=") больше 0
пример «Страна США»
дано октеты равно [48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83]
дано место равно 1
ожидается "C=US"
тотальная функция «Шаг набора имени»
принимает октеты: список числа, набрано: строка, пара: число
возвращает строка
обеспечивает «первая пара набора идёт без разделителя» если (длина набрано) равен 0 то (результат равен («Печать пары имени» от октеты и пара)) иначе да
обеспечивает «вторая и следующие пары приписываются через плюс» если не ((длина набрано) равен 0) то (результат равен (соединить (соединить набрано с " + ") с («Печать пары имени» от октеты и пара))) иначе да
обеспечивает «первая пара набора идёт без разделителя, второй записью» не ((длина набрано) равен 0) или (результат равен («Печать пары имени» от октеты и пара))
обеспечивает «вторая и следующие пары приписываются через плюс, второй записью» ((длина набрано) равен 0) или (результат равен (соединить (соединить набрано с " + ") с («Печать пары имени» от октеты и пара)))
пример «Первая пара идёт как есть»
дано октеты равно [48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83]
дано набрано равно ""
дано пара равно 1
ожидается "C=US"
тотальная функция «Печать набора имени»
принимает октеты: список числа, место: число
возвращает строка
обеспечивает «печать набора не длиннее трёх знаков на октет» (длина результат) не больше ((длина октеты) умножить на 3)
пример «Набор из одной пары»
дано октеты равно [49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83]
дано место равно 1
ожидается "C=US"
тотальная функция «Шаг печати имени»
принимает октеты: список числа, набрано: строка, часть: число
возвращает строка
обеспечивает «первое относительное имя идёт без разделителя» если (длина набрано) равен 0 то (результат равен («Печать набора имени» от октеты и часть)) иначе да
обеспечивает «второе и следующие относительные имена приписываются через запятую» если не ((длина набрано) равен 0) то (результат равен (соединить (соединить набрано с ", ") с («Печать набора имени» от октеты и часть))) иначе да
обеспечивает «первое относительное имя идёт без разделителя, второй записью» не ((длина набрано) равен 0) или (результат равен («Печать набора имени» от октеты и часть))
обеспечивает «второе и следующие относительные имена приписываются через запятую, второй записью» ((длина набрано) равен 0) или (результат равен (соединить (соединить набрано с ", ") с («Печать набора имени» от октеты и часть)))
пример «Первое относительное имя идёт как есть»
дано октеты равно [48, 13, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83]
дано набрано равно ""
дано часть равно 3
ожидается "C=US"
тотальная функция «Печать имени»
принимает октеты: список числа, место: число
возвращает строка
обеспечивает «печать имени не длиннее трёх знаков на октет» (длина результат) не больше ((длина октеты) умножить на 3)
пример «Имя из одного относительного имени»
дано октеты равно [48, 13, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83]
дано место равно 1
ожидается "C=US"
тотальная функция «Версия сертификата»
принимает октеты: список числа
возвращает число
обеспечивает «версия сертификата — от первой до третьей» (результат не меньше 1) и притом (результат не больше 3)
обеспечивает «версии не названо — сертификат первой версии» если не ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160) то (результат равен 1) иначе да
обеспечивает «названа двойка — сертификат третьей версии» если не (не ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160)) то (если («Целое DER» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1) и 1))) равен 2 то (результат равен 3) иначе да) иначе да
обеспечивает «названа единица — сертификат второй версии» если не (не ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160)) то (если не ((«Целое DER» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1) и 1))) равен 2) то (если («Целое DER» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1) и 1))) равен 1 то (результат равен 2) иначе да) иначе да) иначе да
обеспечивает «названо не два и не один — сертификат всё равно первой версии» если не (не ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160)) то (если не ((«Целое DER» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1) и 1))) равен 2) то (если не ((«Целое DER» от («Содержимое» от октеты и («Вложенное по счёту» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1) и 1))) равен 1) то (результат равен 1) иначе да) иначе да) иначе да
обеспечивает «версии не названо — сертификат первой версии, второй записью» ((«Разобрать голову» от октеты и («Вложенное по счёту» от октеты и («Место тела сертификата» от октеты) и 1)).«метка» равен 160) или (результат равен 1)
пример «Версии нет — значит первая»
дано октеты равно [48, 8, 48, 6, 2, 1, 7, 48, 1, 5]
ожидается 1
тотальная функция «Октеты серийного номера»
принимает октеты: список числа
возвращает список числа
обеспечивает «серийный номер не длиннее всего сертификата» (длина результат) не больше (длина октеты)
пример «Серийный номер 2»
дано октеты равно [48, 8, 48, 6, 2, 1, 2, 48, 1, 5]
ожидается [2]
тотальная функция «Серийный номер»
принимает октеты: список числа
возвращает строка
обеспечивает «серийный номер печатается не длиннее трёх знаков на октет сертификата» (длина результат) не больше ((длина октеты) умножить на 3)
обеспечивает «серийный номер печатается не длиннее трёх знаков на октет своих октетов» (длина результат) не больше ((длина («Октеты серийного номера» от октеты)) умножить на 3)
пример «Однооктетный серийный номер»
дано октеты равно [48, 8, 48, 6, 2, 1, 2, 48, 1, 5]
ожидается "02"
тотальная функция «Имя алгоритма»
принимает опр: строка
возвращает строка
обеспечивает «имя алгоритма непусто, если непуст идентификатор» если (длина опр) больше 0 то (длина результат) больше 0 иначе да
обеспечивает «RSA с SHA-256 назван своим именем» если опр равен "1.2.840.113549.1.1.11" то (результат равен "sha256WithRSAEncryption") иначе да
обеспечивает «SHA-384 с RSA назван своим именем» если не (опр равен "1.2.840.113549.1.1.11") то (если опр равен "1.2.840.113549.1.1.12" то (результат равен "sha384WithRSAEncryption") иначе да) иначе да
обеспечивает «SHA-512 с RSA назван своим именем» если не (опр равен "1.2.840.113549.1.1.11") то (если не (опр равен "1.2.840.113549.1.1.12") то (если опр равен "1.2.840.113549.1.1.13" то (результат равен "sha512WithRSAEncryption") иначе да) иначе да) иначе да
обеспечивает «SHA-1 с RSA назван своим именем» если не (опр равен "1.2.840.113549.1.1.11") то (если не (опр равен "1.2.840.113549.1.1.12") то (если не (опр равен "1.2.840.113549.1.1.13") то (если опр равен "1.2.840.113549.1.1.5" то (результат равен "sha1WithRSAEncryption") иначе да) иначе да) иначе да) иначе да
обеспечивает «RSA с SHA-256 назван своим именем, второй записью» не (опр равен "1.2.840.113549.1.1.11") или (результат равен "sha256WithRSAEncryption")
обеспечивает «SHA-384 с RSA назван своим именем, второй записью» (опр равен "1.2.840.113549.1.1.11") или ((не (опр равен "1.2.840.113549.1.1.12")) или (результат равен "sha384WithRSAEncryption"))
обеспечивает «SHA-512 с RSA назван своим именем, второй записью» (опр равен "1.2.840.113549.1.1.11") или ((опр равен "1.2.840.113549.1.1.12") или ((не (опр равен "1.2.840.113549.1.1.13")) или (результат равен "sha512WithRSAEncryption")))
обеспечивает «SHA-1 с RSA назван своим именем, второй записью» (опр равен "1.2.840.113549.1.1.11") или ((опр равен "1.2.840.113549.1.1.12") или ((опр равен "1.2.840.113549.1.1.13") или ((не (опр равен "1.2.840.113549.1.1.5")) или (результат равен "sha1WithRSAEncryption"))))
пример «RSA с SHA-256»
дано опр равно "1.2.840.113549.1.1.11"
ожидается "sha256WithRSAEncryption"
тотальная функция «Алгоритм подписи»
принимает октеты: список числа
возвращает строка
обеспечивает «имя алгоритма подписи непусто у непустого сертификата» если (длина октеты) больше 4 то (длина результат) больше 0 иначе да
пример «Пустой вход не роняет, а даёт пустое имя»
дано октеты равно пустой список
ожидается ""
тотальная функция «Издатель»
принимает октеты: список числа
возвращает строка
обеспечивает «издатель печатается не длиннее, чем весь сертификат знаками» (длина результат) не больше ((длина октеты) умножить на 3)
пример «Пустой вход не роняет»
дано октеты равно пустой список
ожидается ""
тотальная функция «Субъект»
принимает октеты: список числа
возвращает строка
обеспечивает «субъект печатается не длиннее, чем весь сертификат знаками» (длина результат) не больше ((длина октеты) умножить на 3)
пример «Пустой вход не роняет»
дано октеты равно пустой список
ожидается ""
тотальная функция «Место срока»
принимает октеты: список числа
возвращает число
обеспечивает «место срока не отрицательно» результат не меньше 0
пример «Пустой вход даёт ноль»
дано октеты равно пустой список
ожидается 0
тотальная функция «Не ранее»
принимает октеты: список числа
возвращает «Время DER»
обеспечивает «у времени начала срока месяц не больше девяноста девяти» результат.«месяц» не больше 99
пример «Пустой вход даёт время с бедой, а не догадку»
дано октеты равно пустой список
ожидается запись «Время DER» с «год» равным 0 и «месяц» равным 0 и «день» равным 0 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным "не UTCTime и не GeneralizedTime"
тотальная функция «Не позднее»
принимает октеты: список числа
возвращает «Время DER»
обеспечивает «у времени конца срока месяц не больше девяноста девяти» результат.«месяц» не больше 99
пример «Пустой вход даёт время с бедой, а не догадку»
дано октеты равно пустой список
ожидается запись «Время DER» с «год» равным 0 и «месяц» равным 0 и «день» равным 0 и «час» равным 0 и «минута» равным 0 и «секунда» равным 0 и «беда» равным "не UTCTime и не GeneralizedTime"
тотальная функция «Сертификат просрочен»
принимает октеты: список числа, сейчас: число
возвращает признак
обеспечивает «до конца срока сертификат не просрочен» если не (сейчас больше («Время числом» от («Не позднее» от октеты))) то результат равен нет иначе да
обеспечивает «позже конца срока сертификат просрочен» если сейчас больше («Время числом» от («Не позднее» от октеты)) то результат равен да иначе да
обеспечивает «просрочен ровно тогда, когда сейчас позже конца срока» результат равен (сейчас больше («Время числом» от («Не позднее» от октеты)))
обеспечивает «позже конца срока сертификат просрочен, второй записью» не (сейчас больше («Время числом» от («Не позднее» от октеты))) или (результат равен да)
обеспечивает «до конца срока сертификат не просрочен, второй записью» (сейчас больше («Время числом» от («Не позднее» от октеты))) или (результат равен нет)
пример «Пустой вход просрочен всегда — читать нечего»
дано октеты равно пустой список
дано сейчас равно 20260823000000
ожидается да
тотальная функция «Сертификат ещё не начался»
принимает октеты: список числа, сейчас: число
возвращает признак
обеспечивает «после начала срока сертификат уже начался» если не (сейчас меньше («Время числом» от («Не ранее» от октеты))) то результат равен нет иначе да
обеспечивает «раньше начала срока сертификат ещё не начался» если сейчас меньше («Время числом» от («Не ранее» от октеты)) то результат равен да иначе да
обеспечивает «не начался ровно тогда, когда сейчас раньше начала срока» результат равен (сейчас меньше («Время числом» от («Не ранее» от октеты)))
обеспечивает «раньше начала срока сертификат ещё не начался, второй записью» не (сейчас меньше («Время числом» от («Не ранее» от октеты))) или (результат равен да)
обеспечивает «после начала срока сертификат уже начался, второй записью» (сейчас меньше («Время числом» от («Не ранее» от октеты))) или (результат равен нет)
пример «Пустой вход не начинался»
дано октеты равно пустой список
дано сейчас равно 20260823000000
ожидается нет
тотальная функция «Сертификат действует»
принимает октеты: список числа, сейчас: число
возвращает признак
обеспечивает «действующий сертификат не позднее своего конца срока» если результат то (сейчас не больше («Время числом» от («Не позднее» от октеты))) иначе да
обеспечивает «просроченный сертификат не действует» если («Сертификат просрочен» от октеты и сейчас) то (результат равен нет) иначе да
обеспечивает «не начавшийся сертификат не действует» если («Сертификат ещё не начался» от октеты и сейчас) то (результат равен нет) иначе да
обеспечивает «действует — значит не просрочен» если результат то (не («Сертификат просрочен» от октеты и сейчас)) иначе да
обеспечивает «действует — значит уже начался» если результат то (не («Сертификат ещё не начался» от октеты и сейчас)) иначе да
обеспечивает «действует ровно тогда, когда не просрочен и уже начался» результат равен ((не («Сертификат просрочен» от октеты и сейчас)) и притом (не («Сертификат ещё не начался» от октеты и сейчас)))
обеспечивает «просроченный сертификат не действует, второй записью» не («Сертификат просрочен» от октеты и сейчас) или (результат равен нет)
обеспечивает «не начавшийся сертификат не действует, второй записью» не («Сертификат ещё не начался» от октеты и сейчас) или (результат равен нет)
обеспечивает «действует — значит не просрочен, второй записью» (не результат) или (не («Сертификат просрочен» от октеты и сейчас))
обеспечивает «действует — значит уже начался, второй записью» (не результат) или (не («Сертификат ещё не начался» от октеты и сейчас))
пример «Пустой вход не действует»
дано октеты равно пустой список
дано сейчас равно 20260823000000
ожидается нет
| Function | Termination | Claims |
|---|---|---|
| «Строка не окаймление» | доказано композицией | доказано 5 из 5 |
| «Шаг тела PEM» | доказано композицией | доказано 4 из 4 |
| «Тело PEM» | доказано композицией | доказано 0 из 1; «тело не длиннее исходного текста» — сетка |
| «Октеты сертификата из PEM» | доказано композицией | доказано 1 из 2; «октетов сертификата не больше, чем знаков в его тексте» — сетка |
| «Место тела сертификата» | доказано композицией | доказано 0 из 1; «тело сертификата начинается не раньше третьего октета» — сетка |
| «Сдвиг версии» | доказано композицией | доказано 5 из 5 |
| «Место поля тела» | доказано композицией | доказано 0 из 2; «место поля тела сертификата лежит внутри октетов или равно нулю» — сетка; «место поля тела не отрицательно» — сетка |
| «Короткое имя атрибута» | доказано композицией | доказано 8 из 9; «имя атрибута непусто, если непуст сам идентификатор» — сетка |
| «Печать пары имени» | доказано композицией | доказано 0 из 1; «пара печатается со знаком равенства» — сетка |
| «Шаг набора имени» | доказано композицией | доказано 4 из 4 |
| «Печать набора имени» | доказано композицией | доказано 0 из 1; «печать набора не длиннее трёх знаков на октет» — сетка |
| «Шаг печати имени» | доказано композицией | доказано 4 из 4 |
| «Печать имени» | доказано композицией | доказано 0 из 1; «печать имени не длиннее трёх знаков на октет» — сетка |
| «Версия сертификата» | доказано композицией | доказано 6 из 6 |
| «Октеты серийного номера» | доказано композицией | доказано 1 из 1 |
| «Серийный номер» | доказано композицией | доказано 1 из 2; «серийный номер печатается не длиннее трёх знаков на октет сертификата» — сетка |
| «Имя алгоритма» | доказано композицией | доказано 8 из 9; «имя алгоритма непусто, если непуст идентификатор» — сетка |
| «Алгоритм подписи» | доказано композицией | доказано 0 из 1; «имя алгоритма подписи непусто у непустого сертификата» — сетка |
| «Издатель» | доказано композицией | доказано 1 из 1 |
| «Субъект» | доказано композицией | доказано 1 из 1 |
| «Место срока» | доказано композицией | доказано 1 из 1 |
| «Не ранее» | доказано композицией | доказано 1 из 1 |
| «Не позднее» | доказано композицией | доказано 1 из 1 |
| «Сертификат просрочен» | доказано композицией | доказано 5 из 5 |
| «Сертификат ещё не начался» | доказано композицией | доказано 5 из 5 |
| «Сертификат действует» | доказано композицией | доказано 9 из 10; «действующий сертификат не позднее своего конца срока» — сетка |