Library rt.restructuring.analysis.basic_facts.preemption.job.limited


(* ----------------------------------[ coqtop ]---------------------------------

Welcome to Coq 8.10.1 (October 2019)

----------------------------------------------------------------------------- *)


From rt.util Require Import all.
From rt.restructuring.behavior Require Import all.
From rt.restructuring.analysis.basic_facts Require Import all.
From rt.restructuring.model Require Import job task.
From rt.restructuring.model.preemption Require Import
     valid_model valid_schedule job.parameters task.parameters
     rtc_threshold.valid_rtct job.instance.limited.

Platform for Models with Limited Preemptions

In this section, we prove that instantiation of predicate [job_preemptable] to the model with limited preemptions indeed defines a valid preemption model.
Consider any type of tasks ...
  Context {Task : TaskType}.
  Context `{TaskCost Task}.

... and any type of jobs associated with these tasks.
  Context {Job : JobType}.
  Context `{JobTask Job Task}.
  Context `{JobArrival Job}.
  Context `{JobCost Job}.

In addition, assume the existence of a function that maps a job to the sequence of its preemption points.
  Context `{JobPreemptionPoints Job}.

Consider any arrival sequence.
  Variable arr_seq : arrival_sequence Job.

Next, consider any limited ideal uniprocessor schedule of this arrival sequence ...
...where jobs do not execute after their completion.
Next, we assume that preemption points are defined by the job-level model with limited preemptions.
First, we prove a few auxiliary lemmas.
  Section AuxiliaryLemmas.

Consider a job j.
    Variable j : Job.
    Hypothesis H_j_arrives : arrives_in arr_seq j.

Recall that 0 is a preemption point.
    Remark zero_in_preemption_points: 0 \in job_preemption_points j.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 49)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  0 \in job_preemption_points j

----------------------------------------------------------------------------- *)


    Proof. by apply H_valid_limited_preemptions_job_model.
(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


Qed.

Using the fact that [job_preemption_points] is a non-decreasing sequence, we prove that the first element of [job_preemption_points] is 0.
    Lemma zero_is_first_element: first0 (job_preemption_points j) = 0.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 54)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  first0 (job_preemption_points j) = 0

----------------------------------------------------------------------------- *)


    Proof.
      have F := zero_in_preemption_points.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 59)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  F : 0 \in job_preemption_points j
  ============================
  first0 (job_preemption_points j) = 0

----------------------------------------------------------------------------- *)


      destruct H_valid_limited_preemptions_job_model as [_ [_ C]]; specialize (C j H_j_arrives).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 73)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  F : 0 \in job_preemption_points j
  C : nondecreasing_sequence (job_preemption_points j)
  ============================
  first0 (job_preemption_points j) = 0

----------------------------------------------------------------------------- *)


        by apply nondec_seq_zero_first.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

We prove that the list of preemption points is not empty.
    Lemma list_of_preemption_point_is_not_empty:
      0 < size (job_preemption_points j).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 58)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  0 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


    Proof.
      move: H_valid_limited_preemptions_job_model ⇒ [BEG [END _]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 81)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  0 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      apply/negPn/negP; rewrite -eqn0Ngt; intros CONTR; rewrite size_eq0 in CONTR.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 212)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  CONTR : job_preemption_points j == [::]
  ============================
  False

----------------------------------------------------------------------------- *)


      specialize (BEG j H_j_arrives).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 214)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : 0 \in job_preemption_points j
  END : end_of_execution_in_preemption_points arr_seq
  CONTR : job_preemption_points j == [::]
  ============================
  False

----------------------------------------------------------------------------- *)


        by rewrite /beginning_of_execution_in_preemption_points (eqbool_to_eqprop CONTR) in BEG.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

Next, we prove that the cost of a job is a preemption point.
    Lemma job_cost_in_nonpreemptive_points: job_cost j \in job_preemption_points j.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 67)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  job_cost j \in job_preemption_points j

----------------------------------------------------------------------------- *)


    Proof.
      move: H_valid_limited_preemptions_job_model ⇒ [BEG [END _]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 90)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  job_cost j \in job_preemption_points j

----------------------------------------------------------------------------- *)


      move: (END _ H_j_arrives) ⇒ EQ.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 94)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  EQ : last0 (job_preemption_points j) = job_cost j
  ============================
  job_cost j \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite -EQ; clear EQ.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 97)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  last0 (job_preemption_points j) \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite /last0 -nth_last.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 103)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  nth 0 (job_preemption_points j) (size (job_preemption_points j)).-1
    \in job_preemption_points j

----------------------------------------------------------------------------- *)


      apply/(nthP 0).

(* ----------------------------------[ coqtop ]---------------------------------

1 focused subgoal
(shelved: 1) (ID 131)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  exists2 i : nat,
    i < size (job_preemption_points j) &
    nth 0 (job_preemption_points j) i =
    nth 0 (job_preemption_points j) (size (job_preemption_points j)).-1

----------------------------------------------------------------------------- *)


       ((size (job_preemption_points j)).-1); last by done.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 136)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  (size (job_preemption_points j)).-1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      rewrite -(leq_add2r 1) !addn1 prednK //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 153)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  0 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


        by apply list_of_preemption_point_is_not_empty.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

As a corollary, we prove that the sequence of nonpreemptive points of a job with poisitive cost contains at least 2 points.
    Corollary number_of_preemption_points_at_least_two:
      job_cost_positive j
      2 size (job_preemption_points j).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 73)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  job_cost_positive j -> 1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


    Proof.
      intros POS.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 74)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  ============================
  1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      move: H_valid_limited_preemptions_job_model ⇒ [BEG [END _]].
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 97)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      have EQ: 2 = size [::0; job_cost j]; first by done.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 108)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  EQ : 2 = size [:: 0; job_cost j]
  ============================
  1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      rewrite EQ; clear EQ.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 111)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  size [:: 0; job_cost j] <= size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      apply subseq_leq_size.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 113)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  uniq [:: 0; job_cost j]

subgoal 2 (ID 114) is:
 forall x : nat_eqType,
 x \in [:: 0; job_cost j] -> x \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite !cons_uniq.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 124)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  [&& 0 \notin [:: job_cost j], job_cost j \notin [::] & uniq [::]]

subgoal 2 (ID 114) is:
 forall x : nat_eqType,
 x \in [:: 0; job_cost j] -> x \in job_preemption_points j

----------------------------------------------------------------------------- *)


      {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 124)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  [&& 0 \notin [:: job_cost j], job_cost j \notin [::] & uniq [::]]

----------------------------------------------------------------------------- *)


apply/andP; split.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 153)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  0 \notin [:: job_cost j]

subgoal 2 (ID 154) is:
 (job_cost j \notin [::]) && uniq [::]

----------------------------------------------------------------------------- *)


        rewrite in_cons negb_or; apply/andP; split; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 190)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  0 != job_cost j

subgoal 2 (ID 154) is:
 (job_cost j \notin [::]) && uniq [::]

----------------------------------------------------------------------------- *)


        rewrite neq_ltn; apply/orP; left; eauto 2.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 154)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  (job_cost j \notin [::]) && uniq [::]

----------------------------------------------------------------------------- *)


        apply/andP; split; by done.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 114)

subgoal 1 (ID 114) is:
 forall x : nat_eqType,
 x \in [:: 0; job_cost j] -> x \in job_preemption_points j

----------------------------------------------------------------------------- *)


}
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 114)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  forall x : nat_eqType,
  x \in [:: 0; job_cost j] -> x \in job_preemption_points j

----------------------------------------------------------------------------- *)



      intros t EQ; move: EQ; rewrite !in_cons.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 269)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  t : nat_eqType
  ============================
  [|| t == 0, t == job_cost j | t \in [::]] -> t \in job_preemption_points j

----------------------------------------------------------------------------- *)


      move ⇒ /orP [/eqP EQ| /orP [/eqP EQ|EQ]]; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 421)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  t : nat_eqType
  EQ : t = 0
  ============================
  t \in job_preemption_points j

subgoal 2 (ID 422) is:
 t \in job_preemption_points j

----------------------------------------------------------------------------- *)


      - by rewrite EQ; apply zero_in_preemption_points.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 422)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  t : nat_eqType
  EQ : t = job_cost j
  ============================
  t \in job_preemption_points j

----------------------------------------------------------------------------- *)


      - by rewrite EQ; apply job_cost_in_nonpreemptive_points.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

Next we prove that "antidensity" property (from preemption.util file) holds for [job_preemption_point j].
    Lemma antidensity_of_preemption_points:
       (ρ : work),
        ρ job_cost j
        ~~ (ρ \in job_preemption_points j)
        first0 (job_preemption_points j) ρ < last0 (job_preemption_points j).
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 86)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  forall ρ : work,
  ρ <= job_cost j ->
  ρ \notin job_preemption_points j ->
  first0 (job_preemption_points j) <= ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


    Proof.
      intros ρ LE NotIN.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 89)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  ============================
  first0 (job_preemption_points j) <= ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


      move: H_valid_limited_preemptions_job_model ⇒ [BEG [END NDEC]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 111)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  first0 (job_preemption_points j) <= ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


      apply/andP; split.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 137)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  first0 (job_preemption_points j) <= ρ

subgoal 2 (ID 138) is:
 ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


      - by rewrite zero_is_first_element.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 138)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


      - rewrite END; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 146)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  ρ < job_cost j

----------------------------------------------------------------------------- *)


        rewrite ltn_neqAle; apply/andP; split; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 177)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  ρ != job_cost j

----------------------------------------------------------------------------- *)


        apply/negP; intros CONTR; move: CONTR ⇒ /eqP CONTR.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 236)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  CONTR : ρ = job_cost j
  ============================
  False

----------------------------------------------------------------------------- *)


        rewrite CONTR in NotIN.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 266)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  CONTR : ρ = job_cost j
  NotIN : job_cost j \notin job_preemption_points j
  ============================
  False

----------------------------------------------------------------------------- *)


        move: NotIN ⇒ /negP NIN; apply: NIN.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 300)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  CONTR : ρ = job_cost j
  ============================
  job_cost j \in job_preemption_points j

----------------------------------------------------------------------------- *)


          by apply job_cost_in_nonpreemptive_points.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

We also prove that any work that doesn't belong to preemption points of job j is placed strictly between two neighboring preemption points.
    Lemma work_belongs_to_some_nonpreemptive_segment:
       (ρ : work),
        ρ job_cost j
        ~~ (ρ \in job_preemption_points j)
         n,
          n.+1 < size (job_preemption_points j)
          nth 0 (job_preemption_points j) n < ρ < nth 0 (job_preemption_points j) n.+1.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 106)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  forall ρ : work,
  ρ <= job_cost j ->
  ρ \notin job_preemption_points j ->
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


    Proof.
      intros ρ LE NotIN.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 109)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  ============================
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


      case: (posnP (job_cost j)) ⇒ [ZERO|POS].

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 132)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  ZERO : job_cost j = 0
  ============================
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

subgoal 2 (ID 133) is:
 exists n : nat,
   n.+1 < size (job_preemption_points j) /\
   nth 0 (job_preemption_points j) n < ρ <
   nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


      {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 132)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  ZERO : job_cost j = 0
  ============================
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


exfalso; move: NotIN ⇒ /negP NIN; apply: NIN.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 168)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  ZERO : job_cost j = 0
  ============================
  ρ \in job_preemption_points j

----------------------------------------------------------------------------- *)


        move: LE.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 170)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  ZERO : job_cost j = 0
  ============================
  ρ <= job_cost j -> ρ \in job_preemption_points j

----------------------------------------------------------------------------- *)


rewrite ZERO leqn0; move ⇒ /eqP →.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 212)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  ZERO : job_cost j = 0
  ============================
  0 \in job_preemption_points j

----------------------------------------------------------------------------- *)


          by apply zero_in_preemption_points.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 133)

subgoal 1 (ID 133) is:
 exists n : nat,
   n.+1 < size (job_preemption_points j) /\
   nth 0 (job_preemption_points j) n < ρ <
   nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 133)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  ============================
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


      move: (belonging_to_segment_of_seq_is_total
               (job_preemption_points j) ρ (number_of_preemption_points_at_least_two POS)
               (antidensity_of_preemption_points _ LE NotIN)) ⇒ [n [SIZE2 /andP [N1 N2]]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 277)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N1 : nth 0 (job_preemption_points j) n <= ρ
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  exists n0 : nat,
    n0.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n0 < ρ <
    nth 0 (job_preemption_points j) n0.+1

----------------------------------------------------------------------------- *)


       n; split; first by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 282)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N1 : nth 0 (job_preemption_points j) n <= ρ
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  nth 0 (job_preemption_points j) n < ρ <
  nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


      apply/andP; split; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 308)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N1 : nth 0 (job_preemption_points j) n <= ρ
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  nth 0 (job_preemption_points j) n < ρ

----------------------------------------------------------------------------- *)


      move: N1; rewrite leq_eqVlt; move ⇒ /orP [/eqP EQ | G]; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 390)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  EQ : nth 0 (job_preemption_points j) n = ρ
  ============================
  nth 0 (job_preemption_points j) n < ρ

----------------------------------------------------------------------------- *)


      exfalso.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 392)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  EQ : nth 0 (job_preemption_points j) n = ρ
  ============================
  False

----------------------------------------------------------------------------- *)


      move: NotIN ⇒ /negP CONTR; apply: CONTR.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 426)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  EQ : nth 0 (job_preemption_points j) n = ρ
  ============================
  ρ \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite -EQ; clear EQ.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 429)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  nth 0 (job_preemption_points j) n \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite mem_nth //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 437)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  n < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


        by apply ltnW.
(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

Recall that file [job.parameters] also defines notion of preemption poins. And note that [job.parameters.job_preemption_points] cannot have a duplicating preemption points. Therefore, we need additional lemmas to relate [job.parameters.job_preemption_points] and [limited.job_preemption_points]].
First we show that the length of the last non-preemptive segment of [job.parameters.job_preemption_points] is equal to the length of the last non-empty non-preemptive segment of [limited.job_preemption_points].
    Lemma job_parameters_last_np_to_job_limited:
        last0 (distances (parameters.job_preemption_points j)) =
        last0 (filter (fun x ⇒ 0 < x) (distances (job_preemption_points j))).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 117)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  last0 (distances (parameters.job_preemption_points j)) =
  last0 [seq x <- distances (job_preemption_points j) | 0 < x]

----------------------------------------------------------------------------- *)


    Proof.
      destruct H_valid_limited_preemptions_job_model as [A1 [A2 A3]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 127)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  last0 (distances (parameters.job_preemption_points j)) =
  last0 [seq x <- distances (job_preemption_points j) | 0 < x]

----------------------------------------------------------------------------- *)


      unfold parameters.job_preemption_points, job_preemptable, limited_preemptions_model.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 129)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  last0
    (distances
       [seq ρ <- range 0 (job_cost j) | ρ \in job_preemption_points j]) =
  last0 [seq x <- distances (job_preemption_points j) | 0 < x]

----------------------------------------------------------------------------- *)


      intros; rewrite distances_iota_filtered; eauto.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 136)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  forall x : nat, x \in job_preemption_points j -> x <= job_cost j

----------------------------------------------------------------------------- *)


      rewrite -A2 //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 5201)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  forall x : nat,
  x \in job_preemption_points j -> x <= last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


        by intros; apply last_is_max_in_nondecreasing_seq; eauto 2.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

Next we show that the length of the max non-preemptive segment of [job.parameters.job_preemption_points] is equal to the length of the max non-preemptive segment of [limited.job_preemption_points].
    Lemma job_parameters_max_np_to_job_limited:
      max0 (distances (parameters.job_preemption_points j)) =
      max0 (distances (job_preemption_points j)).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 126)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  max0 (distances (parameters.job_preemption_points j)) =
  max0 (distances (job_preemption_points j))

----------------------------------------------------------------------------- *)


    Proof.
      destruct H_valid_limited_preemptions_job_model as [A1 [A2 A3]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 136)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  max0 (distances (parameters.job_preemption_points j)) =
  max0 (distances (job_preemption_points j))

----------------------------------------------------------------------------- *)


      unfold parameters.job_preemption_points, job_preemptable, limited_preemptions_model.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 138)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  max0
    (distances
       [seq ρ <- range 0 (job_cost j) | ρ \in job_preemption_points j]) =
  max0 (distances (job_preemption_points j))

----------------------------------------------------------------------------- *)


      intros; rewrite distances_iota_filtered; eauto 2.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 144)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  max0 [seq x <- distances (job_preemption_points j) | 0 < x] =
  max0 (distances (job_preemption_points j))

subgoal 2 (ID 145) is:
 forall x : nat, x \in job_preemption_points j -> x <= job_cost j

----------------------------------------------------------------------------- *)


      rewrite max0_rem0 //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 145)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  forall x : nat, x \in job_preemption_points j -> x <= job_cost j

----------------------------------------------------------------------------- *)


      rewrite -A2 //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 188)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  forall x : nat,
  x \in job_preemption_points j -> x <= last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


        by intros; apply last_is_max_in_nondecreasing_seq; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)



    Qed.

  End AuxiliaryLemmas.

We prove that the [fixed_preemption_point_model] function defines a valid preemption model.
  Lemma valid_fixed_preemption_points_model_lemma:
    valid_preemption_model arr_seq sched.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 48)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  ============================
  valid_preemption_model arr_seq sched

----------------------------------------------------------------------------- *)


  Proof.
    intros j ARR; repeat split.
(* ----------------------------------[ coqtop ]---------------------------------

4 subgoals (ID 53)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  job_cannot_become_nonpreemptive_before_execution j

subgoal 2 (ID 57) is:
 job_cannot_be_nonpreemptive_after_completion j
subgoal 3 (ID 61) is:
 not_preemptive_implies_scheduled sched j
subgoal 4 (ID 62) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


    {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 53)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  job_cannot_become_nonpreemptive_before_execution j

----------------------------------------------------------------------------- *)


by apply zero_in_preemption_points.
(* ----------------------------------[ coqtop ]---------------------------------

3 subgoals (ID 57)

subgoal 1 (ID 57) is:
 job_cannot_be_nonpreemptive_after_completion j
subgoal 2 (ID 61) is:
 not_preemptive_implies_scheduled sched j
subgoal 3 (ID 62) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

3 subgoals (ID 57)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  job_cannot_be_nonpreemptive_after_completion j

subgoal 2 (ID 61) is:
 not_preemptive_implies_scheduled sched j
subgoal 3 (ID 62) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


    {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 57)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  job_cannot_be_nonpreemptive_after_completion j

----------------------------------------------------------------------------- *)


by apply job_cost_in_nonpreemptive_points.
(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 61)

subgoal 1 (ID 61) is:
 not_preemptive_implies_scheduled sched j
subgoal 2 (ID 62) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 61)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  not_preemptive_implies_scheduled sched j

subgoal 2 (ID 62) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


    {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 61)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  not_preemptive_implies_scheduled sched j

----------------------------------------------------------------------------- *)


by movet NPP; apply H_valid_schedule_with_limited_preemptions.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 62)

subgoal 1 (ID 62) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 62)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


    {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 62)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


intros t NSCHED SCHED.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 80)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


      have SERV: service sched j t = service sched j t.+1.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 89)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  service sched j t = service sched j t.+1

subgoal 2 (ID 91) is:
 job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


      {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 89)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  service sched j t = service sched j t.+1

----------------------------------------------------------------------------- *)


rewrite -[service sched j t]addn0 /service /service_during; apply/eqP.
(* ----------------------------------[ coqtop ]---------------------------------

1 focused subgoal
(shelved: 1) (ID 168)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  \sum_(0 <= t0 < t) service_at sched j t0 + 0 ==
  \sum_(0 <= t0 < t.+1) service_at sched j t0

----------------------------------------------------------------------------- *)


        rewrite big_nat_recr //=.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 179)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  \sum_(0 <= t0 < t) (sched t0 == Some j) + 0 ==
  \sum_(0 <= i < t) (sched i == Some j) + (sched t == Some j)

----------------------------------------------------------------------------- *)


        rewrite eqn_add2l eq_sym.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 212)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  (sched t == Some j) == 0

----------------------------------------------------------------------------- *)


        rewrite scheduled_at_def in NSCHED.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 243)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  SCHED : scheduled_at sched j t.+1
  NSCHED : sched t != Some j
  ============================
  (sched t == Some j) == 0

----------------------------------------------------------------------------- *)


          by rewrite eqb0.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 91)

subgoal 1 (ID 91) is:
 job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 91)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  ============================
  job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


      rewrite -[job_preemptable _ _]Bool.negb_involutive.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 253)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  ============================
  ~~ ~~ job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


      apply/negP; intros CONTR.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 275)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  CONTR : ~~ job_preemptable j (service sched j t.+1)
  ============================
  False

----------------------------------------------------------------------------- *)


      move: NSCHED ⇒ /negP NSCHED; apply: NSCHED.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 309)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  CONTR : ~~ job_preemptable j (service sched j t.+1)
  ============================
  scheduled_at sched j t

----------------------------------------------------------------------------- *)


      apply H_valid_schedule_with_limited_preemptions; first by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 311)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (processor_state Job)
  H_valid_schedule_with_limited_preemptions : valid_schedule_with_limited_preemptions
                                                arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  CONTR : ~~ job_preemptable j (service sched j t.+1)
  ============================
  ~~ job_preemptable j (service sched j t)

----------------------------------------------------------------------------- *)


        by rewrite SERV.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    }
(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


           
  Qed.

End ModelWithLimitedPreemptions.
Hint Resolve valid_fixed_preemption_points_model_lemma : basic_facts.