The base commit
This commit is contained in:
commit
1d25c9d217
27
.editorconfig
Normal file
27
.editorconfig
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# https://EditorConfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.py]
|
||||||
|
max_line_length = 100
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
max_line_length = 150
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[*.sh]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.{yaml,yml,json}]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.toml]
|
||||||
|
indent_size = 2
|
||||||
42
.gitignore
vendored
Normal file
42
.gitignore
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
.idea
|
||||||
|
*.swp
|
||||||
|
**/*.whl
|
||||||
|
*.egg-info
|
||||||
|
**/__pycache__
|
||||||
|
.DS_Store
|
||||||
|
venv
|
||||||
|
.venv
|
||||||
|
|
||||||
|
.vscode
|
||||||
|
.zed
|
||||||
|
rust/target
|
||||||
|
|
||||||
|
site
|
||||||
|
|
||||||
|
.pytest_cache
|
||||||
|
.ruff_cache
|
||||||
|
|
||||||
|
python/build
|
||||||
|
python/dist
|
||||||
|
|
||||||
|
**/.ipynb_checkpoints
|
||||||
|
|
||||||
|
**/.hypothesis
|
||||||
|
|
||||||
|
# Compiled Dynamic libraries
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
## Javascript
|
||||||
|
*.node
|
||||||
|
**/node_modules
|
||||||
|
**/.DS_Store
|
||||||
|
nodejs/lancedb/native*
|
||||||
|
dist
|
||||||
|
|
||||||
|
## Rust
|
||||||
|
target
|
||||||
|
|
||||||
|
## Misc
|
||||||
|
*.log
|
||||||
49
hassan/001-similar-projects.md
Normal file
49
hassan/001-similar-projects.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
## Projects Related to Geolog
|
||||||
|
|
||||||
|
### Chase-Based & Geometric Logic Tools
|
||||||
|
|
||||||
|
| Project | Language | Description | Key Features | Link |
|
||||||
|
|--------------------------------------------------------------------|----------|-------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------|
|
||||||
|
| **Chase** (Ramsdell) | OCaml | Model finder for finitary geometric logic. Uses an input syntax called "Geolog" — likely the direct namesake of this project. | Minimal model finding, partial functions, tree visualization of chase output, Prolog-like input syntax (`.gl` files) | [github.com/ramsdell/chase](<https://github.com/ramsdell/chase>) |
|
||||||
|
| **Rusty Razor** | Rust | First-order model finder using the chase algorithm. Converts arbitrary FOL to geometric normal form. | Homomorphically minimal models, no upfront bound required, model space exploration, provenance tracking | [github.com/salmans/rusty-razor](<https://github.com/salmans/rusty-razor>) |
|
||||||
|
| **Geometric Logic for Policy Analysis** (Sagha, Naumov, Dougherty) | Haskell | Chase-based prototype for analyzing access control policies as geometric theories. | Jointly universal model sets, policy verification, comparison with SAT-based tools like Kodkod/Margrave | [Paper (PDF)](<https://cs.brown.edu/~tbn/publications/snd-arsec13-geometric.pdf>) |
|
||||||
|
|
||||||
|
### Applied Category Theory Tools
|
||||||
|
|
||||||
|
| Project | Language | Description | Key Features | Link |
|
||||||
|
|--------------------------------|-------------------|----------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| **Catlab.jl** | Julia | Framework for applied and computational category theory. The most mature library in this space. | Generalized algebraic theories (GATs), C-sets/acsets, chase algorithm, wiring diagrams, limits/colimits | [github.com/AlgebraicJulia/Catlab.jl](<https://github.com/AlgebraicJulia/Catlab.jl>) |
|
||||||
|
| **CatColab** (Topos Institute) | Rust + TypeScript | Collaborative web environment for formal, interoperable conceptual modeling. Closest in *spirit* to Geolog's vision. | Notebook UI, multiple domain-specific logics, collaborative editing, double-theory framework, visualization | [github.com/ToposInstitute/CatColab](<https://github.com/ToposInstitute/CatColab>) / [catcolab.org](<https://catcolab.org/>) |
|
||||||
|
| **AlgebraicJulia** (ecosystem) | Julia | Broader ecosystem around Catlab for scientific computing with category theory. | Agent-based modeling, differential equations, epidemiological modeling, Petri nets | [algebraicjulia.org](<https://www.algebraicjulia.org/>) |
|
||||||
|
|
||||||
|
### Relational/Formal Specification Tools (Broader Family)
|
||||||
|
|
||||||
|
| Project | Language | Description | Key Features | Link |
|
||||||
|
|--------------------|----------|--------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
|
||||||
|
| **Alloy Analyzer** | Java | The most well-known lightweight formal methods tool. Relational logic + bounded model finding via SAT. | Signatures/relations, SAT-based Kodkod engine, bounded scope checking, graphical counterexamples, temporal logic (v6) | [alloytools.org](<https://alloytools.org/>) / [GitHub](<https://github.com/AlloyTools/org.alloytools.alloy>) |
|
||||||
|
|
||||||
|
### Theoretical Foundations
|
||||||
|
|
||||||
|
| Work | Author(s) | Description | Link |
|
||||||
|
|------------------------------------------------------|----------------|--------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| *Geometric Logic as a Specification Language* (1994) | Steven Vickers | Seminal paper proposing geometric logic as the basis for a Z-like specification language. The intellectual ancestor of Geolog. | [Springer](<https://link.springer.com/chapter/10.1007/978-1-4471-3503-6_4>) / [PDF](<http://www.cs.bham.ac.uk/~sjv//GeoZ.pdf>) |
|
||||||
|
| *Geometric Logic in Computer Science* (1993) | Steven Vickers | Introduction to geometric logic, categorical logic, toposes, and their applications in computer science. | [Springer](<https://link.springer.com/chapter/10.1007/978-1-4471-3503-6_4>) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### What Makes Geolog Distinctive
|
||||||
|
|
||||||
|
Compared to the above projects, Geolog combines several features that no single existing tool offers together:
|
||||||
|
|
||||||
|
* **Typed theories with geometric axioms** (like Chase/Razor) but with a richer **sort/function/relation** vocabulary (closer to Catlab)
|
||||||
|
* **Dependent/parameterized theories** — theories can take instances of other theories as parameters (e.g. `theory (N : PetriNet instance) Marking`)
|
||||||
|
* **Nested instances** — instances can contain instances of parameterized theories inline
|
||||||
|
* **Chase + equality saturation** — not just model finding but collapsing equivalent terms (as in the Category example)
|
||||||
|
* **Persistent, append-only storage** with version control — designed as infrastructure, not just a one-shot tool
|
||||||
|
* **Interactive REPL** — explore and mutate instances dynamically, unlike batch-mode model finders
|
||||||
|
* **Constructive proof witnesses** — the Petri net showcase demonstrates solutions as typed diagrammatic objects, not just boolean answers
|
||||||
|
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
* **Feb 27, 2026** -- The first version was created.
|
||||||
45
hassan/002-geolog-glossary.md
Normal file
45
hassan/002-geolog-glossary.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
## Geolog Glossary
|
||||||
|
|
||||||
|
* **Sort** — A sort is just a named type of thing. It's the most primitive declaration: "there exists a kind of thing called X." In the Graph theory,
|
||||||
|
`V : Sort` says "there is a kind of thing called vertices" and `E : Sort` says "there is a kind of thing called edges." Sorts don't have any
|
||||||
|
structure on their own — they're just labels for categories of elements.
|
||||||
|
* **Function** — A function maps elements of one sort to elements of another. `src : E -> V` says "every edge has a source vertex." For binary
|
||||||
|
operations, you use product domains: `mul : [x: M, y: M] -> M` says "given two monoid elements, multiplication produces a third." Functions must be
|
||||||
|
total — every element of the domain sort must be assigned a value.
|
||||||
|
* **Relation** — A relation is like a function but instead of producing a value, it's a proposition that is either true or false.
|
||||||
|
`completed : Item -> Prop` says "for any item, it either is or isn't completed." Binary relations like `leq : [lo: X, hi: X] -> Prop` express
|
||||||
|
relationships between pairs of elements. Relations are essentially database tables — a set of tuples for which the predicate holds.
|
||||||
|
* **Axiom** — An axiom is a rule that must hold in any valid instance. It takes the form of a geometric sequent: some premises on the left of `|-`, a
|
||||||
|
conclusion on the right. For example, `ax/trans` in the Preorder theory says "if x ≤ y and y ≤ z, then x ≤ z." The "geometric" restriction means
|
||||||
|
conclusions can only use conjunction (and), existential quantification (there exists), and disjunction (or) — no negation or universal
|
||||||
|
quantification on the right side. This is what makes the chase algorithm work.
|
||||||
|
* **Theory** — A theory is a complete package: a collection of sorts, functions, relations, and axioms that together define a *vocabulary and laws*
|
||||||
|
for some domain. The theory of `Graph` says "there are vertices and edges, and every edge has a source and target vertex." The theory of `Category`
|
||||||
|
adds composition, identities, and axioms for associativity and unit laws. A theory doesn't describe any particular graph or category — it describes
|
||||||
|
what it *means* to be one.
|
||||||
|
* **Instance** — An instance is a concrete, finite model that satisfies a theory. If the theory is the blueprint, the instance is a specific building.
|
||||||
|
`Triangle : Graph` says "here is a specific graph: it has vertices A, B, C, edges ab, bc, ca, and these specific source/target assignments." Every
|
||||||
|
function must be defined for every element, and every axiom must evaluate to true.
|
||||||
|
* **The Chase** — The chase is the key algorithmic idea. You provide some base facts and the chase automatically derives everything that logically
|
||||||
|
follows from the axioms. In the transitive closure example, you declare edges A→B, B→C, C→D, and the chase computes all six reachable pairs. You
|
||||||
|
write `= chase { ... }` instead of `= { ... }` to trigger this. It repeatedly scans for axioms that aren't yet satisfied and adds the necessary
|
||||||
|
facts until everything is consistent — a fixpoint computation.
|
||||||
|
* **Equality Saturation** — In the Category example, composing identity morphisms with themselves could produce infinite chains (id∘id∘id∘...).
|
||||||
|
Equality saturation collapses these by recognizing that id∘id = id (from the unit laws), merging equivalent elements rather than generating new ones
|
||||||
|
forever. This is what keeps the chase terminating in theories with equations.
|
||||||
|
* **Parameterized (Dependent) Theory** — A theory can take an instance of another theory as a parameter. `theory (N : PetriNet instance) Marking`
|
||||||
|
means "given some specific Petri net N, a Marking assigns tokens to N's places." This is the dependent types angle — the *type* of a marking depends
|
||||||
|
on the *value* of a specific net. You can't talk about markings in the abstract; they're always markings *of* something.
|
||||||
|
* **Nested Instance** — Inside an instance, you can define sub-instances of parameterized theories inline. In `ReachabilityProblem`, the
|
||||||
|
`initial_marking` and `target_marking` are instances of `Marking` defined right there inside the problem instance, using the `= { ... }` syntax
|
||||||
|
within the outer braces.
|
||||||
|
* **Proof Witness / Solution** — This is the Petri net showcase's central idea. A `Solution` isn't a boolean "yes, it's reachable." It's a *data
|
||||||
|
structure* — containing a trace (sequence of firings), wires (how tokens flow between firings), terminals (how tokens connect to initial/target
|
||||||
|
markings), and isomorphisms (proving the token counts match exactly). The fact that you can construct a well-typed instance of `Solution` *is* the
|
||||||
|
proof. If the types check and all axioms are satisfied, reachability is proven. This is the "propositions as types, proofs as programs" idea from
|
||||||
|
type theory, applied to diagrammatic reasoning.
|
||||||
|
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
* **Feb 27, 2026** -- The first version was created.
|
||||||
10
pyproject.toml
Normal file
10
pyproject.toml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[project]
|
||||||
|
name = "useful-notes"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Python environment for the `useful-notes` project"
|
||||||
|
|
||||||
|
requires-python = ">=3.10,<4.0"
|
||||||
|
dependencies = [
|
||||||
|
"pre-commit (>=4.2.0,<5.0.0)",
|
||||||
|
"icecream (>=2.1.4,<3.0.0)",
|
||||||
|
]
|
||||||
Loading…
x
Reference in New Issue
Block a user