Langage VVL
Une syntaxe Lisp homoiconique. 608 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.
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.
# 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
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.
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)
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
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
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.
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 | [§ "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.
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.
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
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
Schémas typés, règles métier en cascade, et mondes possibles (fork d'ontologie) pour raisonner sous hypothèses.
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.
Solveur CP-SAT
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.
VVL face à Python + LangChain
| Critère | Python + LangChain | VVL |
|---|---|---|
| Le LLM comme opérateur du langage | Appels d'API à parser | Natif (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 contraintes | Pas natif | CP-SAT, optimalité prouvée |
| Cache sémantique persistant (coût → 0) | À implémenter | Intégré |
| Pont LLM ↔ Prolog ↔ objet | Triple intégration | Première classe |
| Mondes possibles (fork d'ontologie) | Manuel | ontology:* |
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.