Proof using.
intros n c s Hexec HNth Hlabel.
destruct s. simpl.
invcs Hexec.
match goal with
| H : lb_step_async _ _ _ _ |- _ => invcs H
end.
- unfold occurred in *.
match goal with
| H : MsgUnlock = _ |- _ => symmetry in H; repeat find_rewrite; clear H
end.
monad_unfold. unfold NetHandler in *.
break_match.
+ find_apply_lem_hyp ClientNetHandler_lbcases.
intuition; congruence.
+ find_apply_lem_hyp ServerNetHandler_lbcases.
(* not using intuition because i don't want to break or in the goal *)
repeat (break_and; try break_or_hyp);
break_exists;
repeat (break_and; try break_or_hyp);
try congruence.
* exfalso.
repeat find_rewrite.
invcs HNth.
repeat find_reverse_rewrite.
simpl in *. subst. solve_by_inversion.
* fold LockServ_MultiParams in *. (* typeclass stuff *)
repeat find_rewrite.
simpl in *.
find_apply_lem_hyp Nth_tl.
repeat find_rewrite.
intuition; [|intros; subst; solve_by_inversion].
rewrite_update. congruence.
- unfold occurred in *.
match goal with
| H : MsgUnlock = _ |- _ => symmetry in H; repeat find_rewrite; clear H
end.
monad_unfold. find_apply_lem_hyp InputHandler_lbcases.
intuition; break_exists; intuition; congruence.
- unfold occurred in *. congruence.
Qed.

(* Specifications: *)
Lemma Unlock_enables_MsgUnlock :
forall n,
message_enables_label (mkPacket n Server Unlock) MsgUnlock.