{"id":17,"date":"2017-02-17T10:55:42","date_gmt":"2017-02-17T09:55:42","guid":{"rendered":"https:\/\/tapas.labri.fr\/wp\/?page_id=17"},"modified":"2017-02-17T15:45:31","modified_gmt":"2017-02-17T14:45:31","slug":"the-armoise-language","status":"publish","type":"page","link":"https:\/\/tapas.labri.fr\/wp\/?page_id=17","title":{"rendered":"The Armoise language"},"content":{"rendered":"<p>The Armoise language is used to describe sets of numerical vectors. The syntax allows high-level notations that permits succinct descriptions. The next section presents main syntactic rules the language; then several <a href=\"#Examples\">examples<\/a> are given.<\/p>\n<h1>Armoise at a glance<\/h1>\n<p>An Armoise file is a sequence of sets of vectors. Each set description is terminated with a semi-colon (<strong>;<\/strong>).<\/p>\n<pre class=\"wiki\">  Set 1 ;\r\n  Set 2 ;\r\n  ...\r\n  Set n ;\r\n<\/pre>\n<p>A set can be described in several ways:<\/p>\n<ul>\n<li>it can be a <a class=\"wiki\" href=\"#Basicsets\">predefined set or a set of constants<\/a>;<\/li>\n<li>it can be defined with a <a class=\"wiki\" href=\"#Formulas\">formula<\/a> specifying a relation over a set of variables;<\/li>\n<li>or it can be defined using <a class=\"wiki\" href=\"#Operationsonsets\">operations on existing sets<\/a>.<\/li>\n<\/ul>\n<p>Since some sets can be quite complex (especially those generated by a tool like a model-checker), Armoise allows to declare local sets. A <em>context<\/em> is associated with each set and the user can add local definitions to this <em>context<\/em>. Local definitions are placed between the <tt>let<\/tt> and <tt>in<\/tt> keywords:<\/p>\n<pre class=\"wiki\">  let\r\n    S1 := Definition of S1;\r\n    S2 := Definition of S2;\r\n    ...\r\n    Sn := Definition of Sn;\r\n  in\r\n    Definition of the main set;\r\n<\/pre>\n<p>Each <em>S<\/em><sub>i<\/sub> can be used in the definition of the main set. Furthermore, each <em>S<\/em><sub>i<\/sub> has its own context.<\/p>\n<h3 id=\"Basicsets\">Basic sets<\/h3>\n<p>Pre-defined set the following:<\/p>\n<ul>\n<li><tt>nat<\/tt> is the set of natural number (i.e. positive integers)<\/li>\n<li><tt>int<\/tt> is the set of integers<\/li>\n<li><tt>posi<\/tt> is the set of positive or null real numbers<\/li>\n<li><tt>real<\/tt> is the set of real numbers<\/li>\n<\/ul>\n<p>A set can also be defined by an enumeration of constants:<\/p>\n<ul>\n<li><tt>{ 3, 14, 15 }<\/tt>, <tt>{ 1\/2, 12 }<\/tt>, <tt>{ (1,2), (3,2\/3) }<\/tt>, &#8230;<\/li>\n<\/ul>\n<p>Direct values are shortcuts for singletons:<\/p>\n<ul>\n<li><tt>4<\/tt> is a shortcut for <tt>{ 4 }<\/tt><\/li>\n<li><tt>(1,2)<\/tt> is a shortcut for <tt>{ (1, 2) }<\/tt><\/li>\n<\/ul>\n<p>Ranges are defined as follows:<\/p>\n<ul>\n<li><tt>[<\/tt> <em>min<\/em> <tt>...<\/tt> <em>max<\/em> <tt>]<\/tt> defines the range of real number between <em>min<\/em> and <em>max<\/em> (included); here the ellipsis (<tt>...<\/tt>) is actually a lexeme of the language.<\/li>\n<li><tt>[<\/tt> <em>min<\/em> <tt>,<\/tt> <em>max<\/em> <tt>]<\/tt> defines the range of integral numbers between <em>min<\/em> and <em>max<\/em> (included).<\/li>\n<\/ul>\n<h3 id=\"Formulas\">Formulas<\/h3>\n<p>A set described using a formula is simply written <tt>{<\/tt> <em>v<\/em> <tt>in<\/tt> <em>Dom<\/em> <tt>|<\/tt> <em>F<\/em> <tt>};<\/tt> where<\/p>\n<ul>\n<li><em>v<\/em> is a vector of variables: <tt>a<\/tt>, <tt>(x, y, z)<\/tt> or <tt>(a, b, (c, d))<\/tt><\/li>\n<li><em>Dom<\/em> defines the domain of <em>v<\/em>. The type of variables appearing in <em>v<\/em> is inferred from <em>Dom<\/em>. For instance, if <em>Dom<\/em> is <tt>(nat, real, (real, nat))<\/tt> then:\n<ul>\n<li><tt>a in<\/tt> <em>Dom<\/em> means that <tt>a<\/tt> is a vector with three components and the third one is itself a couple:<\/li>\n<li><tt>(x, y, z) in<\/tt> <em>Dom<\/em> means that <tt>x<\/tt> is a positive integer, <tt>y<\/tt> is real number and <tt>z<\/tt> is a couple whose first component is a natural number and the second one is a real.<\/li>\n<li><tt>(a, b, (c, d)) in<\/tt> <em>Dom<\/em> means that <tt>a<\/tt> and <tt>d<\/tt> are natural numbers and <tt>b<\/tt> and <tt>c<\/tt> are reals.<\/li>\n<\/ul>\n<\/li>\n<li><em>F<\/em> is a first-order formula that describes the relation between variables listed in <em>v<\/em>. If a variable is a vector its components can be referenced using the classical square-bracket notation (<tt>[]<\/tt>); the first component has the index 0 and the last one the width of the variable minus one.<\/li>\n<\/ul>\n<p>The formula <em>F<\/em> is built using:<\/p>\n<ul>\n<li>Boolean constants: <tt>true<\/tt> and <tt>false<\/tt><\/li>\n<li>Boolean operations:\n<ul>\n<li>disjunction <em>F1<\/em> <tt>|<\/tt> <em>F2<\/em>, <em>F1<\/em> <tt>or<\/tt> <em>F2<\/em><\/li>\n<li>conjunction <em>F1<\/em> <tt>&amp;<\/tt> <em>F2<\/em>, <em>F1<\/em> <tt>and<\/tt> <em>F2<\/em><\/li>\n<li>equivalence <em>F1<\/em> <tt>&lt;=&gt;<\/tt> <em>F2<\/em><\/li>\n<li>implication <em>F1<\/em> <tt>=&gt;<\/tt> <em>F2<\/em><\/li>\n<li>negation <tt>!<\/tt> F, <tt>not<\/tt> F<\/li>\n<\/ul>\n<\/li>\n<li>Comparison of terms: <em>T1<\/em> <tt>&lt;<\/tt> <em>T2<\/em>, <em>T1<\/em> <tt>&lt;=<\/tt> <em>T2<\/em>, <em>T1<\/em> <tt>&gt;<\/tt> <em>T2<\/em>, <em>T1<\/em> <tt>&gt;=<\/tt> <em>T2<\/em>, <em>T1<\/em> <tt>=<\/tt> <em>T2<\/em> and <em>T1<\/em> <tt>!=<\/tt> <em>T2<\/em><\/li>\n<li>Quantifications:\n<ul>\n<li><tt>exists<\/tt> <em>x1<\/em> <tt>, ...,<\/tt> <em>xn<\/em> <tt>( (<\/tt> <em>x1<\/em> <tt>, ...,<\/tt> <em>xn<\/em> <tt>) in<\/tt> <em>Dom<\/em> <tt>and<\/tt> <em>G<\/em> <tt>)<\/tt><\/li>\n<li><tt>forall<\/tt> <em>x1<\/em> <tt>, ...,<\/tt> <em>xn<\/em> <tt>( (<\/tt> <em>x1<\/em> <tt>, ...,<\/tt> <em>xn<\/em> <tt>) in<\/tt> <em>Dom<\/em> <tt>and<\/tt> <em>G<\/em> <tt>)<\/tt> The type of quantified variables <em>x<\/em>~i~ is inferred from the set <em>Dom<\/em>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Terms are built using:<\/p>\n<ul>\n<li>Positive integer constants: <tt>3<\/tt>, <tt>14<\/tt>, <tt>15<\/tt>, &#8230;<\/li>\n<li>Vectors of terms: <tt>(<\/tt> <em>t1<\/em> <tt>,<\/tt> <em>t2<\/em> <tt>, ...,<\/tt> <em>tn<\/em> <tt>)<\/tt><\/li>\n<li>Elements of a vector: <em>v<\/em> <tt>[<\/tt> <em>i1<\/em> <tt>]...[<\/tt> <em>ik<\/em> <tt>]<\/tt> where <em>i<\/em>~j~ are integer constant.<\/li>\n<li>Arithmetic operators:\n<ul>\n<li>addition <em>t1<\/em> <tt>+<\/tt> <em>t2<\/em>. The domain of the term is the coarsest of its operands.<\/li>\n<li>subtraction <em>t1<\/em> <tt>-<\/tt> <em>t2<\/em>. The domain of the term is the coarsest of its operands.<\/li>\n<li>multiplication <em>t1<\/em> <tt>*<\/tt> <em>t2<\/em>. The domain of the term is the coarsest of its operands.<\/li>\n<li>division <em>t1<\/em> <tt>\/<\/tt> <em>t2<\/em>. The domain of this term is the one of <em>t1<\/em>.<\/li>\n<li>modulo <em>t1<\/em> <tt>%<\/tt> <em>t2<\/em>. The domain of this term is the one of <em>t1<\/em>.<\/li>\n<li>opposite <tt>-<\/tt> <em>t<\/em>. The domain of this term is the one of <em>t<\/em> extended to negative numbers.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>One should note that arithmetic operators can be applied to vectors. For instance:<\/p>\n<ul>\n<li><tt>2 * ( (1,2 *<\/tt> <em>t<\/em> <tt>) + (<\/tt> <em>x<\/em> <tt>,<\/tt> <em>y<\/em> <tt>) )<\/tt> is the vector <tt>(2 *<\/tt> <em>x<\/em> <tt>+ 2, 2 * y +<\/tt> <em>4<\/em> <tt>* t)<\/tt><\/li>\n<\/ul>\n<h3 id=\"Operationsonsets\">Operations on sets<\/h3>\n<p>Sets can be composed using several operations. These operations are essentially extensions of arithmetic or Boolean connectives to sets of vectors.<\/p>\n<p><strong>Boolean operations:<\/strong><\/p>\n<ul>\n<li>Union <em>S1<\/em> <tt>||<\/tt> <em>S2<\/em>;<\/li>\n<li>Intersection <em>S1<\/em> <tt>&amp;&amp;<\/tt> <em>S2<\/em>;<\/li>\n<li>Difference <em>S1<\/em> <tt>\\<\/tt> <em>S2<\/em>;<\/li>\n<li>Symmetric difference <em>S1<\/em> <tt>^<\/tt> <em>S2<\/em> (a shortcut for <tt>(<\/tt> <em>S1<\/em> <tt>\\<\/tt> <em>S2<\/em> <tt>) || (<\/tt> <em>S2<\/em> <tt>\\<\/tt> <em>S1<\/em> <tt>)<\/tt>);<\/li>\n<li>Complement into real numbers <tt>!<\/tt> <em>S<\/em> (a shortcut for <tt>real \\<\/tt> <em>S<\/em>).<\/li>\n<\/ul>\n<p><strong>Numerical operations extended to sets:<\/strong><\/p>\n<ul>\n<li><em>S1<\/em> <em>op<\/em> <em>S2<\/em> is semantically equivalent to <tt>{<\/tt> <em>x<\/em> <tt>| exist<\/tt> <em>x1<\/em> <tt>,<\/tt> <em>x2<\/em> <tt>((<\/tt> <em>x1<\/em> <tt>,<\/tt> <em>x2<\/em> <tt>) in (<\/tt> <em>S1<\/em> <tt>,<\/tt> <em>S2<\/em> <tt>) and <\/tt> <em>x<\/em> <tt>=<\/tt> <em>x1<\/em> <em>op<\/em> <em>x2<\/em> <tt>) }<\/tt> where <em>op<\/em> belong to { <tt>+<\/tt>, <tt>-<\/tt>, <tt>*<\/tt>, <tt>\/<\/tt>, <tt>%<\/tt> }.<\/li>\n<\/ul>\n<p>Of course the type of operands, <em>S1<\/em> and <em>S2<\/em>, must have a sense with the operation <em>op<\/em>. For instance if <em>S1<\/em> is a set of vectors then <em>S1<\/em> <tt>*<\/tt> <em>S2<\/em> have a sense only if <em>S2<\/em> is a set of scalar values.<\/p>\n<p><strong>Cartesian product:<\/strong><\/p>\n<ul>\n<li><tt>(<\/tt> <em>S1<\/em> <tt>, ...,<\/tt> <em>Sn<\/em> <tt>)<\/tt> is the Cartesian product of sets defined by <em>S<\/em>~i~ s for <em>i = 1 &#8230; n<\/em>.<\/li>\n<\/ul>\n<h1 id=\"Examples\">Examples<\/h1>\n<p>In this section we give small examples of sets specified with the <a class=\"wiki\" href=\"https:\/\/tapas.labri.fr\/wp\/?page_id=17\">Armoise<\/a> language.<\/p>\n<h3 id=\"Linearsystemwithlargecoefficients\">Linear system with large coefficients<\/h3>\n<p>This example defines a set of integer vectors of size 4. The set is defined by 3 linear inequalities. Even if such set is easily handled using binary automata, the presence of large coefficients yields to the construction of a quiet large automaton with 147378 states.<\/p>\n<pre class=\"wiki\">  { x in (nat,nat,nat,nat) | 31 * x[0] - 13 * x[1] &gt;= 0 and \r\n                                      45 * x[0] -  4 * x[1] - 11 * x[2] &gt;= 0 and\r\n                                      27 * x[1] - 11 * x[3] &gt;= 0 };''\r\n<\/pre>\n<p>Despite the size of the automaton, the Armoise formula synthesized by <a class=\"wiki\" href=\"https:\/\/tapas.labri.fr\/wp\/?page_id=20\">distiller<\/a> is quiet small and reveals that there is no redundancy between the three linear constraints.<\/p>\n<pre class=\"wiki\">  let\r\n    SynForm := \r\n     let\r\n       G := int * (1, 0, 0, 0) + int * (0, 1, 0, 0) + int * (0, 0, 1, 0) + \r\n            int * (0, 0, 0, 1);\r\n       P0 := G;\r\n       V := (int, int, int, int);\r\n       H2_leq := { (x_0, x_1, x_2, x_3) in (nat, nat, nat, nat) | -45 * x_0 + 4 * x_1 + 11 * x_2 &lt;= 0 };\r\n       VH2 := H2_leq &amp;&amp; V;\r\n       H1_leq := { (x_0, x_1, x_2, x_3) in (nat, nat, nat, nat) | -27 * x_1 + 11 * x_3 &lt;= 0 };\r\n       VH1 := H1_leq &amp;&amp; V;\r\n       H0_leq := { (x_0, x_1, x_2, x_3) in (nat, nat, nat, nat) | -31 * x_0 + 13 * x_1 &lt;= 0 };\r\n       VH0 := H0_leq &amp;&amp; V;\r\n     in\r\n       (P0 || VH2 || VH1 || VH0) &amp;&amp; VH2 &amp;&amp; VH1 &amp;&amp; VH0;\r\n   in\r\n     { (x_0, x_1, x_2, x_3) | (x_0, x_1, x_2, x_3) in (nat, nat, nat, nat) &amp;&amp; SynForm };\r\n<\/pre>\n<h3 id=\"Alinearinequalitywithalargenumberofvariables\">A linear inequality with a large number of variables<\/h3>\n<p>This example is a simple inequality but with 37 integer variables.<\/p>\n<pre class=\"wiki\">  { x in \r\n    (nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, \r\n     nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, \r\n     nat, nat, nat, nat, nat) | \r\n     4*x[0] -2*x[ 1]+1*x[ 2]+1*x[ 3]-3*x[ 4]-2*x[5] +1*x[ 6]-4*x[ 7]-3*x[ 8]+1*x[ 9]\r\n    +1*x[10]-3*x[11]+2*x[12]+3*x[13]-1*x[14]+1*x[15]+3*x[16]-2*x[17]-1*x[18]+4*x[19]\r\n    -3*x[20]-2*x[21]+1*x[22]+4*x[23]-2*x[24]+1*x[25]+1*x[26]-3*x[27]+2*x[28]+1*x[29]\r\n    -4*x[30]-3*x[31]+1*x[32]-1*x[33]-3*x[34]+2*x[35]+1*x[36] &lt; 4 };\r\n<\/pre>\n<p>The automaton computed with <a class=\"wiki\" href=\"https:\/\/tapas.labri.fr\/wp\/?page_id=14\">PresTAF<\/a> has 4320 states and the formula synthesizer returns a similar formula:<\/p>\n<pre class=\"wiki\">  let\r\n   SynForm := \r\n    let\r\n     rho_w := (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n               0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0);\r\n     V := (int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, \r\n           int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);\r\n     H0_leq := { (x_0, x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9, x_10, x_11, x_12, x_13, x_14, x_15, x_16, x_17, \r\n                  x_18, x_19, x_20, x_21, x_22, x_23, x_24, x_25, x_26, x_27, x_28, x_29, x_30, x_31, x_32, x_33, \r\n                  x_34, x_35, x_36) in (nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, \r\n                  nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, \r\n                  nat, nat, nat, nat) |\r\n                  4 * x_0 - 2 * x_1 + x_2 + x_3 - 3 * x_4 - 2 * x_5 + x_6 - 4 * x_7 - 3 * x_8 + x_9 + x_10 -\r\n                  3 * x_11 + 2 * x_12 + 3 * x_13 - x_14 + x_15 + 3 * x_16 - 2 * x_17 - x_18 + 4 * x_19 - 3 * x_20 - \r\n                  2 * x_21 + x_22 + 4 * x_23 - 2 * x_24 + x_25 + x_26 - 3 * x_27 +\r\n                  2 * x_28 + x_29 - 4 * x_30 - 3 * x_31 + x_32 - x_33 - 3 * x_34 + 2 * x_35 + x_36 &lt;= 3 };\r\n     VH0 := H0_leq &amp;&amp; (rho_w + V);\r\n    in\r\n     VH0;\r\n  in\r\n   { (x_0, x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9, x_10, x_11, x_12, x_13, x_14, x_15, x_16, x_17, \r\n      x_18, x_19, x_20, x_21, x_22, x_23, x_24, x_25, x_26, x_27, x_28, x_29, x_30, x_31, x_32, x_33, x_34, \r\n     x_35, x_36)\r\n     in \r\n     (nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, \r\n      nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, nat, \r\n     nat, nat) |  SynForm };\r\n<\/pre>\n<h3 id=\"Specificationswithexplicitmoduloconstraints\">Specifications with explicit modulo constraints<\/h3>\n<p>Here the example is a Cartesian product of four modulo constraints: multiples of 11, multiples of 7, multiples of 5 and multiples of 3.<\/p>\n<pre class=\"wiki\">  (11 * nat, 7 * nat, 5 * nat , 3 * nat);\r\n<\/pre>\n<p>The automaton computed with the <a class=\"wiki\" href=\"https:\/\/tapas.labri.fr\/wp\/?page_id=14\">PresTAF<\/a> plugin has 4620 states and we extract from it the following formula:<\/p>\n<pre class=\"wiki\">  let\r\n   SynForm := \r\n    let\r\n     G := int * (11, 0, 0, 0) + int * (0, 7, 0, 0) + int * (0, 0, 5, 0) + int * (0, 0, 0, 3);\r\n     P0 := G;\r\n    in\r\n     P0;\r\n  in\r\n   { (x0, x1, x2, x3) in (nat, nat, nat, nat) | SynForm };\r\n<\/pre>\n<h3 id=\"Redundancyelimination\">Redundancy elimination<\/h3>\n<p>In this example some linear constraints have been deliberately duplicated in the formula.<\/p>\n<pre class=\"wiki\">  { (x0,x1,x2,x3,x4) in (nat,nat,nat,nat,nat) | \r\n   (  7*x0 - 4*x1 - 1*x2 +  9*x3 + 10*x4 &lt;  0 and \r\n     - 9*x0 + 5*x1 + 2*x2 - 10*x3 +  7*x4 &lt;  0 and \r\n       7*x0 - 4*x1 - 1*x2 +  9*x3 +  6*x4 &lt;  0 and \r\n     - 9*x0 + 5*x1 - 2*x2 - 11*x3 +  7*x4 &lt;  0 and \r\n     -10*x0 - 7*x1 + 3*x2 +    x3 -  8*x4 &lt; 0 )\r\n      or\r\n    (- 9*x0 + 5*x1 - 2*x2 - 11*x3 +  7*x4 &lt; 0  and \r\n       8*x0 - 4*x1 +   x2 +  9*x3 -  6*x4 &lt; 0  and \r\n       9*x0 + 6*x1 - 2*x2 + 11*x3 +  7*x4 &lt; 0  and \r\n     -10*x0 + 7*x1 + 4*x2 -    x3 +  9*x4 &lt; 0) };\r\n<\/pre>\n<p>Due to the normalization process induced by the minimization of automata in <a class=\"wiki\" href=\"https:\/\/tapas.labri.fr\/wp\/?page_id=14\">PresTAF<\/a>, redundant constraints are eliminated in the formula generated by <a class=\"wiki\" href=\"https:\/\/tapas.labri.fr\/wp\/?page_id=20\">distiller<\/a>, in fact only two constraints are actually relevant in this formula:<\/p>\n<pre class=\"wiki\">  let\r\n   SynForm := \r\n    let\r\n     G := int * (1, 0, 0, 0, 0) + int * (0, 1, 0, 0, 0) + int * (0, 0, 1, 0, 0) + int * (0, 0, 0, 1, 0) +\r\n          int * (0, 0, 0, 0, 1);\r\n     rho_w := (16, 28, 1, 0, 0);\r\n     P0 := rho_w + G;\r\n     V := (int, int, int, int, int);\r\n     H1_geq := { (x0, x1, x2, x3, x4) in (nat, nat, nat, nat, nat) | 7 * x0 - 4 * x1 - x2 + 9 * x3 + 10 * x4 &gt;= 0 };\r\n     VH1 := H1_geq &amp;&amp; (rho_w + V);\r\n     H0_geq := { (x0, x1, x2, x3, x4) in (nat, nat, nat, nat, nat) | -9 * x0 + 5 * x1 + 2 * x2 - 10 * x3 + 7 * x4 &gt;= 0 };\r\n     VH0 := H0_geq &amp;&amp; (rho_w + V);\r\n    in\r\n     (P0 \\ VH0 \\ VH1);\r\n  in\r\n   { (x0, x1, x2, x3, x4) in (nat, nat, nat, nat, nat) | SynForm };\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>The Armoise language is used to describe sets of numerical vectors. The syntax allows high-level notations that permits succinct descriptions. The next section presents main syntactic rules the language; then several examples are given. Armoise at a glance An Armoise &hellip; <a href=\"https:\/\/tapas.labri.fr\/wp\/?page_id=17\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-17","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tapas.labri.fr\/wp\/index.php?rest_route=\/wp\/v2\/pages\/17","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tapas.labri.fr\/wp\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tapas.labri.fr\/wp\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tapas.labri.fr\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tapas.labri.fr\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=17"}],"version-history":[{"count":7,"href":"https:\/\/tapas.labri.fr\/wp\/index.php?rest_route=\/wp\/v2\/pages\/17\/revisions"}],"predecessor-version":[{"id":93,"href":"https:\/\/tapas.labri.fr\/wp\/index.php?rest_route=\/wp\/v2\/pages\/17\/revisions\/93"}],"wp:attachment":[{"href":"https:\/\/tapas.labri.fr\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}