(* * 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.

Lemma trans_subst b sigma (phi : form b) :
trans (subst_form sigma phi) = subst_form sigma (trans phi).