Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function

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: Fri, 19 May 2023 17:45:08 +0100
  • Authentication-results: mail2-smtp-roc.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-lj1-f174.google.com
  • Ironport-data: A9a23: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
  • Ironport-hdrordr: A9a23:CS6pVaiZal6/TpXzWx4Af/GBh3BQXz113DAbv31ZSRFFG/FwyP rCoB1L73XJYWgqM03IwerwXpVoMkmsjKKdgLNhSotKOTOLhILGFvAH0WKP+Vzd8k7Fh5hgPM VbAs9D4bTLZDAU4/oSizPIcOrIteP3lZxA8t2urUuFIzsLV4hQqyNCTiqLGEx/QwdLQbAjEo CH28ZBrz28PVwKc8WSHBA+LqD+juyOsKijTQ8NBhYh5gXLpyiv8qTGHx+R2Qpbey9TwI0l7X POn2XCl+6eWrCAu1XhPl3onthrcejau5R+7Qu3+4YowwDX+0uVjUJaKvy/VX4O0aGSAR0R4a HxSl8bTr9OAjXqDyiISFLWqnPd+Sdr5Hn4xVCCh3z/5cT/WTIhEsJEwZlUax3D9iMbzaNBOY 9wrhKkXqBsfGD9tTW448KNWwBhl0Kyr3ZnmekPj2ZHWY9bbLNKt4QQ8E5cDZ9FRUvBmfQaOf grCNuZ6OddcFucYXyctm5zwMa0VnB2GhudWEANtsGczjATlnFkyEkTwtAZgx47hecAYogB4/ 6BPrVjlblIQMNTZaVhBP0ZSc/yEWDJSQKkChPiHb0mLtB4B5vgke+J3Fxu3pDWRHUh9upPpK j8
  • Ironport-phdr: A9a23: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 Rs/iw84auMopm+E3g==
  • Ironport-sdr: 6467a7a2_VXSlx7rTpq3KHpOKHYr5roL7cZOv0yRHGJpnvumzZeF0W6n m+71KvVYetCPU+H4OPsXaVYEN61AvDvw0INVI8Q==

Thanks Yannick and Mario! I was somehow under a (flawed) assumption
that functions that computes fuel were alway primitive recursive, but
it may or may not be the case. So my understanding is: theoretically
it is possible to turn an non-primitive recursive function into a
primitive recursive function (Kleene's normal form theorem) by means
of using nat as a fuel, but computing the fuel may be as complicated
as computing the original function, i.e., it may not be primitive
recursive. I also came up with a counterexample for my flawed
assumption: I can write a division function on natural numbers using
the subtraction function (I know it is not a great way to write
division function):

Theorem nat_div : nat -> forall (b : nat),
0 < b -> nat * nat.
Proof.
intro a.
cut (Acc lt a);
[revert a |].
+
refine(fix nat_div a (acc : Acc lt a) {struct acc} :
forall b : nat, 0 < b -> nat * nat :=
match acc with
| Acc_intro _ f => fun b Ha =>
match (lt_eq_lt_dec a b) with
| inleft Hb =>
match Hb with
| left Hc => (0, a)
| right Hc => (1, 0)
end
| inright Hb =>
match nat_div (a - b) _ b Ha with
| (q, r) => (S q, r)
end
end
end).
assert (Hc : (a - b) < a).
abstract nia.
exact (f (a - b) Hc).
+
eapply lt_wf.
Defined.

But if I want to turn this into a primitive recursive function by
means of fuel, then computing fuel itself requires a division
function. In conclusion, theoretically it is possible but there could
be a situation where it is not a very good idea for programming
(constructive mathematics?).


Best,
Mukesh



On Thu, May 18, 2023 at 7:12 PM Yannick Forster <yannick AT yforster.de> wrote:
>
> Sure, computing the fuel is not going to be primitive recursive because the
> fuel is large. But given a defined Coq (or any other constructive type
> theory) function f : nat -> nat it can be turned into a primitive recursive
> function f' : nat -> nat -> nat such that f' n x = S v, then for all n' >=
> n, f' n x = S v and forall x, exists n, f' n x = S (f x).
>
> Here, f' is a primitive recursive function expecting fuel n and an argument
> x, and then computes f for large enough fuel (and else returns 0). The n
> might, as you say, have to be very large, but constructing f' is always
> possible.
>
>
> On 18 May 2023 20:04:06 Mario Carneiro <di.gama AT gmail.com> wrote:
>>
>> This doesn't sound quite correct. While Kleene's T tells you that for any
>> terminating computation there is *some* bound for the fuel you need to
>> compute the value, the bound itself might be quite large, and so you are
>> reduced to computing very fast growing functions, to compute the initial
>> fuel value you use to power the rest of the computation. These functions
>> need just as much "power" from the theory as the original recursion did.
>> There are functions which are not primitive recursive, like the ackermann
>> function, and if you rewrite them to use a fuel variable you will need to
>> supply a function which grows about as fast as the ackermann function to
>> get the initial fuel value, and that function is also not primitive
>> recursive.
>>
>> Now, Ackermann's function is computable in Coq because it has higher order
>> functions and hence goes beyond the traditional conception of primitive
>> recursive function, but I think you might still need more than just
>> N-indexed inductions to get the full power of Coq terminating functions.
>> There are inductive types with a much larger rank than N around, and I
>> don't think you can get epsilon_0 induction simply by composing inductions
>> of rank omega.
>>
>> On Thu, May 18, 2023 at 1:48 PM Yannick Forster <yannick AT yforster.de>
>> wrote:
>>>
>>> Hi Mukesh,
>>>
>>> in computability theory this intuition is behind Kleene's normal form
>>> theorem: https://en.m.wikipedia.org/wiki/Kleene%27s_T_predicate
>>>
>>> You can prove the normal form theorem for computable functions in Coq
>>> when defining them using some model of computation. But since given any
>>> concrete Coq function (over natural numbers or some suitable datatype
>>> isomorphic to numbers) you could have implemented it as a function in a
>>> model of computation provided enough time and endurance, this means you
>>> can re-write any definable Coq function as a fueled primitive recursive
>>> function, yes.
>>>
>>> Best
>>> Yannick
>>>
>>> On 18 May 2023 19:35:56 mukesh tiwari <mukeshtiwari.iiitm AT gmail.com>
>>> wrote:
>>>
>>>> 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
>>>
>>>
>



Archive powered by MHonArc 2.6.19+.

Top of Page