Skip to Content.
Sympa Menu

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

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

[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: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function
  • Date: Thu, 18 May 2023 18:35:23 +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-f182.google.com
  • Ironport-data: A9a23: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
  • Ironport-hdrordr: A9a23:ocCgiq9lWmUiFSJuCPFuk+DVI+orL9Y04lQ7vn2ZKCYlFfBw8v rFoB11726WtN98YhEdcLO7WZVoI0msl6KdiLN5VdyftWLdyQ6Vxe9ZnO/fKv7bdxEWNNQx6U 6tScdD4RTLY2RHsQ==
  • Ironport-phdr: A9a23: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 h9OyrT9f9x73mLT1Elra108l4PPSRO4YA==
  • Ironport-sdr: 646661e9_4kWbuuFGGbOlECDAiwYTvDn+61UxGZS6xVPWAIH5W4oovZf SSjbewoe3IGr1mYf4lDa9Q/W5XNH8ZGqCk1D4Xw==

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