@@ -103,34 +103,33 @@ theorem isFairEmpty_of_rankingFunction (V : RankingFunction a) : a.IsFairEmpty :
103103
104104-- def decidable_path (s1 : S) [Finite S] [f : (s1 s2 : S) → Decidable (a.R s1 s2)] : DecidablePred (fun s2 ↦ Relation.ReflTransGen a.R s1 s2) := sorry
105105
106- noncomputable def fair_successors (s1 : S) [fin : Finite S] : Finset S :=
106+ @ [simp, reducible]
107+ noncomputable def fair_successors (s1 : S) [Finite S] : Finset S :=
107108 let _ : Fintype S := Fintype.ofFinite S
108109 let _ : DecidablePred (fun s2 ↦ Relation.ReflTransGen a.R s1 s2 ∧ a.F s2) := Classical.decPred (fun s2 ↦ Relation.ReflTransGen a.R s1 s2 ∧ a.F s2)
109110 {s2 | Relation.ReflTransGen a.R s1 s2 ∧ a.F s2}
110111
112+ theorem f_subset (s1 s2 : S) [Finite S] (s1_r_s2 : a.R s1 s2) : fair_successors (a := a) s2 ⊆ fair_successors (a := a) s1 := fun e e_mem => by
113+ simp only [fair_successors, Finset.mem_filter, Finset.mem_univ, true_and] at e_mem
114+ rcases e_mem with ⟨e_r_s2, e_f⟩
115+ simp only [fair_successors, Finset.mem_filter, Finset.mem_univ, e_f, and_true, true_and]
116+ exact Relation.ReflTransGen.trans (Relation.ReflTransGen.single s1_r_s2) (e_r_s2)
117+
111118noncomputable def fair_count (s1 : S) [fin : Finite S] : Nat :=
112119 Finset.card (fair_successors (a := a) s1)
113120
114- theorem lt_le (a b : Nat) : (a + 1 ≤ b) ↔ (a < b) := by omega
121+ theorem lt_le (a b : Nat) : (a + 1 ≤ b) ↔ (a < b) := by omega
115122
116123noncomputable def completeness [fin : Finite S] (a : Automaton S) (fe : a.IsFairEmpty) : RankingFunction a := {
117124 rank := fun s => fair_count (a := a) s,
118125 reach := State.IsReachable (a := a),
119126 init_reach := init_reachable (a := a),
120127 next_reach := next_reachable (a := a) ,
121128 rank_le_of_rel := fun s1 s2 s1_r_s2 s1_reach => by
122- have f_subset : fair_successors (a := a) s2 ⊆ fair_successors (a := a) s1 := by
123- intro e e_mem
124- simp only [fair_successors, Finset.mem_filter, Finset.mem_univ, true_and] at e_mem
125- rcases e_mem with ⟨e_r_s2, e_f⟩
126- simp only [fair_successors, Finset.mem_filter, Finset.mem_univ, e_f, and_true, true_and]
127- trans s2
128- · exact Relation.ReflTransGen.single s1_r_s2
129- · exact e_r_s2
129+ have f_subset : fair_successors (a := a) s2 ⊆ fair_successors (a := a) s1 := f_subset s1 s2 s1_r_s2
130130 by_cases s1_fair : a.F s1
131131 <;> simp only [fair_count, fair_successors, s1_fair, ↓reduceIte, lt_le, gt_iff_lt, s1_fair, Bool.false_eq_true, ↓reduceIte, add_zero, ge_iff_le]
132132 · apply Finset.card_lt_card
133- simp only [fair_successors] at f_subset
134133 simp only [Finset.ssubset_def, f_subset, true_and]
135134 intro sub
136135 have s1_in : s1 ∈ fair_successors (a := a) s2 :=
@@ -140,19 +139,16 @@ noncomputable def completeness [fin : Finite S] (a : Automaton S) (fe : a.IsFair
140139 simp only [fair_successors, Finset.mem_filter, Finset.mem_univ, true_and] at s1_in
141140 rcases s1_in with ⟨s2_r_s1, _⟩
142141 apply fe
143- apply vardiRun_fair (if Even · then s2 else s1 )
142+ apply vardiRun_fair (if Even · then s1 else s2 )
144143 · intro n
145144 rcases s1_reach with ⟨ i, i_rfm, i_init⟩
146145 by_cases p : Even n
147146 <;> simp only [Nat.even_add_one, p, not_false_eq_true, not_true_eq_false, ↓reduceIte]
148147 <;> use s1, i
149148 <;> simp only [i_init, i_rfm, Relation.ReflTransGen.refl, s1_fair,
150149 Relation.TransGen.single s1_r_s2, s2_r_s1, and_self, true_and]
151- exact ⟨by
152- trans s1
153- · exact i_rfm
154- · exact Relation.ReflTransGen.single s1_r_s2
155- , by
150+ exact ⟨Relation.ReflTransGen.trans i_rfm (Relation.ReflTransGen.single s1_r_s2),
151+ by
156152 rw [Relation.TransGen.head'_iff]
157153 use s2
158154 ⟩
0 commit comments