diff --git a/.github/workflows/lean-transport-cut.yml b/.github/workflows/lean-transport-cut.yml new file mode 100644 index 0000000000..0f051cd42c --- /dev/null +++ b/.github/workflows/lean-transport-cut.yml @@ -0,0 +1,47 @@ +name: Lean transport cut +on: + pull_request: + paths: + - 'research/lean-transport-cut/**' + - 'research/p104-native-channel/inputs/LOWRANK-WITNESS.json' + - '.github/workflows/lean-transport-cut.yml' + push: + branches: [main] + paths: + - 'research/lean-transport-cut/**' + - 'research/p104-native-channel/inputs/LOWRANK-WITNESS.json' + - '.github/workflows/lean-transport-cut.yml' + workflow_dispatch: +permissions: + contents: read +jobs: + formal: + runs-on: ubuntu-24.04 + timeout-minutes: 20 + env: + LEAN_NUM_THREADS: '4' + PYTHONDONTWRITEBYTECODE: '1' + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + with: + persist-credentials: false + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 + with: + python-version: '3.12' + - name: Checksum-pinned official Lean + shell: bash + run: | + curl --fail --location --retry 3 https://github.com/leanprover/lean4/releases/download/v4.21.0/lean-4.21.0-linux.tar.zst -o "$RUNNER_TEMP/transport-lean.tar.zst" + echo "455c6df09d5bd54d2a51b137939c47e2dda816d512ac789c4b3642c9bf98bde8 $RUNNER_TEMP/transport-lean.tar.zst" | sha256sum --check + tar --zstd -xf "$RUNNER_TEMP/transport-lean.tar.zst" -C "$RUNNER_TEMP" + echo "$RUNNER_TEMP/lean-4.21.0-linux/bin" >> "$GITHUB_PATH" + - name: Provision pinned Mathlib modules + working-directory: research/lean-transport-cut + run: lake exe cache get Mathlib.LinearAlgebra.Dimension.Constructions Mathlib.LinearAlgebra.FiniteDimensional.Basic + - name: Source and artifact checks + run: | + python -I -B research/lean-transport-cut/verify.py + python -I -B research/lean-transport-cut/test_verify.py + - name: Fresh kernel proofs and rejecting formal controls + run: python -I -B research/lean-transport-cut/check_lean.py --lake lake + - run: git diff --exit-code diff --git a/research/lean-transport-cut/.gitignore b/research/lean-transport-cut/.gitignore new file mode 100644 index 0000000000..23abe826ce --- /dev/null +++ b/research/lean-transport-cut/.gitignore @@ -0,0 +1,3 @@ +.lake/ +*.olean +*.ilean diff --git a/research/lean-transport-cut/EXPECTED.json b/research/lean-transport-cut/EXPECTED.json new file mode 100644 index 0000000000..9703f5ef33 --- /dev/null +++ b/research/lean-transport-cut/EXPECTED.json @@ -0,0 +1,5985 @@ +{ + "schema_version": 1, + "source_sha256": "0f541bef7f19fdeffd67157684e9f03d785f42c89973632f508fc1a0452b580e", + "events": 4058, + "event_counts": { + "add": 2624, + "copy": 8, + "erase": 8, + "transport": 1410, + "zero": 8 + }, + "persistent_registers": 280, + "canonical_frames": 444, + "source_side_frames": 222, + "outside_frames": 222, + "source_arrays": 104, + "target_arrays": 104, + "original_transports": 1410, + "original_inward_events": [ + 2463, + 2472, + 2479, + 2487, + 2495, + 2503, + 2510, + 2518 + ], + "original_inward_native_ranks": [ + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7 + ], + "source_sides": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ], + "target_sides": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ], + "transport_sides": [ + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + true, + false + ], + [ + true, + false + ], + [ + true, + false + ], + [ + true, + false + ], + [ + true, + false + ], + [ + true, + false + ], + [ + true, + false + ], + [ + true, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + false, + false + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + true, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ], + [ + false, + true + ] + ], + "finite_controls": { + "positive": [ + "copy_rank_one", + "feedback_two_crossings_attain_two", + "ordered_d2_recovery" + ], + "rejected_relaxations": [ + "wrong_feedback_inverse", + "informative_initialization", + "oversized_message", + "uncounted_source_read", + "reordered_block_decoder" + ], + "feedback_transcript": [ + [ + 1, + 0 + ], + [ + 3, + 1 + ] + ], + "feedback_decoder": [ + [ + 1, + 0 + ], + [ + -3, + 1 + ] + ], + "block_transcript": [ + [ + 1, + 1, + 0, + 0 + ], + [ + 0, + 1, + 0, + 0 + ], + [ + 1, + 0, + 2, + 1 + ], + [ + 1, + 1, + 1, + 1 + ] + ], + "block_decoder": [ + [ + 1, + -1, + 0, + 0 + ], + [ + 0, + 1, + 0, + 0 + ], + [ + 0, + 1, + 1, + -1 + ], + [ + -1, + -1, + -1, + 2 + ] + ] + }, + "source_controls": [ + "rank_mismatch", + "common_chart_leak", + "source_chart_corruption", + "private_initialization_alias" + ] +} diff --git a/research/lean-transport-cut/FORMAL-RECEIPT.json b/research/lean-transport-cut/FORMAL-RECEIPT.json new file mode 100644 index 0000000000..24c0a5972c --- /dev/null +++ b/research/lean-transport-cut/FORMAL-RECEIPT.json @@ -0,0 +1,68 @@ +{ + "dependencies": { + "Cli": "7c6aef5f75a43ebbba763b44d535175a1b04c9e0", + "LeanSearchClient": "6c62474116f525d2814f0157bb468bf3a4f9f120", + "Qq": "e9c65db4823976353cd0bb03199a172719efbeb7", + "aesop": "8ff27701d003456fd59f13a9212431239d902aef", + "batteries": "8d2067bf518731a70a255d4a61b5c103922c772e", + "importGraph": "d07bd64f1910f1cc5e4cc87b6b9c590080e7a457", + "mathlib": "308445d7985027f538e281e18df29ca16ede2ba3", + "plausible": "c4aa78186d388e50a436e8362b947bae125a2933", + "proofwidgets": "6980f6ca164de593cb77cd03d8eac549cc444156" + }, + "lean": "Lean (version 4.21.0, x86_64-unknown-linux-gnu, commit 6741444a63ee, Release)", + "proof_sha256": { + "SourceCut.lean": "2c1eee66cd3269ab3fa0ce461597aea59174f52d71166237f9187455ca7d3b18", + "TransportCut.lean": "6b2f35228940284eabdfc7c9794b3309d036da9a5182c11483f4e5e6ab213153" + }, + "rejected_controls": { + "custom_axiom_dependency": "axiom_audit", + "informative_initialization": "compiler", + "missing_recovery_probe": "axiom_audit", + "sorry_dependency": "compiler", + "too_strong_49_floor": "compiler", + "too_strong_97_floor": "compiler", + "uncounted_receive": "compiler", + "undercounted_source_cut": "compiler" + }, + "theorem_axioms": { + "SourceCut.inward_count": [], + "SourceCut.source_count": [], + "SourceCut.source_entrances": [], + "SourceCut.target_count": [], + "SourceCut.target_exits": [], + "SourceCut.transport_count": [], + "TransportCut.factors_receive": [ + "Quot.sound", + "propext" + ], + "TransportCut.one_receive_attains": [ + "Quot.sound", + "propext" + ], + "TransportCut.p104_refined_floor": [ + "Classical.choice", + "Quot.sound", + "propext" + ], + "TransportCut.p104_unsplit_floor": [ + "Classical.choice", + "Quot.sound", + "propext" + ], + "TransportCut.recovery_requires_receives": [ + "Classical.choice", + "Quot.sound", + "propext" + ], + "TransportCut.runs_factor": [ + "Quot.sound", + "propext" + ], + "TransportCut.runs_rank": [ + "Classical.choice", + "Quot.sound", + "propext" + ] + } +} diff --git a/research/lean-transport-cut/README.md b/research/lean-transport-cut/README.md new file mode 100644 index 0000000000..41455ffc7b --- /dev/null +++ b/research/lean-transport-cut/README.md @@ -0,0 +1,232 @@ +# A Lean transcript theorem for P104 transport cuts + +Lean 4.21.0 checks the chronological factorization behind the P104 transport +floor: after `n` counted inward transports, every target-side value factors +through a transcript of `n` whole arrays. If each array has dimension `d`, +the source-to-target block has rank at most `n*d`, even with arbitrary +same-side linear work, storage, copies and feedback. Recovering `m` +independent arrays therefore requires `n >= m` when `d > 0`. + +The claim is in [discussion #2164](https://github.com/CrocSwap/integer-mult-bounds/discussions/2164#discussioncomment-18934656). + +This formalizes a written argument by **Ross Richardson (PR2127)** and +**Nick Petalas (PR2148)**, following the explicit machine-checking handoff in +[Discussion2164](https://github.com/CrocSwap/integer-mult-bounds/discussions/2164) +and Michael Yee's **PR2163**. The mathematical cut bounds are theirs. The +new contribution is a precise inductive program model, a kernel-checked +factorization and dimension argument, a source binding for the unsplit +cut, and tests of the formal assumptions. No new supplier or exponent is +claimed. + +Prepared for commdata2338 (@commdata2338), with substantial OpenAI Codex assistance. +Apache-2.0. No independent human review is claimed. + +## Formal statement and model + +[TransportCut.lean](TransportCut.lean) defines `Runs n s t`, where `s` and +`t` are the source-dependent linear blocks of the current source-side and +target-side states. A finite program has fixed finite storage capacity; +unused slots can represent later allocations. The theorem itself does not +require finite-dimensional storage, only a finite-dimensional message space. + +The grammar has four constructors: + +| Constructor | Operation | Count | +| --- | --- | --- | +| `init` | Arbitrary source-side input map; zero target-side source dependence | 0 | +| `source` | Any linear update of source-side state from both sides | unchanged | +| `target` | Any linear endomorphism of target-side state | unchanged | +| `receive` | Read one element of `D` from both sides; update target state by `A t + B z`, and source state by any linear map | +1 | + +The `source` constructor grants all return traffic for free. Each incoming +message may depend on earlier messages, so feedback, cycles in the static +frame graph and later retransmissions are included. Copying, discarding, +changing a basis, or storing a received value is a target-side linear +endomorphism and cannot create another independent record. + +`Factors n t` means that there are linear maps + +``` +encode : X -> (Fin n -> D) +decode : (Fin n -> D) -> R +``` + +with `t = decode ∘ encode`. `factors_receive` appends the new message to +this transcript in the correct order. `runs_factor` proves factorization by +induction on every finite `Runs` derivation. `runs_rank` uses Mathlib's +finite-dimensional range inequalities. `recovery_requires_receives` +allows any final linear readout of all target-side storage and derives +`m <= n` from exact recovery of `Fin m -> D`. + +The code is valid over any field. In the characteristic-zero application, +`d` is the dimension of a complete array, including whatever finite cover +and payload coordinates the model retains. **Native child rank and message +dimension are different quantities.** An original rank-seven descent sends +one `d`-dimensional value in this model, not seven independent arrays. + +`one_receive_attains` is a formal positive constructor fixture: one +whole-array message attains the identity on arbitrary input. + +The exact corollaries are: + +- `p104_unsplit_floor`: exact recovery of 104 arrays with at most `8+k` inward + transmissions implies `k >= 96`. +- `p104_refined_floor`: exact recovery of 56 arrays with at most `8+B` + inward transmissions implies `B >= 48`. + +These are conditional corollaries of the respective authors' cut models. +The second does not formalize the refined subspace separator or prove that +its added paid rank bounds the crossing count. + +## How the P104 model enters the grammar + +For PR2127, assign every original frame reachable from a source without +using the eight C descents to the source side; all other frames, including +newly introduced frames, are outside. Reserve enough slots on each side +for the entire finite execution. Grant free mixing between *all* slots on +a side; this is more permissive than common-frame mixing. + +A same-frame operation stays on one side and is `source` or `target`. +An outside-to-source transport is a `source` update. An inward whole-array +transport is `receive`: its linear read includes its array operator, +`B` writes the destination slot, and `A` retains or clears other outside +slots. Its source slot can be cleared by the `keep` map. Transporting or +copying within a side is free in this relaxation. An arbitrary finite +number of source-independent storage lifetimes fits by preallocating +slots and clearing/reusing them with linear maps. + +To isolate source dependence, fix the independently arbitrary target, +helper and fresh-storage inputs to zero. This is a slice of the claimed +all-input endpoint identity; it does not assume that the native program +may use clean dirty helpers. On this slice outside initialization has +zero source dependence. Identity transfer, after any specified invertible +endpoint adapters, gives the `correct` readout hypothesis. Source and +helper restoration are relaxed, so imposing them cannot defeat the bound. + +This paragraph is the **written model translation**. Lean checks every +trace admitted by the displayed grammar. It does not parse or formalize a +native program language, or show that every proposed extension meets the +model. Informative initialization, an uncounted inward read, a wider +message, data-dependent nonlinear coefficients, or an adaptive operation +schedule must not be silently placed inside this grammar. + +## Source-bound finite premise + +[verify.py](verify.py) reads the unchanged PR1972 witness retained by +PR1991, SHA256 +`0f541bef7f19fdeffd67157684e9f03d785f42c89973632f508fc1a0452b580e`. +It reconstructs all binary frame spans and all 4,058 events, checks the +common frame of every ADD/COPY and the chronology/rank of every transport, +and reproduces the PR2127 static partition. There are 444 original frames, +222 on each side, 104 source entrances, 104 target exits and 1,410 original +transports. Exactly the eight C descents enter the outside: + +``` +2463, 2472, 2479, 2487, 2495, 2503, 2510, 2518 +``` + +The canonical receipt is [EXPECTED.json](EXPECTED.json). The checker also +regenerates every Boolean entry of [SourceCut.lean](SourceCut.lean), which +proves the source/target side predicates, array counts, transport count and +eight-crossing count by kernel reduction (`decide`, not `native_decide`). +The JSON-to-frame interpretation remains in Python, outside the Lean +kernel. This is an explicit source binding, not another claim of a new +separator or an independent native-channel replay. + +Exact finite controls include a two-message feedback decoder, copying a +single received value without increasing rank, and two-coordinate +noncommuting block recovery. Removing source independence, allowing an +oversized message, or omitting the charge for an extra source read gives +explicit counterexamples to the corresponding weakened statements. Four +mutated original witnesses are rejected. Artifact controls reject source, +receipt-type and generated-Lean changes and missing evidence; relocated, +read-only, normal and optimized Python replay agree. + +## Reproduce + +The standard-library source and finite checks use Python 3.12: + +```sh +python3 -I -B scripts/research_package.py --package research/lean-transport-cut +``` + +Expected lines include: + +``` +PASS_TRANSPORT_CUT_BINDING sources=104 crossings=8 transports=1410 controls=12 formal_not_run +PASS_TRANSPORT_CUT_ARTIFACT_CONTROLS groups=8 +``` + +The registered Python hook explicitly **does not compile Lean**. For the +formal proof use the pinned Lean `4.21.0` toolchain and the committed +[lake-manifest.json](lake-manifest.json), whose Mathlib head is +`308445d7985027f538e281e18df29ca16ede2ba3`. From this package directory: + +```sh +lake exe cache get Mathlib.LinearAlgebra.Dimension.Constructions Mathlib.LinearAlgebra.FiniteDimensional.Basic +python3 -I -B check_lean.py --lake lake +``` + +The cache command provisions dependencies and may use the network. The +checker then validates every dependency head, compiles both files afresh +with warnings as errors and at most four Lean worker threads, and audits +all thirteen theorem roots. Only `propext`, `Classical.choice`, and +`Quot.sound` are allowed. No `sorry`, custom axiom or native-decision axiom +is accepted. SourceCut's six finite facts use no axioms. + +Eight formal controls must fail: uncharged receive, informative outside +initialization, the false floors 97 and 49, a `sorry`, a custom-axiom proof, +a missing recovery probe, and an undercounted original cut. The custom-axiom and missing-probe controls are required to compile +successfully and fail the axiom/probe audit, so a syntax error is not +mistaken for audit coverage. + +Expected final line: + +``` +PASS_LEAN_TRANSPORT_CUT theorems=13 rejected_controls=8 no_sorry_or_custom_axioms +``` + +[FORMAL-RECEIPT.json](FORMAL-RECEIPT.json) records the observed local run, +compiler, dependency heads, proof hashes, theorem axioms and rejecting +controls. `--out NEW_PATH` emits a fresh receipt exclusively. It is not a +substitute for rerunning the compiler. The dedicated +[workflow](../../.github/workflows/lean-transport-cut.yml) provisions the +checksum-pinned official Lean release and runs these same commands; hosted +CI has not been observed for this contribution. + +## Limits and credit + +The source binder checks the **unsplit original** cut. The graph partition, +written all-program bound and retiming/storage extension belong to Ross +Richardson / [PR2127](https://github.com/CrocSwap/integer-mult-bounds/pull/2127) +(`befebf0f4ae7a3f69fe9c5e136262559dcac125f`). The refined 48-rank argument +belongs to Nick Petalas / [PR2148](https://github.com/CrocSwap/integer-mult-bounds/pull/2148) +(`937b132f3f143ce0f2621b3b12e1ebc413e66730`), using Tairitsu-Aya / PR2136's +separator. Michael Yee / [PR2163](https://github.com/CrocSwap/integer-mult-bounds/pull/2163) +(`9f6e1f2783aef0c52bb3f26f587a918a8be32fa9`) independently checked graph +premises and requested this formal implication. Earlier cut work by David +Arias, Adam Gall and Jeremy Diviney is retained. The channel is Rohan Arun's +PR1972, natively realized by Chafik Boukhalfa in PR1991 using Adam Gall's +schedule; geometry and decoder attribution continues through their notices. +Lean and Mathlib authors supply the proof system and dimension library. + +No new chronological owner realization, source-to-native semantics, +refined-separator formalization, physical transport pricing, coverage +credit, precision/tape, all-size lift or selected cold replay is supplied. +The selected record and every frozen predecessor remain unchanged. The +underlying transcript and rank method is standard; this contribution is +its scoped formalization and source binding. + +## Open next questions + +1. **Formalize the native-event-to-`Runs` translation.** This would remove + the written bridge for arbitrary retained-occurrence programs. Start + with a typed register/frame semantics and prove each primitive has one + of the four constructor forms. The blocker is agreeing on the precise + allowed initialization, array width and cross-chart access rules. +2. **Formalize PR2136/2148's refined crossing count.** The generic rank + theorem already accepts `n <= 8+B`; a useful next step is a kernel proof + of that premise from the survivor separator and nested paths. The + blocker is the finite-subspace/interval model, not the 56/8 arithmetic. + +The structured forms and bounded first steps are in [TASK.json](TASK.json). diff --git a/research/lean-transport-cut/SOURCES.json b/research/lean-transport-cut/SOURCES.json new file mode 100644 index 0000000000..7fe2c6aed7 --- /dev/null +++ b/research/lean-transport-cut/SOURCES.json @@ -0,0 +1,59 @@ +{ + "schema_version": 1, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "ae6a99f28aa468649eb66a361e764d769363bf11", + "sha256": "10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "e8870e5917057d59b730eb14721a778639eca050", + "sha256": "d46eb6d5b3e279428753d770653663fbdf1063e55c255ea073d768f344927ef7" + }, + { + "path": "research/p104-native-channel/inputs/LOWRANK-WITNESS.json", + "usage": "input", + "git_blob": "86beaf424e9f0f800ae3a62797d94ec9386b7706", + "sha256": "0f541bef7f19fdeffd67157684e9f03d785f42c89973632f508fc1a0452b580e" + } + ], + "related_work": [ + { + "pr": 2127, + "author": "Ross Richardson", + "head": "befebf0f4ae7a3f69fe9c5e136262559dcac125f", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/2127", + "inspected_path": "research/p104-storage-cut/README.md", + "sha256": "05eb49d2af6c6b4e7a6e33fb2d7378cc60efef8b8c6b208df682909fe947d974", + "usage": "Written theorem/handoff predecessor; not an executable dependency." + }, + { + "pr": 2148, + "author": "Nick Petalas", + "head": "937b132f3f143ce0f2621b3b12e1ebc413e66730", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/2148", + "inspected_path": "research/p104-refinement-rank-budget/README.md", + "sha256": "84a58adff6f59831bae1046e0400c10ab48ca7efcc6272028449e60018cf1c51", + "usage": "Written theorem/handoff predecessor; not an executable dependency." + }, + { + "pr": 2163, + "author": "Michael Yee", + "head": "9f6e1f2783aef0c52bb3f26f587a918a8be32fa9", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/2163", + "inspected_path": "research/p104-cut-maxflow-audit/README.md", + "sha256": "39ee85ee2ee9bba2b30bd230ed4c55ab5e6405416b10525f5b3095917af805c5", + "usage": "Written theorem/handoff predecessor; not an executable dependency." + } + ], + "formal_environment": { + "lean": "leanprover/lean4:v4.21.0", + "linux_release_sha256": "455c6df09d5bd54d2a51b137939c47e2dda816d512ac789c4b3642c9bf98bde8", + "mathlib": "308445d7985027f538e281e18df29ca16ede2ba3", + "all_dependencies": "lake-manifest.json" + } +} diff --git a/research/lean-transport-cut/SourceCut.lean b/research/lean-transport-cut/SourceCut.lean new file mode 100644 index 0000000000..0242fdb251 --- /dev/null +++ b/research/lean-transport-cut/SourceCut.lean @@ -0,0 +1,145 @@ +import Std + +/- Source-bound finite premise, regenerated by verify.py from every event. + true = source-side frame; false = outside. Apache-2.0. -/ +set_option maxRecDepth 10000 +set_option maxHeartbeats 1000000 +namespace SourceCut +def sourceSides : List Bool := [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true] +def targetSides : List Bool := [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] +def transportSides : List (Bool × Bool) := [ + (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), + (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), + (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), + (false, true), (false, true), (false, true), (false, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), + (true, true), (true, true), (true, true), (true, true), (true, true), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (true, false), (true, false), (true, false), (true, false), (true, false), (true, false), (true, false), (true, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), (false, false), + (false, false), (false, false), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (true, true), (false, true), (false, true), + (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), + (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), (false, true), + (false, true), (false, true), (false, true), (false, true), (false, true), (false, true)] + +def inwardCount : Nat := (transportSides.filter (fun p => p.1 && !p.2)).length + +theorem source_count : sourceSides.length = 104 := by decide +theorem target_count : targetSides.length = 104 := by decide +theorem source_entrances : sourceSides.all id = true := by decide +theorem target_exits : targetSides.all (! ·) = true := by decide +theorem transport_count : transportSides.length = 1410 := by decide +theorem inward_count : inwardCount = 8 := by decide + +#print axioms source_count +#print axioms target_count +#print axioms source_entrances +#print axioms target_exits +#print axioms transport_count +#print axioms inward_count +end SourceCut diff --git a/research/lean-transport-cut/TASK.json b/research/lean-transport-cut/TASK.json new file mode 100644 index 0000000000..1780df55ce --- /dev/null +++ b/research/lean-transport-cut/TASK.json @@ -0,0 +1,118 @@ +{ + "schema_version": 1, + "task_id": "formal-interface-lemma", + "priority_revision": 4, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "original_card": { + "id": "formal-interface-lemma", + "question": "Can one small, precisely scoped interface lemma be formalized with its actual hypotheses?", + "starting_points": [ + "certificates/selected-result.json", + "research/hyperplane-end-lean/PROOF.md" + ], + "methods": [ + "Formalize a missing boundary lemma identified by the selected review.", + "Audit a formal theorem-to-certificate binding independently." + ], + "acceptance_gate": "State the exact formalized proposition and remaining assumptions; avoid duplicate arithmetic formalizations already present.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read the exact hypotheses in the hyperplane-end proof and distinguish Lean theorems from finite supplier assumptions.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "first_experiment": "State one missing boundary lemma in full before starting a proof-assistant build.", + "bottleneck_link": "A missing interface proof can reduce the conditional gap even if it does not change kappa.", + "allowed_variations": [ + "Narrow to one formal lemma or one theorem-to-certificate binding." + ], + "scope_change_triggers": [ + "Formalizing already-covered arithmetic and claiming the full multiplication theorem." + ], + "overlap_terms": [ + "hyperplane end", + "formal interface", + "Lean binding" + ] + }, + "scope_status": "refined", + "actual_scope": "Kernel-check chronological transcript factorization for arbitrary finite linear executions with one fixed-width array per inward crossing; bind the unsplit P104 source cut and state conditional 96/48 corollaries.", + "scope_change_reason": "Take Discussion #2164 / PR2163 second open handoff rather than a generic recursive-interface card. This is a formalization of PR2127/2148, not new graph mathematics or physical pricing.", + "bottleneck_link": "The P104 side-correction obstructions rely on a written communication-capacity implication. A precise formal program grammar checks that implication while exposing the remaining native-model translation.", + "budget_minutes": 60, + "stop_rule": "Stop once the generic factorization, dimension bound, exact corollaries, source binding and controls pass; do not claim a new separator, supplier or exponent.", + "outcome": "completed", + "evidence": "TransportCut.lean, SourceCut.lean, EXPECTED.json, FORMAL-RECEIPT.json; source/finite replay, formal compiler and rejecting controls.", + "author": "commdata2338", + "ai_assistance": "Substantial OpenAI Codex assistance in mathematical formalization, implementation, verification and prose. No independent human review.", + "open_questions": [ + { + "question": "Formalize the native-event-to-Runs translation for retained-occurrence programs.", + "why_it_matters": "Removes the written model-translation boundary between frame-labelled native events and the formal capacity theorem.", + "first_step": "Define typed finite register/frame state and verify each primitive maps to init/source/target/receive.", + "blocked_by": "Agreement on allowed initialization, message width and cross-chart access." + }, + { + "question": "Formalize the refined separator premise n <= 8+B from PR2136/2148.", + "why_it_matters": "Makes the 48-rank corollary depend on a kernel-checked crossing-count theorem.", + "first_step": "Encode binary subspaces and prove the nested interval crossing bound for the survivor separator.", + "blocked_by": "Finite-subspace and interval semantics; native implementation and new coverage credit remain separate." + } + ], + "selection": { + "nonce": "c0ba36ea40e7964ca3d6bcd152c6c2cf", + "drawn_track": "recursive-interfaces", + "suggestions": [ + { + "task_id": "centre-path-sharing", + "scope_key": "a55534776f5479f1686c" + }, + { + "task_id": "connector-alphabet-change", + "scope_key": "0c9f43f3c7d61edb36fe" + }, + { + "task_id": "coverage-law-change", + "scope_key": "f383d8fc405ee6982cdd" + } + ], + "override": "Released central formalization handoff in Discussion #2164; the first candidate two-query QQ16 handoff was already actively claimed.", + "card_scope_key": "636f26dec98e26b296e8", + "refined_scope_key": "P104/chronological-transcript-factorization/arbitrary-linear-feedback/Lean" + }, + "coordination": { + "thread": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2164", + "distinct_scope": "Formal transcript implication; adjacent work prices nested exchange at cut 2429 and is not duplicated.", + "claim": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2164#discussioncomment-18934656" + }, + "upstream_checkpoint": { + "checked_utc": "2026-10-14T21:56:32Z", + "main_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "priority_revision": 4, + "changes": "No upstream changes since the entry base. Guidance, selected record and source witness remain unchanged." + }, + "overlap": { + "checked_utc": "2026-10-14T21:57Z", + "queries": [ + "--task formal-interface-lemma", + "transcript AND P104", + "added transport / transport floor / array per", + "transcript / rank factorization / cut rank / transport Lean" + ], + "open_prs": { + "fetched_at": "2026-10-14T21:48:46.733255+00:00", + "records": 417, + "complete_pagination": true + }, + "discussions": { + "fetched_at": "2026-10-14T21:51:47.765589+00:00", + "records": 849, + "complete_pagination": true + }, + "limitation": "Cached offline text coverage; not code-diff coverage or a novelty certificate. Anonymous Git fetch confirms the three predecessor heads are unchanged." + } +} diff --git a/research/lean-transport-cut/TransportCut.lean b/research/lean-transport-cut/TransportCut.lean new file mode 100644 index 0000000000..a069228eb4 --- /dev/null +++ b/research/lean-transport-cut/TransportCut.lean @@ -0,0 +1,151 @@ +import Mathlib.LinearAlgebra.Dimension.Constructions +import Mathlib.LinearAlgebra.FiniteDimensional.Basic +import Lean.Elab.Tactic.Omega + +/-! +Chronological one-array transcript cuts. The source-side state may read the +entire target-side state freely; every update of target-side state from source +information must use `receive`, which transmits one element of D. +-/ +set_option maxHeartbeats 1000000 + +namespace TransportCut + +variable {K X L R D : Type*} [Field K] + [AddCommGroup X] [Module K X] [AddCommGroup L] [Module K L] + [AddCommGroup R] [Module K R] [AddCommGroup D] [Module K D] + +/-- Source-dependent blocks of a finite two-side linear execution. +Independent dirty inputs have been fixed to zero when taking these blocks. +`source` grants arbitrary local work AND return traffic at no counted cost. +`receive` is the sole constructor importing source information to the right. +-/ +inductive Runs : Nat → (X →ₗ[K] L) → (X →ₗ[K] R) → Prop + | init (s : X →ₗ[K] L) : Runs 0 s 0 + | source {n s t} (h : Runs n s t) (a : L × R →ₗ[K] L) : + Runs n (a.comp (s.prod t)) t + | target {n s t} (h : Runs n s t) (a : R →ₗ[K] R) : + Runs n s (a.comp t) + | receive {n s t} (h : Runs n s t) + (read : L × R →ₗ[K] D) (keep : L × R →ₗ[K] L) + (a : R →ₗ[K] R) (b : D →ₗ[K] R) : + Runs (n + 1) (keep.comp (s.prod t)) + (a.comp t + b.comp (read.comp (s.prod t))) + +/-- Positive constructor fixture: one whole-array message attains identity. +This uses arbitrary input D, with no special clean-source restriction. -/ +theorem one_receive_attains : + Runs (K := K) (D := D) 1 (LinearMap.id : D →ₗ[K] D) + (LinearMap.id : D →ₗ[K] D) := by + have h0 : Runs (D := D) 0 (LinearMap.id : D →ₗ[K] D) (0 : D →ₗ[K] D) := + Runs.init _ + have h1 := Runs.receive h0 (LinearMap.fst K D D) (LinearMap.fst K D D) + (0 : D →ₗ[K] D) (LinearMap.id : D →ₗ[K] D) + simpa using h1 + +/-- A record contains n whole arrays, not n times a native child rank. -/ +def Factors (n : Nat) (t : X →ₗ[K] R) : Prop := + ∃ (encode : X →ₗ[K] (Fin n → D)) (decode : (Fin n → D) →ₗ[K] R), + t = decode.comp encode + +private def tailMap (n : Nat) : (Fin (n+1) → D) →ₗ[K] (Fin n → D) := + LinearMap.pi (fun i => LinearMap.proj i.succ) + +private def consMap {n : Nat} (z : X →ₗ[K] D) + (e : X →ₗ[K] (Fin n → D)) : X →ₗ[K] (Fin (n+1) → D) := + LinearMap.pi (Fin.cases z (fun i => (LinearMap.proj i).comp e)) + +theorem factors_postcompose {Y : Type*} [AddCommGroup Y] [Module K Y] + {n : Nat} {t : X →ₗ[K] R} + (h : Factors (D := D) n t) (a : R →ₗ[K] Y) : + Factors (D := D) n (a.comp t) := by + obtain ⟨e, d, rfl⟩ := h + exact ⟨e, a.comp d, by ext x; rfl⟩ + +/-- One receive appends exactly one whole-array position to the transcript. -/ +theorem factors_receive {n : Nat} {t : X →ₗ[K] R} + (h : Factors (D := D) n t) (a : R →ₗ[K] R) + (b : D →ₗ[K] R) (z : X →ₗ[K] D) : + Factors (D := D) (n+1) (a.comp t + b.comp z) := by + obtain ⟨e, d, rfl⟩ := h + refine ⟨consMap z e, (a.comp d).comp (tailMap n) + b.comp (LinearMap.proj 0), ?_⟩ + ext x + have ht : tailMap (K := K) n (consMap z e x) = e x := by + funext i + rfl + change a (d (e x)) + b (z x) = + a (d (tailMap n (consMap z e x))) + b (consMap z e x 0) + rw [ht] + rfl + +/-- Universal factorization, for arbitrary finite traces and feedback. -/ +theorem runs_factor {n : Nat} {s : X →ₗ[K] L} {t : X →ₗ[K] R} + (h : Runs (D := D) n s t) : Factors (D := D) n t := by + induction h with + | init s => exact ⟨0, 0, by simp⟩ + | source h a ih => exact ih + | target h a ih => exact factors_postcompose ih a + | receive h read keep a b ih => + exact factors_receive ih a b _ + +/-- The output block's dimension is bounded by the transcript dimension. -/ +theorem factors_rank [FiniteDimensional K D] {n : Nat} {t : X →ₗ[K] R} + (h : Factors (D := D) n t) : + Module.finrank K (LinearMap.range t) ≤ n * Module.finrank K D := by + obtain ⟨e, d, rfl⟩ := h + calc + Module.finrank K (LinearMap.range (d.comp e)) + ≤ Module.finrank K (LinearMap.range d) := + Submodule.finrank_mono (LinearMap.range_comp_le_range e d) + _ ≤ Module.finrank K (Fin n → D) := LinearMap.finrank_range_le d + _ = n * Module.finrank K D := by simp [Module.finrank_pi_fintype] + +/-- Complete cut-capacity theorem: one d-vector per counted receive. -/ +theorem runs_rank [FiniteDimensional K D] {n : Nat} + {s : X →ₗ[K] L} {t : X →ₗ[K] R} (h : Runs (D := D) n s t) : + Module.finrank K (LinearMap.range t) ≤ n * Module.finrank K D := + factors_rank (runs_factor h) + +/-- Exact recovery of m independent arrays requires at least m receives. +The final readout is linear and may use all right-side storage. -/ +theorem recovery_requires_receives [FiniteDimensional K D] + (hd : 0 < Module.finrank K D) {m n : Nat} + {s : (Fin m → D) →ₗ[K] L} {t : (Fin m → D) →ₗ[K] R} + (h : Runs (D := D) n s t) (out : R →ₗ[K] (Fin m → D)) + (correct : out.comp t = LinearMap.id) : m ≤ n := by + have hr := factors_rank (factors_postcompose (runs_factor h) out) + rw [correct] at hr + have hh : m * Module.finrank K D ≤ n * Module.finrank K D := by + rw [LinearMap.range_id, finrank_top, Module.finrank_pi_fintype] at hr + simpa using hr + exact Nat.le_of_mul_le_mul_right hh hd + +/-- PR2127's numerical conclusion, conditional on its source/cut translation. -/ +theorem p104_unsplit_floor [FiniteDimensional K D] + (hd : 0 < Module.finrank K D) {k n : Nat} + {s : (Fin 104 → D) →ₗ[K] L} {t : (Fin 104 → D) →ₗ[K] R} + (h : Runs (D := D) n s t) (budget : n ≤ 8+k) + (out : R →ₗ[K] (Fin 104 → D)) + (correct : out.comp t = LinearMap.id) : 96 ≤ k := by + have hh := recovery_requires_receives hd h out correct + omega + +/-- PR2148's numerical conclusion, conditional on its refined separator. -/ +theorem p104_refined_floor [FiniteDimensional K D] + (hd : 0 < Module.finrank K D) {b n : Nat} + {s : (Fin 56 → D) →ₗ[K] L} {t : (Fin 56 → D) →ₗ[K] R} + (h : Runs (D := D) n s t) (budget : n ≤ 8+b) + (out : R →ₗ[K] (Fin 56 → D)) + (correct : out.comp t = LinearMap.id) : 48 ≤ b := by + have hh := recovery_requires_receives hd h out correct + omega + +#print axioms one_receive_attains +#print axioms factors_receive +#print axioms runs_factor +#print axioms runs_rank +#print axioms recovery_requires_receives +#print axioms p104_unsplit_floor +#print axioms p104_refined_floor + +end TransportCut diff --git a/research/lean-transport-cut/VERIFY.json b/research/lean-transport-cut/VERIFY.json new file mode 100644 index 0000000000..247b2c0c20 --- /dev/null +++ b/research/lean-transport-cut/VERIFY.json @@ -0,0 +1,42 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/p104-native-channel/inputs/LOWRANK-WITNESS.json" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 30, + "checks": "Immutable witness, complete original frame/event binding, exact finite controls and generated Lean correspondence; DOES NOT compile Lean." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 30, + "checks": "Same source and finite checks with Python assertions disabled." + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/test_verify.py" + ], + "timeout_seconds": 60, + "checks": "Eight artifact/audit groups: relocation, read-only replay, source and typed receipt rejection, generated proof binding, exclusive output, missing evidence and axiom audit." + } + ] +} diff --git a/research/lean-transport-cut/check_lean.py b/research/lean-transport-cut/check_lean.py new file mode 100644 index 0000000000..5629fb46ab --- /dev/null +++ b/research/lean-transport-cut/check_lean.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +"""Compile both proof files and reject weakened statements and unexpected axioms. + +Requires the pinned Lean/Mathlib environment described in README.md. +Apache-2.0. Prepared for commdata2338 with substantial OpenAI Codex assistance. +""" +from __future__ import annotations + +import argparse +import hashlib +import json +import re +import shutil +import subprocess +import tempfile +from pathlib import Path + +PACKAGE = Path(__file__).resolve().parent +ALLOWED = {'propext', 'Classical.choice', 'Quot.sound'} +ROOTS = { + 'TransportCut.lean': ['one_receive_attains', 'factors_receive', 'runs_factor', 'runs_rank', + 'recovery_requires_receives', 'p104_unsplit_floor', + 'p104_refined_floor'], + 'SourceCut.lean': ['source_count', 'target_count', 'source_entrances', + 'target_exits', 'transport_count', 'inward_count'], +} + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def audit(output, namespace, roots): + found = {} + pattern = r"'([^']+)' (?:depends on axioms:\s*\[([^]]*)\]|does not depend on any axioms)" + for match in re.finditer(pattern, output, re.S): + name, listed = match.groups() + require(name not in found, f'duplicate axiom probe: {name}') + axioms = set() if listed is None else set(re.findall(r'[^,\s]+', listed)) + require(axioms <= ALLOWED, f'forbidden axioms for {name}: {sorted(axioms-ALLOWED)}') + found[name] = sorted(axioms) + expected = {f'{namespace}.{name}' for name in roots} + require(set(found) == expected, f'missing or extra axiom probes: {expected ^ set(found)}') + return found + + +def run(lake, path): + return subprocess.run([lake, 'env', 'lean', '-j4', '-DwarningAsError=true', str(path)], + cwd=PACKAGE, text=True, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, timeout=90) + + +def rejected(lake, path, namespace, roots): + result = run(lake, path) + if result.returncode: + require('error:' in result.stdout, 'negative control failed without a Lean error') + return 'compiler' + try: + audit(result.stdout, namespace, roots) + except ValueError: + return 'axiom_audit' + raise ValueError(f'weakened proof accepted: {path.name}') + + +def one_replace(source, old, new): + require(source.count(old) == 1, 'nonunique mutation anchor') + return source.replace(old, new, 1) + + +def proof_mutants(source): + yield 'uncounted_receive', one_replace(source, + 'Runs (n + 1) (keep.comp (s.prod t))', + 'Runs n (keep.comp (s.prod t))') + yield 'informative_initialization', one_replace(source, + '| init (s : X →ₗ[K] L) : Runs 0 s 0', + '| init (s : X →ₗ[K] L) (t : X →ₗ[K] R) : Runs 0 s t') + yield 'too_strong_97_floor', one_replace(source, ': 96 ≤ k := by', ': 97 ≤ k := by') + yield 'too_strong_49_floor', one_replace(source, ': 48 ≤ b := by', ': 49 ≤ b := by') + start = source.index(' induction h with', source.index('theorem runs_factor')) + end = source.index('\n/-- The output block', start) + yield 'sorry_dependency', source[:start] + ' sorry\n' + source[end:] + injected = source[:start] + ' cases h <;> exact False.elim injectedFalse\n' + source[end:] + yield 'custom_axiom_dependency', one_replace(injected, + 'namespace TransportCut', 'namespace TransportCut\naxiom injectedFalse : False') + yield 'missing_recovery_probe', one_replace(source, + '#print axioms recovery_requires_receives\n', '') + + +def dependency_pins(): + manifest = json.loads((PACKAGE/'lake-manifest.json').read_text()) + pins = {} + for package in manifest['packages']: + folder = PACKAGE/'.lake'/'packages'/package['name'] + result = subprocess.run(['git', '-C', str(folder), 'rev-parse', 'HEAD'], + text=True, capture_output=True, timeout=10) + require(result.returncode == 0, f'missing dependency: {package["name"]}') + require(result.stdout.strip() == package['rev'], f'wrong dependency: {package["name"]}') + pins[package['name']] = package['rev'] + return pins + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--lake', default='lake') + parser.add_argument('--out', type=Path, help='exclusively write a fresh proof receipt') + args = parser.parse_args() + lake = shutil.which(args.lake) + require(lake is not None, 'lake unavailable; provision pinned environment first') + pins = dependency_pins() + version = subprocess.run([lake, 'env', 'lean', '--version'], cwd=PACKAGE, + text=True, capture_output=True, check=True, timeout=30).stdout.strip() + require('version 4.21.0,' in version, f'wrong Lean version: {version}') + probes, hashes, transcript = {}, {}, [] + for filename, roots in ROOTS.items(): + path = PACKAGE/filename + result = run(lake, path) + require(result.returncode == 0, result.stdout) + namespace = filename.removesuffix('.lean') + probes.update(audit(result.stdout, namespace, roots)) + hashes[filename] = hashlib.sha256(path.read_bytes()).hexdigest() + transcript.append(result.stdout) + controls = {} + # The temporary proof copies import only the already provisioned libraries. + with tempfile.TemporaryDirectory(prefix='transport-cut-') as tmp: + for name, source in proof_mutants((PACKAGE/'TransportCut.lean').read_text()): + path = Path(tmp)/(name+'.lean') + path.write_text(source) + controls[name] = rejected(lake, path, 'TransportCut', ROOTS['TransportCut.lean']) + source = one_replace((PACKAGE/'SourceCut.lean').read_text(), + 'inwardCount = 8', 'inwardCount = 7') + path = Path(tmp)/'undercounted_source_cut.lean' + path.write_text(source) + controls['undercounted_source_cut'] = rejected(lake, path, 'SourceCut', ROOTS['SourceCut.lean']) + require(controls['custom_axiom_dependency'] == 'axiom_audit', 'custom-axiom control did not reach audit') + require(controls['missing_recovery_probe'] == 'axiom_audit', 'missing-probe control did not reach audit') + receipt = {'lean': version, 'dependencies': pins, 'proof_sha256': hashes, + 'theorem_axioms': probes, 'rejected_controls': controls} + payload = json.dumps(receipt, indent=2, sort_keys=True)+'\n' + if args.out: + with args.out.open('x') as f: + f.write(payload) + print(''.join(transcript), end='') + print('PASS_LEAN_TRANSPORT_CUT theorems=13 rejected_controls=8 no_sorry_or_custom_axioms') + + +if __name__ == '__main__': + main() diff --git a/research/lean-transport-cut/lake-manifest.json b/research/lean-transport-cut/lake-manifest.json new file mode 100644 index 0000000000..88d1572d68 --- /dev/null +++ b/research/lean-transport-cut/lake-manifest.json @@ -0,0 +1,116 @@ +{ + "version": "1.1.0", + "packagesDir": ".lake/packages", + "packages": [ + { + "url": "https://github.com/leanprover-community/mathlib4", + "type": "git", + "subDir": null, + "scope": "", + "rev": "308445d7985027f538e281e18df29ca16ede2ba3", + "name": "mathlib", + "manifestFile": "lake-manifest.json", + "inputRev": "308445d7985027f538e281e18df29ca16ede2ba3", + "inherited": false, + "configFile": "lakefile.lean" + }, + { + "url": "https://github.com/leanprover-community/plausible", + "type": "git", + "subDir": null, + "scope": "leanprover-community", + "rev": "c4aa78186d388e50a436e8362b947bae125a2933", + "name": "plausible", + "manifestFile": "lake-manifest.json", + "inputRev": "main", + "inherited": true, + "configFile": "lakefile.toml" + }, + { + "url": "https://github.com/leanprover-community/LeanSearchClient", + "type": "git", + "subDir": null, + "scope": "leanprover-community", + "rev": "6c62474116f525d2814f0157bb468bf3a4f9f120", + "name": "LeanSearchClient", + "manifestFile": "lake-manifest.json", + "inputRev": "main", + "inherited": true, + "configFile": "lakefile.toml" + }, + { + "url": "https://github.com/leanprover-community/import-graph", + "type": "git", + "subDir": null, + "scope": "leanprover-community", + "rev": "d07bd64f1910f1cc5e4cc87b6b9c590080e7a457", + "name": "importGraph", + "manifestFile": "lake-manifest.json", + "inputRev": "main", + "inherited": true, + "configFile": "lakefile.toml" + }, + { + "url": "https://github.com/leanprover-community/ProofWidgets4", + "type": "git", + "subDir": null, + "scope": "leanprover-community", + "rev": "6980f6ca164de593cb77cd03d8eac549cc444156", + "name": "proofwidgets", + "manifestFile": "lake-manifest.json", + "inputRev": "v0.0.62", + "inherited": true, + "configFile": "lakefile.lean" + }, + { + "url": "https://github.com/leanprover-community/aesop", + "type": "git", + "subDir": null, + "scope": "leanprover-community", + "rev": "8ff27701d003456fd59f13a9212431239d902aef", + "name": "aesop", + "manifestFile": "lake-manifest.json", + "inputRev": "master", + "inherited": true, + "configFile": "lakefile.toml" + }, + { + "url": "https://github.com/leanprover-community/quote4", + "type": "git", + "subDir": null, + "scope": "leanprover-community", + "rev": "e9c65db4823976353cd0bb03199a172719efbeb7", + "name": "Qq", + "manifestFile": "lake-manifest.json", + "inputRev": "master", + "inherited": true, + "configFile": "lakefile.toml" + }, + { + "url": "https://github.com/leanprover-community/batteries", + "type": "git", + "subDir": null, + "scope": "leanprover-community", + "rev": "8d2067bf518731a70a255d4a61b5c103922c772e", + "name": "batteries", + "manifestFile": "lake-manifest.json", + "inputRev": "main", + "inherited": true, + "configFile": "lakefile.toml" + }, + { + "url": "https://github.com/leanprover/lean4-cli", + "type": "git", + "subDir": null, + "scope": "leanprover", + "rev": "7c6aef5f75a43ebbba763b44d535175a1b04c9e0", + "name": "Cli", + "manifestFile": "lake-manifest.json", + "inputRev": "main", + "inherited": true, + "configFile": "lakefile.toml" + } + ], + "name": "TransportCut", + "lakeDir": ".lake" +} diff --git a/research/lean-transport-cut/lakefile.toml b/research/lean-transport-cut/lakefile.toml new file mode 100644 index 0000000000..eea3df6bdd --- /dev/null +++ b/research/lean-transport-cut/lakefile.toml @@ -0,0 +1,9 @@ +name = "TransportCut" + +[[require]] +name = "mathlib" +git = "https://github.com/leanprover-community/mathlib4" +rev = "308445d7985027f538e281e18df29ca16ede2ba3" + +[[lean_lib]] +name = "TransportCut" diff --git a/research/lean-transport-cut/lean-toolchain b/research/lean-transport-cut/lean-toolchain new file mode 100644 index 0000000000..980709bbba --- /dev/null +++ b/research/lean-transport-cut/lean-toolchain @@ -0,0 +1 @@ +leanprover/lean4:v4.21.0 diff --git a/research/lean-transport-cut/test_verify.py b/research/lean-transport-cut/test_verify.py new file mode 100644 index 0000000000..8338fb903b --- /dev/null +++ b/research/lean-transport-cut/test_verify.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +"""Artifact-boundary controls for the source/finite replay (stdlib only).""" +import importlib.util +import json +import os +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +INPUT = 'research/p104-native-channel/inputs/LOWRANK-WITNESS.json' + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def main(): + groups = [] + with tempfile.TemporaryDirectory(prefix='cut-artifacts-') as directory: + root = Path(directory) + package = root/'research'/'lean-transport-cut' + package.mkdir(parents=True) + for name in ['verify.py', 'EXPECTED.json', 'SourceCut.lean']: + shutil.copyfile(HERE/name, package/name) + source = root/INPUT + source.parent.mkdir(parents=True) + shutil.copyfile(ROOT/INPUT, source) + def run(*args, optimized=False): + cmd = [sys.executable, '-I', '-B'] + (['-O'] if optimized else []) + return subprocess.run(cmd+[str(package/'verify.py'), *map(str,args)], + cwd=root, capture_output=True, text=True, timeout=20) + def rejected(message): + result = run(optimized=True) + require(result.returncode != 0 and message in result.stderr, + f'control not rejected at {message}: {result.stdout} {result.stderr}') + baseline = run() + optimized = run(optimized=True) + require(baseline.returncode == optimized.returncode == 0, baseline.stderr+optimized.stderr) + require(baseline.stdout == optimized.stdout, 'assertion-mode difference') + groups.append('relocated_normal_and_optimized') + # Read-only source export must remain reusable. + for p in [source, *package.iterdir()]: + p.chmod(0o444) + package.chmod(0o555) + require(run().returncode == 0, 'read-only replay failed') + package.chmod(0o755) + for p in [source, *package.iterdir()]: + p.chmod(0o644) + groups.append('read_only_export') + expected = (package/'EXPECTED.json').read_text() + altered = json.loads(expected) + altered['source_sides'][0] = 1 + (package/'EXPECTED.json').write_text(json.dumps(altered)) + rejected('receipt mismatch') + (package/'EXPECTED.json').write_text(expected) + groups.append('typed_receipt_rejection') + lean = (package/'SourceCut.lean').read_text() + (package/'SourceCut.lean').write_text(lean.replace('inwardCount = 8', 'inwardCount = 7')) + rejected('Lean source binding mismatch') + (package/'SourceCut.lean').write_text(lean) + groups.append('generated_lean_rejection') + data = source.read_bytes() + source.write_bytes(data+b'\n') + rejected('immutable witness hash') + source.write_bytes(data) + groups.append('immutable_source_rejection') + occupied = root/'occupied.json' + occupied.write_text('sentinel') + result = run('--write', occupied) + require(result.returncode != 0 and occupied.read_text() == 'sentinel', 'overwritten output') + groups.append('exclusive_output') + (package/'EXPECTED.json').unlink() + result = run() + require(result.returncode != 0 and 'FileNotFoundError' in result.stderr, 'missing receipt accepted') + groups.append('missing_receipt') + spec = importlib.util.spec_from_file_location('cut_formal_checker', HERE/'check_lean.py') + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + normal = "'N.one' depends on axioms: [propext,\n Classical.choice, Quot.sound]\n'N.two' does not depend on any axioms\n" + module.audit(normal, 'N', ['one','two']) + for bad in [normal.replace('propext', 'sorryAx'), normal.replace('propext', 'N.hidden'), + normal.splitlines()[0], normal+normal]: + try: + module.audit(bad, 'N', ['one','two']) + except ValueError: + pass + else: + raise ValueError('axiom-audit mutation escaped') + groups.append('axiom_audit_missing_duplicate_and_forbidden') + print('PASS_TRANSPORT_CUT_ARTIFACT_CONTROLS groups='+str(len(groups))) + + +if __name__ == '__main__': + main() diff --git a/research/lean-transport-cut/verify.py b/research/lean-transport-cut/verify.py new file mode 100644 index 0000000000..26657a0f00 --- /dev/null +++ b/research/lean-transport-cut/verify.py @@ -0,0 +1,288 @@ +#!/usr/bin/env python3 +"""Source binding and finite controls; Lean compilation is check_lean.py. + +Apache-2.0. Prepared for commdata2338 with substantial OpenAI Codex assistance. +""" +from __future__ import annotations + +import argparse +import copy +import hashlib +import json +from collections import Counter, defaultdict, deque +from fractions import Fraction +from pathlib import Path + +PACKAGE = Path(__file__).resolve().parent +ROOT = PACKAGE.parents[1] +WITNESS = 'research/p104-native-channel/inputs/LOWRANK-WITNESS.json' +PIN = '0f541bef7f19fdeffd67157684e9f03d785f42c89973632f508fc1a0452b580e' + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def span(vectors): + out = {0} + for v in vectors: + require(type(v) is int and 0 < v < 512, 'invalid binary frame label') + out |= {x ^ v for x in tuple(out)} + return frozenset(out) + + +def dim(space): + return len(space).bit_length() - 1 + + +def extract(w): + """Reconstruct every frame and check complete original event coverage.""" + require(set(w) == {'initial_frames', 'final_frames', 'program'}, 'witness schema') + initial = {r: span(v) for r, v in w['initial_frames'].items()} + frames = dict(initial) + all_frames = set(frames.values()) + transports = [] + operations = Counter() + for i, event in enumerate(w['program']): + kind = event[0] + operations[kind] += 1 + if kind == 'transport': + _, r, before, after, rank = event + a, b = span(before), span(after) + require(frames.get(r) == a, f'entrance frame at {i}') + require(a < b or b < a, f'nonnested transport at {i}') + require(type(rank) is int and rank == abs(dim(a)-dim(b)), f'rank at {i}') + transports.append((i, r, a, b, rank)) + frames[r] = b + all_frames.update((a, b)) + elif kind in ('add', 'copy'): + if kind == 'add': + _, dst, src, coefficient, basis = event + require(Fraction(coefficient) != 0, f'zero ADD at {i}') + else: + _, dst, src, basis = event + require(dst == 'C', 'unexpected private COPY') + chart = span(basis) + require(dst != src and frames.get(dst) == frames.get(src) == chart, + f'cross-frame uncounted operation at {i}') + elif kind == 'zero': + _, r, basis = event + require(r == 'C' and r not in frames, f'informative or reused initialization at {i}') + frames[r] = span(basis) + all_frames.add(frames[r]) + elif kind == 'erase': + _, r, basis = event + require(r == 'C' and frames.get(r) == span(basis), f'erasure frame at {i}') + del frames[r] + else: + raise ValueError(f'unknown event {kind}') + final = {r: span(v) for r, v in w['final_frames'].items()} + require(frames == final, 'final frames') + sources = [initial[f'X{i}'] for i in range(104)] + targets = [final[f'Y{i}'] for i in range(104)] + removed = [t for t in transports if t[1] == 'C' and dim(t[2]) > dim(t[3])] + require(len(removed) == 8 and all(t[4] == 7 for t in removed), 'eight private descents') + cut_ids = {t[0] for t in removed} + graph = defaultdict(set) + for i, _, a, b, _ in transports: + if i not in cut_ids: + graph[a].add(b) + reachable = set(sources) + queue = deque(sources) + while queue: + for b in graph[queue.popleft()]: + if b not in reachable: + reachable.add(b) + queue.append(b) + require(not set(targets) & reachable, 'original source-target separation') + inward = [i for i, _, a, b, _ in transports if a in reachable and b not in reachable] + require(inward == sorted(cut_ids), 'crossing inventory') + return { + 'schema_version': 1, + 'source_sha256': PIN, + 'events': len(w['program']), + 'event_counts': dict(sorted(operations.items())), + 'persistent_registers': len(initial), + 'canonical_frames': len(all_frames), + 'source_side_frames': len(reachable), + 'outside_frames': len(all_frames - reachable), + 'source_arrays': len(sources), + 'target_arrays': len(targets), + 'original_transports': len(transports), + 'original_inward_events': inward, + 'original_inward_native_ranks': [t[4] for t in removed], + 'source_sides': [s in reachable for s in sources], + 'target_sides': [s in reachable for s in targets], + 'transport_sides': [[a in reachable, b in reachable] for _, _, a, b, _ in transports], + } + + +def lean_data(receipt): + """Finite Bool certificate: kernel reduction, never native_decide.""" + boolean = lambda b: 'true' if b else 'false' + def vec(name, values): + return f'def {name} : List Bool := [' + ', '.join(map(boolean, values)) + ']\n' + pairs = ['(' + boolean(a) + ', ' + boolean(b) + ')' for a, b in receipt['transport_sides']] + chunks = [', '.join(pairs[i:i+12]) for i in range(0, len(pairs), 12)] + text = '''import Std + +/- Source-bound finite premise, regenerated by verify.py from every event. + true = source-side frame; false = outside. Apache-2.0. -/ +set_option maxRecDepth 10000 +set_option maxHeartbeats 1000000 +namespace SourceCut +''' + text += vec('sourceSides', receipt['source_sides']) + text += vec('targetSides', receipt['target_sides']) + text += 'def transportSides : List (Bool × Bool) := [\n ' + ',\n '.join(chunks) + ']\n' + text += ''' +def inwardCount : Nat := (transportSides.filter (fun p => p.1 && !p.2)).length + +theorem source_count : sourceSides.length = 104 := by decide +theorem target_count : targetSides.length = 104 := by decide +theorem source_entrances : sourceSides.all id = true := by decide +theorem target_exits : targetSides.all (! ·) = true := by decide +theorem transport_count : transportSides.length = 1410 := by decide +theorem inward_count : inwardCount = 8 := by decide + +#print axioms source_count +#print axioms target_count +#print axioms source_entrances +#print axioms target_exits +#print axioms transport_count +#print axioms inward_count +end SourceCut +''' + return text + + +def matrix_mul(a, b): + return [[sum((x*y for x, y in zip(row, col)), Fraction(0)) + for col in zip(*b)] for row in a] + + +def matrix_add(a, b): + return [[x+y for x, y in zip(ra, rb)] for ra, rb in zip(a, b)] + + +def rank(a): + a = [[Fraction(x) for x in r] for r in a] + row = 0 + for col in range(len(a[0])): + pivot = next((k for k in range(row, len(a)) if a[k][col]), None) + if pivot is None: + continue + a[row], a[pivot] = a[pivot], a[row] + q = a[row][col] + a[row] = [v/q for v in a[row]] + for k in range(len(a)): + if k != row: + q = a[k][col] + a[k] = [x-q*y for x, y in zip(a[k], a[row])] + row += 1 + if row == len(a): + break + return row + + +def finite_controls(): + """Independent direct matrices test feedback, copying and the trust boundary.""" + # Two independent scalar inputs. First crossing transmits a. + x = [[1, 0], [0, 1]] + first = [[1, 0], [0, 0]] + copied = matrix_mul([[1, 0], [7, 0]], first) + require(rank(copied) == 1, 'copy amplified rank') + # Free return traffic changes the next source-side read to b+3a. + inside = matrix_add(x, matrix_mul([[3, 0], [0, 0]], first)) + read = matrix_mul([[0, 1]], inside) + read = matrix_add(read, matrix_mul([[3, 0]], first)) + transcript = [first[0], read[0]] + decoder = [[1, 0], [-3, 1]] + require(matrix_mul(decoder, transcript) == x, 'feedback decoder order') + require(rank(transcript) == 2, 'two-crossing attainment') + wrong = [[1, 0], [3, 1]] + require(matrix_mul(wrong, transcript) != x, 'wrong feedback inverse escaped') + # Exact counterexamples to omitted model hypotheses, not admitted programs. + require(rank(x) > 0, 'source-dependent initialization witness') + require(rank(x) > 1, 'one oversized message witness') + require(rank(matrix_add(first, [[0, 0], [0, 1]])) > 1, + 'uncounted source-to-target read witness') + # Two d=2 messages, with genuinely noncommuting ordered block recovery. + a, ai = [[1, 1], [0, 1]], [[1, -1], [0, 1]] + b, c, ci = [[1, 0], [1, 1]], [[2, 1], [1, 1]], [[1, -1], [-1, 2]] + encoded = [row + [0, 0] for row in a] + [b[i]+c[i] for i in range(2)] + lower = [[-v for v in row] for row in matrix_mul(matrix_mul(ci, b), ai)] + decoded = [row + [0, 0] for row in ai] + [lower[i]+ci[i] for i in range(2)] + identity4 = [[int(i == j) for j in range(4)] for i in range(4)] + require(matrix_mul(decoded, encoded) == identity4, 'ordered d=2 recovery') + wrong_lower = [[-v for v in row] for row in matrix_mul(matrix_mul(ai, b), ci)] + wrong_block = [row + [0, 0] for row in ai] + [wrong_lower[i]+ci[i] for i in range(2)] + require(matrix_mul(wrong_block, encoded) != identity4, 'reordered block decoder escaped') + require(rank(encoded[:2]) == 2 and rank(encoded) == 4, 'whole-array capacity') + return { + 'positive': ['copy_rank_one', 'feedback_two_crossings_attain_two', 'ordered_d2_recovery'], + 'rejected_relaxations': ['wrong_feedback_inverse', 'informative_initialization', + 'oversized_message', 'uncounted_source_read', 'reordered_block_decoder'], + 'feedback_transcript': [[int(x) for x in r] for r in transcript], + 'feedback_decoder': decoder, + 'block_transcript': encoded, + 'block_decoder': [[int(x) for x in r] for r in decoded], + } + + + +def source_controls(w): + mutants = [] + for name, change in [ + ('rank_mismatch', lambda z: z['program'][417].__setitem__(4, 2)), + ('common_chart_leak', lambda z: z['program'][0].__setitem__(2, 'X0')), + ('source_chart_corruption', lambda z: z['initial_frames']['X0'].__setitem__(0, 1)), + ('private_initialization_alias', lambda z: z['program'][2461].__setitem__(1, 'X0')), + ]: + z = copy.deepcopy(w) + change(z) + try: + extract(z) + except (ValueError, KeyError): + mutants.append(name) + else: + raise ValueError(f'source mutation accepted: {name}') + return mutants + + +def compute(): + raw = (ROOT / WITNESS).read_bytes() + require(hashlib.sha256(raw).hexdigest() == PIN, 'immutable witness hash') + w = json.loads(raw) + receipt = extract(w) + receipt['finite_controls'] = finite_controls() + receipt['source_controls'] = source_controls(w) + return receipt + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--write', type=Path, help='exclusively write a candidate receipt') + parser.add_argument('--emit-lean', type=Path, help='exclusively write the generated finite premise') + args = parser.parse_args() + receipt = compute() + payload = json.dumps(receipt, indent=2) + '\n' + if args.write: + with args.write.open('x') as f: + f.write(payload) + else: + require(json.dumps(receipt, sort_keys=True) == + json.dumps(json.loads((PACKAGE/'EXPECTED.json').read_text()), sort_keys=True), + 'receipt mismatch') + generated = lean_data(receipt) + if args.emit_lean: + with args.emit_lean.open('x') as f: + f.write(generated) + else: + require(generated == (PACKAGE/'SourceCut.lean').read_text(), 'Lean source binding mismatch') + print('PASS_TRANSPORT_CUT_BINDING sources=104 crossings=8 transports=1410 controls=12 formal_not_run') + + +if __name__ == '__main__': + main()