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.analysis.facts.sporadic.arrival_times. (** In this section we show that the separation between job arrivals of a periodic task is some multiple of their corresponding task's period. *) Section JobArrivalSeparation. (** Consider periodic tasks with an offset ... *) Context {Task : TaskType}. Context `{PeriodicModel Task}. (** ... and any type of jobs associated with these tasks. *) Context {Job : JobType}. Context `{JobTask Job Task}. Context `{JobArrival Job}. (** Consider any unique arrival sequence with consistent arrivals, ... *) Variable arr_seq : arrival_sequence Job. Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq. (** ... and any task [tsk] that is to be analyzed. *) Variable tsk : Task. (** Assume all tasks have a valid period and respect the periodic task model. *) Hypothesis H_periodic_model: respects_periodic_task_model arr_seq tsk. Hypothesis H_valid_period: valid_period tsk. (** In this section we show that two consecutive jobs of a periodic task have their arrival times separated by their task's period. *) Section ConsecutiveJobSeparation. (** Consider any two _consecutive_ jobs [j1] and [j2] of task [tsk]. *) Variable j1 : Job. Variable j2 : Job. Hypothesis H_j1_from_arr_seq: arrives_in arr_seq j1. Hypothesis H_j2_from_arr_seq: arrives_in arr_seq j2. Hypothesis H_j1_of_task: job_task j1 = tsk. Hypothesis H_j2_of_task: job_task j2 = tsk. Hypothesis H_consecutive_jobs: job_index arr_seq j2 = job_index arr_seq j1 + 1. (** We show that if job [j1] and [j2] are consecutive jobs with [j2] arriving after [j1], then their arrival times are separated by their task's period. *)
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_consecutive_jobs: job_index arr_seq j2 = job_index arr_seq j1 + 1

job_arrival j2 = job_arrival j1 + task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_consecutive_jobs: job_index arr_seq j2 = job_index arr_seq j1 + 1

job_arrival j2 = job_arrival j1 + task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_consecutive_jobs: job_index arr_seq j2 = job_index arr_seq j1 + 1
PERIODIC: arrives_in arr_seq j2 -> 0 < job_index arr_seq j2 -> job_task j2 = tsk -> exists j' : Job, arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - 1 /\ job_task j' = tsk /\ job_arrival j2 = job_arrival j' + task_period tsk

job_arrival j2 = job_arrival j1 + task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_consecutive_jobs: job_index arr_seq j2 = job_index arr_seq j1 + 1
PERIODIC: exists j' : Job, arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - 1 /\ job_task j' = tsk /\ job_arrival j2 = job_arrival j' + task_period tsk

job_arrival j2 = job_arrival j1 + task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_consecutive_jobs: job_index arr_seq j2 = job_index arr_seq j1 + 1
pj': Job
ARR_IN_PJ': arrives_in arr_seq pj'
INDPJ'J': job_index arr_seq pj' = job_index arr_seq j2 - 1
TSKPJ': job_task pj' = tsk
ARRPJ': job_arrival j2 = job_arrival pj' + task_period tsk

job_arrival j2 = job_arrival j1 + task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_consecutive_jobs: job_index arr_seq j2 = job_index arr_seq j1 + 1
pj': Job
ARR_IN_PJ': arrives_in arr_seq pj'
TSKPJ': job_task pj' = tsk
ARRPJ': job_arrival j2 = job_arrival pj' + task_period tsk
INDPJ'J': job_index arr_seq pj' = job_index arr_seq j1

job_arrival j2 = job_arrival j1 + task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_consecutive_jobs: job_index arr_seq j2 = job_index arr_seq j1 + 1
pj': Job
ARR_IN_PJ': arrives_in arr_seq pj'
TSKPJ': job_task pj' = tsk
ARRPJ': job_arrival j2 = job_arrival pj' + task_period tsk
INDPJ'J': pj' = j1

job_arrival j2 = job_arrival j1 + task_period tsk
by rewrite INDPJ'J' in ARRPJ'; lia. Qed. End ConsecutiveJobSeparation. (** In this section we show that for two unequal jobs of a task, there exists a non-zero multiple of their task's period which separates their arrival times. *) Section ArrivalSeparationWithGivenIndexDifference. (** Consider any two _consecutive_ jobs [j1] and [j2] of task [tsk] that stem from the arrival sequence. *) Variable j1 j2 : Job. Hypothesis H_j1_from_arr_seq: arrives_in arr_seq j1. Hypothesis H_j2_from_arr_seq: arrives_in arr_seq j2. Hypothesis H_j1_of_task: job_task j1 = tsk. Hypothesis H_j2_of_task: job_task j2 = tsk. (** We'll assume that job [j1] arrives before [j2] and that their indices differ by an integer [k]. *) Variable k : nat. Hypothesis H_index_difference_k: job_index arr_seq j1 + k = job_index arr_seq j2 . Hypothesis H_job_arrival_lt: job_arrival j1 < job_arrival j2. (** We prove that arrival of unequal jobs of a task [tsk] are separated by a non-zero multiple of [task_period tsk] provided their index differs by a number [k]. *)
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
k: nat
H_index_difference_k: job_index arr_seq j1 + k = job_index arr_seq j2
H_job_arrival_lt: job_arrival j1 < job_arrival j2

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
k: nat
H_index_difference_k: job_index arr_seq j1 + k = job_index arr_seq j2
H_job_arrival_lt: job_arrival j1 < job_arrival j2

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat

forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + k = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat

forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat

forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + 0 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s.+1 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat

forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + 0 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + 0 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj1: arrives_in arr_seq j2
ARRj2: arrives_in arr_seq j1

False
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + 0 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj1: arrives_in arr_seq j2
ARRj2: arrives_in arr_seq j1
LT_IND: arrives_in arr_seq j1 -> arrives_in arr_seq j2 -> job_task j1 = job_task j2 -> job_arrival j1 < job_arrival j2 -> job_index arr_seq j1 < job_index arr_seq j2

False
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + 0 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj1: arrives_in arr_seq j2
ARRj2: arrives_in arr_seq j1
LT_IND: job_index arr_seq j1 < job_index arr_seq j2

False
by lia.
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk

forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s.+1 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk

forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s.+1 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+1 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+1 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
BEFORE: job_index arr_seq j2 - s < job_index arr_seq j2 -> exists j' : Job, j2 <> j' /\ job_task j' = job_task j2 /\ arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - s

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + 0 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + 1 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
BEFORE: job_index arr_seq j2 - 0 < job_index arr_seq j2 -> exists j' : Job, j2 <> j' /\ job_task j' = job_task j2 /\ arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - 0

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s.+1 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
BEFORE: job_index arr_seq j2 - s.+1 < job_index arr_seq j2 -> exists j' : Job, j2 <> j' /\ job_task j' = job_task j2 /\ arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - s.+1
exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + 0 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + 1 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
BEFORE: job_index arr_seq j2 - 0 < job_index arr_seq j2 -> exists j' : Job, j2 <> j' /\ job_task j' = job_task j2 /\ arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - 0

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + 0 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + 1 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
BEFORE: job_index arr_seq j2 - 0 < job_index arr_seq j2 -> exists j' : Job, j2 <> j' /\ job_task j' = job_task j2 /\ arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - 0

job_arrival j2 = job_arrival j1 + 1 * task_period tsk
by rewrite (consecutive_job_separation j1) //; lia.
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s.+1 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
BEFORE: job_index arr_seq j2 - s.+1 < job_index arr_seq j2 -> exists j' : Job, j2 <> j' /\ job_task j' = job_task j2 /\ arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - s.+1

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s.+1 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
BEFORE: exists j' : Job, j2 <> j' /\ job_task j' = job_task j2 /\ arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq j2 - s.+1

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
IHs: forall j1 j2 : Job, job_task j1 = tsk -> job_task j2 = tsk -> job_index arr_seq j1 + s.+1 = job_index arr_seq j2 -> job_arrival j1 < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq j1 -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
j1, j2: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
nj: Job
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj: Job
IHs: job_arrival nj < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq nj -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival nj + n * task_period tsk
j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk

job_arrival nj < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj: Job
IHs: exists n : nat, 0 < n /\ job_arrival j2 = job_arrival nj + n * task_period tsk
j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj: Job
IHs: job_arrival nj < job_arrival j2 -> arrives_in arr_seq j2 -> arrives_in arr_seq nj -> exists n : nat, 0 < n /\ job_arrival j2 = job_arrival nj + n * task_period tsk
j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk

job_arrival nj < job_arrival j2
by apply (lower_index_implies_earlier_arrival _ H_valid_arrival_sequence tsk) => //; lia.
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj: Job
IHs: exists n : nat, 0 < n /\ job_arrival j2 = job_arrival nj + n * task_period tsk
j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj, j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
n: nat
NZN: 0 < n
ARRJ'NJ: job_arrival j2 = job_arrival nj + n * task_period tsk

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj, j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
n: nat
NZN: 0 < n
ARRJ'NJ: job_arrival j2 = job_arrival nj + n * task_period tsk
PERIODIC: exists j' : Job, arrives_in arr_seq j' /\ job_index arr_seq j' = job_index arr_seq nj - 1 /\ job_task j' = tsk /\ job_arrival nj = job_arrival j' + task_period tsk

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj, j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
n: nat
NZN: 0 < n
sj: Job
ARR_IN_SJ: arrives_in arr_seq sj
INDSJ: job_index arr_seq sj = job_index arr_seq nj - 1
TSKSJ: job_task sj = tsk
ARRSJ: job_arrival nj = job_arrival sj + task_period tsk
ARRJ'NJ: job_arrival j2 = job_arrival sj + task_period tsk + n * task_period tsk

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj, j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
n: nat
NZN: 0 < n
sj: Job
ARR_IN_SJ: arrives_in arr_seq sj
INDSJ: job_index arr_seq sj = job_index arr_seq nj - 1
TSKSJ: job_task sj = tsk
ARRSJ: job_arrival nj = job_arrival sj + task_period tsk
ARRJ'NJ: job_arrival j2 = job_arrival sj + task_period tsk + n * task_period tsk
INDJ: job_index arr_seq j1 = job_index arr_seq j2 - s.+2

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj, j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
n: nat
NZN: 0 < n
sj: Job
ARR_IN_SJ: arrives_in arr_seq sj
TSKSJ: job_task sj = tsk
ARRSJ: job_arrival nj = job_arrival sj + task_period tsk
ARRJ'NJ: job_arrival j2 = job_arrival sj + task_period tsk + n * task_period tsk
INDJ: job_index arr_seq j1 = job_index arr_seq j2 - s.+2
INDSJ: job_index arr_seq sj = job_index arr_seq j1

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj, j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
n: nat
NZN: 0 < n
sj: Job
ARR_IN_SJ: arrives_in arr_seq sj
TSKSJ: job_task sj = tsk
ARRSJ: job_arrival nj = job_arrival sj + task_period tsk
ARRJ'NJ: job_arrival j2 = job_arrival sj + task_period tsk + n * task_period tsk
INDJ: job_index arr_seq j1 = job_index arr_seq j2 - s.+2
INDSJ: sj = j1

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj, j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
n: nat
NZN: 0 < n
sj: Job
ARR_IN_SJ: arrives_in arr_seq sj
TSKSJ: job_task sj = tsk
ARRSJ: job_arrival nj = job_arrival sj + task_period tsk
ARRJ'NJ: job_arrival j2 = job_arrival sj + task_period tsk + n * task_period tsk
INDJ: job_index arr_seq j1 = job_index arr_seq j2 - s.+2
INDSJ: sj = j1

job_arrival j2 = job_arrival j1 + n.+1 * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
k, s: nat
j2, nj, j1: Job
TSKj1: job_task j1 = tsk
TSKj2: job_task j2 = tsk
STEP: job_index arr_seq j1 + s.+2 = job_index arr_seq j2
LT: job_arrival j1 < job_arrival j2
ARRj2: arrives_in arr_seq j2
ARRj1: arrives_in arr_seq j1
NEQNJ: j2 <> nj
ARRNJ: arrives_in arr_seq nj
INDNJ: job_index arr_seq nj = job_index arr_seq j2 - s.+1
TSKNJ: job_task nj = tsk
n: nat
NZN: 0 < n
sj: Job
ARR_IN_SJ: arrives_in arr_seq sj
TSKSJ: job_task sj = tsk
ARRSJ: job_arrival nj = job_arrival sj + task_period tsk
INDJ: job_index arr_seq j1 = job_index arr_seq j2 - s.+2
INDSJ: sj = j1
ARRJ'NJ: job_arrival j2 = job_arrival j1 + task_period tsk + n * task_period tsk

job_arrival j2 = job_arrival j1 + (n * task_period tsk + task_period tsk)
by lia. } Qed. End ArrivalSeparationWithGivenIndexDifference. (** Consider any two _distinct_ jobs [j1] and [j2] of task [tsk] that stem from the arrival sequence. *) Variable j1 j2 : Job. Hypothesis H_j1_neq_j2: j1 <> j2. Hypothesis H_j1_from_arr_seq: arrives_in arr_seq j1. Hypothesis H_j2_from_arr_seq: arrives_in arr_seq j2. Hypothesis H_j1_of_task: job_task j1 = tsk. Hypothesis H_j2_of_task: job_task j2 = tsk. (** Without loss of generality, we assume that job [j1] arrives before job [j2]. *) Hypothesis H_j1_before_j2: job_arrival j1 <= job_arrival j2. (** We generalize the above lemma to show that any two unequal jobs of task [tsk] are separated by a non-zero multiple of [task_period tsk]. *)
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2

exists n : nat, 0 < n /\ job_arrival j2 = job_arrival j1 + n * task_period tsk
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2

job_index arr_seq j1 + (job_index arr_seq j2 - job_index arr_seq j1) = job_index arr_seq j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
job_arrival j1 < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2

job_index arr_seq j1 + (job_index arr_seq j2 - job_index arr_seq j1) = job_index arr_seq j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2

job_index arr_seq j1 <= job_index arr_seq j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
IND: job_index arr_seq j2 < job_index arr_seq j1

False
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
IND: job_arrival j2 < job_arrival j1

False
by move_neq_down IND.
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2

job_arrival j1 < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
EQ_IND: job_index arr_seq j1 = job_index arr_seq j2

job_arrival j1 < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
NEQ_IND: job_index arr_seq j1 != job_index arr_seq j2
job_arrival j1 < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
EQ_IND: job_index arr_seq j1 = job_index arr_seq j2

job_arrival j1 < job_arrival j2
by apply equal_index_implies_equal_jobs in EQ_IND => //; rewrite H_j1_of_task.
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
NEQ_IND: job_index arr_seq j1 != job_index arr_seq j2

job_arrival j1 < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
LT: job_index arr_seq j1 < job_index arr_seq j2

job_arrival j1 < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
LT: job_index arr_seq j2 < job_index arr_seq j1
job_arrival j1 < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
LT: job_index arr_seq j1 < job_index arr_seq j2

job_arrival j1 < job_arrival j2
by eapply (lower_index_implies_earlier_arrival) in LT.
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
LT: job_index arr_seq j2 < job_index arr_seq j1

job_arrival j1 < job_arrival j2
Task: TaskType
H: PeriodicModel Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
arr_seq: arrival_sequence Job
H_valid_arrival_sequence: valid_arrival_sequence arr_seq
tsk: Task
H_periodic_model: respects_periodic_task_model arr_seq tsk
H_valid_period: valid_period tsk
j1, j2: Job
H_j1_neq_j2: j1 <> j2
H_j1_from_arr_seq: arrives_in arr_seq j1
H_j2_from_arr_seq: arrives_in arr_seq j2
H_j1_of_task: job_task j1 = tsk
H_j2_of_task: job_task j2 = tsk
H_j1_before_j2: job_arrival j1 <= job_arrival j2
LT: job_arrival j2 < job_arrival j1

job_arrival j1 < job_arrival j2
by move_neq_down LT. Qed. End JobArrivalSeparation.