AXIOM Документація Axiom
ENBLACKGRAYWHITE
Axiom · black

Контракти

Contracts — центральна частина Axiom. Це спосіб описати межі допустимого стану так, щоб compiler міг ними користуватися.

Уявіть типову backend-функцію: «offset має бути в buffer», «JSON response не більший за capacity», «після reserve місця вистачає». У Axiom ці речі не залишаються коментарями.

КонструкціяХто відповідаєЩо означає
require exprcallerПередумова. Виклик законний лише коли умова доведена.
ensure exprcalleeПісляумова: implementation має довести її для кожного return path.
invariant exprтип / loopВластивість, яка повинна зберігатися.
assert exprcompile timeТочка, де програміст вимагає доказ.
runtime_assert exprruntimeСвідомо залишена runtime-перевірка.
assume exprtrusted boundaryДуже обмежений спосіб сказати compiler-у «вважай це істинним»; це sus.

Приклад: writer, який не переповнить buffer

Object invariantAxiom
1writer:2    view<u8> out3    usize used45    invariant used <= out.size()67    push(u8 value):8        require used < out.size()9        out[used] = value10        used = used + 111        ensure used <= out.size()12END writer
2

Mutable view на caller-owned storage.

3

Скільки байтів уже зайнято.

5

Інваріант об’єкта: used ніколи не виходить за capacity.

8

Caller повинен мати доказ, що є хоча б один вільний байт.

9

Індекс безпечний через require + invariant.

10

Збільшуємо used.

11

Implementation зобов’язаний довести, що invariant зберігся.

Runtime input не ламає модель

Якщо число приходить із мережі, compiler фізично не може знати його значення під час build. Тоді ви перевіряєте input один раз і після branch отримуєте доведений факт.

Validate once, use proof laterAxiom
1set_page_size(u32 requested) -> result<u32, request_error>:2    if requested == 0 or requested > 100:3        RETURN error(invalid_page_size)4    assert requested >= 15    assert requested <= 1006    RETURN ok(requested)
2

Runtime branch відсікає недопустимі дані.

4

Після branch analyzer уже має вивести цей факт; assert тут корисний як executable documentation/proof checkpoint.

6

У success path значення вже bounded 1..100.

Чому це схоже на SPARK

SPARK навчив інженерів мислити contracts як proof obligations, а не декоративні annotations. Axiom переносить цей принцип у компактніший surface syntax і поширює його на views, memory regions, parallel effects та bundle planning.