coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: Lasse Blaauwbroek <lasse AT blaauwbroek.eu>
- To: coq-club AT inria.fr
- Subject: Re: [Coq-Club] Reasoning about the complexity of Coq functions
- Date: Tue, 12 Jul 2022 21:53:14 +0200
- Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=lasse AT blaauwbroek.eu; spf=Pass smtp.mailfrom=lasse AT blaauwbroek.eu; spf=None smtp.helo=postmaster AT mail.blaauwbroek.eu
- Ironport-data: A9a23:9LR1NK8mwBrQbn9szm6gDrUDJXmTJUtcMsCJ2f8bNWPcYEJGY0x3m DBJDT3Sa6uJYmCmfYwlb4Wz80oEuZGGyN9kGgM9pHxEQiMRo6IpJ/zJdxaqZ3v6wu7rFR88s Z1GMrEsCOhuExcwcz/0auCJQUFUjP3OHvymYAL9EngZqTVMEU/Nsjo+3b9j6mJUqYLhWVnV5 oqo+5e31GKNglaYDEpEs8pvlzs05JweiBtA1rDpTa0jUPf2zhH5PbpHTU2DByOQrrp8QoZWc 93+IISRpQs1yfuC5uSNyd4XemVSKlLb0JPnZnB+A8BOiTAazsA+PzpS2Pc0MS9qZzu1c99Z0 Ip2h4C2UFYQMJLqqNgSSEJeLSgvFPgTkFPHCSDXXc27ykTHdz3mx/xnEV48J4oV+aB6HAmi9 9RBeG1LNEzF3bjuhu3iIgVvrpxLwM3DOIoEoXxIxzXQBOs5S4rETqaM6MIwMDIY2p0VQ6qEP ZBxhTxHVxHtYkB+GXQrGpsGx7+nrVjReXpfpwfAzUYwyzOLl1AvgeaF3MDuUteNXIBemluSj nnX+nzwRBAcLt2WjzSfmk9AncfKlCL/HogWHbSl6fRwh1CQgGEOYPELabelieHmsXyiXcsOE kIr3BoSorNp8nKiH/CoCnVUv0W4Ug4gt8t4SrNnt1zckveNu251FUBZFGURMoBOWNseGWx7h wLhc8bBXGQ32IB5X05x4Z+yiVuP1ckpwYwqP3VsofMtuYWLnW3KpkunoxYKOPfdYifJMT/x2 SuWiyM1mq8ei8UGv43iow2Y3W/0+MSREVZujukyYo5Dxl4nDGJCT9H2gWU3Ed4aRGpkZgDc4 iFa8yRgxL1UVvlhaxBhsM1WROr1uafbWNEtqUJuG5Aovz7r5TjLQGyjyG8WGaqoW+5aEQLUj Lj74l8Pus4KYibxMMeaoeuZUqwX8EQpLvy9Pti8UzaESsEZmNav8H48aEiO8XrqlURww6gzN Y3CLZSmCX8TFLtt1j27RKEQzOZzlCw5wGrSQ7H9zgimiObPOiTKFO1daFbePPok6K6koRnO9 4oNPcW9zRgCAvb1ZTPa8NJOIF1TdSo7CJn6ptZ5bOmGJgY6SmgtB+WIneErf4VsgrtfjODF/ TewRxYAmlb4gHTGLySMa2xiMe++A8wg8ChjZSF1ZASmwXkuZ4qr/ZwzTZpvcOl17vFnwN51U +IBJ5eKDMNJR2mV4D8ad5T88NFveRn31wKDOy2pPGo2c5J6Hl2b/9blek3l8CAHEzW9r8wzo Puty1qDE5YEQg1jCufQae6ulg/g4yJCxbgqB0aYcMNOfEjM8ZRxL3KjhPEAI/YKdUfJyAyc2 lvEGhwfv+TM/9Q4/YWbn6yCtIv1QeJyElADTjve5LeycyPe92O+3oVaV+uLOz3ADTum9KKnb ORT7vf9LPxewAcU6dUhSe4zwPJs/cbrqp9b0h9gQifBYWOrPbU8cHOI6s9C6/9WzbhDtArqA U+C97G241lS1B8JzbLQGOYkUghH/fQdmz2U5/A8KVjl7jVw8bnBXFg609xgTsBCBOMdDW/n6 b5JVA0qB8iXgB4jO8uZhDpT+mfKI2Fov2APqMQBGIGy4uY04ggqXHEfYxMaJLmFb9xFL1YgO DiZh+zPmtywA6YEn2UbTRDw4AaWuXjCVN2mArPPy5RlV+cpXsMK4SA=
- Ironport-hdrordr: A9a23:M64Fla4ol0ngpWr9MQPXwN/XdLJyesId70hD6qkDc3xom62j/f xG88526faZskd1ZJhko6HlBEDiexzhHPxOjLX5VI3KNGLbUSmTXeNfBODZogEIdReOldK1mZ 0PT5RD
- Ironport-phdr: A9a23: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
- Ironport-sdr: y7ePeOzKTzjp2OkBVdFfw176HEb6shIvD08eI8f1I5cHpVjXponHbYwC2bzFtG+OgYJCC9FC+i 4GNi2R9NNFHD1yj8JPymB+0mebnXG3xYT0uYDXFiiglfiEwv52LAazblnxA4gv7gh1tJ9aKD9I 9vLgouuGPHU9MU8SyiShEIEkZidBJelDhMAmuOk99OHlsVX3hk/MyBk5X9eEj6Qj6jhTZ2PZp/ EZEe14p4TJXtj9vuTvGyfb0J4+ui0LND4UBDrDP75KoGwYLdbY6wF22atqvcyia6fb1sGcSvKU 45TkyYgfOvjubmP/YmXW1uXy
You might be interested in the paper A
Coq Library For Internal Verification of Running-Times. It
touches on most of the issues you raise.
On 12-07-2022 21:41, mukesh tiwari
wrote:
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+.