Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] Recursive call on a non-recursive argument of constructor.

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] Recursive call on a non-recursive argument of constructor.


Chronological Thread 
  • From: Li-yao Xia <lysxia AT gmail.com>
  • To: Burak Ekici <ekcburak AT hotmail.com>
  • Cc: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Recursive call on a non-recursive argument of constructor.
  • Date: Tue, 29 Aug 2023 13:06:56 +0100
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=lysxia AT gmail.com; spf=Pass smtp.mailfrom=lysxia AT gmail.com; spf=None smtp.helo=postmaster AT mail-wr1-f51.google.com
  • Ironport-data: A9a23:hcCtgqnqMR78Ts/A81GoOyXo5gzgI0RdPkR7XQ2eYbSJt1+Wr1Gzt xIZWjuDOquKNjCjKth3atixoU8DvZbTz4I3TQprrSwwEFtH+JHPbTi7BhepbnnKdqUvb2o+s p5AMoGYRCwQZiWBzvt4GuG59RGQ7YnRGvymTrSs1hlZHWdMUD0mhQ9oh9k3i4tphcnRKw6Ws LsemeWGULOe82Ayajh8B56r8ks156yi4mJA5zTSWNgS1LPgvylNZH4gDfrpR5fIatE8NvK3Q e/F0Ia48gvxl/v6Io7Nfh7TKyXmc5aKVeS8oiI+t5uK3nCukhcPPpMTb5LwX6v4ZwKhxLidw P0V3XC5pJxA0qfkwIzxWDEAe81y0DEvFBYq7hFTvOTKp3AqfUcAzN0wE1ETAt1G+9xxIk1ux OAkCmkpYjGq0rfeLLKTEoGAh+wmJcjveZwF4zRukGifAvEhTpTOBa7N4Le03h9q3pEITauYP ZBAL2c2BPjDS0Un1lM/DIMljOahrnb6ejxc7lmSoMLb5kCKllcriee2aoS9ltqiX5pwhhing mn6o0/7PiggOMHAyySv2yf57gPItWahMG4IL5Wz8ecvi1mOzEQIGRgOXB26p+O4gwiwQbpix 1c8/yMvqe0t7hXuQISkGRK/p3GAs1gXXN84//AG1TxhA5H8u26xblXohBYbADD/nJ5tHW4Zx RWSksn3BDdilrSQRDjPvv2XtD6+c2xdZ2MLeSZOH0NP7sjBsbMDqEvFbu9iN6qp0fzzOzX7m A6RoAYE2r48sM8s1oeAx27hvQ6CnJbzc1MK1l3lZV79tgJdT6y5VrOs8mnevKphLp7Gb1yvv 0okusm57cIIB66jjCamHecHRumow92nMzTsp0FlMLd81jaq+l+lJZtx5hMnLmhXE880Qx3bS 26NhhFwvbh4I2mPQZJsRb6IG+AG7PTFBMv0cPL5df9MacVBTxCG9yRQekKg5WDhv0wym6UZO 53AU8KTIVsFKKZg3hykbvw81OI1+yUA2m/jf5D34BC52764ZnTOa7MkMkOLX98p/pG/vwTZ3 NZOBfSkkywFfrXFXRDW1ooPIXQhD3sxX8n2ovMKUN+zGFNtHWV5BsLBxb8kRZdeoJ1UseX2r 1WdQU5TzWTtiULXcTuqbm9RU5KxfJJdg09iAwkSEweJ4UUzWaeu86YVSLUvd5YF6uFI7KB5X tsFSeq6E9VNTTXNxBoFZ7Kk94dgWQiZhz+eGy+pfjJlc4VSfFHL8IW8fy/E1ioHPgyov+QQ/ pyi0QL6R8IYZgJAVcz5VtOm/2mTj1M8xt1gelTuI8ZCXnns/KxBCT3DvtVuL+4icRz8lyanj SCIChImlMzxio4S8uiRo5ubro2sQtBMLmADE0b1tb+JZDTnpEy9yop9UcGNTzDXdEXw3I6AP ex17fXNAMcrrWZwkbhXMuhUlPolxt7VubVl4BxuHyzLY3SVG7pQGCS68vcVhJJd5I1ymFWQa hqU98h4KIe5HprvMGQsKToPasWB0vApmQfu08klHXWi5AJK+OuobEYDGTiNly1XE5VtOqwH3 +oKmZAb+i6/uDUQI/eEiSFmrT2MJ0MfTpR95407AZDquCUv2FptcZzRMQ6owZCtOvFnEFgmH S+Qv4XG349j/0vld2EiM0TCxs9PrM0qlC0S6WQdNnOlv8HghM4n+DFwqhMJFh90yDdD2MJNY llbDVV/f/iyzm05lfp9UHCJMCAfIQ+S5Wja6UYDzU/dRGmWDl39FnU3Y7uxzRpI4lBnX2Zp+ Z+DwzzYShfsRsb62xUyVWNDq/DOSd9Q9BXIqPu4HvaqToULXj74vpCAPWY4iQPrIccUtn31o eNH+OVRa6qiOxBJ8ud/Q8Of2K8LQR+JGH1aTLsztOkVFGXbY3ep1SLIN0m1fdhXKufX9VOjT fZjPd9LSw/0wRPmQur33kLQC+QccD8VCNs+lnfDIGcHt/6AtGMsvs+JsCf5g2AvTpNllsNVx kY9sd6dOjT4uJeWszalQAp41q6QbtwNZQm61+ewmAnMP4xWq/liKCnezZPt10h482JbE9a8s wbKZquQxOtnoWipc00ADY0bbziJxRjPuChkPex9XxmirT8CDCsWiz4olw==
  • Ironport-hdrordr: A9a23:cShGcaCRN39f35DlHemP55DYdb4zR+YMi2TDGXoBNCC9Afbo7v xG/c5rtiMc7Qx6ZJhOo6HkBEDtewKnyXcx2/hsAV7AZniDhILLFvAB0WKK+VSJcE3DH6xmpN xdmsBFaeEYZmIK6/oSjjPIa+rIjOP3l5xARt2z856ud2xXgm1bgDuRwzz0LnFL
  • Ironport-phdr: A9a23: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 4qX/EocADhH+tPQu8AbApqNQP8=
  • Ironport-sdr: 64eddf6b_4tHCSY7SMxAcrp7f+rikWgXn8HaG4FbX8A6Yj7DPArHOkG/ A3IcoBLoUtpx1NX/OpkkMRi7kJH35VO20NW9ClA==

Hi Burak,

When using cofix (or fix) for nested recursive types, there is an additional subtlety that the allowed positions for guarded calls are determined by the coinductive type being produced. In this case, a cofix producing a stream can only make a recursive call in the tail, not the head of the stream.

The workaround is to define a cofix on U first, which may then contain a cofix on stream U. This usually involves a bit of code duplication which can be refactored with an intermediate definition. See code below.

There's an equivalent situation with inductive types, described in this CPDT chapter (section Nested Inductive Types): http://adam.chlipala.net/cpdt/html/Cpdt.InductiveTypes.html

Cheers,
Li-yao

---

CoInductive stream (A: Type): Type :=
  | nils : stream A
  | conss: A -> stream A -> stream A.

Arguments nils {_}.
Arguments conss {_} _ _.

CoInductive T: Type :=
  | c1: T
  | c2: list T -> T.

CoInductive U: Type :=
  | c3: U
  | c4: stream U -> U.

Definition MkT2Us (T2U : T -> U) (s : T) : stream U :=
  match s with
  | c1 => conss c3 nils
  | c2 l =>
    let cofix next l :=
      match l with
      | nil => nils
      | cons u xs => conss (T2U u) (next xs)
      end
    in next l
  end.

CoFixpoint T2U (s : T) : U :=
  let T2Us := MkT2Us T2U in
  c4 (T2Us s).

Definition T2Us : T -> stream U :=
  MkT2Us T2U.



On 2023-08-29 9:05 AM, Burak Ekici wrote:

Dear All,

I am trying to implement a corecursive function T2U: T -> U in the following manner:

CoFixpoint T2U (s: T): stream U :=
  match s with
    | c1   =>  conss c3 nils
    | c2 l =>
      let cofix next l :=
        match l with
          | nil       => nils
          | cons u xs => conss (c4 (T2U u)) (next xs)
        end
      in next l
  end.

Coq however rejects the definition raising "Recursive call on a non-recursive argument of constructor -- c4 (T2U u)" error. It is due to the violation of the guardedness condition as it gets accepted when the guard check is disabled. How can I work this around? Any advice or insights would be greatly appreciated.

Here are the definitions for the types T, U, and the stream used in the implementation:

CoInductive stream (A: Type): Type :=
  | nils : stream A
  | conss: A -> stream A -> stream A.

Arguments nils {_}.
Arguments conss {_} _ _.

CoInductive T: Type :=
  | c1: T
  | c2: list T -> T.

CoInductive U: Type :=
  | c3: U
  | c4: stream U -> U.

Thanks a lot.

Yours,

Burak.




Archive powered by MHonArc 2.6.19+.

Top of Page