Library prosa.analysis.facts.readiness.sequential
(* ----------------------------------[ coqtop ]---------------------------------
Welcome to Coq 8.13.0 (January 2021)
----------------------------------------------------------------------------- *)
Require Export prosa.analysis.definitions.readiness.
Require Export prosa.analysis.definitions.work_bearing_readiness.
Require Export prosa.analysis.facts.behavior.completion.
Require Export prosa.analysis.facts.model.task_arrivals.
Throughout this file, we assume the sequential task readiness model.
In this section, we show some useful properties of the sequential
task readiness model.
Consider any type of job associated with any type of tasks ...
Context {Job : JobType}.
Context {Task : TaskType}.
Context `{JobTask Job Task}.
Context `{JobArrival Job}.
Context `{JobCost Job}.
Context {Task : TaskType}.
Context `{JobTask Job Task}.
Context `{JobArrival Job}.
Context `{JobCost Job}.
... and any kind of processor state.
Consider any arrival sequence with consistent arrivals.
Variable arr_seq : arrival_sequence Job.
Hypothesis H_arrival_times_are_consistent : consistent_arrival_times arr_seq.
(* As it was mentioned in the beginning of this file,
we assume the sequential task readiness model. *)
Instance sequential_ready_instance : JobReady Job PState :=
sequential.sequential_ready_instance arr_seq.
(* Consider any valid schedule of [arr_seq]. *)
Variable sched : schedule PState.
Hypothesis H_valid_schedule : valid_schedule sched arr_seq.
Hypothesis H_arrival_times_are_consistent : consistent_arrival_times arr_seq.
(* As it was mentioned in the beginning of this file,
we assume the sequential task readiness model. *)
Instance sequential_ready_instance : JobReady Job PState :=
sequential.sequential_ready_instance arr_seq.
(* Consider any valid schedule of [arr_seq]. *)
Variable sched : schedule PState.
Hypothesis H_valid_schedule : valid_schedule sched arr_seq.
Consider an FP policy that indicates a reflexive
higher-or-equal priority relation.
First, we show that the sequential readiness model is non-clairvoyant.
Fact sequential_readiness_nonclairvoyance :
nonclairvoyant_readiness sequential_ready_instance.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 48)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
============================
nonclairvoyant_readiness sequential_ready_instance
----------------------------------------------------------------------------- *)
Proof.
intros sched1 sched2 ? ? ID ? LE; rewrite //=.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 57)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
============================
pending sched1 j t && prior_jobs_complete arr_seq sched1 j t =
pending sched2 j t && prior_jobs_complete arr_seq sched2 j t
----------------------------------------------------------------------------- *)
erewrite identical_prefix_pending; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 86)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
============================
pending sched2 j t && prior_jobs_complete arr_seq sched1 j t =
pending sched2 j t && prior_jobs_complete arr_seq sched2 j t
----------------------------------------------------------------------------- *)
destruct (boolP (pending sched2 j t)) as [_ | _] ⇒ //=.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 150)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
============================
prior_jobs_complete arr_seq sched1 j t =
prior_jobs_complete arr_seq sched2 j t
----------------------------------------------------------------------------- *)
destruct (boolP (prior_jobs_complete arr_seq sched2 j t)) as [ALL | NOT_ALL]; apply/eqP.
(* ----------------------------------[ coqtop ]---------------------------------
2 focused subgoals
(shelved: 2) (ID 248)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
ALL : prior_jobs_complete arr_seq sched2 j t
============================
prior_jobs_complete arr_seq sched1 j t == true
subgoal 2 (ID 303) is:
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
- rewrite eqb_id; apply/allP; intros ? IN.
(* ----------------------------------[ coqtop ]---------------------------------
2 focused subgoals
(shelved: 1) (ID 337)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
ALL : prior_jobs_complete arr_seq sched2 j t
x : Job
IN : x \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
============================
completed_by sched1 x t
subgoal 2 (ID 303) is:
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
move: ALL ⇒ /allP ALL; specialize (ALL x IN).
(* ----------------------------------[ coqtop ]---------------------------------
2 focused subgoals
(shelved: 1) (ID 374)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
x : Job
IN : x \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
ALL : (fun x : Job => is_true (completed_by sched2 x t)) x
============================
completed_by sched1 x t
subgoal 2 (ID 303) is:
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
by erewrite identical_prefix_completed_by; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------
1 focused subgoal
(shelved: 1) (ID 303)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
NOT_ALL : ~~ prior_jobs_complete arr_seq sched2 j t
============================
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
- move: NOT_ALL ⇒ /allPn [x IN NCOMP].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 450)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
x : Job
IN : x \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched2 x t
============================
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
rewrite eqbF_neg; apply/allPn; ∃ x ⇒ //.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 484)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
x : Job
IN : x \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched2 x t
============================
~~ completed_by sched1 x t
----------------------------------------------------------------------------- *)
by erewrite identical_prefix_completed_by; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
Qed.
nonclairvoyant_readiness sequential_ready_instance.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 48)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
============================
nonclairvoyant_readiness sequential_ready_instance
----------------------------------------------------------------------------- *)
Proof.
intros sched1 sched2 ? ? ID ? LE; rewrite //=.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 57)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
============================
pending sched1 j t && prior_jobs_complete arr_seq sched1 j t =
pending sched2 j t && prior_jobs_complete arr_seq sched2 j t
----------------------------------------------------------------------------- *)
erewrite identical_prefix_pending; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 86)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
============================
pending sched2 j t && prior_jobs_complete arr_seq sched1 j t =
pending sched2 j t && prior_jobs_complete arr_seq sched2 j t
----------------------------------------------------------------------------- *)
destruct (boolP (pending sched2 j t)) as [_ | _] ⇒ //=.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 150)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
============================
prior_jobs_complete arr_seq sched1 j t =
prior_jobs_complete arr_seq sched2 j t
----------------------------------------------------------------------------- *)
destruct (boolP (prior_jobs_complete arr_seq sched2 j t)) as [ALL | NOT_ALL]; apply/eqP.
(* ----------------------------------[ coqtop ]---------------------------------
2 focused subgoals
(shelved: 2) (ID 248)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
ALL : prior_jobs_complete arr_seq sched2 j t
============================
prior_jobs_complete arr_seq sched1 j t == true
subgoal 2 (ID 303) is:
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
- rewrite eqb_id; apply/allP; intros ? IN.
(* ----------------------------------[ coqtop ]---------------------------------
2 focused subgoals
(shelved: 1) (ID 337)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
ALL : prior_jobs_complete arr_seq sched2 j t
x : Job
IN : x \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
============================
completed_by sched1 x t
subgoal 2 (ID 303) is:
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
move: ALL ⇒ /allP ALL; specialize (ALL x IN).
(* ----------------------------------[ coqtop ]---------------------------------
2 focused subgoals
(shelved: 1) (ID 374)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
x : Job
IN : x \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
ALL : (fun x : Job => is_true (completed_by sched2 x t)) x
============================
completed_by sched1 x t
subgoal 2 (ID 303) is:
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
by erewrite identical_prefix_completed_by; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------
1 focused subgoal
(shelved: 1) (ID 303)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
NOT_ALL : ~~ prior_jobs_complete arr_seq sched2 j t
============================
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
- move: NOT_ALL ⇒ /allPn [x IN NCOMP].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 450)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
x : Job
IN : x \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched2 x t
============================
prior_jobs_complete arr_seq sched1 j t == false
----------------------------------------------------------------------------- *)
rewrite eqbF_neg; apply/allPn; ∃ x ⇒ //.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 484)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
sched1, sched2 : schedule PState
j : Job
h : instant
ID : identical_prefix sched1 sched2 h
t : nat
LE : t <= h
x : Job
IN : x \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched2 x t
============================
~~ completed_by sched1 x t
----------------------------------------------------------------------------- *)
by erewrite identical_prefix_completed_by; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
Qed.
Next, we show that the sequential readiness model ensures that
tasks are sequential. That is, that jobs of the same task
execute in order of their arrival.
Lemma sequential_readiness_implies_sequential_tasks :
sequential_tasks arr_seq sched.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 56)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
============================
sequential_tasks arr_seq sched
----------------------------------------------------------------------------- *)
Proof.
intros j1 j2 t ARR1 ARR2 SAME LT SCHED.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 65)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
============================
completed_by sched j1 t
----------------------------------------------------------------------------- *)
destruct (boolP (job_ready sched j2 t)) as [READY | NREADY].
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 81)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
READY : job_ready sched j2 t
============================
completed_by sched j1 t
subgoal 2 (ID 82) is:
completed_by sched j1 t
----------------------------------------------------------------------------- *)
- move: READY ⇒ /andP [PEND /allP ALL]; apply: ALL.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 163)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
PEND : pending sched j2 t
============================
j1 \in task_arrivals_before arr_seq (job_task j2) (job_arrival j2)
subgoal 2 (ID 82) is:
completed_by sched j1 t
----------------------------------------------------------------------------- *)
rewrite mem_filter; apply/andP; split; first by done.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 196)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
PEND : pending sched j2 t
============================
j1 \in arrivals_between arr_seq 0 (job_arrival j2)
subgoal 2 (ID 82) is:
completed_by sched j1 t
----------------------------------------------------------------------------- *)
by apply arrived_between_implies_in_arrivals ⇒ //.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 82)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
NREADY : ~~ job_ready sched j2 t
============================
completed_by sched j1 t
----------------------------------------------------------------------------- *)
- by apply H_valid_schedule in SCHED; rewrite SCHED in NREADY.
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
Qed.
(* Finally, we show that the sequential readiness model is a
work-bearing readiness model. That is, if a job [j] is pending
but not ready at a time instant [t], then there exists another
(earlier) job of the same task that is pending and ready at time
[t]. *)
Lemma sequential_readiness_implies_work_bearing_readiness :
work_bearing_readiness arr_seq sched.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 67)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
============================
work_bearing_readiness arr_seq sched
----------------------------------------------------------------------------- *)
Proof.
intros j.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 69)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
============================
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
have EX: ∃ k, job_arrival j ≤ k by (∃ (job_arrival j)).
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 80)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
EX : exists k : nat, job_arrival j <= k
============================
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
destruct EX as [k LE]; move: j LE.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 89)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
============================
forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
induction k; intros ? ? ? ARR PEND.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 101)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
subgoal 2 (ID 106) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 101)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
destruct (boolP (job_ready sched j t)) as [READY | NREADY].
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 122)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
READY : job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
subgoal 2 (ID 123) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 122)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
READY : job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
by ∃ j; repeat split; eauto using (H_priority_is_reflexive 0).
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals
subgoal 1 (ID 123) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
subgoal 2 (ID 106) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 123)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
NREADY : ~~ job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 123)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
NREADY : ~~ job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
move: NREADY; rewrite //= PEND Bool.andb_true_l ⇒ /allPn [jhp IN NCOMP].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 217)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
jhp : Job
IN : jhp \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched jhp t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
apply arrives_in_task_arrivals_before_implies_arrives_before in IN; last by done.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 223)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
jhp : Job
IN : job_arrival jhp < job_arrival j
NCOMP : ~~ completed_by sched jhp t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
by exfalso; move: LE; rewrite leqn0 ⇒ /eqP EQ; rewrite EQ in IN.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 106) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 106) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 106)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
LE : job_arrival j <= k.+1
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 106)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
LE : job_arrival j <= k.+1
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
move: LE; rewrite leq_eqVlt ltnS ⇒ /orP [/eqP EQ | LE]; last by apply IHk.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 402)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
destruct (boolP (job_ready sched j t)) as [READY | NREADY].
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 422)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
READY : job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
subgoal 2 (ID 423) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 422)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
READY : job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
by ∃ j; repeat split; eauto using (H_priority_is_reflexive 0).
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 423) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 423)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
NREADY : ~~ job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 423)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
NREADY : ~~ job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
move: NREADY; rewrite //= PEND Bool.andb_true_l ⇒ /allPn [j' IN NCOMP].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 517)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
have LE' : job_arrival j' ≤ k.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 520)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
============================
job_arrival j' <= k
subgoal 2 (ID 522) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 520)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
============================
job_arrival j' <= k
----------------------------------------------------------------------------- *)
by apply arrives_in_task_arrivals_before_implies_arrives_before in IN; rewrite // -ltnS -EQ.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 522) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 522)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
have ARR' : arrives_in arr_seq j'.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 558)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
============================
arrives_in arr_seq j'
subgoal 2 (ID 560) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 558)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
============================
arrives_in arr_seq j'
----------------------------------------------------------------------------- *)
by eapply arrives_in_task_arrivals_implies_arrived; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 560) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 560)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
have PEND' : pending sched j' t.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 574)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
============================
pending sched j' t
subgoal 2 (ID 576) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 574)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
============================
pending sched j' t
----------------------------------------------------------------------------- *)
apply/andP; split; last by done.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 602)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
============================
has_arrived j' t
----------------------------------------------------------------------------- *)
move: PEND ⇒ /andP [LE _].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 644)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
LE : has_arrived j t
============================
has_arrived j' t
----------------------------------------------------------------------------- *)
by unfold has_arrived in *; ssrlia.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 576) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 576)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
specialize (IHk j' LE' t ARR' PEND').
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 800)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
t : instant
j' : Job
IHk : exists j_hp : Job,
arrives_in arr_seq j_hp /\
job_ready sched j_hp t /\ hep_job j_hp j'
j : Job
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
destruct IHk as [j'' [ARR'' [READY'' HEP'']]].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 819)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
t : instant
j', j'' : Job
ARR'' : arrives_in arr_seq j''
READY'' : job_ready sched j'' t
HEP'' : hep_job j'' j'
j : Job
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
∃ j''; repeat split; auto.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 828)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
t : instant
j', j'' : Job
ARR'' : arrives_in arr_seq j''
READY'' : job_ready sched j'' t
HEP'' : hep_job j'' j'
j : Job
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
============================
hep_job j'' j
----------------------------------------------------------------------------- *)
clear EQ; apply arrives_in_task_arrivals_implies_job_task in IN; move: IN ⇒ /eqP EQ.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 878)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
t : instant
j', j'' : Job
ARR'' : arrives_in arr_seq j''
READY'' : job_ready sched j'' t
HEP'' : hep_job j'' j'
j : Job
ARR : arrives_in arr_seq j
PEND : pending sched j t
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
EQ : job_task j' = job_task j
============================
hep_job j'' j
----------------------------------------------------------------------------- *)
by rewrite /hep_job /FP_to_JLFP -EQ.
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
Qed.
End SequentialTasksReadiness.
sequential_tasks arr_seq sched.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 56)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
============================
sequential_tasks arr_seq sched
----------------------------------------------------------------------------- *)
Proof.
intros j1 j2 t ARR1 ARR2 SAME LT SCHED.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 65)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
============================
completed_by sched j1 t
----------------------------------------------------------------------------- *)
destruct (boolP (job_ready sched j2 t)) as [READY | NREADY].
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 81)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
READY : job_ready sched j2 t
============================
completed_by sched j1 t
subgoal 2 (ID 82) is:
completed_by sched j1 t
----------------------------------------------------------------------------- *)
- move: READY ⇒ /andP [PEND /allP ALL]; apply: ALL.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 163)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
PEND : pending sched j2 t
============================
j1 \in task_arrivals_before arr_seq (job_task j2) (job_arrival j2)
subgoal 2 (ID 82) is:
completed_by sched j1 t
----------------------------------------------------------------------------- *)
rewrite mem_filter; apply/andP; split; first by done.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 196)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
PEND : pending sched j2 t
============================
j1 \in arrivals_between arr_seq 0 (job_arrival j2)
subgoal 2 (ID 82) is:
completed_by sched j1 t
----------------------------------------------------------------------------- *)
by apply arrived_between_implies_in_arrivals ⇒ //.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 82)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j1, j2 : Job
t : instant
ARR1 : arrives_in arr_seq j1
ARR2 : arrives_in arr_seq j2
SAME : same_task j1 j2
LT : job_arrival j1 < job_arrival j2
SCHED : scheduled_at sched j2 t
NREADY : ~~ job_ready sched j2 t
============================
completed_by sched j1 t
----------------------------------------------------------------------------- *)
- by apply H_valid_schedule in SCHED; rewrite SCHED in NREADY.
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
Qed.
(* Finally, we show that the sequential readiness model is a
work-bearing readiness model. That is, if a job [j] is pending
but not ready at a time instant [t], then there exists another
(earlier) job of the same task that is pending and ready at time
[t]. *)
Lemma sequential_readiness_implies_work_bearing_readiness :
work_bearing_readiness arr_seq sched.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 67)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
============================
work_bearing_readiness arr_seq sched
----------------------------------------------------------------------------- *)
Proof.
intros j.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 69)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
============================
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
have EX: ∃ k, job_arrival j ≤ k by (∃ (job_arrival j)).
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 80)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
EX : exists k : nat, job_arrival j <= k
============================
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
destruct EX as [k LE]; move: j LE.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 89)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
============================
forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
induction k; intros ? ? ? ARR PEND.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 101)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
subgoal 2 (ID 106) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 101)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
destruct (boolP (job_ready sched j t)) as [READY | NREADY].
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 122)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
READY : job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
subgoal 2 (ID 123) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 122)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
READY : job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
by ∃ j; repeat split; eauto using (H_priority_is_reflexive 0).
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals
subgoal 1 (ID 123) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
subgoal 2 (ID 106) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 123)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
NREADY : ~~ job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 123)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
NREADY : ~~ job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
move: NREADY; rewrite //= PEND Bool.andb_true_l ⇒ /allPn [jhp IN NCOMP].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 217)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
jhp : Job
IN : jhp \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched jhp t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
apply arrives_in_task_arrivals_before_implies_arrives_before in IN; last by done.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 223)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
j : Job
LE : job_arrival j <= 0
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
jhp : Job
IN : job_arrival jhp < job_arrival j
NCOMP : ~~ completed_by sched jhp t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
by exfalso; move: LE; rewrite leqn0 ⇒ /eqP EQ; rewrite EQ in IN.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 106) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 106) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 106)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
LE : job_arrival j <= k.+1
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 106)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
LE : job_arrival j <= k.+1
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
move: LE; rewrite leq_eqVlt ltnS ⇒ /orP [/eqP EQ | LE]; last by apply IHk.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 402)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
destruct (boolP (job_ready sched j t)) as [READY | NREADY].
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 422)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
READY : job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
subgoal 2 (ID 423) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 422)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
READY : job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
by ∃ j; repeat split; eauto using (H_priority_is_reflexive 0).
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 423) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 423)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
NREADY : ~~ job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 423)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
NREADY : ~~ job_ready sched j t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
----------------------------------------------------------------------------- *)
move: NREADY; rewrite //= PEND Bool.andb_true_l ⇒ /allPn [j' IN NCOMP].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 517)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
have LE' : job_arrival j' ≤ k.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 520)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
============================
job_arrival j' <= k
subgoal 2 (ID 522) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 520)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
============================
job_arrival j' <= k
----------------------------------------------------------------------------- *)
by apply arrives_in_task_arrivals_before_implies_arrives_before in IN; rewrite // -ltnS -EQ.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 522) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 522)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
have ARR' : arrives_in arr_seq j'.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 558)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
============================
arrives_in arr_seq j'
subgoal 2 (ID 560) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 558)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
============================
arrives_in arr_seq j'
----------------------------------------------------------------------------- *)
by eapply arrives_in_task_arrivals_implies_arrived; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 560) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 560)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
have PEND' : pending sched j' t.
(* ----------------------------------[ coqtop ]---------------------------------
2 subgoals (ID 574)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
============================
pending sched j' t
subgoal 2 (ID 576) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
{
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 574)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
============================
pending sched j' t
----------------------------------------------------------------------------- *)
apply/andP; split; last by done.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 602)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
============================
has_arrived j' t
----------------------------------------------------------------------------- *)
move: PEND ⇒ /andP [LE _].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 644)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
LE : has_arrived j t
============================
has_arrived j' t
----------------------------------------------------------------------------- *)
by unfold has_arrived in *; ssrlia.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal
subgoal 1 (ID 576) is:
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 576)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
IHk : forall j : Job,
job_arrival j <= k ->
forall t : instant,
arrives_in arr_seq j ->
pending sched j t ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\ job_ready sched j_hp t /\ hep_job j_hp j
j : Job
t : instant
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
j' : Job
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
specialize (IHk j' LE' t ARR' PEND').
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 800)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
t : instant
j' : Job
IHk : exists j_hp : Job,
arrives_in arr_seq j_hp /\
job_ready sched j_hp t /\ hep_job j_hp j'
j : Job
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
destruct IHk as [j'' [ARR'' [READY'' HEP'']]].
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 819)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
t : instant
j', j'' : Job
ARR'' : arrives_in arr_seq j''
READY'' : job_ready sched j'' t
HEP'' : hep_job j'' j'
j : Job
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
============================
exists j_hp : Job,
arrives_in arr_seq j_hp /\
pending sched j_hp t && prior_jobs_complete arr_seq sched j_hp t /\
hep_job j_hp j
----------------------------------------------------------------------------- *)
∃ j''; repeat split; auto.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 828)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
t : instant
j', j'' : Job
ARR'' : arrives_in arr_seq j''
READY'' : job_ready sched j'' t
HEP'' : hep_job j'' j'
j : Job
ARR : arrives_in arr_seq j
PEND : pending sched j t
EQ : job_arrival j = k.+1
IN : j' \in task_arrivals_before arr_seq (job_task j) (job_arrival j)
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
============================
hep_job j'' j
----------------------------------------------------------------------------- *)
clear EQ; apply arrives_in_task_arrivals_implies_job_task in IN; move: IN ⇒ /eqP EQ.
(* ----------------------------------[ coqtop ]---------------------------------
1 subgoal (ID 878)
Job : JobType
Task : TaskType
H : JobTask Job Task
H0 : JobArrival Job
H1 : JobCost Job
PState : Type
H2 : ProcessorState Job PState
arr_seq : arrival_sequence Job
H_arrival_times_are_consistent : consistent_arrival_times arr_seq
sched : schedule PState
H_valid_schedule : valid_schedule sched arr_seq
H3 : FP_policy Task
H_priority_is_reflexive : reflexive_priorities
k : nat
t : instant
j', j'' : Job
ARR'' : arrives_in arr_seq j''
READY'' : job_ready sched j'' t
HEP'' : hep_job j'' j'
j : Job
ARR : arrives_in arr_seq j
PEND : pending sched j t
NCOMP : ~~ completed_by sched j' t
LE' : job_arrival j' <= k
ARR' : arrives_in arr_seq j'
PEND' : pending sched j' t
EQ : job_task j' = job_task j
============================
hep_job j'' j
----------------------------------------------------------------------------- *)
by rewrite /hep_job /FP_to_JLFP -EQ.
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
}
(* ----------------------------------[ coqtop ]---------------------------------
No more subgoals.
----------------------------------------------------------------------------- *)
Qed.
End SequentialTasksReadiness.