coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: mukesh tiwari <mukeshtiwari.iiitm AT gmail.com>
- To: coq-club AT inria.fr
- Subject: [Coq-Club] Reasoning about the complexity of Coq functions
- Date: Tue, 12 Jul 2022 20:41:27 +0100
- Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=mukeshtiwari.iiitm AT gmail.com; spf=Pass smtp.mailfrom=mukeshtiwari.iiitm AT gmail.com; spf=None smtp.helo=postmaster AT mail-ej1-f49.google.com
- Ironport-data: A9a23:s68DYagJG82AJQSNv5qbNZn3X161XhYKZh0ujC45NGQN5FlHY01je htvDT/QaP6Lamv0ft9/PIi1pkxQvsfcy95jGVdq+Sk1RXtjpJueD7x1DG+gZnLIdpWroGFPt phFNIGYdKjYaleG+39B55C49SEUOZmgH+a6UKieUsxIbVcMpB0J0HqPoMZkxN8y6TSFK1nV4 4mq/JSFYAXNNwNcawr41YrT8HuDg9yp4Fv0jnRmDRyclAK2e9E9VfrzFInpR5fKatE88t2SG 44v+IqEElbxpH/BPD8KfoHTKSXmSpaKVeSHZ+E/t6KK2nCurQRquko32WZ1hUp/0120c95NJ NplmoeUEhlxHb/2n8sHYyBVSCJjEJFa0eqSSZS/mZT7I0zudnLtx7BjDhhzM9FJvOlwBm5K+ LoTLzVlghKr3brnhuLmDLM11oJ/faEHP6tH0p1k5TTEDvs9QYzCXKzQ5JlZ3TYsg+hBGP/fY 4wSbj8HgBHoOkwWawlNUM1WcOGAtmT5SR9j81Ku+qsX2m/Kjz5a0pvOL4+AEjCNbZwNwhzwS nj912/+G1QRMMGV4SGU92qlwO7JhyLyHowIfIBU7dZviVyXg2ERUVgYCQr9rv6+hUqzHdlYL iT45xbCs4Ad72jwUIHeTSe/j2S0hxNHWMd9L/ETvVTlJrXv3y6VAW0NTzhkYdMgtdMrSTFC6 rNvt4O5bdCImO3FIU9x5ot4vhvpZndIdT5qiTssCFpas4O68enfmzqWFo47eJNZmOEZDt0Z/ txnhC03hrFWgMxSkqvnrBbIhDWjopWPRQkwjuk2Yo5HxlMpDGJGT9bwgbQ+0RqmBNjFJrVml CZZ8/VyFMhUUfmweNWlGY3h5o2B6fefKyH7ilVyBZQn/DnF0yf9IN8OvWkgfxY3bplsldrVj Kn76VM5CHh7bCvCUEOLS9/Z5zkClvW/SY60Dpg4kPIXOsgpJWdrAx2ClWbJhzy3+KTdua44P piffK6R4YUyWMxaIM6Nb75Fi9cDn3hgrUuKHMyT50n5jNK2OSHNIZ9YYQPmRr1ot8us/VSFm /4BbZfi40sEC4XWPHKHmbP/2HhQchDX87it+5IJHgNCSyI6cFwc5wj5mu9/Jd08wfkOy48lP BiVAydl9bY2vlWfQS3iV5ypQOqHsU9XoS1pMCoyE0yv3nR/M4+j4L1OJZQydLgjsudkyKcsH fUCfsyBBNVJSyjGq2xNN8mj8NQ6eUT5nx+KMgqkfCM7IMxtSgnPzdnuIVni+SwIOSyouJZsu LanzA7aHcEOSl06XsbbYf6i1X2run0ZlL4gVkfEOIgBd0Dl8YwsICv016dlL8YJIBTF5z2by wfGWUdC9beR+9c4qYCbi7qFooGlF/pFMnBbR2SLv6yrMST6/3a4xdASXeuNewfbXjym9ainY 9JT0KigYvAKmVB9s718Haxu+qQw6oa9vLRd1AllQCzGYln3WLNtJn6KgZtGuqFXnOQLvAK3X geC+IAfN+nYfsziF1EVKUwuaeHajaMYnTzb7PIUJkTm5X8ooODWDx0KZxTc2jZAKLZVMZ8+x btzssAh7QHi2AEhNcyLj3wJ+mnQfGYMVb4r6sMTDIPx0FF5z1hDZdnRCHaz7s3eLdpLNUYuL 3mfg6+b3+ZQwU/LcnwSE3nR3LoC2c5f5kgSlFJSdU6Untflh+Ms2EED+zoASAkInA5M1Ph+O zQ2OkB4TUlUE+yEWCSes6GQ9wB96Nmx/0Xwzx4EljScQRX5EGPKK2I5NKCG+0VxH6ewuNRE1 Onw9YoneW+CkALNMu8aVktsqvilRtt0nuEHsN7yBNyLRvHWfhK86pJDpgM0R9/PDsY4hUmBr u5vlAq1hWsXKgZIy5AG50KmOXj8hfxKyKGugR2swU/RIVzhRQ==
- Ironport-hdrordr: A9a23:BzV5naMq/BiBg8BcTsyjsMiBIKoaSvp037BL7TEXdfUxSKalfq +V7ZcmPHPP6Ar5O0tApTnjAtjjfZq0z/ccirX5Vo3SOTUO1lHYSL2KLrGP/9QjIUDDHyJmup uIupIRNOHN
- Ironport-phdr: A9a23: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 Z5LR70CEVJpR7UVDUNqGNFEK5ByDGtMrA==
- Ironport-sdr: MgEZeqU1lotVomPlNRoo5oDWeQW5CQeXBRMUDhGhx8enOjg0uF7fgL02+aawEkBB5h+rscw+HZ rg1m6OkeUypTT2udb4wuePasL7t2uit5L+uOv+FoE8HQq2Rrbk1leopsBEIk84HGxRZzbigkEr WwcQLbHmmH1MRb7d81e7gzFR/z5BIST9jqhs3AaVPBPjcs8k4OnpU1xMuHoFkemjhscAeGcQ0h R8yBaUds5oCjls0Sa2oMqp2JqbeufM91LxyDK1ve/fj0RAqmatldmn91gxevr2HfE8KRa4XT1g nTjJAnBzVuKDf0U5mTRDGO1S
Hi everyone,
Fixpoint repeat_op_ntimes_rec (e : T) (n : positive) : T * N :=
match n with
| xH => (e, N0)
| xO p =>
let (ret, w) := repeat_op_ntimes_rec e p
in (ret * ret, N.add 1 w)
| xI p =>
let (ret, w) := repeat_op_ntimes_rec e p
in (e * (ret * ret), N.add 1 w)
end.
Now, I can prove that the number of steps is bounded by a logarithm of n.
Lemma repeat_op_ntimes_rec_bound :
forall n e, (snd (repeat_op_ntimes_rec e n) <= N.log2 (N.pos n))%N.
(* Function without counter *)
Fixpoint repeat_op_ntimes_rec_w (e : T) (n : positive) : T :=
match n with
| xH => e
| xO p =>
let ret := repeat_op_ntimes_rec_w e p
in ret * ret
| xI p =>
let ret := repeat_op_ntimes_rec_w e p
in e * (ret * ret)
end.
Then I write an inductive data type to capture the cost
(* Inducive Type to capture the complexity of *)
| xO_case p ret w : complexity_repeat_op_ntimes_rec e p ret w ->
complexity_repeat_op_ntimes_rec e (xO p) (ret * ret) (N.succ w)
| xI_case p ret w : complexity_repeat_op_ntimes_rec e p ret w ->
complexity_repeat_op_ntimes_rec e (xI p) (e * (ret * ret)) (N.succ w).
Finally, I can prove that the execution of 'repeat_op_ntimes_rec' is bounded by logarithm of input by the following lemma
Lemma correct_complexity_repeat_op_ntimes_rec :
forall n e, complexity_repeat_op_ntimes_rec e n
(repeat_op_ntimes_rec_w e n) (N.log2 (N.pos n)).
What are some nice ways to reason about the complexity/cost of Coq functions?
In more detail:
I want to reason about the complexity/cost of simple programs so the easiest way is to count the number of primitive instructions, during the execution of the program, and return it as an extra value. For example, the 'repeat_op_ntimes_rec' returns an extra argument, the number of steps it takes to execute for input n.
match n with
| xH => (e, N0)
| xO p =>
let (ret, w) := repeat_op_ntimes_rec e p
in (ret * ret, N.add 1 w)
| xI p =>
let (ret, w) := repeat_op_ntimes_rec e p
in (e * (ret * ret), N.add 1 w)
end.
Now, I can prove that the number of steps is bounded by a logarithm of n.
Lemma repeat_op_ntimes_rec_bound :
forall n e, (snd (repeat_op_ntimes_rec e n) <= N.log2 (N.pos n))%N.
It is nice because if I compose two such functions, I can return the combined cost of functions. But now I am stuck with an extra return value just because I want to reason about the cost, so I can take another approach and write the same function in a normal way, without any counter:
(* Function without counter *)
Fixpoint repeat_op_ntimes_rec_w (e : T) (n : positive) : T :=
match n with
| xH => e
| xO p =>
let ret := repeat_op_ntimes_rec_w e p
in ret * ret
| xI p =>
let ret := repeat_op_ntimes_rec_w e p
in e * (ret * ret)
end.
Then I write an inductive data type to capture the cost
(* Inducive Type to capture the complexity of *)
Inductive complexity_repeat_op_ntimes_rec (e : T) :
positive -> T -> N -> Prop :=
| xH_case : complexity_repeat_op_ntimes_rec e xH e N0| xO_case p ret w : complexity_repeat_op_ntimes_rec e p ret w ->
complexity_repeat_op_ntimes_rec e (xO p) (ret * ret) (N.succ w)
| xI_case p ret w : complexity_repeat_op_ntimes_rec e p ret w ->
complexity_repeat_op_ntimes_rec e (xI p) (e * (ret * ret)) (N.succ w).
Finally, I can prove that the execution of 'repeat_op_ntimes_rec' is bounded by logarithm of input by the following lemma
Lemma correct_complexity_repeat_op_ntimes_rec :
forall n e, complexity_repeat_op_ntimes_rec e n
(repeat_op_ntimes_rec_w e n) (N.log2 (N.pos n)).
This is nice because my function is free from an extra return value, but unfortunately, it does not, as I understand, compose. (I don't think I can compose two inductive datatypes to reason about combined cost). Therefore, what is the best middle way to do this?
Best,
Mukesh
- [Coq-Club] Reasoning about the complexity of Coq functions, mukesh tiwari, 07/12/2022
- Re: [Coq-Club] Reasoning about the complexity of Coq functions, Lasse Blaauwbroek, 07/12/2022
- Re: [Coq-Club] Reasoning about the complexity of Coq functions, Qinshi Wang, 07/13/2022
- Re: [Coq-Club] Reasoning about the complexity of Coq functions, Yao Li, 07/13/2022
- Re: [Coq-Club] Reasoning about the complexity of Coq functions, mukesh tiwari, 07/14/2022
Archive powered by MHonArc 2.6.19+.