coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: Maximilian Wuttke <s8mawutt AT stud.uni-saarland.de>
- To: coq-club AT inria.fr
- Subject: Re: [Coq-Club] Moving between extrinsic and intrinsic proofs
- Date: Wed, 9 Oct 2019 17:40:34 +0200
- Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=s8mawutt AT stud.uni-saarland.de; spf=None smtp.mailfrom=s8mawutt AT stud.uni-saarland.de; spf=None smtp.helo=postmaster AT theia.rz.uni-saarland.de
- Autocrypt: addr=s8mawutt AT stud.uni-saarland.de; prefer-encrypt=mutual; keydata= mQINBFWVkZsBEADmp2Mq5XZcOg38F91SMR5uF8cqC7LaODrnF+xh3TNKgbK301sPwcSKA4gr +TKV73e4VQoWihiWaYfPJYHsudXrp644dqYvWuxNWlkh4S2HIOmcopuTEd063TL5hRvhkg0V ZOMq000ucKo0yBsUux7+TdZdDAX3WP1whF7jY8OTe5xnEO3yv4xydAZhbT/gMO/IW6BVE2xO eElXEwC8Tnssar8cM0wZcnxgKXq4dhjDO6sSkeaf81a6FPlpy+VuCIHFYoFIAquX6T6V+Zbi UXJyDSUSUVVmechLA8vXmiRgOTyVMdTejXQb5niLGjb/Upvy9uSlO7eR0aSkCs3vqeXIppmS PDTKVwPso/PmJHEJnZLrbXKqqh589pbDAdYfJvP3Sg0fncL5bzxV0gdSqWH0t0e7c9AMiHs5 5bxEHBXuVtNs1srF52gT0KlE84R2UOmZ9Kst7P3XgJtIGzuS5uSHqFmtknh9tj+/G/Kg3qDz njxM6xTGExNPHQuskwbvYDqA6/5Hslqis6D6EpMPGhRuUhPuE5Eb+PsxpV26UccZt51FqIIc Mwv+3AUPbF7v7s7rAE1BkbmClUGuYUGfqfndGT4V6fLpQH5F9kRdxmIm9FcMURUDvX4CBKZz gmwIZ4jgZ2jZ1VTy+MWIXRpgJIt5aim4liycyDoPk+fyYfdmQwARAQABtDFNYXhpbWlsaWFu IFd1dHRrZSA8czhtYXd1dHRAc3R1ZC51bmktc2FhcmxhbmQuZGU+iQIwBBMBCgAaBAsJCAcC FQoCFgECGQAFglcSYFwCngECmwEACgkQ7Ve7Ztu9/N6Nng/9Efrx3z5menrcwHILe2WX/i2i 8zFu8a3dqFZj0kgj8AumdUwbvOYv0mMBEG7c+6YNsQEw21mjKQGEw7GSOlN++K0xiZnlzULc DZlVxrH0Eg7fr/NNpQiJeCxFzxjMqMtitIbUh9BIFEnVOLsySLUoMRB77+/g8Lf0fJ5bTxfw 8xXg7has6p/J8Zc3Y19128o3BrBhDVYbYub+NeqwmHUdIbiPn+QsuhDpmvYniw5gsFm+KP7t YRpExeVT7ZuHFPiCQfHVbj0s4TzXMRFBrruOefreC2kg6e1YNpPRQolUYkc8kwIdPYF5oBC3 oRlgRiYMs+nGOyQcrPWz78PyycsuCrvOg0oDja41aNtL3PiZtqZf0Ih0GSNP6X0++I+ZIyR8 TZQyguRWb0z0anq1LhH/vRnXefH4zListwKwJViQsKPGXANu6qZpvwn65iH98+dT5uwKhHhl h3qTNx43WGOo57ETrsF8vpl++IotCFqihwUK6yV30xxZaOTa+p00QYzE34ZoRRgKdtclD0b1 aQciJ/k+BYjxy/vl8ZgiSpOLlI1jSncX6AKeq4KpmvbV96QdVrErlUsQULPRHiePi3hot9yS BRg7J5Z3mzLMt/rdfJIb8/bkxZGbqXl6LoxAvE1Io+fvFMOTSer47Los3MJO+smC/SstQczS BKOT0Cf+Ase5Ag0EVZWRmwEQALwwnvtVw/zFec+MNKgBwKt1MIG6EMBKc+OTIYM2tN4jcWla AbEcIZGkBSeoPJeTi4m3GQXhifGZK29VoDIUQjYYDWNtp6U8y0hLRnqSVY/YvcTDnK929n5r qMqO0wYf1fzhmPshIyD1jj96tqu0ppX7zE++VQ/VJgVIA8IGcNXUN21A/+rJKCJFAvBp+6u2 gNaUDfnqvPfTGtkq7A/D40Lo6y0KVu20R3W76iFWl6FEQzOe28VBnOjU/NbyzAzVUSgYCSfk YxhDiKfJRJvQd+VKUCAa+BSNoEPvDMKakvhApWUOncnNUbfXiH04fYSViu2NH2Ls3HLm+6xa Aaf9eUIU75A02xXUa6m+AccJQzCEJySeYJFVhJLSgZEbGwDZVdrRALolgYiIrwOHTitC2PLR ej8HeywQrn3PUGBwiYdOa19KTHZykbO0s0SHb6bvm3vgpAPPdZp+QWPOXx3aZz6dw4D867li sGVKMcKBcX9QCekVL7CW6lvvevUP5tBBYCshMvSTaN0BymBBwYrz8UB4RYJ4cUs5apd1mMfD 5Vm8EZf1DT15Q+K9+HsRQr3y/+AtHm0gd0DpXGfBH4H+54vyB9Aj3DVbyPMeFYv9UhyKALEo mprFM0tr0+SPh275xXlIxUvoC+3PlFM0swoLSmi2Tu9edjU6GuyL91w/9WTjABEBAAGJBD4E GAEIAAkFglWVkZsCmwICKQkQ7Ve7Ztu9/N7BXaAEGQEIAAYFAlWVkZsACgkQIA5mg0qOKkAo DhAAnms7o654V2uZWBsiiR2oEykGs/sIzxYcKrOi2RnkL6RAwhJgBr+WVpjQ2IS9IQ5Bxy8G OWhzyit2XvFYTWxGamrmyXol7IynGcl2U3WpmSQEPJx/QeyQ5lWLYzjn5bbdzNdY0mhUnRZ+ ke2tcttmvLsUKn2J/8lSyqBF4i4Yaj4p4LQ8n/K/eW9lIY+J/gVGDcrlZqOozXV9aClYDtgx L/c6/TPuDi0vgkhIaojwsSu38YmhmbYP03ntiLTrLbjnJXr0pYIlMRqUmNvPsphOR8cVGFnZ 50dVoWHSSJhoIESpu8Qz1qwvA9uNTDhe/nnr092diP78FWo4SENiKjrXA2fOjk0YoZA1uSL0 RbcRKAttPC88iBWUyBwYrhMBFKzJeDG+lvBID8gED205Jy7Mk8v7R9NqHpjJXST1avVMF7TX CH8OK7rgI9ATGLqJ31WoYZkCSFkYKYRbyarZnVKxMsQ1zhpjoEfuQlWaq2NgwS2cijWmKAmF V4Qv3FA5zAoEdzB9HCbT2DafITEUqjf111+WjNcfJvtfQcO7hghhMwFtW9Or9KqVKpEDraku uHUr6nVnBNYCliY80m/X5DXOZsKzehxfHht4t+CydGE2xRzIwzpos2ZebhkjWmghGS7G1JHA DgEk7zBKyVxJm/nwwNGk5MdY9sckx8XMiaA5lV2oDw/+K7mXo2qbEPnghGjN2bAqYbZd/Wdh 5SUwa5YvnfqWcSY7G8OA5pexnIV/5RRIdcc+RtrxADmfTYGVIvSfAS4uwALIgEd5LYdYBIaj xWLCyNghoQowLqZbIQQ4eOWd2xCF6srcTsIou2kJ97iiFtXgX3PthKn+fhdFYWktEDabDhgY SdqJVvs+Sk3lO41aJu5MSIsqWq+G0ZGumTtO/yR9x5RzA/qKn56S6Da8WjRF6iq/oyemifyC 74HXmmi6gd8HCWD+eEXNWVAVL/FlfYhL420olMcBgP+cMGJTpmWK5jCyaxHH4RFYg8AAdzn0 /Lc/Xr47IZBntCaLy3V1LSKvDSZackKOreBmxQrd2Qn5/seLYFWWl/rPvqib6hmoE17SjBI2 szi/t37JGXTl0ZkhSUp6FSC4YmoFrKJgxuX0q7CONZzdZ9G7mNOkUdg3QAaN6/EZQceGC/Dv i28jB57Y50OoOAcyJnSkS95lPobHcGbBDDIQVvcEBwhSir/coGXHk8tqMXCdhxDo9Tq1cSvA NeRYuJdrTdJM2FMll7QEtBcto0DNCNEecvZ+D/uqOU+InyJHpD4qDpQR8bqNJ3Fmehd54LYi ZK2G5/gRwF+8vnaeoy9fSs/CAw3icKPTcSSmy9bOk3I0fgAyb63xLF/sGHAOq5gkPg+9o79d HcbtD425Ag0EVZWRmwEQAKYFa3Y6d5D34YkaNBYvjU3mUlaS2uq7khoVxhnPiad496PzpxpF 76rwpAbh7+V+aqxFDldmydjV3REPgJKk5hnhJ2ndltaoy0CtzFOjUV2KkzzvG2YXADSKCqvL rtVx3wfAxOVxjPOlFzG57mvZd3MUlxOGJPvNbFJJY98OzjQGeCukITMO4mivublSlJy8hNkw bMgkAfBkuITNXllrLfTxch6wikunYlDrtI2X1/h6ygXn/m8dYWzDGv80PyzVHWNMz7JS5UuD 7PkkazkqLzH9HQ+xj2x7KOWIHs9BQp99OrZfUMcD54EfoM0JUG5kq0Xs099Z4UEFA2Pl+8mn n7z7NNZ1JSN0xjUuxhMu5deIkKEj8XGwB+6OXYEhF3mdh5T29C4LHDpp3fpa9LU+8Dlpq0HJ lwBx5ngXOfAmZrKAJhiy8kT3AfNskiVWxgYga2Kk2ku8vV4DkMai7kzK45t0/cDwdgugeck8 3x/7yR9XIrBwlt8N4bdJ3URbOtnuGuYjM5RTtqpadjVLLr+ZdhKPdM7qtPfnHotjRq+ban1T dA/zlCOW+s4g955kvafY29qnhx54y+DQJUwELAZCTA0fT/eHs0n6M/gILepMleBR7STA+Xqn I5aWlWn3Pp6nI8t3bz0T6sFEocD++YJNEr/J7yduvcNaI84j03iRMfPjABEBAAGJAh8EGAEI AAkFglWVkZsCmwwACgkQ7Ve7Ztu9/N4GJA//f21oF6/XClyTnbsNSBKLvbtb9CjKx+9c6B6k 1qHePSylFf+BsrKFMEdtyn40bfVnQqQ1GzNFFbzGiFkUlwM1BZMR0ogl6ahtJL3M4Tf7RkV6 FUhkov5HwYIXDjx9WdboLPPz4NQkomgcWyc0vAndtL1vYFizVLkxIdWonnv11M4MoQybCjv9 lm+UwmoqLkSvrWn3F6RMPwsc4HWDRHiBYNkCxYGlfVfQax1u3ENH7KfEnZAEEoxSBkaha1Tv /06wHjQ9w+7ZwueiB48MCQleDM4xP+Geom/VIhExdySrAtGZEP7DjCpcXTYL6491G1gDdStp zSU0odKKxp3xUgB7gFuegBsM4dXm02Q6tzr+oVLkCeTGWld3/DfyIVVi3f2w+g+JEE8W71Gx uIw4IwuxXr0sGo1gHnH8CD5ky0/dGYfW644oZ6DQRzDqp+7sJNGoSOmEbJ5k7IgkPlwb41jN Ez1miq/AIleDjVgM6ZP1g4eVAWgjATFqfv9y/WR1t1BvrcogGKdVLfRr6kDYwP2GzzCGz2Ki VtlPaPv52UYPa9zX6IT5hEOq4GSAVo2IHwtukyG10l7sanq7J6s5CumNukDzuJxJ+EgNYIxa EtdujUPJxlRQcFwqjbLEt2LQBJivwzRhRmQfQz5tt3c797Tsto875TRgvFHu+ezStimb9ew=
- Ironport-phdr: 9a23:qZXIQhKE8dZCNRzTr9mcpTZWNBhigK39O0sv0rFitYgRIvrxwZ3uMQTl6Ol3ixeRBMOHsqkC1bOd7f2ocFdDyK7JiGoFfp1IWk1NouQttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZrKeTpAI7SiNm82/yv95HJbAhEmTSwbalzIRmrognct8kbipZ+J6gszRfEvmFGcPlMy2NyIlKTkRf85sOu85Nm7i9dpfEv+dNeXKvjZ6g3QqBWAzogM2Au+c3krgLDQheV5nsdSWoZjBxFCBXY4R7gX5fxtiz6tvdh2CSfIMb7Q6w4VSik4qx2ThLjlSUJOCMj8GzPl8J+kqxbrhKiqRJxzYHbb4OaO+Zlc6PSYd8XX21PUtpfWiFDBI63cosBD/AGPeZdt4TzoEEBrBS/BQmpBePvzj5IiWXw3aYn0+shDB3G3BAjH90QrX/Zq871OaQXUe+vwqjI0CnDb+9N1Dfm9IjIbw0ureuRXbJ2cMrd0FIvGBnfgVWKrYzqJTWV2fkXv2eG8eVtTOSigHMkpQFpujWj28khh4bTio8Ry13I7yd0zJw7KNGlUEJ3fNCpHZRKuyyeNoZ6WMIvTm9ytCok1rELt5i2dzUQxps93R7QcfmHfpCI4h39UOaRJi91hG5leL2hhha961Ksyvf9V8WuzVZKqCtFnsDXtn8XzRPT8MyHReF7/ki8wzqAyh7c5vlFIUAyi6XbN4YszqM+m5ccq0jOGi77lF/0gaOMeEgo5/Ck6+H9bbXnop+cOZV0igb7Mqk2gcyyAuE4PRIAXmiG5eS8yKbu/VblQLVXk/I6iLTZsJbbJcgCva62GRVa0pwn6xmlCTepzc4UkmQZI15dYhKIk5DpO03SIPD/Ffqwn1OskC5yy//aOr3hH47CI2PYkLbheLZ981RTxBAyzdBZ/ZJUC6sOLOj9Wk/r55TkCUoyNBXxyOL6Av180JkfUCSBGPy3KqTX5HqB9uMqIu2NbYldhyvhN/sor6r13XowhkIBYYGywYYbLm2+H7F9KkyDZXPqjpENHDFZ7UIFUOX2hQjaAnZobHGoUvdkv2BpOMedFY7GA7uVrvmE1Sa/EIdRYzocWEuQDHuuaoOFHuwFYTiWK8lt1DAJB+D4F90RkCq2vQq/8IJJa/LO83dC54n/ydQz+uvS0Ao7/CZwBsKRlW2AHTktwzE4AgQu1aU6mnRTj1eO1a8i3a5EFdFS7rVTQEEnM5+Z1OVzEdT7XA6HctrbEFs=
Hi Elias,.
You can simplify your definition using the depending match a bit.
```
Definition build_bar'' (n : nat) : option bar :=
(if check_foo n as b return (check_foo n = b -> option bar)
then fun refl => let arg := exist foo n (check_foo_correct_fun n refl)
in Some (Bar arg)
else fun _ => None) eq_refl.
```
Best
Maximilian
On 09/10/2019 17:16, Elias Castegren wrote:
> Hi Coq clubbers
>
> I'm looking for ideas on how to smoothly go from extrinsic proofs
> to code with intrinsic proofs. As an example, consider the
> following simplified scenario.
>
> I have some property "foo" on natural numbers, and a data type
> "bar" which carries with it a number for which "foo" holds:
>
> *Definition* foo (x : nat) := x < 5.
>
> *Inductive* bar :=
> Bar : {x | foo x} -> bar.
>
> In addition, I have created an algorithm which checks if the
> "foo" property holds. I have also proven it correct:
>
> *Definition* check_foo (x : nat) :=
> *match* x *with*
> | S (S (S (S (S _)))) => false
> | _ => true
> *end*.
>
> *Require Import* Lia.
>
> *Theorem* check_foo_correct :
> *forall* x, check_foo x = true <-> foo x.
> *Proof*.
> unfold foo. unfold check_foo.
> intros. split.
> - intros H. do 5 (destruct x; try lia).
> inversion H.
> - intros Hlt. do 5 (destruct x; try reflexivity).
> lia.
> *Qed*.
>
> What I would like now is a function of type "nat -> option bar"
> which builds a "bar" from a natural number only if "foo" holds for
> that number. So far I have found two ways to do it, but none of
> them are very attractive.
>
> One variant runs the checking function and captures the equality
> proof "check_foo n = true", and then uses the correctness theorem
> as a function to get the property "foo n" with which the argument
> of "Bar" can be built:
>
> *Theorem* check_foo_correct_fun :
> *forall* x, check_foo x = true -> foo x.
> *Proof*.
> apply check_foo_correct.
> *Qed*.
>
> *Definition* build_bar (n : nat) : option bar :=
> *let* Heq :=
> *if* check_foo n as res return option (res = true)
> *then* Some eq_refl
> *else* None
> *in***
> *match* Heq *with*
> | Some refl =>
> *let* arg := exist foo n (check_foo_correct_fun n refl) *in*
> Some (Bar arg)
> | None => None
> *end*.
>
> This is unattractive because it requires dependent pattern
> matching and explicitly passes around an equality proof in an
> option type just to make the typechecker happy.
>
> The second approach builds the function with a proof script:
>
> *Definition* build_bar' (n : nat) : option bar.
> remember (check_foo n) as res.
> symmetry in Heqres. destruct res.
> - apply check_foo_correct in Heqres.
> apply (Some (Bar (exist foo n Heqres))).
> - apply None.
> *Defined*.
>
> While this version is shorter, it is arguably worse from a
> software engineering perspective as you need to step through the
> script to see what it is doing.
>
> Ideally, what I would want is something like this, where the key
> inference needed is that "check_foo n = true" since we are in the
> "then" branch.
>
> *Definition* build_bar'' (n : nat) : option bar :=
> *if* check_foo n
> *then* Some (Bar (exist foo n _)) /(* This does not typecheck *)/
> *else* None.
>
> I'm guessing that I won't be able to get something this short, but
> I'm interested in hearing if there are cleaner solutions than the
> two working versions I have found so far.
>
> Cheers
>
> /Elias
>
>
Attachment:
signature.asc
Description: OpenPGP digital signature
- [Coq-Club] Moving between extrinsic and intrinsic proofs, Elias Castegren, 10/09/2019
- Re: [Coq-Club] Moving between extrinsic and intrinsic proofs, Xavier Leroy, 10/09/2019
- Re: [Coq-Club] Moving between extrinsic and intrinsic proofs, Elias Castegren, 10/10/2019
- Re: [Coq-Club] Moving between extrinsic and intrinsic proofs, Maximilian Wuttke, 10/09/2019
- Re: [Coq-Club] Moving between extrinsic and intrinsic proofs, Laurent Thery, 10/09/2019
- Re: [Coq-Club] Moving between extrinsic and intrinsic proofs, Xavier Leroy, 10/09/2019
Archive powered by MHonArc 2.6.18.