32 lines
1.5 KiB
Text
32 lines
1.5 KiB
Text
# Frozen edge-kind inverse map (G-2, 2026-07-09).
|
|
#
|
|
# Z39.19 §8.1.1 requires every relation A→B to carry its reciprocal B→A "for all
|
|
# types of relationships". In a directed DAG with a fixed kind vocabulary, storing
|
|
# both directions is redundant noise — the correct adaptation is DERIVABLE
|
|
# reciprocity: each kind declares its inverse LABEL so displays and `describe` can
|
|
# render the reverse direction without persisting it, and symmetric kinds are
|
|
# validated as self-inverse.
|
|
#
|
|
# Keys MUST match the `edge_type` enum in ../schemas/core.ncl exactly (9 real
|
|
# kinds). `validate ontology` reads this map: any edge whose kind is absent here is
|
|
# a vocabulary violation; for a symmetric kind, a stored reverse edge with a
|
|
# different kind is a reciprocity violation.
|
|
{
|
|
# kind → label rendered for the reverse traversal
|
|
inverses = {
|
|
Complements = "Complements", # symmetric
|
|
Contains = "IsContainedIn",
|
|
Contradicts = "Contradicts", # symmetric
|
|
DependsOn = "Enables",
|
|
Implies = "IsImpliedBy",
|
|
ManifestsIn = "IsManifestationOf",
|
|
Resolves = "IsResolvedBy",
|
|
SpiralsWith = "SpiralsWith", # symmetric
|
|
TensionWith = "TensionWith", # symmetric
|
|
},
|
|
|
|
# kinds whose relation is mutual: A k B ⟺ B k A. Their inverse label is the kind
|
|
# itself, and a duplicated reverse edge must carry the SAME kind (else it is a
|
|
# reciprocity inconsistency, not two distinct facts).
|
|
symmetric = ["Complements", "Contradicts", "SpiralsWith", "TensionWith"],
|
|
}
|