Parcoursup / Calcul de l'ordre d'appel des candidats index


module IQ1
  use int.Int
  use seq.Seq
  use proofs.ordre_appel.seq_voeux.SeqVoeux
  use proofs.ordre_appel.seq_voeux.SeqVoeuxTaux
  use fr.parcoursup.whyml.ordreappel.algo.voeu_classe.VoeuClasse

  predicate iq1_loc (nb_b : int) (tx_b : Taux.t) (oak : seq_voeu) (k : int) =
  forall i. 0 <= i <= k ->
    remains_boursiers oak[..i] nb_b ->
    seq_respecte_taux_b tx_b oak[..i+1]

  predicate iq1 (nb_b : int) (tx_b : Taux.t) (oak : seq_voeu) =
    forall k. 0 <= k < length oak -> iq1_loc nb_b tx_b  oak k
end

module IQ1_Lemmas
  use int.Int
  use seq.Seq
  use proofs.ordre_appel.seq_voeux.SeqVoeux
  use proofs.ordre_appel.seq_voeux.SeqVoeuxTaux
  use fr.parcoursup.whyml.ordreappel.algo.voeu_classe.VoeuClasse

  let lemma iq1_l1 (s : seq_voeu) (total_b : int) (i : int)
    requires {[@expl:i lt |s|] 0 < i <= length s }
    requires {[@expl:remains_boursiers up to i] remains_boursiers s[..i] total_b }
    ensures { remains_boursiers s[..i-1] total_b }
  = assert { snoc s[..i-1] s[i-1] == s[..i] }

  let lemma iq1_l2a (s : seq_voeu) (v : voeu) (tx : taux) (p : voeu -> bool) (count : seq_voeu -> int)
    requires { forall s v. count (snoc s v) = if p v then count s +1 else count s }
    requires { p v }
    requires { seq_respecte_taux tx s count }
    ensures {  seq_respecte_taux tx (snoc s v) count }
  = ()

  let lemma iq1_l2a_b (tx_b : Taux.t) (s : seq_voeu) (v : voeu)
    requires { seq_respecte_taux_b tx_b s }
    requires { est_boursier v }
    ensures {  seq_respecte_taux_b tx_b (snoc s v) }
  = ()

  let lemma iq1_l2a_ds (tx_ds : Taux.t)  (s : seq_voeu) (v : voeu)
    requires { seq_respecte_taux_ds tx_ds s }
    requires { est_du_secteur v }
    ensures { seq_respecte_taux_ds tx_ds (snoc s v) }
  = ()

  let lemma iq1_l2b (s : seq_voeu) (v : voeu) (tx : taux) (total : int) (p : voeu -> bool) (count : seq_voeu -> int)
    requires { forall s v. count (snoc s v) = if p v then count s +1 else count s }
    requires { not taux_x_contraignant tx s count total }
    ensures { seq_respecte_taux tx (snoc s v) count \/ ((count s = 0) \/ not (count s < total)) }
  = ()

  let lemma iq1_l2b_b (nb_b : int) (tx_b : Taux.t) (s : seq_voeu) (v : voeu)
    requires { not taux_b_contraignant tx_b s nb_b }
    ensures { seq_respecte_taux_b tx_b (snoc s v) \/ not remains_boursiers s nb_b }
  = ()

  let lemma iq1_l2b_ds (nb_ds : int) (tx_ds : Taux.t) (s : seq_voeu) (v : voeu)
    requires { not taux_ds_contraignant tx_ds s nb_ds}
    ensures { seq_respecte_taux_ds tx_ds (snoc s v) \/ not remains_du_secteur s nb_ds }
  = ()
end

module IQ1_Snoc
  use int.Int
  use seq.Seq
  use proofs.ordre_appel.seq_voeux.SeqVoeux
  use proofs.ordre_appel.seq_voeux.SeqVoeuxTaux
  use fr.parcoursup.whyml.ordreappel.algo.voeu_classe.VoeuClasse
  use IQ1_Lemmas
  use export IQ1

  let lemma iq1_snoc (nb_b : int) (tx_b : Taux.t)  (oak : seq_voeu) (v : VoeuClasse.t)
    requires { [@expl:pre/iq1(s)] iq1 nb_b tx_b oak }
    requires { [@expl:pre/v not boursier -> tx_b non_contraignant] not est_boursier v -> not taux_b_contraignant tx_b oak nb_b }
    ensures { iq1 nb_b tx_b (snoc oak v)  }
  =
    let s = snoc oak v in
    for k = 0 to length s - 1 do
      invariant { forall j. 0 <= j < k -> iq1_loc nb_b tx_b  s j }
      if k < length s - 1 then begin
	      assert { forall i. 0 <= i <= k -> s[..i+1] == oak[..i+1] };
        assert { iq1_loc nb_b tx_b  oak k };
	      assert {  forall i. 0 <= i <= k
	             	  -> remains_boursiers s[..i] nb_b
	                -> remains_boursiers oak[..i] nb_b
		              -> seq_respecte_taux_b tx_b oak[..i+1]
 		              -> seq_respecte_taux_b tx_b s[..i+1] };
	      assert {  forall i. 0 <= i <= k
	       	        -> remains_boursiers s[..i] nb_b
 		              -> seq_respecte_taux_b tx_b s[..i+1] };
        assert { iq1_loc nb_b tx_b  s k };
      end else begin
        assert { forall i. 0 <= i < k -> s[..i+1] == oak[..i+1] };
        assert { iq1_loc nb_b tx_b  s (k-1) };
	      assert { remains_boursiers s[..k] nb_b
	               -> remains_boursiers oak nb_b
	               -> seq_respecte_taux_b tx_b oak
	               -> seq_respecte_taux_b tx_b s };
        assert { iq1_loc nb_b tx_b  s k };
      end
    done
end

(* generated on Thu Nov 21 02:04:27 UTC 2024 from rev:  *)

Generated by why3doc 1.7.2+git