From 6af67763d2c25cba67683f6835983a605c60dae3 Mon Sep 17 00:00:00 2001 From: Florian Brandner <florian.brandner@telecom-paris.fr> Date: Tue, 4 May 2021 21:23:41 +0200 Subject: [PATCH] clean up proofs. --- coq/FIFO.v | 208 +++++++++++++++++++--------------------------------- coq/Trace.v | 4 + 2 files changed, 79 insertions(+), 133 deletions(-) diff --git a/coq/FIFO.v b/coq/FIFO.v index fda5cee..314ea82 100644 --- a/coq/FIFO.v +++ b/coq/FIFO.v @@ -40,6 +40,17 @@ Section FIFO. | req::Reqs' => FIFO_req req (FIFO_trace Reqs') end. + Ltac decompose_FIFO_cmds H suffix := + let cmd := fresh suffix in + move : H => /orP [ /eqP cmd | /orP [ /eqP cmd | /orP [ /eqP cmd | H]] ]. + + Lemma lt_FIFO_wait n: n < 3 -> n < FIFO_wait. + Proof. + specialize FIFO_cmds as H. + intros. + by apply ltn_trans with (m := n) in H. + Qed. + Lemma FIFO_trace_time_monotone req Reqs: (FIFO_trace Reqs).(Time) < (FIFO_trace (req::Reqs)).(Time). Proof. @@ -63,38 +74,29 @@ Section FIFO. Proof. intros. specialize FIFO_cmds as Hc. - induction Reqs. - - auto. - - simpl in *. - rewrite -> 3 in_cons in H. - move : H => /orP [/eqP H | /orP [ /eqP H | /orP [/eqP H | H]]]; subst; simpl. - - rewrite leq_add2l. - by apply ltn_trans with (m := 2) in Hc. - - rewrite leq_add2l. - by apply ltn_trans with (m := 1) in Hc. - - rewrite leq_add2l. - by apply ltn_trans with (m := 0) in Hc. - - apply IHReqs in H. - by apply nat_le_lemaxn_add with (x := FIFO_wait) (o := (Date a)) in H. + induction Reqs; auto. + simpl in *. + rewrite -> 3 in_cons in H. + decompose_FIFO_cmds H H; subst; + try (rewrite leq_add2l; by apply lt_FIFO_wait). + apply IHReqs in H. + by apply nat_le_lemaxn_add with (x := FIFO_wait) (o := a.(Date)) in H. Qed. Lemma FIFO_trace_cmd_notin cmd Reqs: is_true ((FIFO_trace Reqs).(Time) < cmd.(CDate)) -> is_true (cmd \notin (FIFO_trace Reqs).(Cmds)). Proof. - intros. - specialize (FIFO_trace_time_ok Reqs cmd) as H1. - destruct (cmd \in Cmds (FIFO_trace Reqs)) eqn:Hin. - - apply H1 in Hin. - contradict Hin. - rewrite -> leqNgt. - by apply /negP /negPn. - - by apply isT. + intros. + destruct (cmd \in Cmds (FIFO_trace Reqs)) eqn:Hin; + try by apply isT. + apply (FIFO_trace_time_ok Reqs cmd) in Hin. + contradict Hin. rewrite -> leqNgt. by apply /negP /negPn. Qed. Lemma FIFO_trace_uniq req Reqs: is_true (uniq (FIFO_trace Reqs).(Cmds)) -> is_true (uniq (FIFO_trace (req::Reqs)).(Cmds)). Proof. - intros. + intros. simpl. apply /andP; split. - rewrite in_cons negb_or. apply /andP. split. @@ -119,112 +121,52 @@ Section FIFO. ACT_to_ACT a b -> Same_Bank a b -> Before a b -> Apart a b T_RC. Proof. - induction Reqs as [| req Reqs']. - - auto. - - intros a b Ia Ib AtA SB aBb. - simpl in *. - move : Ib => /orP [ /eqP Cmdb | /orP [ /eqP Cmdb | /orP [ /eqP Cmdb | Ib]] ]; - move : Ia => /orP [ /eqP Cmda | /orP [ /eqP Cmda | /orP [ /eqP Cmda | Ia]] ]. - - contradict AtA. subst a. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - by destruct (Kind req). - - contradict AtA. subst b. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - destruct (Kind req); apply /negP; rewrite negb_and; apply /orP; by right. - - contradict AtA. subst a. - by unfold ACT_to_ACT, isACT. - - contradict AtA. subst b. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - destruct (Kind req); apply /negP; rewrite negb_and; apply /orP; by right. - - contradict AtA. subst a. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - by destruct (Kind req). - - contradict aBb. subst a b. - unfold Before. simpl. apply /negP. by rewrite ltnn. - - contradict AtA. subst a. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - by destruct (Kind req). - - destruct Reqs'. - - by contradict Ia. - - simpl in Ia. - move : Ia => /orP [ /eqP Cmda | /orP [ /eqP Cmda | /orP [ /eqP Cmda | Ia]] ]. - - contradict AtA. subst a. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - by destruct (Kind r). - - subst. unfold Apart. simpl. - set T := maxn (Time (FIFO_trace Reqs')) (Date r). - unfold maxn. - destruct (T + FIFO_wait < Date req) eqn:Hlt. - - rewrite <- (ltn_add2r 2 _ _) in Hlt. - apply ltn_trans with (n := T + FIFO_wait + 2). - - rewrite addnCAC [(addn (addn T FIFO_wait) (S (S O)))]addnCAC. - rewrite [2 + _]addnC. - rewrite ltn_add2r ltn_add2r. - by specialize FIFO_T_RC. - - auto. - - rewrite addnCAC [(addn (addn T FIFO_wait) (S (S O)))]addnCAC. - rewrite [2 + _]addnC. - rewrite ltn_add2r ltn_add2r. - by specialize FIFO_T_RC. - - contradict AtA. subst a. - by unfold ACT_to_ACT, isACT, PRE_of_req. - - subst. unfold Apart, ACT_of_req. simpl. - - apply FIFO_trace_time_ok in Ia as H. - rewrite <- (leq_add2r T_RC) in H. - - specialize (FIFO_trace_dist r Reqs') as Hdist. - specialize (leq_maxl (Time (FIFO_trace (r :: Reqs'))) ((Date req))) as Hmax. - apply leq_trans with (p := (maxn (Time (FIFO_trace (r :: Reqs'))) (Date req))) in Hdist. - - apply leq_ltn_trans with (p := (Time (FIFO_trace Reqs') + FIFO_wait)) in H. - - rewrite <- (leq_add2r 2) in Hdist. - rewrite addnS in Hdist. - apply ltn_trans with (p := ((Time (FIFO_trace Reqs')) + FIFO_wait) + 1) in H. - - apply ltn_trans with (p := ((maxn (Time (FIFO_trace (r :: Reqs'))) (Date req)) + 2)) in H. - - auto. - - auto. - - rewrite <- addn1. - by rewrite leqnn. - - rewrite ltn_add2l. - by specialize FIFO_T_RC. - - auto. - - contradict AtA. subst b. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - destruct (Kind req); apply /negP; rewrite negb_and; apply /orP; by right. - - contradict AtA. subst b. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - destruct (Kind req); apply /negP; rewrite negb_and; apply /orP; by right. - - contradict AtA. subst a. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - by destruct (Kind req). - - contradict AtA. subst b. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - destruct (Kind req); apply /negP; rewrite negb_and; apply /orP; by right. - - contradict AtA. subst a. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - by destruct (Kind req). - - contradict aBb. subst a. - apply /negP. - unfold Before, ACT_of_req. rewrite <- leqNgt. simpl. - apply (FIFO_trace_time_ok Reqs') in Ib. - apply leq_trans with (p := maxn (Time (FIFO_trace Reqs')) (Date req)) in Ib. - - apply leq_add with (m2 := 0) (n2 := 2) in Ib. - - by rewrite addn0 in Ib. - - by apply leq0n. - apply leq_maxl. - - contradict AtA. subst a. - unfold ACT_to_ACT, isACT, Cmd_of_req, Kind_of_req. simpl. - by destruct (Kind req). - - by apply (IHReqs' a b) in Ia. + induction Reqs as [| req Reqs']; auto. + intros a b Ia Ib AtA SB aBb. + decompose_FIFO_cmds Ib Cmdb; decompose_FIFO_cmds Ia Cmda; + try contradict_AtoA AtA req. + - contradict aBb. subst. unfold Before. apply /negP. by rewrite ltnn. + - destruct Reqs'. + - by contradict Ia. + - decompose_FIFO_cmds Ia Cmda; + try contradict_AtoA AtA req; try contradict_AtoA AtA r; + subst; unfold Apart, ACT_of_req; simpl. + - set T := maxn (FIFO_trace Reqs').(Time) r.(Date). + unfold maxn. simpl. + destruct (T + FIFO_wait < req.(Date)) eqn:Hlt. + 1 : rewrite <- (ltn_add2r 2) in Hlt. + 1 : apply ltn_trans with (n := T + FIFO_wait + 2); auto. + 1,2: rewrite addnCAC [T + FIFO_wait + 2]addnCAC. + 1,2: rewrite [2 + _]addnC. + 1,2: rewrite ltn_add2r ltn_add2r. + 1,2: by specialize FIFO_T_RC. + - set T := maxn (FIFO_trace (r :: Reqs')).(Time) req.(Date). + set Tf := (FIFO_trace Reqs').(Time) + FIFO_wait. + specialize (FIFO_trace_dist r Reqs') as Hdist. + apply leq_trans with (p := T) in Hdist. + - rewrite <- (leq_add2r 2) in Hdist. + rewrite addnS in Hdist. + apply FIFO_trace_time_ok in Ia as H. + rewrite <- (leq_add2r T_RC) in H. + apply leq_ltn_trans with (p := Tf) in H. + - apply ltn_trans with (p := Tf + 1) in H. + - by apply ltn_trans with (p := T + 2) in H. + - rewrite <- addn1. by rewrite leqnn. + - rewrite ltn_add2l. by specialize FIFO_T_RC. + - unfold T. by apply leq_maxl. + - contradict aBb. subst a. + apply /negP. + unfold Before, ACT_of_req. rewrite <- leqNgt. apply nat_le_lemaxn_add. + by apply (FIFO_trace_time_ok Reqs') in Ib. + - by apply (IHReqs' a b) in Ia. Qed. Program Definition FIFO_arbitrate := let State := FIFO_trace Requests in mkTrace State.(Cmds) State.(Time) _ (FIFO_trace_time_ok Requests) (FIFO_trace_T_RC_ok Requests). Next Obligation. - induction Requests. - - auto. - - by apply (FIFO_trace_uniq a) in IHl. + induction Requests; auto. + by apply (FIFO_trace_uniq a) in IHl. Qed. Lemma FIFO_arbiter_handled req: @@ -235,17 +177,17 @@ Section FIFO. exists (Cmd_of_req req 5). unfold FIFO_arbitrate in *. simpl in *. induction Requests. - - by rewrite in_nil in H. - - rewrite in_cons in H. - destruct (req == a) eqn:Heq; move : Heq => /eqP Heq. - - intros. subst. by apply Match_CmdT. - - intros Hc. - simpl in Hc. rewrite -> 3 in_cons in Hc. - move : Hc => /orP [ Cmdb | /orP [ Cmdb | /orP [ Cmdb | Hc]] ]. - - contradict Cmdb. by apply /negP /Command_neq_req_CMD. - - contradict Cmdb. apply /negP /Command_neq_CMD_ACT. - - contradict Cmdb. apply /negP /Command_neq_CMD_PRE. - - rewrite Bool.orb_false_l in H. by apply IHl. + - by rewrite in_nil in H. + - rewrite in_cons in H. + destruct (req == a) eqn:Heq; move : Heq => /eqP Heq. + - intros. subst. by apply Match_CmdT. + - intros Hc. + simpl in Hc. rewrite -> 3 in_cons in Hc. + decompose_FIFO_cmds Hc Cmdb. + - contradict Cmdb. by apply /eqP /Command_neq_req_CMD. + - contradict Cmdb. by apply /eqP /Command_neq_CMD_ACT. + - contradict Cmdb. by apply /eqP /Command_neq_CMD_PRE. + - rewrite Bool.orb_false_l in H. by apply IHl. Qed. Instance FIFO_arbiter : Arbiter_t := diff --git a/coq/Trace.v b/coq/Trace.v index 8164b3b..ede74fc 100644 --- a/coq/Trace.v +++ b/coq/Trace.v @@ -36,3 +36,7 @@ Section Trace. Program Definition Trace_empty := mkTrace [::] 0 _ _ _. End Trace. + +Ltac contradict_AtoA H req := + (contradict H; subst;unfold ACT_to_ACT, isACT, PRE_of_req, Cmd_of_req, Kind_of_req; simpl; destruct (Kind req)); + (done + apply /negP; rewrite negb_and; apply /orP; by right). -- GitLab