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: Robbert Krebbers <mailinglists AT robbertkrebbers.nl>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] How can I extract data from this exists Prop?
  • Date: Thu, 27 Aug 2020 00:03:18 +0200
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=mailinglists AT robbertkrebbers.nl; spf=Pass smtp.mailfrom=mailinglists AT robbertkrebbers.nl; spf=None smtp.helo=postmaster AT se24-yh-out2.route25.eu
  • Ironport-phdr: 9a23:M2Z3DBdLI9y7Wz7IOZx2W0dulGMj4u6mDksu8pMizoh2WeGdxcW/ZB7h7PlgxGXEQZ/co6odzbaP7ea5AzdLucrJmUtBWaQEbwUCh8QSkl5oK+++Imq/EsTXaTcnFt9JTl5v8iLzG0FUHMHjew+a+SXqvnYdFRrlKAV6OPn+FJLMgMSrzeCy/IDYbxlViDanbr5+MRS7oR/MusUIj4ZuJbo9xxTUqXZUZupawn9lK0iOlBjm/Mew+5Bj8yVUu/0/8sNLTLv3caclQ7FGFToqK2866tHluhnFVguP+2ATUn4KnRpSAgjK9w/1U5HsuSbnrOV92S2aPcrrTbAoXDmp8qlmRAP0hCoBKjU09nzchM5tg6JBuB+vugJxw4DUbo+WOvRxcKzSctEGSmROX8ZcTDBBD4CmYocTE+YMM+RVoo/grFUOtxu+AgysCfvzxD9PnXD5xrM10/49EQrb2QIgBcwBv2/Po9rrLqcSSv2+wa7NzTrZbvNW3Tb96I7HchAloPGMRq5wcdHKxEk1EAPKlU6fppL/PzOJ1eQNqXaU4PF7Wu2xkW4nsBt9oj6rxso1jITCm40axEze+ypj3IY1OcO3SFR9YdO8HpVcqjyWOYRrTs4tXmxlpTg2x7kItJKmciYHypopyhDRZvKJcoWF5h3tWemPLDp2hH9rdqyyihmu/Uav1uHxWc+520tEoCpCl9nDrHEN1xrL58iGTPt95Eah1iyV2wDd8OFIOUU0lbLaK5I42b4xmIETvV7EHi/sl0X7irKdeEY8+uWw9ujqYbXrqoWCO4NqhAzyKKojl8KlDek4PQUCR3WX9Oe82bH580D0Qq9Gg/8rnqXDsJ3XK8IWrbOjDQBPyIYs8RO/Ai+m0NsGmXkHK0pIeAmZgIT3NFzCOfD5Dfemj1SrjTdr2+7KMqf7ApXKM3jDjKnucah95kJG1gUz0MhT55NSCr4fPPL+QlL9ud/YAxMjLQC43ejqBM9z244QQ26CAqCUPLvXsVCS5+IvJ+eMZJUSuDb4M/Ul4uThjX49mV8ce6mp0p8XaHGjHvR6OEWUemDsgtAaHmgRoAU+VvDqiF6YUTFNfHm9RLwz5isgCI68C4fDQpihgKad0yejAp1WemdGB0iQHnfvboWIQusDaCaPIsB6iTEETrigS4o51R60rgP6yrxnLvDV+iICr57j2sJ1tKXvkkQ58iUxBMCA2UmMSXt1lyUGXWwYxqd69HZ6wF2Oy7QwoOZVH9Ze/egBBgIzNJrdyeN+CsvuQSrbed2DRUy6Qc+rCzs8VMl3xdtYMBU1IMmrkh2Wh3niOLQSjbHeXMVpoJKZ5GD4IoNG81iD1KQliAN7ENBCbzHjl6468BXPXcjTlFiFmvz3M6kBjnaUqDWziFGWtUQdazZeFL3fVCpHNFHRp970/F/BVbKkA7k9KU1HzZzac/oYWpjSlVxDAczbFpHbamO1lX23AEzQlKmLZoDnYXkexijXAkUeiEYV+STfOA==

I think the point of Emilio's message was that with countability you can get the proof for free, and no proof effort is needed. I don't think his point was that the countability stuff is truly needed.

Emilio can probably correct me if I'm getting this wrong.

On 26/08/2020 23.30, 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









Archive powered by MHonArc 2.6.19+.

Top of Page