A library of relation operators defining sequences of transitions
  and useful properties about them. 
Set Implicit Arguments.
Section SEQUENCES.
Variable A: 
Type.
Zero, one or several transitions: reflexive, transitive closure of R. 
Inductive star (
R: 
A -> 
A -> 
Prop): 
A -> 
A -> 
Prop :=
  | 
star_refl: 
forall a,
      
star R a a
  | 
star_step: 
forall a b c,
      
R a b -> 
star R b c -> 
star R a c.
Lemma star_one:
  
forall (
R: 
A -> 
A -> 
Prop) (
a b: 
A), 
R a b -> 
star R a b.
Proof.
  intros. econstructor; eauto. constructor.
Qed.
Lemma star_trans:
  
forall  (
R: 
A -> 
A -> 
Prop) (
a b: 
A),
  
star R a b -> 
forall c, 
star R b c -> 
star R a c.
Proof.
  induction 1; intros. auto. econstructor; eauto.
Qed.
One or several transitions: transitive closure of R. 
Inductive plus (
R: 
A -> 
A -> 
Prop): 
A -> 
A -> 
Prop :=
  | 
plus_left: 
forall a b c,
      
R a b -> 
star R b c -> 
plus R a c.
Lemma plus_one:
  
forall (
R: 
A -> 
A -> 
Prop) 
a b, 
R a b -> 
plus R a b.
Proof.
Lemma plus_star:
  
forall (
R: 
A -> 
A -> 
Prop) 
a b,
  
plus R a b -> 
star R a b.
Proof.
  intros. 
inversion H. 
eapply star_step; 
eauto. 
Qed.
 
Lemma plus_star_trans:
  
forall (
R: 
A -> 
A -> 
Prop) 
a b c, 
plus R a b -> 
star R b c -> 
plus R a c.
Proof.
Lemma star_plus_trans:
  
forall (
R: 
A -> 
A -> 
Prop) 
a b c, 
star R a b -> 
plus R b c -> 
plus R a c.
Proof.
  intros. 
inversion H0. 
inversion H. 
econstructor; 
eauto.
  
econstructor; 
eauto. 
eapply star_trans; 
eauto. 
econstructor; 
eauto. 
Qed.
 
Lemma plus_trans:
  
forall (
R: 
A -> 
A -> 
Prop) 
a b c, 
plus R a b -> 
plus R b c -> 
plus R a c.
Proof.
Lemma plus_right:
  
forall (
R: 
A -> 
A -> 
Prop) 
a b c, 
star R a b -> 
R b c -> 
plus R a c.
Proof.
Absence of transitions. 
Definition irred (
R: 
A -> 
A -> 
Prop) (
a: 
A) : 
Prop := 
forall b, ~(
R a b).
Infinitely many transitions. 
CoInductive infseq (
R: 
A -> 
A -> 
Prop): 
A -> 
Prop :=
  | 
infseq_step: 
forall a b,
      
R a b -> 
infseq R b -> 
infseq R a.
Coinduction principles to show the existence of infinite sequences. 
Lemma infseq_coinduction_principle:
  
forall (
R: 
A -> 
A -> 
Prop) (
X: 
A -> 
Prop),
  (
forall a, 
X a -> 
exists b, 
R a b /\ 
X b) ->
  
forall a, 
X a -> 
infseq R a.
Proof.
  intros R X P. 
cofix COINDHYP; 
intros.
  
destruct (
P a H) 
as [
b [
U V]]. 
apply infseq_step with b; 
auto. 
Qed.
 
Lemma infseq_coinduction_principle_2:
  
forall (
R: 
A -> 
A -> 
Prop) (
X: 
A -> 
Prop),
  (
forall a, 
X a -> 
exists b, 
plus R a b /\ 
X b) ->
  
forall a, 
X a -> 
infseq R a.
Proof.
  intros.
  
apply infseq_coinduction_principle with
    (
X := 
fun a => 
exists b, 
star R a b /\ 
X b).
- 
intros. 
  
destruct H1 as [
b [
STAR Xb]]. 
inversion STAR; 
subst.
  
destruct (
H b Xb) 
as [
c [
PLUS Xc]]. 
inversion PLUS; 
subst.
  
exists b0; 
split. 
auto. 
exists c; 
auto. 
  
exists b0; 
split. 
auto. 
exists b; 
auto.
- 
exists a; 
split. 
apply star_refl. 
auto.
Qed.
 
An example of use of infseq_coinduction_principle. 
Lemma infseq_alternate_characterization:
  
forall (
R: 
A -> 
A -> 
Prop) 
a,
  (
forall b, 
star R a b -> 
exists c, 
R b c) ->
  
infseq R a.
Proof.
  intros R. 
apply infseq_coinduction_principle.
  
intros. 
destruct (
H a) 
as [
b Rb]. 
constructor. 
  
exists b; 
split; 
auto. 
  
intros. 
apply H. 
econstructor; 
eauto.
Qed.
 
A sequence is either infinite or stops on an irreducible term.
    This property needs excluded middle from classical logic. 
Require Import Classical.
Lemma infseq_or_finseq:
  
forall (
R: 
A -> 
A -> 
Prop) 
a, 
infseq R a \/ 
exists b, 
star R a b /\ 
irred R b.
Proof.
Additional properties for deterministic transition relations. 
Section DETERMINISM.
Variable R: 
A -> 
A -> 
Prop.
Hypothesis R_determ: 
forall a b c, 
R a b -> 
R a c -> 
b = 
c.
Uniqueness of transition sequences. 
Lemma star_star_inv:
  
forall a b, 
star R a b -> 
forall c, 
star R a c -> 
star R b c \/ 
star R c b.
Proof.
  induction 1; 
intros.
  
auto.
  
inversion H1; 
subst. 
right. 
eapply star_step; 
eauto. 
  
assert (
b = 
b0). 
eapply R_determ; 
eauto. 
subst b0. 
  
apply IHstar; 
auto.
Qed.
 
Lemma finseq_unique:
  
forall a b b',
  
star R a b -> 
irred R b ->
  
star R a b' -> 
irred R b' ->
  
b = 
b'.
Proof.
  intros. 
destruct (
star_star_inv H H1).
  
inversion H3; 
subst. 
auto. 
elim (
H0 _ H4).
  
inversion H3; 
subst. 
auto. 
elim (
H2 _ H4).
Qed.
 
Lemma infseq_star_inv:
  
forall a b, 
star R a b -> 
infseq R a -> 
infseq R b.
Proof.
  induction 1; 
intros. 
auto. 
  
inversion H1; 
subst. 
assert (
b = 
b0). 
eapply R_determ; 
eauto. 
subst b0.
  
apply IHstar. 
auto.
Qed.
 
Lemma infseq_finseq_excl:
  
forall a b,
  
star R a b -> 
irred R b -> 
infseq R a -> 
False.
Proof.
End DETERMINISM.
End SEQUENCES.
Hint Resolve star_refl star_step star_one star_trans plus_left plus_one
             plus_star plus_star_trans star_plus_trans plus_right: 
sequences.