Files
Andy Dixon 37b9f0e2f5 feat(graph): association is not causation
Adds co_occurs_with, temporally_precedes, possibly_caused_by and
asserted_by to the relation vocabulary with Causal and Hypothetical
predicates. Entities mentioned together now co-occur rather than being
'related'; association hypotheses record possibly_caused_by and their
basis (temporal association only); caused_by is reserved for explicit
operator statements and nothing automatic writes it. Documented in
docs/graph.md and checked end to end.
2026-08-19 19:16:15 +01:00

108 lines
3.8 KiB
Go

// Package concepts defines the epistemic vocabulary Noema refuses to collapse:
// the difference between an observation, a claim, a hypothesis and a belief is
// carried on every memory, belief and evidence link (spec §0.1).
package concepts
// Epistemic classifies how something is known.
type Epistemic string
// Epistemic kinds.
const (
Observation Epistemic = "observation" // directly perceived through a channel
Fact Epistemic = "fact" // verified against an authoritative source
Memory Epistemic = "memory" // recalled episode; subject to distortion
Claim Epistemic = "claim" // asserted by someone else, unverified
Hypothesis Epistemic = "hypothesis" // proposed explanation under evaluation
Belief Epistemic = "belief" // held with confidence derived from evidence
Prediction Epistemic = "prediction" // expectation about the future
Assumption Epistemic = "assumption" // taken as given without evidence
Inference Epistemic = "inference" // derived by reasoning from other items
Opinion Epistemic = "opinion" // preference or judgement, not truth-apt
)
// AllEpistemic lists kinds in a stable order.
var AllEpistemic = []Epistemic{Observation, Fact, Memory, Claim, Hypothesis, Belief, Prediction, Assumption, Inference, Opinion}
// Valid reports whether e is known.
func (e Epistemic) Valid() bool {
for _, k := range AllEpistemic {
if k == e {
return true
}
}
return false
}
// MemoryKind is the storage system a memory belongs to.
type MemoryKind string
// Memory kinds (spec §8).
const (
Episodic MemoryKind = "episodic"
Semantic MemoryKind = "semantic"
Procedural MemoryKind = "procedural"
Autobiographical MemoryKind = "autobiographical"
)
// AllMemoryKinds lists kinds in a stable order.
var AllMemoryKinds = []MemoryKind{Episodic, Semantic, Procedural, Autobiographical}
// Valid reports whether k is known.
func (k MemoryKind) Valid() bool {
for _, x := range AllMemoryKinds {
if x == k {
return true
}
}
return false
}
// Relation labels an edge between memories or entities.
type Relation string
// Relations (spec §24).
const (
RelatedTo Relation = "related_to"
CausedBy Relation = "caused_by"
Contradicts Relation = "contradicts"
Supports Relation = "supports"
DependsOn Relation = "depends_on"
BelongsTo Relation = "belongs_to"
DiscussedWith Relation = "discussed_with"
ObservedDuring Relation = "observed_during"
DerivedFrom Relation = "derived_from"
SimilarTo Relation = "similar_to"
Follows Relation = "follows"
)
// AllRelations lists relations in a stable order.
// Association is not causation. CoOccursWith and TemporallyPrecedes record
// what was observed together or in sequence; PossiblyCausedBy is a causal
// hypothesis awaiting evidence; CausedBy is reserved for established causes
// (an explicit operator statement or a confirmed causal prediction);
// AssertedBy links a proposition to whoever stated it.
const (
CoOccursWith Relation = "co_occurs_with"
PossiblyCausedBy Relation = "possibly_caused_by"
TemporallyPrecedes Relation = "temporally_precedes"
AssertedBy Relation = "asserted_by"
)
var AllRelations = []Relation{RelatedTo, CausedBy, Contradicts, Supports, DependsOn, BelongsTo, DiscussedWith, ObservedDuring, DerivedFrom, SimilarTo, Follows, CoOccursWith, PossiblyCausedBy, TemporallyPrecedes, AssertedBy}
// Causal reports whether a relation asserts an established cause.
func (r Relation) Causal() bool { return r == CausedBy }
// Hypothetical reports whether a relation is a proposal rather than a finding.
func (r Relation) Hypothetical() bool { return r == PossiblyCausedBy }
// Valid reports whether r is known.
func (r Relation) Valid() bool {
for _, x := range AllRelations {
if x == r {
return true
}
}
return false
}