(* * 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_trans' b (phi : form b) A sigma tau :
(map (subst_form tau) A) ⊢I ((dnQ (trans phi[sigma])) --> trans phi[sigma]).