coq-club AT inria.fr
Subject: The Coq mailing list
List archive
Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function
Chronological Thread
- From: mukesh tiwari <mukeshtiwari.iiitm AT gmail.com>
- To: coq-club AT inria.fr
- Subject: Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function
- Date: Wed, 24 May 2023 17:51:17 +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-lf1-f49.google.com
- Ironport-data: A9a23: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 QAIeIyPfK13pYMd3yqtl7651Sz1ZA/S8gg=
- Ironport-hdrordr: A9a23:M1my4KCQQTIdL+DlHemJ55DYdb4zR+YMi2TDt3oadfUzSL3hqy nOpoVh6faQslkssR4b9+xoVJPhfZqkz+8T3WBJB8bFYOCEghrQEGgB1/qB/9SIIUSXndKxzZ 0MT0EUMqySMbEVt6fHCXGDYrId6ejCyYGQoc//6ltXCSxJS4UI1WtE432gYyhLeDU=
- Ironport-phdr: A9a23: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 B5amNsQyKwcM4T63wppbVwoxOz3
- Ironport-sdr: 646e4092_w0CqZ8uFDTSaItMQbOjAnLQ4Gth2dCRBkC4HrROjHjfuzbX IIbn9IFlHj3haTad6+moDQ3UJaGl+p+eqP9mNVA==
Hi Vedran,
"> I'm not sure I understand... do you intend to pass a fixed number
as a fuel, or to calculate fuel from other arguments of a function?"
So when I asked this question, it did not occur to me that I needed to
take fuel computation also into consideration. In my limited
experience of using Coq, it is always the second case, "computing the
fuel from arguments of a function", e.g., in computing the byte_list
function, I need (log256 np) amount of fuel for a (binary) natural
number np. But I never came across any interesting function that just
takes a fixed number (independent of function input) as fuel, so I
guess it was never in my mind but of course, it was not explicit in
the question.
"In the first case, of course, you can compute only a finite segment
of your intended function. In the second case, how is the function
that calculates the fuel needed, classified? If the fuel-calculating
function itself is primitive recursive, then yes, the function using
that fuel is also primitive recursive (consequence of Kleene's normal
form, plus bounded minimization). But for example Ackermann's function
uses too much fuel to be expressible as a primitive recursive
function."
Yep, this is also my understanding.
Best,
Mukesh
>
> čet, 18. svi 2023. u 19:36 mukesh tiwari <mukeshtiwari.iiitm AT gmail.com>
> napisao je:
>>
>> Hi everyone,
>>
>> Is it always possible to turn a non-primitive (terminating) recursive
>> function into a primitive recursive function by passing a natural
>> number as a fuel? If so, is there any formal underpinning for this,
>> i.e., turning a non-primitive (terminating) recursive function into a
>> primitive recursive function by passing a natural number, or is it
>> just obvious? My intuition says it's true but I am very keen to see
>> some formal reasoning.
>>
>> For example, I can write a function that computes a byte list from a
>> (binary) natural number like this [1] (I call it non-primitive
>> (terminating) recursive function but I may not be correct with my
>> terminology):
>>
>> Definition length_byte_list_without_guard : N -> list byte.
>> Proof.
>> intro np.
>> cut (Acc lt (N.to_nat np));
>> [revert np |].
>> +
>> refine(fix length_byte_list_without_guard np (acc : Acc lt (N.to_nat
>> np))
>> {struct acc} :=
>> match acc with
>> | Acc_intro _ f =>
>> match (np <? 256) as npp
>> return _ = npp -> _
>> with
>> | true => fun Ha => List.cons (np_total np Ha) List.nil
>> | false => fun Ha =>
>> let r := N.modulo np 256 in
>> let t := N.div np 256 in
>> List.cons (np_total r _) (length_byte_list_without_guard t _)
>> end eq_refl
>> end).
>> ++
>> apply N.ltb_lt, (nmod_256 np).
>> ++
>> apply N.ltb_ge in Ha.
>> assert (Hc : (N.to_nat t < N.to_nat np)%nat).
>> unfold t. rewrite N2Nat.inj_div.
>> eapply Nat.div_lt; try abstract nia.
>> exact (f (N.to_nat t) Hc).
>> +
>> apply lt_wf.
>> Defined.
>>
>> But I can also write the same function by passing a natural number [2]
>> (from top level,
>> I just need to ensure the right amount of fuel):
>>
>> Fixpoint byte_list_from_N_fuel (n : nat) (up : N) : list byte :=
>> match n with
>> | 0%nat => [np_total (N.modulo up 256) (nmod_256_dec up)]
>> | S n' =>
>> let r := N.modulo up 256 in
>> let t := N.div up 256 in
>> List.cons (np_total r (nmod_256_dec up)) (byte_list_from_N_fuel n' t)
>> end.
>>
>> Best,
>> Mukesh
>>
>> [1] https://github.com/mukeshtiwari/Coq-automation/blob/master/Opaque.v#L75
>> [2]
>> https://github.com/mukeshtiwari/Formally_Verified_Verifiable_Group_Generator/blob/main/src/Sha256.v#L239
>
>
>
> --
> Vedran Čačić
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, (continued)
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, Xavier Leroy, 05/19/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, mukesh tiwari, 05/19/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, Xavier Leroy, 05/20/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, Gaëtan Gilbert, 05/20/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, mukesh tiwari, 05/19/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, Xavier Leroy, 05/19/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, Vedran Čačić, 05/22/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, mukesh tiwari, 05/22/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, Mario Carneiro, 05/19/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, Hugo Herbelin, 05/22/2023
- Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function, mukesh tiwari, 05/24/2023
Archive powered by MHonArc 2.6.19+.