From c236b51348d2a39d8f105ef0c4e8a53fabc6e285 Mon Sep 17 00:00:00 2001 From: Hugo Herbelin Date: Tue, 15 Jul 2014 18:15:26 +0200 Subject: Added a (constructive) proof of Weak Konig's lemma for decidable trees. Renamed Fan.v into WeakFan.v since this was a proof of Weak Fan Theorem after all. --- doc/stdlib/index-list.html.template | 3 +- theories/Logic/Fan.v | 107 ------------------------------------ theories/Logic/vo.itarget | 3 +- 3 files changed, 4 insertions(+), 109 deletions(-) delete mode 100644 theories/Logic/Fan.v diff --git a/doc/stdlib/index-list.html.template b/doc/stdlib/index-list.html.template index c3b2aad582..75b5e7fea7 100644 --- a/doc/stdlib/index-list.html.template +++ b/doc/stdlib/index-list.html.template @@ -68,7 +68,8 @@ through the Require Import command.

theories/Logic/IndefiniteDescription.v theories/Logic/FunctionalExtensionality.v theories/Logic/ExtensionalityFacts.v - theories/Logic/Fan.v + theories/Logic/WeakFan.v + theories/Logic/WKL.v theories/Logic/FinFun.v diff --git a/theories/Logic/Fan.v b/theories/Logic/Fan.v deleted file mode 100644 index 27b2d64fb0..0000000000 --- a/theories/Logic/Fan.v +++ /dev/null @@ -1,107 +0,0 @@ -(************************************************************************) -(* v * The Coq Proof Assistant / The Coq Development Team *) -(* Prop := -| now l : P l -> inductively_barred P l -| propagate l : - inductively_barred P (true::l) -> - inductively_barred P (false::l) -> - inductively_barred P l. - -(** [approx X l] says that l is a boolean representation of a prefix of X *) - -Fixpoint approx X (l:list bool) := - match l with - | [] => True - | b::l => approx X l /\ (if b then X (length l) else ~ X (length l)) - end. - -(** [barred P] means that for any infinite path represented as a predicate, - the property P holds for some prefix of the path *) - -Definition barred P := - forall (X:nat -> Prop), exists l, approx X l /\ P l. - -(** The proof proceeds by building a set Y of finite paths - approximating either the smallest unbarred infinite path in P, if - there is one (taking true>false), or the path true::true::... if P - happens to be inductively_barred *) - -Fixpoint Y P (l:list bool) := - match l with - | [] => True - | b::l => - Y P l /\ - if b then inductively_barred P (false::l) else ~ inductively_barred P (false::l) - end. - -Lemma Y_unique : forall P l1 l2, length l1 = length l2 -> Y P l1 -> Y P l2 -> l1 = l2. -Proof. -induction l1, l2. -- trivial. -- discriminate. -- discriminate. -- intros H (HY1,H1) (HY2,H2). - injection H as H. - pose proof (IHl1 l2 H HY1 HY2). clear HY1 HY2 H IHl1. - subst l1. - f_equal. - destruct a, b; firstorder. -Qed. - -(** X is the translation of Y as a predicate *) - -Definition X P n := exists l, length l = n /\ Y P (true::l). - -Lemma Y_approx : forall P l, approx (X P) l -> Y P l. -Proof. -induction l. -- trivial. -- intros (H,Hb). split. - + auto. - + unfold X in Hb. - destruct a. - * destruct Hb as (l',(Hl',(HYl',HY))). - rewrite <- (Y_unique P l' l Hl'); auto. - * firstorder. -Qed. - -Theorem FanTheorem : forall P, barred P -> inductively_barred P []. -Proof. -intros P Hbar. -destruct (Hbar (X P)) as (l,(Hd,HP)). -assert (inductively_barred P l) by (apply (now P l), HP). -clear Hbar HP. -induction l. -- assumption. -- destruct Hd as (Hd,HX). - apply (IHl Hd). clear IHl. - destruct a; unfold X in HX; simpl in HX. - + apply propagate. - * apply H. - * destruct HX as (l',(Hl,(HY,Ht))); firstorder. - apply Y_approx in Hd. rewrite <- (Y_unique P l' l Hl); trivial. - + destruct HX. exists l. split; auto using Y_approx. -Qed. diff --git a/theories/Logic/vo.itarget b/theories/Logic/vo.itarget index 488fd908ee..6f7eba9040 100644 --- a/theories/Logic/vo.itarget +++ b/theories/Logic/vo.itarget @@ -16,7 +16,8 @@ Epsilon.vo Eqdep_dec.vo EqdepFacts.vo Eqdep.vo -Fan.vo +WeakFan.vo +WKL.vo FunctionalExtensionality.vo Hurkens.vo IndefiniteDescription.vo -- cgit v1.2.3