The payoff for your team: the software you build on is generated from the proof itself — never hand-transcribed from it, so it cannot drift from what was verified, in whichever of the six supported languages you work in.
This page goes under the hood of how a proved theory becomes software. There are two compilers, never one, and they do different jobs: OntoEnact turns proved CLIF into the SDKs your teams build on, and OGSL turns the same proved theory into the schema the runtime graph engine executes. Both sit behind the same prover gate. It is written for developers and technical evaluators, with a short summary above each diagram so the through-line stays clear whether or not you read the diagrams themselves.
Back to How It WorksA verified theory is compiled twice, for two different purposes. Naming them apart matters, because they take different inputs, produce different outputs, and target different languages.
Compiles BFO CLIF into the software your teams build on.
Compiles the graph schema the runtime engine executes against.
.ogsl schemas and .cl theoriesThe bridge between them. A CLIF-to-OGSL emitter projects the verified theory into an OGSL schema, so the graph structure is derived from the same proved axioms the SDKs came from instead of modelled a second time by hand.
That is why the target counts differ, and the difference is deliberate. Six is the SDK surface, where a developer consumes entity types and queries. Five is the graph surface, held to statically typed targets with zero-copy memory access. A dynamically typed target would receive the names and lose the guarantees.
This is the compiler behind the deliverable. It loads the module graph, puts the assembled theory through the prover gate, and only then emits. Nothing downstream of the gate runs if the gate does not pass.
Only after a theory is proved does the compiler run. It extracts the verified axioms, resolves the BFO module system, and lowers everything to a common intermediate form before any target-language code is emitted, so the software your teams build on is generated from the proof itself, never hand-transcribed from it.
ontoenactc, for the reason set out above.Because the compiler knows which fields are edges and which are nodes, it can generate the traversal work instead of leave it to you. Thirteen algorithms are emitted for each of the five targets, against the same zero-copy accessors as the rest of the schema:
Breadth-first and depth-first search · shortest path · weighted shortest path · topological sort · strongly connected components · connected components · PageRank · community detection · minimum spanning tree · maximum flow · minimum cut · cycle detection
The point is not the list, which any graph library can match. It is that these are generated against your schema, so they operate on your own entity types rather than on an untyped node-and-edge abstraction you have to map back to your domain afterwards.
Four stages, run in order, with the theorem prover standing between the knowledge and the code. No proof, no emit.
A schema is proved consistent before a single line is generated. The theorem prover is the gate, not a linter, and not a check run after the fact when the code already exists.
The compiler reaches the prover through a client interface that supports in-process, gRPC, and automatic hybrid connectivity, so the same gate holds whether verification runs on a developer’s machine or against a shared service.
Verified CLIF converts back into a canonical, human-editable schema that re-enters the pipeline, so knowledge can be refined by the people who own it without leaving the verified path. Every conversion is graded for how faithfully meaning survived:
Emitted schemas carry SHA-256 provenance and a trust grade, so a downstream reader can tell whether a definition translated cleanly, translated through intermediate steps, lost fidelity, or was refused outright, instead of discovering the loss later.
If the theory does not prove, there is nothing to ship.
Powered by OntoMotion™One schema, one verified internal form, five independent emitters, so a fix made once reaches every language rather than being reimplemented four more times.
The five targets are not equally mature, and we would rather say so than make a flat claim. Each tier below is earned by that language’s own compiler building the output, never by our inspection of it.
Most polyglot SDKs give one language a real API and the rest a thin wrapper over it. The graph query surface here is compiled into each language’s own lazy-iteration machinery instead, so a developer writes queries the way their language already does them. Same query, same semantics, five native idioms.
| Language | Query surface | Built on |
|---|---|---|
| C# | LINQ and cell selectors | IEnumerable, async |
| C++ | std::ranges | C++23 ranges, std::generator, co_yield |
| Rust | Iterator trait | Iterator adaptors, lazy evaluation |
| Java | Stream API | java.util.stream, parallel streams |
| Go | iter.Seq | Go 1.23 range-over-func, generators |
The mapping goes operation by operation. A filter becomes .Where() in C#, std::views::filter in C++, .filter() in Java, and .where_() in Rust. A limit becomes std::views::take, .limit() or .take(n). Nothing is materialised early to make the port easier, so laziness survives the crossing.
A target is promoted only when its own toolchain compiles what we generated. That is why the tiers above are honest, and why one fix to the shared internal form improves all five at once instead of five separate repairs.
All five emitters lower from one shared intermediate form and are covered by roughly 1,900 code-generation test cases across seven test projects, including FsCheck property-based tests and golden-output checks in each language. Output is byte-identical run to run — build timestamps were removed so determinism is real and a build can be diffed instead of trusted. Cross-language interop uses ahead-of-time-compiled bindings passing plain data structures rather than serialized JSON. Python and TypeScript are deliberately excluded from this compiler: the graph schema layer stays on statically typed targets that support zero-copy access. Python remains a first-class target of the OntoEnact SDK compiler described above.
Five targets at five levels of maturity, and we publish which is which.
Powered by OntoMotion™