High-performance research software for Hilbert-style proof exploration
My free and open-source research software* tool, written in C++20, is meant to assist research in structural proof theory.
I made an effort to create an impressive README in GitHub-flavored Markdown — it turned out quite large. I am not worried about code quality but more about the project's perception as too complicated or messy.
I appreciate feedback and every star on GitHub.
There's also a mirror on Codeberg — but without forum functionality.
*It concerns a niche subject, but there are also undergraduate courses on logic for which it is already relevant — at some universities — so it is also educational software.
Summary
pmGenerator can build, (exhaustively) collect and compress formal proofs for user-definable sets of axioms in Hilbert systems.
- The current 1.2.1 release supports two rules of inference:
- D-rule: combines tree unification (on formulas) with modus ponens (⊢ψ,⊢ψ→φ ⇒ ⊢φ)
- N-rule: necessitation (⊢ψ ⇒ ⊢□ψ), can optionally be enabled
- D-rule: combines tree unification (on formulas) with modus ponens (⊢ψ,⊢ψ→φ ⇒ ⊢φ)
- The project's readme also highlights several systems for which I generated (downloadable) collections of minimal proofs.
- I launched a proof minimization challenge as part of the project. For this one I am currently implementing an improved proof compression algorithm and preparing a large contribution (hopefully to be released within a few weeks from now), improving from currently 126171 to less than 29000 proof steps, which shows there is still quite some air for anyone who wishes to immortalize themselves in this mathematical challenge! :-)
- Questions, suggestions and remarks can be posted in the project's forum. I'd be especially happy to support new challengers.
One of the tool's simplest features is that it can parse D-proofs to print them in terms of formulas.
For example, DD2D1D2DD2D1311
is a D-proof of 15 steps over three axioms, and
./pmGenerator -c -n -s CpCqp,CCpCqrCCpqCpr,CCNpNqCqp --parse DD2D1D2DD2D1311 -u
results in
[0] DD2D1D2DD2D1311:
1. 0→(¬0→0) (1)
2. ¬0→(¬1→¬0) (1)
3. (¬1→¬0)→(0→1) (3)
4. ((¬1→¬0)→(0→1))→(¬0→((¬1→¬0)→(0→1))) (1)
5. ¬0→((¬1→¬0)→(0→1)) (D):3,4
6. (¬0→((¬1→¬0)→(0→1)))→((¬0→(¬1→¬0))→(¬0→(0→1))) (2)
7. (¬0→(¬1→¬0))→(¬0→(0→1)) (D):5,6
8. ¬0→(0→1) (D):2,7
9. (¬0→(0→1))→((¬0→0)→(¬0→1)) (2)
10. (¬0→0)→(¬0→1) (D):8,9
11. ((¬0→0)→(¬0→1))→(0→((¬0→0)→(¬0→1))) (1)
12. 0→((¬0→0)→(¬0→1)) (D):10,11
13. (0→((¬0→0)→(¬0→1)))→((0→(¬0→0))→(0→(¬0→1))) (2)
14. (0→(¬0→0))→(0→(¬0→1)) (D):12,13
15. 0→(¬0→1) (D):1,14
where -c -n -s CpCqp,CCpCqrCCpqCpr,CCNpNqCqp
means (1): 0→(1→0)
, (2): (0→(1→2))→((0→1)→(0→2))
, and (3): (¬0→¬1)→(1→0)
are configured as axioms (which are given in normal Polish notation).
There are many more features, e.g. to generate, search, reduce, convert, extract data, … there is a full list in the readme.