Parcoursup / Calcul de l'ordre d'appel des candidats index
(* https://framagit.org/parcoursup/algorithmes-de-parcoursup/-/tree/master/src/main/java/fr/parcoursup/algos/ordreappel/algo/GroupeClassement.java *) module VoeuClasse [@java:package:fr.parcoursup.whyml.ordreappel.algo] [@java:implements:java.lang.Comparable] use int.Int use mach.java.lang.Integer use fr.parcoursup.whyml.exceptions.verification_exception.VerificationException use fr.parcoursup.whyml.exceptions.verification_exception_message.VerificationExceptionMessage type type_candidat = BOURSIER_DU_SECTEUR | BOURSIER_HORS_SECTEUR | NON_BOURSIER_DU_SECTEUR | NON_BOURSIER_HORS_SECTEUR predicate type_candidat_eq (t1 : type_candidat) (t2 : type_candidat) = match t1, t2 with | BOURSIER_DU_SECTEUR, BOURSIER_DU_SECTEUR | BOURSIER_HORS_SECTEUR, BOURSIER_HORS_SECTEUR | NON_BOURSIER_DU_SECTEUR, NON_BOURSIER_DU_SECTEUR | NON_BOURSIER_HORS_SECTEUR, NON_BOURSIER_HORS_SECTEUR -> true | _ -> false end predicate type_est_boursier (t : type_candidat) = match t with | BOURSIER_DU_SECTEUR | BOURSIER_HORS_SECTEUR -> true | _ -> false end predicate type_est_du_secteur (t : type_candidat) = match t with | BOURSIER_DU_SECTEUR | NON_BOURSIER_DU_SECTEUR -> true | _ -> false end type t [@java:visibility:private] = { type_candidat : type_candidat; g_cn_cod : integer; rang : integer; rang_appel : integer; } invariant { rang >= 0 } invariant { rang_appel >= 0 } by { type_candidat = BOURSIER_DU_SECTEUR; g_cn_cod = 0; rang = 0; rang_appel = 0; } let function get_rang_appel (self : t) : integer = self.rang_appel let function get_g_cn_cod (self : t) : integer = self.g_cn_cod let function get_rang (self : t) : integer = self.rang let function get_type_candidat (self : t) : type_candidat = self.type_candidat let function est_boursier (self : t) : bool = match self.type_candidat with | BOURSIER_DU_SECTEUR | BOURSIER_HORS_SECTEUR -> true | _ -> false end let function est_du_secteur (self : t) : bool = match self.type_candidat with | BOURSIER_DU_SECTEUR | NON_BOURSIER_DU_SECTEUR -> true | _ -> false end let function compare_to (self : t) (o : t) : integer = self.rang - o.rang let voeu_classe [@java:constructor] (cod : integer) (rang : integer) (boursier : bool) (du_secteur : bool): t ensures { get_rang result = rang >= 0 } ensures { boursier = est_boursier result } ensures { du_secteur = est_du_secteur result } ensures { cod = get_g_cn_cod result } ensures { get_rang_appel result = get_rang result } raises { VerificationException.E _ -> rang < 0 } = if rang < 0 then raise VerificationException.E (VerificationException.crtX2 VERIFICATION_ENTREE_ALGO_ORDRE_APPEL_RANG_NEGATIF cod rang); let type_candidat = if boursier then if du_secteur then BOURSIER_DU_SECTEUR else BOURSIER_HORS_SECTEUR else if du_secteur then NON_BOURSIER_DU_SECTEUR else NON_BOURSIER_HORS_SECTEUR in { type_candidat = type_candidat; g_cn_cod = cod; rang = rang; rang_appel = rang; } let function has_type (self : t) (ty : type_candidat) : bool ensures { result <-> type_candidat_eq (get_type_candidat self) ty } = match ty with | BOURSIER_DU_SECTEUR -> est_boursier self && est_du_secteur self | BOURSIER_HORS_SECTEUR -> est_boursier self && (not est_du_secteur self) | NON_BOURSIER_DU_SECTEUR -> (not est_boursier self) && est_du_secteur self | NON_BOURSIER_HORS_SECTEUR -> (not est_boursier self) && (not est_du_secteur self) end let function types_identiques (v1 : t) (v2 : t) : bool ensures { result <-> type_candidat_eq (get_type_candidat v1) (get_type_candidat v2) } = has_type v1 (get_type_candidat v2) let function eq_up_to_rang_appel (v1 : t) (v2 : t) : bool ensures { result <-> ( get_g_cn_cod v1 = get_g_cn_cod v2 && get_rang v1 = get_rang v2 && types_identiques v1 v2) } = (get_g_cn_cod v1 = get_g_cn_cod v2) && (get_rang v1 = get_rang v2) && types_identiques v1 v2 let set_rang_appel [@java:constructor] (vc : t) (ra : integer) : t ensures { get_rang result = get_rang vc } ensures { est_boursier result = est_boursier vc } ensures { est_du_secteur result = est_du_secteur vc } ensures { get_g_cn_cod result = get_g_cn_cod vc } ensures { get_rang_appel result = ra } ensures { eq_up_to_rang_appel vc result } raises { VerificationException.E _ -> ra < 0 } = if ra < 0 then raise VerificationException.E (crtX2 VERIFICATION_ENTREE_ALGO_ORDRE_APPEL_RANG_APPEL_NEGATIF vc.g_cn_cod ra); { type_candidat = vc.type_candidat; g_cn_cod = vc.g_cn_cod; rang = vc.rang; rang_appel = ra; } end module VoeuClasse_Props use int.Int use mach.java.lang.Integer use VoeuClasse predicate voeux_classes_eq_up_to_rang_appel (v1 : VoeuClasse.t) (v2 : VoeuClasse.t) = (get_g_cn_cod v1 = get_g_cn_cod v2) /\ (get_rang v1 = get_rang v2) /\ type_candidat_eq (get_type_candidat v1) (get_type_candidat v2) predicate voeu_lt (v1 v2 : VoeuClasse.t) = compare_to v1 v2 < 0 predicate voeu_le (v1 v2 : VoeuClasse.t) = compare_to v1 v2 <= 0 predicate voeu_distinct (v1 v2 : VoeuClasse.t) = voeu_lt v1 v2 \/ voeu_lt v2 v1 predicate voeu_has_type (v : t) (t : type_candidat) = has_type v t predicate voeu_eq (v1 v2 : VoeuClasse.t) = v1 = v2 function same_type (v1 v2 : VoeuClasse.t) : bool = get_type_candidat v1 = get_type_candidat v2 let lemma eq_up_to_rang_appel_if_eq (v1 v2 : VoeuClasse.t) requires { v1 = v2 } ensures { eq_up_to_rang_appel v1 v2 } = () let lemma eq_up_to_rang_appel_symm (v1 v2 : VoeuClasse.t) requires { eq_up_to_rang_appel v1 v2 } ensures { eq_up_to_rang_appel v2 v1 } = () let lemma eq_up_to_rang_appel_trans (v1 v2 v3 : VoeuClasse.t) requires { eq_up_to_rang_appel v1 v2 } requires { eq_up_to_rang_appel v2 v3 } ensures { eq_up_to_rang_appel v1 v3 } = () end module PQueueVoeuxClasses use VoeuClasse clone export mach.java.util.PriorityQueue with type elt = VoeuClasse.t, function cmp = VoeuClasse.compare_to end (* generated on Thu Nov 21 02:04:27 UTC 2024 from rev: *)
Generated by why3doc 1.7.2+git