1 Introduction

Classical and constructive provability match on several specific sets of propositions. In propositional logic, as a consequence of Glivenko’s theorem [1], a formula \(\lnot A\) is a classical theorem iff it is a constructive one. In arithmetic, a \(\varPi ^0_2\) proposition is a theorem in Peano arithmetic iff it is a theorem in Heyting arithmetic [2].

We present in this paper an efficient constructivization algorithm Construct for predicate logic in general, from cut-free classical sequent calculus LK to constructive sequent calculus LJ. Unlike the two previous examples, constructivization in predicate logic is as hard as constructive theorem proving. Therefore, as we expect Construct to terminate, Construct is incomplete in the sense that it may terminate with a failure output.

Construct consists of three linear-time steps:

  1. 1.

    An algorithm Normalize, designed to push occurrences of the right weakening rule towards the root in LK proofs. Its purpose is to limit the number of propositions appearing at the right-hand side of sequents in LK proofs.

  2. 2.

    A partial translation from cut-free LK to a new constructive system LI. This algorithm is referred to as Annotate as the LI system is designed as LK equipped with specific annotations – making it a constructive system. Annotate is the only step which may fail.

  3. 3.

    A complete translation Interpret from LI to LJ.

The Normalize step taken alone leads to a simple yet efficient constructivization algorithm Weak construct, which is defined to succeed whenever the result of Normalize happens to be directly interpretable in LJ, i.e. to have at most one proposition on the right-hand side of sequents in its proof.

The main property of Construct is to be provably complete on large fragments of predicate logic, in the sense that for any proposition A in one of these fragments, Construct is ensured to terminate successfully on any cut-free LK proof of A. Such fragments for which classical and constructive provability match will be referred to as constructive fragments. For instance, as a consequence of Glivenko’s theorem [1], the set of negated propositions is a constructive fragment of propositional logic. The completeness properties of Construct lead to the following results:

  • The identification of a new constructive fragment F, the fragment of assertions containing no negative occurrence of the connective \(\vee \) and no positive occurrence of the connective \(\Rightarrow \). Both Weak construct and Construct are provably complete on F.

  • The completeness of Construct on two already known constructive fragments. The first one, referred to as \(F_{Ku}\), appears as the set of fix points of a polarized version of Kuroda’s double-negation translation [3, 4]. The second one, referred to as \(F_{Ma}\), appears as a set of assertions for which any cut-free LK proof can be directly interpreted as a proof in Maehara’s multi-succedent calculus [5]. Hence, the completeness of Construct on these two fragments yields a uniform proof of two results coming from very different works.

After the introduction of basic notations and definitions, the two already known constructive fragments \(F_{Ku}\) and \(F_{Ma}\) are presented. Then, the Normalize step is presented along with the simple constructivization algorithm Weak construct. In the following section, the new constructive fragment F is defined, and Weak construct is proved complete on F. Then, the full constructivization algorithm Construct is introduced together with the proof of its completeness on F, \(F_{Ku}\) and \(F_{Ma}\). In the last part, experimental results of constructivization using Weak construct and Construct are presented. These experiments are based the classical theorem prover Zenon [10] and the constructive proof checker Dedukti [9].

2 Notations and Definitions

In the following, we only consider as primitive the connectives and quantifiers \(\forall \), \(\exists \), \(\wedge \), \(\vee \), \(\Rightarrow \) and \(\bot \). \(\lnot A\) is defined as \(A \Rightarrow \bot \). \(\top \), which doesn’t appear in this paper, could be defined as \(\bot \Rightarrow \bot \).

We use a definition of sequents based on multisets. The size of a multiset \(\varGamma \) will be referred to as \(|\varGamma |\). We will use the notation (A) to refer to a multiset containing either zero or one element. Given a multiset \(\varGamma = A_1, \cdots , A_n\), we will use the notations \(\lnot \varGamma \) and \(\varGamma \Rightarrow B\) as shorthands for \(\lnot A_1, \cdots , \lnot A_n\), and \(A_1 \Rightarrow B, \cdots , A_n \Rightarrow B\) respectively. Finally, we use the notation \(\bigvee \) to refer to an arbitrary encoding of the n-ary disjunction from the binary one – using \(\bot \) for the nullary case.

Definition 1

We define the cut-free classical sequent calculus LK with the following rules:

figure a

with the standard freshness constraints for the variables introduced in the rules \(\forall _R\) and \(\exists _L\).

Definition 2

We define the constructive sequent calculus LJ from LK, applying the following changes:

  • All rules except \(contr_R\), \(\vee _R\), \(\Rightarrow _L\) are restricted to sequents with at most one proposition on the right-hand side of sequents.

    For instance, \(\wedge _R\) becomes

  • There is no \(contr_R\) rule

  • The \(\vee _R\) rule is split into two rules  

  • The \(\Rightarrow _L\) rule becomes  

  • We add a cut rule

Remark 1

In these presentations of LK and LJ,

  • weakenings are applied to multisets instead of propositions  

  • \(\bot _L\) and axiom are not relaxed to and

These specific conventions are chosen to ease the definition of the algorithm Normalize in Sect. 5, which requires pushing weakenings towards the root of the proof.

Definition 3

We introduce the following notations in LK, along with their constructive analogs in LJ:

  •  

  •  

  •  

3 State of the Art: Two Constructive Fragments of Predicate Logic

Constructive sequent calculus – as well as constructive natural deduction – extends the notion of constructive provability from propositions to sequents of the shape \(\varGamma \vdash (G)\), which will be referred to as mono-succedent sequents. As a consequence, we will define constructive fragments of predicate logic as sets of mono-succedent sequents instead of sets of simple propositions.

The definitions of these fragments will be based on the usual notion of polarity of occurrences of connectives, quantifiers and atoms in a sequent: given a sequent \(\varGamma \vdash \varDelta \),

  • the root of a proposition in \(\varGamma \) is negative, the root of a proposition in \(\varDelta \) is positive

  • polarity only changes between an occurrence of \(A \Rightarrow B\) and the occurrence of its direct subformula A (in particular, as \(\lnot A\) is defined as \(A \Rightarrow \bot \), it changes between \(\lnot A\) and its direct subformula A).

Definition 4

We define the following fragments of predicate logic:

  • \(F_{Ku}\), the fragment of sequents of the shape \(\varGamma \vdash \) containing no positive occurrence of \(\forall \).

  • \(F_{Ma}\), the fragment of mono-succedent sequents containing no positive occurrence of \(\forall \) and no positive occurrence of \(\Rightarrow \).

Theorem 1

\(F_{Ku}\) is a constructive fragment of predicate logic: for any sequent \(\varGamma \vdash \) in \(F_{Ku}\), \(\varGamma \vdash \) is classically provable iff it is constructively provable.

The key arguments to prove this theorem as an adaptation of Kuroda’s double negation translation [3] are the following:

  1. 1.

    Kuroda’s double negation translation [3] is based on a double negation translation \(|\cdot |_{Ku}\) inserting double-negations after any occurrence of \(\forall \). The original theorem is that a proposition A is classically provable iff \(\lnot \lnot |A|_{Ku}\) is constructively provable.

  2. 2.

    It can adapted in two ways. First, \(|\cdot |_{Ku}\) can be lightened to insert double negations only after positive occurrences of \(\forall \) as shown in [4], and extended from propositions to contexts. Second, the main statement can be turned to the following one: a classical sequent \(\varGamma \vdash \varDelta \) is classically provable iff \(|\varGamma , \lnot \varDelta |_{Ku} \vdash \) is constructively provable.

  3. 3.

    By definition of \(F_{Ku}\), a sequent \(\varGamma \vdash \) in \(F_{Ku}\) admits the property \(\varGamma = |\varGamma |_{Ku}\), hence \(\varGamma \vdash \) is classically provable iff it is constructively provable.

We don’t give more details on this proof as the completeness of Construct on \(F_{Ku}\) shown in Sect. 6 will yield a new proof of this result.

Remark 2

One could expect similar constructive fragments to be found using other double negation translations, such as Gödel-Gentzen’s [6, 7] or Kolmogorov’s [8]. Unfortunately, these two translations always insert double-negations in front of atoms, hence they cannot be easily modified to leave a large fragment of propositions unchanged.

Theorem 2

\(F_{Ma}\) is a constructive fragment of predicate logic: for any sequent \(\varGamma \vdash (G)\) in \(F_{Ma}\), \(\varGamma \vdash (G)\) is classically provable iff it is constructively provable.

It lays on a key idea: polarity restrictions have a direct influence on the shape of cut-free proofs. It can be presented in the following way:

Lemma 1

For any connective or quantifier X and any cut-free LK proof \(\varPi \) of a sequent \(\varGamma \vdash \varDelta \):

  • If \(\varGamma \vdash \varDelta \) contains no positive occurrence of X, then \(\varPi \) doesn’t contain the rule \(X_R\).

  • If \(\varGamma \vdash \varDelta \) contains no negative occurrence of X, then \(\varPi \) doesn’t contain the rule \(X_L\).

This lemma can be proved directly by induction on cut-free LK proofs. Using this lemma, the key arguments to prove Theorem 2 are the following:

  1. 1.

    All LK rules except \(\Rightarrow _R\) and \(\forall _R\) rules belong in Maehara’s multi-succedent calculus [5], a constructive multi-succedent sequent calculus.

  2. 2.

    By Lemma 1, \(F_{Ma}\) sequents are proved by cut-free LK proofs without the \(\Rightarrow _R\) and \(\forall _R\) rules.

  3. 3.

    Hence, a sequent \(\varGamma \vdash (G)\) in \(F_{Ma}\) is classically provable iff it is constructively provable.

Again, we don’t give more details on this proof as the completeness of Construct on \(F_{Ma}\) shown in Sect. 6 will yield a new proof of this result.

Remark 3

The same fragment \(F_{Ma}\) can be found using similar multi-succedent constructive systems, such as Dragalin’s calculus GHPC [11].

4 The Weakening Normalization

A naive constructivization algorithm can be defined by selecting LK proofs which can be directly interpreted in LJ.

In this direct interpretation, premises of the classical rules \(\vee _R\) and \(\Rightarrow _L\) may be multi-succedent only when they are introduced by a \(weak_R\) whose premise is a mono-succedent sequent. For instance, the classical derivation

 

figure b

However, in practice, the \(weak_R\) rule doesn’t appear as low as possible – in presentations using multi-succedents axiom rules, they may not appear at all. Such situations are problematic for constructive interpretations: for instance, a classical proof such as

figure c

cannot be interpreted in LJ directly because the \(weak_R\) rule doesn’t occur immediately above the \(\vee _R\) rule.

The Normalize algorithm is designed to address this issue, pushing the application of \(weak_R\) as low as possible in proofs. In its definition, we need to consider all possible configuration of \(weak_R\) appearing above a LK rule. In order to factor this definition, we partition all such configurations into three classes A, B, and C.

These definitions will be based on the following notation of LK proofs:

Definition 5

We write any cut-free LK rule X as

figure d

where \(L_1, \cdots , L_n\), \(R_1, \cdots , R_n\), L and R are the (possibly empty) multisets of propositions containing the active propositions of the rule X.

For instance, in the rule

\(L_1 = \{A\}\), \(R_1 = \{B\}\), \(L = \emptyset \), and \(R = \{A \Rightarrow B \}\).

The classes A, B, and C are defined as follows:

Definition 6

We consider all configurations where \(weak_R\) appears above a LK rule X, in its i-th premise:

figure e

This weakening can be done on propositions in \(R_i\), in \(\varDelta \) or both: in the general case, we only know \(\varDelta _i \subseteq (R_i, \varDelta )\). We define the following partition of all cases:

  • A: \(R_i \subseteq \varDelta _i\)

  • B: \(R_i \not \subseteq \varDelta _i\) and \(\varDelta _i \subseteq \varDelta \)

  • C: \(R_i \not \subseteq \varDelta _i\) and \(\varDelta _i \not \subseteq \varDelta \). This only happens when \(|R_i| = 2\), when exactly one proposition of \(R_i\) is in \(\varDelta _i\).

Definition 7

Normalize is a linear-time algorithm associating any cut-free LK proof of a sequent \(\varGamma \vdash \varDelta \) to a proof of a sequent \(\varGamma \vdash \varDelta '\), where \(\varDelta ' \subseteq \varDelta \). It is defined recursively. Using the conventions of Definition 5, we describe the original proof \(\varPi \) as

figure f

The definition of Normalize(\(\varPi \)) is based on the analysis of the proof

figure g

The different cases are the following:

  • Case 1: for all index i, A holds, i.e. \(R_i \subseteq \varDelta _i\).

    If X is \(weak_R\), we define Normalize(\(\varPi \)) as Normalize(\(\varPi _1\)).

    Else, writing \(\varDelta _i = R_i, \varDelta '_i\), we define Normalize(\(\varPi \)) as

    figure h

    where \(\varDelta '\) is the smallest multiset containing all multisets \(\varDelta '_i\)

  • Case 2: there exists a smallest premise i for which B holds, i.e. \(R_i \not \subseteq \varDelta _i\) and \(\varDelta _i \subseteq \varDelta \). As \(R_i \ne \emptyset \), ether X is \(\Rightarrow _R\) or \(L_i = \emptyset \).

    If X is \(\Rightarrow _R\), we define Normalize(\(\varPi \)) as

    Else, \(L_i = \emptyset \) and we define Normalize(\(\varPi \)) as

  • Case 3: there exists a smallest premise i for which the case C applies, i.e. \(R_i \not \subseteq \varDelta _i\) and \(\varDelta _i \not \subseteq \varDelta \). This only happens when \(|R_i| = 2\), when exactly one proposition of \(R_i\) is in \(\varDelta _i\). In this case, X is either \(contr_R\) or \(\vee _R\).

    If X is \(contr_R\), we can write \(R_1 = A, A\), and \(\varDelta _1 = (A, \varDelta '_1)\) with \(\varDelta '_1 \subseteq \varDelta \). We define Normalize(\(\varPi \)) as Normalize(\(\varPi _1\)).

    If X is \(\vee _R\), we can write \(R_1 = A_0, A_1\), and \(\varDelta _1 = (A_k, \varDelta '_1)\) with \(\varDelta '_1 \subseteq \varDelta \).

    We define Normalize(\(\varPi \)) as

Remark 4

The nullary rules axiom and \(\bot _L\) having no premise, they match the first case.

Definition 8

We define a first constructivization algorithm Weak construct, which

  • takes as input a cut-free LK proof

  • computes the proof

  • outputs its LJ interpretation if it exists and fails otherwise.

5 A New Constructive Fragment

Definition 9

We define F as the fragment of mono-succedent sequents containing no negative occurrence of \(\vee \) and no positive occurrence of \(\Rightarrow \).

Theorem 3

Weak construct is complete on F: if \(\varPi \) is a cut-free LK proof of a sequent \(\varGamma \vdash (G) \in F\), then \(\textsc {Weak construct}(\varPi )\) succeeds.

Proof

By Lemma 1, F sequents are proved by cut-free LK proofs containing no \(\vee _L\) or \(\Rightarrow _R\) rule. We prove that for any such proof \(\varPi \), \(\textsc {Normalize}(\varPi )\) proves a mono-succedent sequent interpretable in LJ. This proof is done by induction on cut-free LK proofs containing no \(\vee _L\) or \(\Rightarrow _R\) rule, following the partition of cases and the notations introduced in the definition of \(\textsc {Normalize}\):

  • Case 1: we split this case according to the rule X.

    • nullary rules: axiom and \(\bot _L\) are interpretable in LJ.

    • \(weak_R\): The result follows directly by induction hypothesis.

    • other unary rules: In these cases \(\varDelta ' = \varDelta '_1\), hence Normalize(\(\varPi \)) is

      figure i

      By induction hypothesis, Normalize(\(\varPi _1\)) is interpretable in LJ. Hence, \(|R_1| \le 1\), which ensures that X is neither \(contr_R\) nor \(\vee _R\). All other unary rules lead to a proof interpretable in LJ, therefore the result is interpretable in LJ.

    • \(\vee _L\): This case doesn’t occur by hypothesis

    • \(\Rightarrow _L\): By induction hypothesis, Normalize(\(\varPi _1\)) and Normalize(\(\varPi _2\)) are interpretable in LJ, hence \(|R_1, \varDelta '_1| \le 1\). As \(|R_1| = 1\), \(\varDelta '_1 = \emptyset \), and \(\varDelta ' = \varDelta '_2\).

      figure j

      is interpretable as in LJ, the result follows.

    • \(\wedge _R\): By induction hypothesis, Normalize(\(\varPi _1\)) and Normalize(\(\varPi _2\)) are interpretable in LJ, hence \(|R_1, \varDelta '_1| \le 1\) and \(|R_2, \varDelta '_2| \le 1\). As \(|R_1| = |R_2| = 1\), \(\varDelta '_1 = \varDelta '_2 = \emptyset \). Therefore \(\varDelta ' = \emptyset \), from which the result follows.

  • Case 2: By hypothesis, X is not \(\Rightarrow _R\), hence Normalize(\(\varPi \)) is defined as

    figure k

    The result follows by induction hypothesis.

  • Case 3: If X is \(contr_R\), the result follows directly by induction hypothesis. Else, X is \(\vee _R\). By induction hypothesis, Normalize(\(\varPi _1\)) is interpretable in LJ, thus \(|A_k, \varDelta '_1| \le 1\), and \(\varDelta '_1 = \emptyset \).

    As in LJ, the result follows.

Corollary 1

The fragment F is a constructive fragment of predicate logic: a sequent \(\varGamma \vdash (G)\) is classically provable iff it is constructively provable.

6 The Full Constructivization Algorithm

The previous algorithm Weak construct was based on the reject of multi-succedent sequents. The idea leading to our main algorithm Construct is to try to interpret multi-succedent sequents constructively as well. This interpretation is based on a new multi-succedent constructive system, which will be referred to as LI in the following. As mentioned in the introduction, the constructivization algorithm Construct comprises three steps: first the algorithm Normalize, then a partial translation Annotate from LK proofs to LI proofs, and finally a complete translation Interpret from LI proof to LJ proofs.

There are several ways to interpret multi-succedent sequents constructively. For instance, \(\varGamma \vdash \bigvee \varDelta \) and \(\varGamma , \lnot \varDelta \vdash \) are two possible interpretations of a multi-succedent sequent \(\varGamma \vdash \varDelta \). These interpretation are equivalent classically but not constructively: for instance, the classical sequent \(\vdash A, \lnot A\) is not provable constructively under the first interpretation, but it is provable constructively under the second one. As a consequence, some classical rules may be constructively valid or not according to the chosen interpretation of classical sequents.

The new system LI is built to benefit from the freedom left in the constructive interpretation of classical sequents. LI is designed as a sequent calculus based on annotated sequents, where the annotation will refer to the choice of constructive interpretation of the underlying classical sequent. We formalize first the notion of annotated sequents.

Definition 10

We define the set of annotated sequents as sequents of the shape \(\varGamma \vdash \varDelta _1; \varDelta _2\).

We define the following interpretation \(\textsc {Interpret}\) on annotated sequents: \(\textsc {Interpret}(\varGamma \vdash \varDelta _1; \varDelta _2) ~~~ = ~~~ \varGamma , \lnot \varDelta _2 \vdash \bigvee \varDelta _1\).

In the following, this function will be extended from LI proofs to LJ proofs.

We define the following erasure function \(\textsc {Erase}\) on annotated sequents:

\(\textsc {Erase}(\varGamma \vdash \varDelta _1; \varDelta _2) ~~~ = ~~~ \varGamma \vdash \varDelta _1, \varDelta _2\).

In the following, this function will be extended from LI proofs to LK proofs.

Then, we define the system LI in the following way:

Definition 11

LI is based on the following rules:

figure l

with the standard freshness constraints for the variables introduced in the rules \(\forall ^i_R\) and \(\exists _L\).

All LI rules correspond to a LK rule through the erasure of the premises and the conclusions. Hence, we can extend the \(\textsc {Erase}\) function from LI rules to LK rules, and consequently from LI proofs to LK proofs.

In the same way, we would like to extend the \(\textsc {Interpret}\) function from LI proofs to LJ proofs. This can done associating each LI rule to a partial LJ proof deriving the interpretation of its conclusion from the interpretation of its premises. However, such an approach would be heavy: as the disjunction in LJ is binary, \(\bigvee \) is a based on a nesting of binary disjunctions, and a proposition in \(\varGamma \vdash \varDelta _1; \varDelta _2\) can occur deep in \(\varGamma , \lnot \varDelta _2 \vdash \bigvee \varDelta _1\). As \(\textsc {Interpret}\) will be part of the constructivization algorithm Construct, we need to find another method to define it as a linear-time algorithm.

For this reason, we will define the interpretation of rules using the property that \(\varGamma \vdash \bigvee \varDelta \) is constructively provable iff \(\varGamma , \varDelta \Rightarrow G \vdash G\) is provable for any proposition G.

Definition 12

We define the function \(\textsc {Interpret}'(\cdot | G)\) on annotated sequents as \(\textsc {Interpret}'(\varGamma \vdash \varDelta _1; \varDelta _2 | G) = (\varGamma , \varDelta _1 \Rightarrow G, \lnot \varDelta _2 \vdash G)\).

We extend \(\textsc {Interpret}'\) from LI rules to partial LJ derivations in the following way:

From a LI rule

and a proposition G, we define a partial LJ derivation \(\textsc {Interpret}'(R | G)\) as a partial derivation of the form

figure m

The LI system is designed to ensure that such definitions rely on simple constructive tautologies. As an illustration, we present here the case of the rule

figure n

From a proposition G, defining \(\varSigma = \varGamma , \varDelta _1 \Rightarrow G, \lnot \varDelta _2\), we derive

figure o

where the two open premises correspond to \(\textsc {Interpret}'(\varGamma , B \vdash \varDelta _1; \varDelta _2 | G)\) and \(\textsc {Interpret}'(\varGamma \vdash A, \varDelta _1; \varDelta _2 | G)\) respectively.

Remark 5

In this case, we chose \(G_1 = G_2 = G\). Other choices for \(G_i\) appear in the cases \(\wedge ^2_R\), \(\Rightarrow ^1_L\), \(\Rightarrow ^2_R\), and \(\forall ^2_R\).

In a second step, we extend \(\textsc {Interpret}'(\cdot |G)\) from LI proofs to LJ proofs recursively. Finally, we extend \(\textsc {Interpret}(\cdot )\) from LI proofs of sequents of the shape \(\varGamma \vdash (G); \) to LJ proofs:

  • for \(\varPi \) a LI proof of a sequent \(\varGamma \vdash ; \), we define \(\textsc {Interpret}(\varPi )\) as

    figure p
  • for \(\varPi \) a LI proof of a sequent \(\varGamma \vdash G; \), we define \(\textsc {Interpret}(\varPi )\) as

    figure q

Definition 13

We define the linear-time partial algorithm \(\textsc {Annotate}(\cdot | \cdot )\) with, as inputs, a LI sequent S and a cut-free LK proof \(\varPi \) of \(\textsc {Erase}(S)\) and, as output, either a LI proof of S or a failure. This annotation is done from the root to the leaves: at each step, the first argument S prescribe how the current conclusion must be annotated. The definition is recursive on the second argument.

Describing S as \(\varGamma \vdash \varDelta _1; \varDelta _2\) and \(\varPi \) as

  • If there exists a LI rule

    figure r

    such that for all i, \(\varDelta ^i_1, \varDelta ^i_2 = \varDelta ^i\), then the output is

    figure s
  • Else, \(\textsc {Annotate}(\cdot , \cdot )\) fails.

Remark 6

The only failing cases appear when the rule R is either \(\Rightarrow _R\) or \(\forall _R\), and exclusively for sequents \(\varGamma \vdash \varDelta _1; \varDelta _2\) such that \(|\varDelta _1, \varDelta _2| > 1\).

Definition 14

We define the linear-time constructivization algorithm Construct, which

  • takes as input a cut-free LK proof \(\varPi \) of a sequent \(\varGamma \vdash (G)\),

  • computes the proof

  • outputs \(\textsc {Interpret}(\textsc {Annotate}(\varGamma \vdash (G);|\varPi '))\) if it exists and fails otherwise.

Example 1

We consider the law of excluded middle \(A \vee \lnot A\) given with the

following LK proof: . This proof is unchanged by Normalize.

The Annotate step fails as follows:

Example 2

We consider a variant of the non contradiction of law of excluded

middle, \((\lnot (A \vee \lnot A)) \Rightarrow B\), given with the proof:

The result of Normalize is

Then, the result of Annotate is

As Annotate is the only step which may fail, Construct succeeds on this example. We see on the example that the application of Normalize was crucial for Annotate to succeed.

Theorem 4

Construct is complete on F, \(F_{Ku}\), and \(F_{Ma}\): for any proof \(\varPi \) of a sequent S in one of these fragments, \(\textsc {Construct}(\varPi )\) succeeds.

Proof

We consider F, \(F_{Ku}\), and \(F_{Ma}\) separately:

  • For F: we consider a cut-free LK proof \(\varPi \) of a sequent \(\varGamma \vdash (G) \in F\).

    By Theorem 3, is interpretable in LJ.

    As a consequence, the only multi-succedent sequents in \(\varPi '\) are conclusions of weakenings. As all failing cases (c.f. Remark 6) involve sequents \(\varGamma \vdash \varDelta _1; \varDelta _2\) such that \(|\varDelta _1, \varDelta _2| > 1\) which are conclusions of \(\Rightarrow _R\) or \(\forall _R\) rules, Annotate succeeds. Hence, Construct succeeds.

  • For \(F_{Ku}\): the result follows directly from a stronger assertion: for any cut-free LK proof \(\varPi \) of a sequent \(\varGamma \vdash \varDelta \) containing no \(\forall _R\) rule, \(\textsc {Annotate}(\varGamma \vdash ;\varDelta | \varPi )\) succeeds. This assertion is proved by induction on such sequents and proofs, noticing that all induction hypotheses refer to sequents of the shape \(\varGamma ' \vdash ;\varDelta '\).

  • For \(F_{Ma}\): we consider a cut-free LK proof \(\varPi \) of a sequent in \(F_{Ma}\). As mentioned in Remark 6 the only failing cases involve the \(\Rightarrow _R\) or \(\forall _R\) rules, which don’t occur in a proof of a sequent in \(F_{Ma}\). Hence, Construct succeeds.

7 Experimental Results

In order to measure the success of Construct in practice, experiments were made on the basis of TPTP [13] first-order problems. The classical theorem prover Zenon [10] was used to prove such problems. Zenon builds cut-free LK proofs internally. It was instrumented to use these internal proofs as inputs for an implementation of Weak construct and Construct. The LJ proofs obtained as outputs were expressed and checked in the constructive logical framework Dedukti [9].

A set of 724 TPTP problems was selected for the experimentations, corresponding to all TPTP problems in the category FOF which could be proved in less than 1 s using the uninstrumented version of Zenon. The results are the following:

  • Weak construct led to constructive proofs in 51% of tested cases.

  • Construct led to constructive proofs in 85% of tested cases (including all Weak construct successes).

All constructive proofs generated were successfully checked using Dedukti. Among all cases where Construct failed, 35% are proved to be unvalid constructively using the constructive theorem prover ileanCoP [12].