— le langage —

Langage VVL

Une syntaxe Lisp homoiconique. 879 builtins. Vingt opérateurs où le LLM devient un opérateur du langage, comme + ou ==. Le langage spécialement conçu pour piloter un serveur IA.

Testez VVL online Référence complète
— La règle d'or —

Tout est commande entre crochets

Une seule règle de syntaxe — [commande args…] — se décline partout : un calcul, une classe, un appel réseau, une requête LLM. Le code est une donnée : une liste s'évalue, ou se cite avec le backtick pour être manipulée comme un arbre syntaxique.

~ syntaxe fondamentale ~
# 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
❦
— Le LLM n'est pas une API, c'est le langage —

Quatre rôles, zéro pipeline

Dans VVL, le modèle de langage n'est pas un service externe qu'on appelle : il acquiert un contrat d'interface stable, au même titre que + ou ==. Il endosse quatre rôles, sans aucun code de plomberie entre eux.

1 · opérateur

Opérateur [§ "…"]

L'opérande sémantique fait basculer le même dispatcheur du mode arithmétique au mode neuro-symbolique. Retour typé : booléen, chaîne ou concept.

[§ "chat"] == [§ "félin"]   # → 1
[§ "voiture"] + [§ "électrique"]
# → electric car (concept)
2 · générateur

Générateur @

Une description produit une lambda VVL validée par le parser et exécutée en bac à sable (liste blanche de builtins). Le LLM réfléchit une fois, le code tourne N fois.

$fn = ($orders @ [§ "total_amount > 1000"])
[filter $fn $orders]   # local lambda, 0 LLM
3 · objet

Objet [@ "nom"]

Un nom de concept se matérialise en objet formel (Zalta). Noyau de propriétés au bootstrap, découverte paresseuse ensuite, cache à trois niveaux → coût décroissant.

$soleil = [@ "Soleil"]
$soleil.masse_kg     # → 1.989e30
($soleil ~~ "Étoile")  # → ~0.95
4 · compilateur

Compilateur §§ / generic

§§ compile une question en français en programme VVL, l'exécute et rend le résultat. generic l'industrialise en keyword nommé, testé et persisté — réutilisable sur d'autres concepts.

[§§ "consommation BMW Série 3 diesel 2024 ?"] # → ~5.1

[generic "masse de @{Saturne} ?"]
[get-mass-kg-of-concept "Jupiter"] # reusable

Un seul modèle de langage, quatre rôles distincts, zéro pipeline d'intégration. C'est ce qui fait de VVL un langage neuro-symbolique — et non un wrapper d'API.

❦
— Algèbre neuronale —

Les vingt opérateurs sémantiques

Activés par l'opérande [§ "…"], ce sont les mêmes opérateurs que sur les nombres — c'est le type de l'opérande qui les fait basculer. Quatre familles, plus @.

Famille Opérateurs Sortie Exemple → résultat
Comparaisons floues == != < > <= >= BOOLEAN [§ "chat"] == [§ "félin"] → 1
Algèbre conceptuelle + − * / % SEMANTIC / STRING / APPROX [§ "Paris"] % [§ "pays"] → France
Logique sémantique && || ^^ ~ ? SEMANTIC / STRING $bio ? [§ "année de naissance ?"] → 1912
Appartenance (IS-A) in <| |> BOOLEAN [§ "voiture élec."] <| [§ "véhicule"] → 1
Génération de code @ LAMBDA $data @ [§ "filtrer par âge"] → lambda

Distinction fine : la projection / extrait une dimension déjà contenue dans la description ; la propriété % interroge la connaissance générale du LLM. Les résultats sémantiques se composent comme de l'arithmétique. Projetée sur une échelle ([§ ["bas" "moyen" "haut"]]), / rend un score : une position calibrée avec sa confiance.

❦
— Système 1 / Système 2 —

Décider vite, raisonner si besoin

Avec [semanticMode "jev"], les décisions typées passent d'abord par Jev (TypeSafe AI) : un modèle qui ne rédige pas mais tranche — oui/non, choix, position sur une échelle — avec une confiance calibrée, en ~0,4 s. S'il hésite (confiance sous le seuil, 0,8 par défaut), le LLM reprend la main. Même syntaxe, même cache ; chaque décision est tracée dans semantic.log (onglet Semantic de :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

Opérateurs & match

== in <| · match · tables

Les opérateurs booléens rendent toujours 1/0. Un [match] sur des [§ …] choisit sa branche par le sens ; avec des tuples, il devient une table de décision : une question par colonne, un seul appel.

Score & degrés flous

/ scale · fuzzy:degree(s)

Projeté sur une échelle, / rend une position calibrée (Approximation). [fuzzy:degrees] mesure plusieurs degrés en un appel, prêts pour ~& et fuzzy:very.

Ontologies & Zalta

fromText · ~~

Jev choisit la sous-classe d'un objet extrait et rapproche les valeurs à liste fermée ; la similarité ~~ des règles tranche toutes les paires en un appel.

Routeur, agent, architecte

[§§] · [agent] · [architect]

Le routeur [§§] classe une question en ~0,4 s ; le juge de [agent] dit « oui » sans appel LLM ; [architect] valide ses étapes par un degré plutôt que par une boucle d'agent.

❦
— Déterminisme —

Le coût de l'IA paie une fois

Comment un système probabiliste devient-il aussi fiable qu'un opérateur natif ? Par quatre garanties intégrées au moteur — pas laissées au développeur : (1) typage de sortie automatique (on ne parse jamais une chaîne), (2) cache déterministe persistant sur disque — même expression, même résultat dans toutes les sessions, coût API → 0 et tests reproductibles, (3) retry validé jusqu'à succès, (4) spécifications XML few-shot. Sans le typage il faudrait parser ; sans le cache la latence serait prohibitive ; sans le retry la moindre variation du modèle casserait le programme. C'est l'ensemble qui distingue VVL d'un simple wrapper.

❦
— Le versant symbolique —

Du neuronal au raisonnement garanti

Le même langage embarque le versant symbolique : raisonnement déductif garanti, schémas typés et optimisation prouvée. Les concepts réifiés deviennent les opérandes de cette algèbre — c'est le pont neuro-symbolique.

Base Prolog

facts · rules · query

Une base de connaissances déductive intégrée. Les objets s'y injectent (obj-assert) ; les inférences sont garanties, pas approximées.

Système ontologique

ontology:*

Schémas typés, règles métier en cascade, et mondes possibles (fork d'ontologie) pour raisonner sous hypothèses. En mode jev, la sous-classe d'un objet extrait et ses valeurs à liste fermée sont tranchées par Jev.

Opérateurs Zalta

== ~~ · * ** · + ++ · / //

Huit opérateurs (4 opérations × 2 modes symbolique/hybride) : une véritable algèbre sur les concepts, gratuite une fois les propriétés chargées. La similarité ~~ sur des valeurs non triviales passe par Jev : toutes les paires en un appel.

Relationnel miniKanren

run-all · predicate · ==

Des relations, pas des fonctions : une seule définition se résout dans tous les sens. Recherche complète par entrelacement, contraintes (distinct, CLP symbolique) et version probabiliste façon ProbLog.

Preuve & contrats

proof:auto · contract:verify

Un noyau tranche les propositions et répond proved, refuted ou unknown — jamais un « oui » plausible. Une fonction sous contrat voit require ⟹ ensure vérifié statiquement, sans l'exécuter.

Diagnostic bayésien

bfacts · diagnose

Chaque clause porte une croyance Beta, pas un booléen. Quand une observation contredit la base, le moteur calcule les conflits minimaux et classe les suspects par coût de révocation.

Solveur CP-SAT

OR-Tools · NL → modèle

VVL expose CP-SAT avec une syntaxe conceptuelle (décisions typées, contraintes dures et molles). Une intention en français devient un modèle à l'optimalité prouvée.

❦
— Smart contracts —

Un état qui se prouve et se rejoue

Un [keyword] dont le [contract] nomme un registre devient un smart contract : chaque appel est une transaction, inscrite dans un bloc chaîné et signé. Les conditions du contrat se prouvent avant l'exécution, se vérifient à chaque appel, et l'historique entier se rejoue — le tout dans le langage, sans blockchain externe.

[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)

État & conditions

state · require · ensure · old()

[state] déclare les emplacements du contrat ; [require] porte sur l'état avant, [ensure] sur l'état après, old(x) relie les deux. Une condition qui tombe annule la transaction : tout ou rien.

Prouver, puis rejouer

contract:verify · ledger:verify · ledger:proof

[contract:verify] prouve le contrat pour tous les états, par exécution symbolique. [ledger:verify] ré-exécute chaque transaction avec le code d'origine ; [ledger:proof] prouve une valeur sans le serveur.

Classes & oracles

class [ledger …] · oracle

Une classe liée par [ledger nom :key …] : l'objet est l'état, une méthode est une transaction. [oracle] inscrit dans le bloc la réponse d'un LLM, qui devient opposable et n'est jamais rappelée au rejeu.

Opposable & réparti

ledger:anchor · ledger:follow · ledger:finality

Ancrage de la tête chez un tiers (horodatage RFC 3161, Bitcoin). Des répliques du cluster ré-exécutent chaque bloc, attestent ce qu'elles ont vérifié ([ledger:finality]) et détectent un historique réécrit.

❦
— Exécution —

Interprété, compilé, puis distribué

Le même code passe de l'interpréteur à une machine virtuelle native, puis à plusieurs machines — sans être réécrit. Ce qui décide n'est pas un réglage, mais une propriété vérifiable du code : sa pureté.

VM native

[compile] · .run · .coverage

Le code se compile vers une VM Rust et reste inspectable : représentation intermédiaire, bytecode, et surtout couverture — ce qui s'exécute nativement et ce qui repasse par l'hôte.

Compilation à chaud

[jit] · [vectorize]

Une lambda devenue chaude est compilée automatiquement après N appels. Le seuil se lit et se règle en une commande ; le tier vectorisant de map se bascule sans redémarrer.

Cluster de calcul

cluster:register · cluster:map

Une fonction fermée et pure est adressée par son SHA-256, puis exécutée en shards persistants sur plusieurs instances. Ce qui ne compile pas ne se distribue pas : le déterminisme est une condition, pas un espoir.

❦
— Comparaison —

VVL face à Python + LangChain

CritèrePython + LangChainVVL
Le LLM comme opérateur du langageAppels d'API à parserNatif (20 opérateurs)
Pipeline extraction → enrichissement → décision~500 lignes~40 lignes
Code généré par LLM, validé et exécutableÀ valider soi-même@ : parser + sandbox + retry
Compilation NL → solveur de contraintesPas natifCP-SAT, optimalité prouvée
Cache sémantique persistant (coût → 0)À implémenterIntégré
Pont LLM ↔ Prolog ↔ objetTriple intégrationPremière classe
Mondes possibles (fork d'ontologie)Manuelontology:*

Un serveur IA unique, piloté par un langage dont le paradigme est conçu pour lui. C'est la différence entre intégrer l'IA et programmer avec elle.

❦ ❦ ❦