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

Из четырёх утверждений, которых ждут от планировщика процессов, ядро не берёт ни одного — и причина у каждого своя

Планировщик процессов на flang (flang/self/conc.flang, 2319 строк) — удобный пробный камень: от него ждут ровно четырёх утверждений, и они известны заранее. Проверены поимённо, и доказать удалось ноль. При этом восемь утверждений другого рода закрылись сразу и без теоремы, так что дело не в сложности планировщика, а в РОДЕ цели.

Общая часть этого уже записана и здесь не повторяется: замкнутую цель надо считать — вот откуда взялись восемь закрытых; две трети отказов ядра — сравнение длины результата с длиной входа — вот куда попали отказы. Новое здесь — что от этих двух правил остаётся конкретной предметной области.

Четыре ожидаемых утверждения и вердикт каждому.

Что закрылось вместо них. Восемь замкнутых целей, и две из них не украшение, а сторож на настоящий разрыв:

обеспечивает «стратегий надзора ровно три»    (длина результат) равен 3
обеспечивает «разрядов ровно тридцать два»    (длина результат) равен 32
обеспечивает «у поручения адресат зовётся кому» результат равен "кому"

Третье не пересказ тела: тело спрашивает словарь («Поле процесса у действия» от («Имя поручения»)), а цель называет ОТВЕТ. На стволе эти двое расходились — словарь отвечал на «поручить» пустой строкой.

Побочный измеренный факт, важный для цены. Постусловие, помеченное «доказано вычислением замкнутой цели», вычислитель ВСЁ РАВНО считает после каждого возврата. Обнаружено снятием: порча, выбросившая третью стратегию, прилетела в сверку отказом FLANG_PROPERTY, а не другим ответом, и уронила прогон вместо того, чтобы покраснеть. То есть «доказано» снимает цену в напечатанном коде, но не в прогоне на вычислителе, и всякая сверка, которая зовёт эталон, обязана считать его ОТКАЗ расхождением, а не падением.

Чем подтверждено. Ветка work/planirovshchik на основании 2bfcb7d0, node flang/bin/flang.mjs check flang/self/conc.flang --proof --pretty: утверждений 15, доказано 15, сетка 0, объявлено-не-доказано 0. До работы было

  1. Отвергнутые кандидаты мерены тем же вызовом на копии файла: 4 постусловия

про длину списка — «объявлено, не доказано», 8 постусловий «результат не меньше нуля» на арифметике генератора — «сетка».

Чем ограничено. «Не выразимо» здесь значит «не выражается при нынешнем наборе правил», а не «невозможно»: правило про длину списка закрыло бы два пункта из четырёх, а мера из пары — третий.

Смежное. Замкнутую цель надо считать, а не выводить · Две трети того, что ядро не берёт, — сравнение длины · Из двух половин доставки язык доказывает только «не больше одного» · Измеренный ноль ценнее ненайденного правила · Инвариант процесса пишется постусловием обработчика