feat(Logics/Propositional): five-primitive formula type with primitive bot#648
feat(Logics/Propositional): five-primitive formula type with primitive bot#648benbrastmckie wants to merge 3 commits into
Conversation
047b396 to
b041ae7
Compare
Session: sess_$(date +%s)_$(od -An -N3 -tx1 /dev/urandom | tr -d ' ')
Add Kamp1968, Xu1988, Venema1993SinceUntil to references.bib. Update pr-description.md with Burgess/Xu/Venema/GHR citations, Zulip discussion link, and PR leanprover#648 dependency reference. Session: sess_1781487302_dddcf1
Stack Modal PR on feat/propositional-v2 (PR leanprover#648) like PR leanprover#649 does, keeping it independent of temporal additions. Two-PR chain, not three. Session: sess_1781531573_4cdbb4
Stack on PR leanprover#648 (not leanprover#649), diplomatic PR description as first-class deliverable, integrate PR landscape audit (report 06). Session: sess_1781532709_eb0889
Diplomatic PR description for Modal/ formula primitives refactoring, stacking on PR leanprover#648. Coordinates with PRs leanprover#607, leanprover#528, leanprover#535, leanprover#649. Session: sess_1781535860_c7d8e9
There was a problem hiding this comment.
Some general comments:
- I like the idea of adding \bot as a primitive.
- I don't understand why we need both Semantics/Basic.lean and Semantics/Bool.lean. I think the latter alone is enough. Later we can add (for example) Kripke semantics for intuitionistic propositional logic.
- It is not helpful to the readers to refer to old papers from the 1930s, some of which are in German. A good modern reference is Jeremy Avigad's textbook:
https://www.cambridge.org/core/books/mathematical-logic-and-computation/300504EAD8410522CE0C27595D2825A2
whose chapters 2 and 3 covers everything in this PR. - You should definitely coordinate this PR with #607 abd #587. #536 is ready to merge, so you should wait for it.
|
I think the refactor to
Re the renaming Please split the semantics development into a separate PR. The point of requesting that large contributions are split up is not just length, but also so that conceptually separate issues can be discussed independently. FWIW, as I mentioned on zulip, imo the right way to resolve the Re the references, I agree with @ctchou about citing literature in English — the Gentzen paper is my bad, I read it in translation (in "The Collected Papers of Gerhard Gentzen" ed M. E. Szabo). |
6083b4c to
7cc0961
Compare
|
@ctchou @thomaskwaring Thank you both for the thoughtful feedback — I've reworked the PR to address each point. Changes made:
On the On bot as primitive vs atom: The key distinction is that in minimal logic bot is an unconstrained logical constant (a nullary operator), not an atom — no axioms constrain its denotation, but it's fixed under substitution. With primitive On Looking forward to your thoughts on the revised version! |
Refocused from PR leanprover#649 to PR leanprover#648 (feat/propositional-v2). Updated task description and created 6-phase plan for bot refactor. Session: sess_1781632241_ba8d68
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3-phase plan for drafting PR description, PR comment, and Zulip response for PR leanprover#648 review. All outputs target specs/tmp/ for user review. Session: sess_1781646913_02137d
Delete Proposition.instBot_eq and Proposition.instTop_eq theorems from Cslib/Logics/Propositional/Defs.lean. These two theorems auto-include the [DecidableEq Atom] section variable which they do not use, triggering unusedSectionVars/unusedDecidableInType warnings that --wfail promotes to build errors. PR leanprover#648 already removed these theorems in its direction. Session: sess_1781650791_5f754f Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Delete Proposition.instBot_eq and Proposition.instTop_eq theorems from Cslib/Logics/Propositional/Defs.lean. These two theorems auto-include the [DecidableEq Atom] section variable which they do not use, triggering unusedSectionVars/unusedDecidableInType warnings that --wfail promotes to build errors. PR leanprover#648 already removed these theorems in its direction. Session: sess_1781650791_5f754f Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Phase 1: Deleted instBot_eq/instTop_eq from Defs.lean (CI fix) Phase 2: Removed snce past-time operator from Temporal.Formula Phase 3: Blocked on PR leanprover#648 approval Session: sess_1781650791_5f754f
Rebase feat/temporal-formula-propositional onto feat/propositional-v2 head (7cc0961). Resolved conflicts in Connectives.lean, Defs.lean, Basic.lean, Theory.lean — taking PR leanprover#648 as base, adding temporal classes on top. All CI checks pass: lake build, checkInitImports, lint-style, lint, lake test. instIsIntuitionisticIntuitionisticCompletion preserved, instBot_eq/instTop_eq absent, snce removed. Force-pushed to origin with --force-with-lease. Session: sess_1781650791_5f754f Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
225: Implement GHA algebraic semantics with primitive bot on main 226: Cherry-pick from main to create PR stacked on leanprover#648 Session: sess_1750107600_orchestrate
… findings Session: sess_1750130000_research227 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> task 228: complete implementation Fix two docstring issues in PR leanprover#648: update intuitionisticCompletion docstring to reflect primitive bot semantics, and change "five-primitive propositional signature" to "five constructors" in Connectives.lean module doc. Session: sess_1750217870_a3b2c1 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> task 228: complete orchestration Session: sess_1750217870_a3b2c1 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…#648 refresh Recreates the four tasks lost during the main cleanup, aligned with Thomas Waring's closing recommendation in the CSLib Zulip "Propositional Logic" thread (606970606) and our synthesis decision: - 398 efq_nd_rule_ipl_base_keep_mpl: make IPL the base logic (efq as a primitive ND rule) while PRESERVING all completed MPL metatheory as a retained layer. Depends on 397 (green main). - 399 refresh_pr648_ipl_base_foundation: update PR leanprover#648 to the settled IPL-base foundation (refs + Zulip link), small + upstream-based cherry pick, connectives excluded. Depends on 398. - 400 reconcile_connectives_pr607: unbundle connectives, reconcile with fmontesi PR leanprover#607 (Waring flag a). - 401 polymorphic_evaluator_bool_prop_dpll: AlgEvaluate at Bool/Prop for DPLL (Doty/Waring). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NarRy36MgZCZP7TRsrL5Df
…st-merge) Post-merge vet of the merged Propositional development. CI: build/test/ checkInitImports/lint-style PASS; lake lint FAILS (54 errors). PR leanprover#648 foundation slice (Defs.lean + NaturalDeduction/Basic.lean) is lint-clean. - Refresh 386: 21 PL-specific lint violations (accurate post-merge scope). - New 406: 33 cross-cutting lint (Modal/Temporal/Bimodal/Foundations); absorbs 394. - Refresh 390 (ORGANISATION.md), 387 (PL->Propositional, upstream-gated), 384 (sorry location -> Minimal/Completeness.lean:110). - Abandon 394 (absorbed into 406). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NarRy36MgZCZP7TRsrL5Df
…e bot Add `bot` as a primitive constructor of `Proposition Atom`, eliminating all `[Bot Atom]` constraints from propositional logic signatures. - New `Connectives.lean`: typeclass hierarchy (HasBot, HasImp, HasAnd, HasOr) - `Defs.lean`: five-primitive Proposition type with derived neg, top, iff - `Basic.lean`: natural deduction with impI/impE, andI/andE1/andE2, orI1/orI2 - `Theory.lean`: remove [Bot Atom], add instIsIntuitionisticIntuitionisticCompletion - Replace German-language references with Avigad 2022, Prawitz 1965 - Semantics files deferred to follow-up PR per reviewer request Reconciles with merged PR leanprover#536 (InferenceSystem-parameterized typeclasses). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update intuitionisticCompletion docstring — the old wording "Attach a bottom element" was misleading since bot is already a constructor. Change "five-primitive propositional signature" to "five constructors" in Connectives.lean to avoid conflating generators with operations. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
82f983a to
63cd13c
Compare
… falso Promote ex falso quodlibet (bottom-elimination) to an ungated primitive constructor of the natural-deduction Derivation, so IPL is the base propositional logic and the primitive bot constructor has an inference rule. IPL becomes the empty base theory; CPL still adds double negation elimination. The minimal-logic (MPL) layer is deferred to a separate PR: this removes MPL, the IsIntuitionistic typeclass, intuitionisticCompletion, and the derived efq rules, keeping the classical layer (byContra/lem/pierce and the IsClassical instances for CPL/LEM/Pierce) intact, re-proved via the efq constructor. Per reviewer feedback (Waring, CSLib Zulip 'Propositional Logic'): - Drop the connective typeclasses (Foundations/Logic/Connectives.lean and its registration instances) -- a separate development handled via PR leanprover#607. - Restore references (Gentzen 1935, Prawitz 1965, Troelstra-van Dalen 1988) and add the CSLib Zulip thread link. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019sHZHp7U5qSiEzioK1nGEH
63cd13c to
65a3af7
Compare
Summary
Revises PR #648 based on reviewer feedback (thomaskwaring, msg 606970606). Adds
botas a primitive constructor ofProposition(eliminating all[Bot Atom]constraints) and makes IPL the base logic by taking ex falso quodlibet as a primitive natural-deduction rule. Rebased on upstream/main post-#536.Key changes from #648:
botis a primitive constructor (not an atom), so explosion andIsClassicalno longer require[Bot Atom]efqconstructor ofDerivation), so⊥has an inference rule and IPL is the base logic; minimal logic (MPL) is set aside for a separate PR/discussion, per the agreed compromiseimp/impI/impE(renamed fromimpl/implI/implEfor consistency with FormalizedFormalLogic convention; open to reverting if reviewers preferimpl)Connectives.lean)Modified files
Cslib/Logics/Propositional/Defs.lean--Propositionwith primitivebot; derivedneg,top,iff;IPLis the empty base theory andCPLadds double-negation elimination (theMPL/IsIntuitionistic/intuitionisticCompletionlayer is set aside for the minimal-logic PR)Cslib/Logics/Propositional/NaturalDeduction/Basic.lean-- derivation constructorsimpI/impE,andE1/andE2,orI1/orI2with explicitΓarguments, plus the new primitiveefq(⊥-elimination); implementation notes, references, and Zulip-thread linkCslib/Logics/Propositional/NaturalDeduction/Theory.lean--[Bot Atom]removed; the classical layer (IsClassical,byContra/lem/pierce, and theCPL/LEM/Pierceinstances) re-proved over the new base via theefqconstructorreferences.bib-- addedAvigad2022,Gentzen1935,Prawitz1965,TroelstraVanDalen1988Design rationale
Primitive
boteliminates[Bot Atom]constraints throughout the propositional logic API, givesProposition.substa natural recursive case forbot, and follows the standard treatment in Avigad (2022) wherebotis a logical constant rather than an atomic proposition. The trade-off (noted by thomaskwaring) is an extrabotcase in structural recursions. Relatedly, taking ex falso as a primitive rule rather than leaving⊥a constructor with no inference behaviour follows the standard natural-deduction treatment (Gentzen 1935, Prawitz 1965, Troelstra & van Dalen 1988) and is thomaskwaring's recommendation; minimal logic — the efq-free fragment — is deferred so the fragment design can be settled on its own.These benefits extend to planned completeness work for modal and temporal logics: primitive
botensuresProposition.substpreserves bottom structurally (subst f .bot = .bot), whereas atom-encoded bot requires additional constraints to preventsubst f (.atom ⊥) = f ⊥from mapping bottom to an arbitrary formula. As thomaskwaring notes, non-bottom-preserving maps are also useful (e.g., conservativity results viaWithBot.some).Coordination
Connectives.lean. One design point for feat(Logic): logical operators #607: it makes negation primitive (HasNot) with no⊥/⊤class, but a⊥-primitiveProposition(where¬φ := φ → ⊥and⊤ := ⊥ → ⊥) registers faithfully by reusing Mathlib'sBot/Toptogether with a derivedHasNot(not := neg) and a(φ → ⊥) = ¬φgrind bridge — no separateHasBotclass needed. I'll leave a review on feat(Logic): logical operators #607.Deferred
Bool.lean, evaluation) -- follow-up PR; thePropvsBoolvsGeneralizedHeytingAlgebraquestion (raised by thomaskwaring and ctchou) will be addressed there.AI Tools Used
Claude Code was used to refactor for primitive
efq/IPL-base, remove the connective typeclasses and the minimal-logic layer, rebase onto upstream/main and resolve thereferences.bibconflict, and verify CI. All mathematical decisions reviewed.