coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: Clément Pit-Claudel <cpitclaudel AT gmail.com>
- To: coq-club AT inria.fr
- Subject: Re: [Coq-Club] How can I extract data from this exists Prop?
- Date: Wed, 26 Aug 2020 18:06:28 -0400
- Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=cpitclaudel AT gmail.com; spf=Pass smtp.mailfrom=cpitclaudel AT gmail.com; spf=None smtp.helo=postmaster AT mail-qk1-f182.google.com
- Ironport-phdr: 9a23:Z3Iw5h9tSdVbLf9uRHKM819IXTAuvvDOBiVQ1KB20ukcTK2v8tzYMVDF4r011RmVBNudsqgfwLKL+4nbGkU4qa6bt34DdJEeHzQksu4x2zIaPcieFEfgJ+TrZSFpVO5LVVti4m3peRMNQJW2aFLduGC94iAPERvjKwV1Ov71GonPhMiryuy+4ZLebxhJiTanfL9+Mhu7oQrNusQWnIBvNrs/xhzVr3VSZu9Y33loJVWdnxb94se/4ptu+DlOtvwi6sBNT7z0c7w3QrJEAjsmNXs15NDwuhnYUQSP/HocXX4InRdOHgPI8Qv1Xpb1siv9q+p9xCyXNtD4QLwoRTiv6bpgRRn1gykFKjE56nnahNFugqJVoByvpBJxzIDbb46XKPVwcbjQfc8ZSGdbQspdSyJMD4G6YoASD+QBJ+FYr4zlqlYQqRu5HwysC/3pyj9UnnD4x6w60/g4HQzY2AwvBc8Ov2nKo9XxKawfVvy6zLHJzTXfc/xW3S3y6JXVfR8/pfGBRr1wcc/LxkkuEwPJlEmfqYvgPz6M0OkGrmeU4fZ6W+21l24ntx9+oiKpxso0hYTHiJ8Yx1DE+Ch63Io4OMC0RVJmbdOqH5Vcqy+UOpVoTs8/Q2xltjg3x6MFtJO5cyUHxpUqyh7CZ/CaboSE/xTuX/ufLzd/gXJqYrO/hxCq/EihzO38TMi030xQoipLiNnArnUN1wTS6sSeUft88Fyh1SyI1wDJ5eFJJ10/m6nDK5M53LI8ip4evV7AEyL2gkn6krGaels+9uS16OnrfK3qqoGTOoNuiwzyL74iltKwDOgkKAQDXHSX9OKh37P550L5Wq9Fjvgun6nZrp/aIcMbq7a8AwBP04Yj7w+zDy6l0NgFhHUHIk9JdRGZg4TzNFHOJ/f4Dfi7g1uyijtk2/fGPrj5DpXMKHjMjqvhcK5j50JAzAc/19NS6pJOBr0fPv7/RFX9uMHbAxMnKwC0xvzoCNR51oMQQ2KPBaqZPbvOvl+Q5+IvP/WDZIsPtzbgNvcq+frugGQ2mV8YZ6ap3J8XZGqkEfRhJkWVeWDsjcsZEWcWogo+S/Tnh0GFUT5Kfnq9Q6Y85iwgB4+9FofCRoWtgKSb0yuhH51WYHpGClGWHnvyeYWEQaREVCXHKch41zcASLKJSok71BjouhWp5aBgK7///qwduJT/4+B0+6j4kRgv+TFwR5CWy2CRRGV9g28FQxc52al+pQp2zVLVgvswuOBRCdEGv6ABaQw9L5OJl7UnWeC3YRrIe5KycHjjQtiiBmtvHNc4wttLekUkXtv73kqF0C2tDLsY0beMAc5sq/6O7z3KP894jk3++uw5lVB/G5lAMGSnguh08A2BX9eYwXXcrL6jcOEn5ACI8W6CyWSUu0QBCVx/VKzEWTYUYU6E9Nk=
In other words:
Definition extract' : forall {A} {y x : list A} (P : isPrefixOf x y), {z | x
++ z = y}.
intros A y x P.
exists (List.skipn (List.length x) y).
destruct P as (z & H).
revert y z H. induction x; cbn; intros y z H.
- reflexivity.
- erewrite <- H, IHx; reflexivity.
Qed.
On 8/26/20 5:30 PM, Arthur Azevedo de Amorim wrote:
> That is a good point. It actually follows because (x ++) has a left
> inverse: drop (length x). We don't even need the existence proof to
> extract the witness!
>
> On Wed, Aug 26, 2020 at 5:16 PM jonikelee AT gmail.com <jonikelee AT gmail.com>
> wrote:
>>
>> It turns out that no assumptions about the countability of list
>> element's type is necessary, nor does one have to use a decidable
>> equality:
>>
>> Require Export Coq.Lists.List.
>> Import ListNotations.
>>
>> Definition isPrefixOf{A} (x y : list A) :=
>> exists z, x ++ z = y. (*note: plain Leibniz = here*)
>>
>> Definition extract : forall {A}{y x : list A}(P : isPrefixOf x y), {z | x
>> ++ z = y}.
>> Proof.
>> intro A. induction y. all:intros x P.
>> - exists []. destruct P as (z & E). rewrite app_nil_r. apply app_eq_nil
>> in E. tauto.
>> - destruct x as [|b x].
>> { exists (a::y). reflexivity. }
>> enough (a=b /\ isPrefixOf x y) as (e & Q).
>> { specialize (IHy x Q) as (z & f). exists z. cbn. congruence. }
>> destruct P as (z & E). cbn in E. injection E. intros H1 H2.
>> split.
>> + congruence.
>> + exists z. exact H1.
>> Defined.
>>
>>
>>
>> On Tue, 25 Aug 2020 16:31:10 -0400
>> "jonikelee AT gmail.com" <jonikelee AT gmail.com> wrote:
>>
>>> Oh - sorry, it wasn't intended to be off-list. Thanks for the
>>> detailed explanation.
>>>
>>> On Tue, 25 Aug 2020 20:58:12 +0200
>>> Robbert Krebbers <mailinglists AT robbertkrebbers.nl> wrote:
>>>
>>>> Not sure if this was intended to be off-list.
>>>>
>>>> It's like that, but more complicated for the general case. Since
>>>> bool is finite, termination is trivial. For types are are
>>>> countable, not non-finite, (take p : nat → bool) you need to find a
>>>> suitable termination measure.
>>>>
>>>> On 8/25/20 8:54 PM, jonikelee AT gmail.com wrote:
>>>>> On Tue, 25 Aug 2020 20:37:47 +0200
>>>>> Robbert Krebbers <mailinglists AT robbertkrebbers.nl> wrote:
>>>>>
>>>>>> The mentioned proof makes use of the following theorem:
>>>>>>
>>>>>> (∃ x : A, P x) → { x : A | P x }
>>>>>>
>>>>>> under the assumption that 1.) A is countable, and 2.) the
>>>>>> predicate is decidable.
>>>>>
>>>>> I see. I missed that there was a double "==" in isPrefixOf. Ok,
>>>>> so this is just something like:
>>>>>
>>>>> Definition extract{P : bool -> bool}(e : exists b, P b = true) :
>>>>> {b | P b = true}. Proof.
>>>>> assert bool as b by constructor.
>>>>> destruct (P b) eqn:E.
>>>>> - exists b. exact E.
>>>>> - destruct (P (negb b)) eqn:E2.
>>>>> + exists (negb b). exact E2.
>>>>> + exfalso. destruct e as (b' & F), b, b'.
>>>>> all:cbn in *. all:congruence.
>>>>> Defined.
>>>>>
>>>>> OK - not as magical as I thought. Thanks.
>>>>>
>>>>>>
>>>>>> This theorem holds intuitively because you can write an algorithm
>>>>>> that searches for the witness. Because A is countable, it can
>>>>>> simply enumerate all elements. Then, because P is decidable, it
>>>>>> can test for each element if P holds or not. Now, since (∃ x : A,
>>>>>> P x) holds, this algorithm will terminate, i.e. finally find a
>>>>>> witness.
>>>>>>
>>>>>> The Coq standard library also includes a version of this theorem,
>>>>>> see
>>>>>> https://coq.inria.fr/distrib/current/stdlib/Coq.Logic.ConstructiveEpsilon.html
>>>>>>
>>>>>> Also std++ includes a version of this theorem, see
>>>>>> https://gitlab.mpi-sws.org/iris/stdpp/-/blob/master/theories/countable.v#L84
>>>>>>
>>>>>> choiceType in ssreflect (or the Countable type class in std++)
>>>>>> expresses that a type is countable, and is used to automatically
>>>>>> infer assumption (1) in the above theorem.
>>>>>>
>>>>>> Hope this helps!
>>>>>>
>>>>>> On 8/25/20 8:27 PM, jonikelee AT gmail.com wrote:
>>>>>>> Can someone explain to a non-ssreflect/non-mathcomp user how
>>>>>>> choiceType works? It looks like it must rely on an axiom. Are
>>>>>>> there any types that fulfill it? For example, is there a
>>>>>>> non-axiomatic way in which bool is a choiceType?
>>>>>>>
>>>>>>> Because, the ability to pull the necessary x out of "exists x, P
>>>>>>> x" seems magical. How would a program using this extract?
>>>>>>>
>>>>>>> On Tue, 25 Aug 2020 19:15:14 +0200
>>>>>>> Emilio Jesús Gallego Arias <e AT x80.org> wrote:
>>>>>>>
>>>>>>>> Hi Agnishom,
>>>>>>>>
>>>>>>>> Agnishom Chattopadhyay <agnishom AT cmi.ac.in> writes:
>>>>>>>>
>>>>>>>>> I have a function that is something like this:
>>>>>>>>>
>>>>>>>>> Definition isPrefixOf (x : list A) (y : list A) :=
>>>>>>>>> exists z, x ++ z = y.
>>>>>>>>>
>>>>>>>>> Now, I want to define a witness function. Informally, it can
>>>>>>>>> be described as follows: Given x and y such that (isPrefixOf
>>>>>>>>> x y), return z which satisfies the criteria exists z, x ++ z
>>>>>>>>> = y.
>>>>>>>>>
>>>>>>>>> I would try to define it this way, but that would not work
>>>>>>>>> (possibly because exists z, x ++ z = y is a Prop and we are
>>>>>>>>> asking for something in Type) :
>>>>>>>>>
>>>>>>>>> Definition witness (x y : list A) {H : isPrefixOf x y} : list
>>>>>>>>> A. destruct H.
>>>>>>>>> Abort.
>>>>>>>>
>>>>>>>> If you can afford to work with a type A which has a notion of
>>>>>>>> choice principle you can indeed write your witness function.
>>>>>>>> Example:
>>>>>>>>
>>>>>>>> From mathcomp Require Import all_ssreflect.
>>>>>>>>
>>>>>>>> Set Implicit Arguments.
>>>>>>>> Unset Strict Implicit.
>>>>>>>> Unset Printing Implicit Defensive.
>>>>>>>>
>>>>>>>> Variable (A : choiceType).
>>>>>>>>
>>>>>>>> Definition isPrefixOf (x : list A) (y : list A) :=
>>>>>>>> exists z, x ++ z == y.
>>>>>>>>
>>>>>>>> Definition extract x y (w : isPrefixOf x y) : list A := xchoose
>>>>>>>> w.
>>>>>>>>
>>>>>>>> Kind regards,
>>>>>>>> Emilio
>>>>>>>
>>>>>
>>>
>>
>
>
- Re: [Coq-Club] How can I extract data from this exists Prop?, (continued)
- Re: [Coq-Club] How can I extract data from this exists Prop?, Emilio Jesús Gallego Arias, 08/25/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, Agnishom Chattopadhyay, 08/25/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, jonikelee AT gmail.com, 08/25/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, Robbert Krebbers, 08/25/2020
- Message not available
- Message not available
- Re: [Coq-Club] How can I extract data from this exists Prop?, jonikelee AT gmail.com, 08/25/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, jonikelee AT gmail.com, 08/26/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, Arthur Azevedo de Amorim, 08/26/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, Robbert Krebbers, 08/27/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, jonikelee AT gmail.com, 08/27/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, Robbert Krebbers, 08/27/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, jonikelee AT gmail.com, 08/25/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, Clément Pit-Claudel, 08/27/2020
- Message not available
- Message not available
- Re: [Coq-Club] How can I extract data from this exists Prop?, Robbert Krebbers, 08/25/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, Emilio Jesús Gallego Arias, 08/25/2020
- Re: [Coq-Club] How can I extract data from this exists Prop?, Agnishom Chattopadhyay, 08/10/2020
Archive powered by MHonArc 2.6.19+.