From Undecidability.H10 Require Import H10 H10_undec Dio.dio_single H10p.
From Undecidability.Synthetic Require Import Undecidability.
Require Import Fin.
Local Set Implicit Arguments.

Reduction from Diophantine equations with parameters to Diophantine equations without parameters

Definition embed_poly n (p : dio_polynomial (Fin.t n) (Fin.t 0)) : dio_polynomial_pfree.
Proof.
  induction p.
  - exact (dp_nat_pfree ).
  - exact (dp_var_pfree (proj1_sig (to_nat v))).
  - inversion p.
  - exact (dp_comp_pfree (if d then do_add_pfree else do_mul_pfree) ).
Defined.


Definition embed (x : H10_PROBLEM) : H10p_PROBLEM :=
  let (n, x) := x in let (p, q) := x in (embed_poly p, embed_poly q).

Definition embed_env n (phi : Fin.t n ) : :=
   k match Compare_dec.lt_dec k n with
        | left H (of_nat_lt H)
        | _ 0
        end.

Lemma embed_env_eval n (p : dio_polynomial (Fin.t n) (Fin.t 0)) nu phi :
  dp_eval p = dp_eval_pfree (embed_env ) (embed_poly p).
Proof.
  induction p.
  - reflexivity.
  - cbn. unfold embed_env. destruct Compare_dec.lt_dec as [H|H].
    + erewrite of_nat_ext, of_nat_to_nat_inv. reflexivity.
    + exfalso. apply H. apply proj2_sig.
  - inversion p.
  - cbn [dp_eval]. rewrite , . now destruct d.
Qed.


Definition cut_env n (phi : ) : Fin.t n :=
   i (proj1_sig (to_nat i)).

Lemma cut_env_eval n (p : dio_polynomial (Fin.t n) (Fin.t 0)) nu phi :
  dp_eval (cut_env ) p = dp_eval_pfree (embed_poly p).
Proof.
  induction p.
  - reflexivity.
  - reflexivity.
  - inversion p.
  - cbn [dp_eval]. rewrite , . now destruct d.
Qed.


Lemma embed_spec x :
   x H10p (embed x).
Proof.
  destruct x as (n & p & q). cbn. split; intros [ H]; cbn in H.
  - exists (embed_env ). cbn. now rewrite !embed_env_eval in H.
  - exists (cut_env ). cbn. now rewrite !cut_env_eval.
Qed.


Theorem reduction :
   H10p.
Proof.
  exists embed. intros x. apply embed_spec.
Qed.