Remark In_betaFormula_subst_1_2 :
forall (a b : Term) (v : nat),
In v
(freeVarFormula LNN
(substituteFormula LNN (substituteFormula LNN betaFormula 1 a) 2 b)) ->
In v (freeVarTerm LNN a) \/
In v (freeVarTerm LNN b) \/ In v (freeVarTerm LNN (var 0)).
Remark In_betaFormula_subst_1 :
forall (a : Term) (v : nat),
In v (freeVarFormula LNN (substituteFormula LNN betaFormula 1 a)) ->
In v (freeVarTerm LNN a) \/
In v (freeVarTerm LNN (var 2)) \/ In v (freeVarTerm LNN (var 0)).
Remark In_betaFormula :
forall v : nat,
In v (freeVarFormula LNN betaFormula) ->
In v (freeVarTerm LNN (var 1)) \/
In v (freeVarTerm LNN (var 2)) \/ In v (freeVarTerm LNN (var 0)).
Remark In_betaFormula_subst_2 :
forall (a : Term) (v : nat),
In v (freeVarFormula LNN (substituteFormula LNN betaFormula 2 a)) ->
In v (freeVarTerm LNN a) \/
In v (freeVarTerm LNN (var 1)) \/ In v (freeVarTerm LNN (var 0)).
Remark In_betaFormula_subst_2_1 :
forall (a b : Term) (v : nat),
In v
(freeVarFormula LNN
(substituteFormula LNN (substituteFormula LNN betaFormula 2 a) 1 b)) ->
In v (freeVarTerm LNN a) \/
In v (freeVarTerm LNN b) \/ In v (freeVarTerm LNN (var 0)).
Ltac PRsolveFV A B n :=
unfold existH, forallH, not in |- *; intros;
repeat
match goal with
| H:(_ = _) |- _ => discriminate H
| H:(?X1 <> ?X1) |- _ => elim H; reflexivity
| H:(?X1 = S ?X1) |- _ => elim (n_Sn _ H)
| H:(S ?X1 = ?X1) |- _ =>
elim (n_Sn X1); symmetry  in |- *; apply H
| H:(?X1 = S (S ?X1)) |- _ => elim (n_SSn _ H)
| H:(S (S ?X1) = ?X1) |- _ =>
elim (n_SSn X1); symmetry  in |- *; apply H
| H:(?X1 = S (S (S ?X1))) |- _ =>
elim (n_SSSn _ H)
| H:(S (S (S ?X1)) = ?X1) |- _ =>
elim (n_SSSn X1); symmetry  in |- *; apply H
| H:(In ?X3
(freeVarFormula LNN
(substituteFormula LNN
(substituteFormula LNN
(substituteFormula LNN betaFormula 1 _) 2 _) 0 _))) |- _
=>
decompose sum (In_betaFormula_subst_1_2_0 _ _ _ _ H); clear H
| H:(In ?X3
(freeVarFormula LNN
(substituteFormula LNN (substituteFormula LNN betaFormula 1 _)
2 _))) |- _ =>
decompose sum (In_betaFormula_subst_1_2 _ _ _ H); clear H
| H:(In ?X3 (freeVarFormula LNN (substituteFormula LNN betaFormula 1 _)))
|- _ =>
decompose sum (In_betaFormula_subst_1 _ _ H); clear H
| H:(In ?X3 (freeVarFormula LNN betaFormula)) |- _ =>
decompose sum (In_betaFormula _ H); clear H
| H:(In ?X3
(freeVarFormula LNN
(substituteFormula LNN (substituteFormula LNN betaFormula 2 _)
1 _))) |- _ =>
decompose sum (In_betaFormula_subst_2_1 _ _ _ H); clear H
| H:(In ?X3 (freeVarFormula LNN (substituteFormula LNN betaFormula 2 _)))
|- _ =>
decompose sum (In_betaFormula_subst_2 _ _ H);
clear H
(* Match Context With *)
| H:(In ?X3 (freeVarFormula LNN (fol.existH LNN ?X1 ?X2))) |- _ =>
assert
(In X3 (list_remove nat eq_nat_dec X1 (freeVarFormula LNN X2)));
[ apply H | clear H ]
| H:(In ?X3 (freeVarFormula LNN (fol.forallH LNN ?X1 ?X2))) |- _ =>
assert
(In X3 (list_remove nat eq_nat_dec X1 (freeVarFormula LNN X2)));
[ apply H | clear H ]
|
(* . *)
H:(In ?X3 (list_remove nat eq_nat_dec ?X1 (freeVarFormula LNN ?X2))) |- _
=>
assert (In X3 (freeVarFormula LNN X2));
[ eapply In_list_remove1; apply H
| assert (X3 <> X1); [ eapply In_list_remove2; apply H | clear H ] ]
| H:(In ?X3 (freeVarFormula LNN (fol.andH LNN ?X1 ?X2))) |- _ =>
assert (In X3 (freeVarFormula LNN X1 ++ freeVarFormula LNN X2));
[ apply H | clear H ]
| H:(In ?X3 (freeVarFormula LNN (fol.impH LNN ?X1 ?X2))) |- _ =>
assert (In X3 (freeVarFormula LNN X1 ++ freeVarFormula LNN X2));
[ apply H | clear H ]
| H:(In ?X3 (freeVarFormula LNN (fol.notH LNN ?X1))) |- _ =>
assert (In X3 (freeVarFormula LNN X1)); [ apply H | clear H ]
| H:(In _ (freeVarFormula LNN (primRecPiFormulaHelp _ _ _))) |- _ =>
decompose sum (freeVarPrimRecPiFormulaHelp1 _ _ _ _ H); clear H
| J:(In ?X3 (freeVarFormula LNN A)),H:(forall v : nat,
In v (freeVarFormula LNN A) ->
v <= S n) |- _ =>
elim (le_not_lt X3 (S n));
[ apply H; apply J | clear J; repeat apply lt_n_Sn || apply lt_S ]
| H:(In ?X3 (freeVarFormula LNN B)),H0:(forall v : nat,
In v (freeVarFormula LNN B) ->
v <= S (S (S n))) |- _ =>
elim (le_not_lt X3 (S (S (S n))));
[ apply H0; apply H | clear H; repeat apply lt_n_Sn || apply lt_S ]
| H:(In _ (_ ++ _)) |- _ =>
induction (in_app_or _ _ _ H); clear H
| H:(In _ (freeVarFormula LNN (substituteFormula LNN ?X1 ?X2 ?X3))) |- _
=>
induction (freeVarSubFormula3 _ _ _ _ _ H); clear H
| H:(In _ (freeVarFormula LNN (LT ?X1 ?X2))) |- _ =>
rewrite freeVarLT in H
| H:(In _ (freeVarTerm LNN (natToTerm _))) |- _ =>
elim (closedNatToTerm _ _ H)
| H:(In _ (freeVarTerm LNN Zero)) |- _ =>
elim H
| H:(In _ (freeVarTerm LNN (Succ _))) |- _ =>
rewrite freeVarSucc in H
| H:(In _ (freeVarTerm LNN (var _))) |- _ =>
simpl in H; decompose sum H; clear H
| H:(In _ (freeVarTerm LNN (fol.var LNN _))) |- _ =>
simpl in H; decompose sum H; clear H
end.
Remark primRecSigmaRepresentable :
forall (n : nat) (A : Formula) (g : naryFunc n),
Representable n g A ->
forall (B : Formula) (h : naryFunc (S (S n))),
Representable (S (S n)) h B ->
Representable (S n) (evalPrimRecFunc n g h) (primRecSigmaFormula n A B).
Fixpoint primRecFormula (n : nat) (f : PrimRec n) {struct f} : Formula :=
match f with
| succFunc => succFormula
| zeroFunc => zeroFormula
| projFunc n m _ => projFormula m
| composeFunc n m g h =>
composeSigmaFormula n n m (primRecsFormula n m g) (primRecFormula m h)
| primRecFunc n g h =>
primRecSigmaFormula n (primRecFormula n g) (primRecFormula (S (S n)) h)
end
with primRecsFormula (n m : nat) (fs : PrimRecs n m) {struct fs} :
Vector.t (Formula * naryFunc n) m :=
match fs in (PrimRecs n m) return (Vector.t (Formula * naryFunc n) m) with
| PRnil n => Vector.nil _
| PRcons n m f fs' =>
Vector.cons (Formula * naryFunc n) (primRecFormula n f, evalPrimRec n f) m
(primRecsFormula n m fs')
end.

Lemma primRecRepresentable :
forall (n : nat) (f : naryFunc n) (p : isPR n f),
Representable n f (primRecFormula n (proj1_sig p)).