Built with Alectryon, running Coq+SerAPI v8.15.0+0.15.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.
Notation"[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"_ + _" was already used in scope nat_scope.
[notation-overridden,parsing]
Notation"_ - _" was already used in scope nat_scope.
[notation-overridden,parsing]
Notation"_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing]
Notation"_ < _" was already used in scope nat_scope.
[notation-overridden,parsing]
Notation"_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing]
Notation"_ > _" was already used in scope nat_scope.
[notation-overridden,parsing]
Notation"_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing]
Notation"_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing]
Notation"_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing]
Notation"_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing]
Notation"_ * _" was already used in scope nat_scope.
[notation-overridden,parsing]
Notation"[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]
Notation"[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
(** ** Task Refinement *)(** In this module, we define a generic version of concrete task and prove that it is isomorphic to the standard, natural-number-based definition. *)(** We begin by defining the generic task type. *)SectionDefinitions.(** In this file, we refine the Prosa standard implementation of jobs and tasks. *)DefinitionTask := [eqType of concrete_task].DefinitionJob := [eqType of concrete_job].(** Consider a generic type [T], for which all the basic arithmetical operations, ordering, and equality are defined. *)Context `{T : Type}.Context `{!zero_of T, !one_of T, !sub_of T, !add_of T, !mul_of T,
!div_of T, !mod_of T, !eq_of T, !leq_of T, !lt_of T}.Context `{!eq_of (seq T)}.Context `{!eq_of (@task_arrivals_bound_T T)}.(** We define a generic task type that uses [T] for each numerical value. *)Structuretask_T :=
{
task_id_T: T;
task_cost_T: T;
task_arrival_T: @task_arrivals_bound_T T;
task_deadline_T: T;
task_priority_T: T
}.(** Further, we define the equality for two generic tasks as the equality of each attribute. *)Definitiontask_eqdef_T (t1t2: task_T) :=
(task_id_T t1 == task_id_T t2)%C &&
(task_cost_T t1 == task_cost_T t2)%C &&
(task_arrival_T t1 == task_arrival_T t2)%C &&
(task_deadline_T t1 == task_deadline_T t2)%C &&
(task_priority_T t1 == task_priority_T t2)%C.(** Next, we define a helper function that convert a minimum inter-arrival time to an arrival curve prefix. *)Definitioninter_arrival_to_extrapolated_arrival_curve_T (p : T) : T * seq (T * T) := (p, [::(1, 1)])%C.(** Further, we define the arrival bound of a task as, possibly, (1) periodic, (2) sporadic, or (3) an arrival curve. Note that, internally, the workload bound is always represented by an arrival curve. *)Definitionget_extrapolated_arrival_curve_T (tsk : task_T) : T * seq (T * T) :=
match task_arrival_T tsk with
| Periodic_T p => inter_arrival_to_extrapolated_arrival_curve_T p
| Sporadic_T m => inter_arrival_to_extrapolated_arrival_curve_T m
| ArrivalPrefix_T steps => steps
end.(** With the previous definition in place, we define the workload bound... *)DefinitionConcreteMaxArrivals_T (tsk : task_T) (Δ : T): T :=
extrapolated_arrival_curve_T (get_extrapolated_arrival_curve_T tsk) Δ.(** ... and the task request-bound function. *)Definitiontask_rbf_T (tsk : task_T) (Δ : T) :=
(task_cost_T tsk * ConcreteMaxArrivals_T tsk Δ)%C.(** Further, we define a valid arrival bound as (1) a positive minimum inter-arrival time/period, or (2) a valid arrival curve prefix. *)Definitionvalid_arrivals_T (tsk : task_T) : bool :=
match task_arrival_T tsk with
| Periodic_T p => (1 <= p)%C
| Sporadic_T m => (1 <= m)%C
| ArrivalPrefix_T ac_prefix_vec => valid_extrapolated_arrival_curve_T ac_prefix_vec
end.(** Next, we define a helper function that yields the horizon of the arrival curve prefix of a task ... *)Definitionget_horizon_of_task_T (tsk : task_T) : T :=
horizon_of_T (get_extrapolated_arrival_curve_T tsk).(** ... another one that yields the time steps of the arrival curve, ... *)Definitionget_time_steps_of_task_T (tsk : task_T) : seq T :=
time_steps_of_T (get_extrapolated_arrival_curve_T tsk).(** ... a function that yields the same time steps, offset by δ, ... *)Definitiontime_steps_with_offset_Ttskδ :=
[seq t + δ | t <- get_time_steps_of_task_T tsk]%C.(** ... and a generalization of the previous function that repeats the time steps for each given offset. *)Definitionrepeat_steps_with_offset_T (tsk : task_T) (offsets : seq T): seq T :=
(flatten (map (time_steps_with_offset_T tsk) offsets))%C.EndDefinitions.(** In this section, we define two functions used to convert from a generic task to the standard task definition, and vice-versa. *)SectionTranslation.(** First, we define the function that maps a generic task to a natural-number task... *)DefinitiontaskT_to_task (tsk: @task_T N) : Task :=
match tsk with
| {| task_id_T := id;
task_cost_T := cost;
task_arrival_T := arrival_bound;
task_deadline_T := deadline;
task_priority_T := priority |}
=>
{| task.task_id := nat_of_bin id;
task.task_cost := nat_of_bin cost;
task.task_arrival := task_abT_to_task_ab arrival_bound;
task.task_deadline := nat_of_bin deadline;
task.task_priority := nat_of_bin priority |}
end.(** ... and its function relationship. *)DefinitionRtask := fun_hrel taskT_to_task.(** Finally, we define the converse function, mapping a natural-number task to a generic one. *)Definitiontask_to_taskT (tsk: Task) : @task_T N :=
match tsk with
| {| task.task_id := id;
task.task_cost := cost;
task.task_arrival := arrival_bound;
task.task_deadline := deadline;
task.task_priority := priority |}
=>
{| task_id_T := bin_of_nat id;
task_cost_T := bin_of_nat cost;
task_arrival_T := task_ab_to_task_abT arrival_bound;
task_deadline_T := bin_of_nat deadline;
task_priority_T := bin_of_nat priority |}
end.EndTranslation.(** In this fairly technical section, we prove a series of refinements aimed to be able to convert between a standard natural-number task and a generic task. *)SectionTheory.(** We prove the refinement of the constructor functions. *)
bycompute.Qed.(** Next, we prove a refinement for the task id conversion. *)
refines (unify (A:=task_T) ==> Rtask)%rel
taskT_to_task id
refines (unify (A:=task_T) ==> Rtask)%rel
taskT_to_task id
tsk, tsk': task_T UNI: unify tsk tsk'
Rtask (taskT_to_task tsk) tsk'
byhave UNIT := unify_rel; lastspecialize (UNIT _ _ _ UNI); subst tsk'; clear UNI.Qed.(** Finally, we prove a refinement for the id conversion applied to a list of tasks. *)
refines (unify (A:=seq task_T) ==> list_R Rtask)%rel
(map taskT_to_task) id
refines (unify (A:=seq task_T) ==> list_R Rtask)%rel
(map taskT_to_task) id
ts, ts': seq task_T UNI: unify ts ts'
list_R Rtask [seq taskT_to_task i | i <- ts] ts'
ts: seq task_T
list_R Rtask [seq taskT_to_task i | i <- ts] ts
list_R Rtask [seq taskT_to_task i | i <- [::]] [::]
tsk: task_T ts: seq task_T IHts: list_R Rtask [seq taskT_to_task i | i <- ts] ts
list_R Rtask [seq taskT_to_task i | i <- tsk :: ts]
(tsk :: ts)
list_R Rtask [seq taskT_to_task i | i <- [::]] [::]
tsk: task_T ts: seq task_T IHts: list_R Rtask [seq taskT_to_task i | i <- ts] ts
list_R Rtask [seq taskT_to_task i | i <- tsk :: ts]
(tsk :: ts)
tsk: task_T ts: seq task_T IHts: list_R Rtask [seq taskT_to_task i | i <- ts] ts
list_R Rtask [seq taskT_to_task i | i <- tsk :: ts]
(tsk :: ts)
tsk: task_T ts: seq task_T IHts: list_R Rtask [seq taskT_to_task i | i <- ts] ts
list_R Rtask [seq taskT_to_task i | i <- tsk :: ts]
(tsk :: ts)
tsk: task_T ts: seq task_T IHts: list_R Rtask [seq taskT_to_task i | i <- ts] ts
Rtask (taskT_to_task tsk) tsk
byunfold Rtask, fun_hrel.Qed.EndTheory.(** For convenience, we define a simple notation to declare concrete tasks using numbers represented in binary, adopted in POET's certificates. *)Require Export NArith.Notation"{| 'id:' c1 'cost:' c2 'deadline:' c3 'arrival:' c4 'priority:' c5 }" := {|
task_id_T := c1;
task_cost_T := c2;
task_deadline_T := c3;
task_arrival_T := c4;
task_priority_T := c5 |} (at level6,
right associativity,
only parsing ).Notation"{| 'id:' c1 'cost:' c2 'deadline:' c3 'arrival:' c4 }" := {|
task_id_T := c1;
task_cost_T := c2;
task_deadline_T := c3;
task_arrival_T := c4;
task_priority_T := 0%N |} (at level6,
right associativity,
only parsing ).