FLOW ALGEBRA
Biological Ion Ontology — Chemical Foundations of Life
Version: 1.0 | Date: 2026-10-15 | Locale: en-GB
Authors: Mark Higgins — Sky (Recursive AI)
Source: https://kirethresearch.org/booksai-core/entity-graph/biological-entities/chemical-foundations-of-life/biological-ion-ontology.html
Status: Companion formalisation; typed declarative specification, not a verified executable runtime.
1. ONTOLOGY IDENTITY
ontology BiologicalIonOntology {
namespace: kireth:biological_entities:chemical_foundations:biological_ion
parent: ChemicalFoundationsOfLife
root_entity: BiologicalIon
purpose: represent ions, charge, biological compartments, transport, gradients and evidence-grounded physiological functions
}
2. ENTITY TYPES
entity ChemicalSpecies { id: URI; name: String; formula: String? }
entity Ion extends ChemicalSpecies { charge_number: Integer; oxidation_state: Integer?; isotope: String? }
entity BiologicalIon extends Ion { biological_context: ContextID; compartment: CompartmentID? }
entity Cation extends Ion { invariant: charge_number > 0 }
entity Anion extends Ion { invariant: charge_number < 0 }
entity Electrolyte { id: URI; dissolved_species: Set<IonID> }
entity Compartment { id: URI; name: String; organism: OrganismID? }
entity Membrane { id: URI; separates: Pair<CompartmentID,CompartmentID> }
entity TransportProtein { id: URI; mechanism: Enum[channel,carrier,pump,exchanger] }
entity IonGradient { ion: IonID; from: CompartmentID; to: CompartmentID; concentration_difference: Quantity?; electrical_potential: Quantity? }
entity BiologicalProcess { id: URI; name: String }
entity Measurement { value: Decimal; unit: UnitID; uncertainty: Decimal?; conditions: ContextID }
entity Evidence { id: URI; source: URI; method: String?; timestamp: DateTime? }
3. EXEMPLAR INSTANCES
ion SodiumIon { formula: "Na+"; charge_number: +1; category: Cation }
ion PotassiumIon { formula: "K+"; charge_number: +1; category: Cation }
ion CalciumIon { formula: "Ca2+"; charge_number: +2; category: Cation }
ion MagnesiumIon { formula: "Mg2+"; charge_number: +2; category: Cation }
ion ChlorideIon { formula: "Cl-"; charge_number: -1; category: Anion }
ion BicarbonateIon { formula: "HCO3-"; charge_number: -1; category: Anion }
ion HydrogenIon { formula: "H+"; charge_number: +1; category: Cation }
ion PhosphateSpecies { formula: "H2PO4- / HPO4^2-"; note: "Distinct protonation states; do not collapse into one ion" }
4. TYPED RELATIONSHIPS
relation located_in(BiologicalIon, Compartment)
relation participates_in(BiologicalIon, BiologicalProcess)
relation transported_by(BiologicalIon, TransportProtein)
relation crosses(BiologicalIon, Membrane)
relation forms_gradient(Ion, IonGradient)
relation influences(IonGradient, BiologicalProcess)
relation binds_to(Ion, ChemicalSpecies)
relation measured_by(BiologicalIon, Measurement)
relation supported_by(Assertion, Evidence)
relation derived_from(Assertion, Assertion)
relation equivalent_to(Entity, Entity, Context)
relation distinct_from(Entity, Entity)
5. CORE FORMAL CONSTRAINTS
constraint IonCharge: Ion.charge_number != 0
constraint CationCharge: forall x:Cation, x.charge_number > 0
constraint AnionCharge: forall x:Anion, x.charge_number < 0
constraint GradientEndpoints: forall g:IonGradient, g.from != g.to
constraint MembraneCrossing: crosses(i,m) requires located_in(i, compartment_adjacent_to(m)) or explicit transport_event
constraint MeasurementContext: concentration claims require units, sample compartment and conditions
constraint Electroneutrality: bulk_solution sum_i(z_i * c_i) approximately 0 within measurement tolerance; not a claim of zero local charge at membranes
constraint MassBalance: for closed_system S, delta_amount(i,S) = production(i) - consumption(i) + influx(i) - efflux(i)
constraint DistinctSpeciation: differing charge states must retain separate entity identities
6. INFERENCE RULES
rule classify_cation:
WHEN Ion(x) AND charge_number(x) > 0
THEN type(x, Cation)
rule classify_anion:
WHEN Ion(x) AND charge_number(x) < 0
THEN type(x, Anion)
rule membrane_gradient:
WHEN Ion(i) AND Compartment(a) AND Compartment(b) AND separates(m,a,b)
AND measured_concentration(i,a,ca) AND measured_concentration(i,b,cb)
AND ca != cb
THEN candidate_concentration_gradient(i,a,b)
NOTE: do not infer net flux direction without permeability, membrane voltage and coupling context
rule transport_participation:
WHEN transports(t,i,a,b) AND TransportProtein(t)
THEN participates_in(i, ion_transport) AND transported_by(i,t)
rule evidence_required:
WHEN claim_has_biological_function(i,p)
THEN require supported_by(claim, Evidence) AND require context(p)
7. QUANTITATIVE SEMANTICS
quantity Concentration { dimension: amount_of_substance / volume; preferred_unit: mol/L }
quantity ElectricPotential { dimension: voltage; preferred_unit: V }
quantity Temperature { dimension: thermodynamic_temperature; preferred_unit: K }
expression electrochemical_potential(i,side): mu_i = mu_i_standard + R*T*ln(activity_i) + z_i*F*psi
expression nernst_potential(i): E_i = (R*T/(z_i*F))*ln(activity_out/activity_in)
preconditions: z_i != 0; T > 0; activities > 0; chosen sign convention documented
note: activities are preferred to concentrations for non-ideal solutions
8. VALIDATION PIPELINE
flow ValidateBiologicalIon(input: BiologicalIonRecord) -> ValidationResult {
stage schema_check: validate_required_fields(input)
stage charge_check: validate_integer_charge_and_species(input)
stage chemistry_check: validate_formula_and_protonation_state(input)
stage compartment_check: validate_location_and_context(input)
stage unit_check: validate_dimensions_and_units(input.measurements)
stage biological_check: require_evidence_for_functional_claims(input)
stage consistency_check: detect_contradictions_and_duplicate_ids(input)
output: {status: valid|invalid|needs_review, issues: List<Issue>}
}
9. SEMANTIC EQUIVALENCE
SEMANTIC_EQUIVALENCE {
canonical_identity: chemical_formula + charge_number + isotope_if_relevant
aliases: ["sodium ion" <-> "Na+", "potassium ion" <-> "K+", "chloride ion" <-> "Cl-"]
equivalence_requires: matching chemical species and charge state
contextual_distinction: free_ion != bound_ion; total_calcium != ionised_calcium
prohibited_merge: Na != Na+; H2PO4- != HPO4^2-
}
10. CONFIDENCE AND PROVENANCE
CONFIDENCE {
score_range: [0.0,1.0]
dimensions: [source_reliability, measurement_quality, contextual_fit, reproducibility, validation_status]
aggregation: calibrated_model_required
rule: no fabricated numeric confidence without evidence or calibration
}
PROVENANCE {
record: [source_uri, assertion_id, author_or_instrument, method, timestamp, version, transformation_history]
preserve: original_measurement_and_units
update_policy: append_revision_and_retain_prior_assertions
}
11. GRAPH AND RECURSIVE REASONING
flow TraceIonRole(ion: IonID, max_depth: Integer) -> GraphSubgraph {
require max_depth >= 0
traverse: located_in | transported_by | forms_gradient | participates_in | supported_by
visited: Set<EntityID>
cycle_policy: stop_on_visited_node
edge_policy: typed_and_evidence_tagged
result: bounded_explanation_graph
}
12. FLOW_HASH
FLOW_HASH {
canonicalise: stable_identifier_order + normalised_units + sorted_typed_edges + ontology_version
algorithm: SHA-256
digest_input: canonical_serialisation
purpose: content_integrity_and_change_detection
limitation: hash_does_not_prove_scientific_truth
}
13. UPDATE_MODEL
UPDATE_MODEL {
on_new_evidence: revalidate_affected_claims
on_changed_measurement: recompute_dependent_gradients
on_changed_charge_or_species: reject_or_reclassify_and_reindex
on_conflict: retain_competing_assertions_with_provenance
on_revision: increment_version_and_recompute_flow_hash
}
14. AI_CONSUMPTION
AI_CONSUMPTION {
representation: typed_entity_graph
tasks: [entity_resolution, contextual_retrieval, dimensional_checking, explanation, constrained_inference]
mandatory: preserve_units_charge_state_compartment_conditions_provenance
distinguish: observed | inferred | hypothetical
guardrails: no_unsupported_causal_claims; no_inference_from_correlation_alone
output: [entities, typed_edges, evidence_links, validation_report, uncertainty]
}
15. WORKED REASONING EXAMPLE
input:
species: K+
compartments: intracellular, extracellular
evidence: measured_activities_on_both_sides_of_membrane
context: specified_temperature_and_membrane_potential
steps:
1 identify K+ as monovalent cation
2 validate distinct compartments and units
3 represent concentration/activity gradient
4 compute Nernst equilibrium potential only when required inputs exist
5 compare with actual membrane potential before discussing electrochemical driving force
6 attach provenance and uncertainty to each claim
output: evidence-linked, context-limited ion-gradient explanation
END FLOW ALGEBRA
Download Code
Copy to Clipboard