Proof using.
intros.
unfold update_elections_data_timeout.
repeat break_match; simpl in *; auto.
Qed.

Lemma update_elections_data_timeout_votesWithLog_votesReceived :
forall h st out st' ps,
handleTimeout h (snd st) = (out, st', ps) ->
(votesReceived st' = votesReceived (snd st) /\
votesWithLog (update_elections_data_timeout h st) = votesWithLog (fst st) /\
type st' = Leader) \/
(votesReceived st' = [h] /\
votesWithLog (update_elections_data_timeout h st) =
(currentTerm st', h, (log st')) :: votesWithLog (fst st) /\
currentTerm st' = S (currentTerm (snd st))).