Library rt.restructuring.model.processor.multiprocessor


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

Welcome to Coq 8.10.1 (October 2019)

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


From mathcomp Require Export fintype.
From rt.restructuring.behavior Require Export all.

Section Schedule.

  Variable Job: JobType.
  Variable processor_state: Type.
  Context `{ProcessorState Job processor_state}.

  Definition processor (num_cpus: nat) := 'I_num_cpus.

  Variable num_cpus : nat.

  Definition identical_state := processor num_cpus processor_state.

  Global Program Instance multiproc_state : ProcessorState Job (identical_state) :=
    {
      scheduled_on j s (cpu : processor num_cpus) := scheduled_in j (s cpu);
      service_in j s := \sum_(cpu < num_cpus) service_in j (s cpu)
    }.
  Next Obligation.

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

1 subgoal (ID 72)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  j : Job
  s : identical_state
  H0 : ~~
       ~~
       FiniteQuant.quant0b (T:=ordinal_finType num_cpus)
         (fun c : 'I_num_cpus =>
          FiniteQuant.ex (T:=ordinal_finType num_cpus)
            (, scheduled_in j (s c)) c)
  ============================
  \sum_(cpu < num_cpus) service_in j (s cpu) = 0

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


    move: j s H0.

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

1 subgoal (ID 83)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  ============================
  forall (j : Job) (s : identical_state),
  ~~
  ~~
  FiniteQuant.quant0b (T:=ordinal_finType num_cpus)
    (fun c : 'I_num_cpus =>
     FiniteQuant.ex (T:=ordinal_finType num_cpus) (, scheduled_in j (s c)) c) ->
  \sum_(cpu < num_cpus) service_in j (s cpu) = 0

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


    movej s /existsP Hsched.

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

1 subgoal (ID 123)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  j : Job
  s : identical_state
  Hsched : ~ (exists x : ordinal_finType num_cpus, scheduled_in j (s x))
  ============================
  \sum_(cpu < num_cpus) service_in j (s cpu) = 0

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


    apply/eqP.

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

1 focused subgoal
(shelved: 1) (ID 178)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  j : Job
  s : identical_state
  Hsched : ~ (exists x : ordinal_finType num_cpus, scheduled_in j (s x))
  ============================
  \sum_(cpu < num_cpus) service_in j (s cpu) == 0

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


    rewrite sum_nat_eq0.

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

1 subgoal (ID 184)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  j : Job
  s : identical_state
  Hsched : ~ (exists x : ordinal_finType num_cpus, scheduled_in j (s x))
  ============================
  [forall (i | true), service_in j (s i) == 0]

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


    apply/forallP=>/= c.

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

1 subgoal (ID 210)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  j : Job
  s : identical_state
  Hsched : ~ (exists x : ordinal_finType num_cpus, scheduled_in j (s x))
  c : 'I_num_cpus
  ============================
  service_in j (s c) == 0

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


    rewrite service_implies_scheduled//.

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

1 subgoal (ID 222)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  j : Job
  s : identical_state
  Hsched : ~ (exists x : ordinal_finType num_cpus, scheduled_in j (s x))
  c : 'I_num_cpus
  ============================
  ~~ scheduled_in j (s c)

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


    case: (boolP (scheduled_in _ _))=>//= Habs.

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

1 subgoal (ID 321)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  j : Job
  s : identical_state
  Hsched : ~ (exists x : ordinal_finType num_cpus, scheduled_in j (s x))
  c : 'I_num_cpus
  Habs : scheduled_in j (s c)
  ============================
  false

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


    exfalso; apply: Hsched.

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

1 subgoal (ID 328)
  
  Job : JobType
  processor_state : Type
  H : ProcessorState Job processor_state
  num_cpus : nat
  j : Job
  s : identical_state
  c : 'I_num_cpus
  Habs : scheduled_in j (s c)
  ============================
  exists x : ordinal_finType num_cpus, scheduled_in j (s x)

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


      by c.

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

No more subgoals.

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


  Defined.
End Schedule.