Язык VVL
Гомоиконный Lisp-синтаксис. 879 встроенных. Двадцать семантических операторов. Нейронное и символическое сосуществуют первым классом.
Всё — команда в скобках
Одно синтаксическое правило — [команда аргументы…] — действует везде: вычисление, класс, сетевой вызов, запрос к LLM. Код является данными: список вычисляется или цитируется обратным апострофом, чтобы обрабатывать его как синтаксическое дерево.
# Prefix form [command args…] — eager evaluation, innermost first [print [+ 1 2 3]] # → 6 # Variables ($), assignment (=), sugared infix arithmetic (…) $prix = 100 $ttc = ($prix * 1.20) # → 120.0 # Quasiquote (backtick) = literal data; unquote (,) injects a value $n = 5 `[1 ,$n ,[+ 1 2]] # → [1 5 3] # String interpolation: ${ VVL expression } $msg = "n*n = ${[* $n $n]}" # → "n*n = 25" # Dotted accessors, chainable $s = " 42 " $s.trim.int # → 42 # Lambda (params → $__name) + map / pmap (parallel) $double = [lambda [x] [* $__x 2]] [map $double `[1 2 3 4]] # → [2 4 6 8] [pmap $extract $documents] # N LLM calls in parallel
Четыре роли, ноль конвейера
LLM — не внешний сервис: это оператор языка. Семантический операнд [§ "..."] (тип VVL_Semantic) переключает тот же диспетчер из арифметического режима в нейро-символический: [§ "кот"] == [§ "кошачий"] возвращает 1. Четыре семейства, плюс @.
Оператор [§ "…"]
Семантический операнд переключает тот же диспетчер из арифметического режима в нейросимволический. Типизированный результат: булево, строка или концепт.
[§ "chat"] == [§ "félin"] # → 1 [§ "voiture"] + [§ "électrique"] # → electric car (concept)
Генератор @
Описание порождает VVL-лямбду, проверенную парсером и исполняемую в песочнице (белый список функций). LLM думает один раз, код работает N раз.
$fn = ($orders @ [§ "total_amount > 1000"]) [filter $fn $orders] # local lambda, 0 LLM
Объект [@ "имя"]
Имя концепта материализуется в формальный объект (Zalta). Ядро свойств при инициализации, ленивое доопределение далее, трёхуровневый кеш → убывающая стоимость.
$soleil = [@ "Soleil"] $soleil.masse_kg # → 1.989e30 ($soleil ~~ "Étoile") # → ~0.95
Компилятор §§ / generic
§§ компилирует вопрос на естественном языке в программу VVL, исполняет её и возвращает результат. generic превращает её в именованный, протестированный и сохранённый keyword — пригодный для других концептов.
[§§ "consommation BMW Série 3 diesel 2024 ?"] # → ~5.1 [generic "masse de @{Saturne} ?"] [get-mass-kg-of-concept "Jupiter"] # reusable
Одна языковая модель, четыре разные роли, ноль интеграционного конвейера. Именно это делает VVL нейросимволическим языком, а не обёрткой над API.
Двадцать семантических операторов
Активируемые операндом [§ "…"], это те же операторы, что и над числами — переключает их тип операнда. Четыре семейства плюс @.
| Семейство | Операторы | Результат | Пример → результат |
|---|---|---|---|
1 · Нечёткие сравнения — булев возврат, пригодны в if/filter |
== != < > <= >= | BOOLEAN | [§ "кошка"] == [§ "кошачий"] → 1 |
| 2 · Концептуальная алгебра — арифметика над понятиями (семантический / строковый возврат) | + − * / % | SEMANTIC / STRING / APPROX | [§ "Париж"] % [§ "страна"] → Франция |
| 3 · Семантическая логика — составные концептуальные выражения | && || ^^ ~ ? | SEMANTIC / STRING | $bio ? [§ "год рождения?"] → 1912 |
| 4 · Принадлежность и включение — отношение IS-A первым классом (булев возврат) | in <| |> | BOOLEAN | [§ "электромобиль"] <| [§ "транспорт"] → 1 |
| + · Генерация кода — гомоиконная кульминация (подробно ниже) | @ | LAMBDA | $data @ [§ "фильтровать по возрасту"] → lambda |
Тонкое различие: проекция / извлекает измерение, уже содержащееся в описании; свойство % обращается к общим знаниям LLM. Семантические результаты композируются, как арифметика. При проекции на шкалу ([§ ["низкий" "средний" "высокий"]]) / возвращает оценку: откалиброванную позицию с её уверенностью.
Решать быстро, рассуждать при необходимости
С [semanticMode "jev"] типизированные решения сначала передаются Jev (TypeSafe AI) — модели, которая не пишет текст, а принимает решение (да/нет, выбор, позиция на шкале) с откалиброванной уверенностью, примерно за 0,4 с. Если Jev сомневается (уверенность ниже порога, по умолчанию 0,8), управление переходит к LLM. Тот же синтаксис, тот же кэш; каждое решение записывается в semantic.log (вкладка Semantic в :log).
[semanticMode "jev"] [§ "a trumpet"] == [§ "a refrigerator"] # → 0 (Jev, 0.4 s) [match [§ $ticket] [§ "Payments, refunds"] "billing" [§ "Bugs, outages"] "technical" "escalade"] # branch chosen by meaning ([§ $review] / [§ ["calm" "annoyed" "angry"]]) # → <approx: 1.99 [high]> [fuzzy:degree [§ $mail] "spam"] # → 0.98
Операторы и match
Логические операторы всегда возвращают 1/0. [match] по [§ …] выбирает ветку по смыслу; с кортежами он становится таблицей решений: один вопрос на столбец, один вызов.
Оценка и нечёткие степени
При проекции на шкалу / возвращает откалиброванную позицию (Approximation). [fuzzy:degrees] измеряет несколько степеней за один вызов — сразу для ~& и fuzzy:very.
Онтологии и Zalta
Jev выбирает подкласс извлечённого объекта и сопоставляет значения из закрытого списка; сходство ~~ в правилах решает все пары за один вызов.
Маршрутизатор, агент, архитектор
Маршрутизатор [§§] классифицирует вопрос примерно за 0,4 с; судья [agent] отвечает «да» без вызова LLM; [architect] проверяет свои шаги степенью, а не циклом агента.
Стоимость ИИ платится один раз
Как вероятностная система становится столь же надёжной, как нативный оператор? Благодаря четырём гарантиям, встроенным в движок, а не оставленным разработчику: (1) автоматическая типизация вывода (вы никогда не парсите строку), (2) детерминированный кеш на диске — одно выражение, один результат во всех сессиях, стоимость API → 0 и воспроизводимые тесты, (3) проверяемый повтор до успеха, (4) XML-спецификации few-shot. Без типизации пришлось бы парсить; без кеша задержка была бы непомерной; без повтора малейший дрейф модели ломал бы программу. Именно совокупность отличает VVL от простой обёртки.
От нейронного к гарантированному выводу
Тот же язык несёт символический аспект: гарантированный дедуктивный вывод, типизированные схемы и доказанную оптимизацию. Реифицированные концепты становятся операндами этой алгебры — это нейросимволический мост.
База Prolog
Встроенная дедуктивная база знаний. Объекты внедряются в неё (obj-assert); выводы гарантированы, а не приближены.
Онтологическая система
Типизированные схемы, каскадные бизнес-правила и возможные миры (форк онтологии) для рассуждения при допущениях. В режиме jev подкласс извлечённого объекта и его значения из закрытого списка определяет Jev.
Операторы Zalta
Восемь операторов (4 операции × 2 режима символический/гибридный): настоящая алгебра над концептами, бесплатная после загрузки свойств. Сходство ~~ для нетривиальных значений проходит через Jev: все пары за один вызов.
Реляционный miniKanren
Отношения, а не функции: одно определение решается во всех направлениях. Полный поиск с чередованием, ограничения (distinct, символьный CLP) и вероятностный режим в духе ProbLog.
Доказательства и контракты
Ядро решает пропозиции и отвечает proved, refuted или unknown — но не правдоподобным «да». Для функции под контрактом require ⇒ ensure проверяется статически, без её выполнения.
Байесовская диагностика
Каждая клауза несёт бета-убеждение, а не булево значение. Когда наблюдение противоречит базе, движок вычисляет минимальные конфликты и ранжирует подозреваемых по стоимости отзыва.
Решатель CP-SAT
VVL открывает CP-SAT с концептуальным синтаксисом (типизированные решения, жёсткие и мягкие ограничения). Намерение на естественном языке становится моделью с доказанной оптимальностью.
Состояние, которое доказывает себя и повторно воспроизводится
[keyword], чей [contract] указывает реестр, становится смарт-контрактом: каждый вызов — это транзакция, записанная в связанный в цепочку и подписанный блок. Условия контракта доказываются до выполнения, проверяются при каждом вызове, а вся история повторно воспроизводится — всё это в самом языке, без внешнего блокчейна.
[keyword transfer [contract [args from to [amount :type Integer :min 1]] [ledger bank] [state [src "account:{from}" :required] [dst "account:{to}" :required]] [require "amount <= src"] [ensure "src + dst = old(src) + old(dst)"]] [do [state:put src ([state:get src] - @3)] [state:put dst ([state:get dst] + @3)]]] [contract:verify transfer].status # → "proved" (for every state) [transfer "alice" "bob" 30] # → one signed block [transfer "alice" "bob" 500] # → refused, nothing written [ledger:verify bank].ok # → 1 (chain, signatures, full replay)
Состояние & условия
[state] объявляет слоты контракта; [require] относится к состоянию до, [ensure] — к состоянию после, old(x) связывает одно с другим. Невыполненное условие отменяет транзакцию: всё или ничего.
Доказать, затем повторно воспроизвести
[contract:verify] доказывает контракт для всех состояний с помощью символьного выполнения. [ledger:verify] повторно выполняет каждую транзакцию с исходным кодом; [ledger:proof] доказывает значение без сервера.
Классы & оракулы
Класс, привязанный через [ledger имя :key …]: объект — это состояние, метод — это транзакция. [oracle] записывает в блок ответ LLM, который становится имеющим доказательную силу и никогда не запрашивается заново при повторном воспроизведении.
Имеющий доказательную силу & распределённый
Закрепление якорем головы цепочки у третьей стороны (метка времени RFC 3161, Bitcoin). Реплики кластера повторно выполняют каждый блок, удостоверяют то, что они проверили ([ledger:finality]), и обнаруживают переписанную историю.
Интерпретируется, компилируется, затем распределяется
Один и тот же код переходит от интерпретатора к нативной виртуальной машине, а затем на несколько машин — без переписывания. Решает не настройка, а проверяемое свойство кода: его чистота.
Нативная ВМ
Код компилируется в ВМ на Rust и остаётся исследуемым: промежуточное представление, байт-код и, главное, покрытие — что выполняется нативно, а что уходит к хосту.
Горячая компиляция
Ставшая «горячей» лямбда компилируется автоматически после N вызовов. Порог читается и задаётся одной командой; векторизующий уровень map переключается без перезапуска.
Вычислительный кластер
Замкнутая и чистая функция адресуется по SHA-256 и выполняется персистентными шардами на нескольких экземплярах. Что не компилируется — не распространяется: детерминизм здесь условие, а не надежда.
VVL против Python + LangChain
| Критерий | Python + LangChain | VVL |
|---|---|---|
| LLM как оператор языка | Вызовы API для парсинга | Нативно (20 операторов) |
| Конвейер извлечение → обогащение → решение | ~500 строк | ~40 строк |
| Код от LLM, проверенный и исполняемый | Проверять самому | @: парсер + песочница + повтор |
| Компиляция NL → решатель ограничений | Не нативно | CP-SAT, доказанная оптимальность |
| Постоянный семантический кеш (стоимость → 0) | Нужно реализовать | Встроено |
| Мост LLM ↔ Prolog ↔ объект | Тройная интеграция | Первый класс |
| Возможные миры (форк онтологии) | Вручную | ontology:* |
Единый ИИ-сервер, управляемый языком, парадигма которого создана для него. Это разница между интеграцией ИИ и программированием с ним.