{"id":1735,"date":"2012-03-11T10:54:43","date_gmt":"2012-03-11T14:54:43","guid":{"rendered":"http:\/\/scientopia.org\/blogs\/goodmath\/?p=1735"},"modified":"2020-08-04T10:40:00","modified_gmt":"2020-08-04T14:40:00","slug":"interpreting-lambda-calculus-using-closed-cartesian-categories","status":"publish","type":"post","link":"http:\/\/www.goodmath.org\/blog\/2012\/03\/11\/interpreting-lambda-calculus-using-closed-cartesian-categories\/","title":{"rendered":"Interpreting Lambda Calculus using Closed Cartesian Categories"},"content":{"rendered":"<p>Today I&#8217;m going to show you the basic idea behind the equivalency of closed cartesian categories and typed lambda calculus. I&#8217;ll do that by showing you how the \u03bb-theory of any simply typed lambda calculus can be mapped onto a CCC.<\/p>\n<p>First, let&#8217;s define the term &#8220;lambda theory&#8221;. In the simply typed lambda calculus, we always have a set of <em>base types<\/em> &#8211; the types of simple atomic values that can appear in lambda expressions. A <em>lambda theory<\/em> is a simply typed lambda calculus, plus a set of additional rules that define equivalences over the base types.<\/p>\n<p>So, for example, if one of the base types of a lambda calculus was the natural numbers, the lambda theory would need to include rules to define equality over the natural numbers:<\/p>\n<ol>\n<li>x = y if x=0 and y=0; and<\/li>\n<li>x = y if x=s(x&#8217;) and y=s(y&#8217;) and x&#8217; = y&#8217;<\/li>\n<\/ol>\n<p>So. Suppose we have a lambda-theory <img src='http:\/\/l.wordpress.com\/latex.php?latex=L&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='L' style='vertical-align:1%' class='tex' alt='L' \/>. We can construct a corresponding category <img src='http:\/\/l.wordpress.com\/latex.php?latex=C%28L%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='C(L)' style='vertical-align:1%' class='tex' alt='C(L)' \/>. The objects in <img src='http:\/\/l.wordpress.com\/latex.php?latex=C%28L%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='C(L)' style='vertical-align:1%' class='tex' alt='C(L)' \/> are the <em>types<\/em> in <img src='http:\/\/l.wordpress.com\/latex.php?latex=L&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='L' style='vertical-align:1%' class='tex' alt='L' \/>. The arrows in <img src='http:\/\/l.wordpress.com\/latex.php?latex=C%28L%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='C(L)' style='vertical-align:1%' class='tex' alt='C(L)' \/> correspond to <em>families<\/em> of expressions in <img src='http:\/\/l.wordpress.com\/latex.php?latex=L&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='L' style='vertical-align:1%' class='tex' alt='L' \/>; an arrow<br \/>\n<img src='http:\/\/l.wordpress.com\/latex.php?latex=f%20%3A%20A%20%5Crightarrow%20B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='f : A \\rightarrow B' style='vertical-align:1%' class='tex' alt='f : A \\rightarrow B' \/> corresponds to the set of expressions of type <img src='http:\/\/l.wordpress.com\/latex.php?latex=B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='B' style='vertical-align:1%' class='tex' alt='B' \/> that contain a single <em>free<\/em> variable of type <img src='http:\/\/l.wordpress.com\/latex.php?latex=A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A' style='vertical-align:1%' class='tex' alt='A' \/>.<\/p>\n<p>The <em>semantics<\/em> of the lambda-theory can be defined by a <em>functor<\/em>; in particular, a <em>cartesian closed<\/em> functor <img src='http:\/\/l.wordpress.com\/latex.php?latex=F&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='F' style='vertical-align:1%' class='tex' alt='F' \/> that maps from <img src='http:\/\/l.wordpress.com\/latex.php?latex=C%28L%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='C(L)' style='vertical-align:1%' class='tex' alt='C(L)' \/> to the closed cartesian category of Sets. (It&#8217;s worth noting that this is completely equivalent to the normal Kripke semantics for lambda calculus; but when you get into more complex lambda calculi, like Hindley-Milner variants, this categorical formulation is <em>much<\/em> simpler.)<\/p>\n<p>We describe how we build the category for the lambda theory in terms of a CCC using something called an <em>interpretation function<\/em>. It&#8217;s really just a notation that allows us to describe the translation recursively. The interpretation function is written using brackets: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5BA%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[A]' style='vertical-align:1%' class='tex' alt='[A]' \/> is the categorical interpretation of the type <img src='http:\/\/l.wordpress.com\/latex.php?latex=A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A' style='vertical-align:1%' class='tex' alt='A' \/> from lambda calculus.<\/p>\n<p>So, first, we define an object for each type in <img src='http:\/\/l.wordpress.com\/latex.php?latex=L&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='L' style='vertical-align:1%' class='tex' alt='L' \/>. We need to include a special<br \/>\ntype, which we call <em>unit<\/em>. The idea behind unit is that we need to be able to talk about &#8220;functions&#8221; that either don&#8217;t take any real paramaters, or functions that don&#8217;t return anything. Unit is a type which contains exactly one atomic value. Since there&#8217;s only one possible value for unit, and unit doesn&#8217;t have any extractable sub-values, conceptually, it doesn&#8217;t ever need to be passed around. So it&#8217;s a &#8220;value&#8221; that never needs to get passed &#8211; perfect for a content-free placeholder.<\/p>\n<p>Anyway, here we go with the base rules:<\/p>\n<ul>\n<li><img src='http:\/\/l.wordpress.com\/latex.php?latex=%5Cforall%20A%20%5Cin%20%5Cmbox%7Bbasetypes%7D%28L%29%2C%20%5BA%5D%20%3D%20A_C%20%5Cin%20C%28L%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='\\forall A \\in \\mbox{basetypes}(L), [A] = A_C \\in C(L)' style='vertical-align:1%' class='tex' alt='\\forall A \\in \\mbox{basetypes}(L), [A] = A_C \\in C(L)' \/><\/li>\n<li><img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5Cmbox%7Bunit%7D%5D%20%3D%201_C&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\mbox{unit}] = 1_C' style='vertical-align:1%' class='tex' alt='[\\mbox{unit}] = 1_C' \/><\/li>\n<\/ul>\n<p>Next, we need to define the typing rules for complex types:<\/p>\n<ul>\n<li><img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%20A%20%5Ctimes%20B%5D%20%3D%3D%20%5BA%5D%20%5Ctimes%20%5BB%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[ A \\times B] == [A] \\times [B]' style='vertical-align:1%' class='tex' alt='[ A \\times B] == [A] \\times [B]' \/><\/li>\n<li><img src='http:\/\/l.wordpress.com\/latex.php?latex=%5BA%20%5Crightarrow%20B%5D%20%3D%20%5BB%5D%5E%7B%5BA%5D%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[A \\rightarrow B] = [B]^{[A]}' style='vertical-align:1%' class='tex' alt='[A \\rightarrow B] = [B]^{[A]}' \/><\/li>\n<\/ul>\n<p>Now for the really interesting part. We need to look at type derivations &#8211; that is, the type inference rules of the lambda calculus &#8211; to show how to do the correspondences between more complicated expressions. Just like we did in lambda calculus, the type derivations are done with a <em>context<\/em> <img src='http:\/\/l.wordpress.com\/latex.php?latex=Gamma&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='Gamma' style='vertical-align:1%' class='tex' alt='Gamma' \/>, containing a set of <em>type judgements<\/em>. Each type judgement assigns a type to a lambda term. There are two translation rules for contexts:<\/p>\n<ul>\n<li><img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%20%5Cemptyset%20%5D%20%3D%201_C&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[ \\emptyset ] = 1_C' style='vertical-align:1%' class='tex' alt='[ \\emptyset ] = 1_C' \/><\/li>\n<li><img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5CGamma%2C%20x%3A%20A%5D%20%3D%20%5B%5CGamma%5D%20%5Ctimes%20%5BA%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\Gamma, x: A] = [\\Gamma] \\times [A]' style='vertical-align:1%' class='tex' alt='[\\Gamma, x: A] = [\\Gamma] \\times [A]' \/><\/li>\n<\/ul>\n<p>We also need to describe what to do with the values of the primitive types:<\/p>\n<ul>\n<li>For each value <img src='http:\/\/l.wordpress.com\/latex.php?latex=v%20%3A%20A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='v : A' style='vertical-align:1%' class='tex' alt='v : A' \/>, there is an arrow <img src='http:\/\/l.wordpress.com\/latex.php?latex=v%20%3A%201%20%5Crightarrow%20A_C&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='v : 1 \\rightarrow A_C' style='vertical-align:1%' class='tex' alt='v : 1 \\rightarrow A_C' \/>.<\/li>\n<\/ul>\n<p>And now the rest of the rules. Each of these is of the form <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5CGamma%20%3A-%20x%20%3A%20A%5D%20%3D%20%5Cmbox%7Barrow%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\Gamma :- x : A] = \\mbox{arrow}' style='vertical-align:1%' class='tex' alt='[\\Gamma :- x : A] = \\mbox{arrow}' \/>, where we&#8217;re saying that <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5CGamma&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='\\Gamma' style='vertical-align:1%' class='tex' alt='\\Gamma' \/> entails the type judgement <img src='http:\/\/l.wordpress.com\/latex.php?latex=x%20%3A%20A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='x : A' style='vertical-align:1%' class='tex' alt='x : A' \/>. What it means is the object corresponding to the type information covering a type inference for an expression corresponds to the arrow in <img src='http:\/\/l.wordpress.com\/latex.php?latex=C%28L%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='C(L)' style='vertical-align:1%' class='tex' alt='C(L)' \/>.<\/p>\n<ul>\n<li>Unit evaluation: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%20%5B%20%5CGamma%20%3A-%20%5Cmbox%7Bunit%7D%3A%20%5Cmbox%7BUnit%7D%5D%20%3D%20%21%3A%20%5B%5CGamma%5D%20%5Crightarrow%20%5B%5Cmbox%7BUnit%7D%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title=' [ \\Gamma :- \\mbox{unit}: \\mbox{Unit}] = !: [\\Gamma] \\rightarrow [\\mbox{Unit}]' style='vertical-align:1%' class='tex' alt=' [ \\Gamma :- \\mbox{unit}: \\mbox{Unit}] = !: [\\Gamma] \\rightarrow [\\mbox{Unit}]' \/>. (A unit expression is a special arrow &#8220;!&#8221; to the unit object.)<\/li>\n<li>Simple Typed Expressions: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5CGamma%20%3A-%20a%3A%20A_C%5D%20%3D%20a%20%5Ccirc%20%21%20%3A%20%5B%5CGamma%5D%20%5Crightarrow%20%5BA_C%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\Gamma :- a: A_C] = a \\circ ! : [\\Gamma] \\rightarrow [A_C]' style='vertical-align:1%' class='tex' alt='[\\Gamma :- a: A_C] = a \\circ ! : [\\Gamma] \\rightarrow [A_C]' \/>. (A simple value expression is an arrow composing with ! to form an arrow from \u0393 to the type object of Cs type.)<\/li>\n<li>Free Variables: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%20%5B%5CGamma%20x%3A%20A%20%3A-%20x%20%3A%20A%5D%20%3D%20%5Cpi_2%20%3A%20%28%5B%5CGamma%5D%20%5Ctimes%20%5BA%5D%29%20%5Crightarrow%20%5BA%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title=' [\\Gamma x: A :- x : A] = \\pi_2 : ([\\Gamma] \\times [A]) \\rightarrow [A]' style='vertical-align:1%' class='tex' alt=' [\\Gamma x: A :- x : A] = \\pi_2 : ([\\Gamma] \\times [A]) \\rightarrow [A]' \/> (A term which is a free variable of type A is an arrow from the product of \u0393 and the type object A to A; That is, an unknown value of type A is some arrow whose start point will be inferred by the continued interpretation of gamma, and which ends at A. So this is going to be an arrow from either unit or a parameter type to A &#8211; which is a statement that this expression evaluates to a value of type A.)<\/li>\n<li>Inferred typed expressions: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5CGamma%2C%20x%3AA%20%3A-%20x%27%20%3A%20A%27%5D%2C%20x%27%20%5Cneq%20x%20%3D%20%5B%5CGamma%20%3A-%20x%27%3A%20A%27%5D%20%5Ccirc%20%5Cpi_1&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\Gamma, x:A :- x' : A'], x' \\neq x = [\\Gamma :- x': A'] \\circ \\pi_1' style='vertical-align:1%' class='tex' alt='[\\Gamma, x:A :- x' : A'], x' \\neq x = [\\Gamma :- x': A'] \\circ \\pi_1' \/>, where <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5Cpi_1%3A%20%28%5B%5CGamma%5D%20%5Ctimes%20%5BA%5D%29%5Crightarrow%20%5BA%27%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='\\pi_1: ([\\Gamma] \\times [A])\\rightarrow [A']' style='vertical-align:1%' class='tex' alt='\\pi_1: ([\\Gamma] \\times [A])\\rightarrow [A']' \/> (If the type rules of \u0393 plus the judgement <img src='http:\/\/l.wordpress.com\/latex.php?latex=x%20%3A%20A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='x : A' style='vertical-align:1%' class='tex' alt='x : A' \/> gives us <img src='http:\/\/l.wordpress.com\/latex.php?latex=x%27%20%3A%20A%27&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='x' : A'' style='vertical-align:1%' class='tex' alt='x' : A'' \/>, then the term <img src='http:\/\/l.wordpress.com\/latex.php?latex=x%27%20%3A%20A%27&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='x' : A'' style='vertical-align:1%' class='tex' alt='x' : A'' \/> is an arrow starting from the product of the interpretation of the full type context with <img src='http:\/\/l.wordpress.com\/latex.php?latex=A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A' style='vertical-align:1%' class='tex' alt='A' \/>), and ending at <img src='http:\/\/l.wordpress.com\/latex.php?latex=A%27&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A'' style='vertical-align:1%' class='tex' alt='A'' \/>. This is almost the same as the previous rule: it says that this will evaluate to an arrow for an expression that results in type <img src='http:\/\/l.wordpress.com\/latex.php?latex=A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A' style='vertical-align:1%' class='tex' alt='A' \/>.)<\/li>\n<li>Function Abstraction: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5CGamma%20%3A-%20%5Clambda%20x%3AA%20.%20M%20%3A%20A%20%5Crightarrow%20B%5D%20%3D%20%5Cmbox%7Bcurry%7D%28%5B%5CGamma%2C%20x%3AA%20%3A-%20M%3AB%5D%29%20%3A%20%5B%5CGamma%5D%20%5Crightarrow%20B%5E%7B%5BA%5D%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\Gamma :- \\lambda x:A . M : A \\rightarrow B] = \\mbox{curry}([\\Gamma, x:A :- M:B]) : [\\Gamma] \\rightarrow B^{[A]}' style='vertical-align:1%' class='tex' alt='[\\Gamma :- \\lambda x:A . M : A \\rightarrow B] = \\mbox{curry}([\\Gamma, x:A :- M:B]) : [\\Gamma] \\rightarrow B^{[A]}' \/>. (A function maps to an arrow from the type context to an exponential <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5BB%5D%5E%7B%5BA%5D%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[B]^{[A]}' style='vertical-align:1%' class='tex' alt='[B]^{[A]}' \/>, which is a function from <img src='http:\/\/l.wordpress.com\/latex.php?latex=A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A' style='vertical-align:1%' class='tex' alt='A' \/> to <img src='http:\/\/l.wordpress.com\/latex.php?latex=B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='B' style='vertical-align:1%' class='tex' alt='B' \/>.)<\/li>\n<li>Function application: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5CGamma%20%3A-%20%28M%20M%27%29%3A%20B%5D%20%3D%20%5Cmbox%7Beval%7D_%7BC%2C%20B%7D%20%5Ccirc%20%28%5B%5CGamma%20%3A-%20M%3A%20C%20%5Crightarrow%20B%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\Gamma :- (M M'): B] = \\mbox{eval}_{C, B} \\circ ([\\Gamma :- M: C \\rightarrow B]' style='vertical-align:1%' class='tex' alt='[\\Gamma :- (M M'): B] = \\mbox{eval}_{C, B} \\circ ([\\Gamma :- M: C \\rightarrow B]' \/>, <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5CGamma%20%3A-%20%28M%20M%27%29%3A%20B%5D%20%3D%20%5Cmbox%7Beval%7D_%7BC%2CB%7D%20%5Ccirc%20%28%5B%5CGamma%20%3A-%20M%20%3A%20C%20%5Crightarrow%20B%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\Gamma :- (M M'): B] = \\mbox{eval}_{C,B} \\circ ([\\Gamma :- M : C \\rightarrow B]' style='vertical-align:1%' class='tex' alt='[\\Gamma :- (M M'): B] = \\mbox{eval}_{C,B} \\circ ([\\Gamma :- M : C \\rightarrow B]' \/>, <img src='http:\/\/l.wordpress.com\/latex.php?latex=%5B%5CGamma%20%3A-%20M%27%3A%20C%5D%29%3A%20%5B%5CGamma%5D%20%5Crightarrow%20%5BB%5D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='[\\Gamma :- M': C]): [\\Gamma] \\rightarrow [B]' style='vertical-align:1%' class='tex' alt='[\\Gamma :- M': C]): [\\Gamma] \\rightarrow [B]' \/>. (function evaluation takes the eval arrow from the categorical exponent, and uses it to evaluate out the function.)<\/li>\n<\/ul>\n<p>There are also two projection rules for the decomposing categorical products, but they&#8217;re basically more of the same, and this is already dense enough.<\/p>\n<p>The intuition behind this is:<\/p>\n<ul>\n<li><em>arrows<\/em> between types are families of values. A particular value is a particular arrow from unit to a type object.<\/li>\n<li>the categorical exponent in a CC is exactly the same thing as a function type in \u03bb-calculus; and an arrow to an exponent is the same thing as a function value. Evaluating the function is using the categorical exponent&#8217;s eval arrow to &#8220;decompose&#8221; the exponent, and produce an arrow to the function&#8217;s result type; <em>that<\/em> arrow is the value that the function evaluates to.<\/li>\n<li>And the semantics &#8211; called functorial semantics &#8211; maps from the objects in this category, <img src='http:\/\/l.wordpress.com\/latex.php?latex=C%28L%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='C(L)' style='vertical-align:1%' class='tex' alt='C(L)' \/> to the category of Sets; function values to function arrows; type objects to sets; values to value objects and arrows. (For example, the natural number type would be an object in <img src='http:\/\/l.wordpress.com\/latex.php?latex=C%28L%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='C(L)' style='vertical-align:1%' class='tex' alt='C(L)' \/>, and the set of natural numbers in the sets category would be the target of the functor.)<\/li>\n<\/ul>\n<p>Aside from the fact that this is actually a very clean way of defining the semantics of a not-so-simply typed lambda calculus, it&#8217;s also very useful in practice. There is a way of executing lambda calculus expressions as programs that is based on this, called the <a href=\"http:\/\/portal.acm.org\/citation.cfm?id=34883&amp;dl=ACM&amp;coll=portal\">Categorical Abstract Machine<\/a>. The best performing lambda-calculus based programming language (and my personal all-time-favorite programming language), <a href=\"http:\/\/caml.inria.fr\/\">Objective-CAML<\/a> had its first implementation based on the CAM. (CAML stands for categorical abstract machine language.).<\/p>\n<p>From this, you can see how the CCCs and \u03bb-calculus are related. It turns out that that relation is not just cool, but downright <em>useful<\/em>. Concepts from category theory &#8211; like monads, pullbacks, and functors are really useful things in programming languages! In some later posts, I&#8217;ll talk a bit about that. My current favorite programming language, Scala, is one of the languages where there&#8217;s a very active stream of work in applying categorical ideas to real-world programming problems.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today I&#8217;m going to show you the basic idea behind the equivalency of closed cartesian categories and typed lambda calculus. I&#8217;ll do that by showing you how the \u03bb-theory of any simply typed lambda calculus can be mapped onto a CCC. First, let&#8217;s define the term &#8220;lambda theory&#8221;. In the simply typed lambda calculus, we [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[76,32],"tags":[],"class_list":["post-1735","post","type-post","status-publish","format-standard","hentry","category-category-theory","category-lambda-calculus"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p4lzZS-rZ","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts\/1735","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/comments?post=1735"}],"version-history":[{"count":2,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts\/1735\/revisions"}],"predecessor-version":[{"id":3880,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts\/1735\/revisions\/3880"}],"wp:attachment":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/media?parent=1735"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/categories?post=1735"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/tags?post=1735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}