lemma
proved
exists_candidate_index
show as:
view math explainer →
open explainer
Read the cached plain-language explainer.
open lean source
IndisputableMonolith.Foundation.Atomicity on GitHub at line 322.
browse module
All declarations in this module, on Recognition.
explainer page
depends on
used by
formal source
319 not_mem : event ∉ picked
320 eligible_event : eligible (ev:=ev) picked event
321
322lemma exists_candidate_index (picked : Finset E.Event)
323 (h : ∃ e, e ∉ picked) :
324 ∃ n, enum (E:=E) n ∉ picked ∧ eligible (ev:=ev) picked (enum (E:=E) n) := by
325 classical
326 obtain ⟨e, heNot, helig⟩ := exists_minimal_eligible (ev:=ev) (E:=E) picked h
327 obtain ⟨n, hn⟩ := enum_surjective (E:=E) e
328 refine ⟨n, ?_, ?_⟩
329 · simpa [hn]
330 · simpa [hn] using helig
331
332noncomputable def chooseCandidate (picked : Finset E.Event) :
333 Option (Candidate (ev:=ev) (E:=E) picked) :=
334 if h : ∃ e, e ∉ picked then
335 let hx := exists_candidate_index (ev:=ev) (E:=E) picked h
336 let n := Nat.find hx
337 let hn := Nat.find_spec hx
338 let e := enum (E:=E) n
339 some
340 { idx := n
341 , event := e
342 , event_def := rfl
343 , not_mem := hn.left
344 , eligible_event := hn.right }
345 else
346 none
347
348lemma chooseCandidate_none_iff (picked : Finset E.Event) :
349 chooseCandidate (ev:=ev) (E:=E) picked = none ↔
350 ¬∃ e, e ∉ picked := by
351 classical
352 unfold chooseCandidate