Module NatSet := FSetList.Make(OrderedTypeEx.Nat_as_OT).Notation " A ⇒ B " := (A -> B) (at level 90, right associativity) : type_scope.Notation " ∀ x , B  " := (forall x:_, B ) (at level 200, x at level 0, no associativity) : type_scope.Notation " ∀ x y , B  " := (forall (x:_) (y:_), B ) (at level 200, x at level 0, y at level 0, no associativity) : type_scope.Notation " ∀ x y z , B  " := (forall (x:_) (y:_) (z:_), B ) (at level 200, x at level 0, y at level 0, z at level 0, no associativity) : type_scope.Notation " ¬ x " := (not  x) (at level 75, right associativity) : type_scope.Notation " A ∧ B " := (A /\ B) (at level 80, right associativity) : type_scope.Notation " A ∨ B " := (sumor A B) (at level 85, right associativity) : type_scope.Notation " A \/ B " := (sumbool A B) (at level 85, right associativity) : type_scope.Notation " ∃ x , B  " := (sig (fun x:_=>B) ) (at level 0, x at level 99, no associativity) : type_scope.Notation " A × B " := (A * B) (at level 40, left associativity) : type_scope.Notation " 'ℕ' " := nat : type_scope.Infix " ≤ " := le (at level 70, right associativity): nat_scope.Notation "s ≐ t" := (Equal s t) (at level 70, no associativity).Infix "∈" := In (at level 30, no associativity).Infix "⊆" := Subset (at level 70, right associativity).Infix "\" := diff (at level 40, left associativity).Notation "| A |" := (cardinal A) (at level 10, no associativity).Infix "≡" := E.eq (at level 70, no associativity).Infix "∩" := inter (at level 40, left associativity).Infix "∪" := union (at level 50, left associativity).Notation " { x } ∪ X " := (add x X) (at level 50, left associativity).Notation " X \ { x } " := (remove x X) (at level 40, left associativity).Notation "∅" := empty.Module GeneralProperties := FSetProperties.Properties NatSet.Infix "ℛ" := knows (at level 70, no associativity).

Lemma inductive_invariant:∀ m, m≤ n ⇒ ∃B', B'⊆town ∧ |B'| = m ∧ ∀ b'₀ b'₁, b'₀∈B' ⇒ b'₁∈B' ⇒ ¬(b'₀≡b'₁) ⇒ b'₀ ℛ b'₁.