Commit f9bc9466 by Ralf Jung

### generalize fixpoint from f^2 contractive to f^k contractive

parent f351a117
 ... ... @@ -261,44 +261,46 @@ Section fixpoint. Qed. End fixpoint. (** Fixpoint of f when f^2 is contractive. **) (* TODO: Generalize 2 to m. *) Definition fixpoint2 `{Cofe A, Inhabited A} (f : A → A) `{!Contractive (Nat.iter 2 f)} := fixpoint (Nat.iter 2 f). (** Fixpoint of f when f^k is contractive. **) Definition fixpointK `{Cofe A, Inhabited A} k (f : A → A) `{!Contractive (Nat.iter k f)} := fixpoint (Nat.iter k f). Section fixpoint2. Section fixpointK. Local Set Default Proof Using "Type*". Context `{Cofe A, Inhabited A} (f : A → A) `{!Contractive (Nat.iter 2 f)}. Context `{Cofe A, Inhabited A} (f : A → A) k `{!Contractive (Nat.iter k f)}. (* TODO: Can we get rid of this assumption, derive it from contractivity? *) Context `{!∀ n, Proper (dist n ==> dist n) f}. Lemma fixpoint2_unfold : fixpoint2 f ≡ f (fixpoint2 f). Lemma fixpointK_unfold : fixpointK k f ≡ f (fixpointK k f). Proof. apply equiv_dist=>n. rewrite /fixpoint2 fixpoint_eq /fixpoint_def (conv_compl n (fixpoint_chain _)) //. rewrite /fixpointK fixpoint_eq /fixpoint_def (conv_compl n (fixpoint_chain _)) //. induction n as [|n IH]; simpl. - eapply contractive_0 with (f0 := Nat.iter 2 f). done. - eapply contractive_S with (f0 := Nat.iter 2 f); first done. eauto. - rewrite -Nat_iter_S Nat_iter_S_r. eapply contractive_0; first done. - rewrite -[f _]Nat_iter_S Nat_iter_S_r. eapply contractive_S; first done. eauto. Qed. Lemma fixpoint2_unique (x : A) : x ≡ f x → x ≡ fixpoint2 f. Lemma fixpointK_unique (x : A) : x ≡ f x → x ≡ fixpointK k f. Proof. intros Hf. apply fixpoint_unique, equiv_dist=>n. eapply equiv_dist in Hf. rewrite 2!{1}Hf. done. intros Hf. apply fixpoint_unique, equiv_dist=>n. (* Forward reasoning is so annoying... *) assert (x ≡{n}≡ f x) by by apply equiv_dist. clear Contractive0. induction k; first done. by rewrite {1}Hf {1}IHn0. Qed. Section fixpoint2_ne. Context (g : A → A) `{!Contractive (Nat.iter 2 g), !∀ n, Proper (dist n ==> dist n) g}. Section fixpointK_ne. Context (g : A → A) `{!Contractive (Nat.iter k g), !∀ n, Proper (dist n ==> dist n) g}. Lemma fixpoint2_ne n : (∀ z, f z ≡{n}≡ g z) → fixpoint2 f ≡{n}≡ fixpoint2 g. Lemma fixpointK_ne n : (∀ z, f z ≡{n}≡ g z) → fixpointK k f ≡{n}≡ fixpointK k g. Proof. rewrite /fixpoint2=>Hne /=. apply fixpoint_ne=>? /=. rewrite !Hne. done. rewrite /fixpointK=>Hne /=. apply fixpoint_ne=>? /=. clear Contractive0 Contractive1. induction k; first by auto. simpl. rewrite IHn0. apply Hne. Qed. Lemma fixpoint2_proper : (∀ z, f z ≡ g z) → fixpoint2 f ≡ fixpoint2 g. Proof. setoid_rewrite equiv_dist; naive_solver eauto using fixpoint2_ne. Qed. End fixpoint2_ne. End fixpoint2. Lemma fixpointK_proper : (∀ z, f z ≡ g z) → fixpointK k f ≡ fixpointK k g. Proof. setoid_rewrite equiv_dist; naive_solver eauto using fixpointK_ne. Qed. End fixpointK_ne. End fixpointK. (** Mutual fixpoints *) Section fixpointAB. ... ...
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!