Library prosa.analysis.facts.behavior.arrivals
Require Export prosa.behavior.all.
Require Export prosa.util.all.
Require Export prosa.model.task.arrivals.
Require Export prosa.util.all.
Require Export prosa.model.task.arrivals.
Consider any kinds of jobs with arrival times.
A job that arrives in some interval
[t1, t2)
certainly arrives before
time t2.
Lemma arrived_before_has_arrived:
∀ j t,
arrived_before j t →
has_arrived j t.
End ArrivalPredicates.
∀ j t,
arrived_before j t →
has_arrived j t.
End ArrivalPredicates.
In this section, we relate job readiness to has_arrived.
Consider any kinds of jobs and any kind of processor state.
Consider any schedule...
...and suppose that jobs have a cost, an arrival time, and a
notion of readiness.
First, we note that readiness models are by definition consistent
w.r.t. pending.
Next, we observe that a given job must have arrived to be ready...
...and lift this observation also to the level of whole schedules.
Lemma jobs_must_arrive_to_be_ready:
jobs_must_be_ready_to_execute sched →
jobs_must_arrive_to_execute sched.
jobs_must_be_ready_to_execute sched →
jobs_must_arrive_to_execute sched.
Furthermore, in a valid schedule, jobs must arrive to execute.
Corollary valid_schedule_implies_jobs_must_arrive_to_execute:
∀ arr_seq,
valid_schedule sched arr_seq →
jobs_must_arrive_to_execute sched.
∀ arr_seq,
valid_schedule sched arr_seq →
jobs_must_arrive_to_execute sched.
Since backlogged jobs are by definition ready, any backlogged job must have arrived.
Similarly, since backlogged jobs are by definition pending, any
backlogged job must be incomplete.
Lemma backlogged_implies_incomplete:
∀ j t,
backlogged sched j t → ~~ completed_by sched j t.
End Arrived.
∀ j t,
backlogged sched j t → ~~ completed_by sched j t.
End Arrived.
We add some of the above lemmas to the "Hint Database"
basic_facts, so the auto tactic will be able to use them.
Global Hint Resolve
valid_schedule_implies_jobs_must_arrive_to_execute
jobs_must_arrive_to_be_ready
: basic_facts.
valid_schedule_implies_jobs_must_arrive_to_execute
jobs_must_arrive_to_be_ready
: basic_facts.
In this section, we establish useful facts about arrival sequence prefixes.
Consider any kind of tasks and jobs.
Context {Job: JobType}.
Context {Task : TaskType}.
Context `{JobArrival Job}.
Context `{JobTask Job Task}.
Context {Task : TaskType}.
Context `{JobArrival Job}.
Context `{JobTask Job Task}.
Consider any job arrival sequence.
We begin with basic lemmas for manipulating the sequences.
We show that the set of arriving jobs can be split
into disjoint intervals.
Lemma arrivals_between_cat:
∀ t1 t t2,
t1 ≤ t →
t ≤ t2 →
arrivals_between arr_seq t1 t2 =
arrivals_between arr_seq t1 t ++ arrivals_between arr_seq t t2.
∀ t1 t t2,
t1 ≤ t →
t ≤ t2 →
arrivals_between arr_seq t1 t2 =
arrivals_between arr_seq t1 t ++ arrivals_between arr_seq t t2.
We also prove a stronger version of the above lemma
in the case of arrivals that satisfy a predicate P.
Lemma arrivals_P_cat:
∀ P t t1 t2,
t1 ≤ t < t2 →
arrivals_between_P arr_seq P t1 t2 =
arrivals_between_P arr_seq P t1 t ++ arrivals_between_P arr_seq P t t2.
∀ P t t1 t2,
t1 ≤ t < t2 →
arrivals_between_P arr_seq P t1 t2 =
arrivals_between_P arr_seq P t1 t ++ arrivals_between_P arr_seq P t t2.
The same observation applies to membership in the set of
arrived jobs.
Lemma arrivals_between_mem_cat:
∀ j t1 t t2,
t1 ≤ t →
t ≤ t2 →
j \in arrivals_between arr_seq t1 t2 =
(j \in arrivals_between arr_seq t1 t ++ arrivals_between arr_seq t t2).
∀ j t1 t t2,
t1 ≤ t →
t ≤ t2 →
j \in arrivals_between arr_seq t1 t2 =
(j \in arrivals_between arr_seq t1 t ++ arrivals_between arr_seq t t2).
We observe that we can grow the considered interval without
"losing" any arrived jobs, i.e., membership in the set of arrived jobs
is monotonic.
Lemma arrivals_between_sub:
∀ j t1 t1' t2 t2',
t1' ≤ t1 →
t2 ≤ t2' →
j \in arrivals_between arr_seq t1 t2 →
j \in arrivals_between arr_seq t1' t2'.
End Composition.
∀ j t1 t1' t2 t2',
t1' ≤ t1 →
t2 ≤ t2' →
j \in arrivals_between arr_seq t1 t2 →
j \in arrivals_between arr_seq t1' t2'.
End Composition.
Next, we relate the arrival prefixes with job arrival times.
Assume that job arrival times are consistent.
First, we prove that if a job belongs to the prefix
(jobs_arrived_before t), then it arrives in the arrival sequence.
Lemma in_arrivals_implies_arrived:
∀ j t1 t2,
j \in arrivals_between arr_seq t1 t2 →
arrives_in arr_seq j.
∀ j t1 t2,
j \in arrivals_between arr_seq t1 t2 →
arrives_in arr_seq j.
We also prove a weaker version of the above lemma.
Next, we prove that if a job belongs to the prefix
(jobs_arrived_between t1 t2), then it indeed arrives between t1 and
t2.
Lemma in_arrivals_implies_arrived_between:
∀ j t1 t2,
j \in arrivals_between arr_seq t1 t2 →
arrived_between j t1 t2.
∀ j t1 t2,
j \in arrivals_between arr_seq t1 t2 →
arrived_between j t1 t2.
Similarly, if a job belongs to the prefix (jobs_arrived_before t),
then it indeed arrives before time t.
Lemma in_arrivals_implies_arrived_before:
∀ j t,
j \in arrivals_before arr_seq t →
arrived_before j t.
∀ j t,
j \in arrivals_before arr_seq t →
arrived_before j t.
Similarly, we prove that if a job from the arrival sequence arrives
before t, then it belongs to the sequence (jobs_arrived_before t).
Lemma arrived_between_implies_in_arrivals:
∀ j t1 t2,
arrives_in arr_seq j →
arrived_between j t1 t2 →
j \in arrivals_between arr_seq t1 t2.
∀ j t1 t2,
arrives_in arr_seq j →
arrived_between j t1 t2 →
j \in arrivals_between arr_seq t1 t2.
Lemma job_arrival_between:
∀ j P t1 t2,
j \in arrivals_between_P arr_seq P t1 t2 →
t1 ≤ job_arrival j < t2.
∀ j P t1 t2,
j \in arrivals_between_P arr_seq P t1 t2 →
t1 ≤ job_arrival j < t2.
Lemma job_in_arrivals_between:
∀ j t1 t2,
arrives_in arr_seq j →
t1 ≤ job_arrival j < t2 →
j \in arrivals_between arr_seq t1 t2.
∀ j t1 t2,
arrives_in arr_seq j →
t1 ≤ job_arrival j < t2 →
j \in arrivals_between arr_seq t1 t2.
Next, we prove that if the arrival sequence doesn't contain duplicate
jobs, the same applies for any of its prefixes.
Lemma arrivals_uniq:
arrival_sequence_uniq arr_seq →
∀ t1 t2, uniq (arrivals_between arr_seq t1 t2).
arrival_sequence_uniq arr_seq →
∀ t1 t2, uniq (arrivals_between arr_seq t1 t2).
Also note that there can't by any arrivals in an empty time interval.
Given jobs j1 and j2 in arrivals_between_P arr_seq P t1 t2, the fact that
j2 arrives strictly before j1 implies that j2 also belongs in the sequence
arrivals_between_P arr_seq P t1 (job_arrival j1).
Lemma arrival_lt_implies_job_in_arrivals_between_P:
∀ (j1 j2 : Job) (P : Job → bool) (t1 t2 : instant),
(j1 \in arrivals_between_P arr_seq P t1 t2) →
(j2 \in arrivals_between_P arr_seq P t1 t2) →
job_arrival j2 < job_arrival j1 →
j2 \in arrivals_between_P arr_seq P t1 (job_arrival j1).
End ArrivalTimes.
End ArrivalSequencePrefix.
∀ (j1 j2 : Job) (P : Job → bool) (t1 t2 : instant),
(j1 \in arrivals_between_P arr_seq P t1 t2) →
(j2 \in arrivals_between_P arr_seq P t1 t2) →
job_arrival j2 < job_arrival j1 →
j2 \in arrivals_between_P arr_seq P t1 (job_arrival j1).
End ArrivalTimes.
End ArrivalSequencePrefix.