diff --git a/model/schedule/uni/limited/valid_job_task.v b/model/schedule/uni/limited/valid_job_task.v new file mode 100644 index 0000000000000000000000000000000000000000..a0635e439608b9b7c19e88969d5be2afbb86a246 --- /dev/null +++ b/model/schedule/uni/limited/valid_job_task.v @@ -0,0 +1,162 @@ +Require Import rt.util.all. +Require Import rt.model.arrival.basic.job. +Require Import rt.model.schedule.uni.schedule. + +From mathcomp Require Import ssreflect ssrbool eqtype ssrnat seq path fintype bigop. + +(* In this file, we define properties of segmented jobs and tasks. *) +Module ValidSegmentedTaskJob. + + Import Job UniprocessorSchedule. + + Section ValidSegmentedJob. + + Context {Job: eqType}. + Variable job_max: Job -> time. + Variable job_last: Job -> time. + Variable job_cost: Job -> time. + + Variable j: Job. + + (* The maximal length of a nonpreemptive segment of job j must be positive. *) + Definition job_max_segment_positive := job_max j > 0. + + (* The maximal length of a nonpreemptive segment of job j + cannot be larger than the job cost. *) + Definition job_max_segment_le_job_cost := job_max j <= job_cost j. + + (* The length of last nonpreemptive segment of job j must be positive. *) + Definition job_last_segment_positive := job_last j > 0. + + (* The length of the last nonpreemptive segment of job j + cannot be larger than the length of the maximal j segment. *) + Definition job_last_segment_le_job_max := job_last j <= job_max j. + + Definition valid_segmented_job := + job_cost_positive job_cost j /\ + job_max_segment_positive /\ + job_max_segment_le_job_cost /\ + job_last_segment_positive /\ + job_last_segment_le_job_max. + + (* In this section we prove a simple lemma about properties of a valid segmented job. *) + Section BasicLemma. + + (* We assume that job j is a valid segmented job. *) + Hypothesis H_valid_segmented_job: valid_segmented_job. + + (* Then the length of the last job segment is no greater than job cost. *) + Lemma job_last_segment_le_job_cost: + job_last j <= job_cost j. + Proof. + move: H_valid_segmented_job => [_ [_ [NEQ1 [_ NEQ2]]]]. + by apply leq_trans with (job_max j). + Qed. + + End BasicLemma. + + End ValidSegmentedJob. + + Section ValidSegmentedTask. + + Context {Task: eqType}. + Variable task_max: Task -> time. + Variable task_last: Task -> time. + Variable task_cost: Task -> time. + + Variable tsk: Task. + + (* The maximal length of a nonpreemptive segment of task tsk must be positive. *) + Definition task_max_segment_positive := task_max tsk > 0. + + (* The maximal length of a nonpreemptive segment of task tsk + cannot be larger than the task cost. *) + Definition task_max_segment_le_job_cost := task_max tsk <= task_cost tsk. + + (* The length of the last nonpreemptive segment of task tsk must be positive. *) + Definition task_last_segment_positive := task_last tsk > 0. + + (* The length of the last nonpreemptive segment of task tsk + cannot be larger than the length of the maximal tsk segment. *) + Definition task_last_segment_le_job_max := task_last tsk <= task_max tsk. + + Definition valid_segmented_task := + task_max_segment_positive /\ + task_max_segment_le_job_cost /\ + task_last_segment_positive /\ + task_last_segment_le_job_max. + + (* In this section we prove a simple lemma about properties of a valid segmented task. *) + Section BasicLemma. + + (* We assume that task tsk is a valid segmented task. *) + Hypothesis H_valid_segmented_task: valid_segmented_task. + + (* Then the length of the last job segment is no greater than job cost. *) + Lemma task_last_segment_le_task_cost: + task_last tsk <= task_cost tsk. + Proof. + move: H_valid_segmented_task => [_ [NEQ1 [_ NEQ2]]]. + by apply leq_trans with (task_max tsk). + Qed. + + End BasicLemma. + + End ValidSegmentedTask. + + Section ValidSegmentedTaskSet. + + Context {Task: eqType}. + Variable task_max: Task -> time. + Variable task_last: Task -> time. + Variable task_cost: Task -> time. + + Let is_valid_task := + valid_segmented_task task_max task_last task_cost. + + Variable ts: seq Task. + + (* A valid taskset only contains valid tasks. *) + Definition valid_segmented_taskset := + forall tsk, tsk \in ts -> is_valid_task tsk. + + End ValidSegmentedTaskSet. + + Section ValidSegmentedTaskJob. + + Context {Job: eqType}. + Variable job_max: Job -> time. + Variable job_last: Job -> time. + Variable job_cost: Job -> time. + + Context {Task: eqType}. + Variable task_max: Task -> time. + Variable task_last: Task -> time. + Variable task_cost: Task -> time. + Variable job_task: Job -> Task. + + Variable j: Job. + + (* The maximal length of a nonpreemptive segment of the job + cannot be larger than the maximal length of the nonpreemptive segment of the task. *) + Definition job_max_le_task_max := job_max j <= task_max (job_task j). + + (* The length of the last nonpreemptive segment of the job + cannot be larger than the last nonpreemptive segment of the task. *) + Definition job_last_le_task_last := job_last j <= task_last (job_task j). + + (* Also, the length of the complement of the last nonpreemptive segment of the job + cannot be larger than the complement of the last nonpreemptive segment of the task. *) + Definition job_colast_le_task_colast := + job_cost j - job_last j <= task_cost (job_task j) - task_last (job_task j). + + Definition valid_segmented_task_job := + valid_segmented_job job_max job_last job_cost j /\ + job_max_le_task_max /\ + job_last_le_task_last /\ + job_cost_le_task_cost task_cost job_cost job_task j /\ + job_colast_le_task_colast. + + End ValidSegmentedTaskJob. + +End ValidSegmentedTaskJob. \ No newline at end of file