{"id":297,"date":"2024-04-02T15:55:17","date_gmt":"2024-04-02T13:55:17","guid":{"rendered":"https:\/\/actilud.com\/info\/en\/?p=297"},"modified":"2025-04-02T15:55:43","modified_gmt":"2025-04-02T13:55:43","slug":"the-turing-machine-programmer-challenges","status":"publish","type":"post","link":"https:\/\/actilud.com\/info\/en\/the-turing-machine-programmer-challenges\/","title":{"rendered":"The Turing Machine: Programmer Challenges"},"content":{"rendered":"<h1>Adding sticks<\/h1>\n<p>Stick arithmetic is probably the easiest to implement with a Turing machine. The collection to use is C={ \u2610, |, X, =, +}.<\/p>\n<p>We write an addition on the strip with sticks, for example: ||||+||=<\/p>\n<p>The result should be of the form: ||||+||=||||||<\/p>\n<p>Start on the = sign or on the stick immediately to the right, as you wish. End on the first blank to the right of the answer.<\/p>\n<details open=\"\">\n<summary>Description<\/summary>\n<p>The head first goes to the left. If it encounters an X, the + sign, or the = sign, it continues left. If it encounters a stick, it transforms it into an X and moves right until it encounters a blank. There, it writes an X and begins moving left again. If it encounters a blank while going left, it returns to the right, transforming all the Xs into sticks, and stops at the first blank.<\/p>\n<\/details>\n<h1>Universal decrement of a natural number<\/h1>\n<p>We often need to evaluate the value of a number, and the easiest way to do this with the Turing machine is to <em>decrement<\/em> the number. We are going to create a Turing machine that can be reused in larger programs. This involves decrementing a natural number placed on the tape by one digit per square. If the integer reaches its final value, 0, then the 0 must be erased; if there are several consecutive 0s remaining, they must all be erased. The program <em>must<\/em> stop on the last digit, or on the last blank it has written if it has erased everything. Why? Because another program that uses our machine must &#8220;know&#8221; whether the machine has performed a decrement or not. As long as it stops on a digit, it means that the decrement has taken place. If it stops on a blank, it means that the decrement is complete. This is how our machine passes the information to the calling machine.<\/p>\n<p>Our machine must also allow for the possibility that there may be signs other than blanks on either side of the number. We therefore prefer to use the sign \u2200 to identify any sign other than the digits.<\/p>\n<p>Here are some examples; the position of the head indicates the starting point and the ending point.<\/p>\n<figure id=\"attachment_1961\" class=\"wp-caption aligncenter\" aria-describedby=\"caption-attachment-1961\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1961 size-full\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_decrementer.png\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_decrementer.png 500w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_decrementer-300x221.png 300w\" alt=\"\" width=\"500\" height=\"369\" data-src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_decrementer.png\" data-srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_decrementer.png 500w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_decrementer-300x221.png 300w\" data-sizes=\"(min-width: 960px) 75vw, 100vw\" \/><figcaption id=\"caption-attachment-1961\" class=\"wp-caption-text\">Head positions before and after treatment.<\/figcaption><\/figure>\n<details open=\"\">\n<summary>Solution: The Decrement Machine (spoiler)<\/summary>\n<blockquote><p>Machine: [Decrementer]<br \/>\n# Decrements a natural number. If there are any remaining 0s, replace them with blanks. Always stops on the last digit, or the blank.<br \/>\n# Start: on the rightmost data item<br \/>\n# End: on the rightmost data item<\/p>\n<p>State: Decrement<br \/>\nDecrement, 9 , 8 , \u2192 , transitRight<br \/>\nDecrement, 8 , 7 , \u2192 , transitRight<br \/>\nDecrement, 7 , 6 , \u2192 , transitRight<br \/>\nDecrement, 6 , 5 , \u2192 , transitRight<br \/>\nDecrement, 5 , 4 , \u2192 , transitRight<br \/>\nDecrement, 4 , 3 , \u2192 , transitRight<br \/>\nDecrement, 3 , 2 , \u2192 , transitRight<br \/>\nDecrement, 2 , 1 , \u2192 , transitRight<br \/>\nDecrement, 1 , 0 , \u2192 , transitRight<br \/>\nDecrement, 0 , 9 , \u2190 , Decrement<br \/>\nDecrement, \u2200 , \u2200 , \u2192 , erase9<\/p>\n<p>State: transitRight<br \/>\n# Skips all digits up to the last digit. Stops on the last digit.<br \/>\ntransitRight, 9 , 9 , \u2192 , transitRight<br \/>\ntransitRight, 8 , 8 , \u2192 , transitRight<br \/>\ntransitRight, 7 , 7 , \u2192 , transitRight<br \/>\ntransitRight, 6 , 6 , \u2192 , transitRight<br \/>\ntransitRight, 5 , 5 , \u2192 , transitRight<br \/>\ntransitRight, 4 , 4 , \u2192 , transitRight<br \/>\ntransitRight, 3 , 3 , \u2192 , transitRight<br \/>\ntransitRight, 2 , 2 , \u2192 , transitRight<br \/>\ntransitRight, 1 , 1 , \u2192 , transitRight<br \/>\ntransitRight, 0 , 0 , \u2192 , transitRight<br \/>\ntransitRight, \u2200 , \u2200 , \u2190 , stop<\/p>\n<p>State: erase9<br \/>\n# Erases all consecutive 9s; stops on the last blank.<br \/>\nerase9, 9 , \u2610 , \u2192 , erase9<br \/>\nerase9, \u2200 , \u2200 , \u2190 , stop<\/p><\/blockquote>\n<\/details>\n<h1>Place N apples!<\/h1>\n<p>In some cases, you need a large number of objects on the tape to test a program. For example, you would need 100 apples to check whether a counting program goes from 1 to 100. Of course, if you have time to waste, you can manually place the apples one by one on the tape and test the program.<\/p>\n<p>But we can also create a Turing program! We write a natural number greater than 0 on the tape, the head is placed on the last digit.<\/p>\n<p>And here is the final situation: the head stops on the first apple in a series. The number originally written on the strip is erased. The apples are placed to the right of the initial number.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1903 aligncenter\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pommes4.png\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pommes4.png 500w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pommes4-300x22.png 300w\" alt=\"\" width=\"500\" height=\"36\" data-src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pommes4.png\" data-srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pommes4.png 500w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pommes4-300x22.png 300w\" data-sizes=\"(min-width: 960px) 75vw, 100vw\" \/><\/p>\n<p>Convenient, isn&#8217;t it? To run the program, once the debugging phase has been completed, we recommend using the fastest operating mode &#8211; the &#8220;horse to finish&#8221; button, for example. Execution time increases rapidly with the number of apples.<\/p>\n<p>c= {[0-9],\u2610,apple}<\/p>\n<details open=\"\">\n<summary>Solution 1: Everything in the same machine (spoiler).<\/summary>\n<blockquote><p>Machine: [Repeater]<br \/>\n# Decrements a natural number and places that many apples to the right of that number.<br \/>\nState: Decrement<br \/>\n# Decrements a number<br \/>\nDecrement, 9 , 8 , \u2192 , TransitRight<br \/>\nDecrement, 8 , 7 , \u2192 , TransitRight<br \/>\nDecrement, 7 , 6 , \u2192 , TransitRight<br \/>\nDecrement, 6 , 5 , \u2192 , TransitRight<br \/>\nDecrement, 5 , 4 , \u2192 , TransitRight<br \/>\nDecrement, 4 , 3 , \u2192 , TransitRight<br \/>\nDecrement, 3 , 2 , \u2192 , TransitRight<br \/>\nDecrement, 2 , 1 , \u2192 , TransitRight<br \/>\nDecrement, 1 , 0 , \u2192 , TransitRight<br \/>\nDecrement, 0 , 9 , \u2190 , Decrement<br \/>\nDecrement, \u2610 , \u2610 , \u2192 , Delete9<br \/>\nState: Delete9<br \/>\n# Deletes all 9s and stop.<br \/>\nDelete9, 9 , \u2610 , \u2192 , Delete9<br \/>\nState: TransitRight<br \/>\nTransitRight, \u2610 , apple , \u2190 , TransitLeft<br \/>\nTransitRight, \u2200 , \u2200 , \u2192 , TransitRight<br \/>\nState: TransitLeft<br \/>\nTransitLeft, apple , apple , \u2190 , TransitLeft<br \/>\nTransitLeft, \u2200 , \u2200 , Decrement<\/p><\/blockquote>\n<\/details>\n<details open=\"\">\n<summary>Solution 2: two machines, the one that decrements is a repeat of the previous exercise (spoiler)<\/summary>\n<blockquote><p>Machine: [AddApples]<br \/>\n# Start: on the rightmost data<br \/>\n# End: on the rightmost data<\/p>\n<p>State: throwDecrementer<br \/>\nthrowDecrementer, \u2610 , \u2610 , stop<br \/>\nthrowDecrementer, \u2200 , \u2200 , evaluation, [Decrementer]<\/p>\n<p>State: evaluation<br \/>\n# Evaluates the result of the decrementer. If it is a number, add an apple. Otherwise, stop.<br \/>\nevaluation, 0 , 0 , \u2192 , addApple<br \/>\nevaluation, 1 , 1 , \u2192 , addApple<br \/>\nevaluation, 2 , 2 , \u2192 , addApple<br \/>\nevaluation, 3 , 3 , \u2192 , addApple<br \/>\nevaluation, 4 , 4 , \u2192 , addApple<br \/>\nevaluation, 5 , 5 , \u2192 , addApple<br \/>\nevaluation, 6 , 6 , \u2192 , addApple<br \/>\nevaluation, 7 , 7 , \u2192 , addApple<br \/>\nevaluation, 8 , 8 , \u2192 , addApple<br \/>\nevaluation, 9 , 9 , \u2192 , addApple<\/p>\n<p>State: addApple<br \/>\n# Adds an apple to the next apple string, if there is room.<br \/>\naddApple, apple , apple , \u2192 , addApple<br \/>\naddApple, \u2610 , apple , \u2190 , backBack<\/p>\n<p>State: Backspace<br \/>\n# Backspaces to the initial number.<br \/>\nBackspace, apple , apple , \u2190 , Backspace<br \/>\nbackspace, \u2200 , \u2200 , startDecrementer<br \/>\n#\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014<br \/>\nMachine: [Decrementer]<br \/>\n# Decrements a natural number. If there are any 0s left, replace them with blanks. Always stops on the last digit, or the blank.<br \/>\n# Start: on the rightmost data item<br \/>\n# End: on the rightmost data item<\/p>\n<p>State: Decrement<br \/>\nDecrement, 9 , 8 , \u2192 , transitRight<br \/>\nDecrement, 8 , 7 , \u2192 , transitRight<br \/>\nDecrement, 7 , 6 , \u2192 , transitRight<br \/>\nDecrement, 6 , 5 , \u2192 , transitRight<br \/>\nDecrement, 5 , 4 , \u2192 , transitRight<br \/>\nDecrement, 4 , 3 , \u2192 , transitRight<br \/>\nDecrement, 3 , 2 , \u2192 , transitRight<br \/>\nDecrement, 2 , 1 , \u2192 , transitRight<br \/>\nDecrement, 1 , 0 , \u2192 , transitRight<br \/>\nDecrement, 0 , 9 , \u2190 , Decrement<br \/>\nDecrement, \u2200 , \u2200 , \u2192 , erase9<\/p>\n<p>State: transitRight<br \/>\n# Skips all digits up to the last digit. Stops on the last digit.<br \/>\ntransitRight, 9 , 9 , \u2192 , transitRight<br \/>\ntransitRight, 8 , 8 , \u2192 , transitRight<br \/>\ntransitRight, 7 , 7 , \u2192 , transitRight<br \/>\ntransitRight, 6 , 6 , \u2192 , transitRight<br \/>\ntransitRight, 5 , 5 , \u2192 , transitRight<br \/>\ntransitRight, 4 , 4 , \u2192 , transitRight<br \/>\ntransitRight, 3 , 3 , \u2192 , transitRight<br \/>\ntransitRight, 2 , 2 , \u2192 , transitRight<br \/>\ntransitRight, 1 , 1 , \u2192 , transitRight<br \/>\ntransitRight, 0 , 0 , \u2192 , transitRight<br \/>\ntransitRight, \u2200 , \u2200 , \u2190 , stop<\/p>\n<p>State: erase9<br \/>\n# Erases all consecutive 9s; stops on the last blank.<br \/>\nerase9, 9 , \u2610 , \u2192 , erase9<br \/>\nerase9, \u2200 , \u2200 , \u2190 , stop<\/p><\/blockquote>\n<\/details>\n<h1>Move a natural number to the left<\/h1>\n<p>Even though the formatting possibilities are very limited on our tape, presentation matters! Often, after a series of conversions, we need to move the result, a natural number, to a new position, usually immediately to the right of an = sign. To make things more difficult, we assume that <em>anything<\/em> can exist between the number and the <em>= sign, including digits that are not part of the number to be transferred.<\/em> When moving, all signs present between the number and the = sign must be erased (i.e., replaced by a blank). The machine must stop on the = sign. Here, the symbol \u2200 will be of great help. Initially, the head must be positioned on the first digit forming the number to be moved (i.e., the left-hand digit). Finally, it must be positioned on the &#8220;=&#8221; sign.<\/p>\n<p>Example: starting situation: =\u2610 1 2 3 xyzt 5 8 4\u2610 \u2610 \u2610 ( <em>head positioned on 5: move 584)<\/em><\/p>\n<p>Arrival status: =584\u2610 \u2610 \u2610 \u2610 \u2610 \u2610 \u2610 \u2610 \u2610 \u2610 \u2610<\/p>\n<p>Obviously, the machine shouldn&#8217;t crash if the number is already correctly positioned after the = sign. And if you use my X and Y technique described below, it shouldn&#8217;t crash if there&#8217;s only one box between the = and the first digit.<\/p>\n<p>The collection is C={the entire collection of signs defined on Actilud}.<\/p>\n<p>Here, we will have to <em>memorize<\/em> the numbers that we move. With the Turing machine, the only possibility of memorizing information is to use a state <em>for each piece of information to be memorized<\/em> . Among the states necessary for operation, we will have to create as many as there are signs to be transported, i.e. 10.<\/p>\n<p>Here, we have to memorize the digits we move. With the Turing machine, the only way to memorize information is to use a state for each piece of information to be memorized. We&#8217;ll need to create as many states as there are signs to be transported, i.e. 10, in addition to the other states.<\/p>\n<p>Of course, there are several ways to implement the program. Programming certain states is quite repetitive; so, to save the number of states to program, my idea was the following. First, we clean the strip between the = sign and the first number. We delimit the space between the = and the first number with two letters, X and Y. The segment [X,Y] moves as we move a number after those already placed to the right of =. The letter Y allows us to test the end of the program: if there are no more numbers to the right of Y, it&#8217;s over. X marks the location of the box in which we must place a number. If we don&#8217;t use this trick, we have to create 10 additional states just to place a number to the right of the = sign! (note that instead of using X and Y, we could have used only X).<\/p>\n<p>Of course, there are several ways of implementing the program. Programming certain states is rather repetitive; so, to save the number of states to be programmed, my idea was as follows. First, we clean up the strip between the = sign and the first digit. The space between the = and the first digit is delimited by two letters, X and Y. The segment [X,Y] moves as you move a digit following those already placed to the right of =. The letter Y is used to test the end of the program: if there are no more digits to the right of Y, it&#8217;s over. X marks the location of the box in which to place a digit. If you don&#8217;t use this trick, you&#8217;ll need to create 10 additional states just to place a digit to the right of the = sign! (note that instead of using X and Y, we could have used X only).<\/p>\n<details open=\"\">\n<summary>Here is the listing (spoiler)<\/summary>\n<blockquote><p>Machine: [MoveNumberToEqualLeft]<br \/>\n# Start: on the leftmost digit of the number to be transferred<br \/>\n# End: on the = sign<\/p>\n<p>State: initialize<br \/>\n# Leave the pointed digit to prepare the tape<br \/>\ninitialize, \u2200 , \u2200 , \u2190 , fill blanks<\/p>\n<p>State: fill in blanks<br \/>\n# Fill the boxes to the left with blanks up to the sign =<br \/>\nfill in blanks, &#8216;=&#8217; , &#8216;=&#8217; , \u2192 , set X<br \/>\nfill in blanks, \u2200 , \u2610 , \u2190 , fill in blanks<\/p>\n<p>State: set X<br \/>\n# After finding the = or dropping a number, drop an x \u200b\u200band go looking for the Y or a number.<br \/>\nset X, \u2610 , X , \u2192 , search Y<br \/>\nset X, Y , X , \u2192 , pickNumber<br \/>\nset X, \u2200 , \u2200 , \u2190 , return to equal<\/p>\n<p>State: takeNumber<br \/>\n# If a number is found, enters the corresponding move state. Otherwise, return to equal and stop.<br \/>\ntakeNumber, 0 , Y , \u2190 , move0<br \/>\ntakeNumber, 1 , Y , \u2190 , move1<br \/>\ntakeNumber, 2 , Y , \u2190 , move2<br \/>\ntakeNumber, 3 , Y , \u2190 , move3<br \/>\ntakeNumber, 4 , Y , \u2190 , move4<br \/>\ntakeNumber, 5 , Y , \u2190 , move5<br \/>\ntakeNumber, 6 , Y , \u2190 , move6<br \/>\ntakeNumber, 7 , Y , \u2190 , move7<br \/>\ntakeNumber, 8 , Y , \u2190 , move8<br \/>\ntakeNumber, 9 , Y , \u2190 , move9<br \/>\ntakeNumber, \u2200 , \u2200 , \u2190 , return on equal<\/p>\n<p>State: search Y<br \/>\n# Searches for the Y previously placed on the strip. If a number is found in place of the Y, go to the Take Number state without moving. If the Y is found, delete it, go right and go to the Take Number state.<br \/>\nsearch Y, \u2610 , \u2610 , \u2192 , search Y<br \/>\nsearch Y, Y , \u2610 , \u2192 , takeNumber<br \/>\nsearch Y, 0 , 0 , takeNumber<br \/>\nsearch Y, 1 , 1 , takeNumber<br \/>\nsearch Y, 2 , 2 , takeNumber<br \/>\nsearch Y, 3 , 3 ,<br \/>\ntakeNumber search Y, 4 , 4 , takeNumber<br \/>\nsearch Y, 5 , 5 ,<br \/>\ntakeNumber search Y, 6 , 6 ,<br \/>\ntakeNumber search Y, 7 , 7 , takeNumber<br \/>\nsearch Y, 8 , 8 , takeNumber<br \/>\nsearch Y, 9 , 9 , takeNumber<\/p>\n<p>State: return on equal<br \/>\nreturn on equal, \u2610 , \u2610 , \u2190 , return on equal<br \/>\nreturn on equal, X , \u2610 , \u2190 , return on equal<br \/>\nreturn on equal, &#8216;=&#8217; , &#8216;=&#8217; , stop<br \/>\nreturn on equal, 0 , 0 , \u2190 , return on equal<br \/>\nreturn on equal, 1 , 1 , \u2190 , return on equal<br \/>\nreturn on equal, 2 , 2 , \u2190 , return on equal<br \/>\nreturn on equal, 3 , 3 , \u2190 , return on equal<br \/>\nreturn on equal, 4 , 4 , \u2190 , return on equal<br \/>\nreturn on equal, 5 , 5 , \u2190 , return on equal<br \/>\nreturn on equal, 6 , 6 , \u2190 , return on equal<br \/>\nreturn on equal, 7 , 7 , \u2190 , return on equal<br \/>\nreturn on equal, 8 , 8 , \u2190 , return on equal<br \/>\nreturn on equal, 9 , 9 , \u2190 , return on equal<\/p>\n<p>State: move0<br \/>\nmove0, \u2610 , \u2610 , \u2190 , move0<br \/>\nmove0, X , 0 , \u2192 , drop X<\/p>\n<p>State: move1<br \/>\nmove1, \u2610 , \u2610 , \u2190 , move1<br \/>\nmove1, X , 1 , \u2192 , drop X<\/p>\n<p>State: move2<br \/>\nmove2, \u2610 , \u2610 , \u2190 , move2<br \/>\nmove2, X , 2 , \u2192 , drop X<\/p>\n<p>State: move3<br \/>\nmove3, \u2610 , \u2610 , \u2190 , move3<br \/>\nmove3, X , 3 , \u2192 , drop X<\/p>\n<p>State: move4<br \/>\nmove4, \u2610 , \u2610 , \u2190 , move4<br \/>\nmove4, X , 4 , \u2192 , drop X<\/p>\n<p>State: move5<br \/>\nmove5, \u2610 , \u2610 , \u2190 , move5<br \/>\nmove5, X , 5 , \u2192 , drop X<\/p>\n<p>State: move6<br \/>\nmove6, \u2610 , \u2610 , \u2190 , move6<br \/>\nmove6, X , 6 , \u2192 , drop X<\/p>\n<p>State: move7<br \/>\nmove7, \u2610 , \u2610 , \u2190 , move7<br \/>\nmove7, X , 7 , \u2192 , drop X<\/p>\n<p>State: move8<br \/>\nmove8, \u2610 , \u2610 , \u2190 , move8<br \/>\nmove8, X , 8 , \u2192 , drop X<\/p>\n<p>State: move9<br \/>\nmove9, \u2610 , \u2610 , \u2190 , move9<br \/>\nmove9, X , 9 , \u2192 , drop X<\/p>\n<p>&nbsp;<\/p><\/blockquote>\n<\/details>\n","protected":false},"excerpt":{"rendered":"<p>Adding sticks Stick arithmetic is probably the easiest to implement with a Turing machine. The collection to use is C={ \u2610, |, X, =, +}. We write an addition on the strip with sticks, for example: ||||+||= The result should be of the form: ||||+||=|||||| Start on the = sign or on the stick immediately [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-297","post","type-post","status-publish","format-standard","hentry","category-turing-machine-the-challenges"],"_links":{"self":[{"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/posts\/297","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/comments?post=297"}],"version-history":[{"count":4,"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/posts\/297\/revisions"}],"predecessor-version":[{"id":301,"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/posts\/297\/revisions\/301"}],"wp:attachment":[{"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/media?parent=297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/categories?post=297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actilud.com\/info\/en\/wp-json\/wp\/v2\/tags?post=297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}