Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6c01819
fix(ci): unbreak Agda type-check install + Justfile heal duplicate
claude Jun 5, 2026
7f94f89
fix(proofs): fix all remaining idris2 + Agda scope errors
claude Jun 5, 2026
0a190ba
fix(proofs): repair full proof corpus — Coq, Lean4, Agda, Idris2
claude Jun 5, 2026
757762d
ci(proofs): gate the dogfood proof corpus (Coq, Lean, Agda, Idris val…
claude Jun 5, 2026
d75d5bb
ci(proofs): ASCII-only comments in dogfood-proofs-ci
claude Jun 5, 2026
f1612ab
ci(proofs): bisect dogfood startup_failure — minimal skeleton
claude Jun 5, 2026
7f95385
ci(proofs): bisect — restore Coq job only
claude Jun 5, 2026
12321b3
ci(proofs): bisect — isolate taiki install-action step
claude Jun 5, 2026
eac87fc
ci(proofs): bisect — curl-install just instead of marketplace action
claude Jun 5, 2026
7c6a602
ci(proofs): restore full dogfood corpus CI without marketplace setup …
claude Jun 5, 2026
75ec354
ci(proofs): fetch Agda stdlib from GitHub (apt --fix-missing dropped it)
claude Jun 5, 2026
5710743
merge: bring loving-cannon up to origin/main (absorb merged #256-#274)
claude Jun 21, 2026
658751d
ci(proofs): gate Lean 4 verification corpus (verification/proofs/lean4)
claude Jun 21, 2026
318f4d9
ci(proofs): gate the Idris2 verification corpus (verification/proofs/…
claude Jun 21, 2026
ff98eb5
merge: sync loving-cannon with main (absorb #275 Lean gate squash)
claude Jun 21, 2026
d614b64
merge: sync loving-cannon with main (absorb #276 Idris2 gate squash)
claude Jun 21, 2026
3f52a53
ci(proofs): weekly cron gating the Isabelle + Mizar self-proof corpora
claude Jun 21, 2026
5fe25a8
ci(proofs): add path-filtered pull_request trigger to verification cron
claude Jun 21, 2026
a31b679
ci(proofs): discover Isabelle/Mizar download URLs at runtime
claude Jun 21, 2026
0f9bbb7
ci(proofs): fix GroupTheory import + Mizar two-stage discovery
claude Jun 21, 2026
f18545b
ci(proofs): gate base-HOL Isabelle only; fix Mizar binary PATH
claude Jun 21, 2026
884d96a
ci(proofs): make Mizar recipe diagnostic (dump .err + source per file)
claude Jun 21, 2026
0e1fc49
merge: sync loving-cannon with main (absorb #277 cron squash)
claude Jun 21, 2026
81e29ee
fix(proofs): repair Isabelle Nat/List corpus (rename + nat annotations)
claude Jun 21, 2026
7fca2d3
fix(proofs): annotate remaining polymorphic Isabelle nat/list lemmas
claude Jun 21, 2026
87454f0
merge: sync with main (absorb #278 squash)
claude Jun 21, 2026
91b3856
merge: sync with main (absorb #279 squash)
claude Jun 21, 2026
cabcf7d
fix(proofs): finish Isabelle base; descope Mizar; fix verif-idris perms
claude Jun 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/dogfood-proofs-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,12 @@ jobs:
(cd /tmp/idris2-src && make bootstrap SCHEME=scheme && sudo make install PREFIX=/usr/local)
}
idris2 --version
# The source-build fallback runs `sudo make install`, which can leave
# ~/.idris2 root-owned; `idris2 --install` (run unprivileged by the
# proofs-verif-idris recipe) then fails with "Permission Denied". Make
# the user package dir writable so the echidnaabi install succeeds.
mkdir -p "$HOME/.idris2"
sudo chown -R "$(id -u):$(id -g)" "$HOME/.idris2"

- name: Install just
run: |
Expand Down
84 changes: 11 additions & 73 deletions .github/workflows/verification-proofs-cron.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
# SPDX-License-Identifier: MPL-2.0
# Weekly verification of the heavier self-proof corpora that are too slow and too
# network-heavy to gate on every PR: Isabelle/HOL (proofs/isabelle) and Mizar
# (proofs/mizar). Both toolchains are large, non-apt downloads -- Isabelle is a
# ~500MB tarball and additionally builds the HOL-Algebra image; Mizar ships only
# from mizar.org (Tier-4 in this project, see live-provers.yml) with its full MML.
# So this runs on a weekly schedule plus manual dispatch, mirroring container-ci.
# network-heavy to gate on every PR: currently Isabelle/HOL (proofs/isabelle). The
# Isabelle toolchain is a large, non-apt download (~500MB tarball), so this runs on
# a weekly schedule plus manual dispatch, mirroring container-ci.
#
# NOTE: the Mizar corpus (proofs/mizar) is intentionally NOT gated here yet -- its
# .miz files have genuine verification errors and Mizar is the project's mock-only
# Tier-4 tail; repairing + gating it is tracked separately (see issue). The
# proofs-mizar just recipe remains for local/manual use.
# `just` stays the single source of truth for the commands (RSR-H14): CI installs
# the toolchains, then calls the same recipes a developer runs locally.
name: Verification Proof Corpora (weekly)
Expand All @@ -13,14 +16,13 @@ on:
schedule:
- cron: '17 4 * * 1' # Mondays 04:17 UTC
workflow_dispatch:
# Tightly path-filtered: a PR that actually touches these proof corpora (or this
# Tightly path-filtered: a PR that actually touches the Isabelle corpus (or this
# workflow) gets one confirmation run, but unrelated PRs never trigger the heavy
# toolchains. The weekly schedule above is the primary gate; this just catches
# direct edits to the .thy/.miz sources before they land.
# toolchain. The weekly schedule above is the primary gate; this just catches
# direct edits to the .thy sources before they land.
pull_request:
paths:
- 'proofs/isabelle/**'
- 'proofs/mizar/**'
- '.github/workflows/verification-proofs-cron.yml'

concurrency:
Expand Down Expand Up @@ -78,67 +80,3 @@ jobs:

- name: Verify Isabelle corpus
run: just proofs-isabelle

mizar:
name: Mizar
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

- name: Install Mizar (system + MML)
run: |
set -euo pipefail
# Mizar ships only from mizar.org with no stable, documented path (the
# /system/i386-linux/ guess 404s). Discover the linux tarball by scraping
# the system index; dump candidate hrefs so one run reveals the layout if
# discovery misses.
# Two-stage discovery: mizar.org/system/ only links to per-arch *directories*
# on the upstream host (http://mizar.uwb.edu.pl/.../i386-linux/); the actual
# tarball lives inside that directory.
sys="$(curl -fsSL --max-time 120 --retry 3 "http://mizar.org/system/" || true)"
dir="$(printf '%s\n' "$sys" | grep -oiE 'href="http://[^"]*i386-linux/?"' \
| sed -E 's/^href="//I; s/"$//' | head -1)"
[ -n "$dir" ] || dir="http://mizar.uwb.edu.pl/~softadm/pub/system/i386-linux/"
dir="${dir%/}/"
echo "Mizar i386-linux dir: $dir"
idx="$(curl -fsSL --max-time 120 --retry 3 "$dir" || true)"
echo "=== .tar candidates in $dir ==="
printf '%s\n' "$idx" | grep -oiE 'href="[^"]+"' | grep -iE '\.tar' | head -40 || true
rel="$(printf '%s\n' "$idx" | grep -oiE 'href="[^"]*mizar-[^"]*i386-linux\.tar"' \
| sed -E 's/^href="//I; s/"$//' | sort -V | uniq | tail -1)"
[ -n "$rel" ] || rel="$(printf '%s\n' "$idx" | grep -oiE 'href="[^"]*\.tar"' \
| sed -E 's/^href="//I; s/"$//' | sort -V | uniq | tail -1)"
[ -n "$rel" ] || { echo "no Mizar .tar found in $dir" >&2; exit 1; }
case "$rel" in http*) found="$rel" ;; /*) found="http://mizar.uwb.edu.pl$rel" ;; *) found="$dir$rel" ;; esac
echo "Resolved Mizar URL: $found"
curl -fsSL --max-time 600 --retry 3 -o /tmp/mizar.tar "$found"
mkdir -p "$HOME/mizar"
tar xf /tmp/mizar.tar -C "$HOME/mizar"
echo "=== outer archive contents ==="; ls -la "$HOME/mizar" | head -30
cd "$HOME/mizar"
for inner in mizbin mizshare mizdoc; do
for ext in tar.gz tgz tar; do
[ -f "$inner.$ext" ] && { echo "extracting $inner.$ext"; tar xf "$inner.$ext"; }
done
done
echo "=== after inner extraction ==="; ls -la "$HOME/mizar" | head -40
# mizbin.tar.gz extracts the binaries (makeenv, accom, verifier, ...) flat
# into $HOME/mizar alongside the MML share, so both PATH and MIZFILES point
# at $HOME/mizar -- there is no bin/ subdir.
echo "MIZFILES=$HOME/mizar" >> "$GITHUB_ENV"
echo "$HOME/mizar" >> "$GITHUB_PATH"
ls -l "$HOME/mizar/makeenv" "$HOME/mizar/verifier" "$HOME/mizar/accom"

- name: Install just
run: |
set -euo pipefail
curl -fsSL --retry 3 \
"https://github.com/casey/just/releases/download/1.51.0/just-1.51.0-x86_64-unknown-linux-musl.tar.gz" \
-o /tmp/just.tar.gz
mkdir -p "$HOME/.local/bin"
tar xzf /tmp/just.tar.gz -C "$HOME/.local/bin" just
echo "$HOME/.local/bin" >> "$GITHUB_PATH"

- name: Verify Mizar corpus
run: just proofs-mizar
2 changes: 1 addition & 1 deletion proofs/isabelle/EchidnaList.thy
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,6 @@ text \<open>

lemma list_all_filter:
"list_all P xs \<longleftrightarrow> filter P xs = xs"
by (induction xs; auto)
by (simp add: list_all_iff filter_id_conv)

end
31 changes: 11 additions & 20 deletions proofs/isabelle/EchidnaNat.thy
Original file line number Diff line number Diff line change
Expand Up @@ -103,19 +103,19 @@ text \<open>
\<close>

lemma mult_assoc:
"(m * n) * p = m * (n * p)"
"((m::nat) * n) * p = m * (n * p)"
by simp

text \<open>
Distributive law: multiplication distributes over addition.
\<close>

lemma mult_distrib_left:
"m * (n + p) = m * n + m * p"
"(m::nat) * (n + p) = m * n + m * p"
by (simp add: ring_distribs)

lemma mult_distrib_right:
"(m + n) * p = m * p + n * p"
"((m::nat) + n) * p = m * p + n * p"
by (simp add: ring_distribs)

section \<open>Induction Examples\<close>
Expand Down Expand Up @@ -175,25 +175,16 @@ qed

lemma factorial_monotone:
"n > 0 \<Longrightarrow> factorial n \<ge> n"
proof (induction n)
proof (cases n)
case 0
then show ?case by simp
then show ?thesis by simp
next
case (Suc n)
show ?case
proof (cases n)
case 0
then show ?thesis by simp
next
case (Suc m)
have "factorial (Suc n) = Suc n * factorial n"
by simp
also have "... \<ge> Suc n * 1"
using factorial_positive[of n] by simp
also have "... = Suc n"
by simp
finally show ?thesis .
qed
case (Suc k)
have "(1::nat) \<le> factorial k"
using factorial_positive[of k] by simp
hence "Suc k * 1 \<le> Suc k * factorial k"
by (rule mult_le_mono2)
thus ?thesis using Suc by simp
qed

section \<open>Power Function\<close>
Expand Down
Loading