Inductive indirect_son1 : Site -> Prop :=
indirect_son1_intro :
forall s : Site,
s <> owner ->
rt c0 s = true ->
~ (forall s1 : Site, ~ inc_dec_in_queue s1 (bm c0 s owner)) ->
indirect_son1 s.
(*  {s1:Site | (inc_dec_in_queue s1 (bm c0 s owner))}  *)
Inductive indirect_son2 : Site -> Prop :=
indirect_son2_intro :
forall s s1 : Site,
s <> owner /\ rt c0 s = true /\ direct_son s1 /\ ancestor s1 s ->
indirect_son2 s.
(* by specifying the lemma as follows, I don't need to know that there is no cycle in the relation *)

(* Specifications: *)
Lemma decide_direct_son :
forall s1 : Site, s1 <> owner -> {direct_son s1} + {~ direct_son s1}.
Lemma direct_or_indirect_son1 :
forall s : Site,
s <> owner -> rt c0 s = true -> {direct_son s} + {indirect_son1 s}.
Lemma disjoint_case_for_site :
forall s : Site,
{s = owner} + {rt c0 s = false} + {direct_son s} + {indirect_son1 s}.
Lemma ancestor_transitive :
forall s1 s2 s3 : Site, ancestor s1 s2 -> ancestor s2 s3 -> ancestor s1 s3.
Lemma aux :
forall s0 s1 s2 : Site,
parent s0 s2 -> direct_son s0 -> ancestor s1 s2 -> s1 = s0.
Lemma decide_ancestor :
forall x s s1 : Site,
direct_son x ->
ancestor x s ->
indirect_son1 s1 -> (s1 = s \/ ancestor s1 s) \/ s1 <> s /\ ~ ancestor s1 s.
Lemma decide_direct_son :
forall s1 : Site, s1 <> owner -> {direct_son s1} + {~ direct_son s1}.
Lemma direct_or_indirect_son1 :
forall s : Site,
s <> owner -> rt c0 s = true -> {direct_son s} + {indirect_son1 s}.
Lemma disjoint_case_for_site :
forall s : Site,
{s = owner} + {rt c0 s = false} + {direct_son s} + {indirect_son1 s}.
Lemma ancestor_transitive :
forall s1 s2 s3 : Site, ancestor s1 s2 -> ancestor s2 s3 -> ancestor s1 s3.
Lemma aux :
forall s0 s1 s2 : Site,
parent s0 s2 -> direct_son s0 -> ancestor s1 s2 -> s1 = s0.
Lemma decide_ancestor :
forall x s s1 : Site,
direct_son x ->
ancestor x s ->
indirect_son1 s1 -> (s1 = s \/ ancestor s1 s) \/ s1 <> s /\ ~ ancestor s1 s.
Lemma decide_direct_son :
forall s1 : Site, s1 <> owner -> {direct_son s1} + {~ direct_son s1}.
Lemma direct_or_indirect_son1 :
forall s : Site,
s <> owner -> rt c0 s = true -> {direct_son s} + {indirect_son1 s}.
Lemma disjoint_case_for_site :
forall s : Site,
{s = owner} + {rt c0 s = false} + {direct_son s} + {indirect_son1 s}.
Lemma ancestor_transitive :
forall s1 s2 s3 : Site, ancestor s1 s2 -> ancestor s2 s3 -> ancestor s1 s3.
Lemma aux :
forall s0 s1 s2 : Site,
parent s0 s2 -> direct_son s0 -> ancestor s1 s2 -> s1 = s0.
Lemma decide_ancestor :
forall x s s1 : Site,
direct_son x ->
ancestor x s ->
indirect_son1 s1 -> (s1 = s \/ ancestor s1 s) \/ s1 <> s /\ ~ ancestor s1 s.
Lemma decide_direct_son :
forall s1 : Site, s1 <> owner -> {direct_son s1} + {~ direct_son s1}.
Lemma direct_or_indirect_son1 :
forall s : Site,
s <> owner -> rt c0 s = true -> {direct_son s} + {indirect_son1 s}.
Lemma disjoint_case_for_site :
forall s : Site,
{s = owner} + {rt c0 s = false} + {direct_son s} + {indirect_son1 s}.
Lemma ancestor_transitive :
forall s1 s2 s3 : Site, ancestor s1 s2 -> ancestor s2 s3 -> ancestor s1 s3.
Lemma aux :
forall s0 s1 s2 : Site,
parent s0 s2 -> direct_son s0 -> ancestor s1 s2 -> s1 = s0.
Lemma decide_ancestor :
forall x s s1 : Site,
direct_son x ->
ancestor x s ->
indirect_son1 s1 -> (s1 = s \/ ancestor s1 s) \/ s1 <> s /\ ~ ancestor s1 s.