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

Бесконечность становится законной, если убрать вычитание

Проблема бесконечности не в том, что она бесконечна. Проблема в трёх операциях: ∞ − ∞, 0 × ∞, ∞ / ∞ дают «не число».

Отсюда рецепт: убрать операции — законы вернутся.

Конкретно: неотрицательные числа с бесконечностью, отрезок [0, +∞], по сложению образуют коммутативный моноид. Сложение всегда определено, ассоциативно, коммутативно, ноль нейтрален, бесконечность поглощает. NaN недостижим, потому что вычитания в структуре нет.

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

Дополнительная выгода. Тип с обеими границами — подарок ядру: правила про неотрицательность и умножение уже читают отрезок, так что часть функций становится доказуемой просто от смены объявленного типа.

Статус. Работа запущена (ветка work/beskonechnost) с прямым требованием проверить это рассуждение вычислением, а не принять на слово.

Связано: double-has-no-laws, three-number-types, nan-is-reachable