← На главную

Гипер-реляционная БЗ kb на Trealla Prolog, SHA-256, SQLite, Raylib

27.06.2026 12:16 · hackernews

kb — это локальная гипер-реляционная база знаний, построенная как дипломный прототип. В основе лежит контентно-адресуемое хранилище (CAS) на SHA-256: файлы стейджатся, хешируются и атомарно коммитятся вместе с графовыми метаданными. Дубликаты удаляются автоматически.

Знания хранятся в виде утверждений statement(Subject, Predicate, Object, Properties). Subject и Object — это Prolog-термы или ID ссылок на другие строки в той же таблице, поэтому утверждения могут быть и субъектом, и объектом — получается вложенность и «утверждения об утверждениях» (reification). SQLite-схема использует WAL mode, FTS5 для полнотекстового поиска и replaces_id для версионирования. Каждое обновление создаёт новую версию утверждения, связанную с предыдущей, а команда pl history показывает всю цепочку — это путешествие во времени.

В качестве основной среды исполнения используется Trealla Prolog. SQLite и Raylib подключаются через C-библиотеки, загружаемые через FFI. Графический интерфейс построен на Raylib: просмотр графа, превью изображений, поиск узлов и строка запроса. Для сборки нужны Clang, X11 (Linux) или Xcode CLT (macOS). Trealla, Raylib, raygui и SQLite идут как подмодули. Команда make собирает три динамические библиотеки: libcas.so, libgui.so, libsqlite3.so. Raylib компилируется из исходников прямо в процессе сборки.

Примеры работы из командной строки: загрузить контекст concept(mathematics) в память и открыть REPL — tpl -l main.pl -- pl load concept(mathematics). Добавить утверждение: tpl -l main.pl -- pl assert "statement(concept(mathematics), foundation_of, concept(logic), [])". Полнотекстовый поиск: tpl -l main.pl -- pl search mathematics. История версий: pl history concept(mathematics). Работа с CAS: добавить файл, просмотреть список объектов, запустить GUI, проверить базу, вызвать сборщик мусора.

Архитектура разбита на модули: main.pl — роутер команд и REPL; директория prolog/ содержит файлы sync.pl (двухфазный коммит между Prolog и SQLite), cas.pl (FFI-биндинги к libcas.so), db.pl (SQLite-запросы), gui.pl (фронтенд на Raylib через yield-loop), ontology.pl (граф в памяти). В src/ лежат Си-исходники: CAS, рендерер Raylib, раскладка графа, утилиты (SHA-256, MD5). sql/schema.sql задаёт схему. В vendor/ — подмодули Trealla, Raylib, raygui, SQLite.

Пример сложного утверждения с вложенностью: Алиса с уверенностью 0.9 утверждает, что Боб любит пиццу — statement(person(alice), claims, statement(person(bob), likes, food(pizza), []), [certainty(0.9)]). Загрузка контекста выбирает из базы только достижимое подграфо через рекурсивные CTE.

Для воспроизводимой сборки предусмотрен kb.nix shell. Код распространяется под лицензией GPL-3.0.

Читать оригинал →