Skip to main content
╔════════════════════════════════════════════════════════════════════════════════════════════╗
║                                                                                            ║
║  ██╗      ██████╗  █████╗ ██████╗ ██████╗ ███████╗ █████╗ ██████╗ ██╗███╗   ██╗ ██████╗    ║
║  ██║     ██╔═══██╗██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗██╔══██╗██║████╗  ██║██╔════╝    ║
║  ██║     ██║   ██║███████║██║  ██║██████╔╝█████╗  ███████║██████╔╝██║██╔██╗ ██║██║  ███╗   ║
║  ██║     ██║   ██║██╔══██║██║  ██║██╔══██╗██╔══╝  ██╔══██║██╔══██╗██║██║╚██╗██║██║   ██║   ║
║  ███████╗╚██████╔╝██║  ██║██████╔╝██████╔╝███████╗██║  ██║██║  ██║██║██║ ╚████║╚██████╔╝   ║
║  ╚══════╝ ╚═════╝ ╚═╝  ╚═╝╚═════╝ ╚═════╝ ╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝ ╚═════╝    ║
║                                                                                            ║
║                                   what a claim rests on                                    ║
║                                                                                            ║
╚════════════════════════════════════════════════════════════════════════════════════════════╝

loadbearing separates two things that look alike. What a claim says it rests on is one set. What its derivation actually used is another. In a formal library both are machine-readable, so the distance between them can be measured instead of argued about.

Install

pip install loadbearing

The core has no dependencies. Reading a library needs one more:

pip install "loadbearing[formal]"

That pulls mmforge for Metamath databases and gonzalgo for Lean 4 environment dumps.

633 of the 1,016 hold up nothing

1,016 theorems in set.mm have a route to the axiom of countable choice. Remove any one of 633 of them and every other theorem still gets there, because those 633 hold up nothing except themselves.

seam           reaches  carries  carries nothing  idle share  heaviest  holds up
-------------  -------  -------  ---------------  ----------  --------  --------
ax-cc             1016      383              633  62.3%       axcc2lem       937
ax-ac, ax-ac2      525      247              278  53.0%       axac3          515
ax-13              494      188              306  61.9%       ax13v          493

reaches counts every theorem with a route to the seam. carries counts the ones holding up at least one other theorem. The remainder are leaves of the cone: real users of the axiom that no other proof passes through.

The load is concentrated. One statement, axcc2lem, holds up 937 of the 1,016.

python scripts/severing.py path/to/set.mm

Measured on set.mm sha256 6a3a8589, 51,185,034 bytes, with syntax excluded: 49,261 nodes and 905,274 consumed edges, in about forty seconds. The counts move with the database, so the digest is part of the figure. An earlier release quoted this table against a revision that no longer exists anywhere, which is the failure the digest is here to prevent.

Every answer carries the command that re-derives it

from loadbearing.sever import capture

w = capture("set.mm", ["ax-ac", "ax-ac2"])
w.write_script("reproduce.py")

The script that comes out digests the database, the version of mmforge that read it, and the answer itself. Run it on another machine and point it at your own copy:

python reproduce.py --source database=/your/set.mm

It exits non-zero if the database moved, if mmforge is a different build under the same version number, or if the recomputed answer disagrees with the recorded one. Standard output only ever carries an answer that matched.

Where the measurement comes from

Severing is introduced by mmforge.impact, by the same author, which states it and computes it the same way: the theorems whose every route to the axiom passes through T are its dominator subtree on the reversed proof DAG. This package makes that measurement portable. It runs over any ledger rather than a Metamath database, takes a target set rather than one axiom, and attaches a witness to every answer.

Dominators are Lowry and Medlock, 1969; the iterative form is Cooper, Harvey and Kennedy, 2001.

The model

A Ledger holds Nodes and Edges. Every edge is ASSERTED or CONSUMED: what the author declared, against what the derivation pulled in. A Node carries a sort — SYNTAX, AXIOM, DEFINITION, DERIVED, UNKNOWN — which is a property of the target and is orthogonal to the edge kind.

Sort matters before any count is taken. In set.mm 40.0% of all consumed edges point at notation, and ten of the twelve most-cited labels are syntax constructors. A centrality figure over the raw edge set measures the grammar of the language. SupportGraph therefore excludes syntax by default and reports the exclusion in every summary, so a number cannot be read without the population it came from.

Split gives the surplus and the deficit for one claim: cited and unused against used and uncited. In Lean, Classical.propDecidable arrives through instance resolution and appears in a proof's dependencies with nothing matching on the statement side, which is what a pure deficit looks like.

What it reads

substrate via asserted consumed
Metamath mmforge proof citations
Lean 4 gonzalgo statement dependencies proof dependencies

A Metamath proof records what it used and says nothing about intent, so that adapter produces consumed edges alone.

Checking this yourself

git clone https://github.com/vince-gonzalez/loadbearing
cd loadbearing
pip install -e ".[formal]"
python -m unittest discover -s tests

210 tests, and no test framework to install. The severing measurement is checked twice by different means: a dominator tree over the reversed graph, and a plain closure recomputed with the candidate removed. Every run certifies a sample of the first against the second and raises on a disagreement.

Determinism is checked by running the same measurement in two subprocesses at different PYTHONHASHSEED values and comparing the bytes.

Author

Vincent Gonzalez — 0009-0005-3640-014X · vincegonzalez@me.com

Apache-2.0.



╔════════════════════════════════════════════════════════════╗
║                                                            ║
║      ███████╗      ██╗  ██╗███████╗██╗   ██╗███████╗       ║
║      ██╔════╝      ██║ ██╔╝██╔════╝╚██╗ ██╔╝██╔════╝       ║
║      █████╗  █████╗█████╔╝ █████╗   ╚████╔╝ ███████╗       ║
║      ██╔══╝  ╚════╝██╔═██╗ ██╔══╝    ╚██╔╝  ╚════██║       ║
║      ██║           ██║  ██╗███████╗   ██║   ███████║       ║
║      ╚═╝           ╚═╝  ╚═╝╚══════╝   ╚═╝   ╚══════╝       ║
║                                                            ║
║               ·   C  R  E  A  T  I  V  E   ·               ║
║                                                            ║
║          ────────────────────────────────────────          ║
║                                                            ║
║                      Vincent Gonzalez                      ║
║                         f-keys.com                         ║
║                 ORCID 0009-0005-3640-014X                  ║
║                                                            ║
╚════════════════════════════════════════════════════════════╝

Part of F-Keys — independent hardware, software and internet products. See the working log and live status.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

loadbearing-0.1.1.tar.gz (60.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

loadbearing-0.1.1-py3-none-any.whl (43.5 kB view details)

Uploaded Python 3

File details

Details for the file loadbearing-0.1.1.tar.gz.

File metadata

  • Download URL: loadbearing-0.1.1.tar.gz
  • Upload date:
  • Size: 60.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for loadbearing-0.1.1.tar.gz
Algorithm Hash digest
SHA256 62d8146020e76e481ed9ccdf3a435642889798ea273b355ea00b17745530d6e3
MD5 1cb874bc93fe6e2107428b3af056ae4e
BLAKE2b-256 35a355fb643f4ce7533bcd7300828915e13602d5c825211379608340444ca336

See more details on using hashes here.

File details

Details for the file loadbearing-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: loadbearing-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 43.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for loadbearing-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 210fdbab568df3192b734f9206e102885f2c5e09b1642f6c35086e13ae5bcb32
MD5 62f93662eb159df54ffcc926914b3029
BLAKE2b-256 069881aba248101a0edbed4eb37bc29e7e0d0669267eeda86a8a2c0f39ac92ce

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page