Xalg / Fix / La négation : le complément, proprement
Navigation
Apprendre
Recettes
Référence
Comprendre
Bonnes pratiques
En pratique
Explications

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égatifp 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


À côté