{"id":1306,"date":"2011-02-06T20:50:59","date_gmt":"2011-02-07T01:50:59","guid":{"rendered":"http:\/\/scientopia.org\/blogs\/goodmath\/?p=1306"},"modified":"2011-02-06T20:50:59","modified_gmt":"2011-02-07T01:50:59","slug":"computability","status":"publish","type":"post","link":"http:\/\/www.goodmath.org\/blog\/2011\/02\/06\/computability\/","title":{"rendered":"Computability"},"content":{"rendered":"<p> I just recently realized that I only wrote about computability back in the earliest days of this blog. Those posts have never been re-run, and they only exist back on the original blogger site. When I wrote them, I was very new to blogging &#8211; looking back, I think I can do a much better job now. So I&#8217;m going to re-do that topic. This isn&#8217;t just going to be a re-post of those early articles, but a complete rewrite.<\/p>\n<p> The way that I&#8217;m going to cover this is loosely based on the way that it was first taught to me by a wonderful professor, Dr. Eric Allender at Rutgers, where I went to college. Dr. Allender was a really tremendous professor: he managed to take an area of computer science that could seem hopelessly abstract and abstruse, and turned it into something fun and even exciting to learn about.<\/p>\n<p> Computability is the most basic and fundamental sub-field of theoretical computer science. It&#8217;s the study of what a mechanical computing device can do. Not just what a specific mechanical computing device can do, but what can <em>any<\/em> mechanical computing device do? What are the limits of what you can do mechanically? And once we know the limits, what can we discover about the nature of computation?<\/p>\n<p><!--more--><\/p>\n<p> The study of computability has its roots in mathematical logic. The earliest study of computability was done by logicians that were looking at proofs and provability. The connection there is one of the things that fascinates me: from the outside, why on earth would things like the  Principia Mathematica, which attempted to completely formalize mathematics from first principles, be connected to the theory of how the computer that I&#8217;m typing this article on? Once you understand what&#8217;s going on, it becomes almost <em>obvious<\/em>!<\/p>\n<p> In logic, the process of proof is completely mechanical. You have a set of statements, and a set of inference rules. The inference rules allow you to use the initial statements to produce new statements. The sequence of inference steps that lead to the production of a particular new statement is a proof of that statement. The important thing about logic is that the inference rules are <em>mechanical<\/em>: you don&#8217;t need to know what a statement  <em>means<\/em> to be able to use it in a proof. The inference rules just  describe a syntactic structure in the statements, and tells you what you can produce if you can find an instance of that structure.<\/p>\n<p> For example, one of the classic rules of inference is: given two statements, <img src='http:\/\/l.wordpress.com\/latex.php?latex=A%28x%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A(x)' style='vertical-align:1%' class='tex' alt='A(x)' \/> and <img src='http:\/\/l.wordpress.com\/latex.php?latex=forall%20y%3A%20A%28y%29%20rightarrow%20B%28y%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='forall y: A(y) rightarrow B(y)' style='vertical-align:1%' class='tex' alt='forall y: A(y) rightarrow B(y)' \/>, you can infer <img src='http:\/\/l.wordpress.com\/latex.php?latex=B%28x%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='B(x)' style='vertical-align:1%' class='tex' alt='B(x)' \/>. <em>(Note: a typo in the previous sentence was corrected after being pointed out by commenters.)<\/em> <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' \/> could be <em>any<\/em> predicate at all. It could be &#8220;IsBig&#8221;, or &#8220;IsBlue&#8221;, or &#8220;Simple&#8221;, or &#8220;Less than 8&#8221;, or &#8220;Is cute&#8221;. <img src='http:\/\/l.wordpress.com\/latex.php?latex=x&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='x' style='vertical-align:1%' class='tex' alt='x' \/> could be any object: it could be a person, or it could be a crayon, or it could be an abstract set. It doesn&#8217;t matter.<\/p>\n<p> So you can view the process of proof as computation. And we do. The rallying cry of functional programmers is: &#8220;The program is the proof&#8221;, because a functional program can be read as a (very complicated) proof; and the type system that&#8217;s used to analyze the program <em>is<\/em> a very simple proof.<\/p>\n<p> Anyway, the way that we talk about computability takes a lot from logic. <\/p>\n<p> You can describe the basics of computability in a few different ways. You can take the very strict logical route; you can take the recursive function theory route; or you can take the automata route.  I like to follow the basic way that Prof. Allender taught me, which is the automata version. I like this approach, because as we&#8217;ll see, it gives you an almost tactile sense of the differences between the different classes of computability.<\/p>\n<p> One of the many legacies of the logical roots of computability is that we talk about it in terms of <em>languages<\/em>. We could just as easily talk in terms of <em>functions<\/em> (which is the way that the recursive function theory approach does it), but the logicians that built the foundations worked in terms of languages.<\/p>\n<p> Given a computational problem, you can express it as a language; and you can express solving that problem as determining whether or not a given string is a member of that language. That sounds very abstract &#8211; so let&#8217;s take an example.<\/p>\n<p> Suppose that the problem we want to solve is adding two numbers. Then we can describe it as a language consisting of sentences &#8220;x+y=z&#8221;, where a sentence is a member of the language if and only if the sum of x and y is z. So &#8220;1+2=3&#8221; and &#8220;27+42=69&#8221; are valid strings in the language, but &#8220;19+18=54&#8221; and &#8220;2+4&#8221; are not. (&#8220;2+4&#8221; because it doesn&#8217;t even have the right structure.)<\/p>\n<p> Any formal language can be described using something called a <em>phrase structure grammar<\/em> or <em>Chomsky grammar<\/em> (after Noam Chomsky &#8211; yes, <em>that<\/em> Noam Chomsky, who is a brilliant logician\/linguist as well as a political gadfly.). That means that any computation can be described as a grammar &#8211; which is, in itself, pretty amazing &#8211; but we&#8217;ll get to that in a future post.<\/p>\n<p> A Chomsky grammar consists of four elements:<\/p>\n<ol>\n<li> A set of <em>terminal symbols<\/em> (also called  <em>characters<\/em>). This set is called the grammar&#8217;s <em>alphabet<\/em>. All strings in the language will consist of sequences of terminal symbols.<\/li>\n<li> A set of <em>non-terminal symbols<\/em> (NTSs). <\/li>\n<li> One distinguished member of the set of NTSs, called the <em>start symbol<\/em>.<\/li>\n<li> A collection of <em>replacement rules<\/em> (also called  <em>productions<\/em>). Each replacement rule consists of a left-hand-side and a right-hand-side. The right hand side is a sequence of mixed terminals and non-terminal symbols, or \t\tthe empty string (which is written <img src='http:\/\/l.wordpress.com\/latex.php?latex=epsilon&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='epsilon' style='vertical-align:1%' class='tex' alt='epsilon' \/>).<\/li>\n<\/ol>\n<p> It&#8217;s easiest to explain how this works with an example. We can \tdefine a language that consists of sequences of any number of \t&#8220;1&#8221;s followed by at least one &#8220;2&#8221;:<\/p>\n<ul>\n<li> Terminals: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%7B1%2C%202%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='{1, 2}' style='vertical-align:1%' class='tex' alt='{1, 2}' \/>.<\/li>\n<li> Non-terminals: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%7BS%2C%20A%2C%20B%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='{S, A, B}' style='vertical-align:1%' class='tex' alt='{S, A, B}' \/><\/li>\n<li> Start: <img src='http:\/\/l.wordpress.com\/latex.php?latex=S&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S' style='vertical-align:1%' class='tex' alt='S' \/><\/li>\n<li> Productions:\n<ol>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=S%20rightarrow%20A%20B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S rightarrow A B' style='vertical-align:1%' class='tex' alt='S rightarrow A B' \/><\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=A%20rightarrow%201%20A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A rightarrow 1 A' style='vertical-align:1%' class='tex' alt='A rightarrow 1 A' \/><\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=A%20rightarrow%20epsilon&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='A rightarrow epsilon' style='vertical-align:1%' class='tex' alt='A rightarrow epsilon' \/><\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=B%20rightarrow%202%20B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='B rightarrow 2 B' style='vertical-align:1%' class='tex' alt='B rightarrow 2 B' \/><\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=B%20rightarrow%202&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='B rightarrow 2' style='vertical-align:1%' class='tex' alt='B rightarrow 2' \/><\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<p> So what this says is: you to produce a string in this language, you start with <img src='http:\/\/l.wordpress.com\/latex.php?latex=S&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S' style='vertical-align:1%' class='tex' alt='S' \/>. Then you do whatever productions you want, until you have a\tstring of all terminals, and then you stop. <\/p>\n<p> So you could produce the string &#8220;112222&#8221;:<\/p>\n<ol>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=S&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S' style='vertical-align:1%' class='tex' alt='S' \/> <\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=AB&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='AB' style='vertical-align:1%' class='tex' alt='AB' \/> (Rule 1, replacing <img src='http:\/\/l.wordpress.com\/latex.php?latex=S&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S' style='vertical-align:1%' class='tex' alt='S' \/> by <img src='http:\/\/l.wordpress.com\/latex.php?latex=AB&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='AB' style='vertical-align:1%' class='tex' alt='AB' \/>.)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=1AB&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='1AB' style='vertical-align:1%' class='tex' alt='1AB' \/>$ (rule 2, replacing <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' \/> by <img src='http:\/\/l.wordpress.com\/latex.php?latex=1A&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='1A' style='vertical-align:1%' class='tex' alt='1A' \/>.)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=11AB&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='11AB' style='vertical-align:1%' class='tex' alt='11AB' \/> (rule 2, again)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=11B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='11B' style='vertical-align:1%' class='tex' alt='11B' \/> (rule 3, replacing <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' \/> with the empty string)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=112B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='112B' style='vertical-align:1%' class='tex' alt='112B' \/> (rule 4, repcaing <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' \/> by <img src='http:\/\/l.wordpress.com\/latex.php?latex=2B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='2B' style='vertical-align:1%' class='tex' alt='2B' \/>.)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=1122B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='1122B' style='vertical-align:1%' class='tex' alt='1122B' \/> (rule 4 again)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=11222B&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='11222B' style='vertical-align:1%' class='tex' alt='11222B' \/> (rule 4 again)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=112222&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='112222' style='vertical-align:1%' class='tex' alt='112222' \/> (rule 5, replacing <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' \/> with <img src='http:\/\/l.wordpress.com\/latex.php?latex=2&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='2' style='vertical-align:1%' class='tex' alt='2' \/>.)<\/li>\n<\/ol>\n<p> Another example, is considerably more complex computationally, is paren matching. It produces strings that have the same number of open and close parens &#8211; but not just N opens followed by N closes &#8211; any sequence of opens \tand closes, as long as it ends up matching.<\/p>\n<ul>\n<li> Terminals: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%7B%28%2C%20%29%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='{(, )}' style='vertical-align:1%' class='tex' alt='{(, )}' \/>.<\/li>\n<li> Non-terminals: <img src='http:\/\/l.wordpress.com\/latex.php?latex=%7B%20S%20%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='{ S }' style='vertical-align:1%' class='tex' alt='{ S }' \/><\/li>\n<li> Start: <img src='http:\/\/l.wordpress.com\/latex.php?latex=S&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S' style='vertical-align:1%' class='tex' alt='S' \/><\/li>\n<li> Productions:\n<ol>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=S%20rightarrow%20S%20S&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S rightarrow S S' style='vertical-align:1%' class='tex' alt='S rightarrow S S' \/>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=S%20rightarrow%20%28S%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S rightarrow (S)' style='vertical-align:1%' class='tex' alt='S rightarrow (S)' \/>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=S%20rightarrow%20epsilon&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S rightarrow epsilon' style='vertical-align:1%' class='tex' alt='S rightarrow epsilon' \/><\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<p> For an example of this, we can generate the string &#8220;(()(()()))&#8221;:<\/p>\n<ol>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=S&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='S' style='vertical-align:1%' class='tex' alt='S' \/><\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28S%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(S)' style='vertical-align:1%' class='tex' alt='(S)' \/> (rule 2)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28SS%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(SS)' style='vertical-align:1%' class='tex' alt='(SS)' \/> (rule 1)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28%28S%29S%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='((S)S)' style='vertical-align:1%' class='tex' alt='((S)S)' \/> (rule 2)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28%28%29S%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(()S)' style='vertical-align:1%' class='tex' alt='(()S)' \/> (rule 3)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28%28%29%28S%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(()(S))' style='vertical-align:1%' class='tex' alt='(()(S))' \/> (rule 2)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28%28%29%28SS%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(()(SS))' style='vertical-align:1%' class='tex' alt='(()(SS))' \/> (rule 1)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28%28%29%28%28S%29S%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(()((S)S))' style='vertical-align:1%' class='tex' alt='(()((S)S))' \/> (rule 2)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28%28%29%28%28%29S%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(()(()S))' style='vertical-align:1%' class='tex' alt='(()(()S))' \/> (rule 3)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28%28%29%28%28%29%28S%29%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(()(()(S)))' style='vertical-align:1%' class='tex' alt='(()(()(S)))' \/> (rule 2)<\/li>\n<li> <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28%28%29%28%28%29%28%29%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(()(()()))' style='vertical-align:1%' class='tex' alt='(()(()()))' \/> (rule 3)<\/li>\n<\/ol>\n<p> In computability theory, we talk about four general classes of computability &#8211; and those four classes can each be expressed by using different restrictions on the structure of production rules in Chomsky grammars. They&#8217;re typically talked about in terms of a hierarchy defined by Chomsky:<\/p>\n<dl>\n<dt> Level 3: the regular languages<\/dt>\n<dd>These are very simple languages, which can&#8217;t do anything particularly interesting: no counting, nothing beyond sequencing and repetition. Regular languages can be recognized by a simple kind of machine called a finite state automaton.<\/dd>\n<dt>Level 2: the context free languages (CFLs)<\/dt>\n<dd> These are widely used in practical computer science. They&#8217;re reasonably expressive; you can do a limited kind of counting with them, but nothing too deep. CFLs can be recognized by a machine called a push-down automaton.<\/dd>\n<dt> Level 1: the context sensitive languages (CSLs)<\/dt>\n<dd> Context sensitive languages are the things that can be written a more advanced kind of grammar. You can express a lot of quite deep computation using CSLs. CSLs can be recognized by a very interesting machine: a linear-bounded tape non-deterministic turing machine. Level 1 includes most things that we can really compute: the linear-bounding non-deterministic machine is a pretty good match for the capability of a real computer; level 0 conceptually requires infinite memory.<\/dd>\n<dt>Level 0: the recursively enumerable languages.<\/dt>\n<dd> Anything computable. Level 0 languages are languages which can be <em>accepted<\/em> by a regular, unbounded turing machine.<\/dd>\n<\/dl>\n<p> The Chomsky hierarchy is traditional, but it&#8217;s not perfect. There are a couple of things missing in it; there are some things between level 0 and level 1 in the Chomsky hierarchy.<\/p>\n<p> There&#8217;s also one little cheat in the definition above about level 0. I said that level 0 is equivalent to Turing machines that can <em>accept<\/em> an input. When you get to a machine as sophisticated as a Turing machine, it can do one of two things on a given input: it can accept the input, or it can decide about the input.<\/p>\n<p> Accepting the input means that if the input is a member of the language, it will eventually stop and say &#8220;Yes, this is in my language&#8221;. Deciding about the input means that that the machine will eventually stop and say either &#8220;Yes, this is in my language&#8221;, or &#8220;No, this is not in my language&#8221;. The difference is that an accepting machine does <em>not<\/em> stop if the string is <em>not<\/em> in the language. It might be able to stop and say no sometimes, but there is no guarantee. So it will say &#8220;Yes&#8221; if the string is in the language; it will <em>not<\/em> say no if the string is not in the language. The set of languages that&#8217;s acceptable by a Turing machine are called the Chomsky level-0 languages; the languages <em>decidable<\/em> by a Turing machine are called the <em>recursive<\/em> languages.<\/p>\n<p> In the next couple of posts, we&#8217;ll look at the grammars and corresponding computing machines for the Chomsky levels. Then we&#8217;ll use that as a launching pad for exploring more about computability.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I just recently realized that I only wrote about computability back in the earliest days of this blog. Those posts have never been re-run, and they only exist back on the original blogger site. When I wrote them, I was very new to blogging &#8211; looking back, I think I can do a much better [&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":[94,79],"tags":[107,123,131,172,193],"class_list":["post-1306","post","type-post","status-publish","format-standard","hentry","category-computability","category-computation","tag-automata","tag-chomsky","tag-computability-2","tag-grammar","tag-logic-2"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p4lzZS-l4","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts\/1306","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=1306"}],"version-history":[{"count":0,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts\/1306\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/media?parent=1306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/categories?post=1306"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/tags?post=1306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}