Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] How can I extract data from this exists Prop?

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] How can I extract data from this exists Prop?


Chronological Thread 
  • From: Arthur Azevedo de Amorim <arthur.aa AT gmail.com>
  • To: Coq Club <coq-club AT inria.fr>
  • Subject: Re: [Coq-Club] How can I extract data from this exists Prop?
  • Date: Wed, 26 Aug 2020 17:30:31 -0400
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=arthur.aa AT gmail.com; spf=Pass smtp.mailfrom=arthur.aa AT gmail.com; spf=None smtp.helo=postmaster AT mail-qv1-f48.google.com
  • Ironport-phdr: 9a23:Jp6t5R9pyaqDRv9uRHKM819IXTAuvvDOBiVQ1KB20OMcTK2v8tzYMVDF4r011RmVBNudsqgewLOM7+jJYi8p2d65qncMcZhBBVcuqP49uEgeOvODElDxN/XwbiY3T4xoXV5h+GynYwAOQJ6tL1LdrWev4jEMBx7xKRR6JvjvGo7Vks+7y/2+94fcbglVhTexe65+IAuooQneq8Uan4RvIbstxxXUpXdFZ/5Yzn5yK1KJmBb86Maw/Jp9/ClVpvks6c1OX7jkcqohVbBXAygoPG4z5M3wqBnMVhCP6WcGUmUXiRVHHQ7I5wznU5jrsyv6su192DSGPcDzULs5Vyiu47ttRRT1kyoMKSI3/3/LhcxxlKJboQyupxpjw47PfYqZMONycr7Bcd8GQGZMWNtaWS5cDYOmd4YAAOQBMuRYoYfzpFUAsAWwChWjCu701j9In2X70bEm3+g9EwzL2hErEdIUsHTTqdX4LLsfUfqpzKnI0DXDde5d1Cv86YfWbBAuv+yDXbVtesXM10YkCh/IjlCXqYz/PjOV0/kGvm+B4Op6SeKvi3Mnqxtrrje13MghkYbJhocPxVDF8SV12po6Jdq9SENiZ9OvDZRfuT2AOYRsXsMiX39nuDw8yrAeuJO3YDYHxZsmyhLBdvGKfYqF7xH9WOqMLjl2inBoda67ihu970StzvHwW9Wp3VtLsydIkcXAu34D2RDP9sSJSv1w9Vqv1zaI0gDc8OBEIUYsmKraLZ4h2L8wmYAJvUTNBC/6gED2jLeXdkk94eip5f/nbq/hpp+GOI95jBz1PKc2msGnH+g0LgwDU3KY9Om8zrHv41D1TbFQgvA5kaTUto3RK94Bqa6jGQBV154u6xahADei19QVhXwHI0hEeBKDloTpIk/OLO3hAfexjFmhky1nx//BPr3mDZXNKmbMnK39crZ67k5Q0AszzdZB6JJIErwNPu7/V0vruNHbDhI1KRK4z/vjBdln2Y4TWnqDAqqDP6PTtV+I6PgvI+6JZIINojn9MeQl5/7zjX8jg1MSZ7Om0IAYaHC9BPtmIkGZbWDwjdcGFGcGphA+Q/DyiF2eTT5TYG6/UL475jEiEY6pEYPDRp22j7Gaxye6HphWZnhcBVyWEHfocZ+EW/YWZy6ILM9hiG9Mab/0YIg4nTqqqQWyn7FgN6/f/jASnZPlztl8oePJw0Ic7ztxWu2Hz2GQVSldjG4WSjMxlKxy6WV4zU2C1OAsiuZEFcFJofpAegg/PJ/Yied9DoahCUr6Yt6VRQP+EZ2dCjYrQ4d0modWOhcvK5CZlhnGmhGSLfoQnr2PCoYz9/uFjXf0Lsd5jX3B0ft41gV0co50LWSjw5VH2U3LHYeQyheWkq+rceIX2yufrD7en1rLh1lRVUtLaYuAXX0bYRGL/9Hw50eHVqH3TLp7Yk1OzsmNLqYMYdrs3w1L

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
> > > >>>
> > > >
> >
>


--
Arthur Azevedo de Amorim



Archive powered by MHonArc 2.6.19+.

Top of Page