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: mukesh tiwari <mukeshtiwari.iiitm AT gmail.com>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Reasoning about the complexity of Coq functions
  • Date: Thu, 14 Jul 2022 07:28:04 +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-f45.google.com
  • Ironport-data: A9a23:mjb5KKAmwvdVfhVW/xflw5YqxClBgxIJ4kV8jS/XYbTApDkm3mQHm jdJDzjSO6uJMzT8fd12bYzi9EkFsMCAn9ZkOVdlrnsFo1Bi+ZOUX4zBRqvTF3rPdZObFBoPA +E2MISowBUcFyeEzvuVGuG96yE6j8lkf5KkYAL+EnkZqTRMFWFw03qPp8Zj2tQy2YfgX1vU0 T/Pi5S31GGNi2Yc3l08sPrrRCNH5JwebxtF1rCWTakjUG72zxH5PrpHTU2CByeQrr1vIwKPb 72rIIdVUY/u10xF5tuNyt4Xe6CRK1LYFVDmZnF+A8BOjvXez8A/+v5TCRYSVatYoyTTwNp9k foTjpipS1giHIvdnP0DbxYNRkmSPYUekFPGCX22sMjWwk+fNnWwnrNhC0Y5OYBe8eFyaY1M3 aZAeXZdM1bZ3rLwnO/TpupE3qzPKOHuIYASoXF8zC7QF/dgQJHCX6Di6tpR3TN2jcdLdRrbT 5NIMmM/PUuaC/FJEkU8V8IwlrmBvH7YViMHl23JtbI57neGmWSd15C0aIaPEjCQfu1emV/dr Wbb9UziExQCPZqezyCE+zSinIfycTjTXYsTEPi19KcvjgHOgGMUDxISWB2wpvzRZlOCt8x3O hZL8CZ3gvYJ8FWpEdLfeQy8uWC4sUtJMzZPKNES5AaIw6vSxg+WAGkYUzJMAODKUudmFVTGM XfZz7vU6SxTXK69Ei3Cq+/Fxd+mEW1Ecj9YPH5soR4tuoG7+OkOYgTzosGP+ZNZY/XwEDD0h j2I9W0w2+hVgskM2KG2u1vAhlpAR6QlrCZltm07vUr/tmuVgbJJgaT2tDA3Ct4ece6koqGp5 iRspiRnxLlm4WuxvCKMWv4RO7qi+uyINjbR6XY2QcR+qG/yoyT9J9oIiN2bGKuPGpZUEdMOS B+D0T69GLcOVJdXRfQqPN7rWpxCIVbITIy7Dq28giVyjmhZLVfbpkmClGaf2GfilEVErE3ME cbzTCpYNl5DUf4P5GPuGY81iOZ3rghjmz67bc2kl3yPjOvGDFbIGOxtGAbfPogRsvnYyC2Lq I03H5XRm31ivBjWOHa/HXg7dgBUcxDWxPne96RqSwJ0ClY8QDp5UqOLnulJlk4Mt/09q9okN 0qVAidwoGcTT1WeQelTQnw8Or7pQ7hlqnc3YX4lMVqyiiosZI+u6OEUcJ5uJesr8+lqzPhVS fgZepXYUq4fFGifozlNP4PgqIFCdQiwgV3cMiegZg85dcEySgHM/OjiYQaypjIFCTC6tJdlr rD5jlHbTJMPSh5MFsHTbP7znVq9sWJMyu13VkrMZNJUfRy0ooRtLiXwiN4xIt0NeU2TnGvEi 17ODE5B9+fXooIz/N3Yvoy+rt+kQ7lkA05XP2jH9rLpZyTX+2yUx4UfAuuFeDbqUnytpPeva OBT+PHLMPMdmWFMvYchQa1gyrgz5oe2qrJXklZkEXHMYwj5A79sOCPdj8xGt6kIy70A/AXqB wSA/d5VPbjPM8TgSQZDKA0gZ+WF9PcVhjiCsqhvcRuivHd6rOidTEFfHxiQkygBfrF7B4Uon LU6s8kM5g3j1xcnboScgiZP+zjeJ3AMSf985JQTAYuuhwhyj18ePNrTDSj55JzJYNJJaxF4L jiRjavEprJd2kuSLCZpRCaVhbJQ1cYUpRRH7F4ePFDVyNDLsfk6gU9K+jMtQwUJkxhK3oqf4 ISw25GZ+ElPw9tpuCSHd2WlGgUECR/Av0Ktlh0Gk2rWS0TuXWvIRIH41SBh42hBm1+wvBACl F1b9IoheTnvdcD1mCA1XCaJbtT9GMdp+FSqdN+PRqy48lpTXdYhqqCrbGsM7RDgBKvdQaEBS fZCpI5NVEEwCcLcT2DXxWVXOXT8hS1o/FB/fMw=
  • Ironport-hdrordr: A9a23:6MbSTaAls2VvEuvlHemV55DYdb4zR+YMi2TDtnoBMCC9F/bzqy nApoV/6faZskdyZJhko6HiBEDiexLhHPxOkO0s1N6ZNWGMhILrFuFfBODZslrd8kPFh4hgPG RbH5SWyuecMbG3t6nHCcCDfeod/A==
  • Ironport-phdr: A9a23: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
  • Ironport-sdr: zW+9koo9WUe8G5aJomfrIHf1J3OGMPg4BZzgUF0KbXJGrIrpNTEmY4PdxEFi6M+cp8B9jp4uDY G/qqk6/EpTJRMkqdrLbAntF2DB2TR5tk4e0kquoJ78PUpfC9o5NyT+IXjqBqN5Uc894WE2lpi7 2wVQ+KwQ6nDg3fiTQZVZTWMjIiqzrcLVR91lA/zbrqAZ9QmuMuVgsVql4LgkR4uMIJF7iwqWpy Fqj/thHNb195+pklZK+dvJYWaLDZTWv6XQw++uA2wI3G2X555HpwEPO6wJ3B38fsJrqq6sHgNv Txtd+MTtP8aJGpgFTcPUFGCc

Thanks for the replies and the links of the papers. 

Best,
Mukesh 

On Wed, 13 Jul 2022 at 02:56, Yao Li <liyao AT seas.upenn.edu> wrote:
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