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.transform.replace_at.(** * Properties of the Generic Reference Scheduler *)(** This file establishes some facts about the generic reference scheduler that constructs a schedule via pointwise scheduling decisions based on a given policy and the preceding prefix. *)SectionGenericScheduleProperties.(** For any type of jobs and type of schedule, ... *)Context {Job : JobType} {PState : ProcessorState Job}.(** ... any scheduling policy, and ... *)Variablepolicy : PointwisePolicy PState.(** ... any notion of idleness. *)Variableidle_state : PState.(** For notational convenience, we define [prefix t] to denote the finite prefix considered when scheduling a job at time [t]. *)Letprefixt := if t is t'.+1then schedule_up_to policy idle_state t' else empty_schedule idle_state.(** To begin with, we establish two simple rewriting lemmas for unrolling [schedule_up_to]. First, we observe that the allocation is indeed determined by the policy based on the preceding prefix. *)
forallt : instant,
schedule_up_to policy idle_state t t =
policy (prefix t) t
byelim=> [|n IH]; rewrite [LHS]/schedule_up_to -/(schedule_up_to _) /replace_at; apply ifT.Qed.(** Second, we note how to replace [schedule_up_to] in the general case with its definition. *)
forallht : instant,
schedule_up_to policy idle_state h t =
replace_at (prefix h) h (policy (prefix h) h) t
bymove=> h t; rewrite [LHS]/schedule_up_to /prefix; elim: h.Qed.(** Next, we observe that we can increase a prefix's horizon by one time unit without changing any allocations in the prefix. *)
Job: JobType PState: ProcessorState Job policy: PointwisePolicy PState idle_state: PState prefix:= funt : nat =>
match t with
| 0 => empty_schedule idle_state
| t'.+1 => schedule_up_to policy idle_state t'
end: nat -> schedule PState t: nat LT: 0 < t ZERO: t = 0
False
nowsubst.
Job: JobType PState: ProcessorState Job policy: PointwisePolicy PState idle_state: PState prefix:= funt : nat =>
match t with
| 0 => empty_schedule idle_state
| t'.+1 => schedule_up_to policy idle_state t'
end: nat -> schedule PState t, h: nat IH: h < t ->
schedule_up_to policy idle_state h t = idle_state LT: h.+1 < t
schedule_up_to policy idle_state h.+1 t = idle_state
Job: JobType PState: ProcessorState Job policy: PointwisePolicy PState idle_state: PState prefix:= funt : nat =>
match t with
| 0 => empty_schedule idle_state
| t'.+1 => schedule_up_to policy idle_state t'
end: nat -> schedule PState t, h: nat IH: h < t ->
schedule_up_to policy idle_state h t = idle_state LT: h.+1 < t
schedule_up_to policy idle_state h.+1 t = idle_state
Job: JobType PState: ProcessorState Job policy: PointwisePolicy PState idle_state: PState prefix:= funt : nat =>
match t with
| 0 => empty_schedule idle_state
| t'.+1 => schedule_up_to policy idle_state t'
end: nat -> schedule PState t, h: nat IH: h < t ->
schedule_up_to policy idle_state h t = idle_state LT: h.+1 < t
t <> h.+1
Job: JobType PState: ProcessorState Job policy: PointwisePolicy PState idle_state: PState prefix:= funt : nat =>
match t with
| 0 => empty_schedule idle_state
| t'.+1 => schedule_up_to policy idle_state t'
end: nat -> schedule PState t, h: nat IH: h < t ->
schedule_up_to policy idle_state h t = idle_state LT: h.+1 < t EQ: t = h.+1
False
Job: JobType PState: ProcessorState Job policy: PointwisePolicy PState idle_state: PState prefix:= funt : nat =>
match t with
| 0 => empty_schedule idle_state
| t'.+1 => schedule_up_to policy idle_state t'
end: nat -> schedule PState t, h: nat IH: h < t ->
schedule_up_to policy idle_state h t = idle_state EQ: t = h.+1
h.+1 < t -> False
nowrewrite EQ ltnn.}Qed.(** A crucial fact is that a prefix up to horizon [h1] is identical to a prefix up to a later horizon [h2] at times up to [h1]. *)