Class nz (a : nat) := {
  agz : a > 0
}.Class nz (a : nat) := {
  agz : a > 0
}.Instance nz_nat : forall (n : nat), nz (S n).Definition posnat := {n : nat | n > 0}.Definition posnatToNat(p : posnat) :=
  match p with
    | exist _ n _ => n
  end.Inductive posnatEq : posnat -> posnat -> Prop :=
  | posnatEq_intro : 
    forall (n1 n2 : nat) pf1 pf2,
      n1 = n2 ->
      posnatEq (exist _ n1 pf1) (exist _ n2 pf2).Inductive posnatEq : posnat -> posnat -> Prop :=
  | posnatEq_intro : 
    forall (n1 n2 : nat) pf1 pf2,
      n1 = n2 ->
      posnatEq (exist _ n1 pf1) (exist _ n2 pf2).Definition posnatMult(p1 p2 : posnat) : posnat :=
    match (p1, p2) with
      | (exist _ n1 pf1, exist _ n2 pf2) =>
        (exist (fun n => n > 0) (n1 * n2) (mult_gt_0 pf1 pf2))
    end.

(* Specifications: *)
Lemma posnatMult_comm : forall p1 p2, (posnatEq (posnatMult p1 p2) (posnatMult p2 p1)).
Lemma posnat_pos : forall (p : posnat), p > 0.