(** *** Incremental proofs using our [pcofix]  As before, we can easily turn the above [cofix]-proofs into [pcofix]-proofs. *)
Hint Unfold teq'.

(* Specifications: *)
Lemma teq_gen_mon: monotone2 teq_gen. Proof. pmonauto. Qed.
Hint Resolve teq_gen_mon : paco.
Theorem teq'_one : teq' one eins.
Theorem teq'_two : teq' two zwei.
(** *** Pseudo-compositional proofs using [cofix]  It is easy to see that the proofs of [teq_one] and [teq_two] are essentially the same.  We can avoid duplicating some work by decomposing the proofs as follows.  First we prove that [teq two zwei] holds under the coinductive assumption [teq one eins].  This is basically the second part of the proof of [teq_one] (and the first part of the proof of [teq_two]).  Then we prove the converse, i.e., that [teq one eins] holds under the coinductive assumption [teq two zwei]. This is basically the first part of the proof of [teq_one] (and the second part of the proof of [teq_two]).  The issue is that there seems to be no way to express these two properties.  The best we can do is prove [teq two zwei -> teq one eins] and [teq one eins -> teq two zwei], and make sure that in these proofs any use of the assumption is syntactically guarded. For instance, we are not allowed to prove [teq two zwei -> teq one eins] by inspecting [teq two zwei] and extracting [teq one eins] from that (see the proof of [teq_two_one_bad] below). Although a valid proof of that goal by itself, it could not be composed later to yield a proof of [teq one eins] or [teq two zwei] (see the aborted theorem [teq_eins_bad] below).  Moreover, both lemmas must then be made transparent by using [Defined] instead of [Qed] at the end, such that, when composing them to prove [teq one eins] or [teq two zwei], guardedness checking can inspect their proof terms.  In other words, [cofix] is not properly compositional. *)
Lemma teq_two_one_bad : teq two zwei -> teq one eins.
Theorem teq_zwei : teq two zwei.
(** The following proof would fail guardedness checking at [Qed]-time, because in the proof of the lemma [teq_two_one_bad] the assumption is used "too early". *)
Theorem teq_eins_bad : teq one eins.
Lemma teq'_one_two : forall r,
(r one eins : Prop) -> paco2 teq_gen r two zwei.