{"id":7874,"date":"2023-01-07T07:54:28","date_gmt":"2023-01-07T06:54:28","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=7874"},"modified":"2023-01-07T07:54:47","modified_gmt":"2023-01-07T06:54:47","slug":"07-ene-23","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/07-ene-23\/","title":{"rendered":"PFH: La semana en Exercitium (7 de enero de 2023)"},"content":{"rendered":"<p>Esta semana he publicado en <a href=\"http:\/\/bit.ly\/2sqPtGs\">Exercitium<\/a> las soluciones de los siguientes problemas:<\/p>\n<ul>\n<li><a href=\"#ej1\">1. Elementos del nivel k de un \u00e1rbol<\/a><\/li>\n<li><a href=\"#ej2\">2. \u00c1rbol de factorizaci\u00f3n<\/a><\/li>\n<li><a href=\"#ej3\">3. Valor de un \u00e1rbol booleano<\/a><\/li>\n<li><a href=\"#ej4\">4. Valor de una expresi\u00f3n aritm\u00e9tica b\u00e1sica<\/a><\/li>\n<li><a href=\"#ej5\">5. Aplicaci\u00f3n de una funci\u00f3n a una expresi\u00f3n aritm\u00e9tica<\/a><\/li>\n<\/ul>\n<p>A continuaci\u00f3n se muestran las soluciones.<br \/>\n<!--more--><br \/>\n<a name=\"ej1\"><\/a><\/p>\n<h3>1. Elementos del nivel k de un \u00e1rbol<\/h3>\n<p>Los \u00e1rboles binarios con valores en las hojas y en los nodos se definen por<\/p>\n<pre lang=\"text\">\n   data Arbol a = H a\n                | N a (Arbol a) (Arbol a)\n<\/pre>\n<p>Por ejemplo, el \u00e1rbol<\/p>\n<pre lang=\"text\">\n        7\n       \/ \\\n      \/   \\\n     2     9\n    \/ \\\n   5   4\n<\/pre>\n<p>se representa por<\/p>\n<pre lang=\"text\">\n   N 7 (N 2 (H 5) (H 4)) (H 9)\n<\/pre>\n<p>Un elemento de un \u00e1rbol se dir\u00e1 de nivel <code>k<\/code> si aparece en el \u00e1rbol a distancia <code>k<\/code> de la ra\u00edz.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   nivel :: Int -> Arbol a -> [a]\n<\/pre>\n<p>tal que <code>nivel k a<\/code> es la lista de los elementos de nivel <code>k<\/code> del \u00e1rbol <code>a<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   nivel 0 (H 5)                          ==  [5]\n   nivel 1 (H 5)                          ==  []\n   nivel 0 (N 7 (N 2 (H 5) (H 4)) (H 9))  ==  [7]\n   nivel 1 (N 7 (N 2 (H 5) (H 4)) (H 9))  ==  [2,9]\n   nivel 2 (N 7 (N 2 (H 5) (H 4)) (H 9))  ==  [5,4]\n   nivel 3 (N 7 (N 2 (H 5) (H 4)) (H 9))  ==  []\n<\/pre>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\ndata Arbol a = H a\n             | N a (Arbol a) (Arbol a)\n\nnivel :: Int -> Arbol a -> [a]\nnivel 0 (H x)      = [x]\nnivel 0 (N x _  _) = [x]\nnivel _ (H _ )     = []\nnivel k (N _ i d)  = nivel (k-1) i ++ nivel (k-1) d\n<\/pre>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom dataclasses import dataclass\nfrom typing import Generic, TypeVar\n\nA = TypeVar(\"A\")\n\n@dataclass\nclass Arbol(Generic[A]):\n    pass\n\n@dataclass\nclass H(Arbol[A]):\n    x: A\n\n@dataclass\nclass N(Arbol[A]):\n    x: A\n    i: Arbol[A]\n    d: Arbol[A]\n\ndef nivel(k: int, a: Arbol[A]) -> list[A]:\n    match (k, a):\n        case (0, H(x)):\n            return [x]\n        case (0, N(x, _, _)):\n            return [x]\n        case (_, H(_)):\n            return []\n        case (_, N(_, i, d)):\n            return nivel(k - 1, i) + nivel(k - 1, d)\n    assert False\n<\/pre>\n<p><a name=\"ej2\"><\/a><\/p>\n<h3>2. \u00c1rbol de factorizaci\u00f3n<\/h3>\n<p>Los divisores medios de un n\u00famero son los que ocupan la  media entre los divisores de n, ordenados de menor a mayor. Por ejemplo, los divisores de 60 son [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60] y sus divisores medios son 6 y 10. Para los n\u00fameros que son cuadrados perfectos, sus divisores medios de son sus ra\u00edces cuadradas; por ejemplos, los divisores medios de 9 son 3 y 3.<\/p>\n<p>El \u00e1rbol de factorizaci\u00f3n de un n\u00famero compuesto n se construye de la siguiente manera:<\/p>\n<ul>\n<li>la ra\u00edz es el n\u00famero n,<\/li>\n<li>la rama izquierda es el \u00e1rbol de factorizaci\u00f3n de su divisor medio menor y<\/li>\n<li>la rama derecha es el \u00e1rbol de factorizaci\u00f3n de su divisor medio mayor<\/li>\n<\/ul>\n<p>Si el n\u00famero es primo, su \u00e1rbol de factorizaci\u00f3n s\u00f3lo tiene una hoja con dicho n\u00famero. Por ejemplo, el \u00e1rbol de factorizaci\u00f3n de 60 es<\/p>\n<pre lang=\"text\">\n       60\n      \/  \\\n     6    10\n    \/ \\   \/ \\\n   2   3 2   5\n<\/pre>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   arbolFactorizacion :: Int -> Arbol\n<\/pre>\n<p>tal que <code>arbolFactorizacion n<\/code> es el \u00e1rbol de factorizaci\u00f3n de <code>n<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   arbolFactorizacion 60 == N 60 (N 6 (H 2) (H 3)) (N 10 (H 2) (H 5))\n   arbolFactorizacion 45 == N 45 (H 5) (N 9 (H 3) (H 3))\n   arbolFactorizacion 7  == H 7\n   arbolFactorizacion 9  == N 9 (H 3) (H 3)\n   arbolFactorizacion 14 == N 14 (H 2) (H 7)\n   arbolFactorizacion 28 == N 28 (N 4 (H 2) (H 2)) (H 7)\n   arbolFactorizacion 84 == N 84 (H 7) (N 12 (H 3) (N 4 (H 2) (H 2)))\n<\/pre>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\ndata Arbol = H Int\n           | N Int Arbol Arbol\n  deriving (Eq, Show)\n\narbolFactorizacion1 :: Int -> Arbol\narbolFactorizacion1 n\n  | esPrimo n = H n\n  | otherwise = N n (arbolFactorizacion1 x) (arbolFactorizacion1 y)\n  where (x,y) = divisoresMedio n\n\n-- (esPrimo n) se verifica si n es primo. Por ejemplo,\n--    esPrimo 7  ==  True\n--    esPrimo 9  ==  False\nesPrimo :: Int -> Bool\nesPrimo n = divisores n == [1,n]\n\n-- (divisoresMedio n) es el par formado por los divisores medios de\n-- n. Por ejemplo,\n--    divisoresMedio 30  ==  (5,6)\n--    divisoresMedio  7  ==  (1,7)\n--    divisoresMedio 16  ==  (4,4)\ndivisoresMedio :: Int -> (Int,Int)\ndivisoresMedio n = (n `div` x,x)\n  where xs = divisores n\n        x  = xs !! (length xs `div` 2)\n\n-- (divisores n) es la lista de los divisores de n. Por ejemplo,\n--    divisores 30  ==  [1,2,3,5,6,10,15,30]\ndivisores :: Int -> [Int]\ndivisores n = [x | x <- [1..n], n `rem` x == 0]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\narbolFactorizacion2 :: Int -> Arbol\narbolFactorizacion2 n\n  | x == 1    = H n\n  | otherwise = N n (arbolFactorizacion2 x) (arbolFactorizacion2 y)\n  where (x,y) = divisoresMedio n\n\n-- (divisoresMedio2 n) es el par formado por los divisores medios de\n-- n. Por ejemplo,\n--    divisoresMedio2 30  ==  (5,6)\n--    divisoresMedio2  7  ==  (1,7)\ndivisoresMedio2 :: Int -> (Int,Int)\ndivisoresMedio2 n = (n `div` x,x)\n  where m = ceiling (sqrt (fromIntegral n))\n        x = head [y | y <- [m..n], n `rem` y == 0]\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_arbolFactorizacion :: Int -> Property\nprop_arbolFactorizacion n =\n  n > 1 ==> arbolFactorizacion1 n == arbolFactorizacion2 n\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_arbolFactorizacion\n--    +++ OK, passed 100 tests; 162 discarded.\n<\/pre>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom dataclasses import dataclass\nfrom math import ceil, sqrt\n\nfrom hypothesis import given\nfrom hypothesis import strategies as st\n\n# 1\u00aa soluci\u00f3n\n# ===========\n\n@dataclass\nclass Arbol:\n    pass\n\n@dataclass\nclass H(Arbol):\n    x: int\n\n@dataclass\nclass N(Arbol):\n    x: int\n    i: Arbol\n    d: Arbol\n\n# divisores(n) es la lista de los divisores de n. Por ejemplo,\n#    divisores(30)  ==  [1,2,3,5,6,10,15,30]\ndef divisores(n: int) -> list[int]:\n    return [x for x in range(1, n + 1) if n % x == 0]\n\n# divisoresMedio(n) es el par formado por los divisores medios de\n# n. Por ejemplo,\n#    divisoresMedio(30)  ==  (5,6)\n#    divisoresMedio(7)   ==  (1,7)\n#    divisoresMedio(16)  ==  (4,4)\ndef divisoresMedio(n: int) -> tuple[int, int]:\n    xs = divisores(n)\n    x = xs[len(xs) \/\/ 2]\n    return (n \/\/ x, x)\n\n# esPrimo(n) se verifica si n es primo. Por ejemplo,\n#    esPrimo(7)  ==  True\n#    esPrimo(9)  ==  False\ndef esPrimo(n: int) -> bool:\n    return divisores(n) == [1, n]\n\ndef arbolFactorizacion1(n: int) -> Arbol:\n    if esPrimo(n):\n        return H(n)\n    (x, y) = divisoresMedio(n)\n    return N(n, arbolFactorizacion1(x), arbolFactorizacion1(y))\n\n# 2\u00aa soluci\u00f3n\n# ===========\n\n# divisoresMedio2(n) es el par formado por los divisores medios de\n# n. Por ejemplo,\n#    divisoresMedio2(30) ==  (5,6)\n#    divisoresMedio2(7)  ==  (1,7)\n#    divisoresMedio2(16) ==  (4,4)\ndef divisoresMedio2(n: int) -> tuple[int, int]:\n    m = ceil(sqrt(n))\n    x = [y for y in range(m, n + 1) if n % y == 0][0]\n    return (n \/\/ x, x)\n\ndef arbolFactorizacion2(n: int) -> Arbol:\n    if esPrimo(n):\n        return H(n)\n    (x, y) = divisoresMedio2(n)\n    return N(n, arbolFactorizacion2(x), arbolFactorizacion2(y))\n\n# Comprobaci\u00f3n de equivalencia\n# ============================\n\n# La propiedad es\n@given(st.integers(min_value=2, max_value=200))\ndef test_arbolFactorizacion(n: int) -> None:\n    assert arbolFactorizacion1(n) == arbolFactorizacion2(n)\n\n# La comprobaci\u00f3n es\n#    src> poetry run pytest -q arbol_de_factorizacion.py\n#    1 passed in 0.14s\n<\/pre>\n<p><a name=\"ej3\"><\/a><\/p>\n<h3>3. Valor de un \u00e1rbol booleano<\/h3>\n<p>Se consideran los \u00e1rboles con operaciones booleanas definidos por<\/p>\n<pre lang=\"text\">\n   data Arbol = H Bool\n              | Conj Arbol Arbol\n              | Disy Arbol Arbol\n              | Neg Arbol\n<\/pre>\n<p>Por ejemplo, los \u00e1rboles<\/p>\n<pre lang=\"text\">\n               Conj                            Conj\n              \/   \\                           \/   \\\n             \/     \\                         \/     \\\n          Disy      Conj                  Disy      Conj\n         \/   \\       \/  \\                \/   \\      \/   \\\n      Conj    Neg   Neg True          Conj    Neg   Neg  True\n      \/  \\    |     |                 \/  \\    |     |\n   True False False False          True False True  False\n<\/pre>\n<p>se definen por<\/p>\n<pre lang=\"text\">\n   ej1, ej2:: Arbol\n   ej1 = Conj (Disy (Conj (H True) (H False))\n                    (Neg (H False)))\n              (Conj (Neg (H False))\n                    (H True))\n\n   ej2 = Conj (Disy (Conj (H True) (H False))\n                    (Neg (H True)))\n              (Conj (Neg (H False))\n                    (H True))\n<\/pre>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   valor :: Arbol -> Bool\n<\/pre>\n<p>tal que <code>valor a<\/code>) es el resultado de procesar el \u00e1rbol <code>a<\/code> realizando las operaciones booleanas especificadas en los nodos. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   valor ej1 == True\n   valor ej2 == False\n<\/pre>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\ndata Arbol = H Bool\n           | Conj Arbol Arbol\n           | Disy Arbol Arbol\n           | Neg Arbol\n\nej1, ej2 :: Arbol\nej1 = Conj (Disy (Conj (H True) (H False))\n                 (Neg (H False)))\n           (Conj (Neg (H False))\n                 (H True))\n\nej2 = Conj (Disy (Conj (H True) (H False))\n                 (Neg (H True)))\n           (Conj (Neg (H False))\n                 (H True))\n\nvalor :: Arbol -> Bool\nvalor (H x)      = x\nvalor (Neg a)    = not (valor a)\nvalor (Conj i d) = valor i && valor d\nvalor (Disy i d) = valor i || valor d\n<\/pre>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom dataclasses import dataclass\n\n@dataclass\nclass Arbol:\n    pass\n\n@dataclass\nclass H(Arbol):\n    x: bool\n\n@dataclass\nclass Conj(Arbol):\n    i: Arbol\n    d: Arbol\n\n@dataclass\nclass Disy(Arbol):\n    i: Arbol\n    d: Arbol\n\n@dataclass\nclass Neg(Arbol):\n    a: Arbol\n\nej1: Arbol = Conj(Disy(Conj(H(True), H(False)),\n                       (Neg(H(False)))),\n                  (Conj(Neg(H(False)),\n                        (H(True)))))\n\nej2: Arbol = Conj(Disy(Conj(H(True), H(False)),\n                       (Neg(H(True)))),\n                  (Conj(Neg(H(False)),\n                        (H(True)))))\n\ndef valor(a: Arbol) -> bool:\n    match a:\n        case H(x):\n            return x\n        case Neg(b):\n            return not valor(b)\n        case Conj(i, d):\n            return valor(i) and valor(d)\n        case Disy(i, d):\n            return valor(i) or valor(d)\n    assert False\n<\/pre>\n<p><a name=\"ej4\"><\/a><\/p>\n<h3>4. Valor de una expresi\u00f3n aritm\u00e9tica b\u00e1sica<\/h3>\n<p>Las expresiones aritm\u00e9ticas b\u00e1sicas pueden representarse usando el siguiente tipo de datos<\/p>\n<pre lang=\"text\">\n   data Expr = C Int\n             | S Expr Expr\n             | P Expr Expr\n<\/pre>\n<p>Por ejemplo, la expresi\u00f3n 2*(3+7) se representa por<\/p>\n<pre lang=\"text\">\n   P (C 2) (S (C 3) (C 7))\n<\/pre>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   valor :: Expr -> Int\n<\/pre>\n<p>tal que <code>valor e<\/code> es el valor de la expresi\u00f3n aritm\u00e9tica <code>e<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   valor (P (C 2) (S (C 3) (C 7)))  ==  20\n<\/pre>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\ndata Expr = C Int\n          | S Expr Expr\n          | P Expr Expr\n\nvalor :: Expr -> Int\nvalor (C x)   = x\nvalor (S x y) = valor x + valor y\nvalor (P x y) = valor x * valor y\n<\/pre>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom dataclasses import dataclass\n\n\n@dataclass\nclass Expr:\n    pass\n\n@dataclass\nclass C(Expr):\n    x: int\n\n@dataclass\nclass S(Expr):\n    x: Expr\n    y: Expr\n\n@dataclass\nclass P(Expr):\n    x: Expr\n    y: Expr\n\ndef valor(e: Expr) -> int:\n    match e:\n        case C(x):\n            return x\n        case S(x, y):\n            return valor(x) + valor(y)\n        case P(x, y):\n            return valor(x) * valor(y)\n    assert False\n<\/pre>\n<p><a name=\"ej5\"><\/a><\/p>\n<h3>5. Aplicaci\u00f3n de una funci\u00f3n a una expresi\u00f3n aritm\u00e9tica<\/h3>\n<p>Las expresiones aritm\u00e9ticas b\u00e1sicas pueden representarse usando el siguiente tipo de datos<\/p>\n<pre lang=\"text\">\n   data Expr = C Int\n             | S Expr Expr\n             | P Expr Expr\n     deriving (Show, Eq)\n<\/pre>\n<p>Por ejemplo, la expresi\u00f3n 2*(3+7) se representa por<\/p>\n<pre lang=\"text\">\n   P (C 2) (S (C 3) (C 7))\n<\/pre>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   aplica :: (Int -> Int) -> Expr -> Expr\n<\/pre>\n<p>tal que <code>aplica f e<\/code> es la expresi\u00f3n obtenida aplicando la funci\u00f3n <code>f<\/code> a cada uno de los n\u00fameros de la expresi\u00f3n <code>e<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> aplica (+2) (S (P (C 3) (C 5)) (P (C 6) (C 7)))\n   S (P (C 5) (C 7)) (P (C 8) (C 9))\n   \u03bb> aplica (*2) (S (P (C 3) (C 5)) (P (C 6) (C 7)))\n   S (P (C 6) (C 10)) (P (C 12) (C 14))\n<\/pre>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\ndata Expr = C Int\n          | S Expr Expr\n          | P Expr Expr\n  deriving (Show, Eq)\n\naplica :: (Int -> Int) -> Expr -> Expr\naplica f (C x)     = C (f x)\naplica f (S e1 e2) = S (aplica f e1) (aplica f e2)\naplica f (P e1 e2) = P (aplica f e1) (aplica f e2)\n<\/pre>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom dataclasses import dataclass\nfrom typing import Callable\n\n\n@dataclass\nclass Expr:\n    pass\n\n@dataclass\nclass C(Expr):\n    x: int\n\n@dataclass\nclass S(Expr):\n    x: Expr\n    y: Expr\n\n@dataclass\nclass P(Expr):\n    x: Expr\n    y: Expr\n\ndef aplica(f: Callable[[int], int], e: Expr) -> Expr:\n    match e:\n        case C(x):\n            return C(f(x))\n        case S(x, y):\n            return S(aplica(f, x), aplica(f, y))\n        case P(x, y):\n            return P(aplica(f, x), aplica(f, y))\n    assert False\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Esta semana he publicado en Exercitium las soluciones de los siguientes problemas: 1. Elementos del nivel k de un \u00e1rbol 2. \u00c1rbol de factorizaci\u00f3n 3. Valor de un \u00e1rbol booleano 4. Valor de una expresi\u00f3n aritm\u00e9tica b\u00e1sica 5. Aplicaci\u00f3n de una funci\u00f3n a una expresi\u00f3n aritm\u00e9tica A continuaci\u00f3n se muestran las soluciones.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[337],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7874"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=7874"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7874\/revisions"}],"predecessor-version":[{"id":7875,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7874\/revisions\/7875"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=7874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=7874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=7874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}