Section pa_def.
Variables (C : Category) (a b : C) (I : Type) (k : I -> (a --> b)).
Inductive PA_ob : Type :=
| PA1 : PA_ob
| PA2 : PA_ob.
Inductive PA_mor : PA_ob -> PA_ob -> Type :=
| PA_I1 : PA_mor PA1 PA1
| PA_I2 : PA_mor PA2 PA2
| PA_f : I -> PA_mor PA1 PA2.
(* sche'mas d'e'limination pour PA_mor *)
(* egalite' *)
Definition Equal_PA_mor (x y : PA_ob) (f g : PA_mor x y) :=
match f in (PA_mor x' y') return Prop with
| PA_I1 =>
(* PA_I1  *)  True (* PA_I2  *)
| PA_I2 => True
(* PA_f i *)
| PA_f i =>
match g in (PA_mor x' y') return Prop with
| PA_I1 =>
(* PA_I1  *)  False (* PA_I2  *)
| PA_I2 => False
(* PA_f j *)
| PA_f j => k i =_S k j
end
end.
Canonical Structure PA_mor_setoid (x y : PA_ob) :=
Build_Setoid (Equal_PA_mor_Equiv x y).
(* composition *)
Definition Comp_PA_mor (x y z : PA_ob) (f : PA_mor x y) :=
match f in (PA_mor p p0) return (PA_mor p0 z -> PA_mor p z) with
| PA_I1 =>
(* PA_I1 *)
match z as p return (PA_mor PA1 p -> PA_mor PA1 p) with
| PA1 =>
(* PA1 *)  fun _ => PA_I1 (* PA2 *)
| PA2 => fun g => g
end
(* PA_I2 *)
| PA_I2 =>
match z as p return (PA_mor PA2 p -> PA_mor PA2 p) with
| PA1 =>
(* PA1 *)
fun g => PA_21_rect (fun _ => PA_mor PA2 PA1) g
(* PA2 *)
| PA2 => fun _ => PA_I2
end
(* PA_f  *)
| PA_f x =>
match z as p return (I -> PA_mor PA2 p -> PA_mor PA1 p) with
| PA1 =>
(* PA1 *)
fun _ g => PA_21_rect (fun _ => PA_mor PA1 PA1) g
(* PA2 *)
| PA2 => fun i _ => PA_f i
end x
end.
(* *)
(* code complique' pour contourner bug Generalize *)
(** **)

Lemma Comp_PA_congr : Congr_law Comp_PA_mor.