proposition: Lemma gpaco0_dist clo r rg (CMP: wcompatible0 gf clo) (DIST: forall r1 r2, clo (r1 \0/ r2) <0= (clo r1 \0/ clo r2)): gpaco0 gf clo r rg <0= (paco0 gf (rclo0 clo (rg \0/ r)) \0/ rclo0 clo r).
proof: Proof. intros. apply gpaco0_unfold in PR; [|apply gf_mon]. apply rclo0_dist in PR; [|apply CMP|apply DIST]. destruct PR; [|right; apply H]. left. revert H. pcofix CIH; intros. apply rclo0_wcompat in H0; [|apply gf_mon|apply CMP]. pstep. eapply gf_mon. apply H0. clear H0. intros. apply gpaco0_unfold in PR; [|apply gf_mon]. apply rclo0_compose in PR. apply rclo0_dist in PR; [|apply CMP|apply DIST]. destruct PR. - right. apply CIH. eapply rclo0_mon. apply H. intros. eapply gf_mon. apply PR. intros. apply gpaco0_gupaco. apply gf_mon. apply gpaco0_gen_rclo. apply gf_mon. eapply gupaco0_mon. apply PR0. intros. destruct PR1; apply H0. - assert (REL: @rclo0 clo (rclo0 clo (gf (gupaco0 gf clo ((rg \0/ r) \0/ (rg \0/ r))) \0/ (rg \0/ r)))). { eapply rclo0_mon. apply H. intros. apply gpaco0_unfold in PR. apply PR. apply gf_mon. } apply rclo0_rclo in REL. apply rclo0_dist in REL; [|apply CMP|apply DIST]. right. destruct REL; cycle 1. + apply CIH0, H0. + apply CIH. eapply rclo0_mon. apply H0. intros. eapply gf_mon. apply PR. intros. eapply gupaco0_mon. apply PR0. intros. destruct PR1; apply H1. Qed.
imports: Program.Basics Paco(paco0 pacotac)