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


module IQ0
  use int.Int
  use seq.Seq
  use mach.java.lang.Integer
  use proofs.lib.seq.Seq
  use proofs.ordre_appel.seq_voeux.SeqVoeux
  use fr.parcoursup.whyml.ordreappel.algo.enum_map.EnumMap
  use fr.parcoursup.whyml.ordreappel.algo.voeu_classe.VoeuClasse

  (*
   * L'ordre d'appel courant (oak) et les files d'attentes (m) contiennent
   * exactement les mêmes voeux que le groupe de classement (g)
   *)
  predicate iq0 (g : seq_voeu) (oak : seq_voeu) (m : EnumMap.t) =
    (* oak ++ m est inclus dans g *)
    seq_contains_seq g oak && enummap_in_grp m g &&
    (* g est inclus dans oak ++ m *)
    forall i. 0 <= i < length g -> seq_contains g[i] oak \/ enummap_contains m g[i]

end

module IQ0_Lemmas
  use int.Int
  use seq.Seq
  use seq.Occ
  use seq.Permut
  use mach.java.lang.Integer
  use proofs.lib.seq.Seq
  use proofs.ordre_appel.seq_voeux.SeqVoeux
  use proofs.ordre_appel.seq_voeux.SeqVoeuxDistincts
  use proofs.ordre_appel.seq_voeux.SeqVoeuxGroupe
  use fr.parcoursup.whyml.ordreappel.algo.enum_map.EnumMap
  use fr.parcoursup.whyml.ordreappel.algo.voeu_classe.VoeuClasse
  use IQ0

  let lemma iq0_m_empty (op oak : seq_voeu) (m : EnumMap.t)
    requires { length op = length oak }
    requires { seq_groupe_ok op }
    requires { all_distincts oak }
    requires { iq0 op oak m }
    requires { EnumMap.get_nb_voeux_classes m = 0 }
    ensures { permut_all op oak }
  =
    let nb_voeux = length op in
    assert { forall i. 0 <= i < nb_voeux -> occ_all oak[i] oak = 1 };
    assert { forall i. 0 <= i < nb_voeux -> occ_all op[i] op = 1 };
    assert { seq_contains_seq op oak };
    assert { seq_contains_seq oak op };
    assert { forall v. seq_contains v op -> seq_contains v oak };
    assert { forall v. not seq_contains v op -> not seq_contains v oak};
    assert { forall v. seq_contains v op ->  occ_all v op = 1 = occ_all v oak };
    assert { forall v. not seq_contains v op -> occ_all v op = 0 = occ_all v oak };

end

module IQ0_Snoc
  use int.Int
  use seq.Seq
  use mach.java.lang.Integer
  use proofs.lib.seq.Seq
  use proofs.ordre_appel.seq_voeux.SeqVoeux
  use fr.parcoursup.whyml.ordreappel.algo.enum_map.EnumMap
  use fr.parcoursup.whyml.ordreappel.algo.enum_map.EnumMap_Lemmas
  use fr.parcoursup.whyml.ordreappel.algo.voeu_classe.VoeuClasse
  use fr.parcoursup.whyml.ordreappel.algo.voeu_classe.VoeuClasse_Props

  use export IQ0

  let lemma iq0_snoc (op oak : seq_voeu) (om m : EnumMap.t) (x : VoeuClasse.t)
   requires {[@expl:x selected] enummap_pop_v om m x }
   requires {[@expl:iq0] iq0 op oak om }
   ensures { iq0 op (snoc oak x) m }
  =
    assert { enummap_contains om x };
    assert { seq_contains_seq op (snoc oak x) };
    enummap_pop_imply_included om m;
    enummap_in_grp_included m om op;

    let s = snoc oak x in
    let nb_c = length op in
    for i = 0 to nb_c - 1 do
      invariant { forall j : integer. 0 <= j < i -> (seq_contains op[j] s \/ enummap_contains m op[j]) }
      assert { seq_contains op[i] oak \/ enummap_contains om op[i] };
      if voeu_eq op[i] x then
        assert { seq_contains op[i] s }
      else if enummap_contains om op[i] then begin
        assert { enummap_contains m op[i] };
      end else
        assert { seq_contains op[i] s };
    done

  let lemma iq0_empty (op : seq_voeu) (m : EnumMap.t)
    requires { enummap_eq_grp m op }
    ensures { iq0 op Seq.empty m }
  = ()

end

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

Generated by why3doc 1.7.2+git