Built with
Alectryon , running Coq+SerAPI v8.20.0+0.20.0. Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents. Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus. On Mac, use
⌘ instead of
Ctrl .
Require Export prosa.model.schedule.work_conserving.[Loading ML file ssrmatching_plugin.cmxs (using legacy method) ... done ] [Loading ML file ssreflect_plugin.cmxs (using legacy method) ... done ] [Loading ML file ring_plugin.cmxs (using legacy method) ... done ] Serlib plugin: coq-elpi.elpi is not available: serlib support is missing.
Incremental checking for commands in this plugin will be impacted. [Loading ML file coq-elpi.elpi ... done ] [Loading ML file zify_plugin.cmxs (using legacy method) ... done ] [Loading ML file micromega_core_plugin.cmxs (using legacy method) ... done ] [Loading ML file micromega_plugin.cmxs (using legacy method) ... done ] [Loading ML file btauto_plugin.cmxs (using legacy method) ... done ] Notation "_ + _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ - _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ < _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ > _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ * _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Require Export prosa.analysis.definitions.job_properties.
Require Export prosa.analysis.facts.model.service_of_jobs.
Require Export prosa.analysis.definitions.work_bearing_readiness.
Require Export prosa.analysis.facts.priority.inversion .
(** * Existence of Busy Interval for JLFP-models *)
(** In this module we derive a sufficient condition for existence of
busy intervals for uni-processor for JLFP schedulers. *)
Section ExistsBusyIntervalJLFP .
(** Consider any type of tasks ... *)
Context {Task : TaskType}.
Context `{TaskCost Task}.
(** ... and any type of jobs associated with these tasks. *)
Context {Job : JobType}.
Context {JobTask : JobTask Job Task}.
Context {Arrival : JobArrival Job}.
Context {Cost : JobCost Job}.
(** Consider any valid arrival sequence. *)
Variable arr_seq : arrival_sequence Job.
Hypothesis H_valid_arrival_time : valid_arrival_sequence arr_seq.
(** Next, consider any schedule of this arrival sequence ... *)
Context {PState : ProcessorState Job}.
Variable sched : schedule PState.
Hypothesis H_jobs_come_from_arrival_sequence :
jobs_come_from_arrival_sequence sched arr_seq.
(** ... where jobs do not execute before their arrival or after completion. *)
Hypothesis H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute sched.
Hypothesis H_completed_jobs_dont_execute : completed_jobs_dont_execute sched.
(** Assume a given JLFP policy. *)
Context {JLFP : JLFP_policy Job}.
(** Further, allow for any work-bearing notion of job readiness. *)
Context `{@JobReady Job PState Cost Arrival}.
Hypothesis H_job_ready : work_bearing_readiness arr_seq sched.
(** For simplicity, let's define some local names. *)
Let job_pending_at := pending sched.
Let job_completed_by := completed_by sched.
(** Consider an arbitrary task [tsk]. *)
Variable tsk : Task.
(** Consider an arbitrary job [j]. *)
Variable j : Job.
Hypothesis H_from_arrival_sequence : arrives_in arr_seq j.
Hypothesis H_job_task : job_of_task tsk j.
Hypothesis H_job_cost_positive : job_cost_positive j.
(** Recall the list of jobs that arrive in any interval. *)
Let quiet_time t1 := quiet_time arr_seq sched j t1.
Let quiet_time_dec t1 := quiet_time_dec arr_seq sched j t1.
Let busy_interval_prefix t1 t2 := busy_interval_prefix arr_seq sched j t1 t2.
Let busy_interval t1 t2 := busy_interval arr_seq sched j t1 t2.
Let is_priority_inversion_bounded_by K := priority_inversion_of_job_is_bounded_by arr_seq sched j K.
(** We begin by proving a few basic lemmas about busy intervals. *)
Section BasicLemmas .
(** Assume that the priority relation is reflexive. *)
Hypothesis H_priority_is_reflexive : reflexive_job_priorities JLFP.
(** Consider any busy interval <<[t1, t2)>> of job [j]. *)
Variable t1 t2 : instant.
Hypothesis H_busy_interval : busy_interval t1 t2.
(** We prove that job [j] completes by the end of the busy interval. *)
Lemma job_completes_within_busy_interval :
job_completed_by j t2.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_priority_is_reflexive : reflexive_job_priorities
JLFP t1, t2 : instant H_busy_interval : busy_interval t1 t2
job_completed_by j t2
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_priority_is_reflexive : reflexive_job_priorities
JLFP t1, t2 : instant H_busy_interval : busy_interval t1 t2
job_completed_by j t2
rename H_priority_is_reflexive into REFL, H_busy_interval into BUSY.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop REFL : reflexive_job_priorities JLFP t1, t2 : instant BUSY : busy_interval t1 t2
job_completed_by j t2
move : BUSY => [[_ [_ [_ /andP [_ ARR]]]] QUIET].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop REFL : reflexive_job_priorities JLFP t1, t2 : instant ARR : job_arrival j < t2 QUIET : classical.quiet_time arr_seq sched j t2
job_completed_by j t2
exact : QUIET.
Qed .
End BasicLemmas .
(** In this section, we prove that during a busy interval there
always exists a pending job. *)
Section ExistsPendingJob .
(** Let <<[t1, t2]>> be any interval where time [t1] is quiet and time [t2] is not quiet. *)
Variable t1 t2 : instant.
Hypothesis H_interval : t1 <= t2.
Hypothesis H_quiet : quiet_time t1.
Hypothesis H_not_quiet : ~ quiet_time t2.
(** Then, we prove that there is a job pending at time [t2]
that has higher or equal priority (with respect to [tsk]). *)
Lemma not_quiet_implies_exists_pending_job :
exists j_hp ,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\
~ job_completed_by j_hp t2.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 H_quiet : quiet_time t1 H_not_quiet : ~ quiet_time t2
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 H_quiet : quiet_time t1 H_not_quiet : ~ quiet_time t2
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
rename H_quiet into QUIET, H_not_quiet into NOTQUIET.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
destruct (has (fun j_hp => (~~ job_completed_by j_hp t2) && hep_job j_hp j)
(arrivals_between arr_seq t1 t2)) eqn :COMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : has
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j)
(arrivals_between arr_seq t1 t2) = true
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : has
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j)
(arrivals_between arr_seq t1 t2) = true
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
move : COMP => /hasP [j_hp ARR /andP [NOTCOMP HP]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 j_hp : Job ARR : j_hp \in arrivals_between arr_seq t1 t2 NOTCOMP : ~~ job_completed_by j_hp t2 HP : hep_job j_hp j
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
move : (ARR) => INarr.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 j_hp : Job ARR : j_hp \in arrivals_between arr_seq t1 t2 NOTCOMP : ~~ job_completed_by j_hp t2 HP : hep_job j_hp j INarr : j_hp \in arrivals_between arr_seq t1 t2
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
apply in_arrivals_implies_arrived_between in ARR => [|//].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 j_hp : Job ARR : arrived_between j_hp t1 t2 NOTCOMP : ~~ job_completed_by j_hp t2 HP : hep_job j_hp j INarr : j_hp \in arrivals_between arr_seq t1 t2
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
apply in_arrivals_implies_arrived in INarr.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 j_hp : Job ARR : arrived_between j_hp t1 t2 NOTCOMP : ~~ job_completed_by j_hp t2 HP : hep_job j_hp j INarr : arrives_in arr_seq j_hp
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
by exists j_hp ; repeat split ; last by apply /negP.
} Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : has
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j)
(arrivals_between arr_seq t1 t2) = false
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : has
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j)
(arrivals_between arr_seq t1 t2) = false
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
apply negbT in COMP; rewrite -all_predC in COMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : all
(predC
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j))
(arrivals_between arr_seq t1 t2)
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
move : COMP => /allP COMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : {in arrivals_between arr_seq t1 t2,
forall x : Job,
predC
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j) x}
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
exfalso ; apply NOTQUIET; intros j_hp IN HP ARR.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : {in arrivals_between arr_seq t1 t2,
forall x : Job,
predC
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j) x} j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2
completed_by sched j_hp t2
destruct (ltnP (job_arrival j_hp) t1) as [BEFORE | AFTER];
first by specialize (QUIET j_hp IN HP BEFORE); apply completion_monotonic with (t := t1).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : {in arrivals_between arr_seq t1 t2,
forall x : Job,
predC
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j) x} j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2 AFTER : t1 <= job_arrival j_hp
completed_by sched j_hp t2
feed (COMP j_hp). Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : {in arrivals_between arr_seq t1 t2,
forall x : Job,
predC
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j) x} j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2 AFTER : t1 <= job_arrival j_hp
j_hp \in arrivals_between arr_seq t1 t2
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 COMP : {in arrivals_between arr_seq t1 t2,
forall x : Job,
predC
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j) x} j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2 AFTER : t1 <= job_arrival j_hp
j_hp \in arrivals_between arr_seq t1 t2
by apply : arrived_between_implies_in_arrivals => //; apply /andP; split . } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t1, t2 : instant H_interval : t1 <= t2 QUIET : quiet_time t1 NOTQUIET : ~ quiet_time t2 j_hp : Job COMP : (fun x : Job =>
is_true
(predC
(fun j_hp : Job =>
~~ job_completed_by j_hp t2 &&
hep_job j_hp j) x)) j_hp IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2 AFTER : t1 <= job_arrival j_hp
completed_by sched j_hp t2
by rewrite /= HP andbT negbK in COMP.
}
Qed .
End ExistsPendingJob .
(** In this section, we prove that during a busy interval the
processor is never idle. *)
Section ProcessorAlwaysBusy .
(** Assume that the schedule is work-conserving ... *)
Hypothesis H_work_conserving : work_conserving arr_seq sched.
(** ... and the priority relation is reflexive and transitive. *)
Hypothesis H_priority_is_reflexive : reflexive_job_priorities JLFP.
Hypothesis H_priority_is_transitive : transitive_job_priorities JLFP.
(** Consider any busy interval prefix <<[t1, t2)>>. *)
Variable t1 t2 : instant.
Hypothesis H_busy_interval_prefix : busy_interval_prefix t1 t2.
(** We prove that if the processor is idle at a time instant [t],
then the next time instant [t+1] will be a quiet time. *)
Lemma idle_time_implies_quiet_time_at_the_next_time_instant :
forall (t : instant),
is_idle arr_seq sched t ->
quiet_time t.+1 .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2
forall t : instant,
is_idle arr_seq sched t -> quiet_time t.+1
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2
forall t : instant,
is_idle arr_seq sched t -> quiet_time t.+1
intros t IDLE jhp ARR HP AB.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1
completed_by sched jhp t.+1
apply negbNE; apply /negP; intros NCOMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1
False
have PEND : job_pending_at jhp t.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1
job_pending_at jhp t
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1
job_pending_at jhp t
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1
~~ completed_by sched jhp t
by move : NCOMP; apply contra, completion_monotonic. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1 PEND : job_pending_at jhp t
False
apply H_job_ready in PEND => //; destruct PEND as [j' [ARR' [READY' _]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1 j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t
False
move :(H_work_conserving j' t) => WC.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1 j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t WC : arrives_in arr_seq j' ->
backlogged sched j' t ->
exists j_other : Job,
scheduled_at sched j_other t
False
feed_n 2 WC => [//||]. Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1 j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t WC : backlogged sched j' t ->
exists j_other : Job,
scheduled_at sched j_other t
backlogged sched j' t
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1 j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t WC : backlogged sched j' t ->
exists j_other : Job,
scheduled_at sched j_other t
backlogged sched j' t
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1 j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t WC : backlogged sched j' t ->
exists j_other : Job,
scheduled_at sched j_other t
~~ scheduled_at sched j' t
exact : not_scheduled_when_idle. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1 j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t WC : exists j_other : Job,
scheduled_at sched j_other t
False
move : WC => [jo +]; apply /negP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : instant IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j AB : arrived_before jhp t.+1 NCOMP : ~~ completed_by sched jhp t.+1 j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t jo : Job
~~ scheduled_at sched jo t
exact : not_scheduled_when_idle.
Qed .
(** Next, we prove that at any time instant [t] within the busy interval there exists a job
[jhp] such that (1) job [jhp] is pending at time [t] and (2) job [jhp] has higher-or-equal
priority than task [tsk]. *)
Lemma pending_hp_job_exists :
forall t ,
t1 <= t < t2 ->
exists jhp ,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\
hep_job jhp j.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2
forall t : nat,
t1 <= t < t2 ->
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2
forall t : nat,
t1 <= t < t2 ->
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
move => t /andP [GE LT]; move : (H_busy_interval_prefix) => [_ [QTt [NQT REL]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
move : (ltngtP t1.+1 t2) => [GT|CONTR|EQ]; first last .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 EQ : t1.+1 = t2
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 EQ : t1.+1 = t2
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
subst t2; rewrite ltnS in LT.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1 : instant H_busy_interval_prefix : busy_interval_prefix t1 t1.+1 t : nat GE : t1 <= t QTt : classical.quiet_time arr_seq sched j t1 REL : t1 <= job_arrival j < t1.+1 NQT : forall t : nat,
t1 < t < t1.+1 ->
~ classical.quiet_time arr_seq sched j tLT : t <= t1
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
have EQ: t1 = t by apply /eqP; rewrite eqn_leq; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1 : instant H_busy_interval_prefix : busy_interval_prefix t1 t1.+1 t : nat GE : t1 <= t QTt : classical.quiet_time arr_seq sched j t1 REL : t1 <= job_arrival j < t1.+1 NQT : forall t : nat,
t1 < t < t1.+1 ->
~ classical.quiet_time arr_seq sched j tLT : t <= t1 EQ : t1 = t
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
subst t1; clear GE LT.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t : nat NQT : forall t0 : nat,
t < t0 < t.+1 ->
~ classical.quiet_time arr_seq sched j t0REL : t <= job_arrival j < t.+1 QTt : classical.quiet_time arr_seq sched j t H_busy_interval_prefix : busy_interval_prefix t t.+1
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
exists j ; repeat split => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t : nat NQT : forall t0 : nat,
t < t0 < t.+1 ->
~ classical.quiet_time arr_seq sched j t0REL : t <= job_arrival j < t.+1 QTt : classical.quiet_time arr_seq sched j t H_busy_interval_prefix : busy_interval_prefix t t.+1
job_pending_at j t
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t : nat NQT : forall t0 : nat,
t < t0 < t.+1 ->
~ classical.quiet_time arr_seq sched j t0REL : t <= job_arrival j < t.+1 QTt : classical.quiet_time arr_seq sched j t H_busy_interval_prefix : busy_interval_prefix t t.+1
job_pending_at j t
move : REL; rewrite ltnS -eqn_leq eq_sym; move => /eqP REL.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t : nat NQT : forall t0 : nat,
t < t0 < t.+1 ->
~ classical.quiet_time arr_seq sched j t0QTt : classical.quiet_time arr_seq sched j t H_busy_interval_prefix : busy_interval_prefix t t.+1 REL : job_arrival j = t
job_pending_at j t
by rewrite -REL; eapply job_pending_at_arrival; eauto 2 .
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 CONTR : t2 < t1.+1
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
by exfalso ; move_neq_down CONTR; eapply leq_ltn_trans; eauto 2 .
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
have EX: exists hp__seq : seq Job,
forall j__hp , j__hp \in hp__seq <-> arrives_in arr_seq j__hp /\ job_pending_at j__hp t /\ hep_job j__hp j.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2
exists hp__seq : seq Job,
forall j__hp : Job,
j__hp \in hp__seq <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2
exists hp__seq : seq Job,
forall j__hp : Job,
j__hp \in hp__seq <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
exists (filter (fun jo => (job_pending_at jo t) && (hep_job jo j)) (arrivals_between arr_seq 0 t.+1 )).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2
forall j__hp : Job,
j__hp
\in [seq jo <- arrivals_between arr_seq 0 t.+1
| job_pending_at jo t
& hep_job jo j] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
intros ; split ; intros T.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 j__hp : Job T : j__hp
\in [seq jo <-
arrivals_between arr_seq 0 t.+1
|
job_pending_at jo t
&
hep_job jo j]
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 j__hp : Job T : j__hp
\in [seq jo <-
arrivals_between arr_seq 0 t.+1
|
job_pending_at jo t
&
hep_job jo j]
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
move : T; rewrite mem_filter; move => /andP [/andP [PEN HP] IN].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 j__hp : Job PEN : job_pending_at j__hp t HP : hep_job j__hp j IN : j__hp \in arrivals_between arr_seq 0 t.+1
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
repeat split ; eauto using in_arrivals_implies_arrived.
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 j__hp : Job T : arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
j__hp
\in [seq jo <- arrivals_between arr_seq 0 t.+1
| job_pending_at jo t
& hep_job jo j]
move : T => [ARR [PEN HP]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 j__hp : Job ARR : arrives_in arr_seq j__hp PEN : job_pending_at j__hp t HP : hep_job j__hp j
j__hp
\in [seq jo <- arrivals_between arr_seq 0 t.+1
| job_pending_at jo t
& hep_job jo j]
rewrite mem_filter; apply /andP; split ; first (apply /andP; split => //).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 j__hp : Job ARR : arrives_in arr_seq j__hp PEN : job_pending_at j__hp t HP : hep_job j__hp j
j__hp \in arrivals_between arr_seq 0 t.+1
apply : arrived_between_implies_in_arrivals => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 j__hp : Job ARR : arrives_in arr_seq j__hp PEN : job_pending_at j__hp t HP : hep_job j__hp j
arrived_between j__hp 0 t.+1
by apply /andP; split ; last rewrite ltnS; move : PEN => /andP [T _].
} Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 EX : exists hp__seq : seq Job,
forall j__hp : Job,
j__hp \in hp__seq <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
move : EX => [hp__seq SE]; case FL: (hp__seq) => [ | jhp jhps].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 hp__seq : seq Job SE : forall j__hp : Job,
j__hp \in hp__seq <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jFL : hp__seq = [::]
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 hp__seq : seq Job SE : forall j__hp : Job,
j__hp \in hp__seq <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jFL : hp__seq = [::]
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
subst hp__seq; exfalso .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp j
False
move : GE; rewrite leq_eqVlt; move => /orP [/eqP EQ| GE].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jEQ : t1 = t
False
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jEQ : t1 = t
False
subst t.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 LT : t1 < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t1 /\ hep_job j__hp j
False
apply NQT with t1.+1 ; first by apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 LT : t1 < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t1 /\ hep_job j__hp j
classical.quiet_time arr_seq sched j t1.+1
intros jhp ARR HP ARRB; apply negbNE; apply /negP; intros NCOMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 LT : t1 < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t1 /\ hep_job j__hp jjhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t1.+1 NCOMP : ~~ completed_by sched jhp t1.+1
False
move : (SE jhp) => [_ SE2].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 LT : t1 < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t1 /\ hep_job j__hp jjhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t1.+1 NCOMP : ~~ completed_by sched jhp t1.+1 SE2 : arrives_in arr_seq jhp /\
job_pending_at jhp t1 /\ hep_job jhp j ->
jhp \in [::]
False
rewrite in_nil in SE2; feed SE2=> [|//]; clear SE2.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 LT : t1 < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t1 /\ hep_job j__hp jjhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t1.+1 NCOMP : ~~ completed_by sched jhp t1.+1
arrives_in arr_seq jhp /\
job_pending_at jhp t1 /\ hep_job jhp j
repeat split => //; first apply /andP; split => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 LT : t1 < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t1 /\ hep_job j__hp jjhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t1.+1 NCOMP : ~~ completed_by sched jhp t1.+1
~~ completed_by sched jhp t1
apply /negP; intros COMLP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 LT : t1 < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t1 /\ hep_job j__hp jjhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t1.+1 NCOMP : ~~ completed_by sched jhp t1.+1 COMLP : completed_by sched jhp t1
False
move : NCOMP => /negP NCOMP; apply : NCOMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 LT : t1 < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t1 /\ hep_job j__hp jjhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t1.+1 COMLP : completed_by sched jhp t1
completed_by sched jhp t1.+1
by apply completion_monotonic with t1.
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jGE : t1 < t
False
apply NQT with t; first by apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jGE : t1 < t
classical.quiet_time arr_seq sched j t
intros jhp ARR HP ARRB; apply negbNE; apply /negP; intros NCOMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jGE : t1 < t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t NCOMP : ~~ completed_by sched jhp t
False
move : (SE jhp) => [_ SE2].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jGE : t1 < t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t NCOMP : ~~ completed_by sched jhp t SE2 : arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j ->
jhp \in [::]
False
rewrite in_nil in SE2; feed SE2 => [|//]; clear SE2.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 SE : forall j__hp : Job,
j__hp \in [::] <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jGE : t1 < t jhp : Job ARR : arrives_in arr_seq jhp HP : hep_job jhp j ARRB : arrived_before jhp t NCOMP : ~~ completed_by sched jhp t
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
by repeat split ; auto ; apply /andP; split ; first apply ltnW.
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 hp__seq : seq Job SE : forall j__hp : Job,
j__hp \in hp__seq <->
arrives_in arr_seq j__hp /\
job_pending_at j__hp t /\ hep_job j__hp jjhp : Job jhps : seq Job FL : hp__seq = jhp :: jhps
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
move : (SE jhp)=> [SE1 _]; subst ; clear SE.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat GE : t1 <= t LT : t < t2 QTt : classical.quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j tREL : t1 <= job_arrival j < t2 GT : t1.+1 < t2 jhp : Job jhps : seq Job SE1 : jhp \in jhp :: jhps ->
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
exists jhp : Job,
arrives_in arr_seq jhp /\
job_pending_at jhp t /\ hep_job jhp j
by exists jhp ; apply SE1; rewrite in_cons; apply /orP; left .
Qed .
(** We prove that at any time instant [t] within <<[t1, t2)>> the processor is not idle. *)
Lemma not_quiet_implies_not_idle :
forall t ,
t1 <= t < t2 ->
~ is_idle arr_seq sched t.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2
forall t : nat,
t1 <= t < t2 -> ~ is_idle arr_seq sched t
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2
forall t : nat,
t1 <= t < t2 -> ~ is_idle arr_seq sched t
intros t NEQ IDLE.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat NEQ : t1 <= t < t2 IDLE : is_idle arr_seq sched t
False
move : (pending_hp_job_exists _ NEQ) => [jhp [ARR [PEND HP]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat NEQ : t1 <= t < t2 IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp PEND : job_pending_at jhp t HP : hep_job jhp j
False
apply H_job_ready in PEND => //; destruct PEND as [j' [ARR' [READY' _]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat NEQ : t1 <= t < t2 IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t HP : hep_job jhp j
False
feed (H_work_conserving _ t ARR'). Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat NEQ : t1 <= t < t2 IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t HP : hep_job jhp j
backlogged sched j' t
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat NEQ : t1 <= t < t2 IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t HP : hep_job jhp j
backlogged sched j' t
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 t : nat NEQ : t1 <= t < t2 IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t HP : hep_job jhp j
~~ scheduled_at sched j' t
exact : not_scheduled_when_idle. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t : nat H_work_conserving : exists j_other : Job,
scheduled_at sched j_other tH_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 NEQ : t1 <= t < t2 IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t HP : hep_job jhp j
False
move : (H_work_conserving) => [jo +]; apply /negP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t : nat H_work_conserving : exists j_other : Job,
scheduled_at sched j_other tH_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix t1 t2 NEQ : t1 <= t < t2 IDLE : is_idle arr_seq sched t jhp : Job ARR : arrives_in arr_seq jhp j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t HP : hep_job jhp j jo : Job
~~ scheduled_at sched jo t
exact : not_scheduled_when_idle.
Qed .
End ProcessorAlwaysBusy .
(** In section we prove a few auxiliary lemmas about quiet time and service. *)
Section QuietTimeAndServiceOfJobs .
(** Assume that the schedule is work-conserving ... *)
Hypothesis H_work_conserving : work_conserving arr_seq sched.
(** ... and there are no duplicate job arrivals. *)
Hypothesis H_arrival_sequence_is_a_set :
arrival_sequence_uniq arr_seq.
(** Let [t1] be a quiet time. *)
Variable t1 : instant.
Hypothesis H_quiet_time : quiet_time t1.
(** Assume that there is no quiet time in the interval <<(t1, t1 + Δ]>>. *)
Variable Δ : duration.
Hypothesis H_no_quiet_time : forall t , t1 < t <= t1 + Δ -> ~ quiet_time t.
(** For clarity, we introduce a notion of the total service of
jobs released in time interval <<[t_beg, t_end)>> during the
time interval <<[t1, t1 + Δ)>>. *)
Let service_received_by_hep_jobs_released_during t_beg t_end :=
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t_beg t_end) j t1 (t1 + Δ).
(** We prove that jobs with higher-than-or-equal priority that
released before time instant [t1] receive no service after time
instant [t1]. *)
Lemma hep_jobs_receive_no_service_before_quiet_time :
service_received_by_hep_jobs_released_during t1 (t1 + Δ) =
service_received_by_hep_jobs_released_during 0 (t1 + Δ).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
service_received_by_hep_jobs_released_during t1
(t1 + Δ) =
service_received_by_hep_jobs_released_during 0
(t1 + Δ)
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
service_received_by_hep_jobs_released_during t1
(t1 + Δ) =
service_received_by_hep_jobs_released_during 0
(t1 + Δ)
intros .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
service_received_by_hep_jobs_released_during t1
(t1 + Δ) =
service_received_by_hep_jobs_released_during 0
(t1 + Δ)
rewrite /service_received_by_hep_jobs_released_during
/service_of_higher_or_equal_priority_jobs /service_of_jobs.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
\sum_(j0 <- arrivals_between arr_seq t1 (t1 + Δ) |
hep_job j0 j) service_during sched j0 t1 (t1 + Δ) =
\sum_(j0 <- arrivals_between arr_seq 0 (t1 + Δ) |
hep_job j0 j) service_during sched j0 t1 (t1 + Δ)
rewrite [in X in _ = X](arrivals_between_cat _ _ t1);
[ | by [] | rewrite leq_addr//].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
\sum_(j0 <- arrivals_between arr_seq t1 (t1 + Δ) |
hep_job j0 j) service_during sched j0 t1 (t1 + Δ) =
\sum_(j0 <- (arrivals_between arr_seq 0 t1 ++
arrivals_between arr_seq t1 (t1 + Δ)) |
hep_job j0 j) service_during sched j0 t1 (t1 + Δ)
rewrite big_cat //=.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
\sum_(j0 <- arrivals_between arr_seq t1 (t1 + Δ) |
hep_job j0 j) service_during sched j0 t1 (t1 + Δ) =
\sum_(i <- arrivals_between arr_seq 0 t1 | hep_job i j)
service_during sched i t1 (t1 + Δ) +
\sum_(i <- arrivals_between arr_seq t1 (t1 + Δ) |
hep_job i j) service_during sched i t1 (t1 + Δ)
rewrite -{1 }[\sum_(j <- arrivals_between arr_seq _ (t1 + Δ) | _)
service_during sched j t1 (t1 + Δ)]add0n.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
0 +
\sum_(j0 <- arrivals_between arr_seq t1 (t1 + Δ) |
hep_job j0 j) service_during sched j0 t1 (t1 + Δ) =
\sum_(i <- arrivals_between arr_seq 0 t1 | hep_job i j)
service_during sched i t1 (t1 + Δ) +
\sum_(i <- arrivals_between arr_seq t1 (t1 + Δ) |
hep_job i j) service_during sched i t1 (t1 + Δ)
apply /eqP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
0 +
\sum_(j0 <- arrivals_between arr_seq t1 (t1 + Δ) |
hep_job j0 j) service_during sched j0 t1 (t1 + Δ) ==
\sum_(i <- arrivals_between arr_seq 0 t1 | hep_job i j)
service_during sched i t1 (t1 + Δ) +
\sum_(i <- arrivals_between arr_seq t1 (t1 + Δ) |
hep_job i j) service_during sched i t1 (t1 + Δ)
rewrite eqn_add2r eq_sym exchange_big //=.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
\sum_(t1 <= j0 < t1 + Δ)
\sum_(i <- arrivals_between arr_seq 0 t1 | hep_job
i j)
service_at sched i j0 == 0
rewrite big1_seq //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat
forall i : Datatypes_nat__canonical__eqtype_Equality,
true && (i \in index_iota t1 (t1 + Δ)) ->
\sum_(i0 <- arrivals_between arr_seq 0 t1 | hep_job i0
j)
service_at sched i0 i = 0
move => t' /andP [_ NEQ]; rewrite mem_iota in NEQ.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1)
\sum_(i <- arrivals_between arr_seq 0 t1 | hep_job i j)
service_at sched i t' = 0
rewrite big1_seq //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1)
forall i : Job,
hep_job i j && (i \in arrivals_between arr_seq 0 t1) ->
service_at sched i t' = 0
move => jhp /andP [HP ARR].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1) jhp : Job HP : hep_job jhp j ARR : jhp \in arrivals_between arr_seq 0 t1
service_at sched jhp t' = 0
apply : not_scheduled_implies_no_service.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1) jhp : Job HP : hep_job jhp j ARR : jhp \in arrivals_between arr_seq 0 t1
~~ scheduled_at sched jhp t'
apply (completed_implies_not_scheduled _ _ H_completed_jobs_dont_execute).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1) jhp : Job HP : hep_job jhp j ARR : jhp \in arrivals_between arr_seq 0 t1
completed_by sched jhp t'
apply completion_monotonic with t1; first by move : NEQ => /andP[].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1) jhp : Job HP : hep_job jhp j ARR : jhp \in arrivals_between arr_seq 0 t1
completed_by sched jhp t1
apply H_quiet_time => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1) jhp : Job HP : hep_job jhp j ARR : jhp \in arrivals_between arr_seq 0 t1
arrives_in arr_seq jhp
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1) jhp : Job HP : hep_job jhp j ARR : jhp \in arrivals_between arr_seq 0 t1
arrives_in arr_seq jhp
exact : in_arrivals_implies_arrived.
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat t' : Datatypes_nat__canonical__eqtype_Equality NEQ : t1 <= t' < t1 + (t1 + Δ - t1) jhp : Job HP : hep_job jhp j ARR : jhp \in arrivals_between arr_seq 0 t1
arrived_before jhp t1
exact : in_arrivals_implies_arrived_before.
Qed .
(** Next, assume that the processor is an ideal-progress, unit-speed uniprocessor. *)
Hypothesis H_uni : uniprocessor_model PState.
Hypothesis H_unit : unit_service_proc_model PState.
Hypothesis H_progress : ideal_progress_proc_model PState.
(** Under this assumption, we prove that the total service within a
"non-quiet" time interval <<[t1, t1 + Δ)>> is exactly [Δ]. *)
Lemma no_idle_time_within_non_quiet_time_interval :
total_service_of_jobs_in sched (arrivals_between arr_seq 0 (t1 + Δ)) t1 (t1 + Δ) = Δ.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
total_service_of_jobs_in sched
(arrivals_between arr_seq 0 (t1 + Δ)) t1 (t1 + Δ) =
Δ
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
total_service_of_jobs_in sched
(arrivals_between arr_seq 0 (t1 + Δ)) t1 (t1 + Δ) =
Δ
intros ; unfold total_service_of_jobs_in, service_of_jobs, service_of_higher_or_equal_priority_jobs.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
\sum_(j <- arrivals_between arr_seq 0 (t1 + Δ) | predT
j)
service_during sched j t1 (t1 + Δ) = Δ
rewrite -{3 }[Δ](sum_of_ones t1) exchange_big //=.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
\sum_(t1 <= j < t1 + Δ)
\sum_(i <- arrivals_between arr_seq 0 (t1 + Δ))
service_at sched i j = \sum_(t1 <= x < t1 + Δ) 1
apply /eqP; rewrite eqn_leq; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
\sum_(t1 <= j < t1 + Δ)
\sum_(i <- arrivals_between arr_seq 0 (t1 + Δ))
service_at sched i j <=
\sum_(t1 <= x < t1 + Δ) 1
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
\sum_(t1 <= j < t1 + Δ)
\sum_(i <- arrivals_between arr_seq 0 (t1 + Δ))
service_at sched i j <=
\sum_(t1 <= x < t1 + Δ) 1
rewrite leq_sum // => t' _.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat
\sum_(i <- arrivals_between arr_seq 0 (t1 + Δ))
service_at sched i t' <= 1
have SCH := @service_of_jobs_le_1 _ _ _ _ sched predT (arrivals_between arr_seq 0 (t1 + Δ)).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat SCH : unit_service_proc_model PState ->
uniprocessor_model PState ->
uniq (arrivals_between arr_seq 0 (t1 + Δ)) ->
forall t : instant,
service_of_jobs_at sched predT
(arrivals_between arr_seq 0 (t1 + Δ)) t <= 1
\sum_(i <- arrivals_between arr_seq 0 (t1 + Δ))
service_at sched i t' <= 1
by eapply leq_trans; [apply leqnn | apply SCH; eauto using arrivals_uniq with basic_rt_facts]. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
\sum_(t1 <= x < t1 + Δ) 1 <=
\sum_(t1 <= j < t1 + Δ)
\sum_(i <- arrivals_between arr_seq 0 (t1 + Δ))
service_at sched i j
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
\sum_(t1 <= x < t1 + Δ) 1 <=
\sum_(t1 <= j < t1 + Δ)
\sum_(i <- arrivals_between arr_seq 0 (t1 + Δ))
service_at sched i j
rewrite [in X in X <= _]big_nat_cond [in X in _ <= X]big_nat_cond //=
leq_sum // => t' /andP [/andP [LT GT] _].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ
0 <
\sum_(i <- arrivals_between arr_seq 0 (t1 + Δ))
service_at sched i t'
rewrite sum_nat_gt0 filter_predT; apply /hasP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ
exists2 x : Job,
x \in arrivals_between arr_seq 0 (t1 + Δ) &
0 < service_at sched x t'
have [Idle|[jo Sched_jo]] := (scheduled_at_cases _ H_valid_arrival_time sched ltac :(auto ) ltac :(auto ) t').Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ Idle : is_idle arr_seq sched t'
exists2 x : Job,
x \in arrivals_between arr_seq 0 (t1 + Δ) &
0 < service_at sched x t'
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ Idle : is_idle arr_seq sched t'
exists2 x : Job,
x \in arrivals_between arr_seq 0 (t1 + Δ) &
0 < service_at sched x t'
exfalso ; move : LT; rewrite leq_eqVlt; move => /orP [/eqP EQ|LT].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' EQ : t1 = t'
False
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' EQ : t1 = t'
False
subst t'.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState Idle : is_idle arr_seq sched t1 GT : t1 < t1 + Δ
False
feed (H_no_quiet_time t1.+1 ); first by apply /andP; split . Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : ~ quiet_time t1.+1 service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState Idle : is_idle arr_seq sched t1 GT : t1 < t1 + Δ
False
by apply H_no_quiet_time, idle_time_implies_quiet_time_at_the_next_time_instant. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t'
False
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t'
False
feed (H_no_quiet_time t'); first by apply /andP; split ; last rewrite ltnW. Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t'
False
apply : H_no_quiet_time; intros j_hp IN HP ARR.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t'
completed_by sched j_hp t'
apply contraT; intros NCOMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t'
false
have PEND : job_pending_at j_hp t'.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t'
job_pending_at j_hp t'
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t'
job_pending_at j_hp t'
apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t'
has_arrived j_hp t'
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t'
has_arrived j_hp t'
by rewrite /has_arrived ltnW.
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t'
~~ completed_by sched j_hp t'
by move : NCOMP; apply contra, completion_monotonic. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t' PEND : job_pending_at j_hp t'
false
apply H_job_ready in PEND => //; destruct PEND as [j' [ARR' [READY' _]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t' j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t'
false
feed (H_work_conserving _ t' ARR'). Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t' j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t'
backlogged sched j' t'
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration t' : nat H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t' j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t'
backlogged sched j' t'
by apply /andP; split => //; apply : not_scheduled_when_idle. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t' : nat H_work_conserving : exists j_other : Job,
scheduled_at sched j_other t'H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t' j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t'
false
exfalso ; move : H_work_conserving => [j_other +]; apply /negP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop t' : nat H_work_conserving : exists j_other : Job,
scheduled_at sched j_other t'H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : ~ quiet_time t' service_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState GT : t' < t1 + Δ Idle : is_idle arr_seq sched t' LT : t1 < t' j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t' NCOMP : ~~ completed_by sched j_hp t' j' : Job ARR' : arrives_in arr_seq j' READY' : job_ready sched j' t' j_other : Job
~~ scheduled_at sched j_other t'
exact : not_scheduled_when_idle. } } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ jo : Job Sched_jo : scheduled_at sched jo t'
exists2 x : Job,
x \in arrivals_between arr_seq 0 (t1 + Δ) &
0 < service_at sched x t'
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ jo : Job Sched_jo : scheduled_at sched jo t'
exists2 x : Job,
x \in arrivals_between arr_seq 0 (t1 + Δ) &
0 < service_at sched x t'
exists jo .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ jo : Job Sched_jo : scheduled_at sched jo t'
jo \in arrivals_between arr_seq 0 (t1 + Δ)
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ jo : Job Sched_jo : scheduled_at sched jo t'
jo \in arrivals_between arr_seq 0 (t1 + Δ)
apply arrived_between_implies_in_arrivals => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ jo : Job Sched_jo : scheduled_at sched jo t'
arrived_between jo 0 (t1 + Δ)
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ jo : Job Sched_jo : scheduled_at sched jo t'
job_arrival jo < t1 + Δ
apply H_jobs_must_arrive_to_execute in Sched_jo.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ jo : Job Sched_jo : has_arrived jo t'
job_arrival jo < t1 + Δ
by apply leq_ltn_trans with t'.
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq t1 : instant H_quiet_time : quiet_time t1 Δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + Δ -> ~ quiet_time tservice_received_by_hep_jobs_released_during := fun
t_beg
t_end : instant
=>
service_of_higher_or_equal_priority_jobs
sched
(arrivals_between
arr_seq
t_beg t_end)
j t1 (t1 + Δ): instant ->
instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t' : nat LT : t1 <= t' GT : t' < t1 + Δ jo : Job Sched_jo : scheduled_at sched jo t'
0 < service_at sched jo t'
by apply : H_progress. } }
Qed .
End QuietTimeAndServiceOfJobs .
(** In this section, we show that the length of any busy interval
is bounded, as long as there is enough supply to accommodate
the workload of tasks with higher or equal priority. *)
Section BoundingBusyInterval .
(** Assume that the schedule is work-conserving, ... *)
Hypothesis H_work_conserving : work_conserving arr_seq sched.
(** ... and there are no duplicate job arrivals, ... *)
Hypothesis H_arrival_sequence_is_a_set :
arrival_sequence_uniq arr_seq.
(** ... and the priority relation is reflexive and transitive. *)
Hypothesis H_priority_is_reflexive : reflexive_job_priorities JLFP.
Hypothesis H_priority_is_transitive : transitive_job_priorities JLFP.
(** Next, we recall the notion of workload of all jobs released in
a given interval <<[t1, t2)>> that have higher-or-equal
priority w.r.t. the job [j] being analyzed. *)
Let hp_workload t1 t2 :=
workload_of_higher_or_equal_priority_jobs j (arrivals_between arr_seq t1 t2).
(** With regard to the jobs with higher-or-equal priority that are released
in a given interval <<[t1, t2)>>, we also recall the service received by these
jobs in the same interval <<[t1, t2)>>. *)
Let hp_service t1 t2 :=
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j t1 t2.
(** Now we begin the proof. First, we show that the busy interval is bounded. *)
Section BoundingBusyInterval .
(** Suppose that job [j] is pending at time [t_busy]. *)
Variable t_busy : instant.
Hypothesis H_j_is_pending : job_pending_at j t_busy.
(** First, we show that there must exist a busy interval prefix. *)
Section LowerBound .
(** Since job [j] is pending, there is a (potentially unbounded)
busy interval that starts no later than with the arrival of [j]. *)
Lemma exists_busy_interval_prefix :
exists t1 ,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
rename H_j_is_pending into PEND, H_work_conserving into WORK.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
destruct ([exists t :'I_t_busy.+1 , quiet_time_dec t]) eqn :EX.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy EX : [exists t , quiet_time_dec t] = true
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy EX : [exists t , quiet_time_dec t] = true
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
set last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy EX : [exists t , quiet_time_dec t] = true last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
move : EX => /existsP [t EX].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
have PRED: quiet_time_dec last0 by apply (bigmax_pred t_busy.+1 (quiet_time_dec) t).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
have QUIET: quiet_time last0.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0
quiet_time last0
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0
quiet_time last0
intros j_hp IN HP ARR; move : PRED => /allP PRED; feed (PRED j_hp).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp last0 PRED : {in arrivals_before arr_seq last0,
forall x : Job,
hep_job x j ==> completed_by sched x last0}
j_hp \in arrivals_before arr_seq last0
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp last0 PRED : {in arrivals_before arr_seq last0,
forall x : Job,
hep_job x j ==> completed_by sched x last0}
j_hp \in arrivals_before arr_seq last0
by eapply arrived_between_implies_in_arrivals; eauto .
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t j_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp last0 PRED : (fun x : Job =>
is_true
(hep_job x j ==> completed_by sched x last0))
j_hp
completed_by sched j_hp last0
by rewrite HP implyTb in PRED.
} Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
exists last0 .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0
busy_interval_prefix last0 t_busy.+1 /\
last0 <= job_arrival j <= t_busy
have JAIN: last0 <= job_arrival j <= t_busy.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0
last0 <= job_arrival j <= t_busy
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0
last0 <= job_arrival j <= t_busy
apply /andP; split ; last by move : PEND => /andP [ARR _].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0
last0 <= job_arrival j
move_neq_up BEFORE. Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 BEFORE : job_arrival j < last0
False
move : PEND => /andP [_ NOTCOMP].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 BEFORE : job_arrival j < last0 NOTCOMP : ~~ completed_by sched j t_busy
False
feed (QUIET j H_from_arrival_sequence); first by apply H_priority_is_reflexive. Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : arrived_before j last0 ->
completed_by sched j last0 BEFORE : job_arrival j < last0 NOTCOMP : ~~ completed_by sched j t_busy
False
specialize (QUIET BEFORE).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : completed_by sched j last0 BEFORE : job_arrival j < last0 NOTCOMP : ~~ completed_by sched j t_busy
False
apply completion_monotonic with (t' := t_busy) in QUIET; first by rewrite QUIET in NOTCOMP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : completed_by sched j last0 BEFORE : job_arrival j < last0 NOTCOMP : ~~ completed_by sched j t_busy
last0 <= t_busy
by apply bigmax_ltn_ord with (i0 := t).
} Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 JAIN : last0 <= job_arrival j <= t_busy
busy_interval_prefix last0 t_busy.+1 /\
last0 <= job_arrival j <= t_busy
repeat split => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 JAIN : last0 <= job_arrival j <= t_busy
last0 < t_busy.+1
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 JAIN : last0 <= job_arrival j <= t_busy
last0 < t_busy.+1
by apply bigmax_ltn_ord with (i0 := t).
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 JAIN : last0 <= job_arrival j <= t_busy
forall t : nat,
last0 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j t
move => t0 /andP [GTlast LTbusy] QUIET0.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 JAIN : last0 <= job_arrival j <= t_busy t0 : nat GTlast : last0 < t0 LTbusy : t0 < t_busy.+1 QUIET0 : classical.quiet_time arr_seq sched j t0
False
have PRED0: quiet_time_dec t0 by apply /quiet_time_P.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 JAIN : last0 <= job_arrival j <= t_busy t0 : nat GTlast : last0 < t0 LTbusy : t0 < t_busy.+1 QUIET0 : classical.quiet_time arr_seq sched j t0 PRED0 : quiet_time_dec t0
False
move : (@leq_bigmax_cond _ (fun (x : 'I_t_busy.+1 ) => quiet_time_dec x) (fun x => x) (Ordinal LTbusy) PRED0) => /=.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy last0 := \max_(t < t_busy.+1 | quiet_time_dec t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time_dec t PRED : quiet_time_dec last0 QUIET : quiet_time last0 JAIN : last0 <= job_arrival j <= t_busy t0 : nat GTlast : last0 < t0 LTbusy : t0 < t_busy.+1 QUIET0 : classical.quiet_time arr_seq sched j t0 PRED0 : quiet_time_dec t0
t0 <= \max_(i < t_busy.+1 | quiet_time_dec i) i ->
False
by rewrite -/last0; move : GTlast; clear ; lia .
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy EX : [exists t , quiet_time_dec t] = false
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
apply negbT in EX; rewrite negb_exists in EX; move : EX => /forallP /= ALL.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy ALL : forall x : 'I_t_busy.+1 , ~~ quiet_time_dec x
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
exists 0 ; split ; last by apply /andP; split ; last by move : PEND => /andP [ARR _].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy ALL : forall x : 'I_t_busy.+1 , ~~ quiet_time_dec x
busy_interval_prefix 0 t_busy.+1
repeat split ; first by intros j_hp _ _ ARR; rewrite /arrived_before ltn0 in ARR.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy ALL : forall x : 'I_t_busy.+1 , ~~ quiet_time_dec x
forall t : nat,
0 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j t
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy ALL : forall x : 'I_t_busy.+1 , ~~ quiet_time_dec x
forall t : nat,
0 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j t
move => t /andP [GE LT] /quiet_time_P QUIET.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy ALL : forall x : 'I_t_busy.+1 , ~~ quiet_time_dec xt : nat GE : 0 < tLT : t < t_busy.+1 QUIET : consistent_arrival_times arr_seq ->
classical.quiet_time_dec arr_seq sched j t
False
apply /negP; [exact : (ALL (Ordinal LT))|] => /=.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy ALL : forall x : 'I_t_busy.+1 , ~~ quiet_time_dec xt : nat GE : 0 < tLT : t < t_busy.+1 QUIET : consistent_arrival_times arr_seq ->
classical.quiet_time_dec arr_seq sched j t
quiet_time_dec t
exact : QUIET.
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy ALL : forall x : 'I_t_busy.+1 , ~~ quiet_time_dec x
0 <= job_arrival j < t_busy.+1
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop WORK : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant PEND : job_pending_at j t_busy ALL : forall x : 'I_t_busy.+1 , ~~ quiet_time_dec x
job_arrival j < t_busy.+1
by move : PEND => /andP[].
Qed .
End LowerBound .
(** Next we prove that, if there is a point where the requested
workload is upper-bounded by the supply, then the busy
interval eventually ends. *)
Section UpperBound .
(** The following proofs assume that the processor is an ideal-progress,
unit-speed uniprocessor. *)
Hypothesis H_uni : uniprocessor_model PState.
Hypothesis H_unit : unit_service_proc_model PState.
Hypothesis H_progress : ideal_progress_proc_model PState.
(** Consider any busy interval prefix of job [j]. *)
Variable t1 : instant.
Hypothesis H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 .
(** Let's define A as the relative arrival time of job [j]
(with respect to time [t1]). *)
Let A := job_arrival j - t1.
(** Let [priority_inversion_bound] be a constant that bounds
the length of any priority inversion. *)
Variable priority_inversion_bound : instant -> instant.
Hypothesis H_priority_inversion_is_bounded :
is_priority_inversion_bounded_by priority_inversion_bound.
(** Next, assume that for some positive delta, the sum of requested workload
at time [t1 + delta] and constant priority_inversion_bound is bounded by
delta (i.e., the supply). *)
Variable delta : duration.
Hypothesis H_delta_positive : delta > 0 .
Hypothesis H_workload_is_bounded :
priority_inversion_bound A + hp_workload t1 (t1 + delta) <= delta.
(** If there is a quiet time by time [t1 + delta], it
trivially follows that the busy interval is bounded.
Thus, let's consider first the harder case where there is
no quiet time, which turns out to be impossible. *)
Section CannotBeBusyForSoLong .
(** Assume that there is no quiet time in the interval <<(t1, t1 + delta]>>. *)
Hypothesis H_no_quiet_time :
forall t , t1 < t <= t1 + delta -> ~ quiet_time t.
(** Since the interval is always non-quiet, the processor is
always busy with tasks of higher-or-equal priority or
some lower priority job which was scheduled, i.e., the
sum of service done by jobs with actual arrival time in
<<[t1, t1 + delta)>> and priority inversion equals
[delta]. *)
Lemma busy_interval_has_uninterrupted_service :
delta <= priority_inversion_bound A + hp_service t1 (t1 + delta).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
move : H_is_busy_prefix => [H_strictly_larger [H_quiet [_ EXj]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
destruct (delta <= priority_inversion_bound A) eqn :KLEΔ.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : (delta <= priority_inversion_bound A) = true
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : (delta <= priority_inversion_bound A) = true
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
by apply leq_trans with (priority_inversion_bound A); last rewrite leq_addr. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : (delta <= priority_inversion_bound A) = false
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
apply negbT in KLEΔ; rewrite -ltnNge in KLEΔ.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
apply leq_trans with (cumulative_priority_inversion arr_seq sched j t1 (t1 + delta) + hp_service t1 (t1 + delta)).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
delta <=
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) + hp_service t1 (t1 + delta)
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
delta <=
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) + hp_service t1 (t1 + delta)
rewrite /hp_service hep_jobs_receive_no_service_before_quiet_time // /service_of_higher_or_equal_priority_jobs.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
delta <=
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) +
service_of_jobs sched (hep_job^~ j)
(arrivals_between arr_seq 0 (t1 + delta)) t1
(t1 + delta)
rewrite service_of_jobs_negate_pred // addnBA; last by apply service_of_jobs_pred_impl; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
delta <=
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) +
total_service_of_jobs_in sched
(arrivals_between arr_seq 0 (t1 + delta)) t1
(t1 + delta) -
service_of_jobs sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t1
(t1 + delta)
rewrite addnC -addnBA; first by rewrite no_idle_time_within_non_quiet_time_interval // leq_addr.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
service_of_jobs sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t1
(t1 + delta) <=
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta)
rewrite service_of_jobs_sum_over_time_interval //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
\sum_(t1 <= t < t1 + delta)
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta)
apply leq_sum_seq; move => t II _; rewrite mem_index_iota in II; move : II => /andP [GEi LEt].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
have [IDLE|[j' SCHED]] := (scheduled_at_cases _ H_valid_arrival_time sched ltac :(auto ) ltac :(auto ) t).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta IDLE : is_idle arr_seq sched t
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta IDLE : is_idle arr_seq sched t
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
apply leq_trans with 0 ; [rewrite leqn0; apply /eqP | by apply leq0n].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta IDLE : is_idle arr_seq sched t
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t = 0
apply : big1 => j' NHEP.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta IDLE : is_idle arr_seq sched t j' : Job NHEP : ~~ hep_job j' j
service_at sched j' t = 0
by apply /not_scheduled_implies_no_service/not_scheduled_when_idle. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
destruct (hep_job j' j) eqn :PRIO1.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = true
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = true
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
rewrite service_of_jobs_nsched_or_unsat//.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = true
forall j0 : Job,
j0 \in arrivals_between arr_seq 0 (t1 + delta) ->
~~ (~~ hep_job j0 j && scheduled_at sched j0 t)
intros j'' IN; apply /andP; intros [NHEP SCHED''].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = true j'' : Job IN : j'' \in arrivals_between arr_seq 0 (t1 + delta) NHEP : ~~ hep_job j'' j SCHED'' : scheduled_at sched j'' t
False
have EQ: j'' = j' by eapply H_uni; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = true j'' : Job IN : j'' \in arrivals_between arr_seq 0 (t1 + delta) NHEP : ~~ hep_job j'' j SCHED'' : scheduled_at sched j'' t EQ : j'' = j'
False
by subst j''; rewrite PRIO1 in NHEP.
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
have SCH := @service_of_jobs_le_1 _ _ _ _ _ (fun i => ~~ hep_job i j) (arrivals_between arr_seq 0 (t1 + delta)).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false SCH : forall p : ProcessorState Job,
unit_service_proc_model p ->
uniprocessor_model p ->
forall (s : schedule p) (j0 : JLFP_policy Job),
uniq (arrivals_between arr_seq 0 (t1 + delta)) ->
forall t : instant,
service_of_jobs_at s
(fun i : Job => ~~ hep_job i j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
1
service_of_jobs_at sched
(fun j0 : Job => ~~ hep_job j0 j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
priority_inversion arr_seq sched j t
eapply leq_trans; first by apply : SCH; eauto using arrivals_uniq with basic_rt_facts.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false SCH : forall p : ProcessorState Job,
unit_service_proc_model p ->
uniprocessor_model p ->
forall (s : schedule p) (j0 : JLFP_policy Job),
uniq (arrivals_between arr_seq 0 (t1 + delta)) ->
forall t : instant,
service_of_jobs_at s
(fun i : Job => ~~ hep_job i j)
(arrivals_between arr_seq 0 (t1 + delta)) t <=
1
0 < priority_inversion arr_seq sched j t
clear SCH; rewrite lt0b; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false
j \notin scheduled_jobs_at arr_seq sched t
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false
j \notin scheduled_jobs_at arr_seq sched t
apply /negP; intros SCHED'.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false SCHED' : j \in scheduled_jobs_at arr_seq sched t
False
have EQ : j = j'.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false SCHED' : j \in scheduled_jobs_at arr_seq sched t
j = j'
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false SCHED' : j \in scheduled_jobs_at arr_seq sched t
j = j'
apply : H_uni SCHED.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job PRIO1 : hep_job j' j = false SCHED' : j \in scheduled_jobs_at arr_seq sched t
scheduled_at sched j t
by rewrite -(scheduled_jobs_at_iff arr_seq). } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false SCHED' : j \in scheduled_jobs_at arr_seq sched t EQ : j = j'
False
subst ; move : PRIO1 => /negP PRIO1; apply : PRIO1.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j' : Job is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j'] : (duration ->
duration) -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j' t1]: instant -> instant -> Prop busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j' t1]: instant -> instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j'] : instant -> bool quiet_time := [eta classical.quiet_time arr_seq sched j'] : instant -> Prop H_job_cost_positive : job_cost_positive j' H_job_task : job_of_task tsk j' H_from_arrival_sequence : arrives_in arr_seq j' H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2)
j' t1 t2: instant -> instant -> nat hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j' (arrivals_between arr_seq t1 t2): instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j' t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant A := job_arrival j' - t1 : nat H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_strictly_larger : t1 < t_busy.+1 KLEΔ : priority_inversion_bound A < delta EXj : t1 <= job_arrival j' < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j' t1 t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta SCHED : scheduled_at sched j' t SCHED' : j' \in scheduled_jobs_at arr_seq sched t
hep_job j' j'
apply H_priority_is_reflexive.
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false
has (fun jlp : Job => ~~ hep_job jlp j)
(scheduled_jobs_at arr_seq sched t)
apply /hasP; exists j' ; last by rewrite PRIO1.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta t : Datatypes_nat__canonical__eqtype_Equality GEi : t1 <= t LEt : t < t1 + delta j' : Job SCHED : scheduled_at sched j' t PRIO1 : hep_job j' j = false
j' \in scheduled_jobs_at arr_seq sched t
by rewrite scheduled_jobs_at_iff. } } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) + hp_service t1 (t1 + delta) <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) + hp_service t1 (t1 + delta) <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
rewrite leq_add2r.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) <= priority_inversion_bound A
destruct (t1 + delta <= t_busy.+1 ) eqn :NEQ; [ | apply negbT in NEQ; rewrite -ltnNge in NEQ].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta NEQ : (t1 + delta <= t_busy.+1 ) = true
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) <= priority_inversion_bound A
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta NEQ : (t1 + delta <= t_busy.+1 ) = true
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) <= priority_inversion_bound A
apply leq_trans with (cumulative_priority_inversion arr_seq sched j t1 t_busy.+1 ); last eauto 2 .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta NEQ : (t1 + delta <= t_busy.+1 ) = true
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) <=
cumulative_priority_inversion arr_seq sched j t1
t_busy.+1
by rewrite [in X in _ <= X](cumulative_priority_inversion_cat _ _ _ (t1 + delta)) //= leq_addr.
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta NEQ : t_busy.+1 < t1 + delta
cumulative_priority_inversion arr_seq sched j t1
(t1 + delta) <= priority_inversion_bound A
apply H_priority_inversion_is_bounded; repeat split => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta NEQ : t_busy.+1 < t1 + delta
t1 < t1 + delta
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta NEQ : t_busy.+1 < t1 + delta
t1 < t1 + delta
by rewrite -addn1 leq_add2l.
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta NEQ : t_busy.+1 < t1 + delta
forall t : nat,
t1 < t < t1 + delta ->
~ classical.quiet_time arr_seq sched j t
by move => t' /andP [LT GT]; apply H_no_quiet_time; apply /andP; split ; last rewrite ltnW.
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tH_strictly_larger : t1 < t_busy.+1 H_quiet : classical.quiet_time arr_seq sched j t1 EXj : t1 <= job_arrival j < t_busy.+1 KLEΔ : priority_inversion_bound A < delta NEQ : t_busy.+1 < t1 + delta
t1 <= job_arrival j < t1 + delta
by move : EXj => /andP [T1 T2]; apply /andP; split ; last apply ltn_trans with (t_busy.+1 ). }
Qed .
(** Moreover, the fact that the interval is not quiet also
implies that there's more workload requested than
service received. *)
Lemma busy_interval_too_much_workload :
hp_workload t1 (t1 + delta) > hp_service t1 (t1 + delta).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
hp_service t1 (t1 + delta) <
hp_workload t1 (t1 + delta)
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
hp_service t1 (t1 + delta) <
hp_workload t1 (t1 + delta)
have PEND := not_quiet_implies_exists_pending_job.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
hp_service t1 (t1 + delta) <
hp_workload t1 (t1 + delta)
rename H_no_quiet_time into NOTQUIET,
H_is_busy_prefix into PREFIX.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2
hp_service t1 (t1 + delta) <
hp_workload t1 (t1 + delta)
set l := arrivals_between arr_seq t1 (t1 + delta).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job
hp_service t1 (t1 + delta) <
hp_workload t1 (t1 + delta)
set hep := hep_job.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job
hp_service t1 (t1 + delta) <
hp_workload t1 (t1 + delta)
unfold hp_service, service_of_higher_or_equal_priority_jobs, service_of_jobs,
hp_workload, workload_of_higher_or_equal_priority_jobs, workload_of_jobs.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job
\sum_(j0 <- arrivals_between arr_seq t1 (t1 + delta) |
hep_job j0 j) service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- arrivals_between arr_seq t1 (t1 + delta) |
hep_job j0 j) job_cost j0
fold l hep.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
move : (PREFIX) => [_ [QUIET _]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
move : (NOTQUIET) => NOTQUIET'.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time t
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
feed (NOTQUIET' (t1 + delta)). Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time t
t1 < t1 + delta <= t1 + delta
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time t
t1 < t1 + delta <= t1 + delta
by apply /andP; split ; first rewrite -addn1 leq_add2l. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : forall t1 t2 : instant,
t1 <= t2 ->
quiet_time t1 ->
~ quiet_time t2 ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 t2 /\
hep_job j_hp j /\ ~ job_completed_by j_hp t2l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta)
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
feed (PEND t1 (t1 + delta)); first by apply leq_addr. Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : quiet_time t1 ->
~ quiet_time (t1 + delta) ->
exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 (t1 + delta) /\
hep_job j_hp j /\
~ job_completed_by j_hp (t1 + delta) l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta)
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
specialize (PEND QUIET NOTQUIET').Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tPEND : exists j_hp : Job,
arrives_in arr_seq j_hp /\
arrived_between j_hp t1 (t1 + delta) /\
hep_job j_hp j /\
~ job_completed_by j_hp (t1 + delta)l := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta)
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
move : PEND => [j0 [ARR0 [/andP [GE0 LT0] [HP0 NOTCOMP0]]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta)
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
have IN0: j0 \in l.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta)
j0 \in l
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta)
j0 \in l
by apply : arrived_between_implies_in_arrivals => //; apply /andP; split . } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
have UNIQ: uniq l by eapply arrivals_uniq; eauto 1 .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
\sum_(j0 <- l | hep j0 j)
service_during sched j0 t1 (t1 + delta) <
\sum_(j0 <- l | hep j0 j) job_cost j0
rewrite big_mkcond [\sum_(_ <- _ | _ _ _)_]big_mkcond //=.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
\sum_(i <- l)
(if hep i j
then service_during sched i t1 (t1 + delta)
else 0 ) <
\sum_(i <- l) (if hep i j then job_cost i else 0 )
rewrite (bigD1_seq j0)//= (bigD1_seq j0)//= /hep HP0.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
service_during sched j0 t1 (t1 + delta) +
\sum_(i <- l | i != j0)
(if hep_job i j
then service_during sched i t1 (t1 + delta)
else 0 ) <
job_cost j0 +
\sum_(i <- l | i != j0)
(if hep_job i j then job_cost i else 0 )
rewrite -add1n addnA [1 + _]addnC addn1.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
(service_during sched j0 t1 (t1 + delta)).+1 +
\sum_(i <- l | i != j0)
(if hep_job i j
then service_during sched i t1 (t1 + delta)
else 0 ) <=
job_cost j0 +
\sum_(i <- l | i != j0)
(if hep_job i j then job_cost i else 0 )
apply leq_add; last first .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
\sum_(i <- l | i != j0)
(if hep_job i j
then service_during sched i t1 (t1 + delta)
else 0 ) <=
\sum_(i <- l | i != j0)
(if hep_job i j then job_cost i else 0 )
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
\sum_(i <- l | i != j0)
(if hep_job i j
then service_during sched i t1 (t1 + delta)
else 0 ) <=
\sum_(i <- l | i != j0)
(if hep_job i j then job_cost i else 0 )
apply : leq_sum=> j1 NEQ.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l j1 : Job NEQ : j1 != j0
(if hep_job j1 j
then service_during sched j1 t1 (t1 + delta)
else 0 ) <= (if hep_job j1 j then job_cost j1 else 0 )
case : (hep_job _ _) => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l j1 : Job NEQ : j1 != j0
service_during sched j1 t1 (t1 + delta) <= job_cost j1
by apply : cumulative_service_le_job_cost. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
service_during sched j0 t1 (t1 + delta) < job_cost j0
rewrite ignore_service_before_arrival//.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
service_during sched j0 (job_arrival j0) (t1 + delta) <
job_cost j0
rewrite -(ignore_service_before_arrival _ _ _ 0 )//.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant PREFIX : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta NOTQUIET : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tl := arrivals_between arr_seq t1 (t1 + delta) : seq Job hep := hep_job : rel Job QUIET : classical.quiet_time arr_seq sched j t1 NOTQUIET' : ~ quiet_time (t1 + delta) j0 : Job ARR0 : arrives_in arr_seq j0 GE0 : t1 <= job_arrival j0 LT0 : job_arrival j0 < t1 + delta HP0 : hep_job j0 j NOTCOMP0 : ~ job_completed_by j0 (t1 + delta) IN0 : j0 \in l UNIQ : uniq l
service_during sched j0 0 (t1 + delta) < job_cost j0
by rewrite ltnNge; apply /negP.
Qed .
(** Using the two lemmas above, we infer that the workload
is larger than the interval length. However, this
contradicts the assumption [H_workload_is_bounded]. *)
Corollary busy_interval_workload_larger_than_interval :
priority_inversion_bound A + hp_workload t1 (t1 + delta) > delta.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
delta <
priority_inversion_bound A +
hp_workload t1 (t1 + delta)
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
delta <
priority_inversion_bound A +
hp_workload t1 (t1 + delta)
apply leq_ltn_trans with (priority_inversion_bound A + hp_service t1 (t1 + delta)).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
delta <=
priority_inversion_bound A +
hp_service t1 (t1 + delta)
by apply busy_interval_has_uninterrupted_service.
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
priority_inversion_bound A +
hp_service t1 (t1 + delta) <
priority_inversion_bound A +
hp_workload t1 (t1 + delta)
rewrite ltn_add2l.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta H_no_quiet_time : forall t : nat,
t1 < t <= t1 + delta ->
~ quiet_time t
hp_service t1 (t1 + delta) <
hp_workload t1 (t1 + delta)
by apply busy_interval_too_much_workload.
Qed .
End CannotBeBusyForSoLong .
(** Since the interval cannot remain busy for so long, we
prove that the busy interval finishes at some point [t2 <=
t1 + delta]. *)
Lemma busy_interval_is_bounded :
exists t2 ,
t2 <= t1 + delta /\
busy_interval t1 t2.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
move : H_is_busy_prefix => [LT [QT [NQ NEQ]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
destruct ([exists t2 :'I_(t1 + delta).+1 , (t2 > t1) && quiet_time_dec t2]) eqn :EX.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 EX : [exists t2 , (t1 < t2) && quiet_time_dec t2] =
true
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 EX : [exists t2 , (t1 < t2) && quiet_time_dec t2] =
true
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
have EX': exists (t2 : instant), ((t1 < t2 <= t1 + delta) && quiet_time_dec t2).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 EX : [exists t2 , (t1 < t2) && quiet_time_dec t2] =
true
exists t2 : instant,
(t1 < t2 <= t1 + delta) && quiet_time_dec t2
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 EX : [exists t2 , (t1 < t2) && quiet_time_dec t2] =
true
exists t2 : instant,
(t1 < t2 <= t1 + delta) && quiet_time_dec t2
move : EX => /existsP [t2 /andP [LE QUIET]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : fintype_ordinal__canonical__fintype_Finite
(t1 + delta).+1 LE : t1 < t2 QUIET : quiet_time_dec t2
exists t2 : instant,
(t1 < t2 <= t1 + delta) && quiet_time_dec t2
exists t2 ; apply /andP; split => [|//].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : fintype_ordinal__canonical__fintype_Finite
(t1 + delta).+1 LE : t1 < t2 QUIET : quiet_time_dec t2
t1 < t2 <= t1 + delta
by apply /andP; split ; last (rewrite -ltnS; apply ltn_ord). } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 EX : [exists t2 , (t1 < t2) && quiet_time_dec t2] =
true EX' : exists t2 : instant,
(t1 < t2 <= t1 + delta) && quiet_time_dec t2
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
move : (ex_minnP EX') => [t2 /andP [/andP [GT LE] QUIET] MIN]; clear EX EX'.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= n
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
exists t2 ; split ; [ | split ; [repeat split | ]] => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= n
forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j t
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= n
forall t : nat,
t1 < t < t2 ->
~ classical.quiet_time arr_seq sched j t
move => t /andP [GT1 LT2] BUG.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nt : nat GT1 : t1 < t LT2 : t < t2 BUG : classical.quiet_time arr_seq sched j t
False
feed (MIN t); first (apply /andP; split ). Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nt : nat GT1 : t1 < t LT2 : t < t2 BUG : classical.quiet_time arr_seq sched j t
t1 < t <= t1 + delta
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nt : nat GT1 : t1 < t LT2 : t < t2 BUG : classical.quiet_time arr_seq sched j t
t1 < t <= t1 + delta
by apply /andP; split ; last by apply leq_trans with (n := t2); eauto using ltnW.
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nt : nat GT1 : t1 < t LT2 : t < t2 BUG : classical.quiet_time arr_seq sched j t
quiet_time_dec t
by apply /quiet_time_P.
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 t : nat MIN : t2 <= t GT1 : t1 < t LT2 : t < t2 BUG : classical.quiet_time arr_seq sched j t
False
by apply leq_ltn_trans with (p := t2) in MIN; first by rewrite ltnn in MIN.
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= n
t1 <= job_arrival j < t2
move : NEQ => /andP [IN1 IN2].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1
t1 <= job_arrival j < t2
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1
job_arrival j < t2
apply leq_ltn_trans with t_busy; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1
t_busy < t2
rewrite ltnNge; apply /negP; intros CONTR.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1 CONTR : t2 <= t_busy
False
apply NQ with t2.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1 CONTR : t2 <= t_busy
t1 < t2 < t_busy.+1
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1 CONTR : t2 <= t_busy
t1 < t2 < t_busy.+1
by apply /andP; split ; last rewrite ltnS.
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1 CONTR : t2 <= t_busy
classical.quiet_time arr_seq sched j t2
by apply /quiet_time_P.
+ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= n
classical.quiet_time arr_seq sched j t2
intros j_hp IN HP ARR.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta QUIET : quiet_time_dec t2 MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nj_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2
completed_by sched j_hp t2
move : QUIET => /allP QUIET; feed (QUIET j_hp).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nj_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2 QUIET : {in arrivals_before arr_seq t2,
forall x : Job,
hep_job x j ==> completed_by sched x t2}
j_hp \in arrivals_before arr_seq t2
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nj_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2 QUIET : {in arrivals_before arr_seq t2,
forall x : Job,
hep_job x j ==> completed_by sched x t2}
j_hp \in arrivals_before arr_seq t2
by eapply arrived_between_implies_in_arrivals; last apply ARR.
* Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 t2 : nat GT : t1 < t2 LE : t2 <= t1 + delta MIN : forall n : nat,
(t1 < n <= t1 + delta) && quiet_time_dec n ->
t2 <= nj_hp : Job IN : arrives_in arr_seq j_hp HP : hep_job j_hp j ARR : arrived_before j_hp t2 QUIET : (fun x : Job =>
is_true
(hep_job x j ==> completed_by sched x t2))
j_hp
completed_by sched j_hp t2
by move : QUIET => /implyP QUIET; apply QUIET.
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 EX : [exists t2 , (t1 < t2) && quiet_time_dec t2] =
false
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
apply negbT in EX; rewrite negb_exists in EX; move : EX => /forallP /= ALL'.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL' : forall x : 'I_(t1 + delta).+1 ,
~~ ((t1 < x) && quiet_time_dec x)
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
have ALL: forall t , t1 < t <= t1 + delta -> ~ quiet_time t.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL' : forall x : 'I_(t1 + delta).+1 ,
~~ ((t1 < x) && quiet_time_dec x)
forall t : nat, t1 < t <= t1 + delta -> ~ quiet_time t
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL' : forall x : 'I_(t1 + delta).+1 ,
~~ ((t1 < x) && quiet_time_dec x)
forall t : nat, t1 < t <= t1 + delta -> ~ quiet_time t
move => t /andP [GTt LEt] QUIET; rewrite -ltnS in LEt.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL' : forall x : 'I_(t1 + delta).+1 ,
~~ ((t1 < x) && quiet_time_dec x)t : nat GTt : t1 < t QUIET : quiet_time t LEt : t < (t1 + delta).+1
False
move : (ALL' (Ordinal LEt)) => /negP /=; apply .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL' : forall x : 'I_(t1 + delta).+1 ,
~~ ((t1 < x) && quiet_time_dec x)t : nat GTt : t1 < t QUIET : quiet_time t LEt : t < (t1 + delta).+1
(t1 < t) && quiet_time_dec t
by apply /andP; split => //; apply /quiet_time_P. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL' : forall x : 'I_(t1 + delta).+1 ,
~~ ((t1 < x) && quiet_time_dec x)ALL : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time t
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
clear ALL'; exfalso .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time t
False
have TOOMUCH := busy_interval_workload_larger_than_interval.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tTOOMUCH : (forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time t) ->
delta <
priority_inversion_bound A +
hp_workload t1 (t1 + delta)
False
have BOUNDED := H_workload_is_bounded.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat t_busy : instant H_j_is_pending : job_pending_at j t_busy H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 A := job_arrival j - t1 : nat priority_inversion_bound : instant -> instant H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <=
delta LT : t1 < t_busy.+1 QT : classical.quiet_time arr_seq sched j t1 NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ classical.quiet_time arr_seq sched j tNEQ : t1 <= job_arrival j < t_busy.+1 ALL : forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time tTOOMUCH : (forall t : nat,
t1 < t <= t1 + delta -> ~ quiet_time t) ->
delta <
priority_inversion_bound A +
hp_workload t1 (t1 + delta) BOUNDED : priority_inversion_bound A +
hp_workload t1 (t1 + delta) <= delta
False
by move : (leq_trans (TOOMUCH ALL) BOUNDED); rewrite ltnn.
Qed .
End UpperBound .
End BoundingBusyInterval .
(** The following proofs assume that the processor is an ideal-progress,
unit-speed uniprocessor. *)
Hypothesis H_uni : uniprocessor_model PState.
Hypothesis H_unit : unit_service_proc_model PState.
Hypothesis H_progress : ideal_progress_proc_model PState.
(** In this section, we show that from a workload bound we can
infer the existence of a busy interval. *)
Section BusyIntervalFromWorkloadBound .
(** Let [priority_inversion_bound] be a constant that bounds the
length of a priority inversion. *)
Variable priority_inversion_bound : duration -> duration.
Hypothesis H_priority_inversion_is_bounded :
is_priority_inversion_bounded_by priority_inversion_bound .
(** Assume that for some positive delta, the sum of requested workload at
time [t1 + delta] and priority inversion is bounded by delta (i.e., the supply). *)
Variable delta : duration.
Hypothesis H_delta_positive : delta > 0 .
Hypothesis H_workload_is_bounded :
forall t , priority_inversion_bound (job_arrival j - t) + hp_workload t (t + delta) <= delta.
(** Next, we assume that job j has positive cost, from which we
can infer that there is a time in which j is pending. *)
Hypothesis H_positive_cost : job_cost j > 0 .
(** Therefore there must exists a busy interval <<[t1, t2)>> that contains the arrival time of [j]. *)
Corollary exists_busy_interval :
exists t1 t2 ,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\
busy_interval t1 t2.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost j
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost j
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
have PREFIX := exists_busy_interval_prefix.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : forall t_busy : instant,
job_pending_at j t_busy ->
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
move : (H_workload_is_bounded) => WORK.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : forall t_busy : instant,
job_pending_at j t_busy ->
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busyWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
feed (PREFIX (job_arrival j)). Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : forall t_busy : instant,
job_pending_at j t_busy ->
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busyWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta
job_pending_at j (job_arrival j)
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : forall t_busy : instant,
job_pending_at j t_busy ->
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busyWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta
job_pending_at j (job_arrival j)
apply /andP; split ; first by apply leqnn.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : forall t_busy : instant,
job_pending_at j t_busy ->
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busyWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta
~~ completed_by sched j (job_arrival j)
rewrite /completed_by /service.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : forall t_busy : instant,
job_pending_at j t_busy ->
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busyWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta
~~
(job_cost j <=
service_during sched j 0 (job_arrival j))
rewrite ignore_service_before_arrival // /service_during.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : forall t_busy : instant,
job_pending_at j t_busy ->
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busyWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta
~~
(job_cost j <=
\sum_(job_arrival j <= t < job_arrival j)
service_at sched j t)
rewrite big_geq; last by apply leqnn.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : forall t_busy : instant,
job_pending_at j t_busy ->
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busyWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta
~~ (job_cost j <= 0 )
by rewrite -ltnNge.
} Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jPREFIX : exists t1 : instant,
busy_interval_prefix t1 (job_arrival j).+1 /\
t1 <= job_arrival j <= job_arrival jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
move : PREFIX => [t1 [PREFIX /andP [GE1 GEarr]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
have BOUNDED := busy_interval_is_bounded
(job_arrival j) _ H_uni H_unit H_progress t1 PREFIX priority_inversion_bound _ delta
H_delta_positive.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j BOUNDED : job_pending_at j (job_arrival j) ->
is_priority_inversion_bounded_by
priority_inversion_bound ->
priority_inversion_bound
(job_arrival j - t1) +
hp_workload t1 (t1 + delta) <= delta ->
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
feed_n 3 BOUNDED => //. Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j BOUNDED : job_pending_at j (job_arrival j) ->
is_priority_inversion_bounded_by
priority_inversion_bound ->
priority_inversion_bound
(job_arrival j - t1) +
hp_workload t1 (t1 + delta) <= delta ->
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
job_pending_at j (job_arrival j)
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j BOUNDED : job_pending_at j (job_arrival j) ->
is_priority_inversion_bounded_by
priority_inversion_bound ->
priority_inversion_bound
(job_arrival j - t1) +
hp_workload t1 (t1 + delta) <= delta ->
exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
job_pending_at j (job_arrival j)
by apply job_pending_at_arrival. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j BOUNDED : exists t2 : nat,
t2 <= t1 + delta /\ busy_interval t1 t2
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
move : BOUNDED => [t2 [GE2 BUSY]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j t2 : nat GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
exists t1 , t2; split .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j t2 : nat GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
t1 <= job_arrival j < t2
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j t2 : nat GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
t1 <= job_arrival j < t2
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j t2 : nat GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
job_arrival j < t2
apply contraT; rewrite -leqNgt; intro BUG.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j t2 : nat GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2 BUG : t2 <= job_arrival j
false
move : BUSY PREFIX => [[LE12 _] QUIET] [_ [_ [NOTQUIET _]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j t2 : nat GE2 : t2 <= t1 + delta BUG : t2 <= job_arrival j LE12 : t1 < t2 QUIET : classical.quiet_time arr_seq sched j t2 NOTQUIET : forall t : nat,
t1 < t < (job_arrival j).+1 ->
~ classical.quiet_time arr_seq sched j t
false
feed (NOTQUIET t2); first by apply /andP; split . Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j t2 : nat GE2 : t2 <= t1 + delta BUG : t2 <= job_arrival j LE12 : t1 < t2 QUIET : classical.quiet_time arr_seq sched j t2 NOTQUIET : ~ classical.quiet_time arr_seq sched j t2
false
by exfalso ; apply NOTQUIET.
} Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaH_positive_cost : 0 < job_cost jWORK : forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= deltat1 : instant PREFIX : busy_interval_prefix t1 (job_arrival j).+1 GE1 : t1 <= job_arrival j GEarr : job_arrival j <= job_arrival j t2 : nat GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
t2 <= t1 + delta /\ busy_interval t1 t2
by split .
Qed .
End BusyIntervalFromWorkloadBound .
(** If we know that the workload is bounded, we can also use the
busy interval to infer a response-time bound. *)
Section ResponseTimeBoundFromBusyInterval .
(** Let priority_inversion_bound be a constant that bounds the length of a priority inversion. *)
Variable priority_inversion_bound : duration -> duration.
Hypothesis H_priority_inversion_is_bounded :
is_priority_inversion_bounded_by priority_inversion_bound.
(** Assume that for some positive delta, the sum of requested workload at
time [t1 + delta] and priority inversion is bounded by delta (i.e., the supply). *)
Variable delta : duration.
Hypothesis H_delta_positive : delta > 0 .
Hypothesis H_workload_is_bounded :
forall t , priority_inversion_bound (job_arrival j - t) + hp_workload t (t + delta) <= delta.
(** Then, job [j] must complete by [job_arrival j + delta]. *)
Lemma busy_interval_bounds_response_time :
job_completed_by j (job_arrival j + delta).Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
delta
job_completed_by j (job_arrival j + delta)
Proof .Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
delta
job_completed_by j (job_arrival j + delta)
have BUSY := exists_busy_interval priority_inversion_bound _ delta.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaBUSY : is_priority_inversion_bounded_by
priority_inversion_bound ->
0 < delta ->
(forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta) ->
0 < job_cost j ->
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2
job_completed_by j (job_arrival j + delta)
move : (posnP (@job_cost _ Cost j)) => [ZERO|POS].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaBUSY : is_priority_inversion_bounded_by
priority_inversion_bound ->
0 < delta ->
(forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta) ->
0 < job_cost j ->
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2 ZERO : job_cost j = 0
job_completed_by j (job_arrival j + delta)
{ Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaBUSY : is_priority_inversion_bounded_by
priority_inversion_bound ->
0 < delta ->
(forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta) ->
0 < job_cost j ->
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2 ZERO : job_cost j = 0
job_completed_by j (job_arrival j + delta)
by rewrite /job_completed_by /completed_by ZERO. } Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaBUSY : is_priority_inversion_bounded_by
priority_inversion_bound ->
0 < delta ->
(forall t : nat,
priority_inversion_bound (job_arrival j - t) +
hp_workload t (t + delta) <= delta) ->
0 < job_cost j ->
exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2 POS : 0 < job_cost j
job_completed_by j (job_arrival j + delta)
feed_n 4 BUSY => //. Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaBUSY : exists t1 t2 : nat,
t1 <= job_arrival j < t2 /\
t2 <= t1 + delta /\ busy_interval t1 t2POS : 0 < job_cost j
job_completed_by j (job_arrival j + delta)
move : BUSY => [t1 [t2 [/andP [GE1 LT2] [GE2 BUSY]]]].Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaPOS : 0 < job_cost jt1, t2 : nat GE1 : t1 <= job_arrival j LT2 : job_arrival j < t2 GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
job_completed_by j (job_arrival j + delta)
apply completion_monotonic with (t := t2) => //.Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaPOS : 0 < job_cost jt1, t2 : nat GE1 : t1 <= job_arrival j LT2 : job_arrival j < t2 GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
t2 <= job_arrival j + delta
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaPOS : 0 < job_cost jt1, t2 : nat GE1 : t1 <= job_arrival j LT2 : job_arrival j < t2 GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
t2 <= job_arrival j + delta
by apply leq_trans with (n := t1 + delta); [| rewrite leq_add2r].
- Task : TaskType H : TaskCost Task Job : JobType JobTask : concept.JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_time : valid_arrival_sequence arr_seq PState : ProcessorState Job sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched job_pending_at := pending sched : Job -> instant -> bool job_completed_by := completed_by sched : Job -> instant -> bool tsk : Task j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta classical.quiet_time arr_seq sched j] : instant -> Prop quiet_time_dec := [eta classical.quiet_time_dec arr_seq
sched j] : instant -> bool busy_interval_prefix := fun t1 : instant =>
[eta classical.busy_interval_prefix
arr_seq sched j t1]: instant -> instant -> Prop busy_interval := fun t1 : instant =>
[eta classical.busy_interval arr_seq
sched j t1]: instant -> instant -> Prop is_priority_inversion_bounded_by := [eta priority_inversion_of_job_is_bounded_by
arr_seq sched
j] : (duration ->
duration) -> Prop H_work_conserving : work_conserving arr_seq sched H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP hp_workload := fun t1 t2 : instant =>
workload_of_higher_or_equal_priority_jobs
j (arrivals_between arr_seq t1 t2): instant -> instant -> nat hp_service := fun t1 t2 : instant =>
service_of_higher_or_equal_priority_jobs
sched (arrivals_between arr_seq t1 t2) j
t1 t2: instant -> instant -> nat H_uni : uniprocessor_model PState H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState priority_inversion_bound : duration -> duration H_priority_inversion_is_bounded : is_priority_inversion_bounded_by
priority_inversion_bound delta : duration H_delta_positive : 0 < deltaH_workload_is_bounded : forall t : nat,
priority_inversion_bound
(job_arrival j - t) +
hp_workload t (t + delta) <=
deltaPOS : 0 < job_cost jt1, t2 : nat GE1 : t1 <= job_arrival j LT2 : job_arrival j < t2 GE2 : t2 <= t1 + delta BUSY : busy_interval t1 t2
completed_by sched j t2
by apply job_completes_within_busy_interval with (t1 := t1).
Qed .
End ResponseTimeBoundFromBusyInterval .
End BoundingBusyInterval .
End ExistsBusyIntervalJLFP .