Apprendre Fix — 4. Les modules
Quatrième étape. Ton modèle grossit. Pour qu'il reste lisible, tu organises : tu isoles un morceau derrière une frontière, et tu ne laisses sortir que ce qui doit l'être. Compte 15 minutes.
Isoler derrière une frontière
Le modèle grossit — isole l'infrastructure derrière une frontière :
module(infra, [impacte/2]).
depend(web, api).
depend(api, db).
impacte(S, T) :- depend(S, T).
impacte(S, T) :- impacte(S, U), impacte(U, T).
end_module.
use_module(infra).
alerte(S) :- infra::impacte(S, db).?- alerte(X).
X = web
X = api
?- infra::depend(web, X).
prédicat non exporté : infra::depend/2
→ :help modules
Seuls les prédicats exportés ([impacte/2]) existent de l'extérieur — depend est invisible, et Fix le fait respecter, pas seulement par convention. L'appel qualifié infra::impacte s'utilise dans les corps de règles comme en requête directe ; après use_module, la forme non qualifiée marche aussi.
Ce qui reste au bord
Deux gardes que Fix pose pour toi :
- Pas de module imbriqué. La hiérarchie se déclare à plat — le chemin
lib::mathsest le nom du module, on n'emboîte pas les blocs. Unmodule(...)dans unmodule(...)est refusé (module imbriqué interdit). - Import sans ambiguïté. Si deux modules exportent le même nom, l'appel non qualifié est refusé (
importé de plusieurs modules) — tu qualifies (m1::val) pour lever le doute.
Le reste (hiérarchies, doctrine minimaliste — pas de type classes, pas de foncteurs) : Les modules.
Ce que tu sais faire
Découper un modèle en modules à frontière étanche (seul l'exporté sort), appeler en qualifié ou non, et t'appuyer sur les gardes (pas d'imbrication, pas d'ambiguïté).
→ 5. La syntaxe : donner à ton modèle sa propre notation, lue et écrite dans les deux sens.