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: Vedran Čačić <veky AT math.hr>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Turning Non-Primitive Recursive Function into Primitive Recursive Function
  • Date: Thu, 18 May 2023 19:47:25 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 161.53.8.15) smtp.rcpttodomain=inria.fr smtp.mailfrom=math.hr; dmarc=pass (p=none sp=none pct=100) action=none header.from=math.hr; dkim=pass (signature was verified) header.d=math.hr; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=uA+0ki8AYz9GTVGVdQMv8vM65YSyRfFDNOWfXgYsAcQ=; b=FTRLkKuenBfjK4aSzfCuD+6LaBH3IGtNpcQQoiocZ5ZLLza3uQiHR/WGgFfWgppkZu4sTxiKiNNJlvA4VwiBIaxDGPPxhrx3wBgKqZ9i/gZX9HgtF9AfytWkoEAG33Bib0BdhbFvv19etKFrz8VAvluWzv2HCoGBmIugX1Zckp35qvnbLwaZXuOQTa2A4s37j+LjnLFmQP5peyLdJw0AQXUGwJ8fjfidLfAxUc1hTjIneP1Pf1dO0YwwVOXWB5b0562x42i7goaIoTPg+LYCivq7LtRmmAmOfSllACRcP3zVJqbaBoknN+5vqEvTjWbKbkhvddtsWEltugjkdYTZkg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nEKvpLyRAQeZyy0i33VBxa2tVkmLJ+5iiP8jevxGa9rb7YyT0213kmiaoDbgEMxY0m4Dl2CPdNV3Nxuya83IOMfSab231a3TYOVj7hL/Kf9YU2LhGYn5NltY/5MxABTAFIRj18zhnWfh2eUkbVl2e9whXoc59Lz5sGmWrq88oEcTozXfcAC9JKaYCpAAX+Bw7C+4Q8k3Z5qlCiw6AMeeP1ce/jQddlsd8jjQ9Yu1LS2dIP5JijgHql3r5RZjdl+zHgIqow5pSLmX5znseZEbszFiTJwukezb8x+S3WweJUIRTBjr6R8n9i2zl7LBQIUHqW1AHVIJ+W+3AzdOCxJckQ==
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=veky AT math.hr; spf=Pass smtp.mailfrom=veky AT math.hr; spf=Pass smtp.helo=postmaster AT EUR04-DB3-obe.outbound.protection.outlook.com
  • Ironport-data: A9a23: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
  • Ironport-hdrordr: A9a23:xpIlR68HCU50UfKZg4Ruk+H0db1zdoMgy1knxilNoENuH/Bwxv rFoB1E73TJYVcqKQAdcLW7VNjkfZqyz+8O3WB8B8bYYOCighrREGgA1/qF/9SDIVyDygc178 4JHMYOa+EcFWIbsS+52njALz9J+qj2zEnCv5ag854Cd3AVV0hV1XYLNu/XKDw8eOCEP+taKL OsouRCrzqkPVINbsq6AXEBG8zOvcfCmp6jQTNuPW9b1OBDt0LN1JfKVzyjmjsOWTJGxrkvtU DDjgzC/62m98q2zxfNvlWjmai/zLHaq+drNYipsIw4Oz/sggGnaMBKQLuZpg04p+mp9RIDjM TMiw1IBbUy11rhOkWO5Tf90Qjp1zgjr1X4z0WDvHflqcvlABonFst6g55DeBex0TtggDhF6t MJ44uljesZMfqAplWw2zHwbWAmqqNgmwttrQYR50YvJrf2JoUh77D3x3klZKvoLBiKmrzPL9 Meef00xMwmOG9yPEqp9lWHhubcFEjb1y32JXQ/hg==
  • Ironport-phdr: A9a23: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
  • Ironport-sdr: 646664e1_M4Mnw2PmX9dyQDVJE+1ohd896yZY1NCq6ZG++M0NoS73MC+ p0DYGn/w7ooQ92MKJLywF3COUQEY6rhNk/Bc2VQ==

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? 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.

č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ć



Archive powered by MHonArc 2.6.19+.

Top of Page