La négation : le complément, proprement
Parfois ce qui t'intéresse, c'est ce qui n'est pas là : les orphelins, les manquants, les non-couverts. Fix a une négation pour ça — mais ce n'est pas la négation par l'échec de Prolog.
not dans un corps
compte(c1, alice). compte(c2, bob).
client(alice).
orphelin(C) :- compte(C, P), not client(P).?- orphelin(X).
X = c2
bob n'est pas client, donc c2 est orphelin. not client(P) se lit « P n'est pas dans la relation client ».
Un vrai complément, pas un échec
En Prolog, \+ but veut dire « je n'ai pas réussi à prouver but » — ça dépend de l'ordre, de ce qui a été tenté, du moment. Fragile.
En Fix, not p est le complément ensembliste typé : l'univers (fini, typé) de p, moins p. Sur un monde clos et connu, c'est une vraie différence d'ensembles — pas un aléa d'exécution. Même question, même réponse.
Pourquoi « stratifiée »
Pour connaître ce qui n'est pas client, il faut d'abord savoir qui l'est — complètement. La négation se calcule donc par strates : on sature client, puis on prend son complément.
Conséquence : un cycle négatif — p défini à partir de not q, et q à partir de not p — n'a pas de sens stable. Fix le détecte à la compilation (par composantes fortement connexes) et le refuse. Tu ne peux pas écrire un programme dont la négation tourne en rond.
Pas un opérateur magique
not n'est pas greffé sur le moteur. C'est le complément, calculé par le même point fixe, avec la stratification comme garde. Le même geste — saturer une relation — suivi d'une différence d'ensembles.
Les bords honnêtes
- Univers typé et fini requis (le complément a besoin d'un domaine).
- Stratification obligatoire : les cycles négatifs sont rejetés.
- Ce n'est pas
\+(négation par l'échec non-monotone — interdite). - Sur un programme avec négation (ou agrégat non-idempotent), un
:assertau REPL repasse par un recalcul stratifié complet — pas d'incrémental fin. C'est le prix de la justesse : le complément ne peut pas se mettre à jour par petites touches.
À côté
- L'agrégation — l'autre opération par strates.
- Référence : négation — la forme exacte.