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 ring_plugin.cmxs (using legacy method) ... done]
[Loading ML file ssrmatching_plugin.cmxs (using legacy method) ... done]
[Loading ML file ssreflect_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]
New coercion path [GRing.subring_closedM;
GRing.smulr_closedN] : GRing.subring_closed >-> GRing.oppr_closed is ambiguous with existing
[GRing.subring_closedB; GRing.zmod_closedN] : GRing.subring_closed >-> GRing.oppr_closed.
[ambiguous-paths,coercions,default]
New coercion path [GRing.subring_closed_semi;
GRing.semiring_closedM] : GRing.subring_closed >-> GRing.mulr_closed is ambiguous with existing
[GRing.subring_closedM; GRing.smulr_closedM] : GRing.subring_closed >-> GRing.mulr_closed.
New coercion path [GRing.subring_closed_semi;
GRing.semiring_closedD] : GRing.subring_closed >-> GRing.addr_closed is ambiguous with existing
[GRing.subring_closedB; GRing.zmod_closedD] : GRing.subring_closed >-> GRing.addr_closed.
[ambiguous-paths,coercions,default]
New coercion path [GRing.sdivr_closed_div;
GRing.divr_closedM] : GRing.sdivr_closed >-> GRing.mulr_closed is ambiguous with existing
[GRing.sdivr_closedM; GRing.smulr_closedM] : GRing.sdivr_closed >-> GRing.mulr_closed.
[ambiguous-paths,coercions,default]
New coercion path [GRing.subalg_closedBM;
GRing.subring_closedB] : GRing.subalg_closed >-> GRing.zmod_closed is ambiguous with existing
[GRing.subalg_closedZ; GRing.submod_closedB] : GRing.subalg_closed >-> GRing.zmod_closed.
[ambiguous-paths,coercions,default]
New coercion path [GRing.divring_closed_div;
GRing.sdivr_closedM] : GRing.divring_closed >-> GRing.smulr_closed is ambiguous with existing
[GRing.divring_closedBM; GRing.subring_closedM] : GRing.divring_closed >-> GRing.smulr_closed.
[ambiguous-paths,coercions,default]
New coercion path [GRing.divalg_closedBdiv;
GRing.divring_closedBM] : GRing.divalg_closed >-> GRing.subring_closed is ambiguous with existing
[GRing.divalg_closedZ; GRing.subalg_closedBM] : GRing.divalg_closed >-> GRing.subring_closed.
[ambiguous-paths,coercions,default]
Notation"_ - _" was already used in scope
distn_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]
Notation"_ * _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Require Export prosa.analysis.facts.priority.classes.Require Export prosa.analysis.definitions.priority.classes.Require Export prosa.analysis.facts.model.workload.(** In this file, we prove lemmas that are useful when both an FP policy and a JLFP policy are present in context. *)(** In this section, we prove a lemma about workload partitioning which is useful for reasoning about the interference bound function for the ELF scheduling policy. *)SectionWorkloadTaskSum.(** Consider any type of tasks with relative priority points...*)Context {Task : TaskType} `{PriorityPoint Task}.(** ...and jobs of these tasks. *)Context {Job : JobType} `{JobArrival Job} `{JobTask Job Task} `{JobCost Job} .(** Let us consider an FP policy and a compatible JLFP policy present in context. *)Context {FP : FP_policy Task}.Context {JLFP : JLFP_policy Job}.HypothesisJLFP_FP_is_compatible : JLFP_FP_compatible JLFP FP.(** Consider any valid arrival sequence [arr_seq]. *)Variablearr_seq : arrival_sequence Job.HypothesisH_valid_arrival_sequence : valid_arrival_sequence (arr_seq).(** We consider an arbitrary task set [ts]... *)Variablets : seq Task.HypothesisH_task_set : uniq ts.(** ... and assume that all jobs stem from tasks in this task set. *)HypothesisH_all_jobs_from_taskset : all_jobs_from_taskset arr_seq ts.(** Let [tsk] be any task in [ts] that is to be analyzed. *)Variabletsk : Task.HypothesisH_tsk_in_ts : tsk \in ts.(** We define a predicate to identify others tasks which have equal priority as [tsk]. *)Definitionother_ep_task := funtsk_o => (ep_task tsk tsk_o) && (tsk_o != tsk).(** We consider a job [j] belonging to this task ... *)Variablej : Job.HypothesisH_job_of_task : job_of_task tsk j.(** ... and focus on the jobs arriving in an arbitrary interval <<[t1, t2)>>. *)Variablet1t2 : duration.(** We first consider jobs that belong to other tasks that have equal priority as [tsk] and have higher-or-equal priority [JLFP] than [j]. *)Definitionhep_job_of_ep_other_task :=
funj' : Job =>
hep_job j' j
&& ep_task (job_task j') (job_task j)
&& (job_task j' != job_task j).(** We then establish that the cumulative workload of these jobs can be partitioned task-wise. *)
byrewrite ep_task_sym.Qed.(** Now we focus on jobs belonging to tasks which have higher priority than [tsk]. *)Definitionfrom_hp_task (j' : Job) :=
hp_task (job_task j') (job_task j).(** We also identify higher-or-equal-priority jobs [JLFP] that belong to (1) tasks having higher priority than [tsk] ... *)Definitionhep_from_hp_task (j' : Job) :=
hep_job j' j && hp_task (job_task j') (job_task j).(** ... (2) tasks having equal priority as [tsk]. *)Definitionhep_from_ep_task (j' : Job) :=
hep_job j' j && ep_task (job_task j') (job_task j).(** First, we establish that the cumulative workload of higher-or-equal-priority jobs belonging to tasks having higher priority than [tsk] is equal to the cumulative workload of jobs belonging to higher-priority tasks. *)
byapply: (hp_task_implies_hep_job JLFP FP).Qed.(** We then establish that the cumulative workload of higher-or-equal priority jobs is equal to the sum of cumulative workload of higher-or-equal priority jobs belonging to higher-priority tasks and the cumulative workload of higher-or-equal-priority jobs belonging to equal-priority tasks. *)