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.definitions.task_schedule. Require Export prosa.analysis.facts.behavior.service. Require Export prosa.analysis.facts.model.scheduled. (** In this file we provide basic properties related to schedule of a task. *) Section TaskSchedule. (** Consider any type of tasks ... *) Context {Task : TaskType}. Context `{TaskCost Task}. (** ... and any type of jobs associated with these tasks. *) Context {Job : JobType}. Context `{JobTask Job Task}. Context `{JobArrival Job}. Context `{JobCost Job}. (** Consider any valid arrival sequence of such jobs ... *) Variable arr_seq : arrival_sequence Job. Hypothesis H_valid_arrivals : valid_arrival_sequence arr_seq. (** ... and let [sched] be any corresponding uni-processor schedule. *) Context {PState : ProcessorState Job}. Hypothesis H_uniproc : uniprocessor_model PState. Variable sched : schedule PState. Hypothesis H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence sched arr_seq. Hypothesis H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute sched. (** Let [tsk] be any task. *) Variable tsk : Task. (** First, we show that a task is served at time [t], then the task is scheduled at time [t]. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall t : instant, task_served_at arr_seq sched tsk t -> task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall t : instant, task_served_at arr_seq sched tsk t -> task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
SCHED: scheduled_jobs_of_task_at arr_seq sched tsk t = [::]

served_jobs_of_task_at arr_seq sched tsk t == [::]
by rewrite /served_jobs_of_task_at SCHED. Qed. (** Next, we show that, under ideal-progress assumption, the notion of task served coincides with the notion of task scheduled. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

ideal_progress_proc_model PState -> forall t : instant, task_served_at arr_seq sched tsk t = task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

ideal_progress_proc_model PState -> forall t : instant, task_served_at arr_seq sched tsk t = task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
IDEAL: ideal_progress_proc_model PState
t: instant

task_scheduled_at arr_seq sched tsk t -> task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
IDEAL: ideal_progress_proc_model PState
t: instant
j: Job
SCHED: j \in scheduled_jobs_at arr_seq sched t
TSK: job_of_task tsk j

task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
IDEAL: ideal_progress_proc_model PState
t: instant
j: Job
SCHED: j \in scheduled_jobs_at arr_seq sched t
TSK: job_of_task tsk j

j \in scheduled_jobs_of_task_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
IDEAL: ideal_progress_proc_model PState
t: instant
j: Job
SCHED: j \in scheduled_jobs_at arr_seq sched t
TSK: job_of_task tsk j
receives_service_at sched j t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
IDEAL: ideal_progress_proc_model PState
t: instant
j: Job
SCHED: j \in scheduled_jobs_at arr_seq sched t
TSK: job_of_task tsk j

j \in scheduled_jobs_of_task_at arr_seq sched tsk t
by rewrite mem_filter; apply/andP; split.
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
IDEAL: ideal_progress_proc_model PState
t: instant
j: Job
SCHED: j \in scheduled_jobs_at arr_seq sched t
TSK: job_of_task tsk j

receives_service_at sched j t
by apply IDEAL; rewrite scheduled_jobs_at_iff in SCHED. Qed. (** We note that if the processor is idle at time [t], then no task is scheduled. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall t : instant, is_idle arr_seq sched t -> ~~ task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall t : instant, is_idle arr_seq sched t -> ~~ task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
IDLE: is_idle arr_seq sched t

~~ task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
IDLE: is_idle arr_seq sched t

~~ has [eta job_of_task tsk] (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
IDLE: is_idle arr_seq sched t

all (predC [eta job_of_task tsk]) (scheduled_jobs_at arr_seq sched t)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
IDLE: is_idle arr_seq sched t
j: Job
SCHED: j \in scheduled_jobs_at arr_seq sched t

False
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
IDLE: is_idle arr_seq sched t
j: Job
SCHED: scheduled_at sched j t

False
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
j: Job
SCHED: scheduled_at sched j t
IDLE: ~~ scheduled_at sched ?j t

False
exact: (negP IDLE). Qed. (** Similarly, if the processor is idle at time [t], then no task is served. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall t : instant, is_idle arr_seq sched t -> ~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall t : instant, is_idle arr_seq sched t -> ~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
IDLE: is_idle arr_seq sched t

~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
t: instant
IDLE: ~~ task_scheduled_at arr_seq sched tsk t

~~ task_served_at arr_seq sched tsk t
by move: IDLE; apply contra, task_served_task_scheduled. Qed. (** We show that if a job is scheduled at time [t], then [task_scheduled_at tsk t] is equal to [job_of_task tsk j]. In other words, any occurrence of [task_scheduled_at] can be replaced with [job_of_task]. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), scheduled_at sched j t -> task_scheduled_at arr_seq sched tsk t = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), scheduled_at sched j t -> task_scheduled_at arr_seq sched tsk t = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
j: Job
t: instant

scheduled_at sched j t -> task_scheduled_at arr_seq sched tsk t = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
j: Job
t: instant

scheduled_jobs_at arr_seq sched t == [:: j] -> task_scheduled_at arr_seq sched tsk t = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
j: Job
t: instant

((if job_of_task tsk j then [:: j] else [::]) != [::]) = job_of_task tsk j
by case: (job_of_task _ _). Qed. (** As a corollary, we show that if a job of task [tsk] is scheduled at time [t], then task [tsk] is scheduled at time [t]. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), job_of_task tsk j -> scheduled_at sched j t -> task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), job_of_task tsk j -> scheduled_at sched j t -> task_scheduled_at arr_seq sched tsk t
by move=> j t TSK SCHED; rewrite (job_of_scheduled_task j) => //. Qed. (** And vice versa, if no job of task [tsk] is scheduled at time [t], then task [tsk] is not scheduled at time [t]. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), ~~ job_of_task tsk j -> scheduled_at sched j t -> ~~ task_scheduled_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), ~~ job_of_task tsk j -> scheduled_at sched j t -> ~~ task_scheduled_at arr_seq sched tsk t
by move=> j t TSK SCHED; rewrite (job_of_scheduled_task j) => //. Qed. (** Similarly, we show that if no job of task [tsk] is scheduled at time [t], then task [tsk] is not served at time [t]. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), ~~ job_of_task tsk j -> scheduled_at sched j t -> ~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), ~~ job_of_task tsk j -> scheduled_at sched j t -> ~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
j: Job
t: instant
TSK: ~~ job_of_task tsk j
SCHED: scheduled_at sched j t

~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
j: Job
t: instant
TSK: ~~ job_of_task tsk j
SCHED: scheduled_at sched j t

~~ task_scheduled_at arr_seq sched tsk t
exact: job_of_other_task_scheduled. Qed. (** Lastly, if a job of task [tsk] is scheduled at time [t] but receives no service, then task [tsk] is not served at time [t]. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), scheduled_at sched j t -> job_of_task tsk j -> service_at sched j t = 0 -> ~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task

forall (j : Job) (t : instant), scheduled_at sched j t -> job_of_task tsk j -> service_at sched j t = 0 -> ~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
j: Job
t: instant

scheduled_at sched j t -> job_of_task tsk j -> service_at sched j t = 0 -> ~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
j: Job
t: instant

scheduled_jobs_at arr_seq sched t == [:: j] -> job_of_task tsk j -> service_at sched j t = 0 -> ~~ task_served_at arr_seq sched tsk t
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
j: Job
t: instant

service_at sched j t = 0 -> ~~ ((if receives_service_at sched j t then [:: j] else [::]) != [::])
by rewrite /receives_service_at => ->. Qed. (** In the following section, we prove a rewriting rule between the predicate [task_served_at] and [job_of_task]. *) Section SomeJobIsScheduled. (** Assume that the processor is fully supply-consuming. *) Hypothesis H_consumed_supply_proc_model : fully_consuming_proc_model PState. (** Consider a time instant [t] ... *) Variable t : instant. (** ... and assume that there is supply at [t]. *) Hypothesis H_supply : has_supply sched t. (** Consider jobs [j] and [j'] ([j'] is not necessarily distinct from job [j]). Assume that [j] is scheduled at time [t]. *) Variable j : Job. Hypothesis H_sched : scheduled_at sched j t. (** Then the predicate [task_served_at] is equal to the predicate [job_of_task]. *)
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t

task_served_at arr_seq sched tsk t = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t

task_served_at arr_seq sched tsk t = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t

task_served_at arr_seq sched tsk t = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t

([seq j <- [seq j <- scheduled_jobs_at arr_seq sched t | job_of_task tsk j] | receives_service_at sched j t] != [::]) = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t
SCHED: scheduled_at sched j t

([seq j <- [seq j <- scheduled_jobs_at arr_seq sched t | job_of_task tsk j] | receives_service_at sched j t] != [::]) = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t
SCHED: scheduled_jobs_at arr_seq sched t == [:: j]

([seq j <- [seq j <- scheduled_jobs_at arr_seq sched t | job_of_task tsk j] | receives_service_at sched j t] != [::]) = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t

([seq j <- [seq j <- [:: j] | job_of_task tsk j] | receives_service_at sched j t] != [::]) = job_of_task tsk j
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t
TSK: job_of_task tsk j

([seq j <- [seq j <- [:: j] | job_of_task tsk j] | receives_service_at sched j t] != [::]) = true
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t
NTSK: job_of_task tsk j = false
([seq j <- [ seq j <- [:: j] | job_of_task tsk j] | receives_service_at sched j t] != [::]) = false
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t
TSK: job_of_task tsk j

([seq j <- [seq j <- [:: j] | job_of_task tsk j] | receives_service_at sched j t] != [::]) = true
by rewrite //= TSK //= SERV.
Task: TaskType
H: TaskCost Task
Job: JobType
H0: JobTask Job Task
H1: JobArrival Job
H2: JobCost Job
arr_seq: arrival_sequence Job
H_valid_arrivals: valid_arrival_sequence arr_seq
PState: ProcessorState Job
H_uniproc: uniprocessor_model PState
sched: schedule PState
H_jobs_come_from_arrival_sequence: jobs_come_from_arrival_sequence sched arr_seq
H_jobs_must_arrive_to_execute: jobs_must_arrive_to_execute sched
tsk: Task
H_consumed_supply_proc_model: fully_consuming_proc_model PState
t: instant
H_supply: has_supply sched t
j: Job
H_sched: scheduled_at sched j t
SERV: receives_service_at sched j t
NTSK: job_of_task tsk j = false

([seq j <- [seq j <- [:: j] | job_of_task tsk j] | receives_service_at sched j t] != [::]) = false
by rewrite //= NTSK //=. Qed. End SomeJobIsScheduled. End TaskSchedule.