(* * Classical Natural Deduction *)
From Undecidability.FOL Require Export PCPb_to_FOL.
From Undecidability.Synthetic Require Import Definitions DecidabilityFacts EnumerabilityFacts ReducibilityFacts.
(* ** Double Negation Translation *)
Implicit Type b : falsity_flag.
Definition cprv := @prv _ _ falsity_on class.
Instance iUnit (P : Prop) : interp unit.
Definition dnQ {b} (phi : form b) : form b := (phi --> Q) --> Q.
Fixpoint trans {b} (phi : form b) : form b :=
match phi with
| bin Impl phi1 phi2 => bin Impl (trans phi1) (trans phi2)
| quant All phi => quant All (trans phi)
| atom sPr v => dnQ (atom sPr v)
| atom _ _ => atom sQ (Vector.nil _)
| falsity => @atom _ _ _ falsity_on sQ (Vector.nil _)
end.
Goal (forall X, ~ ~ X -> X) -> (forall (X Y : Prop), ((X -> Y) -> X) -> X).

Lemma Double b (phi : form b) :
[] ⊢C phi -> [] ⊢I (trans phi).