Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

The meta-calculus

Argon ships no classifying vocabulary. There is no built-in Person, no built-in Kind, no upper ontology — only the means to declare them. A program, or a package it imports, declares the vocabulary it needs.

Three declarations form the meta-calculus:

  • a metatype classifies concepts — kind, role, phase are metatypes a vocabulary might declare;
  • a metaxis declares an axis along which a metatype’s concepts vary, with named values — a rigidity axis with values anti_rigid < semi_rigid < rigid;
  • a metarel classifies relations, as a metatype classifies concepts.

type and rel, the introducers for a plain concept and a plain relation, are not keywords. They are declared in std::core and brought into scope with use std::core::{type, rel} or a package prelude. A program that wants the vocabulary of a foundational ontology imports the package that declares it; the language stays neutral.

The compiler never reads a vocabulary name. It does not know what kind or rigid mean. It enforces the structure the meta-calculus fixes — that a concept’s metatype is in scope, that an axis value is one the axis declares, that a relation’s endpoints carry the metatypes its metarel requires — and nothing about the names. Two metatype-level marks are the exception it acts on: abstract, which forbids direct instances, and fixed, which forbids changing an individual’s instantiation after construction. A metatype binds its axes with :kind = { rigidity: rigid, sortality: sortal } — giving, for each axis, the value this metatype takes.