A Triple Certified Proof that Core Logic is not Paraconsistent
Table of Contents
This note establishes, with machine-checked certifications in Coq, Lean 4 and Athena, that Core logic is not paraconsistent: Tennant’s Claim 1 — the antisequent \(\lnot A, A \nvdash B\) — entails a contradiction in Core logic. The proof is purely logical, in four steps within a five-rule fragment \(\mathcal{F}\) of Core logic and its refutation system in the sense of Łukasiewicz and Goranko; every step is certified.
Tennant has invented a logical system that he calls “Core logic” (for short, \(\mathbb{C}\)) and that he claims paraconsistent [1, p. 156], that is to say, in agreement with the negative definition of paraconsistency, a system in which the sequent
\begin{equation} \label{eq:1} \lnot A, A \vdash B \end{equation}is false, i.e. its corresponding antisequent, in other words, its negation represented as follows
\begin{equation} \lnot A, A \nvdash B \tag{Claim 1}\label{claim1} \end{equation}is true, like in minimal logic (for short, M). Tennant indeed asserts this semantic antisequent himself [1, p. 186]:
\begin{equation} \label{eq:2} \lnot A, A \nvDash B \end{equation}Assuming that \(\mathbb{C}\) is sound, \eqref{claim1} is thus granted on Tennant’s own terms. Last, to be complete on this topic, it must be stressed that \(\mathbb{C}\)’s paraconsistency is claimed as being only “at the level of the turnstile” [1, p. 41], where the differences between this system and minimal or intuitionistic logic are established [1, p. 43]. But the following theorem makes indefensible the theory according to which \(\mathbb{C}\) is paraconsistent:
1. Theorem
The theory according to which \(\mathbb{C}\) is paraconsistent is false, because \eqref{claim1} entails a contradiction in \(\mathbb{C}\). Therefore, to preserve consistency, the Core logician must reject \eqref{claim1}, that is to say the claim that his system is paraconsistent.
The proof below is purely logical: four steps in \(\mathcal{F}\), readable without any proof assistant. Every step is certified in Coq and in Lean 4; the last section explains, once the four steps have been read, exactly what the proof files establish and how.
Proof in four steps, in \(\mathcal{F}\) and in its refutation system in the sense of Łukasiewicz and Goranko.
| \begin{prooftree} \AxiomC{} \RightLabel{\scriptsize{\textit{Ax.}}} \UnaryInfC{$A \vdash A$} \end{prooftree} | ||
| \begin{prooftree} \AxiomC{$\Delta \vdash A$} \RightLabel{\scriptsize{$L\lnot$}} \UnaryInfC{$\lnot A, \Delta \vdash$} \end{prooftree} | \begin{prooftree} \AxiomC{$\Delta \vdash B$} \RightLabel{\scriptsize{$R\to$}} \UnaryInfC{\(\Delta \backslash \{A\} \vdash A \to B\)} \end{prooftree} | |
| \begin{prooftree} \AxiomC{$\Delta \vdash A$} \AxiomC{$B, \Gamma \vdash C$} \RightLabel{\scriptsize{$L\to$}} \BinaryInfC{$A \to B, \Delta, \Gamma \vdash C$} \end{prooftree} | \begin{prooftree} \AxiomC{$A, \Delta \vdash$} \RightLabel{\scriptsize{\(R\to_{\mathbb{C}}\)}} \UnaryInfC{$\Delta \vdash A \to B$} \end{prooftree} |
Table 1 reproduces a fragment \(\mathcal{F}\) of the rules of \(\mathbb{C}\) [1, pp. 159–163]. The label \(R\to_{\mathbb{C}}\) is mine, not Tennant’s; I use it because it is the only Core-specific rule in \(\mathcal{F}\), the other four being exactly the same as in minimal logic (for short, M). These four shared rules constitute \(\mathcal{F}\) under its minimal reading \(\mathcal{F}_{\mathbf{M}}\); adding \(R\to_{\mathbb{C}}\) yields its Core reading \(\mathcal{F}_{\mathbb{C}}\). Every rule of \(\mathcal{F}_{\mathbf{M}}\) is a rule of \(\mathbb{C}\).
Two remarks:
1. In this syntax, \[\Delta \vdash B\] presupposes that \(\Delta\) is consistent, otherwise \[\Delta \vdash\] must be written.
2. In textbooks, rule \(R\to\) is usually written as
\begin{prooftree} \AxiomC{$A, \Delta \vdash B$} \RightLabel{\scriptsize{$R\to$}} \UnaryInfC{$\Delta \vdash A \to B$} \end{prooftree}The unusual form of rule \(R\to\) in Table 1 means that, with consistent contexts, the discharge of A is optional.
1.1. DNS.1 and DNS.2 are derivable
`DNS’ being an acronym for `Double Negation à la Slaney’ [2], I call `DNS.1’ and `DNS.2’ the rules listed in Table 2 below, together with their respective derivations in \(\mathcal{F}\), which prove that they are derivable in \(\mathbb{C}\). (By definition, a rule is derivable in a given system of rules if its conclusion is derivable from its premisses within the system [3, p. 47].)
| \begin{prooftree}\AxiomC{$A, \Delta \vdash B$}\RightLabel{\scriptsize{DNS.1}}\UnaryInfC{$(A \to B) \to B, \Delta \vdash B$}\end{prooftree} | \begin{prooftree}\AxiomC{$A, \Delta \vdash$}\RightLabel{\scriptsize{DNS.2}}\UnaryInfC{$(A \to B) \to B, \Delta \vdash B$}\end{prooftree} | |
| \begin{prooftree}\AxiomC{$A, \Delta \vdash B$}\RightLabel{\scriptsize{$R\to$}}\UnaryInfC{$\Delta \vdash A \to B$}\AxiomC{} \RightLabel{\scriptsize{$Ax$}}\UnaryInfC{$B \vdash B$}\RightLabel{\scriptsize{$L\to$}}\BinaryInfC{$(A \to B) \to B, \Delta \vdash B$}\end{prooftree} | \begin{prooftree}\AxiomC{$A, \Delta \vdash$}\RightLabel{\scriptsize{\(R\to_{\mathbb{C}}\)}}\UnaryInfC{$\Delta \vdash A \to B$} \AxiomC{}\RightLabel{\scriptsize{$Ax$}}\UnaryInfC{$B \vdash B$}\RightLabel{\scriptsize{$L\to$}}\BinaryInfC{$(A \to B) \to B, \Delta \vdash B$}\end{prooftree} |
1.2. DNS.1 is invertible
A rule is invertible when, from the derivability of a sequent of the form of its conclusion, the derivability of all its premisses follows [4, p. 93]. By inspection of the derivation of DNS.1 in Table 2 above, it is provable in \(\mathcal{F}_{\mathbf{M}}\) that DNS.1 is invertible.
Indeed, from root to top, this derivation starts from an application of rule \(L\to\), whose invertibility of the deduction on the right is trivial. On the left of this derivation, there is an application of rule \(R\to\). Consequently, DNS.1’s invertibility depends on \(R\to\)’s, which is provable in turn. Note that in his discussion of the converse of the Deduction theorem, Tennant himself acknowledged the invertibility of \(R\to\) [1, p. 46] and, because the context of \(R\to\) is assumed as consistent, the application of Cut i.e.
\begin{prooftree} \AxiomC{$\Delta \vdash A \to B$} \AxiomC{} \RightLabel{\scriptsize{$Ax$}} \UnaryInfC{$A \vdash A$} \AxiomC{} \RightLabel{\scriptsize{$Ax$}} \UnaryInfC{$B \vdash B$} \BinaryInfC{$A \to B, A \vdash B$} \RightLabel{\scriptsize{$Cut$}} \BinaryInfC{$A, \Delta \vdash B$} \end{prooftree}
is \(\mathbb{C}\)-admissible in this case [1, p. 154] and
therefore impossible to deny. Note also that, provably valid in M,
DNS.1 containing no negation, its invertibility cannot be invalid in
\(\mathbb{C}\); but, for the most skeptical reader, an invertibility
proof for DNS.1 is done by structural induction on derivation trees
in \(\mathcal{F}_{\mathbf{M}}\), both in
[5] and in mechanised proofs whose
links are given at the end of this note. The
\(\mathbb{C}\)-admissibility of Cut makes this proof of
invertibility easy, by contrast with the structural induction,
which is longer and harder but appeals to no Cut at all. Either
way, DNS.1 is derivable in \(\mathbb{C}\), and its invertibility is a
metatheorem of \(\mathcal{F}_{\mathbf{M}}\). That this invertibility
also governs \(\mathbb{C}\)’s own rejection assertions is the one
commitment that the final certified theorem displays as a named
hypothesis (anti_DNS1_rule_for_ℂ; named conservativity_at_DNS1 in
the Version 4 files) — precisely the overlap commitment of
[1, p. 35].
1.3. Deduction of \(\overline{DNS.1}\)
The invertibility of DNS.1 means that whenever the conclusion is derivable, the premiss is derivable too. By contraposition, whenever the premiss is not derivable, the conclusion is not derivable either. This is precisely rule \(\overline{DNS.1}\):
\begin{prooftree} \AxiomC{$A, \Delta \nvdash B$} \RightLabel{\scriptsize{$\overline{DNS.1}$}} \UnaryInfC{$(A \to B) \to B, \Delta \nvdash B$} \end{prooftree}In the terminology of refutation systems — the deductive systems for rejected statements initiated by Łukasiewicz [6] and developed for sequents by Tiomkin [7] and by Goranko [8]; for a survey, see [9] — \(\overline{DNS.1}\) is a refutation rule, and its licence is exactly Goranko’s correctness discipline for antisequent calculi: a refutation rule is correct when its converse is a correct rule, and the converse of \(\overline{DNS.1}\) is the invertibility of DNS.1, established above. \(\overline{DNS.1}\) is therefore not a meta-rule imported into the kernel from outside: it is a rule derivable from the kernel’s own invertibility, latent in the shadow of the system.
1.4. Deduction of the contradiction
This point is the conclusion of the proof: as premiss of \(\overline{DNS.1}\), \eqref{claim1} entails an antisequent which is in contradiction with a consequence of DNS.2:
\begin{prooftree} \AxiomC{} \RightLabel{\scriptsize{(Claim 1)}} \UnaryInfC{$\lnot A, A \nvdash B$} \RightLabel{\scriptsize{$\overline{DNS.1}$}} \UnaryInfC{$\lnot A, (A \to B) \to B \nvdash B$} \AxiomC{} \RightLabel{\scriptsize{\emph{Ax.}}} \UnaryInfC{$A \vdash A$} \RightLabel{\scriptsize{$L\lnot$}} \UnaryInfC{$\lnot A, A \vdash$} \RightLabel{\scriptsize{DNS.2}} \UnaryInfC{$\lnot A, (A \to B) \to B \vdash B$} \BinaryInfC{$\bot$} \end{prooftree}Therefore, \eqref{claim1} cannot be maintained in \(\mathbb{C}\) without contradiction: if Core logic is consistent, it cannot be paraconsistent. \(\blacksquare\)
2. Corollary
Tennant claims that this second antisequent
\begin{equation} \label{claim2} \tag{Claim 2} \lnot A, A \nvdash \lnot B \end{equation}is also true in Core logic, by contrast with M, which explains that in the Figure of logical system inclusions [1, p. 35] Tennant draws an overlap of \(\mathbb{C}\) on M. But, this is a mistake, because such a claim entails the same inconsistency, hence this corollary of the previous theorem:
\eqref{claim2} is false, therefore it cannot establish correctly that \(\mathbb{C}\) overlaps minimal logic.
Proof. \eqref{claim2} meets exactly the same contradiction:
\begin{prooftree} \AxiomC{} \RightLabel{\scriptsize{(Claim 2)}} \UnaryInfC{$\lnot A, A \nvdash \lnot B$} \RightLabel{\scriptsize{$\overline{DNS.1}$}} \UnaryInfC{$\lnot A, (A \to \lnot B) \to \lnot B \nvdash \lnot B$} \AxiomC{} \RightLabel{\scriptsize{\emph{Ax.}}} \UnaryInfC{$A \vdash A$} \RightLabel{\scriptsize{$L\lnot$}} \UnaryInfC{$\lnot A, A \vdash$} \RightLabel{\scriptsize{DNS.2}} \UnaryInfC{$\lnot A, (A \to \lnot B) \to \lnot B \vdash \lnot B$} \BinaryInfC{$\bot$} \end{prooftree}Therefore, \eqref{claim2} is false and cannot establish correctly that \(\mathbb{C}\) overlaps minimal logic. \(\blacksquare\)
3. Certification
What do the proof files certify, exactly? Every step of the proof
just read. Step 1: DNS.1 and DNS.2 are derivable — DNS.1 uniformly
in the two readings of \(\mathcal{F}\), since its derivation uses
only the four shared rules, and DNS.2 in \(\mathcal{F}_{\mathbb{C}}\)
through \(R\to_{\mathbb{C}}\). Step 2: DNS.1 is invertible in
\(\mathcal{F}_{\mathbf{M}}\), by one structural induction on
derivations, without Cut. Step 3: the rule \(\overline{DNS.1}\)
is a metatheorem of \(\mathcal{F}_{\mathbf{M}}\), proved as the
contrapositive of that invertibility — Goranko’s converse-correctness
licence [8], mechanised — and the refutation system
whose only rejection axiom is \eqref{claim1} and whose only
refutation rule is \(\overline{DNS.1}\) is Ł-correct for
\(\mathcal{F}_{\mathbf{M}}\): everything it rejects is underivable
there. Step 4: the contradiction, certified in two forms — as the
Ł-incorrectness of the same refutation system for
\(\mathcal{F}_{\mathbb{C}}\), which rejects a sequent that
\(\mathcal{F}_{\mathbb{C}}\) derives, and as a conditional theorem
(claim1_false) whose two hypotheses, \eqref{claim1} itself and the
commitment that the kernel’s refutation rule governs
\(\mathbb{C}\)’s rejection assertion, are displayed rather than
hidden. The proof above is therefore not illustrated by the machine
after the fact: it is covered by it, step by step; and whoever wishes
to resist the conclusion must reject one of the two displayed
hypotheses — at the price, for the second, of giving up the
refutation discipline of the very kernel that grounds the overlap of
\(\mathbb{C}\) with \(\mathbf{M}\).
The Theorem receives its certified proofs in
- Coq,
- Lean Comparator Live (Experimental),
- Athena (which certifies the earlier presentation of the argument; its update to the present version is in progress);
and the Corollary follows by the same reasoning, mutatis mutandis.
These certifications differ in their logical foundations, and that
difference is precisely their joint interest. The Coq script is the
reference version: built on dependent type theory, it establishes
the invertibility of DNS.1 and the rule \(\overline{DNS.1}\) as
metatheorems of \(\mathcal{F}_{\mathbf{M}}\) by structural induction
on derivations, formalizes the refutation system itself — \eqref{claim1}
as its only rejection axiom, \(\overline{DNS.1}\) as its only
refutation rule — and certifies its two verdicts: Ł-correctness for
\(\mathcal{F}_{\mathbf{M}}\) and Ł-incorrectness for
\(\mathcal{F}_{\mathbb{C}}\). Its Print Assumptions command makes
its whole axiomatic basis auditable — it reports that every theorem is
closed under the global context: nothing is assumed, the two
principles the argument grants to Tennant being explicit hypotheses of
the final theorem.
The Lean 4 file is a port of that script into another kernel of the
same type-theoretic family; written in pure core Lean 4, without any
Mathlib dependency, it can be re-checked in the browser at the link
above, with nothing to install. It presents the very same argument:
the two principles granted to Tennant are, exactly as in the Coq
script, named hypotheses of its final theorem. The certified
statement is therefore a pure conditional — Tennant’s Claim 1,
together with the commitment that the kernel’s refutation rule
\(\overline{DNS.1}\) governs \(\mathbb{C}\)’s rejection assertion
(hypothesis anti_DNS1_rule_for_ℂ, named conservativity_at_DNS1 in
the Version 4 files), jointly entails absurdity —
resting on no non-logical axiom at all, as #print axioms reports.
This conditional form allows a further, independent layer of
verification. The Lean proof has been validated with the Lean
Comparator, the Lean project’s tool for checking a proof against a
trusted challenge: the challenge states the theorem, and the
comparator verifies that the candidate solution proves exactly that
statement, using no axiom beyond Lean’s three built-ins. The challenge file —
some two hundred lines stating the language, the rules of
\(\mathcal{F}\) under its two readings, the refutation system
Refutable, and the twelve certified statements — the derivability
of DNS.1 and DNS.2, the invertibility of DNS.1 in
\(\mathcal{F}_{\mathbf{M}}\) together with the underivability of
both sides of its decisive instance, \(\overline{DNS.1}\), the
Ł-correctness and Ł-incorrectness verdicts, the two conditional
collision theorems, and the two theorems settling the status of the
second hypothesis (claim1_holds_in_ℱ_ℂ and
anti_DNS1_Ł_incorrect_for_ℱ_ℂ, the latter named
ℱ_ℂ_not_conservative_at_DNS1 in Versions 4 and 5) — is the
entire trusted base of that check (SHA256:
6147a4234a2420a420d2c67eb145ace7b3d9ec14fc1e2dc368c35010e54804cc).
Nothing in the solution file itself needs to be read, or even trusted:
whatever that file contains, the comparator guarantees that it proves
exactly the statement of the challenge — neither a weaker one, nor a
cleverly disguised one — and that it smuggles in no axiom.
Beyond that one-click check, the Lean proof has been validated at the gold standard of the Lean reference manual: built in a sandbox and exported to a serialised proof term, it was replayed through two independently implemented kernels — Lean’s own and nanoda, written in Rust. On the author’s machine the command-line comparator reports, for the final theorem:
'claim1_false' depends on axioms: [propext]
Build completed successfully (3 jobs).
Running nanoda kernel on solution
Nanoda kernel accepts the solution
Running Lean default kernel on solution.
Lean default kernel accepts the solution
Your solution is okay!
Both kernels accept the proof term, whose only axiom is propext; the
statement they accept is, by construction, exactly that of the trusted
challenge. The result therefore depends neither on a single formalism,
nor on the author’s good faith, nor on the correctness of any one
kernel.
If you wish to reproduce this locally on your own machine, the
challenge, the solution and the comparator configuration are provided
in my Github repository: install a Lean toolchain with elan, build
comparator with the nanoda kernel enabled, and run it on that
configuration as described in the reference manual above.
Athena, by contrast, rests on a different paradigm altogether: a denotational proof language over many-sorted first-order logic, driven by automated provers rather than by a type-theoretic kernel. That the same contradiction is certified in two dependent type theories and in a first-order denotational language shows that this proof owes nothing to the idiosyncrasies of a single system: it is the logical result of the conjunction of the small fragment \(\mathcal{F}\) of \(\mathbb{C}\) and \eqref{claim1}, not an artefact of a specific formalism. The three source files are available on GitHub.
4. References