Built with Alectryon, running Coq+SerAPI v8.20.0+0.20.0. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
[Loading ML file ssrmatching_plugin.cmxs (using legacy method) ... done]
[Loading ML file ssreflect_plugin.cmxs (using legacy method) ... done]
[Loading ML file ring_plugin.cmxs (using legacy method) ... done]
Serlib plugin: coq-elpi.elpi is not available: serlib support is missing. Incremental checking for commands in this plugin will be impacted.
[Loading ML file coq-elpi.elpi ... done]
[Loading ML file zify_plugin.cmxs (using legacy method) ... done]
[Loading ML file micromega_core_plugin.cmxs (using legacy method) ... done]
[Loading ML file micromega_plugin.cmxs (using legacy method) ... done]
[Loading ML file btauto_plugin.cmxs (using legacy method) ... done]
Notation "_ + _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ - _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ <= _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ < _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ >= _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ > _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ <= _ <= _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ < _ <= _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ <= _ < _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ < _ < _" was already used in scope nat_scope. [notation-overridden,parsing,default]
Notation "_ * _" was already used in scope nat_scope. [notation-overridden,parsing,default]
(** This file relates the general notion of [cumulative_priority_inversion] with the more specialized notion [cumulative_priority_inversion_cond]. *) Section CondPI. (** 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_valid_arrivals : valid_arrival_sequence arr_seq. (** ... and any ideal uniprocessor schedule of this arrival sequence. *) Context {PState : ProcessorState Job}. Hypothesis H_uni : uniprocessor_model PState. Variable sched : schedule PState. (** 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_job_priorities JLFP. Hypothesis H_priority_is_transitive: transitive_job_priorities JLFP. (** Consider a valid preemption model with known maximum non-preemptive segment lengths. *) Context `{TaskMaxNonpreemptiveSegment Task} `{JobPreemptable Job}. Hypothesis H_valid_preemption_model : valid_preemption_model arr_seq sched. (** Further, allow for any work-bearing notion of job readiness. *) Context `{@JobReady Job PState Cost Arrival}. Hypothesis H_job_ready : work_bearing_readiness arr_seq sched. (** We assume that the schedule is valid. *) Hypothesis H_sched_valid : valid_schedule 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. (** 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. (** We establish a technical rewriting lemma that allows us to replace [cumulative_priority_inversion] with [cumulative_priority_inversion_cond] by exploiting the observation that a single job remains scheduled throughout the interval in which job [j] suffers 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_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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) (P : pred Job), scheduled_at sched jlp t1 -> P jlp -> cumulative_priority_inversion arr_seq sched j t1 t2 = cumulative_priority_inversion_cond arr_seq sched j P t1 t2
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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) (P : pred Job), scheduled_at sched jlp t1 -> P jlp -> cumulative_priority_inversion arr_seq sched j t1 t2 = cumulative_priority_inversion_cond arr_seq sched j P t1 t2
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp

cumulative_priority_inversion arr_seq sched j t1 t2 = cumulative_priority_inversion_cond arr_seq sched j P t1 t2
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2

priority_inversion arr_seq sched j t = priority_inversion_cond arr_seq sched j P t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t

has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t

(forall j' : Job, j' \in scheduled_jobs_at arr_seq sched t -> ~~ hep_job j' j -> P j') -> has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
((forall j' : Job, j' \in scheduled_jobs_at arr_seq sched t -> ~~ hep_job j' j -> P j') -> has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)) -> has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t

(forall j' : Job, j' \in scheduled_jobs_at arr_seq sched t -> ~~ hep_job j' j -> P j') -> has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
SUFF: forall j' : Job, j' \in scheduled_jobs_at arr_seq sched t -> ~~ hep_job j' j -> P j'

has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
SUFF: forall j' : Job, j' \in scheduled_jobs_at arr_seq sched t -> ~~ hep_job j' j -> P j'
j': Job
SCHED': j' \in scheduled_jobs_at arr_seq sched t

~~ hep_job j' j = ~~ hep_job j' j && P j'
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
SUFF: forall j' : Job, j' \in scheduled_jobs_at arr_seq sched t -> ~~ hep_job j' j -> P j'
j': Job
SCHED': j' \in scheduled_jobs_at arr_seq sched t
NHEP: ~~ hep_job j' j

~~ false = ~~ false && P j'
by rewrite andTb SUFF.
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t

((forall j' : Job, j' \in scheduled_jobs_at arr_seq sched t -> ~~ hep_job j' j -> P j') -> has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)) -> has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t

((forall j' : Job, j' \in scheduled_jobs_at arr_seq sched t -> ~~ hep_job j' j -> P j') -> has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)) -> has (fun jlp : Job => ~~ hep_job jlp j) (scheduled_jobs_at arr_seq sched t) = has (fun jlp : Job => ~~ hep_job jlp j && P jlp) (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
j': Job
SCHED': j' \in scheduled_jobs_at arr_seq sched t
NHEP: ~~ hep_job j' j

P j'
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
j': Job
NHEP: ~~ hep_job j' j
SCHED'': scheduled_at sched j' t

P j'
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
j': Job
NHEP: ~~ hep_job j' j
SCHED'': scheduled_at sched j' t
PI: priority_inversion arr_seq sched j t

P j'
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
j': Job
NHEP: ~~ hep_job j' j
SCHED'': scheduled_at sched j' t
PI: priority_inversion arr_seq sched j t
j't1: scheduled_at sched j' t1

P j'
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
j': Job
NHEP: ~~ hep_job j' j
SCHED'': scheduled_at sched j' t
PI: priority_inversion arr_seq sched j t
j't1: scheduled_at sched j' t1

j' = jlp
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
SCHED: scheduled_at sched jlp t1
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
j': Job
NHEP: ~~ hep_job j' j
SCHED'': scheduled_at sched j' t
PI: priority_inversion arr_seq sched j t
j't1: scheduled_at sched j' t1

j' = jlp
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
Arrival: JobArrival Job
Cost: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uni: uniprocessor_model PState
sched: schedule PState
JLFP: JLFP_policy Job
H_priority_is_reflexive: reflexive_job_priorities JLFP
H_priority_is_transitive: transitive_job_priorities JLFP
H1: TaskMaxNonpreemptiveSegment Task
H2: JobPreemptable Job
H_valid_preemption_model: valid_preemption_model arr_seq sched
H3: JobReady Job PState
H_job_ready: work_bearing_readiness arr_seq sched
H_sched_valid: valid_schedule sched arr_seq
H_work_conserving: work_conserving arr_seq sched
H_respects_policy: respects_JLFP_policy_at_preemption_point arr_seq sched JLFP
j: Job
H_j_arrives: arrives_in arr_seq j
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
P: pred Job
Pjlp: P jlp
t: nat
t1t: t1 <= t
tt2: t < t2
NSCHED: j \notin scheduled_jobs_at arr_seq sched t
j': Job
NHEP: ~~ hep_job j' j
SCHED'': scheduled_at sched j' t
PI: priority_inversion arr_seq sched j t
j't1: scheduled_at sched j' t1
NEQ: j' != jlp

~~ scheduled_at sched jlp t1
by apply scheduled_job_at_neq with (j:= j'). } } Qed. End CondPI.