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]
Require Export prosa.model.schedule.work_conserving. Require Export prosa.model.readiness.basic. Require Export prosa.model.schedule.priority_driven. Require Export prosa.analysis.definitions.schedulability. (** * Propagation of Release Jitter in Arrival Curves *) (** In this module, we prove correct an approach to "hiding" release jitter by "folding" it into arrival curves. *) Section JitterPropagationFacts. (** Consider any type of tasks described by arrival curves and the corresponding jobs. *) Context {Task : TaskType} {arrival_curve : MaxArrivals Task} {Job : JobType} `{JobTask Job Task}. (** Let [original_arrival] denote each job's _actual_ arrival time ... *) Context {original_arrival : JobArrival Job}. (** ... and suppose the jobs are affected by bounded release jitter. *) Context `{TaskJitter Task} `{JobJitter Job}. (** In the following, consider an arbitrary valid arrival sequence. *) Variable arr_seq : arrival_sequence Job. Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq. (** Recall the induced "release curve" and associated definitions. *) #[local] Existing Instance release_as_arrival. #[local] Existing Instance release_curve. (** In the following, we let [rel_seq] denote the induced "release curve". *) Let rel_seq := release_sequence arr_seq. (** Suppose we are given a set of tasks ... *) Variable ts : seq Task. (** ... with valid bounds on release jitter. *) Hypothesis H_valid_jitter : valid_jitter_bounds ts. (** ** Restated General Properties *) (** We begin by restating general properties of delay propagation, specialized to the case of jitter propagation. *) (** The arrival and release sequences contain an identical set of jobs. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

forall j : Job, arrives_in arr_seq j <-> arrives_in rel_seq j
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

forall j : Job, arrives_in arr_seq j <-> arrives_in rel_seq j
move=> j; split; [ apply: (arrives_in_propagated_if original_arrival release_as_arrival) => // | apply: (arrives_in_propagated_only_if original_arrival release_as_arrival) => // ]; exact: jitter_arr_seq_mapping_valid. Qed. (** The induced "release sequence" is valid. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

valid_arrival_sequence rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

valid_arrival_sequence rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

valid_arr_seq_propagation_mapping original_arrival release_as_arrival id ?Goal arr_seq (cons^~ [::]) job_jitter ?Goal0
by apply: jitter_arr_seq_mapping_valid. Qed. (** If the arrival curve is structurally valid, then so is the induced release curve. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

valid_taskset_arrival_curve ts max_arrivals -> valid_taskset_arrival_curve ts release_curve
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

valid_taskset_arrival_curve ts max_arrivals -> valid_taskset_arrival_curve ts release_curve
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
VALID: valid_taskset_arrival_curve ts max_arrivals

valid_taskset_arrival_curve ts release_curve
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
VALID: valid_taskset_arrival_curve ts max_arrivals
tsk: Task
IN: tsk \in ts

monotone leq (max_arrivals tsk)
by move: (VALID tsk IN) => [_ {}]. Qed. (** Furthermore, if the arrival curve correctly bounds arrivals according to [arr_seq], then the "release curve" also correctly bounds releases according to [rel_seq]. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

valid_taskset_arrival_curve ts max_arrivals -> taskset_respects_max_arrivals arr_seq ts -> taskset_respects_max_arrivals rel_seq ts
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

valid_taskset_arrival_curve ts max_arrivals -> taskset_respects_max_arrivals arr_seq ts -> taskset_respects_max_arrivals rel_seq ts
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
AC: valid_taskset_arrival_curve ts max_arrivals
VALID: taskset_respects_max_arrivals arr_seq ts

taskset_respects_max_arrivals rel_seq ts
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
AC: valid_taskset_arrival_curve ts max_arrivals
VALID: taskset_respects_max_arrivals arr_seq ts

valid_delay_propagation_mapping original_arrival release_as_arrival id id task_jitter ts
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
AC: valid_taskset_arrival_curve ts max_arrivals
VALID: taskset_respects_max_arrivals arr_seq ts
valid_arr_seq_propagation_mapping original_arrival release_as_arrival id task_jitter arr_seq (cons^~ [::]) job_jitter ts
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
AC: valid_taskset_arrival_curve ts max_arrivals
VALID: taskset_respects_max_arrivals arr_seq ts

valid_delay_propagation_mapping original_arrival release_as_arrival id id task_jitter ts
by apply: jitter_delay_mapping_valid.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
AC: valid_taskset_arrival_curve ts max_arrivals
VALID: taskset_respects_max_arrivals arr_seq ts

valid_arr_seq_propagation_mapping original_arrival release_as_arrival id task_jitter arr_seq (cons^~ [::]) job_jitter ts
by apply: jitter_arr_seq_mapping_valid. Qed. (** ** Jitter Propagation Properties *) (** Next, we establish validity properties specific to jitter propagation. These are needed to apply response-time analysis results. *) (** Since the arrival and release sequence describe identical sets of jobs, trivially all jobs continue to belong to the tasks in the task set. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

all_jobs_from_taskset arr_seq ts -> all_jobs_from_taskset rel_seq ts
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts

all_jobs_from_taskset arr_seq ts -> all_jobs_from_taskset rel_seq ts
by move=> ALL j IN; apply: ALL; rewrite jitter_arrives_in_iff. Qed. (** Next, consider an arbitrary schedule of the workload. *) Context {PState : ProcessorState Job}. Variable sched : schedule PState. (** Again, trivially, all jobs in the schedule continue to belong to the release sequence. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState

jobs_come_from_arrival_sequence sched arr_seq -> jobs_come_from_arrival_sequence sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState

jobs_come_from_arrival_sequence sched arr_seq -> jobs_come_from_arrival_sequence sched rel_seq
move=> FROM j t SCHED; rewrite -jitter_arrives_in_iff; exact: FROM. Qed. (** Let us now consider the execution costs. *) Context `{JobCost Job} `{TaskCost Task}. (** Since the set of jobs didn't change, and since release jitter propagation does not change execution costs, job costs remain trivially valid. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task

arrivals_have_valid_job_costs arr_seq -> arrivals_have_valid_job_costs rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task

arrivals_have_valid_job_costs arr_seq -> arrivals_have_valid_job_costs rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
VALID: arrivals_have_valid_job_costs arr_seq
j: Job
IN: arrives_in rel_seq j

valid_job_cost j
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
j: Job
IN: arrives_in rel_seq j

arrives_in arr_seq j
by rewrite jitter_arrives_in_iff. Qed. (** If the given schedule respects release jitter, then it continues to do so after we've reinterpreted the release times to be the arrival times. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task

jobs_must_be_ready_to_execute sched -> jobs_must_be_ready_to_execute sched
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task

jobs_must_be_ready_to_execute sched -> jobs_must_be_ready_to_execute sched
move=> RDY j t SCHED; by move: (RDY j t SCHED). Qed. (** If the schedule is work-conserving, then it continues to be so after we've "hidden" release jitter by reinterpreting release times as arrival times. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task

work_conserving arr_seq sched -> work_conserving rel_seq sched
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task

work_conserving arr_seq sched -> work_conserving rel_seq sched
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
WC_jit: work_conserving arr_seq sched
j: Job
t: instant
ARR_rel: arrives_in rel_seq j
R_rel: job_ready sched j t
NSCHED: ~~ scheduled_at sched j t

exists j_other : Job, scheduled_at sched j_other t
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
WC_jit: work_conserving arr_seq sched
j: Job
t: instant
ARR_rel: arrives_in rel_seq j
R_rel: job_ready sched j t
NSCHED: ~~ scheduled_at sched j t
ARR_arr: arrives_in arr_seq j

exists j_other : Job, scheduled_at sched j_other t
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
j: Job
t: instant
ARR_rel: arrives_in rel_seq j
R_rel: job_ready sched j t
NSCHED: ~~ scheduled_at sched j t
ARR_arr: arrives_in arr_seq j

backlogged sched j t
by apply/andP; split. Qed. (** If the given schedule is valid w.r.t. to original arrivals, then it continues to be valid after reinterpreting release times as arrival times. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task

valid_schedule sched arr_seq -> valid_schedule sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task

valid_schedule sched arr_seq -> valid_schedule sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
SRC: jobs_come_from_arrival_sequence sched arr_seq
RDY: jobs_must_be_ready_to_execute sched

valid_schedule sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
SRC: jobs_come_from_arrival_sequence sched arr_seq
RDY: jobs_must_be_ready_to_execute sched

jobs_come_from_arrival_sequence sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
SRC: jobs_come_from_arrival_sequence sched arr_seq
RDY: jobs_must_be_ready_to_execute sched
jobs_must_be_ready_to_execute sched
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
SRC: jobs_come_from_arrival_sequence sched arr_seq
RDY: jobs_must_be_ready_to_execute sched

jobs_come_from_arrival_sequence sched rel_seq
exact: jitter_prop_same_jobs'.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
SRC: jobs_come_from_arrival_sequence sched arr_seq
RDY: jobs_must_be_ready_to_execute sched

jobs_must_be_ready_to_execute sched
exact: jitter_ready_to_execute. Qed. (** In the following, suppose the given schedule is valid w.r.t. the original arrival times and jitter-affected readiness. *) Hypothesis H_valid_schedule : @valid_schedule _ _ sched _ original_arrival jitter_ready_instance arr_seq. (** As one would think, the set of scheduled jobs remains unchanged. For technical reasons (dependence of the definition of [scheduled_jobs_at] on the arrival sequence), this is a lot less obvious at the Coq level than one intuitively might expect. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq

forall (t : instant) (j : Job), (j \in scheduled_jobs_at rel_seq sched t) = (j \in scheduled_jobs_at arr_seq sched t)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq

forall (t : instant) (j : Job), (j \in scheduled_jobs_at rel_seq sched t) = (j \in scheduled_jobs_at arr_seq sched t)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job

(t \in scheduled_jobs_at rel_seq sched j) = (t \in scheduled_jobs_at arr_seq sched j)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job
SRC: jobs_come_from_arrival_sequence sched arr_seq

(t \in scheduled_jobs_at rel_seq sched j) = (t \in scheduled_jobs_at arr_seq sched j)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job
SRC: jobs_come_from_arrival_sequence sched arr_seq

(t \in scheduled_jobs_at rel_seq sched j) = scheduled_at sched t j
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job
SRC: jobs_come_from_arrival_sequence sched arr_seq

valid_arrival_sequence rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job
SRC: jobs_come_from_arrival_sequence sched arr_seq
jobs_come_from_arrival_sequence sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job
SRC: jobs_come_from_arrival_sequence sched arr_seq
jobs_must_arrive_to_execute sched
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job
SRC: jobs_come_from_arrival_sequence sched arr_seq

valid_arrival_sequence rel_seq
exact: valid_release_sequence.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job
SRC: jobs_come_from_arrival_sequence sched arr_seq

jobs_come_from_arrival_sequence sched rel_seq
exact: jitter_prop_same_jobs'.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
j: instant
t: Job
SRC: jobs_come_from_arrival_sequence sched arr_seq

jobs_must_arrive_to_execute sched
exact /(@jobs_must_arrive_to_be_ready _ _ sched _ release_as_arrival basic_ready_instance) /jitter_ready_to_execute. Qed. (** Unsurprisingly, on a uniprocessor, the scheduled job remains unchanged, too. Again, this is less straightforward than one might think due to technical reasons (type-class resolution). *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq

forall t : instant, uniprocessor_model PState -> scheduled_job_at arr_seq sched t = scheduled_job_at rel_seq sched t
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq

forall t : instant, uniprocessor_model PState -> scheduled_job_at arr_seq sched t = scheduled_job_at rel_seq sched t
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState

scheduled_job_at arr_seq sched t = scheduled_job_at rel_seq sched t
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq

scheduled_job_at arr_seq sched t = scheduled_job_at rel_seq sched t
(* Note: there is a lot of repetition here because the automation chokes on the multiple available type-class instances and/or promptly picks the wrong ones. Not pretty, but it works. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
SCHED: scheduled_job_at arr_seq sched t = Some j
j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'

Some j = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
SCHED: scheduled_job_at arr_seq sched t = Some j
SCHED': scheduled_job_at rel_seq sched t = None
Some j = None
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
SCHED: scheduled_job_at arr_seq sched t = None
j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'
None = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
SCHED: scheduled_job_at arr_seq sched t = Some j
j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'

Some j = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'
SCHED: scheduled_at sched j t

Some j = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t

scheduled_at sched j' t -> Some j = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t
valid_arrival_sequence rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t
jobs_come_from_arrival_sequence sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t
jobs_must_arrive_to_execute sched
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t
uniprocessor_model PState
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t

scheduled_at sched j' t -> Some j = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t
SCHED': scheduled_at sched j' t

Some j = Some j'
by rewrite (UNI j j' sched t).
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t

valid_arrival_sequence rel_seq
exact: valid_release_sequence.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t

jobs_come_from_arrival_sequence sched rel_seq
exact: jitter_prop_same_jobs'.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t

jobs_must_arrive_to_execute sched
exact /(@jobs_must_arrive_to_be_ready _ _ sched _ release_as_arrival basic_ready_instance) /jitter_ready_to_execute.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j, j': Job
SCHED: scheduled_at sched j t

uniprocessor_model PState
by [].
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
SCHED: scheduled_job_at arr_seq sched t = Some j
SCHED': scheduled_job_at rel_seq sched t = None

Some j = None
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
SCHED: scheduled_job_at arr_seq sched t = None
j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'
None = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
SCHED: scheduled_job_at arr_seq sched t = Some j
SCHED': scheduled_job_at rel_seq sched t = None

Some j = None
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
SCHED: scheduled_job_at arr_seq sched t = Some j
SCHED': scheduled_job_at rel_seq sched t = None

False
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
SCHED': scheduled_job_at rel_seq sched t = None

scheduled_at sched j t -> False
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job

valid_arrival_sequence rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
jobs_come_from_arrival_sequence sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job
jobs_must_arrive_to_execute sched
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job

valid_arrival_sequence rel_seq
exact: valid_release_sequence.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job

jobs_come_from_arrival_sequence sched rel_seq
exact: jitter_prop_same_jobs'.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j: Job

jobs_must_arrive_to_execute sched
exact /(@jobs_must_arrive_to_be_ready _ _ sched _ release_as_arrival basic_ready_instance) /jitter_ready_to_execute.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
SCHED: scheduled_job_at arr_seq sched t = None
j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'

None = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
SCHED: scheduled_job_at arr_seq sched t = None
j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'

None = Some j'
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
SCHED: scheduled_job_at arr_seq sched t = None
j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'

False
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
SCHED': scheduled_job_at rel_seq sched t = Some j'
NSCHED: forall j : Job, ~~ scheduled_at sched j t

False
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
NSCHED: forall j : Job, ~~ scheduled_at sched j t

valid_arrival_sequence rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
NSCHED: forall j : Job, ~~ scheduled_at sched j t
jobs_come_from_arrival_sequence sched rel_seq
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
NSCHED: forall j : Job, ~~ scheduled_at sched j t
jobs_must_arrive_to_execute sched
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
NSCHED: forall j : Job, ~~ scheduled_at sched j t
uniprocessor_model PState
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
NSCHED: forall j : Job, ~~ scheduled_at sched j t

valid_arrival_sequence rel_seq
exact: valid_release_sequence.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
NSCHED: forall j : Job, ~~ scheduled_at sched j t

jobs_come_from_arrival_sequence sched rel_seq
exact: jitter_prop_same_jobs'.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
NSCHED: forall j : Job, ~~ scheduled_at sched j t

jobs_must_arrive_to_execute sched
exact /(@jobs_must_arrive_to_be_ready _ _ sched _ release_as_arrival basic_ready_instance) /jitter_ready_to_execute.
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
t: instant
UNI: uniprocessor_model PState
SRC: jobs_come_from_arrival_sequence sched arr_seq
j': Job
NSCHED: forall j : Job, ~~ scheduled_at sched j t

uniprocessor_model PState
by []. } Qed. (** Importantly, the schedule remains FP-policy compliant if it was so to begin with, despite the postponed arrival times. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
FP: FP_policy Task
H4: JobPreemptable Job

uniprocessor_model PState -> respects_FP_policy_at_preemption_point arr_seq sched FP -> respects_FP_policy_at_preemption_point rel_seq sched FP
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
FP: FP_policy Task
H4: JobPreemptable Job

uniprocessor_model PState -> respects_FP_policy_at_preemption_point arr_seq sched FP -> respects_FP_policy_at_preemption_point rel_seq sched FP
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
FP: FP_policy Task
H4: JobPreemptable Job
UNI: uniprocessor_model PState
COMP: respects_FP_policy_at_preemption_point arr_seq sched FP
j, j_hp: Job
t: instant
ARR_rel: arrives_in rel_seq j
PT_rel: preemption_time rel_seq sched t
BL: backlogged sched j t
SCHED_hp: scheduled_at sched j_hp t

hep_job_at t j_hp j
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
FP: FP_policy Task
H4: JobPreemptable Job
UNI: uniprocessor_model PState
COMP: respects_FP_policy_at_preemption_point arr_seq sched FP
j, j_hp: Job
t: instant
ARR_rel: arrives_in rel_seq j
PT_rel: preemption_time rel_seq sched t
BL: backlogged sched j t
SCHED_hp: scheduled_at sched j_hp t
ARR_arr: arrives_in arr_seq j

hep_job_at t j_hp j
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
FP: FP_policy Task
H4: JobPreemptable Job
UNI: uniprocessor_model PState
j, j_hp: Job
t: instant
ARR_rel: arrives_in rel_seq j
PT_rel: preemption_time rel_seq sched t
BL: backlogged sched j t
SCHED_hp: scheduled_at sched j_hp t
ARR_arr: arrives_in arr_seq j

preemption_time arr_seq sched t
by rewrite /preemption_time jitter_scheduled_job_at_eq. Qed. (** ** Transferred Response-Time Bound *) (** Finally, we state the main result, which is the whole point of jitter propagation in the first place: if it is possible to bound response times after release jitter has been folded into the arrival curves, then this implies a response-time bound for the original problem with jitter. This theorem conceptually corresponds to equations (5) and (6) in Audsley et al. (1993), but has been generalized to arbitrary arrival curves. - Audsley, N., Burns, A., Richardson, M., Tindell, K., and Wellings, A. (1993). Applying new scheduling theory to static priority preemptive scheduling. Software Engineering Journal, 8(5):284–292. *)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq

forall (tsk : Task) (R : duration), tsk \in ts -> task_response_time_bound rel_seq sched tsk R -> task_response_time_bound arr_seq sched tsk (task_jitter tsk + R)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq

forall (tsk : Task) (R : duration), tsk \in ts -> task_response_time_bound rel_seq sched tsk R -> task_response_time_bound arr_seq sched tsk (task_jitter tsk + R)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
tsk: Task
R: duration
IN: tsk \in ts
RTB: task_response_time_bound rel_seq sched tsk R
j: Job
IN_arr: arrives_in arr_seq j
TSK: job_of_task tsk j

job_response_time_bound sched j (task_jitter tsk + R)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
tsk: Task
R: duration
IN: tsk \in ts
RTB: task_response_time_bound rel_seq sched tsk R
j: Job
IN_arr: arrives_in arr_seq j
TSK: job_of_task tsk j
IN_rel: arrives_in rel_seq j

job_response_time_bound sched j (task_jitter tsk + R)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
tsk: Task
R: duration
IN: tsk \in ts
RTB: task_response_time_bound rel_seq sched tsk R
j: Job
IN_arr: arrives_in arr_seq j
TSK: job_of_task tsk j
IN_rel: arrives_in rel_seq j

job_response_time_bound sched j R -> job_response_time_bound sched j (task_jitter tsk + R)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
tsk: Task
R: duration
IN: tsk \in ts
RTB: task_response_time_bound rel_seq sched tsk R
j: Job
IN_arr: arrives_in arr_seq j
TSK: job_of_task tsk j
IN_rel: arrives_in rel_seq j

completed_by sched j (original_arrival j + job_jitter j + R) -> completed_by sched j (original_arrival j + (task_jitter tsk + R))
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
tsk: Task
R: duration
IN: tsk \in ts
RTB: task_response_time_bound rel_seq sched tsk R
j: Job
IN_arr: arrives_in arr_seq j
TSK: job_of_task tsk j
IN_rel: arrives_in rel_seq j

original_arrival j + job_jitter j + R <= original_arrival j + (task_jitter tsk + R)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
tsk: Task
R: duration
IN: tsk \in ts
RTB: task_response_time_bound rel_seq sched tsk R
j: Job
IN_arr: arrives_in arr_seq j
IN_rel: arrives_in rel_seq j
TSK: job_task j = tsk

original_arrival j + job_jitter j + R <= original_arrival j + (task_jitter tsk + R)
Task: TaskType
arrival_curve: MaxArrivals Task
Job: JobType
H: JobTask Job Task
original_arrival: JobArrival Job
H0: TaskJitter Task
H1: JobJitter Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
rel_seq:= release_sequence arr_seq: instant -> seq Job
ts: seq Task
H_valid_jitter: valid_jitter_bounds ts
PState: ProcessorState Job
sched: schedule PState
H2: JobCost Job
H3: TaskCost Task
H_valid_schedule: valid_schedule sched arr_seq
tsk: Task
R: duration
IN: tsk \in ts
RTB: task_response_time_bound rel_seq sched tsk R
j: Job
IN_arr: arrives_in arr_seq j
IN_rel: arrives_in rel_seq j
TSK: job_task j = tsk

job_jitter j <= task_jitter tsk -> original_arrival j + job_jitter j + R <= original_arrival j + (task_jitter tsk + R)
by lia. Qed. End JitterPropagationFacts.