(** * First-Order Logic *)
From Undecidability Require Export Shared.Prelim FOL.Reductions Problems.PCP.
(** ** Syntax *)
Notation var := nat (only parsing).
Notation par := nat (only parsing).
Inductive term : Type :=
V (v : var) | P (p : par)
| t_f : bool -> term -> term
| t_e : term.
Coercion V : var >-> term.
Inductive logic := frag | full.
Existing Class logic.
Existing Instance full | 1.
Existing Instance frag | 0.
Inductive form : logic -> Type :=
| Pr {b} : term -> term -> form b
| Q {b} : form b
| Fal : form full
| Impl {b} : form b -> form b -> form b
| All {b} : var -> form b -> form b.

(* Specifications: *)
Lemma form_frag_ind : forall P : form frag -> Prop,
(forall (t t0 : term), P (Pr t t0)) ->
(P Q) ->
(forall (f3 : form frag),
P f3 -> forall f4 : form frag, P f4 -> P (Impl f3 f4)) ->
(forall (n : var) (f6 : form frag), P f6 -> P (All n f6)) ->
forall (f8 : form frag), P f8.