section‹Rankings› theory Rankings imports "HOL-Combinatorics.Multiset_Permutations" "List-Index.List_Index" "Randomised_Social_Choice.Order_Predicates" begin
subsection‹Preliminaries›
(* TODO Move *) lemma find_index_map: "find_index P (map f xs) = find_index (λx. P (f x)) xs" by (induction xs) auto
lemma map_index_self: assumes"distinct xs" shows"map (index xs) xs = [0..<length xs]" proof - have"xs = map (λi. xs ! i) [0..<length xs]" by (simp add: map_nth) alsohave"map (index xs) … = map id [0..<length xs]" unfolding map_map by (intro map_cong) (use assms in‹simp_all add: index_nth_id›) finallyshow ?thesis by simp qed
lemma bij_betw_map_prod: assumes"bij_betw f A B""bij_betw g C D" shows"bij_betw (map_prod f g) (A × C) (B × D)" using assms unfolding bij_betw_def by (auto simp: inj_on_def)
definition comap_relation :: "('a ==> 'b) ==> 'a relation ==> 'b relation"where "comap_relation f R = (λx y. ∃x' y'. x = f x' ∧ y = f y' ∧ R x' y')" (* END TODO *)
(* TODO: of_weak_ranking should be moved here *) lemma is_weak_ranking_map_singleton_iff [simp]: "is_weak_ranking (map (λx. {x}) xs) ⟷ distinct xs" by (induction xs) (auto simp: is_weak_ranking_Cons)
lemma of_weak_ranking_altdef': assumes"is_weak_ranking xs" shows"of_weak_ranking xs x y ⟷ x ∈∪(set xs) ∧ y ∈∪(set xs) ∧ find_index ((∈) x) xs ≥ find_index ((∈) y) xs" proof (cases "x ∈∪(set xs) ∧ y ∈∪(set xs)") case True thus ?thesis using True of_weak_ranking_altdef[OF assms, of x y] by auto next case False interpret total_preorder_on "∪(set xs)""of_weak_ranking xs" by (rule total_preorder_of_weak_ranking) (use assms in auto) have"¬of_weak_ranking xs x y" using not_outside False by blast thus ?thesis using False by blast qed
subsection‹Definition›
text‹
A 🪙‹ranking› is a representation of a linear order on a finite set as a list in descending
order, starting with the biggest element. Clearly, this gives a bijection between the linear
orders on a finite set and the permutations of that set. ›
inductive of_ranking :: "'alt list ==> 'alt relation"where "i ≤ j ==> i < length xs ==> j < length xs ==> xs ! i ⪰[of_ranking xs] xs ! j"
lemma of_ranking_conv_of_weak_ranking: "x ⪰[of_ranking xs] y ⟷ x ⪰[of_weak_ranking (map (λx. {x}) xs)] y" unfolding of_ranking.simps of_weak_ranking.simps by fastforce
lemma of_ranking_imp_in_set: assumes"of_ranking xs a b" shows"a ∈ set xs""b ∈ set xs" using assms by (fastforce elim!: of_ranking.cases)+
lemma of_ranking_Nil' [code]: "of_ranking [] x y = False" by simp
lemma of_ranking_Cons [code]: "x ⪰[of_ranking (z#zs)] y ⟷ x = z ∧ y ∈ set (z#zs) ∨ x ⪰[of_ranking zs] y" by (auto simp: of_ranking_conv_of_weak_ranking of_weak_ranking_Cons)
lemma of_ranking_Cons': assumes"distinct (x#xs)""a ∈ set (x#xs)""b ∈ set (x#xs)" shows"of_ranking (x#xs) a b ⟷ b = x ∨ (a ≠ x ∧ of_ranking xs a b)" using assms of_ranking_imp_in_set[of xs a b] by (auto simp: of_ranking_Cons)
lemma of_ranking_append: "x ⪰[of_ranking (xs @ ys)] y ⟷ x ∈ set xs ∧ y ∈ set ys ∨ x ⪰[of_ranking xs] y ∨x ⪰[of_ranking ys] y" by (induction xs) (auto simp: of_ranking_Cons)
lemma of_ranking_strongly_preferred_Cons_iff: assumes"distinct (x # xs)" shows"a ≻[of_ranking (x # xs)] b ⟷ x = a ∧ b ∈ set xs ∨ a ≻[of_ranking xs] b" using assms of_ranking_imp_in_set[of xs] by (auto simp: strongly_preferred_def of_ranking_Cons)
lemma of_ranking_strongly_preferred_append_iff: assumes"distinct (xs @ ys)" shows"a ≻[of_ranking (xs @ ys)] b ⟷ a ∈ set xs ∧ b ∈ set ys ∨ a ≻[of_ranking xs] b ∨ a ≻[of_ranking ys] b" using assms of_ranking_imp_in_set[of xs a b] of_ranking_imp_in_set[of ys a b]
of_ranking_imp_in_set[of xs b a] of_ranking_imp_in_set[of ys b a] unfolding strongly_preferred_def of_ranking_append distinct_append set_eq_iff Int_iff empty_iff by metis
lemma not_strongly_preferred_of_ranking_iff: assumes"a ∈ set xs""b ∈ set xs" shows"¬a ≺[of_ranking xs] b ⟷ a ⪰[of_ranking xs] b" using assms unfolding strongly_preferred_def by (metis index_less_size_conv linorder_le_cases nth_index of_ranking.intros)
lemma of_ranking_refl: assumes"x ∈ set xs" shows"x ⪯[of_ranking xs] x" using assms by (induction xs) (auto simp: of_ranking_Cons)
lemma of_ranking_altdef: assumes"distinct xs""x ∈ set xs""y ∈ set xs" shows"of_ranking xs x y ⟷ index xs x ≥ index xs y" unfolding of_ranking_conv_of_weak_ranking by (subst of_weak_ranking_altdef)
(use assms in‹auto simp: index_def find_index_map eq_commute[of _ y] eq_commute[of _ x]›)
lemma of_ranking_altdef': assumes"distinct xs" shows"of_ranking xs x y ⟷ x ∈ set xs ∧ y ∈ set xs ∧ index xs x ≥ index xs y" unfolding of_ranking_conv_of_weak_ranking by (subst of_weak_ranking_altdef')
(use assms in‹auto simp: index_def find_index_map eq_commute[of _ y] eq_commute[of _ x]›)
lemma of_ranking_nth_iff: assumes"distinct xs""i < length xs""j < length xs" shows"of_ranking xs (xs ! i) (xs ! j) ⟷ i ≥ j" using assms by (simp add: index_nth_id of_ranking_altdef)
lemma strongly_preferred_of_ranking_nth_iff: assumes"distinct xs""i < length xs""j < length xs" shows"xs ! i ≻[of_ranking xs] xs ! j ⟷ i < j" using assms by (auto simp: strongly_preferred_def of_ranking_nth_iff)
lemma of_ranking_total: "x ∈ set xs ==> y ∈ set xs ==> of_ranking xs x y ∨ of_ranking xs y x" by (induction xs) (auto simp: of_ranking_Cons)
lemma of_ranking_antisym: "x ∈ set xs ==> y ∈ set xs ==> of_ranking xs x y ==> of_ranking xs y x ==> distinct xs ==> x = y" by (simp add: of_ranking_altdef')
lemma finite_linorder_of_ranking: assumes"set xs = A""distinct xs" shows"finite_linorder_on A (of_ranking xs)" proof - interpret total_preorder_on A "of_ranking xs" unfolding of_ranking_conv_of_weak_ranking by (rule total_preorder_of_weak_ranking) (use assms in auto) show ?thesis proof fix x y assume"of_ranking xs x y""of_ranking xs y x" thus"x = y" by (metis assms(1,2) index_eq_index_conv nle_le not_outside(2) of_ranking_altdef) qed (use assms(1) in auto) qed
lemma linorder_of_ranking: assumes"set xs = A""distinct xs" shows"linorder_on A (of_ranking xs)" proof - interpret finite_linorder_on A "of_ranking xs" by (rule finite_linorder_of_ranking) fact+ show ?thesis .. qed
lemma total_preorder_of_ranking: assumes"set xs = A""distinct xs" shows"total_preorder_on A (of_ranking xs)" unfolding of_ranking_conv_of_weak_ranking by (rule total_preorder_of_weak_ranking) (use assms in auto)
subsection‹Transformations›
lemma map_relation_of_ranking: "map_relation f (of_ranking xs) = of_weak_ranking (map (λx. f -` {x}) xs)" unfolding of_ranking_conv_of_weak_ranking of_weak_ranking_map map_map o_def ..
lemma of_ranking_map: "of_ranking (map f xs) = comap_relation f (of_ranking xs)" by (induction xs) (auto simp: comap_relation_def of_ranking_Cons fun_eq_iff)
lemma of_ranking_permute': assumes"f permutes set xs" shows"map_relation f (of_ranking xs) = of_ranking (map (inv f) xs)" unfolding of_ranking_conv_of_weak_ranking by (subst of_weak_ranking_permute') (use assms in‹auto simp: map_map o_def›)
lemma of_ranking_permute: assumes"f permutes set xs" shows"of_ranking (map f xs) = map_relation (inv f) (of_ranking xs)" using of_ranking_permute'[OF permutes_inv[OF assms]] assms by (simp add: inv_inv_eq permutes_bij)
lemma of_ranking_rev [simp]: "of_ranking (rev xs) x y ⟷ of_ranking xs y x" unfolding of_ranking_conv_of_weak_ranking by (simp flip: rev_map)
lemma of_ranking_filter: "of_ranking (filter P xs) = restrict_relation {x. P x} (of_ranking xs)" by (induction xs) (auto simp: of_ranking_Cons restrict_relation_def fun_eq_iff)
lemma strongly_preferred_of_ranking_conv_index: assumes"distinct xs" shows"x ≺[of_ranking xs] y ⟷ x ∈ set xs ∧ y ∈ set xs ∧ index xs x > index xs y" unfolding strongly_preferred_def using of_ranking_altdef'[OF assms] by auto
lemma restrict_relation_of_weak_ranking_Cons: assumes"distinct (x # xs)" shows"restrict_relation (set xs) (of_ranking (x # xs)) = of_ranking xs" proof - from assms interpret R: total_preorder_on "set xs""of_ranking xs" by (intro total_preorder_of_ranking) auto from assms show ?thesis using R.not_outside by (intro ext) (auto simp: restrict_relation_def of_ranking_Cons) qed
lemma of_ranking_zero_upt_nat: "of_ranking [0::nat..<n] = (λx y. x ≥ y ∧ x < n)" by (induction n) (auto simp: of_ranking_append of_ranking_Cons fun_eq_iff)
lemma of_ranking_rev_zero_upt_nat: "of_ranking (rev [0::nat..<n]) = (λx y. x ≤ y ∧ y < n)" by (induction n) (auto simp: of_ranking_Cons fun_eq_iff)
lemma card_linorders_on: assumes"finite A" shows"card {R. linorder_on A R} = fact (card A)" proof - have"{R. linorder_on A R} = {R. finite_linorder_on A R}" using assms by (simp add: finite_linorder_on_def finite_linorder_on_axioms_def) alsohave"card … = card (permutations_of_set A)" using bij_betw_same_card[OF bij_betw_permutations_of_set_finite_linorders_on[of A]] by simp alsohave"… = fact (card A)" using assms by simp finallyshow ?thesis . qed
lemma finite_linorders_on [intro]: assumes"finite A" shows"finite {R. linorder_on A R}" proof - from assms have"finite (permutations_of_set A)" by simp alsohave"finite (permutations_of_set A) ⟷ finite {R. finite_linorder_on A R}" by (rule bij_betw_finite[OF bij_betw_permutations_of_set_finite_linorders_on]) alsohave"{R. finite_linorder_on A R} = {R. linorder_on A R}" using assms by (simp add: finite_linorder_on_axioms.intro finite_linorder_on_def) finallyshow ?thesis . qed
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.