Library prosa.classic.model.priority
Require Import prosa.classic.util.all.
Require Import prosa.classic.model.arrival.basic.task prosa.classic.model.arrival.basic.job prosa.classic.model.arrival.basic.arrival_sequence.
From mathcomp Require Import ssreflect ssrbool eqtype ssrnat seq.
Module Priority.
Import SporadicTaskset ArrivalSequence.
Section PriorityDefs.
Variable Task: eqType.
Variable Job: eqType.
Definition FP_policy := rel Task.
Definition JLFP_policy := rel Job.
Definition JLDP_policy := time → rel Job.
End PriorityDefs.
Section Generalization.
Context {Task: eqType}.
Context {Job: eqType}.
Variable job_task: Job → Task.
Definition FP_to_JLFP (task_hp: FP_policy Task) :=
fun (jhigh jlow: Job) ⇒
task_hp (job_task jhigh) (job_task jlow).
Definition FP_to_JLDP (task_hp: FP_policy Task) :=
fun (t: time) ⇒ FP_to_JLFP task_hp.
Definition JLFP_to_JLDP (job_hp: JLFP_policy Job) :=
fun (t: time) ⇒ job_hp.
End Generalization.
Section PropertiesFP.
Context {Task: eqType}.
Context {Job: eqType}.
Variable job_task: Job → Task.
Variable task_priority: FP_policy Task.
Definition FP_is_reflexive := reflexive task_priority.
Definition FP_is_irreflexive := irreflexive task_priority.
Definition FP_is_transitive := transitive task_priority.
Section Antisymmetry.
Variable ts: seq Task.
Definition FP_is_total_over_task_set :=
total_over_list task_priority ts.
Definition FP_is_antisymmetric_over_task_set :=
antisymmetric_over_list task_priority ts.
End Antisymmetry.
End PropertiesFP.
Section PropertiesJLFP.
Context {Task: eqType}.
Context {Job: eqType}.
Variable job_task: Job → Task.
Variable job_arrival: Job → time.
Variable arr_seq: arrival_sequence Job.
Variable job_priority: JLFP_policy Job.
Definition JLFP_is_reflexive := reflexive job_priority.
Definition JLFP_is_irreflexive := irreflexive job_priority.
Definition JLFP_is_transitive := transitive job_priority.
Definition JLFP_is_total :=
∀ j1 j2,
arrives_in arr_seq j1 →
arrives_in arr_seq j2 →
job_priority j1 j2 || job_priority j2 j1.
Definition JLFP_respects_sequential_jobs :=
∀ j1 j2,
job_task j1 == job_task j2 →
job_arrival j1 ≤ job_arrival j2 →
job_priority j1 j2.
End PropertiesJLFP.
Section PropertiesJLDP.
Context {Job: eqType}.
Variable arr_seq: arrival_sequence Job.
Variable job_priority: JLDP_policy Job.
Definition JLDP_is_reflexive :=
∀ t, reflexive (job_priority t).
Definition JLDP_is_irreflexive :=
∀ t, irreflexive (job_priority t).
Definition JLDP_is_transitive :=
∀ t, transitive (job_priority t).
Definition JLDP_is_total :=
∀ j1 j2 t,
arrives_in arr_seq j1 →
arrives_in arr_seq j2 →
job_priority t j1 j2 || job_priority t j2 j1.
End PropertiesJLDP.
Section KnownFPPolicies.
Context {Job: eqType}.
Context {Task: eqType}.
Variable task_period: Task → time.
Variable task_deadline: Task → time.
Variable job_arrival: Job → time.
Variable job_task: Job → Task.
Definition RM (tsk1 tsk2: Task) :=
task_period tsk1 ≤ task_period tsk2.
Definition DM (tsk1 tsk2: Task) :=
task_deadline tsk1 ≤ task_deadline tsk2.
Section Properties.
Lemma RM_is_reflexive : FP_is_reflexive RM.
Proof.
unfold FP_is_reflexive, reflexive, RM.
by intros tsk; apply leqnn.
Qed.
Lemma RM_is_transitive : FP_is_transitive RM.
Proof.
unfold FP_is_transitive, transitive, RM.
by intros y x z; apply leq_trans.
Qed.
Lemma DM_is_reflexive : FP_is_reflexive DM.
Proof.
unfold FP_is_reflexive, reflexive, DM.
by intros tsk; apply leqnn.
Qed.
Lemma DM_is_transitive : FP_is_transitive DM.
Proof.
unfold FP_is_transitive, transitive, DM.
by intros y x z; apply leq_trans.
Qed.
Lemma any_reflexive_FP_respects_sequential_jobs:
∀ job_priority: FP_policy Task,
FP_is_reflexive job_priority →
JLFP_respects_sequential_jobs
job_task job_arrival (FP_to_JLFP job_task job_priority).
Proof.
intros HP REFL j1 j2 TSK ARR.
move: TSK ⇒ /eqP TSK.
unfold FP_to_JLFP; rewrite TSK.
by apply REFL.
Qed.
End Properties.
End KnownFPPolicies.
Section KnownJLFPPolicies.
Section EDF.
Context {Job: eqType}.
Variable job_arrival: Job → time.
Variable job_deadline: Job → time.
Variable arr_seq: arrival_sequence Job.
Definition EDF (j1 j2: Job) :=
job_arrival j1 + job_deadline j1 ≤ job_arrival j2 + job_deadline j2.
Section Properties.
Lemma EDF_is_reflexive : JLFP_is_reflexive EDF.
Proof.
by intros j; apply leqnn.
Qed.
Lemma EDF_is_transitive : JLFP_is_transitive EDF.
Proof.
by intros y x z; apply leq_trans.
Qed.
Lemma EDF_is_total : JLFP_is_total arr_seq EDF.
Proof.
unfold EDF; intros x y ARRx ARRy.
case (leqP (job_arrival x + job_deadline x)
(job_arrival y + job_deadline y));
[by rewrite orTb | by move/ltnW ⇒ ->].
Qed.
End Properties.
End EDF.
Section EDFwithTasks.
Context {Task: eqType}.
Variable task_deadline: Task → time.
Context {Job: eqType}.
Variable job_arrival: Job → time.
Variable job_task: Job → Task.
Definition job_relative_dealine (j: Job) := task_deadline (job_task j).
Lemma EDF_respects_sequential_jobs:
JLFP_respects_sequential_jobs
job_task job_arrival (EDF job_arrival job_relative_dealine).
Proof.
intros j1 j2 TSK ARR.
move: TSK ⇒ /eqP TSK.
unfold EDF, job_relative_dealine; rewrite TSK.
by rewrite leq_add2r.
Qed.
End EDFwithTasks.
End KnownJLFPPolicies.
Section PossibleInterferingTasks.
Context {sporadic_task: eqType}.
Variable task_cost: sporadic_task → time.
Variable task_period: sporadic_task → time.
Variable task_deadline: sporadic_task → time.
Section FP.
Variable higher_eq_priority: FP_policy sporadic_task.
Variable tsk: sporadic_task.
Variable tsk_other: sporadic_task.
Definition higher_priority_task :=
higher_eq_priority tsk_other tsk &&
(tsk_other != tsk).
End FP.
Section JLFP.
Variable tsk: sporadic_task.
Variable tsk_other: sporadic_task.
Definition different_task := tsk_other != tsk.
End JLFP.
End PossibleInterferingTasks.
End Priority.
Require Import prosa.classic.model.arrival.basic.task prosa.classic.model.arrival.basic.job prosa.classic.model.arrival.basic.arrival_sequence.
From mathcomp Require Import ssreflect ssrbool eqtype ssrnat seq.
Module Priority.
Import SporadicTaskset ArrivalSequence.
Section PriorityDefs.
Variable Task: eqType.
Variable Job: eqType.
Definition FP_policy := rel Task.
Definition JLFP_policy := rel Job.
Definition JLDP_policy := time → rel Job.
End PriorityDefs.
Section Generalization.
Context {Task: eqType}.
Context {Job: eqType}.
Variable job_task: Job → Task.
Definition FP_to_JLFP (task_hp: FP_policy Task) :=
fun (jhigh jlow: Job) ⇒
task_hp (job_task jhigh) (job_task jlow).
Definition FP_to_JLDP (task_hp: FP_policy Task) :=
fun (t: time) ⇒ FP_to_JLFP task_hp.
Definition JLFP_to_JLDP (job_hp: JLFP_policy Job) :=
fun (t: time) ⇒ job_hp.
End Generalization.
Section PropertiesFP.
Context {Task: eqType}.
Context {Job: eqType}.
Variable job_task: Job → Task.
Variable task_priority: FP_policy Task.
Definition FP_is_reflexive := reflexive task_priority.
Definition FP_is_irreflexive := irreflexive task_priority.
Definition FP_is_transitive := transitive task_priority.
Section Antisymmetry.
Variable ts: seq Task.
Definition FP_is_total_over_task_set :=
total_over_list task_priority ts.
Definition FP_is_antisymmetric_over_task_set :=
antisymmetric_over_list task_priority ts.
End Antisymmetry.
End PropertiesFP.
Section PropertiesJLFP.
Context {Task: eqType}.
Context {Job: eqType}.
Variable job_task: Job → Task.
Variable job_arrival: Job → time.
Variable arr_seq: arrival_sequence Job.
Variable job_priority: JLFP_policy Job.
Definition JLFP_is_reflexive := reflexive job_priority.
Definition JLFP_is_irreflexive := irreflexive job_priority.
Definition JLFP_is_transitive := transitive job_priority.
Definition JLFP_is_total :=
∀ j1 j2,
arrives_in arr_seq j1 →
arrives_in arr_seq j2 →
job_priority j1 j2 || job_priority j2 j1.
Definition JLFP_respects_sequential_jobs :=
∀ j1 j2,
job_task j1 == job_task j2 →
job_arrival j1 ≤ job_arrival j2 →
job_priority j1 j2.
End PropertiesJLFP.
Section PropertiesJLDP.
Context {Job: eqType}.
Variable arr_seq: arrival_sequence Job.
Variable job_priority: JLDP_policy Job.
Definition JLDP_is_reflexive :=
∀ t, reflexive (job_priority t).
Definition JLDP_is_irreflexive :=
∀ t, irreflexive (job_priority t).
Definition JLDP_is_transitive :=
∀ t, transitive (job_priority t).
Definition JLDP_is_total :=
∀ j1 j2 t,
arrives_in arr_seq j1 →
arrives_in arr_seq j2 →
job_priority t j1 j2 || job_priority t j2 j1.
End PropertiesJLDP.
Section KnownFPPolicies.
Context {Job: eqType}.
Context {Task: eqType}.
Variable task_period: Task → time.
Variable task_deadline: Task → time.
Variable job_arrival: Job → time.
Variable job_task: Job → Task.
Definition RM (tsk1 tsk2: Task) :=
task_period tsk1 ≤ task_period tsk2.
Definition DM (tsk1 tsk2: Task) :=
task_deadline tsk1 ≤ task_deadline tsk2.
Section Properties.
Lemma RM_is_reflexive : FP_is_reflexive RM.
Proof.
unfold FP_is_reflexive, reflexive, RM.
by intros tsk; apply leqnn.
Qed.
Lemma RM_is_transitive : FP_is_transitive RM.
Proof.
unfold FP_is_transitive, transitive, RM.
by intros y x z; apply leq_trans.
Qed.
Lemma DM_is_reflexive : FP_is_reflexive DM.
Proof.
unfold FP_is_reflexive, reflexive, DM.
by intros tsk; apply leqnn.
Qed.
Lemma DM_is_transitive : FP_is_transitive DM.
Proof.
unfold FP_is_transitive, transitive, DM.
by intros y x z; apply leq_trans.
Qed.
Lemma any_reflexive_FP_respects_sequential_jobs:
∀ job_priority: FP_policy Task,
FP_is_reflexive job_priority →
JLFP_respects_sequential_jobs
job_task job_arrival (FP_to_JLFP job_task job_priority).
Proof.
intros HP REFL j1 j2 TSK ARR.
move: TSK ⇒ /eqP TSK.
unfold FP_to_JLFP; rewrite TSK.
by apply REFL.
Qed.
End Properties.
End KnownFPPolicies.
Section KnownJLFPPolicies.
Section EDF.
Context {Job: eqType}.
Variable job_arrival: Job → time.
Variable job_deadline: Job → time.
Variable arr_seq: arrival_sequence Job.
Definition EDF (j1 j2: Job) :=
job_arrival j1 + job_deadline j1 ≤ job_arrival j2 + job_deadline j2.
Section Properties.
Lemma EDF_is_reflexive : JLFP_is_reflexive EDF.
Proof.
by intros j; apply leqnn.
Qed.
Lemma EDF_is_transitive : JLFP_is_transitive EDF.
Proof.
by intros y x z; apply leq_trans.
Qed.
Lemma EDF_is_total : JLFP_is_total arr_seq EDF.
Proof.
unfold EDF; intros x y ARRx ARRy.
case (leqP (job_arrival x + job_deadline x)
(job_arrival y + job_deadline y));
[by rewrite orTb | by move/ltnW ⇒ ->].
Qed.
End Properties.
End EDF.
Section EDFwithTasks.
Context {Task: eqType}.
Variable task_deadline: Task → time.
Context {Job: eqType}.
Variable job_arrival: Job → time.
Variable job_task: Job → Task.
Definition job_relative_dealine (j: Job) := task_deadline (job_task j).
Lemma EDF_respects_sequential_jobs:
JLFP_respects_sequential_jobs
job_task job_arrival (EDF job_arrival job_relative_dealine).
Proof.
intros j1 j2 TSK ARR.
move: TSK ⇒ /eqP TSK.
unfold EDF, job_relative_dealine; rewrite TSK.
by rewrite leq_add2r.
Qed.
End EDFwithTasks.
End KnownJLFPPolicies.
Section PossibleInterferingTasks.
Context {sporadic_task: eqType}.
Variable task_cost: sporadic_task → time.
Variable task_period: sporadic_task → time.
Variable task_deadline: sporadic_task → time.
Section FP.
Variable higher_eq_priority: FP_policy sporadic_task.
Variable tsk: sporadic_task.
Variable tsk_other: sporadic_task.
Definition higher_priority_task :=
higher_eq_priority tsk_other tsk &&
(tsk_other != tsk).
End FP.
Section JLFP.
Variable tsk: sporadic_task.
Variable tsk_other: sporadic_task.
Definition different_task := tsk_other != tsk.
End JLFP.
End PossibleInterferingTasks.
End Priority.