Apprendre Fix — 3. Interroger
Troisième étape. Tu sais décrire, typer, tester. Ici tu apprends à interroger plus finement : voir ce qui manque (la négation) et résumer un ensemble (les agrégats). Deux gestes, deux refus de plus au passage. Compte 20 minutes.
1. Voir ce qui manque : la négation
Tout service devrait être surveillé par une sonde. Lesquels ne le sont pas ? C'est une question sur ce qui n'est pas là :
service(web). service(api). service(db). service(auth).
sonde(web). sonde(api). sonde(db).
angle_mort(S) :- service(S), not sonde(S).?- angle_mort(S).
S = auth
not sonde(S) est un complément d'ensemble : l'univers des services, moins les surveillés. Pas un « je n'ai pas réussi à prouver » à la Prolog — une vraie différence d'ensembles, calculée après que sonde est complet (c'est le sens de « stratifiée »). Conséquence directe : une négation circulaire n'a pas de sens stable, et Fix la refuse —
p(X) :- service(X), not q(X).
q(X) :- service(X), not p(X).fix: cycle négatif (programme non stratifiable) : p
→ :help negation
Ton troisième refus : même contrat que les deux premiers. Le détail : La négation.
2. Résumer : les agrégats
Combien d'incidents par service ? Une somme, un max, un compte — c'est agg/4, un but de corps ordinaire :
incident(api, i1). incident(api, i2). incident(db, i3).
nb_incidents(S, N) :- agg(N, count, I, incident(S, I)).
charge(S) :- nb_incidents(S, N), N >= 2.?- nb_incidents(S, N).
S = api, N = 2
S = db, N = 1
?- charge(S).
S = api
Fix groupe par les variables de tête (S), replie I avec l'opérateur, lie le résultat. Six opérateurs : min, max, sum, count, product, avg — et en récursion, seuls min/max (les idempotents) sont admis. Un sum qui se nourrit de lui-même grossirait sans fin, et Fix le refuse :
fix: agrégat non-idempotent dans un cycle : v
→ :help aggregation
Le pourquoi (monoïdes, strates) : L'agrégation.
Un prédicat intermédiaire 0-aire au-dessus d'un agrégat, et un test/2 posé directement sur une tête d'agrégat, fonctionnent tous deux normalement (les deux pièges historiques de ce chapitre sont corrigés, BUG-043).
Ce que tu sais faire
Compléter (la négation stratifiée, un vrai complément d'ensemble) et résumer (les agrégats, six opérateurs, idempotents seuls en récursion) — avec deux refus de plus : le cycle négatif, l'agrégat non-idempotent.
→ 4. Les modules : organiser un modèle qui grossit derrière des frontières étanches.