Built with
Alectryon , running Coq+SerAPI v8.15.0+0.15.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.task.preemption.parameters.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "_ + _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ - _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ < _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ > _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ * _" was already used in scope nat_scope.
[notation-overridden,parsing]
Require Export prosa.analysis.facts.model.preemption.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
(** Throughout this file, we assume ideal uni-processor schedules. *)
Require Import prosa.model.processor.ideal.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Require Export prosa.analysis.facts.busy_interval.ideal.hep_job_scheduled.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
(** * Priority inversion is bounded *)
(** In this file, we prove that any priority inversion that occurs in
the model with bounded nonpreemptive segments is bounded. *)
Section PriorityInversionIsBounded .
(** 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 Job Task}.
Context `{Arrival : JobArrival Job}.
Context `{Cost : JobCost Job}.
(** Consider any arrival sequence with consistent arrivals ... *)
Variable arr_seq : arrival_sequence Job.
Hypothesis H_arrival_times_are_consistent : consistent_arrival_times arr_seq.
(** ... and any ideal uniprocessor schedule of this arrival sequence. *)
Variable sched : schedule (ideal.processor_state Job).
(** Consider a JLFP policy that indicates a higher-or-equal priority relation,
and assume that the relation is reflexive and transitive. *)
Context {JLFP : JLFP_policy Job}.
Hypothesis H_priority_is_reflexive : reflexive_priorities.
Hypothesis H_priority_is_transitive : transitive_priorities.
(** In addition, we assume the existence of a function mapping a
task to its maximal non-preemptive segment ... *)
Context `{TaskMaxNonpreemptiveSegment Task}.
(** ... and the existence of a function mapping a job and its
progress to a boolean value saying whether this job is
preemptable at its current point of execution. *)
Context `{JobPreemptable Job}.
(** And assume that they define a valid preemption model with
bounded nonpreemptive segments. *)
Hypothesis H_valid_model_with_bounded_nonpreemptive_segments :
valid_model_with_bounded_nonpreemptive_segments arr_seq sched.
(** Further, allow for any work-bearing notion of job readiness. *)
Context `{@JobReady Job (ideal.processor_state Job) Cost Arrival}.
Hypothesis H_job_ready : work_bearing_readiness arr_seq sched.
(** We assume that the schedule is valid and that all jobs come from the arrival sequence. *)
Hypothesis H_sched_valid : valid_schedule sched arr_seq.
Hypothesis H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence sched arr_seq.
(** Next, we assume that the schedule is a work-conserving schedule... *)
Hypothesis H_work_conserving : work_conserving arr_seq sched.
(** ... and the schedule respects the scheduling policy at every preemption point. *)
Hypothesis H_respects_policy :
respects_JLFP_policy_at_preemption_point arr_seq sched JLFP.
(** Finally, we introduce the notion of the maximal length of
(potential) priority inversion at a time instant [t], which is
defined as the maximum length of nonpreemptive segments among
all jobs that arrived so far. *)
Definition max_length_of_priority_inversion (j : Job) (t : instant) :=
\max_(j_lp <- arrivals_before arr_seq t | (~~ hep_job j_lp j) && (job_cost j_lp > 0 ))
(job_max_nonpreemptive_segment j_lp - ε).
(** Next we prove that a priority inversion of a job is bounded by
function [max_length_of_priority_inversion]. *)
(** Note that any bound on function
[max_length_of_priority_inversion] will also be a bound on the
maximal priority inversion. This bound may be different for
different scheduler and/or task models. Thus, we don't define
such a bound in this module. *)
(** Consider any job [j] of [tsk] with positive job cost. *)
Variable j : Job.
Hypothesis H_j_arrives : arrives_in arr_seq j.
Hypothesis H_job_cost_positive : job_cost_positive j.
(** Consider any busy interval prefix <<[t1, t2)>> of job j. *)
Variable t1 t2 : instant.
Hypothesis H_busy_interval_prefix :
busy_interval_prefix arr_seq sched j t1 t2.
(** * Processor Executes HEP jobs after Preemption Point *)
(** In this section, we prove that at any time instant after any
preemption point (inside the busy interval), the processor is
always busy scheduling a job with higher or equal priority. *)
Section PreemptionTimeAndPriorityInversion .
(** First, recall from file [busy_interval/ideal/hep_job_scheduled]
we already know that the processor at any preemptive point is always
busy scheduling a job with higher or equal priority. *)
(** We show that at any time instant after a preemption point the
processor is always busy with a job with higher or equal
priority. *)
Lemma not_quiet_implies_exists_scheduled_hp_job_after_preemption_point :
forall tp t ,
preemption_time sched tp ->
t1 <= tp < t2 ->
tp <= t < t2 ->
exists j_hp ,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\
scheduled_at sched j_hp t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
forall (tp : instant) (t : nat),
preemption_time sched tp ->
t1 <= tp < t2 ->
tp <= t < t2 ->
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
forall (tp : instant) (t : nat),
preemption_time sched tp ->
t1 <= tp < t2 ->
tp <= t < t2 ->
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
move => tp t PRPOINT /andP [GEtp LTtp] /andP [LEtp LTt].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
ideal_proc_model_sched_case_analysis_eq sched t jhp. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 Idle : is_idle sched t EqIdle : sched t = None
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 Idle : is_idle sched t EqIdle : sched t = None
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
by eapply instant_t_is_not_idle in Idle; rt_eauto;
[ | apply /andP; split ; first apply leq_trans with tp]. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
exists jhp .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0
arrived_between jhp t1 t.+1 /\
hep_job jhp j /\ scheduled_at sched jhp t
have HP: hep_job jhp j.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0
hep_job jhp j
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0
hep_job jhp j
intros .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0
hep_job jhp j
move :(H_valid_model_with_bounded_nonpreemptive_segments) => [PREE ?].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq
hep_job jhp j
specialize (scheduling_of_any_segment_starts_with_preemption_time arr_seq sched H_sched_valid PREE jhp t Sched_jhp) => SOAS.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq SOAS : exists pt : nat,
job_arrival jhp <= pt <= t /\
preemption_time sched pt /\
(forall t' : nat,
pt <= t' <= t -> scheduled_at sched jhp t')
hep_job jhp j
move : SOAS => [prt [/andP [_ LE] [PR SCH]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'
hep_job jhp j
case E:(t1 <= prt).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : (t1 <= prt) = true
hep_job jhp j
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : (t1 <= prt) = true
hep_job jhp j
move : E => /eqP /eqP E; rewrite subn_eq0 in E.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : t1 <= prt
hep_job jhp j
edestruct not_quiet_implies_exists_scheduled_hp_job_at_preemption_point as [jlp [_ [HEP SCHEDjhp]]]; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : t1 <= prt
t1 <= prt < t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : t1 <= prt
t1 <= prt < t2
by apply /andP; split ; last by apply leq_ltn_trans with t. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : t1 <= prt jlp : Job HEP : hep_job jlp j SCHEDjhp : scheduled_at sched jlp prt
hep_job jhp j
enough (EQ : jhp = jlp); first by subst .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : t1 <= prt jlp : Job HEP : hep_job jlp j SCHEDjhp : scheduled_at sched jlp prt
jhp = jlp
apply : (ideal_proc_model_is_a_uniprocessor_model _ _ _ prt); eauto ;
by apply SCH; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : (t1 <= prt) = false
hep_job jhp j
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : (t1 <= prt) = false
hep_job jhp j
move : E => /eqP /neqP E; rewrite -lt0n subn_gt0 in E.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jhp t'E : prt < t1
hep_job jhp j
apply negbNE; apply /negP; intros LP; rename jhp into jlp.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jlp : Job Sched_jhp : scheduled_at sched jlp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jlp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jlp t'E : prt < t1 LP : ~~ hep_job jlp j
False
edestruct not_quiet_implies_exists_scheduled_hp_job_at_preemption_point
as [jhp [_ [HEP SCHEDjhp]]]; try apply PRPOINT; rt_eauto; first by apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jlp : Job Sched_jhp : scheduled_at sched jlp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jlp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jlp t'E : prt < t1 LP : ~~ hep_job jlp j jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp tp
False
move : LP => /negP LP; apply : LP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jlp : Job Sched_jhp : scheduled_at sched jlp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jlp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jlp t'E : prt < t1 jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp tp
hep_job jlp j
enough (EQ : jhp = jlp); first by subst .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jlp : Job Sched_jhp : scheduled_at sched jlp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jlp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jlp t'E : prt < t1 jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp tp
jhp = jlp
apply : (ideal_proc_model_is_a_uniprocessor_model jhp _ _ tp); eauto .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jlp : Job Sched_jhp : scheduled_at sched jlp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jlp (sched t) x)
x x in F]| <> 0 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq prt : nat LE : prt <= t PR : preemption_time sched prt SCH : forall t' : nat,
prt <= t' <= t -> scheduled_at sched jlp t'E : prt < t1 jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp tp
scheduled_at sched jlp tp
by apply SCH; apply /andP; split ; first apply leq_trans with t1; auto .
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j
arrived_between jhp t1 t.+1 /\
hep_job jhp j /\ scheduled_at sched jhp t
repeat split ; try done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j
arrived_between jhp t1 t.+1
move : (H_busy_interval_prefix) => [SL [QUIET [NOTQUIET EXj]]]; move : (Sched_jhp) => PENDING.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : quiet_time arr_seq sched j t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : scheduled_at sched jhp t
arrived_between jhp t1 t.+1
eapply scheduled_implies_pending in PENDING; rt_eauto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : quiet_time arr_seq sched j t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t
arrived_between jhp t1 t.+1
apply /andP; split ; last by apply leq_ltn_trans with (n := t); first by move : PENDING => /andP [ARR _].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : quiet_time arr_seq sched j t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t
t1 <= job_arrival jhp
apply contraT; rewrite -ltnNge; intro LT; exfalso .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : quiet_time arr_seq sched j t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t LT : job_arrival jhp < t1
False
feed (QUIET jhp); first by eapply H_jobs_come_from_arrival_sequence, Sched_jhp. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : hep_job jhp j ->
arrived_before jhp t1 ->
completed_by sched jhp t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t LT : job_arrival jhp < t1
False
specialize (QUIET HP LT).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : completed_by sched jhp t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t LT : job_arrival jhp < t1
False
have COMP: completed_by sched jhp t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : completed_by sched jhp t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t LT : job_arrival jhp < t1
completed_by sched jhp t
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : completed_by sched jhp t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t LT : job_arrival jhp < t1
completed_by sched jhp t
apply : completion_monotonic QUIET; exact : leq_trans LEtp. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : completed_by sched jhp t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t LT : job_arrival jhp < t1 COMP : completed_by sched jhp t
False
apply completed_implies_not_scheduled in COMP; rt_eauto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 tp : instant t : nat PRPOINT : preemption_time sched tp GEtp : t1 <= tp LTtp : tp < t2 LEtp : tp <= t LTt : t < t2 jhp : Job Sched_jhp : scheduled_at sched jhp t EqSched_jhp : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(, scheduled_on jhp (sched t) x)
x x in F]| <> 0 HP : hep_job jhp j SL : t1 < t2 QUIET : completed_by sched jhp t1 NOTQUIET : forall t : nat,
t1 < t < t2 ->
~ quiet_time arr_seq sched j tEXj : t1 <= job_arrival j < t2 PENDING : pending sched jhp t LT : job_arrival jhp < t1 COMP : ~~ scheduled_at sched jhp t
False
by move : COMP => /negP COMP; apply : COMP.
Qed .
(** Now, suppose there exists some constant K that bounds the
distance to a preemption time from the beginning of the busy
interval. *)
Variable K : duration.
Hypothesis H_preemption_time_exists :
exists pr_t , preemption_time sched pr_t /\ t1 <= pr_t <= t1 + K.
(** Then we prove that the processor is always busy with a job
with higher-or-equal priority after time instant [t1 + K]. *)
Lemma not_quiet_implies_exists_scheduled_hp_job :
forall t ,
t1 + K <= t < t2 ->
exists j_hp ,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\
scheduled_at sched j_hp t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + K
forall t : nat,
t1 + K <= t < t2 ->
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + K
forall t : nat,
t1 + K <= t < t2 ->
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
move => t /andP [GE LT].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
move : H_preemption_time_exists => [prt [PR /andP [GEprt LEprt]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2 prt : instant PR : preemption_time sched prt GEprt : t1 <= prt LEprt : prt <= t1 + K
exists j_hp : Job,
arrived_between j_hp t1 t.+1 /\
hep_job j_hp j /\ scheduled_at sched j_hp t
apply not_quiet_implies_exists_scheduled_hp_job_after_preemption_point with (tp := prt); eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2 prt : instant PR : preemption_time sched prt GEprt : t1 <= prt LEprt : prt <= t1 + K
t1 <= prt < t2
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2 prt : instant PR : preemption_time sched prt GEprt : t1 <= prt LEprt : prt <= t1 + K
t1 <= prt < t2
apply /andP; split ; first by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2 prt : instant PR : preemption_time sched prt GEprt : t1 <= prt LEprt : prt <= t1 + K
prt < t2
apply leq_ltn_trans with (t1 + K); first by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2 prt : instant PR : preemption_time sched prt GEprt : t1 <= prt LEprt : prt <= t1 + K
t1 + K < t2
by apply leq_ltn_trans with t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2 prt : instant PR : preemption_time sched prt GEprt : t1 <= prt LEprt : prt <= t1 + K
prt <= t < t2
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2 prt : instant PR : preemption_time sched prt GEprt : t1 <= prt LEprt : prt <= t1 + K
prt <= t < t2
apply /andP; split ; last by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 K : duration H_preemption_time_exists : exists pr_t : instant,
preemption_time sched
pr_t /\
t1 <= pr_t <= t1 + Kt : nat GE : t1 + K <= t LT : t < t2 prt : instant PR : preemption_time sched prt GEprt : t1 <= prt LEprt : prt <= t1 + K
prt <= t
by apply leq_trans with (t1 + K).
Qed .
End PreemptionTimeAndPriorityInversion .
(** * Preemption Time Exists *)
(** In this section we prove that the function [max_length_of_priority_inversion]
indeed upper-bounds the priority inversion length. *)
Section PreemptionTimeExists .
(** First, we prove that, if a job with higher-or-equal priority is scheduled at
a quiet time [t+1], then this is the first time when this job is scheduled. *)
Lemma hp_job_not_scheduled_before_quiet_time :
forall jhp t ,
quiet_time arr_seq sched j t.+1 ->
scheduled_at sched jhp t.+1 ->
hep_job jhp j ->
~~ scheduled_at sched jhp t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
forall (jhp : Job) (t : nat),
quiet_time arr_seq sched j t.+1 ->
scheduled_at sched jhp t.+1 ->
hep_job jhp j -> ~~ scheduled_at sched jhp t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
forall (jhp : Job) (t : nat),
quiet_time arr_seq sched j t.+1 ->
scheduled_at sched jhp t.+1 ->
hep_job jhp j -> ~~ scheduled_at sched jhp t
intros jhp t QT SCHED1 HP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : quiet_time arr_seq sched j t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j
~~ scheduled_at sched jhp t
apply /negP; intros SCHED2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : quiet_time arr_seq sched j t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
False
specialize (QT jhp).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : arrives_in arr_seq jhp ->
hep_job jhp j ->
arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
False
feed_n 3 QT; eauto . Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
arrived_before jhp t.+1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
arrived_before jhp t.+1
have MATE: jobs_must_arrive_to_execute sched by rt_eauto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t MATE : jobs_must_arrive_to_execute sched
arrived_before jhp t.+1
have HA: has_arrived jhp t by apply MATE.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t MATE : jobs_must_arrive_to_execute sched HA : has_arrived jhp t
arrived_before jhp t.+1
by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
False
apply completed_implies_not_scheduled in QT; rt_eauto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job t : nat QT : ~~ scheduled_at sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
False
by move : QT => /negP NSCHED; apply : NSCHED.
Qed .
(** Also, we show that lower-priority jobs that are scheduled inside the
busy-interval prefix <<[t1,t2)>> must arrive before that interval. *)
Lemma low_priority_job_arrives_before_busy_interval_prefix :
forall jlp t ,
t1 <= t < t2 ->
scheduled_at sched jlp t ->
~~ hep_job jlp j ->
job_arrival jlp < t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
forall (jlp : Job) (t : nat),
t1 <= t < t2 ->
scheduled_at sched jlp t ->
~~ hep_job jlp j -> job_arrival jlp < t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
forall (jlp : Job) (t : nat),
t1 <= t < t2 ->
scheduled_at sched jlp t ->
~~ hep_job jlp j -> job_arrival jlp < t1
move => jlp t /andP [GE LT] SCHED LP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j
job_arrival jlp < t1
move : (H_busy_interval_prefix) => [NEM [QT [NQT HPJ]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
job_arrival jlp < t1
apply negbNE; apply /negP; intros ARR; rewrite -leqNgt in ARR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp
False
move :(H_valid_model_with_bounded_nonpreemptive_segments) => [PREE ?].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq
False
specialize (scheduling_of_any_segment_starts_with_preemption_time arr_seq sched H_sched_valid PREE jlp t SCHED) => SCH.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq SCH : exists pt : nat,
job_arrival jlp <= pt <= t /\
preemption_time sched pt /\
(forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t')
False
move : SCH => [pt [/andP [NEQ1 NEQ2] [PT FA]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
False
have NEQ: t1 <= pt < t2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
t1 <= pt < t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
t1 <= pt < t2
apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
t1 <= pt
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
t1 <= pt
by apply leq_trans with (job_arrival jlp).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
pt < t2
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
pt < t2
by apply leq_ltn_trans with t. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'NEQ : t1 <= pt < t2
False
edestruct not_quiet_implies_exists_scheduled_hp_job_at_preemption_point as [jhp [_ [HEP SCHEDjhp]]]; rt_eauto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'NEQ : t1 <= pt < t2 jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp pt
False
feed (FA pt); first (by apply /andP; split ). Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : scheduled_at sched jlp pt NEQ : t1 <= pt < t2 jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp pt
False
move : LP => /negP LP; apply : LP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat GE : t1 <= t LT : t < t2 SCHED : scheduled_at sched jlp t NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 ARR : t1 <= job_arrival jlp PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time sched pt FA : scheduled_at sched jlp pt NEQ : t1 <= pt < t2 jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp pt
hep_job jlp j
by have ->: jlp = jhp by eapply ideal_proc_model_is_a_uniprocessor_model; eauto .
Qed .
(** Moreover, we show that lower-priority jobs that are scheduled
inside the busy-interval prefix <<[t1,t2)>> must be scheduled
before that interval. *)
Lemma low_priority_job_scheduled_before_busy_interval_prefix :
forall jlp t ,
t1 <= t < t2 ->
scheduled_at sched jlp t ->
~~ hep_job jlp j ->
exists t' , t' < t1 /\ scheduled_at sched jlp t'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
forall (jlp : Job) (t : nat),
t1 <= t < t2 ->
scheduled_at sched jlp t ->
~~ hep_job jlp j ->
exists t' : nat, t' < t1 /\ scheduled_at sched jlp t'
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
forall (jlp : Job) (t : nat),
t1 <= t < t2 ->
scheduled_at sched jlp t ->
~~ hep_job jlp j ->
exists t' : nat, t' < t1 /\ scheduled_at sched jlp t'
move => jlp t NEQ SCHED LP; move : (NEQ) => /andP [GE LT].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2
exists t' : nat, t' < t1 /\ scheduled_at sched jlp t'
have ARR := low_priority_job_arrives_before_busy_interval_prefix _ _ NEQ SCHED LP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
exists t' : nat, t' < t1 /\ scheduled_at sched jlp t'
exists t1 .-1 ; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
t1.-1 < t1
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
t1.-1 < t1
by rewrite prednK; last apply leq_ltn_trans with (job_arrival jlp). } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
scheduled_at sched jlp t1.-1
move : (H_busy_interval_prefix) => [NEM [QT [NQT HPJ]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
scheduled_at sched jlp t1.-1
move :(H_valid_model_with_bounded_nonpreemptive_segments) => [PREE ?].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq
scheduled_at sched jlp t1.-1
specialize (scheduling_of_any_segment_starts_with_preemption_time arr_seq sched H_sched_valid PREE jlp t SCHED) => SCHEDST.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq SCHEDST : exists pt : nat,
job_arrival jlp <= pt <= t /\
preemption_time sched pt /\
(forall t' : nat,
pt <= t' <= t ->
scheduled_at sched jlp t')
scheduled_at sched jlp t1.-1
move : SCHEDST => [pt [NEQpt [PT SCHEDc]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
scheduled_at sched jlp t1.-1
have LT2: pt < t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
pt < t1
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
pt < t1
rewrite ltnNge; apply /negP; intros CONTR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'CONTR : t1 <= pt
False
edestruct not_quiet_implies_exists_scheduled_hp_job_at_preemption_point
as [jhp [_ [HEP SCHEDjhp]]]; try apply PT; rt_eauto; first lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'CONTR : t1 <= pt jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp pt
False
specialize (SCHEDc pt).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : pt <= pt <= t -> scheduled_at sched jlp pt CONTR : t1 <= pt jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp pt
False
feed SCHEDc; first by apply /andP; split ; last move : NEQpt => /andP [_ T]. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : scheduled_at sched jlp pt CONTR : t1 <= pt jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp pt
False
move : LP => /negP LP; apply : LP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : scheduled_at sched jlp pt CONTR : t1 <= pt jhp : Job HEP : hep_job jhp j SCHEDjhp : scheduled_at sched jhp pt
hep_job jlp j
by have ->: jlp = jhp by eapply ideal_proc_model_is_a_uniprocessor_model; eauto .
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'LT2 : pt < t1
scheduled_at sched jlp t1.-1
apply SCHEDc; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'LT2 : pt < t1
pt <= t1.-1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'LT2 : pt < t1
pt <= t1.-1
by rewrite -add1n in LT2; apply leq_subRL_impl in LT2; rewrite subn1 in LT2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'LT2 : pt < t1
t1.-1 <= t
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job t : nat NEQ : t1 <= t < t2 SCHED : scheduled_at sched jlp t LP : ~~ hep_job jlp j GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1 NEM : t1 < t2 QT : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 PREE : valid_preemption_model arr_seq sched _b_ : model_with_bounded_nonpreemptive_segments
arr_seq pt : nat NEQpt : job_arrival jlp <= pt <= t PT : preemption_time sched pt SCHEDc : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'LT2 : pt < t1
t1.-1 <= t
by apply leq_trans with t1; first apply leq_pred.
Qed .
(** Thus, there must be a preemption time in the interval [t1, t1
+ max_priority_inversion t1]. That is, if a job with
higher-or-equal priority is scheduled at time instant [t1], then
[t1] is a preemption time. Otherwise, if a job with lower
priority is scheduled at time [t1], then this job also should
be scheduled before the beginning of the busy interval. So,
the next preemption time will be no more than
[max_priority_inversion t1] time units later. *)
(** We proceed by doing a case analysis. *)
Section CaseAnalysis .
(** (1) Case when the schedule is idle at time [t1]. *)
Section Case1 .
(** Assume that the schedule is idle at time [t1]. *)
Hypothesis H_is_idle : is_idle sched t1.
(** Then time instant [t1] is a preemption time. *)
Lemma preemption_time_exists_case1 :
exists pr_t ,
preemption_time sched pr_t /\
t1 <= pr_t <= t1 + max_length_of_priority_inversion j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
set (service := service sched).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1 service := service.service sched : Job -> instant -> nat
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : (H_valid_model_with_bounded_nonpreemptive_segments) => CORR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : (H_busy_interval_prefix) => [NEM [QT1 [NQT HPJ]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
exists t1 ; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
preemption_time sched t1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
preemption_time sched t1
by rewrite /preemption_time; move : H_is_idle => /eqP ->.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
t1 <= t1 <= t1 + max_length_of_priority_inversion j t1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_is_idle : is_idle sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
t1 <= t1 <= t1 + max_length_of_priority_inversion j t1
by apply /andP; split ; last rewrite leq_addr.
Qed .
End Case1 .
(** (2) Case when a job with higher-or-equal priority is scheduled at time [t1]. *)
Section Case2 .
(** Assume that a job [jhp] with higher-or-equal priority is scheduled at time [t1]. *)
Variable jhp : Job.
Hypothesis H_jhp_is_scheduled : scheduled_at sched jhp t1.
Hypothesis H_jhp_hep_priority : hep_job jhp j.
(** Then time instant [t1] is a preemption time. *)
Lemma preemption_time_exists_case2 :
exists pr_t ,
preemption_time sched pr_t /\
t1 <= pr_t <= t1 + max_length_of_priority_inversion j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
set (service := service sched).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : (H_valid_model_with_bounded_nonpreemptive_segments) => [VALID BOUNDED].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : (H_valid_model_with_bounded_nonpreemptive_segments) => CORR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : (H_busy_interval_prefix) => [NEM [QT1 [NQT HPJ]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
exists t1 ; split ; last first .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
t1 <= t1 <= t1 + max_length_of_priority_inversion j t1
apply /andP; split ; [by done | by rewrite leq_addr].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
preemption_time sched t1
destruct t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j 0 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp 0 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : 0 < t2QT1 : quiet_time arr_seq sched j 0 NQT : forall t : nat,
0 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : 0 <= job_arrival j < t2
preemption_time sched 0
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j 0 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp 0 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : 0 < t2QT1 : quiet_time arr_seq sched j 0 NQT : forall t : nat,
0 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : 0 <= job_arrival j < t2
preemption_time sched 0
by eapply zero_is_pt; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant i : nat H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j i.+1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp i.+1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : i.+1 < t2 QT1 : quiet_time arr_seq sched j i.+1 NQT : forall t : nat,
i.+1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : i < job_arrival j < t2
preemption_time sched i.+1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant i : nat H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j i.+1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp i.+1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : i.+1 < t2 QT1 : quiet_time arr_seq sched j i.+1 NQT : forall t : nat,
i.+1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : i < job_arrival j < t2
preemption_time sched i.+1
apply : first_moment_is_pt H_jhp_is_scheduled; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant i : nat H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j i.+1 t2 jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp i.+1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : i.+1 < t2 QT1 : quiet_time arr_seq sched j i.+1 NQT : forall t : nat,
i.+1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : i < job_arrival j < t2
~~ scheduled_at sched jhp i
by eapply hp_job_not_scheduled_before_quiet_time; try by done .
Qed .
End Case2 .
(** (3) Case when a job with lower priority is scheduled at time [t1]. *)
Section Case3 .
(** Assume that a job [jhp] with lower priority is scheduled at time [t1]. *)
Variable jlp : Job.
Hypothesis H_jlp_is_scheduled : scheduled_at sched jlp t1.
Hypothesis H_jlp_low_priority : ~~ hep_job jlp j.
(** To prove the lemma in this case we need a few auxiliary
facts about the first preemption point of job [jlp]. *)
Section FirstPreemptionPointOfjlp .
(** Let's denote the progress of job [jlp] at time [t1] as [progr_t1]. *)
Let progr_t1 := service sched jlp t1.
(** Consider the first preemption point of job [jlp] after [progr_t1]. *)
Variable fpt : instant.
Hypothesis H_fpt_is_preemptio_point : job_preemptable jlp (progr_t1 + fpt).
Hypothesis H_fpt_is_first_preemption_point :
forall ρ ,
progr_t1 <= ρ <= progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp ρ ->
service sched jlp t1 + fpt <= ρ.
(** For correctness, we also assume that [fpt] does not
exceed the length of the maximum non-preemptive
segment. *)
Hypothesis H_progr_le_max_nonp_segment :
fpt <= job_max_nonpreemptive_segment jlp - ε.
(** First we show that [fpt] is indeed the first preemption point after [progr_t1]. *)
Lemma no_intermediate_preemption_point :
forall ρ ,
progr_t1 <= ρ < progr_t1 + fpt ->
~~ job_preemptable jlp ρ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
forall ρ : nat,
progr_t1 <= ρ < progr_t1 + fpt ->
~~ job_preemptable jlp ρ
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
forall ρ : nat,
progr_t1 <= ρ < progr_t1 + fpt ->
~~ job_preemptable jlp ρ
move => prog /andP [GE LT].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt
~~ job_preemptable jlp prog
apply /negP; intros PPJ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog
False
move : H_fpt_is_first_preemption_point => K; specialize (K prog).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
False
feed_n 2 K; first (apply /andP; split ); try done . Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε)
apply leq_trans with (service sched jlp t1 + fpt).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
prog <= service sched jlp t1 + fpt
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
prog <= service sched jlp t1 + fpt
by apply ltnW.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
service sched jlp t1 + fpt <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε)
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
service sched jlp t1 + fpt <=
progr_t1 + (job_max_nonpreemptive_segment jlp - ε)
by rewrite leq_add2l; apply H_progr_le_max_nonp_segment.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : service sched jlp t1 + fpt <= prog
False
by move : K; rewrite leqNgt; move => /negP NLT; apply : NLT.
Qed .
(** Thanks to the fact that the scheduler respects the notion of preemption points
we show that [jlp] is continuously scheduled in time interval <<[t1, t1 + fpt)>>. *)
Lemma continuously_scheduled_between_preemption_points :
forall t' ,
t1 <= t' < t1 + fpt ->
scheduled_at sched jlp t'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
forall t' : nat,
t1 <= t' < t1 + fpt -> scheduled_at sched jlp t'
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
forall t' : nat,
t1 <= t' < t1 + fpt -> scheduled_at sched jlp t'
move : (H_valid_model_with_bounded_nonpreemptive_segments) => CORR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
forall t' : nat,
t1 <= t' < t1 + fpt -> scheduled_at sched jlp t'
move : (H_jlp_is_scheduled) => ARRs; apply H_jobs_come_from_arrival_sequence in ARRs.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp
forall t' : nat,
t1 <= t' < t1 + fpt -> scheduled_at sched jlp t'
move => t' /andP [GE LT].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp t' : nat GE : t1 <= t' LT : t' < t1 + fpt
scheduled_at sched jlp t'
have Fact : exists Δ , t' = t1 + Δ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp t' : nat GE : t1 <= t' LT : t' < t1 + fpt
exists Δ : nat, t' = t1 + Δ
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp t' : nat GE : t1 <= t' LT : t' < t1 + fpt
exists Δ : nat, t' = t1 + Δ
by exists (t' - t1); apply /eqP; rewrite eq_sym; apply /eqP; rewrite subnKC. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp t' : nat GE : t1 <= t' LT : t' < t1 + fpt Fact : exists Δ : nat, t' = t1 + Δ
scheduled_at sched jlp t'
move : Fact => [Δ EQ]; subst t'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ
scheduled_at sched jlp (t1 + Δ)
have NPPJ := @no_intermediate_preemption_point (@service _ _ sched jlp (t1 + Δ)).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ NPPJ : progr_t1 <=
service sched jlp (t1 + Δ) <
progr_t1 + fpt ->
~~
job_preemptable jlp
(service sched jlp (t1 + Δ))
scheduled_at sched jlp (t1 + Δ)
apply proj1 in CORR; specialize (CORR jlp ARRs).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : job_cannot_become_nonpreemptive_before_execution
jlp /\
job_cannot_be_nonpreemptive_after_completion
jlp /\
not_preemptive_implies_scheduled sched jlp /\
execution_starts_with_preemption_point sched
jlp ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ NPPJ : progr_t1 <=
service sched jlp (t1 + Δ) <
progr_t1 + fpt ->
~~
job_preemptable jlp
(service sched jlp (t1 + Δ))
scheduled_at sched jlp (t1 + Δ)
move : CORR => [_ [_ [T _] ]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ NPPJ : progr_t1 <=
service sched jlp (t1 + Δ) <
progr_t1 + fpt ->
~~
job_preemptable jlp
(service sched jlp (t1 + Δ)) T : not_preemptive_implies_scheduled sched jlp
scheduled_at sched jlp (t1 + Δ)
apply T; apply : NPPJ; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
progr_t1 <= service sched jlp (t1 + Δ)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
progr_t1 <= service sched jlp (t1 + Δ)
by apply service_monotonic; rewrite leq_addr. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
service sched jlp (t1 + Δ) < progr_t1 + fpt
rewrite /service -(service_during_cat _ _ _ t1).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
service_during sched jlp 0 t1 +
service_during sched jlp t1 (t1 + Δ) < progr_t1 + fpt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
service_during sched jlp 0 t1 +
service_during sched jlp t1 (t1 + Δ) < progr_t1 + fpt
rewrite ltn_add2l; rewrite ltn_add2l in LT.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp LT : Δ < fpt
service_during sched jlp t1 (t1 + Δ) < fpt
apply leq_ltn_trans with Δ; last by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp LT : Δ < fpt
service_during sched jlp t1 (t1 + Δ) <= Δ
rewrite -{2 }(sum_of_ones t1 Δ).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp LT : Δ < fpt
service_during sched jlp t1 (t1 + Δ) <=
\sum_(t1 <= x < t1 + Δ) 1
rewrite leq_sum //; intros t _.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp LT : Δ < fpt t : nat
service_at sched jlp t <= 1
apply service_at_most_one.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp LT : Δ < fpt t : nat
unit_service_proc_model (processor_state Job)
by apply ideal_proc_model_provides_unit_service.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
0 <= t1 <= t1 + Δ
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
0 <= t1 <= t1 + Δ
by apply /andP; split ; [done | rewrite leq_addr]. }
Qed .
(** Thus, job [jlp] reaches its preemption point at time instant [t1 + fpt],
which implies that time instant [t1 + fpt] is a preemption time. *)
Lemma first_preemption_time :
preemption_time sched (t1 + fpt).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
preemption_time sched (t1 + fpt)
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
preemption_time sched (t1 + fpt)
rewrite /preemption_time.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
match sched (t1 + fpt) with
| Some j =>
job_preemptable j (service sched j (t1 + fpt))
| None => true
end
move : (H_valid_model_with_bounded_nonpreemptive_segments) => CORR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
match sched (t1 + fpt) with
| Some j =>
job_preemptable j (service sched j (t1 + fpt))
| None => true
end
ideal_proc_model_sched_case_analysis_eq sched (t1 + fpt) s'; try done . Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : #|[pred x |
let
'FiniteQuant .Quantified F :=
FiniteQuant.ex (T:=Core)
(,
scheduled_on s'
(sched (t1 + fpt)) x) x x in F]| <>
0
match sched (t1 + fpt) with
| Some j =>
job_preemptable j (service sched j (t1 + fpt))
| None => true
end
clear EqSched_s'; move : (Sched_s'); rewrite scheduled_at_def;
move => /eqP EqSched_s'; rewrite EqSched_s'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s'
job_preemptable s' (service sched s' (t1 + fpt))
destruct (jlp == s') eqn : EQ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = true
job_preemptable s' (service sched s' (t1 + fpt))
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = true
job_preemptable s' (service sched s' (t1 + fpt))
move : EQ => /eqP EQ; subst s'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
job_preemptable jlp (service sched jlp (t1 + fpt))
rewrite /service -(service_during_cat _ _ _ t1); last first .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
0 <= t1 <= t1 + fpt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
0 <= t1 <= t1 + fpt
by apply /andP; split ; last rewrite leq_addr. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
job_preemptable jlp
(service_during sched jlp 0 t1 +
service_during sched jlp t1 (t1 + fpt))
have ->: service_during sched jlp t1 (t1 + fpt) = fpt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
service_during sched jlp t1 (t1 + fpt) = fpt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
service_during sched jlp t1 (t1 + fpt) = fpt
rewrite -{2 }(sum_of_ones t1 fpt) /service_during.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t =
\sum_(t1 <= x < t1 + fpt) 1
apply /eqP; rewrite eqn_leq //; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t <=
\sum_(t1 <= x < t1 + fpt) 1
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t <=
\sum_(t1 <= x < t1 + fpt) 1
rewrite leq_sum //; intros t _.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt) t : nat
service_at sched jlp t <= 1
apply service_at_most_one.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt) t : nat
unit_service_proc_model (processor_state Job)
by apply ideal_proc_model_provides_unit_service.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
\sum_(t1 <= x < t1 + fpt) 1 <=
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
\sum_(t1 <= x < t1 + fpt) 1 <=
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t
rewrite big_nat_cond [in X in _ <= X]big_nat_cond.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
\sum_(t1 <= i < t1 + fpt | (t1 <= i < t1 + fpt) &&
true) 1 <=
\sum_(t1 <= i < t1 + fpt | (t1 <= i < t1 + fpt) &&
true)
service_at sched jlp i
rewrite leq_sum //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
forall i : nat,
(t1 <= i < t1 + fpt) && true ->
0 < service_at sched jlp i
move => x /andP [HYP _].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt) x : nat HYP : t1 <= x < t1 + fpt
0 < service_at sched jlp x
rewrite service_at_def lt0b -scheduled_at_def.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt) x : nat HYP : t1 <= x < t1 + fpt
scheduled_at sched jlp x
by apply continuously_scheduled_between_preemption_points.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched EqSched_s' : sched (t1 + fpt) = Some jlp Sched_s' : scheduled_at sched jlp (t1 + fpt)
job_preemptable jlp
(service_during sched jlp 0 t1 + fpt)
by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false
job_preemptable s' (service sched s' (t1 + fpt))
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false
job_preemptable s' (service sched s' (t1 + fpt))
case : (posnP fpt) => [ZERO|POS].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false ZERO : fpt = 0
job_preemptable s' (service sched s' (t1 + fpt))
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false ZERO : fpt = 0
job_preemptable s' (service sched s' (t1 + fpt))
subst fpt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat H_progr_le_max_nonp_segment : 0 <=
job_max_nonpreemptive_segment
jlp - εH_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
0 <= ρH_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + 0 ) CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job EqSched_s' : sched (t1 + 0 ) = Some s' Sched_s' : scheduled_at sched s' (t1 + 0 ) EQ : (jlp == s') = false
job_preemptable s' (service sched s' (t1 + 0 ))
exfalso ; move : EQ => /negP EQ; apply : EQ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat H_progr_le_max_nonp_segment : 0 <=
job_max_nonpreemptive_segment
jlp - εH_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
0 <= ρH_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + 0 ) CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job EqSched_s' : sched (t1 + 0 ) = Some s' Sched_s' : scheduled_at sched s' (t1 + 0 )
jlp == s'
move : H_jlp_is_scheduled; rewrite scheduled_at_def; move => /eqP SCHED2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat H_progr_le_max_nonp_segment : 0 <=
job_max_nonpreemptive_segment
jlp - εH_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
0 <= ρH_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + 0 ) CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job EqSched_s' : sched (t1 + 0 ) = Some s' Sched_s' : scheduled_at sched s' (t1 + 0 ) SCHED2 : sched t1 = Some jlp
jlp == s'
rewrite addn0 in EqSched_s'; rewrite EqSched_s' in SCHED2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat H_progr_le_max_nonp_segment : 0 <=
job_max_nonpreemptive_segment
jlp - εH_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
0 <= ρH_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + 0 ) CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + 0 ) EqSched_s' : sched t1 = Some s' SCHED2 : Some s' = Some jlp
jlp == s'
by inversion SCHED2.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fpt
job_preemptable s' (service sched s' (t1 + fpt))
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fpt
job_preemptable s' (service sched s' (t1 + fpt))
have EX: exists sm , sm.+1 = fpt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fpt
exists sm : nat, sm.+1 = fpt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fpt
exists sm : nat, sm.+1 = fpt
exists fpt .-1 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fpt
fpt.-1 .+1 = fpt
lia . } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fptEX : exists sm : nat, sm.+1 = fpt
job_preemptable s' (service sched s' (t1 + fpt))
destruct EX as [sm EQ2].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt
job_preemptable s' (service sched s' (t1 + fpt))
rewrite -EQ2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt
job_preemptable s' (service sched s' (t1 + sm.+1 ))
rewrite addnS.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt
job_preemptable s' (service sched s' (t1 + sm).+1 )
move : ((proj1 CORR) s' (H_jobs_come_from_arrival_sequence _ _ Sched_s')) => T.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt T : job_cannot_become_nonpreemptive_before_execution
s' /\
job_cannot_be_nonpreemptive_after_completion s' /\
not_preemptive_implies_scheduled sched s' /\
execution_starts_with_preemption_point sched s'
job_preemptable s' (service sched s' (t1 + sm).+1 )
apply T; clear T.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt
~~ scheduled_at sched s' (t1 + sm)
apply /negP; intros CONTR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt CONTR : scheduled_at sched s' (t1 + sm)
False
move : EQ => /negP EQ; apply : EQ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt CONTR : scheduled_at sched s' (t1 + sm)
jlp == s'
move : (continuously_scheduled_between_preemption_points (t1 + sm)) => SCHEDs0.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt CONTR : scheduled_at sched s' (t1 + sm) SCHEDs0 : t1 <= t1 + sm < t1 + fpt ->
scheduled_at sched jlp (t1 + sm)
jlp == s'
feed SCHEDs0; first by apply /andP; split ; [rewrite leq_addr | rewrite -EQ2 addnS]. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt CONTR : scheduled_at sched s' (t1 + sm) SCHEDs0 : scheduled_at sched jlp (t1 + sm)
jlp == s'
apply /eqP; eapply ideal_proc_model_is_a_uniprocessor_model; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched s' : Job Sched_s' : scheduled_at sched s' (t1 + fpt) EqSched_s' : sched (t1 + fpt) = Some s' EQ : (jlp == s') = false POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt
scheduled_at sched s' (t1 + sm).+1
by rewrite -addnS EQ2.
}
Qed .
(** And since [fpt <= max_length_of_priority_inversion j t1],
[t1 <= t1 + fpt <= t1 + max_length_of_priority_inversion j t1]. *)
Lemma preemption_time_le_max_len_of_priority_inversion :
t1 <= t1 + fpt <= t1 + max_length_of_priority_inversion j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
t1 <= t1 + fpt <=
t1 + max_length_of_priority_inversion j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε
t1 <= t1 + fpt <=
t1 + max_length_of_priority_inversion j t1
move : (H_jlp_is_scheduled) => ARRs; apply H_jobs_come_from_arrival_sequence in ARRs.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
t1 <= t1 + fpt <=
t1 + max_length_of_priority_inversion j t1
apply /andP; split ; first by rewrite leq_addr.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
t1 + fpt <= t1 + max_length_of_priority_inversion j t1
rewrite leq_add2l.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
fpt <= max_length_of_priority_inversion j t1
unfold max_length_of_priority_inversion.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
fpt <=
\max_(j_lp <- arrivals_before arr_seq t1 | ~~
hep_job
j_lp j &&
(0 <
job_cost
j_lp))
(job_max_nonpreemptive_segment j_lp - ε)
rewrite (big_rem jlp) //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
fpt <=
maxn
(if ~~ hep_job jlp j && (0 < job_cost jlp)
then job_max_nonpreemptive_segment jlp - ε
else 0 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - ε))
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
fpt <=
maxn
(if ~~ hep_job jlp j && (0 < job_cost jlp)
then job_max_nonpreemptive_segment jlp - ε
else 0 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - ε))
rewrite H_jlp_low_priority //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
fpt <=
maxn
(if 0 < job_cost jlp
then job_max_nonpreemptive_segment jlp - ε
else 0 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - ε))
have NZ: service sched jlp t1 < job_cost jlp
by apply : service_lt_cost; rt_eauto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
fpt <=
maxn
(if 0 < job_cost jlp
then job_max_nonpreemptive_segment jlp - ε
else 0 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - ε))
rewrite ifT; last by lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
fpt <=
maxn (job_max_nonpreemptive_segment jlp - ε)
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - ε))
apply leq_trans with (job_max_nonpreemptive_segment jlp - ε).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
fpt <= job_max_nonpreemptive_segment jlp - ε
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
fpt <= job_max_nonpreemptive_segment jlp - ε
by apply H_progr_le_max_nonp_segment.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
job_max_nonpreemptive_segment jlp - ε <=
maxn (job_max_nonpreemptive_segment jlp - ε)
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - ε))
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
job_max_nonpreemptive_segment jlp - ε <=
maxn (job_max_nonpreemptive_segment jlp - ε)
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - ε))
by rewrite leq_maxl.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
jlp \in arrivals_before arr_seq t1
eapply arrived_between_implies_in_arrivals; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
arrived_between jlp 0 t1
apply /andP; split ; first by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
job_arrival jlp < t1
eapply low_priority_job_arrives_before_busy_interval_prefix with t1; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemptio_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - ε) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - ε ARRs : arrives_in arr_seq jlp
t1 <= t1 < t2
by move : (H_busy_interval_prefix) => [NEM [QT1 [NQT HPJ]]]; apply /andP; split .
Qed .
End FirstPreemptionPointOfjlp .
(** Next, we combine the above facts to conclude the lemma. *)
Lemma preemption_time_exists_case3 :
exists pr_t ,
preemption_time sched pr_t /\
t1 <= pr_t <= t1 + max_length_of_priority_inversion j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
set (service := service sched).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
have EX: exists pt ,
((service jlp t1) <= pt <= (service jlp t1) + (job_max_nonpreemptive_segment jlp - 1 )) && job_preemptable jlp pt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
move : (H_jlp_is_scheduled) => ARRs; apply H_jobs_come_from_arrival_sequence in ARRs.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
move : (proj2 (H_valid_model_with_bounded_nonpreemptive_segments) jlp ARRs) =>[_ EXPP].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : nonpreemptive_regions_have_bounded_length jlp
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
destruct H_sched_valid as [A B].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : nonpreemptive_regions_have_bounded_length jlp A : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
specialize (EXPP (service jlp t1)).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : 0 <= service jlp t1 <= job_cost jlp ->
exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - ε) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
feed EXPP. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : 0 <= service jlp t1 <= job_cost jlp ->
exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - ε) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
0 <= service jlp t1 <= job_cost jlp
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : 0 <= service jlp t1 <= job_cost jlp ->
exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - ε) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
0 <= service jlp t1 <= job_cost jlp
apply /andP; split ; first by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : 0 <= service jlp t1 <= job_cost jlp ->
exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - ε) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
service jlp t1 <= job_cost jlp
apply service_at_most_cost; rt_eauto.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - ε) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
move : EXPP => [pt [NEQ PP]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp A : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched pt : duration NEQ : service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - ε) PP : job_preemptable jlp pt
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
exists pt ; apply /andP; split ; by done .
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat EX : exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : (ex_minnP EX) => [sm_pt /andP [NEQ PP] MIN]; clear EX.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
have Fact : exists Δ , sm_pt = service jlp t1 + Δ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
exists Δ : nat, sm_pt = service jlp t1 + Δ
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
exists Δ : nat, sm_pt = service jlp t1 + Δ
exists (sm_pt - service jlp t1).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
sm_pt = service jlp t1 + (sm_pt - service jlp t1)
apply /eqP; rewrite eq_sym; apply /eqP; rewrite subnKC //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
service jlp t1 <= sm_pt
by move : NEQ => /andP [T _]. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= nFact : exists Δ : nat, sm_pt = service jlp t1 + Δ
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : Fact => [Δ EQ]; subst sm_pt; rename Δ into sm_pt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
exists (t1 + sm_pt); split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
preemption_time sched (t1 + sm_pt)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
preemption_time sched (t1 + sm_pt)
apply first_preemption_time; rewrite /service.service; try done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
forall ρ : nat,
service_during sched jlp 0 t1 <= ρ <=
service_during sched jlp 0 t1 +
(job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp ρ ->
service_during sched jlp 0 t1 + sm_pt <= ρ
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
forall ρ : nat,
service_during sched jlp 0 t1 <= ρ <=
service_during sched jlp 0 t1 +
(job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp ρ ->
service_during sched jlp 0 t1 + sm_pt <= ρ
by intros ; apply MIN; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
sm_pt <= job_max_nonpreemptive_segment jlp - ε
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
sm_pt <= job_max_nonpreemptive_segment jlp - ε
by rewrite /ε; lia .
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
t1 <= t1 + sm_pt <=
t1 + max_length_of_priority_inversion j t1
by apply preemption_time_le_max_len_of_priority_inversion;
[ done | by rewrite /ε; lia ].
Qed .
End Case3 .
End CaseAnalysis .
(** By doing the case analysis, we show that indeed there is a
preemption time in the time interval [[t1, t1 +
max_length_of_priority_inversion j t1]]. *)
Lemma preemption_time_exists :
exists pr_t ,
preemption_time sched pr_t /\
t1 <= pr_t <= t1 + max_length_of_priority_inversion j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
set (service := service sched).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : (H_valid_model_with_bounded_nonpreemptive_segments) => CORR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
move : (H_busy_interval_prefix) => [NEM [QT1 [NQT HPJ]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
ideal_proc_model_sched_case_analysis sched t1 s. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 Idle : is_idle sched t1
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 Idle : is_idle sched t1
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
by apply preemption_time_exists_case1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 s : Job Sched_s : scheduled_at sched s t1
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 s : Job Sched_s : scheduled_at sched s t1
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
destruct (hep_job s j) eqn :PRIO.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = true
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = true
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
by eapply preemption_time_exists_case2; eauto .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = false
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = false
exists pr_t : instant,
preemption_time sched pr_t /\
t1 <= pr_t <=
t1 + max_length_of_priority_inversion j t1
eapply preemption_time_exists_case3 with s; eauto .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq sched : schedule (processor_state Job) JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H1 : TaskMaxNonpreemptiveSegment Task H2 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H3 : JobReady Job (processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2 s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = false
~~ hep_job s j
by rewrite -eqbF_neg; apply /eqP.
Qed .
End PreemptionTimeExists .
End PriorityInversionIsBounded .