From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id BCBB6E7799 for ; Thu, 1 Sep 2022 14:13:24 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=garrigue@math.nagoya-u.ac.jp; spf=None smtp.mailfrom=garrigue@math.nagoya-u.ac.jp; spf=None smtp.helo=postmaster@ms.math.nagoya-u.ac.jp Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of garrigue@math.nagoya-u.ac.jp) identity=pra; client-ip=133.6.130.11; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="garrigue@math.nagoya-u.ac.jp"; x-sender="garrigue@math.nagoya-u.ac.jp"; x-conformance=sidf_compatible Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of garrigue@math.nagoya-u.ac.jp) identity=mailfrom; client-ip=133.6.130.11; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="garrigue@math.nagoya-u.ac.jp"; x-sender="garrigue@math.nagoya-u.ac.jp"; x-conformance=sidf_compatible Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of postmaster@ms.math.nagoya-u.ac.jp) identity=helo; client-ip=133.6.130.11; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="garrigue@math.nagoya-u.ac.jp"; x-sender="postmaster@ms.math.nagoya-u.ac.jp"; x-conformance=sidf_compatible IronPort-SDR: qoSbcXhoHNuv3BYnYDnYyi/9mxrJPq7t6tSJ5jmCLIKk3wo/LDOu+g0CSrhCV5NwAKXPwKfYBo j8TPwe1ARsvnIEYNiL1OtWS8L4AAM1pnP4KliYDdLpTlz9VH5b+QxHSgQ3ry270xFRKbFU8GoO C+Lzah3uTCw7zj5YlfIfTpJE3esER80b3ghbyn8ZPMfrbSwhdTY0BMI3+OyOLUDNeL2SBqghRL jnJyAaIXfi5dsxbnitq6FfPHIj95xmt6i+PSTZs/haRMzqE9BmOQl5LSRxnv8nsnIsVy+mQFGZ wa146nrndoCJUzpPN2qg46ug X-IPAS-Result: =?us-ascii?q?A0BTAAD3oBBjlwuCBoVaFgcBAQEBCQESAQUFAUCBPgUBC?= =?us-ascii?q?wGCI4EBViwDBAtFhE6IfogSA4skk1sCCQEDAQ0sBw8EAQGCE4J0AoRlHgYGM?= =?us-ascii?q?wYOAQIEAQEBAQMCAwEBAQEBAQMBAQUBAQECAQECBAQBEwEBAQEBAQEBNgUQT?= =?us-ascii?q?mRogU+BegYEMA2CNSkBg2MBAQEBAgEBIgQZAQE3AQQLCQIMDAICJgICIQcvB?= =?us-ascii?q?hOCfQGCbQMNJQIRjh+bHHp/MoEBgggBAQaCYII5DSsmToEkCYERLAGGewMbU?= =?us-ascii?q?4N0hDhDgg2BPByCZz6CIEIBAoE2KYNWN4IuhBGTITgDCQQHBSweQgMLHw4WM?= =?us-ascii?q?xoDFAMFGAwHAxkPIw0NBBYHDAMDBSUDAgIbBwICAwIGFQUCAjUYOAgECAQrG?= =?us-ascii?q?wgPBQIHLwUELwIeBAUGEQgCFgIGBAQEBBUCEAgCCCYXBxMzGQEFWRAJIRwOG?= =?us-ascii?q?g0FBhMDIG0FBz4PKDM1OSsdGwqBDyooFQMEBAMCBhMDAyICECwxFAYpExItB?= =?us-ascii?q?yt1CQIDImgFAwMEKiwDCUAHKCY8B1k6AQQDAxAiPQYDCQMCJ1x9lGGBP4IQg?= =?us-ascii?q?TEGAQEFSkIHdo5FB4Q5FpAznWhug1yEBx2FKYFejQOBdIYEBCMLg3aBUIsAm?= =?us-ascii?q?DAdlmqNOYNjkQgvP4RPNYFCJIFbTTg7KgGCPAk1EAECAQIBDAECAgECAQIBA?= =?us-ascii?q?gEIAQECAY4cGYUXgUiCDoVZNTECOQIGAQoBAQMJiAqCSAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:vLQOK6hmkFSqmOAlQnAWGZM9lXBQXvkji2hC6mlwRA09TyVXrb HMoB19726XtN9xYhwdcLW7UpVoLkm9yXcY2+cs1PKZPTUOxlHYSb2KnLGP/9SIIUSXndK1l5 0QF5SWY+eeMbEVt7ec3OE2fuxQueVviJrY49s2100dMD2CdZsQlTuR1TzranGflWF9dOEEKK Y= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,280,1654552800"; d="scan'208";a="22605462" X-MGA-submission: =?us-ascii?q?MDEVTE2oGkW14Qxh7yKYhR5yEl3tEdugV9EGdD?= =?us-ascii?q?+l/3VpCVhgjEa14mrskAX6qk+mH+yWkiRHYEPhWjBTCcVncviKOwqpcp?= =?us-ascii?q?yhEVKk1KcS2uEfF0/RYkJFt74gcOobjkTvhDHKIcqIOMH3uhdaci42jW?= =?us-ascii?q?vzPDY970K63JE97BL/A64CYA=3D=3D?= Received: from bsd20.math.nagoya-u.ac.jp (HELO ms.math.nagoya-u.ac.jp) ([133.6.130.11]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Sep 2022 14:13:23 +0200 Received: from smtpclient.apple (bsdserver10-alias1.math.nagoya-u.ac.jp [172.16.62.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ms.math.nagoya-u.ac.jp (Postfix) with ESMTPSA id C6FCA16B5F70; Thu, 1 Sep 2022 21:13:19 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=math.nagoya-u.ac.jp; s=20160220; t=1662034399; bh=Az5NtdBSoQvoTJw24ak/j1GVmFTVZr0OgKElOi/+x+I=; h=Subject:From:In-Reply-To:Date:Cc:References:To; b=LhDfCblxc65exdNRJt5Cyh3F1ELJ6sGEHZj1j4BUX1xZGTCNPYjg7Qdrtjz2uMzoE lGidCoZMReq6Ty00nnX0Po+m+7fijCPtp9312HeYUu+mWpShsRat8BCFxLM3GWreCr MQ0uj68sFyBkpz3uxhY9Dxkew93u7NgNRwY6EYyg= Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3696.120.41.1.1\)) From: Jacques Garrigue In-Reply-To: Date: Thu, 1 Sep 2022 21:13:19 +0900 Cc: Mailing List OCaml Content-Transfer-Encoding: quoted-printable Message-Id: References: <25e68e2c-04d2-7764-e189-00812c08a34a@inria.fr> <11E3A59A-BD33-4EC0-9FAD-711A1EACA35E@gmail.com> To: Aaron Gray X-Mailer: Apple Mail (2.3696.120.41.1.1) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.6.2 (ms.math.nagoya-u.ac.jp [0.0.0.0]); Thu, 01 Sep 2022 21:13:19 +0900 (JST) X-Virus-Scanned: clamav-milter 0.99.2 at bsdserver20 X-Virus-Status: Clean X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on bsdserver20.math.nagoya-u.ac.jp Subject: Re: [Caml-list] coinductive data types Hi Aaron, No, there is no physical coercion involved. Polymorphic variants have a uniform representation of constructor tags (through a hashing function) so that (`Cons(1, lazy `Nil)) has always = the same representation, be it as int seqc or int aseqc. So we are just talking about the different types the same value can be = given. Jacques > 2022/08/31 12:22=E3=80=81Aaron Gray = =E3=81=AE=E3=83=A1=E3=83=BC=E3=83=AB: >=20 > Jacques, >=20 > I will get a raw OCaML Docker image, and have a play with this. >=20 > What is going on there, does ':>' return a conversion function as well > as being 'true' and secondly a predicate ? >=20 > Thanks, >=20 > Aaron >=20 >=20 >=20 > On Wed, 31 Aug 2022 at 02:15, Jacques Garrigue > wrote: >>=20 >> Hello Aaron, >>=20 >> If you are interested in the subtyping already available inside = OCaml, >> it provides width subtyping for both objects and polymorphic = variants. >> Polymorphic variants are algebraic datatypes, but their equality is >> structural rather than nominal, and they are limited to regular type >> definitions. >>=20 >> For instance, the following subtyping on two variants of potentially = infinite >> streams is available: >>=20 >> type 'a seq =3D 'a seqc lazy_t and 'a seqc =3D [`Nil | `Cons of 'a * = 'a seq] >> type 'a aseq =3D 'a aseqc lazy_t >> and 'a aseqc =3D ['a seqc | `App of 'a aseq * 'a aseq] >> let sub x =3D (x : 'a seq :> 'a aseq) >> (* val sub : 'a seq -> 'a aseq *) >>=20 >> Jacques Garrigue >>=20 >> 2022/08/30 21:33=E3=80=81Aaron Gray = =E3=81=AE=E3=83=A1=E3=83=BC=E3=83=AB: >>=20 >> On Tue, 30 Aug 2022 at 12:12, Xavier Leroy >> wrote: >>=20 >>=20 >> On Tue, Aug 30, 2022 at 9:24 AM Fran=C3=A7ois Pottier = wrote: >>=20 >>=20 >>=20 >> Hello, >>=20 >> Le 29/08/2022 =C3=A0 17:43, Aaron Gray a =C3=A9crit : >>=20 >> Does either ML or OCaML have coinductive data types ? And if so could >> you please point me at the/some appropriate documentation on them. >>=20 >>=20 >> ML and OCaml have algebraic data types, which are recursive (that is, >> more general than inductive and co-inductive types). Algebraic data >> type definitions are not subject to a positivity restriction, and >> algebraic data types can be constructed and deconstructed by = recursive >> functions, which are not subject to a termination check. >>=20 >>=20 >> Hello Xavier, >>=20 >> Thanks for putting me straight on that. >>=20 >> My original path of inquiry which I should have actually stated was >> regarding how to go about implementing subtyping of mutually = recursive >> algebraic data types. >>=20 >> I am looking on how to go about this and using coinduction and >> bisimulation seemed like the best fit or correct way to go about = this. >>=20 >> Does OCaML use/handle subtyping of mutually recursive algebraic data >> types ? And if so, is its implementation easily accessible ? >>=20 >> If you want to see a typical example of a "co-inductive" data = structure >> encoded in OCaml, I suggest to have a look at "sequences", which can = be >> described as potentially infinite lists: >>=20 >> https://v2.ocaml.org/api/Seq.html >>=20 >> Lazy evaluation (type Lazy.t) can also be used to define coinductive = data structures. >>=20 >> For concreteness, here are two definitions of the type of streams = (infinite lists) : >>=20 >> type 'a stream =3D unit -> 'a streamcell and 'a streamcell =3D { = head: 'a; tail: 'a stream } >> type 'a stream =3D 'a streamcell Lazy.t and 'a streamcell =3D { head: = 'a; tail: 'a stream } >>=20 >> and of the stream of integers starting from n : >>=20 >> let rec ints n =3D fun () -> { head =3D n; tail =3D ints (n + 1) } >> let rec ints n =3D lazy { head =3D n; tail =3D ints (n + 1) } >>=20 >>=20 >> Thank you, yes I am familiar with this type of usage. >>=20 >> Regards, >>=20 >> Aaron >>=20 >>=20 >>=20 >> Hope this helps, >>=20 >> - Xavier Leroy >>=20 >>=20 >>=20 >> -- >> Fran=C3=A7ois Pottier >> francois.pottier@inria.fr >> http://cambium.inria.fr/~fpottier/ >>=20 >>=20 >>=20 >>=20 >> -- >> Aaron Gray >>=20 >> Independent Open Source Software Engineer, Computer Language >> Researcher, Information Theorist, and amateur computer scientist. >>=20 >>=20 >=20 >=20 > --=20 > Aaron Gray >=20 > Independent Open Source Software Engineer, Computer Language > Researcher, Information Theorist, and amateur computer scientist.