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: Qinshi Wang <qinshiw AT cs.princeton.edu>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Reasoning about the complexity of Coq functions
  • Date: Tue, 12 Jul 2022 21:47:31 -0400
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=qinshiw AT cs.princeton.edu; spf=Pass smtp.mailfrom=qinshiw AT cs.princeton.edu; spf=Pass smtp.helo=postmaster AT orangecrush.cs.princeton.edu
  • Ironport-data: A9a23:3VtnoqNmZclLU8PvrR1HkcFynXyQoLVcMsEvi/4bfWQNrUp00mADx mZNUDjUa6yIZjHyfYtxaY+09EJQ6JbSmNMyT3M5pCpnJ55ogZqcVI7Bdi8cHAvLc5adFBo/h yk6QoOdRCzhZiaE/n9BCpC48T8kk/vgqoPUUIYoAAgoLeNfYHpn2EgLd9IR2NYy24DmWlnV4 7senuWGULOb824sWo4rw/nbwP9flKyaVOQw4zTSzdgS1LPvvyF94KA3fcldHFOkKmVgJdNWc s6YpF2PEsw1yD92Yj+tuu6TnkTn2dc+NyDW4pZdc/DKbhSvOkXe345jXMfwZ3u7hB2gm/ZNk ekTrKCaEwIzJorPpMhAXRhhRnQW0a1uoNcrIFC4q8WVwEDNaWb3w7NlFwcuJ4we8etrBmcI+ PAFQNwPRknZ16Tvmej9E7IywJl/RCXoFNt3VnVI1DDfFvYnXrjIWOPS/95e1zosgcYIEPrDD yYcQWM+Nk2YOkYQUrsRIKg7tvasr1f4SRBVsmu3grQ3ulTq8DUkhdABN/KIKo3RHZg9clyjj mnB5iHyBgwQHMeOzCKMtHOqnO7G2y3hML/+D5W/7Pdsj1CY3HEICFsdTh2ju/i/gUOiXNQZJ kAJksYzkUQs3GWvaOWkY0OhnFTeuwQEfNlsP7A06TjYn8I4/D2lLmQDSzdAbvkvu8k3WSEm2 ze1oj/5OdB8mOHNEi/Grt94uRv3ZnRLcDNbDcMRZVFdi+QPtr3fmf4mojxLKLS0iNb4BTb2q 9xhhHBu2ulP5SLn/4O24hjljii3q4mhc+LYzgLNV2Sq4whjeZWlIYezr0DB7PBLIZqeSB+Ms GVsdymiAAImUcDleM+lGbtl8FSVCxCtamG0bblHRcVJythV0yT/Fb28GRknTKuTDu4KeCXyf GjYsh5L6ZlYMROCNPEqPNzsU5p2kfe/T7wJs8w4iPISP/CdkyfboUlTibK4hggBbWB1yv5jZ s3znTiEVC9EYUiY8NZGb7pNgORzm0jSNEvLX5H9xBm71rzWeXiUV7ofK1qSf4gEAFCs/W3oH yJkH5LTk313Db2vCgGKoNV7BQ1bchAG6WXe8ZM/mhirflU7QwnMypb5ndscRmCSt/0Jz76Yo ivsChMwJZiWrSSvFDhmo0tLMNvHNauTZ1piVcD1FVr3iXUlf6i166ITK8k+cbU9rbIxxuUyV +MEfc6NHvNJDDnL5m1FP5X6qYVjcjWthB6PYnb5PGBhI8Y4Slyb4MLgcyvu6DIKX3i+usYJq rG90h/WHMgYTAN4AceKMP+ilgvjvXUUlO9ocVHPJ91fJBfl/IRwcnKjheRxO9sNLx7O2jyck QuaHE5A9+XKpoY09vjPhLyF8tv1T7MgQhICEjCCv7isNCTc8m6y+qN6Ub6FLWLHSWf52KS+f uEEnfjzPcoOkEtOr4chQa1gyrgz5oe3qrJXklZkEXHMYwj5A79sOCPWj85Vv6tCy7RDpBC2H EmUvMFAOLOCNd/iFhgcKBd8NraP0vQdmz/z6/UpIRimuHMvoubfCUgCbQORjCF9LaduNNJ3y Ogsj8ca9gijh0d4Kd2BlC1VqzyBIyBSSakhrZ1GUobnhhBxmgNFe5XaBSL9+oyUa5NHKQ8yO D6Sj6fegLIay0bfKiJhGX/I1OtbpJIPpBEXkANefwrVwoLI1q0twRlc0TUrVQAEnBxI3tV6N nVvK0Aod76F+C1lhZQbUm2hc+2b6MZ1JqAsJ5o1eGzlo42AUXbEKmIwMvyQ50Bf+HkaZiJa+ rqV1GHjFzvmYakdGwMsDFV9paWLocNZr2X/dAKPRqxp3KXWpRLumem2f2sOoBb7BsV3iUHaz QWv1PglcrX1bEb8vIViY7R3Ft0spNSsL3cEWetg+qgEAWbaPjy+xFBi7qx3ltxlf5T3zKNzN yCiyg+jmfhzOOZiYw333ZIxHoI=
  • Ironport-hdrordr: A9a23:DjlreqOcAX0fUcBcTuGjsMiBIKoaSvp037BL7TEJdfU7SL37qy nDpoV56fawslYssRIb9+xoWpPwJU80nKQdieJ6AV7hZmjbUQCTXeZfBOXZslvd8u7Fm9J15O NPd6B/DZnXFlh1jcHz5U2dH8w7yNeKtICE7N2uqkuFgTsHV0io1WhENjo=
  • Ironport-phdr: A9a23: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
  • Ironport-sdr: uoiKYLceISytTWGsJtM1HAewFtPxstaAiBojMke8KxZ2pJu/vffYCUD2Fp7Uvvf9OmASD5t7DA N+5cS2v8H1ejHb4nG34qKrVCRcMqLwhmMNbHPNrvRnqWUJ3kqXdWn0zkoRMlbQZPV+g42vQX4P FLxwNCuFEEaQxjjE/tV7djkSbbS1m3cTC6eeYgzxfOsiMO/7vU6yEQARIJkulP8XRWxnsd2CFd 7xU8neMJc18IbR9Utm8U8OEwEc5AS15oqSl2tQeNeQe9sRmu5Xo8BVSCkPuNdx9/8InsEcBao3 yoSsnXc3ZKLF69XxzbDiM66Y

I think cost monad should be very suitable for your case. I'm not an expert. These are papers that I found:
https://dl.acm.org/doi/10.1145/3158124
https://www.cse.chalmers.se/~nad/publications/danielsson-popl2008.pdf

Thanks,
Qinshi

On Tue, 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