(* invariance du résultat de pl_produit lorsqu'on augmente la quantité d'essence *)

Fixpoint pl_prof (pl : prec_list) : nat :=
  match pl with
  | prec_empty => 0
  | prec_cons a la ls => S (max (pl_prof la) (pl_prof ls))
  end.

(* Specifications: *)
Lemma indprinciple_0 : forall P0 P1 : prec_list -> prec_list -> Prop, (forall p : prec_list, P0 p prec_empty) -> (forall p : prec_list, P1 p prec_empty) -> (forall p : prec_list, P1 prec_empty p) -> (forall (a : ad) (la ls p : prec_list), P0 p ls -> P1 p la -> P0 p (prec_cons a la ls)) -> (forall (a : ad) (la ls p : prec_list), P0 la p -> P1 ls p -> P1 (prec_cons a la ls) p) -> forall n : nat, (forall p p' : prec_list, pl_prof p <= n -> pl_prof p' <= n -> P0 p p' /\ P1 p p') -> forall p p' : prec_list, pl_prof p <= S n -> pl_prof p' <= S n -> P0 p p' /\ P1 p p'.
Lemma indprinciple_1 : forall P0 P1 : prec_list -> prec_list -> Prop, (forall p : prec_list, P0 p prec_empty) -> (forall p : prec_list, P1 p prec_empty) -> (forall p : prec_list, P1 prec_empty p) -> (forall (a : ad) (la ls p : prec_list), P0 p ls -> P1 p la -> P0 p (prec_cons a la ls)) -> (forall (a : ad) (la ls p : prec_list), P0 la p -> P1 ls p -> P1 (prec_cons a la ls) p) -> forall p p' : prec_list, pl_prof p <= 0 -> pl_prof p' <= 0 -> P0 p p' /\ P1 p p'.
Lemma indprinciple_2 : forall P0 P1 : prec_list -> prec_list -> Prop, (forall p : prec_list, P0 p prec_empty) -> (forall p : prec_list, P1 p prec_empty) -> (forall p : prec_list, P1 prec_empty p) -> (forall (a : ad) (la ls p : prec_list), P0 p ls -> P1 p la -> P0 p (prec_cons a la ls)) -> (forall (a : ad) (la ls p : prec_list), P0 la p -> P1 ls p -> P1 (prec_cons a la ls) p) -> forall (n : nat) (p p' : prec_list), pl_prof p <= n -> pl_prof p' <= n -> P0 p p' /\ P1 p p'.
Lemma indprinciple_pl : forall P0 P1 : prec_list -> prec_list -> Prop, (forall p : prec_list, P0 p prec_empty) -> (forall p : prec_list, P1 p prec_empty) -> (forall p : prec_list, P1 prec_empty p) -> (forall (a : ad) (la ls p : prec_list), P0 p ls -> P1 p la -> P0 p (prec_cons a la ls)) -> (forall (a : ad) (la ls p : prec_list), P0 la p -> P1 ls p -> P1 (prec_cons a la ls) p) -> forall p p' : prec_list, P0 p p' /\ P1 p p'.