Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] Reasoning about the complexity of Coq functions

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] Reasoning about the complexity of Coq functions


Chronological Thread 
  • From: Yao Li <liyao AT seas.upenn.edu>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Reasoning about the complexity of Coq functions
  • Date: Tue, 12 Jul 2022 21:56:16 -0400
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=liyao AT seas.upenn.edu; spf=Pass smtp.mailfrom=liyao AT seas.upenn.edu; spf=None smtp.helo=postmaster AT mail-oi1-f171.google.com
  • Ironport-data: A9a23:C1z45aMRcE/lPwDvrR2XkcFynXyQoLVcMsEvi/4bfWQNrUoh0DNRn DEbW2mCafqIZ2Txe9p/a4y0oEwCvZDQmtMwTHM5pCpnJ55ogZqcVI7Bdi8cHAvLc5adFBo/h yk6QoOdRCzhZiaE/n9BCpC48T8kk/vgqoPUUIYoAAgoLeNfYHpn2EgLd9IR2NYy24DmWlnV4 7senuWGULOb824sWo4rw/nbwP9flKyaVOQw4zTSzdgS1LPvvyF94KA3fcldHFOkKmVgJdNWc s6YpF2PEsw1yD92Yj+tuu6TnkTn2dc+NyDW4pZdc/DKbhSvOkXe345jXMfwZ3u7hB2UpY9b4 fAKp6W5VCh4A/aVku8FU0lhRnQW0a1uoNcrIFC6uM2XikrHKj7imqo3Sk4xOoIc96B8BmQmG f4wcmhcKEDewbvon/TiFbAEascLdKEHOKsbu2BpyhnCAP89B43bTqPMo9JUwV/cg+gXTKyHP 5ZDMlKDajzrSl5XPFU4La4D37fyhkb0bGN4r2+a8P9fD2/7lVQtitABKuH9cduTAM5Rg0ywv XPD522/AxcANdXZxyDtz563rurGnCe+X4NLUbPhqacsj1qUyWgeThYRUDNXvMVVlGajYY11A mlT6BMnsIdjyRfyRNLlX02B9SvsUgEnZ/JcFOgz6Qeow6XS4hqECmVsctKnQIx23CPRbWx6v mJlj+8FFhQ07+LIESP1GqO86GLtaXJMfAfucAddFVNdi+QPtr3fmf4mczqOOKu8j9mwHjCph j7T83F4iLIUgsoGka68+DgrYg5ARLCZEGbZBS2NBQpJCz+Vgqb7PeREDnCFt559wH6xFAXpg ZT9s5H2ABoyJZ+MjjeRZ+4GAauk4f2IWBWF3wMwQcR5qW/8pSL8FWy13N2YDBc5WirjUW+5C HI/RSsMjHOuFCD3MvMtMtrZ5zoClPCwTYWNug/ogipmO8AtLmdrDQlhYkmf222FraTfufBXB HtvSu71VSxyIf0/klKeHr5BuZd2mH1W7T6MHfjTkkX/uZLDNSX9YepUYDOmMLplhIva+1692 4gEZ6O3J+B3CrKWjt//qt5Nczjn7BETWfjLliCgXrffe1M2RDtwW6O5LHFIU9UNopm5X9zgp hmVMnK0AnKl7ZEeAQnVOH1ldp31WpNz8SAyMSA2ZAr6wHUqesCy9KoZcd06caR+rL5vyvt9T v8kfcScA6kWGmyap2hFNZSt/pZ/cBmLhB6VO3T3ajYIf6lmG17D9Ojic1a97yIJFCe26ZAzr uT4hAPWSJYOXSp4C8PSZK79xl+9pyFByvl/VlCOP8FefkOq/YR3cnSjgvgyKsAKCBPC2jrHj lbOXEtE/bHA+tZn/sPIiKaIq5aSP9F/RkcKTXPG6buWNDXB+jTxy4F3UNGOIWLXWlTy9fjwf u5S1fz9bKYKkVsW4YpxF7FnkfA369f1/eMIyw1lGDDMbg3uBOo/ez+J2s5AsqALzbhc4FPkV kWK89hcGLOIJMK1TwJLdVR9NryOhaMOhz3fzfUpO0GmtiV5y7yKDBdJNB6WhS0BcbZ4bNE/z eE6tJJE4gCzkEB2YNOPjyQR8GXVa3JZDPxhuZYdD4vmzAEszwgaM5DbDyb35rCJaslNYhZ2e G7K3PKaiuQO3FfGfloyCWPJgbhXi6MItU0Y11QFPVmIxofIi/JfMMe9Ktjrotm5Dymr0t6f/ kBuPkxxYKKPpnJm3ZcaGW+rHA5FCVuS/UmZJ57lUoHGZxHAa4APBDRV1SWxEIQx6G9VZX5G5 LyeziDoXSuCkATZwH4pQUA8wxD8ZYUZy+AB8fxL2+yeEpAhJyf9j6moI2cEtnMLxC/3aFLv/ YFXwQq7VUE32eP8bUH250l2GIn8kCy5GVE=
  • Ironport-hdrordr: A9a23:w/mNgKhdt5wYsaCqfX2QTahjNHBQXu0ji2hC6mlwRA09TyX4rb HNoB1/73XJYVkqKRYdcLy7Scq9qDbnhOZICPcqTMyftXjdyQ6VxehZhOOIowEIWReOkNK1vZ 0AT0EUMqyVMbEVt7eC3OB6KbodKRu8nZxASd2w854Ud3ARV0io1WlENjo=
  • Ironport-phdr: A9a23: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 57Ek6ehcF+qHPrP8MIHQdXMJcSBdnctLEiwcAM=
  • Ironport-sdr: q3U5pcaofVJpjD5Mf2ZH+fHsCsPsWCgVkbJa99PvuddKnavBHOCnGhLs5VpOC9xdbmBVPK2Hqz RP8+joIKGVSOITUMNClpi7rpTE54DJIAsmN1rn5ujVK+onI+n/3QypLXIaR635vB/PVcp5S4Oz leTcKP2ppj+n1PGE62evc07mR5gMm2PyAilz7z1yUGzJ1QXuPn8LByLACO1I5JvLbTvTW6V8J2 unjXTqpg5cqxUiC3sGqwGZIRTUPWY9nlM70PjmzjMj66rdqFhjMJwVjOV4///DwdgpEsHIJ09T 1g+EjodT4dh+qlH0Lse9grFg

Dear Mukesh,

You first definition is essentially using a writer monad. You can use monadic operations such as bind, ret, etc., so that the costs are hidden and you would not need to explicitly deal with them.

You might be interested in our paper “Reasoning about the Garden of Forking Paths” (https://dl.acm.org/doi/10.1145/3473585), which is essentially using a writer monad transformer to count computation costs. What we reason about in the paper is a lazy semantics, but call-by-value and call-by-need can also be reasoned about using similar methods.

Best,
Yao

On Jul 12, 2022, at 3:41 PM, mukesh tiwari <mukeshtiwari.iiitm AT gmail.com> wrote:

Hi everyone,

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.

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.

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




Archive powered by MHonArc 2.6.19+.

Top of Page