Xalg / Fix / Apprendre Fix — 6. Dériver
Navigation
Apprendre
Recettes
Référence
Comprendre
Bonnes pratiques
En pratique
Explications

Apprendre Fix — 6. Dériver

Sixième étape, le sommet du parcours. Tout ce que tu as appris converge : un modèle est un type, et on en dérive d'autres artefacts par de simples règles. Compte 15 minutes.


Un modèle, plusieurs cibles

Tes incidents doivent être persistés — décris la table comme des données :

field(incident, service, str).
field(incident, duree, int).

Chaque cible est une transformation — des règles ordinaires :

sql_type(str, varchar).
sql_type(int, integer).
column(E, F, S) :- field(E, F, T), sql_type(T, S).
route(get, E, liste) :- field(E, F, T).
?- column(incident, F, S).
F = service, S = varchar
F = duree,   S = integer

?- route(get, incident, R).
R = liste

Ajoute un champ à field : la colonne et la route suivent — rien ne dérive en silence.


La même règle, dans les deux sens

Comme une règle est une relation, elle se parcourt à l'envers :

?- column(incident, F, integer).
F = duree

« Quels champs deviennent des colonnes entières ? » — la même règle, lue dans l'autre sens. C'est le TDE (Type-Driven Engineering) : le modèle est un type, ses représentations en descendent, et la bidirectionnalité est une propriété de tes types, pas une faveur du moteur.

Et si tu ajoutes une syntaxe de surface (étape 5) de chaque côté, la transformation devient texte à texte : lire (texte → AST), une règle (AST → AST), ecrire (AST → texte). Comprendre déroule l'argument complet, avec l'exemple ER → UML en deux temps.

Verrouille le tout :

test(colonne_duree, holds)   :- column(incident, duree, integer).
test(colonne_service, holds) :- column(incident, service, varchar).
test(route_liste, holds)     :- route(get, incident, liste).
$ fix --test derive.fix
...
1 suite(s) · 3 passé(s) · 0 échoué(s)

Fin du parcours

Tu sais décrire et interroger (étapes 1, 3), fermer et faire calculer les types (étape 2), organiser (étape 4), déclarer une notation (étape 5), et dériver (étape 6) — avec un refus appris à chaque étage : croissance, type, cycle négatif, agrégat non-idempotent. C'est tout Fix : un seul moteur, un seul geste, à tous les étages.

Le REPL sait aussi te documenter lui-même : :help <sujet> (fiche d'un sujet ou d'un code de refus), :demo <sujet> (rejoue un exemple canonique dans un bac à sable, session restaurée à la sortie), et fix --tour (rejoue le parcours, jugé, sans fichier).

Pour continuer :