Definition PPO_rule (r: rule) : Prop :=
  match r with
    | rule_intro f lp t => PPO t (fapply f (map (@term_from_pattern _ _ _) lp))
  end.Definition PPO_prog : Prop :=
  forall r, In r prog -> PPO_rule r.

Lemma product_trans (A: Type) (R : A -> A -> Prop) lt1 lt2 lt3 : (forall t1 t2 t3, In t1 lt1 -> In t2 lt2 -> In t3 lt3 -> R t1 t2 -> R t2 t3 -> R t1 t3) -> product R lt1 lt2 -> product R lt2 lt3 -> product R lt1 lt3.