Xalg / Fix / Apprendre Fix — 3. Interroger
Navigation
Apprendre
Recettes
Référence
Comprendre
Bonnes pratiques
En pratique
Explications

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.