Commit 4c3e55e7 authored by Felipe Cerqueira's avatar Felipe Cerqueira

Remove repeated lemmas

parent d0dfa9b4
......@@ -24,7 +24,7 @@ Module ArrivalBounds.
(* In this section, we prove an upper bound on the number of jobs that can arrive
in any interval. *)
Section SporadicArrivalsAfterQuietTime.
Section BoundOnSporadicArrivals.
(* Assume that jobs are sporadic. *)
Hypothesis H_sporadic_tasks: sporadic_task_model task_period arr_seq job_task.
......@@ -119,106 +119,23 @@ Module ArrivalBounds.
Let a_first := job_arrival j_first.
Let a_last := job_arrival j_last.
(* Next, we prove some auxiliary lemmas.
First, we show that the jobs in the sequence satisfy some basic properties... *)
Local Corollary sporadic_arrival_bound_properties_of_nth:
(* Recall from task_arrival.v the properties of the n-th job ...*)
Corollary sporadic_arrival_bound_properties_of_nth:
forall idx,
idx < num_arrivals ->
t1 <= job_arrival (nth_task idx) < t2 /\
job_task (nth_task idx) = tsk.
Proof.
intros idx LTidx.
have IN: nth_task idx \in sorted_jobs by rewrite mem_nth // size_sort.
rewrite mem_sort in IN.
rewrite 2!mem_filter in IN.
move: IN => /andP [JOB /andP [GE LT]]; apply JobIn_arrived in LT.
split; last by apply/eqP.
by apply/andP; split.
by apply sorted_arrivals_properties_of_nth.
Qed.
(* ...and that consecutive jobs in the sequence are different. *)
Local Corollary sporadic_arrival_bound_current_differs_from_next:
forall idx,
idx < num_arrivals.-1 ->
nth_task idx <> nth_task idx.+1.
Proof.
rename H_at_least_two_jobs into TWO.
intros idx LT; apply/eqP.
rewrite nth_uniq ?size_sort /arriving_jobs -/(num_arrivals_of_task _ _ _ _ _)
-/num_arrivals; first by rewrite neq_ltn ltnSn orTb.
{
apply leq_trans with (n := num_arrivals.-1); first by done.
by destruct num_arrivals; first by rewrite ltn0 in TWO.
}
{
destruct num_arrivals; first by rewrite ltn0 in TWO.
by simpl in LT; rewrite ltnS.
}
{
rewrite sort_uniq filter_uniq // filter_uniq //.
by apply JobIn_uniq.
}
Qed.
(* Since the list is sorted, we prove that each job arrives at
least (task_period tsk) time units after the previous job. *)
Lemma sporadic_arrival_bound_separated_by_period:
forall idx,
idx < num_arrivals.-1 ->
job_arrival (nth_task idx.+1) >= job_arrival (nth_task idx) + task_period tsk.
Proof.
have NTH := sporadic_arrival_bound_properties_of_nth.
have NEQ := sporadic_arrival_bound_current_differs_from_next.
rename H_sporadic_tasks into SPO, H_at_least_two_jobs into TWO.
intros idx LT.
exploit (NTH idx); last intro NTH1.
{
apply leq_trans with (n := num_arrivals.-1); first by done.
by destruct num_arrivals; first by rewrite ltn0 in TWO.
}
exploit (NTH idx.+1); last intro NTH2.
{
destruct num_arrivals; first by rewrite ltn0 in TWO.
by simpl in LT; rewrite ltnS.
}
move: NTH1 NTH2 => [_ JOB1] [_ JOB2].
rewrite -JOB1.
apply SPO; [by apply NEQ | by rewrite JOB1 JOB2 |].
suff ORDERED: by_arrival_time (nth_task idx) (nth_task idx.+1) by done.
apply sort_ordered;
first by apply sort_sorted; intros x y; apply leq_total.
by rewrite size_sort.
Qed.
(* By induction, we prove that that each job with index 'idx' arrives at
least idx*(task_period tsk) units after the first job. *)
Lemma sporadic_arrival_bound_distance_from_first_job:
forall idx,
idx < num_arrivals ->
job_arrival (nth_task idx) >= a_first + idx * task_period tsk.
Proof.
have SEP := sporadic_arrival_bound_separated_by_period.
unfold sporadic_task_model in *.
rename H_sporadic_tasks into SPO.
induction idx; first by intros _; rewrite mul0n addn0.
intros LT.
have LT': idx < num_arrivals by apply leq_ltn_trans with (n := idx.+1).
specialize (IHidx LT').
apply leq_trans with (n := job_arrival (nth_task idx) + task_period tsk);
first by rewrite mulSn [task_period _ + _]addnC addnA leq_add2r.
apply SEP.
by rewrite -(ltn_add2r 1) 2!addn1 (ltn_predK LT).
Qed.
(* Therefore, the first and last jobs are separated by at least
(num_arrivals - 1) periods. *)
(* ...and the distance between the first and last jobs. *)
Corollary sporadic_arrival_bound_distance_between_first_and_last:
a_last >= a_first + (num_arrivals-1) * task_period tsk.
Proof.
have DIST := sporadic_arrival_bound_distance_from_first_job.
rename H_at_least_two_jobs into TWO.
rewrite subn1; apply DIST.
by destruct num_arrivals; first by rewrite ltn0 in TWO.
apply sorted_arrivals_distance_between_first_and_last; try (by done).
by apply leq_ltn_trans with (n := 1).
Qed.
(* Because the number of arrivals is larger than the ceiling term,
......@@ -300,7 +217,7 @@ Module ArrivalBounds.
by apply sporadic_task_arrival_bound_at_least_two_jobs; rewrite CEIL.
Qed.
End SporadicArrivalsAfterQuietTime.
End BoundOnSporadicArrivals.
End Lemmas.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment