coDual2024-03-02T11:55:30+00:00https://codual.github.ioCómo ser ingeniero de software: una perspectiva personal2020-07-26T00:00:00+00:00https://codual.github.io/2020/07/26/work-lessons
<p>Estas notas intentan reunir algunas cosas que me habría gustado saber antes de empezar a buscar trabajo como ingeniero de software. Las escribí para unos pocos amigxs pero he pensado que podría ser útil a otras personas.
No pretenden tener una estructura de texto para leer de principio a fin, siéntete libre de leer sólo las secciones que más te interesen.</p>
<h2 id="mis-objetivos">Mis objetivos</h2>
<p>Buscar trabajo como ingeniero informático es relativamente sencillo; hay mucha demanda y si no tienes muchas restricciones puedes encontrar trabajo seguro. Lo malo es que puede ser de algo que no te guste mucho o que las condiciones o el salario no sean todo lo buenas que podrían ser.</p>
<p>En mi caso consideraba como aspectos relevantes</p>
<ul>
<li>la posibilidad del teletrabajo, bien desde el principio o a medio plazo,</li>
<li>que mi trabajo me permita contribuir a software libre,</li>
<li>poder hacer charlas o escribir cosas técnicas que tengan algo de presencia pública,</li>
<li>utilizar tecnologías que me interesaran o al menos no me parecieran horribles,</li>
<li>utilizar o aplicar resultados de investigación en el trabajo y</li>
<li>estar cómodo con las implicaciones éticas de mi trabajo.</li>
</ul>
<h2 id="qué-he-hecho">Qué he hecho</h2>
<p>Intenté llevar un registro de todas las empresas en las que mandé algún tipo de solicitud, pero me resultaba más laborioso hacerlo que el propio acto de rellenar las solicitudes<sup id="fnref:sql" role="doc-noteref"><a href="#fn:sql" class="footnote" rel="footnote">1</a></sup> así que abandoné el intento, por lo que las estadísticas de esta sección son aproximadas. Solicité trabajo en aproximadamente cien empresas de las que he hecho alguna parte del proceso de entrevistas con doce de ellas.</p>
<p>En el periodo de búsqueda de trabajo he dedicado principalmente mi tiempo a hacer entrevistas, preparar esas entrevistas y hacer proyectos relevantes. El proceso ha durado unos 6 meses, y estoy satisfecho con el resultado: he acabado trabajando en <a href="https://datadoghq.com">Datadog</a>, cumpliendo la gran mayoría de los objetivos.</p>
<h2 id="cómo-empezar">Cómo empezar</h2>
<p>Cinco cosas que puedes hacer desde el principio son:</p>
<dl>
<dt>Definir tus objetivos</dt>
<dd>Es importante tener más o menos claras cosas como a qué sitios estás dispuesto a mudarte, qué tecnologías nunca vas a querer utilizar o qué tipo de puestos o responsabilidades te interesa tener. Esto te permite tener criterio para luego decidir entre distintos puestos. Siempre puedes revisar tus objetivos a posteriori.</dd>
<dt>Preparar el CV</dt>
<dd>Hay decenas de guías sobre cómo escribir un CV, así que tampoco creo que pueda decir muchas cosas novedosas o importantes aquí, pero quizá hay tres consejos destacables:</dd>
</dl>
<ol>
<li>importan más las palabras clave y la corrección en la escritura a ser específico en las cosas técnicas,</li>
<li>pon uno o dos proyectos de los que puedas hablar de forma extendida en las entrevistas y</li>
<li>pide a terceros que lean tu CV antes de tener una versión final.</li>
</ol>
<dl>
<dt>Hacer prácticas de entrevista</dt>
<dd>Puedes hacer entrevistas de prueba con otra gente, en sitios como <a href="https://www.pramp.com/#/">pramp.com</a> o <a href="https://interviewing.io">interviewing.io</a>, con sitios de problemas por ti mismx o simplemente coger experiencia haciendo entrevistas con otras empresas.</dd>
<dt>Hacer proyectos de los que puedas hablar</dt>
<dd>Por ejemplo empezar un blog de cosas técnicas, contribuir a algún proyecto de software libre o hacer tu propio proyecto pequeño (como unas prácticas de universidad) pero de lo que tu quieras.</dd>
<dt>Solicitar muchos puestos de trabajo</dt>
<dd>Tras amortizar el coste de preparar una solicitud, cuesta entre 5 y 15 minutos enviar un CV para una empresa y siempre puedes cambiar de opinión si la empresa no te convence más adelante en el proceso, así que salvo que tengas claro que no estás para nada interesado en hacer el proceso de entrevistas deberías mandar tantas solicitudes como puedas. En una sección posterior puedes encontrar más información sobre dónde mandar solicitudes.</dd>
</dl>
<h2 id="cómo-es-el-proceso-de-entrevistas">Cómo es el proceso de entrevistas</h2>
<p>En principio esperaba que la mayor parte las entrevistas fueran de problemas algorítmicos a resolver entre 45 minutos y 1 hora. Si bien esta es una fracción importante de las entrevistas que he hecho hay muchas otras cosas que las empresas hacen en sus procesos de entrevistas y son más generales. Incluso hay empresas grandes en las que llegué al final del proceso de entrevistas sin escribir una sola línea de código.</p>
<p>Me centro en las preguntas técnicas pero también hay llamadas para</p>
<ul>
<li>decidir cuándo hacer ciertas entrevistas,</li>
<li>explicar cosas de las empresas o el puesto y que puedas hacer preguntas y</li>
<li>recibir feedback sobre cómo lo has hecho en otras entrevistas.</li>
</ul>
<p>Las pruebas técnicas pueden dividirse en las siguientes categorías, ordenadas aproximadamente por en qué parte del proceso de entrevistas se suelen hacer:</p>
<dl>
<dt>Tests o preguntas cortas de conocimientos sobre cosas de informática</dt>
<dd>Tests sencillos que normalmente son la primera fase porque al ser evaluados fácilmente las empresas pueden distribuirlos masivamente o administrados por un entrevistador que sólo tiene que comprobar una checklist. Para prepararlos puedes memorizar algunos conceptos y definiciones básicas de informática. Dependiendo de a qué se dedique la empresa las preguntas pueden ser más específicas de un campo.</dd>
<dt>Hablar de tu experiencia previa</dt>
<dd>Preguntas sobre cosas que has hecho, a veces centrándose en proyectos concretos que has hecho. Para prepararlas elige algunos proyectos sobre los que vas a hablar y piensa en los aspectos que quieres destacar en las entrevistas.</dd>
<dt>Evaluar tu conocimiento sobre la empresa</dt>
<dd>Preguntas sobre por qué te interesa el puesto, la empresa o el campo en general, tanto para evaluar tus conocimientos sobre el tema como cómo de interesado estás. Lee sobre la empresa e intenta informarte sobre lo que hace.</dd>
<dt>Problemas de programación o de informática</dt>
<dd>Resolución un problema concreto en un tiempo limitado durante una entrevista, dando su complejidad en tiempo y en espacio e intentando justificar tus decisiones. Para estas entrevistas es para las que más material hay para prepararse en Internet, incluyendo páginas como Glassdoor. A veces los problemas pueden ser de configuración de sistemas o máquinas virtuales dependiendo del ámbito de la empresa.</dd>
<dt>Proyectos para hacer por tu cuenta (<em>take-home</em>)</dt>
<dd>Proyectos más largos para resolver un cierto problema de programación. Pueden llevar de unas horas a varios días. Suelen hacerse en una fase más avanzada pero a veces son el primer paso (en cuyo caso a lo mejor merece menos la pena hacerlos si llevan mucho tiempo). Su intención es evaluar cómo programas en un entorno más realista. A veces se acompañan por una entrevista posterior en la que discutir la solución. Asegúrate de testearlo todo y usa linters y warnings para evitar errores tontos. Raramente son pagados a menos que sean trabajo real; asegúrate de licenciarlos adecuadamente para evitar estar trabajando gratis.</dd>
<dt>Diseño de sistemas</dt>
<dd>Discusiones sobre cómo diseñar a grandes rasgos un programa, gestionar los errores, testearlo, dividirlo en partes que sean mantenibles… Es útil ver qué tipos de problemas resuelve la empresa porque te van a preguntar cosas del campo. No he llegado a encontrar ningún material online que me convenza mucho para prepararse.</dd>
<dt>Entrevistas de comportamiento</dt>
<dd>Preguntas como: ¿Te gusta trabajar solx o en equipo? ¿Cómo te describirías? ¿Cómo lidias con el conflicto? Puedes encontrar fácilmente listados de preguntas de este estilo, el objetivo es asegurarse de que eres una personas con la que es agradable y viable trabajar.</dd>
<dt>Visto bueno de ejecutivos</dt>
<dd>Dependiendo del tamaño de la empresa y de la suerte que tengas a veces te hacen una entrevista hacia el final del proceso con alguien que tiene un cargo alto, como directores de ingeniería o CTOs. Normalmente están ahí para dar el visto bueno y simplemente tienes que parecer una persona razonable.</dd>
</dl>
<p>Puede haber más de una entrevista de cada tipo (sobre todo de experiencia previa y de programación) y puede que una entrevista mezcle cosas de distintos tipos.</p>
<h2 id="sitios-donde-encontrar-empresas">Sitios donde encontrar empresas</h2>
<p>Aquí hay una lista de sitios donde puedes encontrar empresas para buscar trabajo.
Toda mi búsqueda de trabajo fue pre-pandemia así que puede que las cosas hayan cambiado y ahora sea diferente.
80000 Hours tiene <a href="https://80000hours.org/career-guide/how-to-get-a-job/">una guía</a> sobre esto con tips concretos, pero mi impresión es que su público objetivo son estudiantes de Oxford que tienen ya decenas de conexiones y por eso su utilidad es limitada si no cumples ese perfil.</p>
<dl>
<dt>Preguntando a otra gente que está haciendo entrevistas o trabajando</dt>
<dd>Muchas empresas dan un bonus a sus empleados si hacen recomendaciones de potenciales empleados para un puesto (<em>referrals</em>). Esa información puede incrementar tus posibilidades de éxito así que es una ventaja. Incluso si no hay sistema de referrals sigue siendo interesante por el conocimiento interno de la empresa. También si conoces a alguien que esté también buscando trabajo puedes compartir ofertas.</dd>
<dt><a href="https://stackoverflow.com/jobs">StackOverflow Jobs</a></dt>
<dd>El sitio mejor organizado para encontrar trabajo en Europa y EEUU que he visto es StackOverflow Jobs. Puedes crear avisos por correo semanales o diarios de nuevas ofertas y filtrar por distintos criterios. Es bastante sencillo de usar.</dd>
<dt>LinkedIn</dt>
<dd>Hay empresas que sólo se anuncian en LinkedIn o que se anuncian en otros sitios y te ponen que les mandes el CV por LinkedIn, así que tener un perfil es algo que vas a necesitar tarde o temprano.</dd>
<dt>Indeed, infojobs y otros</dt>
<dd>Nunca he encontrado nada útil en ninguna de estas pero no está de más mencionarlas.</dd>
<dt>Páginas webs de empresas</dt>
<dd>Hay un porcentaje importante de empresas que no publican sus puestos en ningún sitio salvo en su página web, así que en algunos casos mirar las webs está bien para ver oportunidades que no están en otro sitio.</dd>
<dt>Reddit y listas de correo</dt>
<dd>Por último hay otros trabajos (por ejemplo aquellos que tienen un enfoque muy específico) que suelen anunciarse por canales de ese tema específico como pueden ser subreddit, listas de correo y blogs. Suscríbete a las de los temas que te interesen.</dd>
</dl>
<h2 id="otros-consejos-y-cosas-que-he-aprendido">Otros consejos y cosas que he aprendido</h2>
<dl>
<dt>Que te respondan o no parece bastante aleatorio</dt>
<dd>Es muy difícil saber por qué una empresa te ha preseleccionado: en general se recibe poco feedback sobre cómo de bien o mal lo has hecho en un proceso de entrevistas, o te puedes fiar poco del que recibes (si eres suficientemente bueno no quieren descartarte por si en el futuro te vuelven a llamar). Las empresas tampoco tienen mucho interés en decirte cómo son el resto de candidatxs que están entrevistando. Por ejemplo, mi capacidad personal de predicción de qué empresas van a responder es nula. Por tanto, solicita trabajo en cualquier empresa aunque pienses que no te van a responder.</dd>
<dt>Las empresas hacen <em>ghosting</em> con más frecuencia de lo esperado</dt>
<dd>En un porcentaje importante de las empresas en las que solicité trabajo no tuve ninguna respuesta o sólo una respuesta automatizada. Desde una perspectiva económica de la empresa es lo esperable: si no tienen suficiente interés en ti no quieren invertir más tiempo.</dd>
<dt>Las empresas hacen cosas que no parecen optimizar encontrar el mejor candidato</dt>
<dd>No soy, desde luego, un experto en las técnicas de reclutamiento de las empresas pero creo que hay ciertos aspectos del proceso bastante comunes que no parecen los más óptimos en términos de coste-beneficio: a veces hay preguntas que no tienen mucha relación con el campo o algunas cosas que tienen un coste elevado sin aportar muchos beneficios (más allá del <em>signaling</em> por parte de la empresa de que está interesada en ti como candidatx).</dd>
<dt>Los sueldos varían muchísimo y se pueden negociar</dt>
<dd>Aparte de las variaciones normales por el país/ciudad, la variación entre los salarios que me han ofrecido es de casi 4 veces entre el menor y el mayor. Las ofertas son negociables, <a href="https://www.freecodecamp.org/news/ten-rules-for-negotiating-a-job-offer-ee17cccbdab6/">este artículo</a> no está mal para la negociación.</dd>
<dt>Saber hablar bien inglés ayuda mucho</dt>
<dd>La gran mayoría de empresas te van a pedir que hables inglés, si lo haces y puedes expresarte bien pues ayuda bastante a que crean que eres un buen candidatx.</dd>
</dl>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:sql" role="doc-endnote">
<p>En retrospectiva quizá no ayudara el hecho de que estaba insertando a mano las cosas en una base de datos con <code class="language-plaintext highlighter-rouge">INSERT</code>s manuales. <a href="#fnref:sql" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Composing traversals2019-07-03T00:00:00+00:00https://codual.github.io/2019/07/03/traversal
<p><em>This post assumes basic knowledge on Haskell, including what <code class="language-plaintext highlighter-rouge">Functor</code> and <code class="language-plaintext highlighter-rouge">Monad</code> are.</em></p>
<h2 id="the-problem">The problem</h2>
<p>A few months ago, I was at a functional programming conference where the following problem<sup id="fnref:problem" role="doc-noteref"><a href="#fn:problem" class="footnote" rel="footnote">1</a></sup> was posed at a talk</p>
<blockquote>
<p>Given a container <code class="language-plaintext highlighter-rouge">Tree</code>,
write a function <code class="language-plaintext highlighter-rouge">update :: Tree a -> [a] -> Maybe (Tree a)</code> that,
when called as <code class="language-plaintext highlighter-rouge">update t as</code>, updates the leaves of <code class="language-plaintext highlighter-rouge">t</code> by the
new tags in <code class="language-plaintext highlighter-rouge">as</code> (listed in preorder).</p>
<p>If there are not enough elements on <code class="language-plaintext highlighter-rouge">as</code>, just return <code class="language-plaintext highlighter-rouge">Nothing</code></p>
</blockquote>
<p>This post attempts to explain a concise solution to that problem.
You might want to try it on your own at first and then come back and read my solution.
If you think your solution is better, please send it to me!</p>
<p>We will need the following modules:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">import</span> <span class="nn">Data.Tree</span>
<span class="kr">import</span> <span class="nn">Control.Monad.State</span>
<span class="kr">import</span> <span class="nn">Data.Maybe</span>
<span class="kr">import</span> <span class="nn">Data.Functor.Compose</span>
</code></pre></div></div>
<h2 id="multi-way-trees">Multi-way <code class="language-plaintext highlighter-rouge">Tree</code>s</h2>
<p>In order to solve the problem, we will make use of multi-way trees, also known as <em>rose trees</em>, which are defined as</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">data</span> <span class="kt">Tree</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">Node</span> <span class="n">a</span> <span class="p">[</span><span class="kt">Tree</span> <span class="n">a</span><span class="p">]</span>
</code></pre></div></div>
<p>That is, a <code class="language-plaintext highlighter-rouge">Tree</code> is made from the value of the root node (of type <code class="language-plaintext highlighter-rouge">a</code>) and a (possibly empty) list of children trees.
To warm-up we will need a simple function<sup id="fnref:pure" role="doc-noteref"><a href="#fn:pure" class="footnote" rel="footnote">2</a></sup> that creates a singleton tree from a value.</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">singleton</span> <span class="o">::</span> <span class="n">a</span> <span class="o">-></span> <span class="kt">Tree</span> <span class="n">a</span>
<span class="n">singleton</span> <span class="n">x</span> <span class="o">=</span> <span class="kt">Node</span> <span class="n">x</span> <span class="kt">[]</span>
</code></pre></div></div>
<p>That was easy! Now, to simplify the problem a little, let’s first try writing an</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafeUpdate</span> <span class="o">::</span> <span class="kt">Tree</span> <span class="n">a</span> <span class="o">-></span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">-></span> <span class="kt">Tree</span> <span class="n">a</span>
</code></pre></div></div>
<p>function. If you don’t know how to approach this problem, you can think of it on imperative terms.</p>
<p>The following is a plausible solution on Python, assuming some tree type with methods <code class="language-plaintext highlighter-rouge">tag</code> and <code class="language-plaintext highlighter-rouge">children</code> and a predicate <code class="language-plaintext highlighter-rouge">isLeaf</code> that tells you whether a tree is a leaf.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">unsafeUpdate</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="k">as</span><span class="p">):</span>
<span class="k">if</span> <span class="n">isLeaf</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
<span class="n">t</span><span class="p">.</span><span class="n">tag</span> <span class="o">=</span> <span class="k">as</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">t</span><span class="p">.</span><span class="n">children</span><span class="p">:</span>
<span class="n">unsafeUpdate</span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="k">as</span><span class="p">)</span>
</code></pre></div></div>
<p>As we shall see, the solution present in this post is strikingly similar in appearance to that one, yet it remains purely functional. Of course, other possibilities exist, yet I believe this one is concise, efficient and it is easily transformed into a safe version.</p>
<h2 id="purely-functional-state">Purely functional <code class="language-plaintext highlighter-rouge">State</code></h2>
<p>This section introduces the <code class="language-plaintext highlighter-rouge">State</code> monad.
If you already know about it, you may skip it.</p>
<p>The <code class="language-plaintext highlighter-rouge">Control.Monad.State</code> module can be scary-looking at first, yet we will make simple use of it.
It defines a monad<sup id="fnref:MonadState" role="doc-noteref"><a href="#fn:MonadState" class="footnote" rel="footnote">3</a></sup> <code class="language-plaintext highlighter-rouge">State</code>, that can be thought of as having this definition:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">newtype</span> <span class="kt">State</span> <span class="n">s</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">State</span> <span class="p">{</span><span class="n">runState</span> <span class="o">::</span> <span class="n">s</span> <span class="o">-></span> <span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">s</span><span class="p">)</span> <span class="p">}</span>
</code></pre></div></div>
<p>A value <code class="language-plaintext highlighter-rouge">m :: State s a</code> encapsulates a transformation that makes use of a state <code class="language-plaintext highlighter-rouge">s</code>, it (possibly) transforms it and obtains a value of type <code class="language-plaintext highlighter-rouge">a</code>.
For example, a function from <a href="https://hackage.haskell.org/package/random/docs/System-Random.html"><code class="language-plaintext highlighter-rouge">System.Random</code></a> such as <a href="https://hackage.haskell.org/package/random/docs/System-Random.html#v:random"><code class="language-plaintext highlighter-rouge">random</code></a> <code class="language-plaintext highlighter-rouge">:: StdGen -> (a, StdGen)</code> could be encapsulated inside a <code class="language-plaintext highlighter-rouge">randomState :: State StdGen a</code> value that produces a random value and has as an internal state the seed of type <code class="language-plaintext highlighter-rouge">StdGen</code>.</p>
<p>By encapsulating state transformations in this way, we can remain pure while simulating computations that use some sort of state.</p>
<p>Unsurprisingly, for any possible type <code class="language-plaintext highlighter-rouge">s</code>, <code class="language-plaintext highlighter-rouge">State s</code> is a functor, with mapping given by</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">f</span> <span class="o"><$></span> <span class="n">m</span> <span class="o">=</span> <span class="kt">State</span> <span class="o">$</span> <span class="nf">\</span><span class="n">s</span> <span class="o">-></span> <span class="kr">let</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">s</span><span class="p">)</span> <span class="o">=</span> <span class="n">runState</span> <span class="n">m</span> <span class="n">s</span> <span class="kr">in</span> <span class="p">(</span><span class="n">f</span> <span class="n">a</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</code></pre></div></div>
<p>That is, we run the state modifying computation <code class="language-plaintext highlighter-rouge">m</code> and then apply <code class="language-plaintext highlighter-rouge">f</code> to its result, leaving the state unchanged.</p>
<p>It also is an <code class="language-plaintext highlighter-rouge">Applicative</code> and a <code class="language-plaintext highlighter-rouge">Monad</code>.
For simplicity, we only show the definitions of <code class="language-plaintext highlighter-rouge">pure</code> and <code class="language-plaintext highlighter-rouge">>>=</code>, leaving <code class="language-plaintext highlighter-rouge"><*></code> as an exercise<sup id="fnref:return" role="doc-noteref"><a href="#fn:return" class="footnote" rel="footnote">4</a></sup>.</p>
<p><code class="language-plaintext highlighter-rouge">pure x</code> is the computation that returns <code class="language-plaintext highlighter-rouge">x</code>, leaving the state unchanged.</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pure</span> <span class="n">x</span> <span class="o">=</span> <span class="kt">State</span> <span class="o">$</span> <span class="nf">\</span><span class="n">s</span> <span class="o">-></span> <span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
</code></pre></div></div>
<p>The bind operator is a bit more complicated; on this setting its type would be</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">>>=</span> <span class="o">::</span> <span class="kt">State</span> <span class="n">s</span> <span class="n">a</span> <span class="o">-></span> <span class="p">(</span><span class="n">a</span> <span class="o">-></span> <span class="kt">State</span> <span class="n">s</span> <span class="n">b</span><span class="p">)</span> <span class="o">-></span> <span class="kt">State</span> <span class="n">s</span> <span class="n">b</span>
</code></pre></div></div>
<p>that is, it takes a computation that would produce a value of type <code class="language-plaintext highlighter-rouge">a</code>, runs it and applies the given function.</p>
<p>Its definition is equivalent to</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">m</span> <span class="o">>>=</span> <span class="n">f</span> <span class="o">=</span> <span class="kt">State</span> <span class="o">$</span> <span class="nf">\</span><span class="n">s</span> <span class="o">-></span>
<span class="kr">let</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">s'</span><span class="p">)</span> <span class="o">=</span> <span class="n">runState</span> <span class="n">m</span> <span class="n">s</span>
<span class="kr">in</span> <span class="n">runState</span> <span class="p">(</span><span class="n">f</span> <span class="n">a</span><span class="p">)</span> <span class="n">s'</span>
</code></pre></div></div>
<p>State also defines a set of functions that allow us to get and manipulate the internal state, and to get the final value of the computation.
We will use (with simplified type signatures):</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">get</code>, that gets the state,
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">get</span> <span class="o">::</span> <span class="kt">State</span> <span class="n">s</span> <span class="n">s</span>
<span class="n">get</span> <span class="o">=</span> <span class="kt">State</span> <span class="o">$</span> <span class="nf">\</span><span class="n">s</span> <span class="o">-></span> <span class="p">(</span><span class="n">s</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
</code></pre></div> </div>
</li>
<li><code class="language-plaintext highlighter-rouge">modify</code>, that applies a function to the internal state,
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">modify</span> <span class="o">::</span> <span class="p">(</span><span class="n">s</span> <span class="o">-></span> <span class="n">s</span><span class="p">)</span> <span class="o">-></span> <span class="kt">State</span> <span class="n">s</span> <span class="nb">()</span>
<span class="n">modify</span> <span class="n">f</span> <span class="o">=</span> <span class="kt">State</span> <span class="o">$</span> <span class="nf">\</span><span class="n">s</span> <span class="o">-></span> <span class="p">(</span><span class="nb">()</span><span class="p">,</span> <span class="n">f</span> <span class="n">s</span><span class="p">)</span>
</code></pre></div> </div>
</li>
<li><code class="language-plaintext highlighter-rouge">evalState</code>, that gets the final value of the computation,
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">evalState</span> <span class="o">::</span> <span class="kt">State</span> <span class="n">s</span> <span class="n">a</span> <span class="o">-></span> <span class="n">s</span> <span class="o">-></span> <span class="n">a</span>
<span class="n">evalState</span> <span class="o">=</span> <span class="n">fst</span> <span class="o">.</span> <span class="n">runState</span>
</code></pre></div> </div>
</li>
</ul>
<p>If you feel like you need further examples on <code class="language-plaintext highlighter-rouge">State</code> before moving on, you can check the <a href="https://en.wikibooks.org/wiki/Haskell/Understanding_monads/State">Wikibooks tutorial</a>.</p>
<h2 id="the-base-case">The base case</h2>
<p>We are now ready to write a skeleton of the <code class="language-plaintext highlighter-rouge">unsafeUpdate</code> function, and to write a the base case.</p>
<p>As you might expect, the idea is to write it in terms of a function using <code class="language-plaintext highlighter-rouge">State</code>.
The internal state will be the list of remaining new leaves, and thus we want to write a function with type</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafeUpdateSt</span> <span class="o">::</span> <span class="kt">Tree</span> <span class="n">a</span> <span class="o">-></span> <span class="kt">State</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="p">(</span><span class="kt">Tree</span> <span class="n">a</span><span class="p">)</span>
</code></pre></div></div>
<p>By using what we learned in the last section, we could then write:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafeUpdate</span> <span class="o">=</span> <span class="n">evalState</span> <span class="o">.</span> <span class="n">unsafeUpdateSt</span>
</code></pre></div></div>
<p>But let’s not get ahead of ourselves.
If we look at the base case on the Python version we want to simulate the line <code class="language-plaintext highlighter-rouge">t.tag = as.pop(0)</code>, that is, extracting the first value of the <code class="language-plaintext highlighter-rouge">as</code> list and returning it.</p>
<p>Let’s try and write a version of <code class="language-plaintext highlighter-rouge">pop</code> (named <code class="language-plaintext highlighter-rouge">unsafePop</code>) using the <code class="language-plaintext highlighter-rouge">State</code> monad.
What would its type be?
We don’t really need to specify the index here, since we will only take the first element, hence, it is just a <code class="language-plaintext highlighter-rouge">State</code> value.
The internal state would be the list of tags <code class="language-plaintext highlighter-rouge">[a]</code> and the result of the computation would be the first element of the list, with type <code class="language-plaintext highlighter-rouge">a</code>. Therefore:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafePop</span> <span class="o">::</span> <span class="kt">State</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="n">a</span>
</code></pre></div></div>
<p>Now, using <code class="language-plaintext highlighter-rouge">do</code> notation we can write the function easily: we first get the internal state, then we delete the first element from it and lastly we return this element:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafePop</span> <span class="o">=</span> <span class="kr">do</span>
<span class="n">xs</span> <span class="o"><-</span> <span class="n">get</span>
<span class="n">modify</span> <span class="n">tail</span>
<span class="n">pure</span> <span class="p">(</span><span class="n">head</span> <span class="n">xs</span><span class="p">)</span>
</code></pre></div></div>
<p>That almost looks like imperative code!</p>
<p>Now, for tackling the base case, we just need to get a <code class="language-plaintext highlighter-rouge">State [a] (Tree a)</code> from that <code class="language-plaintext highlighter-rouge">State [a] a</code> value, therefore:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafeUpdateSt</span> <span class="p">(</span><span class="kt">Node</span> <span class="kr">_</span> <span class="kt">[]</span><span class="p">)</span> <span class="o">=</span> <span class="n">singleton</span> <span class="o"><$></span> <span class="n">unsafePop</span>
</code></pre></div></div>
<p>The inductive case will need further machinery.</p>
<h2 id="list-traversals">List traversals</h2>
<p>If we look at the Python code, we can see that the gist of the inductive case is to apply the function <code class="language-plaintext highlighter-rouge">unsafeUpdateSt</code> recursively to the list of children,</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">for</span> <span class="n">child</span> <span class="kr">in</span> <span class="n">t</span><span class="o">.</span><span class="n">children</span><span class="o">:</span>
<span class="n">unsafeUpdate</span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="n">as</span><span class="p">)</span>
</code></pre></div></div>
<p>and pass the list of remaining new tags around.</p>
<p>Of course, there are no for loops on Haskell, (at least not exactly) so we need to resort to (implicit) recursion.
Now, the usual way to apply a function to a list is by treating the list as a functor and using the <code class="language-plaintext highlighter-rouge">map</code> function, whose definition (with <code class="language-plaintext highlighter-rouge">:</code> written in prefix notation) is</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">map</span> <span class="o">::</span> <span class="p">(</span><span class="n">a</span> <span class="o">-></span> <span class="n">b</span><span class="p">)</span> <span class="o">-></span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">-></span> <span class="p">[</span><span class="n">b</span><span class="p">]</span>
<span class="n">map</span> <span class="kr">_</span> <span class="kt">[]</span> <span class="o">=</span> <span class="kt">[]</span>
<span class="n">map</span> <span class="n">f</span> <span class="p">(</span><span class="n">x</span><span class="o">:</span><span class="n">xs</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="o">:</span><span class="p">)</span> <span class="p">(</span><span class="n">f</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="n">map</span> <span class="n">f</span> <span class="n">xs</span><span class="p">)</span>
</code></pre></div></div>
<p>yet in this case or function <code class="language-plaintext highlighter-rouge">unsafeUpdateSt :: Tree a -> State [a] (Tree a)</code> has a type that looks more like <code class="language-plaintext highlighter-rouge">a -> f b</code> for a certain container <code class="language-plaintext highlighter-rouge">f</code> (namely, <code class="language-plaintext highlighter-rouge">State [a]</code>) and thus <code class="language-plaintext highlighter-rouge">map</code> is not useful in this situation<sup id="fnref:mapm" role="doc-noteref"><a href="#fn:mapm" class="footnote" rel="footnote">5</a></sup>. A generalization is needed.</p>
<p>The <code class="language-plaintext highlighter-rouge">Traversable</code> class provides just that generalization (and much more).
We will use it only on lists, but it can be used on any <code class="language-plaintext highlighter-rouge">Functor</code> that supports an iterator-like interface (for example, most data structures on the <code class="language-plaintext highlighter-rouge">containers</code> library). Its type (specialized to lists) is</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">traverse</span> <span class="o">::</span> <span class="p">(</span><span class="kt">Applicative</span> <span class="n">f</span><span class="p">)</span> <span class="o">=></span> <span class="p">(</span><span class="n">a</span> <span class="o">-></span> <span class="n">f</span> <span class="n">b</span><span class="p">)</span> <span class="o">-></span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">-></span> <span class="n">f</span> <span class="p">[</span><span class="n">b</span><span class="p">]</span>
</code></pre></div></div>
<p>Its definition<sup id="fnref:traverse" role="doc-noteref"><a href="#fn:traverse" class="footnote" rel="footnote">6</a></sup> is pretty straightforward, namely,</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">traverse</span> <span class="o">-</span> <span class="kt">[]</span> <span class="o">=</span> <span class="n">pure</span> <span class="kt">[]</span>
<span class="n">traverse</span> <span class="n">f</span> <span class="p">(</span><span class="n">x</span><span class="o">:</span><span class="n">xs</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="o">:</span><span class="p">)</span> <span class="o"><$></span> <span class="n">f</span> <span class="n">x</span> <span class="o"><*></span> <span class="n">traverse</span> <span class="n">f</span> <span class="n">xs</span>
</code></pre></div></div>
<p>which (excluding the use of <code class="language-plaintext highlighter-rouge"><*></code> and <code class="language-plaintext highlighter-rouge"><$></code>) looks very much like the <code class="language-plaintext highlighter-rouge">map</code> definition.
It is a generalization since we can use the <code class="language-plaintext highlighter-rouge">Identity</code> functor to get back</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">map</span> <span class="n">f</span> <span class="o">=</span> <span class="n">runIdentity</span> <span class="o">.</span> <span class="n">traverse</span> <span class="p">(</span><span class="kt">Identity</span> <span class="o">.</span> <span class="n">f</span><span class="p">)</span>
</code></pre></div></div>
<p>Using this function we can apply <code class="language-plaintext highlighter-rouge">unsafeUpdateSt</code> recursively to the list of children and then reconstruct the tree by mapping the <code class="language-plaintext highlighter-rouge">Node</code> function appropriately. That is,</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafeUpdateSt</span> <span class="p">(</span><span class="kt">Node</span> <span class="n">x</span> <span class="n">children</span><span class="p">)</span> <span class="o">=</span> <span class="kt">Node</span> <span class="n">x</span> <span class="o"><$></span> <span class="n">traverse</span> <span class="n">unsafeUpdateSt</span> <span class="n">children</span>
</code></pre></div></div>
<p>This feels very similar to the imperative code! In fact, the <code class="language-plaintext highlighter-rouge">Data.Traversable</code> module defines <code class="language-plaintext highlighter-rouge">for = flip traversable</code> so we could define</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafeUpdateSt</span> <span class="p">(</span><span class="kt">Node</span> <span class="n">x</span> <span class="n">children</span><span class="p">)</span> <span class="o">=</span> <span class="kt">Node</span> <span class="n">x</span> <span class="o"><$></span> <span class="n">for</span> <span class="n">children</span> <span class="n">unsafeUpdateSt</span>
</code></pre></div></div>
<p>So, to recall, we can define <code class="language-plaintext highlighter-rouge">unsafeUpdate</code> in terms of <code class="language-plaintext highlighter-rouge">unsafePop</code> as:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafeUpdateSt</span> <span class="o">::</span> <span class="kt">Tree</span> <span class="n">a</span> <span class="o">-></span> <span class="kt">State</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="p">(</span><span class="kt">Tree</span> <span class="n">a</span><span class="p">)</span>
<span class="n">unsafeUpdateSt</span> <span class="p">(</span><span class="kt">Node</span> <span class="kr">_</span> <span class="kt">[]</span><span class="p">)</span> <span class="o">=</span> <span class="n">singleton</span> <span class="o"><$></span> <span class="n">unsafePop</span>
<span class="n">unsafeUpdateSt</span> <span class="p">(</span><span class="kt">Node</span> <span class="n">x</span> <span class="n">children</span><span class="p">)</span> <span class="o">=</span> <span class="kt">Node</span> <span class="n">x</span> <span class="o"><$></span> <span class="n">traverse</span> <span class="n">unsafeUpdateSt</span> <span class="n">children</span>
<span class="n">unsafeUpdate</span> <span class="o">::</span> <span class="kt">Tree</span> <span class="n">a</span> <span class="o">-></span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">-></span> <span class="kt">Tree</span> <span class="n">a</span>
<span class="n">unsafeUpdate</span> <span class="o">=</span> <span class="n">evalState</span> <span class="o">.</span> <span class="n">unsafeUpdateSt</span>
</code></pre></div></div>
<p>Now on to the actual problem!</p>
<h2 id="composing-functors">Composing functors</h2>
<p>The <a href="https://hackage.haskell.org/package/transformers-0.3.0.0/docs/Data-Functor-Compose.html"><code class="language-plaintext highlighter-rouge">Data.Functor.Compose</code> module</a> defines the <code class="language-plaintext highlighter-rouge">Compose</code> newtype,</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">newtype</span> <span class="kt">Compose</span> <span class="n">f</span> <span class="n">g</span> <span class="n">a</span> <span class="o">=</span> <span class="kt">Compose</span> <span class="p">{</span> <span class="n">getCompose</span> <span class="o">::</span> <span class="n">f</span> <span class="p">(</span><span class="n">g</span> <span class="n">a</span><span class="p">)</span> <span class="p">}</span>
</code></pre></div></div>
<p>This type allows us to compose two type constructors (with kind <code class="language-plaintext highlighter-rouge">f, g :: Type -> Type</code>) into a new one.</p>
<p>The interesting feature that <code class="language-plaintext highlighter-rouge">Compose</code> allows is to define instances for <code class="language-plaintext highlighter-rouge">Functor</code>, <code class="language-plaintext highlighter-rouge">Applicative</code> or <code class="language-plaintext highlighter-rouge">Traversable</code> for the composition of two <code class="language-plaintext highlighter-rouge">Functor</code>s/<code class="language-plaintext highlighter-rouge">Applicative</code>s/<code class="language-plaintext highlighter-rouge">Traversable</code>s.</p>
<p>As an example, suppose <code class="language-plaintext highlighter-rouge">f, g :: Type -> Type</code> are both functors.
Then <code class="language-plaintext highlighter-rouge">Compose f g</code> is also a functor, where the <code class="language-plaintext highlighter-rouge">fmap</code> is given by</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">fmap</span> <span class="o">::</span> <span class="p">(</span><span class="n">a</span> <span class="o">-></span> <span class="n">b</span><span class="p">)</span> <span class="o">-></span> <span class="kt">Compose</span> <span class="n">f</span> <span class="n">g</span> <span class="n">a</span> <span class="o">-></span> <span class="kt">Compose</span> <span class="n">f</span> <span class="n">g</span> <span class="n">b</span>
<span class="n">fmap</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Compose</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="kt">Compose</span> <span class="p">(</span><span class="n">fmap</span> <span class="p">(</span><span class="n">fmap</span> <span class="n">f</span><span class="p">)</span> <span class="n">x</span><span class="p">)</span>
</code></pre></div></div>
<p>where the first <code class="language-plaintext highlighter-rouge">fmap</code> is the one for <code class="language-plaintext highlighter-rouge">f</code> and the second the one for <code class="language-plaintext highlighter-rouge">g</code>.</p>
<p>Similar instances can be defined for <code class="language-plaintext highlighter-rouge">Applicative</code> and <code class="language-plaintext highlighter-rouge">Traversable</code> (check <a href="https://hackage.haskell.org/package/transformers-0.3.0.0/docs/src/Data-Functor-Compose.html#Compose">the source code</a> if you are curious!).</p>
<p>How can we take advantage of <code class="language-plaintext highlighter-rouge">Compose</code> for our problem?
Let’s start by refining the pop function.
Recall from the previous sections that we defined a function <code class="language-plaintext highlighter-rouge">unsafePop :: State [a] a</code>.</p>
<p>The problem with this function is that it is unsafe: if the state is the empty list, the function will throw an error.
To solve this, we change the type to <code class="language-plaintext highlighter-rouge">State [a] (Maybe a)</code>, returning <code class="language-plaintext highlighter-rouge">Nothing</code> if there are no remaining elements in the list.</p>
<p>We wrap it up with the <code class="language-plaintext highlighter-rouge">Compose</code> constructor, having</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pop</span> <span class="o">::</span> <span class="kt">Compose</span> <span class="p">(</span><span class="kt">State</span> <span class="p">[</span><span class="n">a</span><span class="p">])</span> <span class="kt">Maybe</span> <span class="n">a</span>
<span class="n">pop</span> <span class="o">=</span> <span class="kt">Compose</span> <span class="o">$</span> <span class="kr">do</span>
<span class="n">xs</span> <span class="o"><-</span> <span class="n">get</span>
<span class="n">modify'</span> <span class="p">(</span><span class="n">drop</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">pure</span> <span class="p">(</span><span class="n">listToMaybe</span> <span class="n">xs</span><span class="p">)</span>
</code></pre></div></div>
<p>Now, our <code class="language-plaintext highlighter-rouge">unsafeUpdateSt</code> function can be used <em>as is</em> for the safe version of the function.
We only need to replace the <code class="language-plaintext highlighter-rouge">unsafePop</code> function by <code class="language-plaintext highlighter-rouge">pop</code>:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">updateSt</span> <span class="o">::</span> <span class="kt">Tree</span> <span class="n">a</span> <span class="o">-></span> <span class="kt">Compose</span> <span class="p">(</span><span class="kt">State</span> <span class="p">[</span><span class="n">a</span><span class="p">])</span> <span class="kt">Maybe</span> <span class="p">(</span><span class="kt">Tree</span> <span class="n">a</span><span class="p">)</span>
<span class="n">updateSt</span> <span class="p">(</span><span class="kt">Node</span> <span class="kr">_</span> <span class="kt">[]</span><span class="p">)</span> <span class="o">=</span> <span class="n">singleton</span> <span class="o"><$></span> <span class="n">pop</span>
<span class="n">updateSt</span> <span class="p">(</span><span class="kt">Node</span> <span class="n">x</span> <span class="n">children</span><span class="p">)</span> <span class="o">=</span> <span class="kt">Node</span> <span class="n">x</span> <span class="o"><$></span> <span class="n">traverse</span> <span class="n">updateSt</span> <span class="n">children</span>
</code></pre></div></div>
<p>Notice that both <code class="language-plaintext highlighter-rouge"><$></code> and <code class="language-plaintext highlighter-rouge">traverse</code> here are using the instance of <code class="language-plaintext highlighter-rouge">Functor</code> and <code class="language-plaintext highlighter-rouge">Traversable</code> for the type <code class="language-plaintext highlighter-rouge">Compose (State [a]) Maybe</code>.</p>
<p>Finally, the solution to our problem will be to unwrap the one provided by <code class="language-plaintext highlighter-rouge">updateSt</code>.</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">update</span> <span class="o">::</span> <span class="kt">Tree</span> <span class="n">a</span> <span class="o">-></span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">-></span> <span class="kt">Maybe</span> <span class="p">(</span><span class="kt">Tree</span> <span class="n">a</span><span class="p">)</span>
<span class="n">update</span> <span class="o">=</span> <span class="n">evalState</span> <span class="o">.</span> <span class="n">getCompose</span> <span class="o">.</span> <span class="n">updateSt</span>
</code></pre></div></div>
<p>As you can see, once we had the unsafe version, creating the safe one was just a matter of updating the <code class="language-plaintext highlighter-rouge">pop</code> function appropriately and dealing with the wrapping and unwrapping of <code class="language-plaintext highlighter-rouge">Compose</code>.</p>
<h2 id="conclusions">Conclusions</h2>
<p>In this post we have seen a possible solution to a problem dealing with trees using Haskell.</p>
<p>The use of <code class="language-plaintext highlighter-rouge">Compose</code>, <code class="language-plaintext highlighter-rouge">Traversable</code> and <code class="language-plaintext highlighter-rouge">Functor</code> allowed us to translate an imperative-looking solution into purely functional code, producing a concise yet complete solution.
Furthermore, the solution could be built step-by-step, by considering a simplified problem first.</p>
<p>This might not be the best most efficient solution for this problem<sup id="fnref:lazy" role="doc-noteref"><a href="#fn:lazy" class="footnote" rel="footnote">7</a></sup>, but it is an excellent way to present such type-classes’ usefulness.</p>
<p>As I said at the beginning, any improvements or alternative solutions are welcome. Until next time!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:problem" role="doc-endnote">
<p>That was not the exact statement; the point of the talk was to show how to use dependent types to statically avoid the possibility of not having the correct number of tags on the list, but this version is better suited for the purpose of this post. It also used binary trees while we will use multi-way trees. <a href="#fnref:problem" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:pure" role="doc-endnote">
<p>The <code class="language-plaintext highlighter-rouge">Data.Tree</code> module already includes such function on the <code class="language-plaintext highlighter-rouge">Applicative</code> instance (i.e., the <code class="language-plaintext highlighter-rouge">pure</code> function), but I think that makes the code slightly more confusing (since <code class="language-plaintext highlighter-rouge">Tree</code>’s behavior as an <code class="language-plaintext highlighter-rouge">Applicative</code> is far from trivial). <a href="#fnref:pure" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:MonadState" role="doc-endnote">
<p>Well, technically a class of monads, so as to allow for the use of “monad transformers”, but we will not make use of transformers on this post. <a href="#fnref:MonadState" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:return" role="doc-endnote">
<p>Although at present time it might be more beginner-friendly to restrict the talk to Monads and use <code class="language-plaintext highlighter-rouge">return</code> instead of <code class="language-plaintext highlighter-rouge">pure</code>, the <a href="https://gitlab.haskell.org/ghc/ghc/wikis/proposal/monad-of-no-return">“Monad of no return”</a> proposal seems likely to be accepted, thus in the long term sticking to <code class="language-plaintext highlighter-rouge">pure</code> is the right choice. <code class="language-plaintext highlighter-rouge">return</code> is also discouraged in other Haskell-inspired languages such as Idris. <a href="#fnref:return" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:mapm" role="doc-endnote">
<p>If you have used monads (specially if you did so before the <a href="https://gitlab.haskell.org/ghc/ghc/wikis/prelude710">Burning Bridges proposal</a> of GHC 7.10 was put in place) it is likely that you have met with <code class="language-plaintext highlighter-rouge">mapM</code>. Although <code class="language-plaintext highlighter-rouge">mapM</code> can be used for defining <code class="language-plaintext highlighter-rouge">unsafeUpdateSt</code>, it will not be applicable (directly) in the safe version of update, because of the <code class="language-plaintext highlighter-rouge">Monad</code> restriction. Furthermore, I believe it should be discouraged in favor of <code class="language-plaintext highlighter-rouge">traverse</code>, since in current versions of GHC <code class="language-plaintext highlighter-rouge">mapM</code> is just <code class="language-plaintext highlighter-rouge">traverse</code> with a restricted type. <a href="#fnref:mapm" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:traverse" role="doc-endnote">
<p>One should use <code class="language-plaintext highlighter-rouge">foldr</code> here and <a href="https://hackage.haskell.org/package/base-4.12.0.0/docs/src/Data.Traversable.html#line-237">that is what the Prelude does</a> but for didactic purposes I chose this definition. <a href="#fnref:traverse" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:lazy" role="doc-endnote">
<p>In particular, although I have not checked it, it seems likely that you would need to deal with laziness to avoid a space leak. <a href="#fnref:lazy" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Lo mejor del log 20182018-12-31T00:00:00+00:00https://codual.github.io/2018/12/31/log
<p>En enero me propuse registrar qué cosas interesantes leía, escuchaba, jugaba o hacía cada semana durante 2018.
Casi un año después he publicado más de 500 items en el log entre ellos ~400 enlaces.
Este post es una recopilación de los mejores enlaces de cada categoría.</p>
<p>Nótese que, salvo en el caso de los proyectos, el resto de contenidos no tienen por qué haberse publicado en 2018, tan sólo me los he encontrado este año.</p>
<h2 id="los-destacados">Los destacados</h2>
<h3 id="artículos-de-no-ficción">Artículos de no ficción</h3>
<p>Es difícil decidirme por los mejores artículos de no ficción; he intentado incluir artículos que no sean sólo de matemáticas o informática, que son temas de los que leo bastante:</p>
<ul>
<li><a href="https://ourworldindata.org/happiness-and-life-satisfaction##can-happiness-really-be-measured">Can ‘happiness’ really be measured?</a>, sobre cómo medir la felicidad.</li>
<li><a href="https://knowingless.com/2017/04/24/how-i-lost-my-faith/">How I Lost My Faith</a>, un relato autobiográfico sobre cómo la autora perdió la fe.</li>
<li><a href="https://www.gwern.net/Language">On the Existence of Powerful Natural Languages</a>, sobre el poder expresivo de los lenguajes.</li>
<li><a href="https://www.newyorker.com/magazine/2018/02/05/what-does-it-mean-to-die">What Does It Mean to Die?</a>, sobre la definición legal y clínica de la muerte.</li>
<li><a href="https://harvardlawreview.org/2018/02/are-we-running-out-of-trademarks/">Are We Running Out of Trademarks?</a>, sobre si no estamos quedando sin marcas registradas.</li>
<li><a href="https://queue.acm.org/detail.cfm?id=3212479">C Is Not a Low-level Language</a>, sobre cómo C no es un lenguaje de (tan) bajo nivel</li>
<li><a href="https://www.esquire.com/lifestyle/a19834127/luke-milky-moore-money-glitch/">When Milky Got His Money</a>, sobre qué pasa si puedes tener todo el dinero del mundo.</li>
<li><a href="https://foreignpolicy.com/2018/04/09/the-right-to-kill-brazil-infanticide/">The Right to Kill</a>, sobre el infanticidio por parte de indígenas.</li>
<li><a href="https://www.gwern.net/Turing-complete##how-many-computers-are-in-your-computer">How many computers are in your computer?</a>, sobre cuántos ordenadores hay en tu ordenador.</li>
<li><a href="https://www.newyorker.com/magazine/2018/07/09/ice-poseidons-lucrative-stressful-life-as-a-live-streamer">Ice Poseidon’s Lucrative, Stressful Life as a Live Streamer</a>, sobre la vida de un <em>streamer</em> (casi) 24/7.</li>
<li><a href="https://www.gwern.net/The-Existential-Risk-of-Mathematical-Error">The Existential Risk of Math Errors</a>, sobre los errores en matemáticas.</li>
<li><a href="https://www.newyorker.com/magazine/2018/10/08/the-comforting-fictions-of-dementia-care">The Comforting Fictions of Dementia Care</a>, sobre el enfoque de los cuidados de personas con demencia.</li>
</ul>
<h3 id="ficción">Ficción</h3>
<p>Este año he intentado leer relatos cortos de ciencia ficción para practicar mi inglés en el ámbito literario.
Salvo <em>Things With Beards</em> el resto son bastante cortas así que no perderás mucho tiempo si no te gustan.</p>
<ul>
<li><a href="https://uncannymagazine.com/article/fandom-for-robots/">Fandom for Robots</a></li>
<li><a href="https://www.gwern.net/fiction/Batman">The Gift of the Amygdali</a></li>
<li><a href="http://slatestarcodex.com/2018/10/30/sort-by-controversial/">Sort By Controversial</a></li>
<li><a href="http://clarkesworldmagazine.com/miller_06_16/">Things With Beards</a></li>
<li><a href="https://www.baen.com/Chapters/9781618249203/9781618249203___2.htm">Slow Tuesday Night</a></li>
</ul>
<h3 id="podcasts">Podcasts</h3>
<p>Night Vale Presents ha publicado dos nuevos podcasts de ficción este año:</p>
<ul>
<li><a href="https://www.stephenwinter.me/adventures-in-america">Adventures in New America</a>, una historia afrofuturista en una Nueva América distópica y</li>
<li><a href="http://www.nightvalepresents.com/dreamboy">Dreamboy</a>, una historia de misterio sobre un pueblo con una cebra asesina.</li>
</ul>
<p>Además, algunos episodios concretos:</p>
<ul>
<li><a href="https://80000hours.org/podcast/episodes/hilary-greaves-global-priorities-institute/">80000 Hours - Hilary Greaves on moral cluelessness</a>, una entrevista sobre filosofía de la física y filosofía moral.</li>
<li><a href="https://www.gimletmedia.com/reply-all/104-case-phantom-caller">Reply All - The Case of the Phantom Caller</a>, una investigación sobre por qué una oyente recibe cientos de llamadas con sonidos ambiente extraños-</li>
<li><a href="https://thisiscriminal.com/episode-93-lavender-scare-06-15-2018/">Criminal - Lavender Scare</a>, una entrevista sobre el temor lavanda en EEUU.</li>
<li><a href="https://thisiscriminal.com/episode-104-witness-12-7-2018/">Criminal - Witness</a>, una entrevista con el creador del Programa de Protección de Testigos en EEUU.</li>
</ul>
<h3 id="proyectos">Proyectos</h3>
<p>Como siempre he hecho menos proyectos de los que me gustaría, aunque he de admitir que más de los que recordaba.</p>
<ul>
<li><a href="https://github.com/mx-psi/tidbits">mx-psi/tidbits</a>, recopilación de pequeños scripts útiles.</li>
<li><a href="https://mx-psi.github.io/ask/">Ask</a>, mi página estática de preguntas y respuestas.</li>
<li><a href="https://libreim.github.io/blog/2018/03/01/medias/">Generalizando la desigualdad de las medias</a>, una introducción a una generalización de la desigualdad de las medias en el contexto de la teoría de la medida.</li>
<li><a href="https://mx-psi.github.io/studying">Cómo estudiar más eficazmente</a>, una charla sobre técnicas de estudio.</li>
<li><a href="https://codual.github.io/2018/07/07/learn/">Things I want to learn about</a>, sobre cosas que quiero aprender.</li>
<li><a href="https://codual.github.io/2018/09/01/instagram/">Instagram is (probably) not listening to what you say</a>, sobre razones para pensar que Instagram no escucha tus conversaciones para personalizar sus anuncios.</li>
</ul>
<h3 id="películas-documentales-y-vídeos">Películas, documentales y vídeos</h3>
<p>Las películas que más me han gustado de las que he visto en 2018 han sido, en ningún orden en especial:</p>
<ul>
<li><em>Mujeres al borde de un ataque de nervios</em>,</li>
<li><em>Call me by your name</em>,</li>
<li><em>Isla de Perros</em> y</li>
<li><em>Get Out</em>.</li>
</ul>
<p>Entre los documentales:</p>
<ul>
<li><em>Muchos hijos, un mono y un castillo</em> y</li>
<li><em>Paris is Burning</em></li>
</ul>
<p>Por último, como mención especial en los vídeos he descubierto a ContraPoints, de la que destaco <a href="https://www.youtube.com/watch?v=9bbINLWtMKI">Pronouns</a>.</p>
<h2 id="conclusiones">Conclusiones</h2>
<p>El log surgió como un reto personal de constancia y una forma de compartir el contenido que leo con el mundo de una forma estructurada, inspirado por los de <a href="https://www.gwern.net/newsletter/2018/11">Gwern</a> o <a href="http://slatestarcodex.com/2018/11/20/links-11-18-mayflowurl/">Scott Alexander</a>.</p>
<p>Más de 20 personas me han dicho que lo han leído al menos una semana, y agradezco enormemente los comentarios que me han animado a continuar con el proyecto (en especial, muchas gracias a Ondiz!).</p>
<p>He cambiado el formato a mitad de camino, he sido inconsistente con los avisos de contenido y <a href="https://codual.github.io/2018/06/28/collections/">la forma de escribirlo</a> es más manual de lo que me gustaría en algunos aspectos. Aunque he aprendido algunas lecciones que creo que me permitirán mejorar esto en el futuro, el formato semanal me parece demasiado frecuente y si el año que viene continuo con un proyecto similar será como poco bisemanal. Si tienes algún comentario al respecto házmelo llegar!</p>
Instagram is (probably) not listening to what you say2018-09-01T00:00:00+00:00https://codual.github.io/2018/09/01/instagram
<p>Every few months I see someone claiming they saw Instagram ads related to something they spoke about while their phone was nearby.
Usually, this is followed by some claim along the lines of “Instagram is listening to what I say”.
Here is a list of 6 arguments in no particular order that explain why I think that is most likely not the case.
These arguments are mostly applicable to any other social network or app.</p>
<h2 id="1-the-law-of-truly-large-numbers">1. <a href="https://en.wikipedia.org/wiki/Law_of_truly_large_numbers">The law of truly large numbers</a></h2>
<p>You <a href="https://medium.com/@damln/instagram-is-listening-to-you-97e8f2c53023">spoke about some weird hiking-related gadget with your cousin</a> one day.
You didn’t talk about it in any social network, or even searched it on the Internet.
Yet, almost miraculously, you got an Instagram ad the day after about that one specific product. What are the odds?</p>
<p>Well, it turns out it’s quite likely for something like this to happen every now and then.
More than 500 million people use Instagram daily<sup id="fnref:stats" role="doc-noteref"><a href="#fn:stats" class="footnote" rel="footnote">1</a></sup> and they spend, on average, 53 minutes<sup id="fnref:dailyuse" role="doc-noteref"><a href="#fn:dailyuse" class="footnote" rel="footnote">2</a></sup> using the app each day.
That’s a lot of ads, and a lot of opportunities for one of these seemingly inexplicable phenomena to happen.</p>
<p>Even if each user only saw one ad per day and the chances of that ad being related to something they talked about that day were 1 in 1 million (both very conservative estimates in my opinion), that gives you, on average, 500 people per day with something like this happening to them. Stumbling upon someone sharing a story like this at some point on some social network appears to be quite likely. The world is big and <a href="https://www.theatlantic.com/science/archive/2016/02/the-true-meaning-of-coincidences/463164/">coincidences happen all the time</a>.</p>
<h2 id="2-confirmation-bias-and-the-frequency-illusion">2. Confirmation bias and the frequency illusion</h2>
<p>An important point about the previous argument that might make it more convincing is that people tend to interpret ambiguous evidence as favouring their preconceived ideas. This phenomena known as <a href="https://en.wikipedia.org/wiki/Confirmation_bias"><em>confirmation bias</em></a> could make people interpret ads as related to their conversations topics even when, looked from an objective perspective, the relation is weak at best. This cognitive bias together with the <a href="https://en.wikipedia.org/wiki/List_of_cognitive_biases#Frequency_illusion"><em>frequency illusion</em></a> (we tend to see everywhere something we have experienced recently) makes it much easier for one to become convinced of the microphone tapping in the face of objectively dubious evidence.</p>
<h2 id="3-no-major-newspaper-has-made-any-article-confirming-it">3. No major newspaper has made any article confirming it</h2>
<p>Rigorously testing whether Instagram or any other social network is prying on their users’ lives through the microphone would be relatively easy: you just need two phones, a list of random topics, some criteria of what counts as an ad that verifies the “Instagram is listening” hypothesis and some hours of dull (but easy) work. Yet, to my knowledge, no major news outlet has published any such study or even any sort of weaker claims that support the idea that Instagram (or any other major social media app) listening to you<sup id="fnref:alphonso" role="doc-noteref"><a href="#fn:alphonso" class="footnote" rel="footnote">3</a></sup>.</p>
<p>An article of that kind would be a relatively simple thing to do and they would probably get a lot of bang for the buck given <a href="https://en.wikipedia.org/wiki/Cambridge_Analytica">the recent scandals</a> Facebook (as a company that owns Instagram) has been involved in. Zuckerberg was even asked about Facebook tapping your phone in the US Congress and <a href="https://www.theverge.com/2018/4/10/17221478/zuckerberg-facebook-senate-listening-tapping-microphone">publicly denied it</a><sup id="fnref:facebook" role="doc-noteref"><a href="#fn:facebook" class="footnote" rel="footnote">4</a></sup>.</p>
<h2 id="4-people-fabricate-fake-stories-for-the-internet-all-the-time">4. People fabricate fake stories for the Internet all the time</h2>
<p>In a similar vein to the first argument the sheer amount of people that use the Internet every day and the poor incentives that exist in some websites might motivate some people to fabricate stories that support this conspiracy, be it for money, fame or interfering in foreign elections. This <a href="http://slatestarcodex.com/2016/12/12/might-people-on-the-internet-sometimes-lie/">probably happens</a> with other topics and it is not unreasonable to think this could be a factor here too.</p>
<h2 id="5-the-technology-isnt-here-yet">5. The technology isn’t here yet</h2>
<p>The kind of technology that would be needed for Instagram to process the audio and extract the ad-relevant bits is simply not here yet. Yes, we have machine learning techniques that can identify speech in some restricted domains (for example, things like voice commands, <a href="https://arstechnica.com/gadgets/2018/06/google-duplex-is-calling-we-talk-to-the-revolutionary-but-limited-phone-ai/">some phone conversations</a> or recognizing songs), but extracting information relevant for ads from this audio remains, as of now, a mostly intractable problem. Audio processing in other services like Amazon’s Alexa or Google’s “Google Home” sometimes have serious trouble identifying audio with a lot of background noise or <a href="https://www.washingtonpost.com/graphics/2018/business/alexa-does-not-understand-your-accent/?noredirect=on&utm_term=.72afda3e402b">unusual accents</a> so it would make little sense that the technology that Instagram could have would be much better than that.</p>
<p>There’s also a problem of scale: this kind of audio analysis would probably have to be made by Instagram servers and the amount of memory needed to transmit all this audio <a href="https://www.wired.com/story/facebooks-listening-smartphone-microphone/">would exceed</a> the current estimated Facebook servers capacity by a factor of 33.</p>
<h2 id="6-they-dont-need-to-do-it">6. They don’t need to do it</h2>
<p><a href="https://www.eff.org/es/deeplinks/2018/04/facebook-doesnt-need-listen-through-your-microphone-serve-you-creepy-ads">Facebook</a>, Instagram and most privately-owned social networks already gather massive amounts of data about you in formats that are way more tractable than random audio. This information already creates a mostly accurate profile of you without needing to resort to microphone tapping. Extra information of this kind <a href="https://www.wired.com/story/facebooks-listening-smartphone-microphone/">helps a little but apparently not enough</a> to be worth the massive engineering effort it would entail.</p>
<h2 id="conclusion">Conclusion</h2>
<p>In the end, this commonly shared conspiracy theory probably stems from a combination of cognitive biases, misconceptions about the state of the art of machine learning and our inability to grapple with the enormous amount of people that use social networks every day. This does not mean Instagram doesn’t have questionable practices regarding privacy, of course, but, as far as we can tell, they probably don’t listen to you.</p>
<p>If you still feel uncomfortable about this though you can always disable microphone access in your apps, but this would not solve the myriad of privacy problems privately-owned social networks have. For mitigating those, I encourage you to <a href="https://ssd.eff.org/en/module/protecting-yourself-social-networks">check your privacy settings</a>, install <a href="https://www.eff.org/es/node/99095">Privacy Badger</a> or maybe even use <a href="https://pixelfed.org/">alternative services</a> that provide the same functionality but are privacy-respecting.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:stats" role="doc-endnote">
<p>The figure is given by <a href="https://www.statista.com/statistics/657823/number-of-daily-active-instagram-users/">statista</a> and is from September 2017 so the actual figure is probably higher (~625m if it grows at the same pace as monthly active users which recently got to 1 billion). <a href="#fnref:stats" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:dailyuse" role="doc-endnote">
<p>That stat comes from <a href="https://www.recode.net/2018/6/25/17501224/instagram-facebook-snapchat-time-spent-growth-data">this article</a>. <a href="#fnref:dailyuse" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:alphonso" role="doc-endnote">
<p>The closest thing I can find is the <a href="https://www.nytimes.com/2017/12/28/business/media/alphonso-app-tracking.html">Alphonso tracking software</a>. This is a worrying privacy invasion but it can’t listen to what you say; it only listens to the TV ads that are playing in the background (this is a much easier engineering problem for which you only need <a href="https://en.wikipedia.org/wiki/Acoustic_fingerprint">acoustic fingerprinting</a>). There is no evidence this kind of software is used on Instagram or any other major social media app. <a href="#fnref:alphonso" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:facebook" role="doc-endnote">
<p>The wording of the question (<em>does Facebook use audio obtained from mobile devices to enrich personal information about users?</em>) is unclear to me and I am not sure if it is talking about Facebook as a company (in which case this would include Instagram) or Facebook as a social network (in this case it wouldn’t). Nonetheless I think it is fairly reasonable to think that if Facebook used this kind of technology in one app they would probably use it in the other. <a href="#fnref:facebook" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Things I want to learn about2018-07-07T00:00:00+00:00https://codual.github.io/2018/07/07/learn
<p><em><strong>Last updated</strong>: March 2022</em></p>
<hr />
<p>This post compiles a list of things I want to learn along with some concrete technical things to read and try.
It ranges from whole topics to concrete questions.
The hope is that I will regularly update this list with the topics I stumble upon.
If you have any suggestion on how to learn any of these topics please let me know!</p>
<h2 id="topics">Topics</h2>
<p>This is a list of vague topics that seem interesting.
I haven’t really researched any of these or what their prerequisites are.</p>
<ul>
<li>Computable analysis</li>
<li>Distributed Algorithms</li>
<li>Game theory and Algorithmic game theory</li>
<li>Model theory</li>
<li>Natural language processing</li>
<li>Persistent homology</li>
<li>POMDPs as a model of rational agents (and MDPs)</li>
<li>Stochastic scheduling</li>
<li>Fully homomorphic encryption schemes</li>
<li>20th century world history</li>
<li>Structural equation modeling</li>
<li>Item Response Theory</li>
<li>Unification algorithms</li>
<li>Multi-armed bandits applications</li>
<li>Bayesian networks</li>
<li>Homotopy type theory</li>
<li><a href="https://en.wikipedia.org/wiki/Cache-oblivious_algorithm">Cache-oblivious algorithms</a></li>
<li><a href="https://en.m.wikipedia.org/wiki/Simpson's_paradox">Simpson’s paradox</a></li>
<li>Linear types practical applications</li>
<li>Random walks</li>
<li>Modern Monetary Theory and monetary economics more generally</li>
<li>Geological periods, eras and eons</li>
</ul>
<h2 id="concrete-things-to-read-and-try">Concrete things to read and try</h2>
<p>This is a list of concrete papers, technical books, libraries and reading lists I want to dive into at some point.</p>
<h3 id="theoretical-computer-science">Theoretical computer science</h3>
<ul>
<li><a href="http://people.seas.harvard.edu/~salil/pseudorandomness/">Pseudorandomness</a></li>
</ul>
<h4 id="type-theory-and-exotic-pls">Type theory and exotic PLs</h4>
<ul>
<li><a href="https://github.com/jozefg/learn-tt">Learn TT</a></li>
<li><a href="https://mitpress.mit.edu/books/little-typer">The Little Typer</a></li>
<li><a href="https://softwarefoundations.cis.upenn.edu/current/index.html">Software Foundations</a></li>
<li><a href="https://www.microsoft.com/en-us/research/project/koka/">Koka - Microsoft Research</a></li>
<li><a href="https://www.eff-lang.org/">Eff</a></li>
<li><a href="https://curry.pages.ps.informatik.uni-kiel.de/curry-lang.org/">Curry Lang</a></li>
<li><a href="https://wyvernlang.github.io/">Wyvern</a></li>
<li><a href="https://plzoo.andrej.com/">Programming language zoo</a></li>
<li>Languages mentioned <a href="https://graydon2.dreamwidth.org/253769.html">here</a></li>
</ul>
<h3 id="applied-computer-science">Applied Computer Science</h3>
<h4 id="functional-programming">Functional programming</h4>
<ul>
<li>Haskell’s <a href="https://hackage.haskell.org/package/dimensional">dimensional</a> and <a href="https://ren.zone/articles/safe-money">safe-money</a></li>
<li>Haskell’s <a href="https://leanpub.com/lenses">lenses</a> and <a href="https://leanpub.com/optics-by-example">optics</a></li>
<li>Haskell’s <a href="https://haskell-servant.readthedocs.io/en/stable/tutorial/ApiType.html">servant</a></li>
<li><a href="http://dev.stephendiehl.com/fun/">Write You a Haskell</a></li>
<li>Purely Functional Data Structures</li>
<li><a href="https://plfa.github.io/">Programming Language Foundations in Agda</a></li>
<li><a href="http://www.stephendiehl.com/llvm/">Implementing a JIT Compiled Language with Haskell and LLVM</a></li>
<li>Parser combinators like <a href="https://hackage.haskell.org/package/megaparsec">megaparsec</a></li>
</ul>
<h4 id="rust">Rust</h4>
<ul>
<li><a href="https://os.phil-opp.com/">Writing an OS in Rust</a> and <a href="https://tc.gts3.org/cs3210/2020/spring/lab.html">course on building an OS</a></li>
<li><a href="https://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html">Let’s build a browser engine (in Rust)</a></li>
<li><a href="https://rust-unofficial.github.io/too-many-lists/index.html">Learning Rust with Entirely Too Many Linked Lists</a></li>
<li><a href="https://amethyst.rs/">Amethyst</a></li>
<li><a href="https://docs.rs/smartstring/0.2.6/smartstring/">smartstring</a> crate</li>
<li><a href="https://rustwasm.github.io/docs/book/introduction.html">Rust WASM support</a></li>
<li>Learn how Rust code coverage works internally (<a href="https://github.com/rust-lang/rust/pulls?page=1&q=is%3Apr+author%3Arichkadel+is%3Aclosed+closed%3A%3C2020-11-06">relevant PRs</a>)</li>
<li><a href="https://rustc-dev-guide.rust-lang.org">rustc dev guide</a></li>
<li>Learn about <a href="https://github.com/rust-lang/polonius/">polonius</a></li>
</ul>
<h4 id="linux--systems-programming">Linux & systems programming</h4>
<ul>
<li><a href="https://fasterthanli.me/blog/2019/making-our-own-ping/">A short (and mostly wrong) history of computer networking</a></li>
<li><a href="https://fasterthanli.me/blog/2020/whats-in-a-linux-executable/">What’s in a Linux executable</a></li>
<li>Learning to use <a href="https://danluu.com/perf-tracing"><code class="language-plaintext highlighter-rouge">perf</code></a>, <code class="language-plaintext highlighter-rouge">tcpdump</code> and other similar Linux tools</li>
<li>A tour through (parts of) musl source code</li>
<li>Learn to use <a href="https://drgn.readthedocs.io/en/latest"><code class="language-plaintext highlighter-rouge">drgn</code></a></li>
</ul>
<h4 id="compilers">Compilers</h4>
<ul>
<li><a href="https://craftinginterpreters.com/">Crafting interpreters</a></li>
</ul>
<h3 id="physics">Physics</h3>
<ul>
<li><a href="http://www.feynmanlectures.caltech.edu/">The Feynman Lectures on Physics</a></li>
<li><a href="https://physics.stackexchange.com/questions/6047">Physics for mathematicians</a></li>
</ul>
<h3 id="probability-theory-statistics-and-ml">Probability theory, statistics and ML</h3>
<h4 id="theory">Theory</h4>
<ul>
<li>Probabilistic Reasoning in Intelligent Systems: Networks of Plausible Inference</li>
<li><a href="https://web.archive.org/web/20171027015312/http://faculty.chicagobooth.edu/emir.kamenica/documents/bayesianPersuasion.pdf">Bayesian persuasion</a></li>
<li><a href="https://arxiv.org/abs/1601.00900">Too good to be true: when overwhelming evidence fails to convince</a></li>
<li><a href="https://web.math.princeton.edu/~nelson/books/rept.pdf">Radically Elementary Probability Theory</a></li>
</ul>
<h4 id="applied">Applied</h4>
<ul>
<li><a href="https://blog.openai.com/spinning-up-in-deep-rl/">Spinning Up in Deep RL</a></li>
<li><a href="https://www.argmin.net/2018/06/25/outsider-rl/">An Outsider’s Tour of Reinforcement Learning</a></li>
<li><a href="https://web.stanford.edu/~bvr/pubs/TS_Tutorial.pdf">A Tutorial on Thompson Sampling</a></li>
<li><em>The Book of Why</em></li>
<li><a href="https://docs.pymc.io/nb_tutorials/index.html">PyMC tutorials</a></li>
</ul>
<h3 id="to-be-classified">To be classified</h3>
<ul>
<li><a href="https://codual.github.io/2016/09/18/filosofia-de-la-ciencia/">Philosophy of science</a></li>
<li>Learn Q#. <a href="https://github.com/Microsoft/QuantumKatas">Quantum Katas</a>, <a href="https://codeforces.com/blog/entry/60209">Q# Coding Contest</a>.</li>
<li>Serverless architecture (maybe follow Cloudflare Workers’ tutorials)</li>
<li><a href="https://drawabox.com/">Learn How To Draw</a></li>
<li><a href="https://en.wikipedia.org/wiki/Aumann's_agreement_theorem">Aumann’s agreement theorem</a></li>
<li><a href="https://en.m.wikipedia.org/wiki/Common_knowledge_(logic)">Common knowledge (logic)</a></li>
<li><a href="https://plato.stanford.edu/entries/nonwellfounded-set-theory/">Non-wellfounded set theory</a></li>
<li>Raft algorithm (see <a href="https://blog.cloudflare.com/a-byzantine-failure-in-the-real-world/">a Byzantine failure IRL</a>)</li>
<li>Fair division procedures (<a href="https://en.m.wikipedia.org/wiki/Fair_division_experiments">experiments</a>, <a href="https://en.m.wikipedia.org/wiki/Selfridge%E2%80%93Conway_procedure">Selfridge-Conway procedure</a>, <a href="https://en.m.wikipedia.org/wiki/Stromquist_moving-knives_procedure">Stromquist procedure</a>)</li>
<li><a href="https://observablehq.com/@d3/learn-d3">d3.js tutorial by Observable</a></li>
<li>CORE textbook on economics</li>
</ul>
<h2 id="concrete-questions">Concrete questions</h2>
<p>This is a list of concrete questions or clusters of related questions about a single specific topic.
The questions might not be well-defined</p>
<ul>
<li>How can one define a measure space on an arbitrary manifold?
Is it related to the concept of <a href="https://en.wikipedia.org/wiki/Pushforward_measure">pushforward measure</a>?
When the Radon-Nykodim derivative exists, what is it’s relation with the manifold atlas?</li>
<li>Given that 64.9% of philosophers surveyed <a href="https://pinboard.in/u:mx_psi/b:6cc8789e74db">here</a> support the analytic–synthetic distinction, what are the remaining
strongest arguments against logical positivism? If there are insurmountable hurdles to maintain logical positivism
as a coherent theory, what are its strongest successors?</li>
<li>In computational complexity theory, why are oracle separations sometimes provided as evidence of unrelativized results?</li>
<li>What is, intuitively, a topos?</li>
<li>How can I interpret elasticity in economics?</li>
</ul>
Moving the log to a Jekyll collection2018-06-28T00:00:00+00:00https://codual.github.io/2018/06/28/collections
<p><em>This post assumes basic knowledge of <a href="https://jekyllrb.com/">Jekyll</a>.</em></p>
<p>Since the beginning of this year I’ve been writing down a <a href="/log/2018/">weekly log</a> of articles, books, podcasts and others that I’ve specially enjoyed.
Initially I wrote it down in one big Markdown file that translated into a single HTML page but recently I finally got to separate each week into its own page.
This turned out to be pretty easy to do using <a href="https://jekyllrb.com/docs/collections/">Jekyll Collections</a> so I decided to write down the necessary steps to use it as documentation.</p>
<h2 id="creating-the-separate-files">Creating the separate files</h2>
<p>First I wanted to create separate files for each week so each week gets its own page.
To create the separate files I wrote a Python script to help me do the job.
The basic idea is to loop through every Monday with a <code class="language-plaintext highlighter-rouge">datetime.date</code> object and create the post associated with that Monday’s week. I decided each post should have:</p>
<ol>
<li>A <em>title</em> which states the week number as well as the start and end of the week</li>
<li>A <em>date of publication</em>; this allows me to hide unfinished weeks and to create an RSS of the log.</li>
<li>An <em>id</em>. The single-page version had an anchor link to every week so to prevent link-rot I saved those. Luckily I used the week number as an id so I don’t have to parse it from the source file</li>
<li>The actual <em>content</em> of the week.</li>
</ol>
<p>After going through Liquid’s documentation I decided to hard-code the title as a string in Python.
Liquid has <a href="https://shopify.github.io/liquid/filters/date/">limited support</a> for date formatting but it’s English-only so it wouldn’t work without extra plugins<sup id="fnref:work" role="doc-noteref"><a href="#fn:work" class="footnote" rel="footnote">1</a></sup>.
To get the title given the Monday date I wrote this function using <a href="https://docs.python.org/3/library/datetime.html"><code class="language-plaintext highlighter-rouge">datetime</code></a>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">SUNDAY</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span> <span class="o">=</span> <span class="mi">6</span><span class="p">)</span> <span class="c1"># 6 days timedelta
</span><span class="n">name</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">dt</span><span class="p">:</span> <span class="n">dt</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">"%d de %B"</span><span class="p">)</span> <span class="c1"># %d is the day, %B is the month name
</span>
<span class="k">def</span> <span class="nf">get_title</span><span class="p">(</span><span class="n">dt</span><span class="p">):</span>
<span class="s">"""Gets title of week log given Monday date.""""
n = dt.isocalendar()[1]
start, end = name(dt), name(dt + SUNDAY)
return "</span><span class="n">Semana</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span> <span class="p">({</span><span class="mi">1</span><span class="p">}</span> <span class="n">a</span> <span class="p">{</span><span class="mi">2</span><span class="p">})</span><span class="s">".format(n,start,end)
</span></code></pre></div></div>
<p>To get the names in Spanish I set the locale using <a href="https://docs.python.org/3.6/library/locale.html"><code class="language-plaintext highlighter-rouge">locale</code></a>’s <code class="language-plaintext highlighter-rouge">setlocale</code>.
Unfortunately locale names are not standardized so my locale in Linux Mint (<code class="language-plaintext highlighter-rouge">es_ES.utf8</code>) might not work in your computer (sad!).</p>
<p>To build posts I wrote a function that writes the YAML <a href="https://jekyllrb.com/docs/frontmatter/">front matter</a> using <a href="https://pypi.org/project/ruamel.yaml/"><code class="language-plaintext highlighter-rouge">ruamel.yaml</code></a> and after that writes the content<sup id="fnref:details" role="doc-noteref"><a href="#fn:details" class="footnote" rel="footnote">2</a></sup>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">build_post</span><span class="p">(</span><span class="n">dt</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
<span class="s">"""Creates post for a certain week given date and content."""</span>
<span class="n">name</span> <span class="o">=</span> <span class="p">...</span>
<span class="n">frontmatter</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(...)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">week_log</span><span class="p">:</span>
<span class="n">week_log</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="s">"---</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="n">yaml</span><span class="p">.</span><span class="n">dump</span><span class="p">(</span><span class="n">frontmatter</span><span class="p">,</span> <span class="n">week_log</span><span class="p">)</span>
<span class="n">week_log</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="s">"---</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="n">week_log</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
</code></pre></div></div>
<p>To get the contents I just go line by line in the source file and I split the contents:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">contents</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">"2018.md"</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">w2018</span><span class="p">:</span>
<span class="n">cur_week</span> <span class="o">=</span> <span class="s">""</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">w2018</span><span class="p">.</span><span class="n">readlines</span><span class="p">():</span>
<span class="k">if</span> <span class="n">line</span><span class="p">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">"<h3"</span><span class="p">):</span>
<span class="n">contents</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">cur_week</span><span class="p">)</span>
<span class="n">cur_week</span> <span class="o">=</span> <span class="s">""</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">cur_week</span> <span class="o">+=</span> <span class="n">line</span>
<span class="n">contents</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">cur_week</span><span class="p">)</span>
</code></pre></div></div>
<p>That way <code class="language-plaintext highlighter-rouge">contents[i]</code> has week number <code class="language-plaintext highlighter-rouge">i</code> contents and I just need to build each post until the current week:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">cur_monday</span> <span class="o">=</span> <span class="n">date</span><span class="p">(</span><span class="mi">2018</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
<span class="k">while</span> <span class="n">cur_monday</span> <span class="o"><=</span> <span class="n">date</span><span class="p">(</span><span class="mi">2018</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">24</span><span class="p">):</span>
<span class="n">week_number</span> <span class="o">=</span> <span class="n">cur_monday</span><span class="p">.</span><span class="n">isocalendar</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">build_post</span><span class="p">(</span><span class="n">cur_monday</span><span class="p">,</span> <span class="n">contents</span><span class="p">[</span><span class="n">week_number</span><span class="p">])</span>
<span class="n">cur_monday</span> <span class="o">+=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">weeks</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>
<p>And that’s it! You can check the complete script <a href="https://gist.github.com/mx-psi/b655cd53d325411a12eb8d6174a2dee6">here</a>.</p>
<h2 id="defining-a-collection">Defining a collection</h2>
<p>Simply put, a Jekyll collection named <code class="language-plaintext highlighter-rouge">collection</code> is a set of files in the folder <code class="language-plaintext highlighter-rouge">_collection</code> (the underscore is important!) with an object <code class="language-plaintext highlighter-rouge">site.collection</code> you can use in Liquid code in your page.
If you’ve ever used Jekyll you already know two (special) examples: posts and drafts (whose associated sets of files are, of course, in the folders <code class="language-plaintext highlighter-rouge">_posts</code> and <code class="language-plaintext highlighter-rouge">_drafts</code>).</p>
<p>For this project I defined a collection called <code class="language-plaintext highlighter-rouge">log</code> and I stated that I wanted <a href="https://jekyllrb.com/docs/collections/#step3">each file to have its own page</a>:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">collections</span><span class="pi">:</span>
<span class="na">log</span><span class="pi">:</span>
<span class="na">output</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>
<p>I also specified a custom layout for log files in <code class="language-plaintext highlighter-rouge">defaults</code><sup id="fnref:def" role="doc-noteref"><a href="#fn:def" class="footnote" rel="footnote">3</a></sup>:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">defaults</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">scope</span><span class="pi">:</span>
<span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">log</span>
<span class="na">values</span><span class="pi">:</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">log</span>
</code></pre></div></div>
<p>The only remaining step now is to populate the <code class="language-plaintext highlighter-rouge">_log</code> folder with the files I created in the previous step (I moved them into <code class="language-plaintext highlighter-rouge">_log/2018</code> and I moved some other log-like posts to <code class="language-plaintext highlighter-rouge">_log/2016</code>).</p>
<p>You can do some other fancy things with collections such as adding arbitrary metadata or <a href="https://jekyllrb.com/docs/collections/#permalinks">configuring permalinks</a> but I didn’t need those for the log.</p>
<h2 id="keeping-the-old-page-working">Keeping the old page working</h2>
<p>The final step is to keep the old page working so that I don’t break any link.
This is where collections prove useful since you couldn’t list the week logs in a page with Liquid otherwise.
To list the files as they were before we just loop through <code class="language-plaintext highlighter-rouge">site.log</code> to get every week
and add a little CSS for extra magic<sup id="fnref:simple" role="doc-noteref"><a href="#fn:simple" class="footnote" rel="footnote">4</a></sup>:</p>
<div class="language-liquid highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{%</span><span class="w"> </span><span class="nt">for</span><span class="w"> </span><span class="nv">item</span><span class="w"> </span><span class="nt">in</span><span class="w"> </span><span class="nv">site.log</span><span class="w"> </span><span class="p">%}</span>
<div class="week-header">
<a href=" <span class="p">{{</span><span class="w"> </span><span class="nv">item</span><span class="p">.</span><span class="nv">url</span><span class="w"> </span><span class="p">}}</span>">:anchor:</a>
<h3 id=" <span class="p">{{</span><span class="w"> </span><span class="nv">item</span><span class="p">.</span><span class="nv">tag</span><span class="w"> </span><span class="p">}}</span>"><span class="p">{{</span><span class="w"> </span><span class="nv">item</span><span class="p">.</span><span class="nv">title</span><span class="w"> </span><span class="p">}}</span></h3>
</div>
<span class="p">{{</span><span class="w"> </span><span class="nv">item</span><span class="p">.</span><span class="nv">content</span><span class="w"> </span><span class="p">}}</span>
<span class="p">{%</span><span class="w"> </span><span class="nt">endfor</span><span class="w"> </span><span class="p">%}</span>
</code></pre></div></div>
<p>And that is all. I hope this wasn’t too boring, until next time!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:work" role="doc-endnote">
<p>Unless of course I did the translation myself manually but I didn’t want to spend time in that. <a href="#fnref:work" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:details" role="doc-endnote">
<p>I glossed over a few details in this code snippet, you can check the complete code <a href="https://gist.github.com/mx-psi/b655cd53d325411a12eb8d6174a2dee6">here</a>. <a href="#fnref:details" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:def" role="doc-endnote">
<p>I omitted certain existing configurations that only apply to posts; you can check the complete configuration <a href="https://github.com/coDual/codual.github.io/blob/master/_config.yml">here</a>. <a href="#fnref:def" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:simple" role="doc-endnote">
<p>As before this code snippet is simplified and the actual version is actually much uglier, check it <a href="https://raw.githubusercontent.com/coDual/codual.github.io/master/log/2018.md">here</a>. <a href="#fnref:simple" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
La paradoja de San Petersburgo2017-08-23T00:00:00+00:00https://codual.github.io/2017/08/23/san-petersburgo
<em>Este post contiene fórmulas matemáticas que podrían
no visualizarse correctamente en un lector de RSS.</em>
<hr>
<div>
<div class="message">
Este post contiene algunos elementos con los que puedes <span class="interactive">interaccionar</span>. Si
haces click o modificas su valor el texto se actualizará para reflejar tu elección.
<noscript>Necesitas <a href="http://www.enable-javascript.com" target="_blank">activar Javascript</a> para poder interaccionar.</noscript>
</div>
</div>
<p>Imagina que te ofrecen participar en una lotería. Consta de 100 billetes y el precio de una participación es de 10€.
De los 100 billetes <input type="number" value="10" id="prized-input" min="0" max="100" autofocus="" />
tienen un premio de 40€
mientras que los <span class="not-prized">90</span> restantes no tienen premio.</p>
<table>
<thead>
<tr>
<th>Desenlace</th>
<th>Con premio</th>
<th>Sin premio</th>
</tr>
</thead>
<tbody>
<tr>
<td>Proporción</td>
<td><span class="prized">10</span> de 100</td>
<td><span class="not-prized">90</span> de 100</td>
</tr>
<tr>
<td>Premio</td>
<td>40€</td>
<td>0€</td>
</tr>
</tbody>
</table>
<p>¿Participarías en esta lotería? La teoría de la decisión intenta responder a esta y otras preguntas con el principio de la utilidad esperada. Para poder responder a la pregunta vamos a asumir una serie de premisas:</p>
<p><span id="premisas"></span></p>
<ol>
<li>Preferimos más dinero a menos</li>
<li>Valoramos cada euro de la misma forma; la diferencia en valor entre 10 y 11 € es la misma que entre 1M€ y 1M + 1€. (Si $u$ es la función (función de utilidad) que a cada cantidad de euros le otorga su valor estamos diciendo que $u$ es lineal)</li>
<li>Tenemos certeza de que no nos están engañando: el sorteo es justo y nos darán el premio completo</li>
</ol>
<p>Bajo estas premisas la teoría de la decisión nos indica que <a href="http://reducing-suffering.org/why-maximize-expected-value/">debemos calcular</a> el valor esperado de la lotería: <em>¿Cuánto valor (dinero) recibiremos de media si jugamos un número suficientemente grande de veces?</em>. Como hay <span class="prized">10</span> billetes premiados podemos esperar que en un <span class="prized">10</span>% de los casos recibiremos el premio mientras que en el <span class="not-prized">90</span>% restante no recibiremos nada.<sup id="fnref:utilidad" role="doc-noteref"><a href="#fn:utilidad" class="footnote" rel="footnote">1</a></sup> Por tanto de media recibiremos:</p>
<div id="expected-formula" style="height:4rem;">
$$\frac{10}{100}\cdot 40 + \frac{90}{100} \cdot 0 = 4\unicode{0x20AC}$$
</div>
<p>Con esta información podemos tomar una decisión: si cada participación cuesta 10€ <strong><span id="outcome">perderemos 6€ de media</span></strong> cada vez que juguemos, por lo que <span id="decision">no debemos</span> participar en la lotería.</p>
<p>En general si tenemos $n$ desenlaces alternativos $D_1, \dots, D_n$ a una posible acción, $P(D_k)$ es la probabilidad de que resulte el desenlace $k$ y $u(D_k)$ es el valor ($u$tilidad) del desenlace $k$ el <strong>valor esperado</strong> de esa acción será:<sup id="fnref:valor" role="doc-noteref"><a href="#fn:valor" class="footnote" rel="footnote">2</a></sup></p>
\[P(D_1)u(D_1) + P(D_2)u(D_2) + \dots + P(D_n)u(D_n)\]
<h2 id="la-paradoja">La paradoja</h2>
<p>La utilidad esperada es utilizada casi universalmente como criterio de decisión cuando conocemos la probabilidad de cada uno de los posibles resultados de nuestras decisiones pero a lo largo de los años se han construido algunos ejemplos<sup id="fnref:casi" role="doc-noteref"><a href="#fn:casi" class="footnote" rel="footnote">3</a></sup> con resultados paradójicos. Uno de ellos es conocido como <em>paradoja de San Petersburgo</em>:</p>
<dl>
<dt>Apuesta de San Petersburgo <em>(original)</em></dt>
<dd>Lanza una moneda justa hasta que salga cruz. Por la primera cara recibes 2€ y por cada cara sucesiva recibes el doble que por la anterior (es decir, dos caras tendrá una recompensa de 4€, tres de 8€…)</dd>
</dl>
<table>
<thead>
<tr>
<th># caras</th>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>…</th>
</tr>
</thead>
<tbody>
<tr>
<td>Probabilidad</td>
<td>1/2</td>
<td>1/4</td>
<td>1/8</td>
<td>1/16</td>
<td>…</td>
</tr>
<tr>
<td>Premio</td>
<td>2€</td>
<td>4€</td>
<td>8€</td>
<td>16€</td>
<td>…</td>
</tr>
</tbody>
</table>
<p>¿Aceptarías esta apuesta si el precio para jugarlo son 10€? ¿y si son 100€? ¿10.000€? La teoría de la decisión nos dice que deberíamos aceptar esos precios si no exceden el valor esperado de la apuesta. Esta acción tiene infinitos posibles desenlaces: cualquier cantidad de caras que podamos imaginar es un posible resultado. En concreto, la probabilidad de que salgan $n$ caras es:</p>
\[P(C_1 \wedge \cdots \wedge C_n) = P(C_1)\cdots P(C_n) =\frac{1}{2}\cdots\frac{1}{2} = \frac{1}{2^n}\]
<p>Además, como cada recompensa es el doble que la anterior $u(C_n) = 2^n$. Es decir, el valor esperado será (en este caso con infinitos sumandos):</p>
\[\frac122\;+\;\frac144\;+\;\dots\;+\;\frac{1}{2^n}2^n\;+\;\dots = \infty\]
<p>Es decir, llegamos a la conclusión de que ¡deberíamos estar dispuestos a pagar cualquier precio por poder pagar el juego! Este resultado parece contraintuitivo por tres razones.</p>
<ol>
<li>
<p>Parece tener poco sentido apostar todo nuestro dinero a una sola apuesta. Hay apuestas prometedoras en las que podría tener sentido invertir una gran cantidad de dinero pero ¿no debería haber un límite?</p>
</li>
<li>
<p>Daría igual si las recompensas fuera 2M€, 4M€, 8M€, … o 2¢, 4¢, 8¢, … o si la moneda estuviera sesgada de tal manera que en el 99% de los casos siempre saliera cara: el valor esperado en cualquiera de los casos es el mismo (infinito). Cualquier apuesta con valor esperado infinito es igualmente buena.</p>
</li>
<li>
<p>A partir de esta apuesta podemos construir apuestas <em>sin valor esperado</em> lo que contradice <a href="https://en.wikipedia.org/wiki/Von_Neumann%E2%80%93Morgenstern_utility_theorem#The_axioms">algunas premisas frecuentes</a> en teoría de la decisión<sup id="fnref:asunciones" role="doc-noteref"><a href="#fn:asunciones" class="footnote" rel="footnote">4</a></sup>:</p>
</li>
</ol>
<dl>
<dt>Apuesta sin valor</dt>
<dd>Después de jugar la apuesta de San Petersburgo tira una moneda. Si sale cara recibe el premio normalmente. Si sale cruz en vez de recibir el premio debes pagarlo.</dd>
</dl>
<p>La utilidad esperada de esta apuesta es $\frac12\infty -\frac12\infty$ lo que es una <a href="https://en.wikipedia.org/wiki/Indeterminate_form">indeterminación</a>: no tienen un valor definido y no podemos compararla con otras acciones<sup id="fnref:mean" role="doc-noteref"><a href="#fn:mean" class="footnote" rel="footnote">5</a></sup>.</p>
<h2 id="la-solución-clásica">La solución clásica</h2>
<p>Para llegar a la paradoja de San Petersburgo hemos asumido <a href="#premisas">tres premisas</a>. La primera de las premisas es difícil de descartar o modificar: incluso si no valoráramos el dinero y sólo valoráramos el helado de chocolate podríamos hacer una apuesta cuya recompensa fuera el helado de chocolate y tendríamos la misma paradoja. ¿Qué podemos hacer con las otras premisas?</p>
<p>Una posible solución de la paradoja pasa por la <a href="https://en.wikipedia.org/wiki/Marginal_utility#Diminishing_marginal_utility"><em>utilidad marginal decreciente</em></a>:</p>
<dl>
<dt>Ley de la utilidad marginal decreciente</dt>
<dd>Cuantas más unidades consumimos de algo menor es el valor de cada nueva unidad.</dd>
</dl>
<p>En términos más simples: la primera bola de helado de chocolate tendrá más valor para nosotros que la segunda, la segunda que la tercera… Desde la perspectiva del dinero estamos negando la segunda premisa (<em>valoramos cada euro de la misma forma</em>) lo cuál coincide con nuestras intuiciones del mundo real: para un multimillonario un nuevo euro no tiene el mismo el valor que para alguien que no tenga dinero.</p>
<p>En concreto algunos autores como <a href="https://en.wikipedia.org/wiki/Daniel_Bernoulli">Bernouilli</a> proponen que el valor del dinero es logarítmico<sup id="fnref:log" role="doc-noteref"><a href="#fn:log" class="footnote" rel="footnote">6</a></sup>: si tenemos el doble de dinero este valdrá una “unidad” más. De esta forma, el valor esperado de la apuesta original es:</p>
\[\frac12\log(2)\;+\;\frac14\log(4)\;+\;\dots\;+\;\frac{1}{2^n}\log(2^n)\;+\;\dots = 2 < \infty\]
<p>Por tanto el valor esperado sería finito y resolveríamos la paradoja. Esta solución sin embargo no es satisfactoria porque podemos crear una paradoja con una apuesta modificada:</p>
<dl>
<dt>Súperapuesta de San Petersburgo</dt>
<dd>Lanza una moneda justa hasta que salga cruz. Por la primera cara recibes $2^2$€ y por cada cara sucesiva recibes el cuadrado de la anterior (es decir, dos caras tendrán una recompensa de $2^4$€, 3 caras $2^8$€…)</dd>
</dl>
<p>Con esta apuesta volvemos a tener una paradoja:</p>
\[\frac12\log(2^2)\;+\;\frac14\log(2^4)\;+\;\dots\;+\;\frac{1}{2^n}\log(2^{2^n})\;+\;\dots = \\
\frac122\;+\;\frac144\;+\;\dots\;+\;\frac{1}{2^n}2^n\;+\;\dots = \infty\]
<p>De hecho si el valor del dinero viene dado por una función no acotada podemos crear una apuesta modificada con valor esperado infinito; basta coger como recompensa de la cara $n$-ésima una cantidad de dinero $d_n$ con valor $u(d_n) > 2^n$ (ese valor existe porque la función no es acotada).</p>
<h2 id="está-el-valor-del-dinero-acotado">¿Está el valor del dinero acotado?</h2>
<p>Si sólo queremos negar la segunda premisa parece que la respuesta pasa por aceptar que los humanos tenemos una función de utilidad acotada. ¿Es esto razonable?</p>
<p>La solución de la utilidad acotada ha sido defendida por Kenneth Arrow (de la <a href="https://en.wikipedia.org/wiki/Arrow%27s_impossibility_theorem">paradoja de Arrow</a>) y otros teóricos de la decisión. Este enfoque resolvería también <a href="http://www.nickbostrom.com/ethics/infinite.pdf">algunos problemas</a> de teorías éticas consecuencialistas relacionados con la existencia de sufrimiento infinito pero parece una solución <em>ad hoc</em> por lo que se han elaborado algunas justificaciones.</p>
<p>La justificación más citada es que para obtener un premio arbitrariamente grande deberíamos dedicar un tiempo arbritrariamente largo y moriríamos antes de poder recibirlo<sup id="fnref:certeza" role="doc-noteref"><a href="#fn:certeza" class="footnote" rel="footnote">7</a></sup>. No obstante <a href="https://link.springer.com/article/10.1007/BF00133163#page-1">podemos construir</a> una apuesta (esta vez algo menos realista) que podría utilizarse como contraargumento:</p>
<dl>
<dt>Apuesta de San Petersburgo (con vida extra)</dt>
<dd>Un científico que investiga la longevidad humana nos propone la siguiente apuesta. Lanza una moneda justa hasta que salga cruz. Por la primera cara recibes 2€ y 2 <strong>minutos de vida extra</strong> y por cada cara sucesiva recibes el doble de dinero y minutos extra que por la anterior (es decir, dos caras tendrán una recompensa de 4€ y 4 minutos extra de vida, tres de 8€ y 8 minutos…)</dd>
</dl>
<p>Esta apuesta modificada tiene la misma recompensa monetaria que la apuesta de San Petersburgo original con una recompensa temporal adicional. Siguiendo los mismos cálculos que en la apuesta original podemos esperar $\infty$ € e $\infty$ minutos de vida extra. Este tiempo infinito hace que la utilidad esperada sea en efecto infinita y contradice la justificación original.</p>
<p>Otras posibles justificaciones de la utilidad acotada pasan por analizar la <a href="http://www.sciencedirect.com/science/article/pii/S0167268199000025">psicología humana</a> o argumentar que recibir infinito dinero no tendría valor debido a la inflación.</p>
<h2 id="premio-no-garantizado">Premio no garantizado</h2>
<p>Si creemos que las funciones de utilidad pueden no estar acotadas (es decir, que existen cosas arbitrariamente buenas/malas) sólo nos queda la alternativa de negar la tercera premisa (<em>el sorteo es justo y nos darán el premio completo</em>) o modificar nuestro criterio de decisión.</p>
<p>Podemos negar la tercera premisa utilizando la información de que nadie tiene infinito dinero. Si el banco sólo puede asegurarnos</p>
<div class="standalone"><input type="number" value="1000000" id="max-bound" min="0" max="1e+308" />€</div>
<p>solo podemos esperar recibir <strong><span id="expected-value">17.53</span>€</strong> de media<sup id="fnref:acotado" role="doc-noteref"><a href="#fn:acotado" class="footnote" rel="footnote">8</a></sup>. Si pruebas con valores como
<a href="javascript:void(0)" id="billGates" title="Haz click para modificar el valor" class="interactive">la fortuna de Bill Gates</a>,
<a href="javascript:void(0)" title="Haz click para modificar el valor" id="worldGDP" class="interactive">el PIB mundial</a> o
<a href="javascript:void(0)" title="Haz click para modificar el valor" id="googol" class="interactive">un googol de euros</a>
comprobarás que este valor es bastante bajo. Esto puede servir como justificación para asignar un valor bajo a la apuesta.</p>
<h2 id="cambiando-el-criterio-de-decisión">Cambiando el criterio de decisión</h2>
<p>Finalmente algunos autores plantean que quizás debamos replantearnos el uso de la utilidad esperada. Como posible solución proponen descartar cualquier desenlace con una probabilidad de ocurrir más pequeña que un cierto umbral. En la apuesta de San Petersburgo original, en el <input type="number" value="90" id="percentage" min="1" max="99" />% de los peores desenlaces obtendremos <span id="percentile">8</span>€ o menos, lo que da una perspectiva más realista del valor que le otorgamos realmente a la apuesta.</p>
<p>Este tipo de razonamiento sin embargo no es del todo satisfactorio ya que parece algo arbitrario. Como última alternativa existen algunos <a href="http://blog.givewell.org/2011/08/18/why-we-cant-take-expected-value-estimates-literally-even-when-theyre-unbiased/">enfoques bayesianos</a> que solucionan además otros problemas a los que se enfrenta la teoría de la decisión como el <a href="http://www.nickbostrom.com/papers/pascal.pdf">asalto de Pascal</a>.</p>
<p>Si has llegado hasta aquí y no estás convencido de que la paradoja esté solucionada puedes leer <a href="https://plato.stanford.edu/entries/paradox-stpetersburg">el artículo de la enciclopedia de Stanford</a> sobre el tema para encontrar soluciones alternativas y una discusión más extensa. En cualquier caso, espero haberte convencido de que hay que tener cuidado con los valores de utilidad infinito y con los modelos que utilizamos para tomar decisiones.</p>
<script src="/js/san-petersburgo.js"></script>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:utilidad" role="doc-endnote">
<p>Podemos justificar esta afirmación utilizando la <a href="https://en.wikipedia.org/wiki/Law_of_large_numbers">ley de los grandes números</a>. También existen teoremas de representación que justifican utilizar la utilidad esperada como fórmula de decisión si nuestras preferencias siguen unas ciertas restricciones, siendo el más notable el teorema de <a href="https://en.wikipedia.org/wiki/Von_Neumann%E2%80%93Morgenstern_utility_theorem">von Neumann - Morgenstern</a> pero la apuesta de la que trata este artículo no sigue esos axiomas. Puedes leer más en <a href="https://plato.stanford.edu/entries/rationality-normative-utility/#RepThe">este artículo de SEP</a>. <a href="#fnref:utilidad" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:valor" role="doc-endnote">
<p>Si tomamos la acción como una variable aleatoria discreta $X$ esto es simplemente $E[u(X)]$ (el <a href="https://en.wikipedia.org/wiki/Expected_value">valor esperado</a> de $u(X)$). <a href="#fnref:valor" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:casi" role="doc-endnote">
<p>Este artículo se centra en los problemas de la utilidad esperada infinita o no definida. Puedes encontrar otros problemas que presenta la utilidad esperada como criterio de decisión en el <a href="https://plato.stanford.edu/entries/rationality-normative-utility/#CouExpUtiThe">artículo de SEP</a>. <a href="#fnref:casi" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:asunciones" role="doc-endnote">
<p>En concreto no se cumplen los axiomas de completitud, continuidad e independencia de las alternativas. Puedes leer más en <a href="https://skepticsplay.blogspot.com.es/2014/01/infinite-utility.html">este post</a>. <a href="#fnref:asunciones" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:mean" role="doc-endnote">
<p>Aunque el concepto de valor esperado no esté definido en este caso podemos preguntarnos qué pasaría de media si jugáramos una apuesta así un número arbitrariamente grande de veces. La respuesta es que <a href="http://www.ams.org/journals/tran/1973-185-00/S0002-9947-1973-0336806-5/S0002-9947-1973-0336806-5.pdf">dependiendo de las características de la apuesta</a> la media podría tender a más infinito, a menos infinito u oscilar. Para una discusión más extensa de los problemas que supone tener apuestas sin valor esperado puedes leer <a href="https://doi.org/10.1093/mind/113.450.237">Vexing Expectations</a>. <a href="#fnref:mean" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:log" role="doc-endnote">
<p>Suponemos por simplificar que nos referimos al logaritmo en base dos y que el jugador no tiene ninguna riqueza inicial. Como veremos al final de esta sección esa elección no es relevante. <a href="#fnref:log" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:certeza" role="doc-endnote">
<p>Asumimos aquí que sabemos con certeza que moriremos en algún momento del futuro. Si existe una probabilidad no nula (da igual cómo de pequeña) de que podamos no morir nunca y tenemos una función de utilidad no acotada existiría una apuesta con valor esperado infinito <a href="#fnref:certeza" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:acotado" role="doc-endnote">
<p>Utilizando la fórmula de una progresión geométrica puedes comprobar que si $b$ es la cota el valor esperado es: \(\min\left\{b, \lfloor \log(b) \rfloor + \frac{b}{2^{\lceil\log(b)\rceil - 1}}\right\}\) <a href="#fnref:acotado" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Las matemáticas son una forma de ingeniería2017-08-02T00:00:00+00:00https://codual.github.io/2017/08/02/math
<blockquote>
<p><em>Dios creó los enteros, todo lo demás es trabajo del hombre</em></p>
<ul>
<li>Leopold Kronecker</li>
</ul>
</blockquote>
<p>Las matemáticas no descubren sino que son simplementa un forma de ingeniería muy abstracta: los modelos y las teorías axiomáticas son diseñadas con un cierto propósito y este proceso de exploración no es muy diferente del que podemos hacer cuando consideramos distintos materiales para construir un puente o consideramos distintos diseños para un programa de ordenador<sup id="fnref:lenguaje" role="doc-noteref"><a href="#fn:lenguaje" class="footnote" rel="footnote">1</a></sup>. “Las matemáticas son el lenguaje de la naturaleza” <em>precisamente</em> porque las hemos construido de esta forma.</p>
<p>Alguna gente es reacia a aceptar trabajar con números complejos, geometría proyectiva, lógicas no clásicas o incluso con el concepto de infinito. Parece que cuando los matemáticos encuentran una barrera en el camino simplemente inventan una nueva teoría en la que esa barrera no existe y siguen trabajando<sup id="fnref:parece" role="doc-noteref"><a href="#fn:parece" class="footnote" rel="footnote">2</a></sup>. Aunque cuestionarse la validez (pragmática) de una teoría es correcto y deseable, descartarla por parecer <em>poco natural</em> no es algo aceptable.</p>
<p>Los instrumentos de las matemáticas que hoy en día parecen naturales también fueron atacados de manera similar en el pasado. En 1759 el matemático británico Francis Maseres afirmó que los números negativos <em>“oscurecían la completitud de la doctrina de las ecuaciones y oscurecían las cosas que en su naturaleza eran excesivamente obvias y simples”</em>. Otros matemáticos como Nicolas Chuquet o Michael Stifel los llamaban <em>números absurdos</em>. Para resolver ecuaciones cúbicas Cardano tubo que distinguir 13 tipos distintos de las mismas para expresarlas puramente en términos de números positivos.</p>
<p>Incluso hoy en día una minoría de matemáticos rechazan conceptos realmente útiles por considerar que no son legítimos: los <a href="https://en.wikipedia.org/wiki/Finitism">finitistas</a> afirman que los conjuntos infinitos no <em>existen</em> y los <a href="https://en.wikipedia.org/wiki/Ultrafinitism">ultrafinitistas</a> como Doron Zeidberg incluso descartan la existencia de números <em>demasiado</em> grandes.</p>
<p>Hoy vemos a estos reaccionarios como una curiosidad histórica<sup id="fnref:actual" role="doc-noteref"><a href="#fn:actual" class="footnote" rel="footnote">3</a></sup> de la que nosotros no pecamos: es <em>obvio</em> que los números negativos o el cero son elementos <em>naturales</em> mientras que los <a href="https://en.wikipedia.org/wiki/Surreal_number">números surreales</a> o los <a href="https://en.wikipedia.org/wiki/Oracle_machine">oráculos</a> son construcciones absurdas. Pero, desde el punto de vista de las matemáticas como ingeniería (una forma de <a href="https://en.wikipedia.org/wiki/Formalism_(philosophy_of_mathematics)">formalismo</a>) ninguna construcción matemática es más natural: un matemático <a href="https://www.dpmms.cam.ac.uk/~wtg10/2cultures.pdf">no <em>descubre</em> las teorías</a>: las diseña y las construye con un objetivo en mente, por lo que no tiene sentido cuestionarse si son <em>naturales</em><sup id="fnref:cat" role="doc-noteref"><a href="#fn:cat" class="footnote" rel="footnote">4</a></sup>.</p>
<p>Juzga las matemáticas por su utilidad y su adecuación al fenómeno del mundo real que quieres estudiar no por cómo de extrañas te parezcan.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:lenguaje" role="doc-endnote">
<p>Este punto de vista es aplicable también al lenguaje <a href="http://www.ditext.com/carnap/carnap.html">como expresa Carnap</a>. <a href="#fnref:lenguaje" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:parece" role="doc-endnote">
<p>Y efectivamente es así, de la misma forma que cambiamos la herramienta que utilizamos cuando no resulta la más adecuada para el objetivo que tenemos en mente. <a href="#fnref:parece" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:actual" role="doc-endnote">
<p>O actual en el caso de los finitistas. <a href="#fnref:actual" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:cat" role="doc-endnote">
<p>Salvo <a href="https://en.wikipedia.org/wiki/Natural_transformation">en teoría de categorías</a>, claro está. <a href="#fnref:cat" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Pares mínimos con Anki2017-08-01T00:00:00+00:00https://codual.github.io/2017/08/01/pairs
<p>Un <a href="https://en.wikipedia.org/wiki/Minimal_pair"><strong>par mínimo</strong></a> es un par palabras de un idioma que se diferencian únicamente en un fono (<em>c<strong>a</strong>sa</em> y <em>c<strong>o</strong>sa</em>). Los pares mínimos pueden utilizarse para decidir si dos fonos representan diferentes fonemas: distinguimos <em>casa</em> de <em>cosa</em> luego <em>[a]</em> y <em>[o]</em> son dos fonemas distintos y no dos realizaciones del mismo fonema.</p>
<p>Los pares mínimos <a href="https://pdfs.semanticscholar.org/072f/f0f0262f092809945f65fd686191a02345cf.pdf?_ga=2.69236761.829640605.1493754174-1497914744.1493754174">pueden utilizarse</a> también en el aprendizaje de lenguas para aprender a diferenciar fonos que no suelas distinguir (por ejemplo, para aprender la diferencia entre <em>/b/</em> y <em>/v/</em> o entre <em>/n/</em> y <em>/ŋ/</em> o aprender tonos si tu lengua nativa no es tonal). Este post reune algunas herramientas útiles y cosas a tener en cuenta para utilizar esta técnica.</p>
<h2 id="elegir-los-fonemas">Elegir los fonemas</h2>
<p>No todos los sonidos de un idioma serán extraños para ti por lo que deberías centrarte en aquellos que te resulten más difíciles o que no estés acostumbrado a producir. Dependiendo del idioma y de tu idioma nativo es posible encontrar listas de los fonemas o características más difíciles de diferenciar en sitios como Wikipedia (<a href="https://en.wikipedia.org/wiki/Non-native_pronunciations_of_English#Spanish">ejemplo de español-inglés</a>) o en libros de fonética de el idioma objetivo que estén escritos en tú idioma.</p>
<p>Es más fácil encontrar información que compare la fonología inglesa con la de otro idioma y puedes aprovechar esta información pero debes tener en cuenta las diferencias que haya con tu idioma. Los artículos de la Wikipedia sobre fonología de cada idioma también pueden resultarte útiles.</p>
<h2 id="obtener-los-pares">Obtener los pares</h2>
<p>Encontrar listas de pares mínimos suele ser sencillo (especialmente para los fonemas que son difíciles para hablantes nativos de inglés). Puedes probar a utilizar tu buscador favorito (en inglés el término es <em>minimal pairs</em>) o buscarlos en libros de fonética del idioma objetivo (o simplemente en libros de idioma).</p>
<p>Es posible que encuentres una lista de pares mínimos pero no grabaciones de las palabras, por lo que deberás encontrarlas aparte. Las grabaciones deben ser lo más parecidas posibles para que no puedas guiarte por otros elementos aparte de la diferencia del fonema. Debes tener en cuenta:</p>
<ul>
<li>La <strong>entonación</strong> debería ser la misma para ambas palabras. Si vas a pedir a un hablante nativo que haga la grabación pide que grabe cada palabra dos veces (<em>casa casa cosa cosa</em>) ya que tendemos a pronunciar con distinta entonación la primera y segunda palabra de una pareja</li>
<li>Ten cuidado con el <strong>acento</strong>. Casi todos los idiomas muestran diferencias entre los acentos en distintas regiones (el <a href="https://en.wikipedia.org/wiki/Regional_accents_of_English">artículo de los acentos del inglés</a> puede darte una idea de la gran variabilidad que puede tener un idioma). Intenta conocer qué acento está utilizando la persona que graba ya que dependiendo del acento una palabra puede contar o no con el fonema que quieres.</li>
</ul>
<p>Si <strong>no encontraras el audio</strong> junto con los pares mínimos puedes probar a utilizar audios de <a href="http://www.forvo.com/">Forvo</a> (asegurándote que sean del mismo usuario y no tengan diferencias significativas) o pedir una grabación en <a href="https://rhinospike.com/">Rhinospike</a> (es gratuito aunque deberás hacer grabaciones en tu idioma a cambio).</p>
<p>Si la grabación de todas las palabras está <strong>en un solo audio</strong> puedes utilizar <a href="http://www.audacityteam.org/">Audacity</a> [gratis, libre, Windows, macOS, GNU/Linux] para separarlas, utilizando la opción <code class="language-plaintext highlighter-rouge">Analizar</code> → <code class="language-plaintext highlighter-rouge">Sound Finder</code> (es posible que tengas que modificar los dos primeros parámetros dependiendo del audio) y a continuación <code class="language-plaintext highlighter-rouge">Archivo</code> → <code class="language-plaintext highlighter-rouge">Exportar múltiple…</code> para obtener archivos separados de cada palabra. Los nombres por defecto serán números consecutivos empezando desde el 1. Si tienes muchas palabras puede ser recomendable renombrar los archivos (aquí un ejemplo de cómo hacerlo en Python asumiendo que <code class="language-plaintext highlighter-rouge">WORDS_FILE</code> tiene las palabras del audio en orden, una en cada línea):</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="n">words</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">WORDS_FILE</span><span class="p">).</span><span class="n">read</span><span class="p">().</span><span class="n">splitlines</span><span class="p">()</span>
<span class="k">for</span> <span class="n">num</span><span class="p">,</span> <span class="n">word</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">words</span><span class="p">,</span> <span class="n">start</span> <span class="o">=</span> <span class="mi">1</span><span class="p">):</span>
<span class="n">os</span><span class="p">.</span><span class="n">rename</span><span class="p">(</span><span class="s">"{}.mp3"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">num</span><span class="p">),</span> <span class="s">"{}.mp3"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">word</span><span class="p">))</span>
</code></pre></div></div>
<h2 id="crear-las-tarjetas">Crear las tarjetas</h2>
<p>Para entrenar la diferenciación de los fonemas puedes utilizar un sistema de <a href="/2016/07/07/repeticion-espaciada">repetición espaciada</a>. Yo lo he hecho en Anki utilizando el tipo de tarjeta que acompaña al libro <a href="https://fluent-forever.com">Fluent Forever</a>. Puedes encontrar <a href="https://fluent-forever.com/gallery/">un tutorial de cómo instalarlo</a>. Las tarjetas de Fluent Forever constan de la siguiente información para cada palabra:</p>
<ul>
<li>La escritura de la palabra</li>
<li>Un audio con su pronunciación</li>
<li>La transcripción fonética siguiendo el Alfabeto Fonético Internacional</li>
<li>La traducción de la palabra</li>
</ul>
<p>No tienes por qué poner todos los campos (algunos como la transcripción fonética pueden ser difíciles de encontrar o no muy útiles si no quieres invertir el tiempo necesario para aprender a leer el IPA). En mí caso estoy utilizando las tarjetas para aprender a diferenciar algunos fonemas del inglés por lo que era sencillo encontrar la información necesaria. Si vas a utilizar la transcripción fonética ten cuidado de que esta se corresponda con la del audio.</p>
<p>Si vas a utilizar esta técnica con palabras en inglés para obtener la traducción y transcripción (británica) puedes utilizar la API de <a href="https://www.oxforddictionaries.com/">Oxford Dictionaries</a>. En el siguiente ejemplo las funciones <code class="language-plaintext highlighter-rouge">ipa</code> y <code class="language-plaintext highlighter-rouge">to_es</code> devuelven la primera transcripción (por defecto en <a href="https://en.wikipedia.org/wiki/Received_Pronunciation">Received Pronunciation</a>) y traducción encontradas (del primer sentido o subsentido de la palabra que aparezca) respectivamente:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="n">HEADER</span> <span class="o">=</span> <span class="p">{</span><span class="s">'app_id'</span><span class="p">:</span> <span class="s">'xxxxxxxxxx'</span><span class="p">,</span> <span class="s">'app_key'</span><span class="p">:</span> <span class="s">'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span><span class="p">}</span>
<span class="n">API_URL</span> <span class="o">=</span> <span class="s">'https://''od-api.oxforddictionaries.com:443/api/v1/entries/en/'</span>
<span class="k">def</span> <span class="nf">ipa</span><span class="p">(</span><span class="n">word</span><span class="p">):</span>
<span class="s">""" Gets IPA pronunciation (RP) from Oxford Dictionary.
Empty if no suitable answer is found."""</span>
<span class="n">req</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">API_URL</span> <span class="o">+</span> <span class="n">word</span><span class="p">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">headers</span> <span class="o">=</span> <span class="n">HEADER</span><span class="p">)</span>
<span class="k">if</span> <span class="n">req</span><span class="p">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
<span class="n">entries</span> <span class="o">=</span> <span class="n">req</span><span class="p">.</span><span class="n">json</span><span class="p">()[</span><span class="s">"results"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"lexicalEntries"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">entries</span><span class="p">:</span>
<span class="k">if</span> <span class="s">"pronunciations"</span> <span class="ow">in</span> <span class="n">entry</span><span class="p">:</span>
<span class="k">return</span> <span class="n">entry</span><span class="p">[</span><span class="s">"pronunciations"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"phoneticSpelling"</span><span class="p">]</span>
<span class="k">return</span> <span class="s">""</span>
<span class="k">def</span> <span class="nf">to_es</span><span class="p">(</span><span class="n">word</span><span class="p">):</span>
<span class="s">""" Gets Spanish translation from Oxford Dictionary.
Empty if no suitable answer is found."""</span>
<span class="n">req</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">API_URL</span> <span class="o">+</span> <span class="n">word</span><span class="p">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">+</span><span class="s">'/translations=es'</span><span class="p">,</span> <span class="n">headers</span> <span class="o">=</span> <span class="n">HEADER</span><span class="p">)</span>
<span class="k">if</span> <span class="n">req</span><span class="p">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
<span class="n">senses</span> <span class="o">=</span> <span class="n">req</span><span class="p">.</span><span class="n">json</span><span class="p">()[</span><span class="s">"results"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"lexicalEntries"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"entries"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"senses"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">sense</span> <span class="ow">in</span> <span class="n">senses</span><span class="p">:</span>
<span class="k">if</span> <span class="s">"translations"</span> <span class="ow">in</span> <span class="n">sense</span><span class="p">:</span>
<span class="k">return</span> <span class="n">sense</span><span class="p">[</span><span class="s">"translations"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"text"</span><span class="p">]</span>
<span class="k">elif</span> <span class="s">"subsenses"</span> <span class="ow">in</span> <span class="n">sense</span><span class="p">:</span>
<span class="k">for</span> <span class="n">subsense</span> <span class="ow">in</span> <span class="n">sense</span><span class="p">[</span><span class="s">"subsenses"</span><span class="p">]:</span>
<span class="k">if</span> <span class="s">"translations"</span> <span class="ow">in</span> <span class="n">subsense</span><span class="p">:</span>
<span class="k">return</span> <span class="n">subsense</span><span class="p">[</span><span class="s">"translations"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"text"</span><span class="p">]</span>
<span class="k">return</span> <span class="s">""</span>
</code></pre></div></div>
<p>Para utilizar el código debes sustituir <code class="language-plaintext highlighter-rouge">HEADER</code> con las <code class="language-plaintext highlighter-rouge">app_id</code> y <code class="language-plaintext highlighter-rouge">app_key</code> que te proporcionarán al registrarte en <a href="https://developer.oxforddictionaries.com/documentation">la web</a> (es gratuito con acceso limitado).</p>
<p>Finalmente para automatizar lo máximo posible el proceso puedes producir un archivo CSV que tenga las distintas cartas. Si tienes una lista de las palabras de tal manera que cada dos forman una pareja puedes utilizar el siguiente código (sustituyendo las funciones <code class="language-plaintext highlighter-rouge">ipa</code> y <code class="language-plaintext highlighter-rouge">to_es</code> por unas que devuelvan la información correcta en tu idioma objetivo):</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">csv</span>
<span class="n">words</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">WORDS_FILE</span><span class="p">).</span><span class="n">read</span><span class="p">().</span><span class="n">splitlines</span><span class="p">()</span>
<span class="n">cards_csv</span> <span class="o">=</span> <span class="n">csv</span><span class="p">.</span><span class="n">writer</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">CARDS_FILE</span><span class="p">,</span> <span class="s">'a'</span><span class="p">),</span> <span class="n">delimiter</span><span class="o">=</span><span class="s">','</span><span class="p">)</span>
<span class="k">for</span> <span class="n">num</span><span class="p">,</span> <span class="n">word</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">words</span><span class="p">,</span> <span class="n">start</span> <span class="o">=</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">if</span> <span class="n">num</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">prev</span> <span class="o">=</span> <span class="n">word</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">cards_csv</span><span class="p">.</span><span class="n">writerow</span><span class="p">([</span><span class="n">prev</span><span class="p">,</span> <span class="s">"[sound:{}.mp3]"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">prev</span><span class="p">),</span> <span class="n">ipa</span><span class="p">(</span><span class="n">prev</span><span class="p">),</span> <span class="n">to_es</span><span class="p">(</span><span class="n">prev</span><span class="p">)]</span>
<span class="o">+</span> <span class="p">[</span><span class="n">word</span><span class="p">,</span> <span class="s">"[sound:{}.mp3]"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">word</span><span class="p">),</span> <span class="n">ipa</span><span class="p">(</span><span class="n">word</span><span class="p">),</span> <span class="n">to_es</span><span class="p">(</span><span class="n">word</span><span class="p">)])</span>
</code></pre></div></div>
<p>Puedes importarlas en Anki (<code class="language-plaintext highlighter-rouge">Archivo</code> → <code class="language-plaintext highlighter-rouge">Importar…</code>). No te olvides además de copiar los audios en la carpeta <code class="language-plaintext highlighter-rouge">collections.media</code>. ¡Y ya está!</p>
Introducción a ZFC2017-03-25T00:00:00+00:00https://codual.github.io/2017/03/25/zfc
<em>Este post contiene fórmulas matemáticas que podrían
no visualizarse correctamente en un lector de RSS.</em>
<hr>
<p><em>Este post fue <a href="//libreim.github.io/blog/2017/03/25/zfc/">publicado originalmente</a> en el blog de libreim el 25 de marzo de 2017.</em></p>
<p>A principios del siglo XX las matemáticas sufrieron una crisis
fundacional: los principios que se consideraban básicos para la
deducción de las teorías matemáticas daban lugar a paradojas y los
matemáticos de la época se embarcaron en la creación de un sistema
axiomático que pudiera formalizar todos los teoremas de la época sin dar
lugar a estas paradojas.</p>
<p>Una de las posibles soluciones son las teorías axiomáticas de conjuntos,
de entre las cuales la más utilizada actualmente es ZFC (la teoría de
Zermelo-Fraenkel junto con el axioma de elección)<sup id="fnref:zfc-alternativas" role="doc-noteref"><a href="#fn:zfc-alternativas" class="footnote" rel="footnote">1</a></sup>.</p>
<p>En este artículo exponemos los axiomas de esta teoría y la comparamos
con otras teorías de conjuntos (y de clases). Se incluyen también
algunos ejercicios.</p>
<!--more-->
<h3 id="el-lenguaje">El lenguaje</h3>
<blockquote>
<p>Second order logic is just set theory in disguise - <a href="https://en.wikipedia.org/wiki/Willard_Van_Orman_Quine">W.V.O.
Quine</a></p>
</blockquote>
<p>Para formalizar una teoría axiomática de cualquier tipo necesitamos un
lenguaje en el cual expresar los axiomas, pero el lenguaje natural
<a href="https://en.wikipedia.org/wiki/Berry_paradox">produce paradojas</a>. Para
solucionar este problema utilizaremos un lenguaje lógico.</p>
<p>Hay muchas otras posibles elecciones con respecto a qué lógica utilizar:
por ejemplo <a href="https://en.wikipedia.org/wiki/Constructive_set_theory">algunas
teorías</a>
axiomáticas de conjuntos utilizan <a href="https://en.wikipedia.org/wiki/Non-classical_logic">lógicas no
clásicas</a>. Podríamos
también considerar las <a href="https://plato.stanford.edu/entries/logic-higher-order/">lógicas de orden
superior</a> pero
por <a href="http://philosophy.stackexchange.com/a/2618">razones históricas y
filosóficas</a> y por sus
propiedades metalógicas formularemos la teoría en lógica de primer
orden.</p>
<h4 id="la-lógica-de-primer-orden">La lógica de primer orden</h4>
<p>La lógica de primer orden consta de dos tipos de símbolos: los símbolos
lógicos y los no-lógicos, que forman fórmulas a partir de una <a href="https://en.wikipedia.org/wiki/First-order_logic#Syntax">serie de
reglas</a>. No es
el objetivo de este post explicar en detalle la lógica de primer orden y
basta con que seas capaz de leer fórmulas como
\(\forall x \operatorname{Cuervo}(x) \implies \operatorname{Negro}(x)\)
(<em>todos los cuervos son negros</em>) <sup id="fnref:zfc-cuervos" role="doc-noteref"><a href="#fn:zfc-cuervos" class="footnote" rel="footnote">2</a></sup>.</p>
<p>Los símbolos <strong>lógicos</strong> de nuestra teoría pueden reducirse a una
colección de conectivas lógicas <a href="https://en.m.wikipedia.org/wiki/Functional_completeness">funcionalmente
completas</a>
(cómo mínimo <a href="https://en.wikipedia.org/wiki/Sheffer_stroke">la operación
NAND</a> o más comúnmente la
conjunción, disyunción, negación, implicación y bicondicional) así como
al menos un cuantificador (para todo \(\forall\) o existe \(\exists\)).
Contamos además con una cantidad infinita de variables (basta con una
cantidad numerable) para escribir nuestras fórmulas.</p>
<p>Contaremos además como único símbolo <strong>no-lógico</strong> a la relación de
pertenencia \(\in(\cdot,\cdot)\) que escribiremos \(A \in B\) y leemos <em>A
pertenece a B</em>.</p>
<p>Nuestra lógica también incluye el símbolo de igualdad \(=\) y <a href="https://en.wikipedia.org/wiki/First-order_logic#Equality_and_its_axioms">sus
axiomas</a>,
que incluimos a continuación por completitud. Los 3 primeros axiomas nos
indican que la igualdad es una <a href="https://en.wikipedia.org/wiki/Equivalence_relation">relación de
equivalencia</a>. El
último es un esquema de axioma (una colección infinita de axiomas que
depende de una fórmula) que caracteriza la igualdad (conocido como
<a href="https://en.wikipedia.org/wiki/Identity_of_indiscernibles"><em>identidad de los
indiscernibles</em></a>).</p>
<ol>
<li><strong>Reflexividad</strong> \(\forall x \; x = x\)</li>
<li><strong>Simetría</strong> \(\forall x \forall y \; x = y \implies y = x\)</li>
<li><strong>Transitividad</strong>
\(\forall x \forall y \forall z \; x = y \wedge y = z \implies x = z\)</li>
<li><strong>Sustitución</strong> Si \(\varphi\) es una fórmula y \(\varphi'\) es la
fórmula que resulta de sustituir todas las ocurrencias libres de \(x\)
por \(y\) se verifica:
\(\forall x \forall y \; x = y \implies (\varphi \implies \varphi')\)</li>
</ol>
<h5 id="una-nota-sobre-los-cuantificadores">Una nota sobre los cuantificadores</h5>
<p>Cuando se escriben fórmulas matemáticas habitualmente omitimos los cuantificadores o utilizamos
<a href="https://en.wikipedia.org/wiki/Bounded_quantifier"><em>cuantificadores
delimitados</em></a>:</p>
\[\forall x \in A \; \varphi(x)\]
\[\exists x \in A \; \varphi(x)\]
<p>que leemos <em>para todo</em> \(x\) <em>en</em> \(A\) <em>se verifica</em> \(\varphi(x)\) y <em>existe
un</em> \(x\) <em>en</em> \(A\) <em>tal que</em> \(\varphi(x)\) respectivamente.</p>
<p>En los axiomas de la teoría de conjuntos sin embargo los cuantificadores
no están delimitados, por lo que debemos expresarlo con una fórmula
equivalente:</p>
\[\forall x \; x \in A \implies \varphi(x)\]
\[\exists x \; x \in A \wedge \varphi(x)\]
<p>es decir <em>para todo \(x\), si \(x\) pertenece a \(A\) entonces \(\varphi(x)\)</em> y
<em>existe un \(x\) tal que \(x\) pertenece a \(A\) y \(\varphi(x)\)</em>. En este caso
\(x\) es ahora cualquier conjunto.<sup id="fnref:zfc-dominio" role="doc-noteref"><a href="#fn:zfc-dominio" class="footnote" rel="footnote">3</a></sup></p>
<h3 id="el-dominio-de-discurso">El dominio de discurso</h3>
<blockquote>
<p>In every discourse, whether of the mind conversing with its own
thoughts, or of the individual in his intercourse with others, there
is an assumed or expressed limit within which the subjects of its
operation are confined. - Boole, 1854</p>
</blockquote>
<p>Las matemáticas tratan de objetos muy dispares como pueden ser los
números, las funciones, los espacios topológicos, las máquinas de Turing
o las categorías. Una teoría fundacional debería ser capaz de expresar
todos estos objetos utilizando las mismas piezas. En algunos casos la
transformación a conjuntos es clara (los espacios topológicos o las
máquinas de Turing suelen definirse de forma explícita como conjuntos)
pero en otros casos (los números o las funciones) esa transformación no
suele realizarse de forma explícita cuando trabajamos con estos. ¿Es
posible expresar cualquier objeto matemático en forma de conjuntos o
necesitamos además otros tipos de objetos?</p>
<p>En esta sección realizamos construcciones explícitas de estos objetos
matemáticos y discutimos los límites de ZFC para describir todas las
matemáticas.</p>
<h4 id="los-números-son-conjuntos">Los números son conjuntos</h4>
<p>Algunas teorías como
<a href="https://en.wikipedia.org/wiki/New_Foundations">NFU</a> o
<a href="https://en.wikipedia.org/wiki/Kripke%E2%80%93Platek_set_theory_with_urelements">KPU</a>
admiten <em>urelementos</em>: elementos que <strong>no</strong> son conjuntos pero
pueden ser elementos de conjuntos (esto es, sólo pueden aparecer en el
lado izquierdo de \(\in\)) y así lo hacía la <a href="https://en.wikipedia.org/wiki/Zermelo_set_theory">teoría de
Zermelo</a> de 1908 en la
que se basa ZFC. Esta podría ser una opción para incluir los números en
nuestra teoría, sin embargo las matemáticas pueden basarse
exclusivamente en <em>conjuntos hereditarios</em><sup id="fnref:zfc-casi" role="doc-noteref"><a href="#fn:zfc-casi" class="footnote" rel="footnote">4</a></sup>.</p>
<p>Un conjunto se dice
<a href="https://en.wikipedia.org/wiki/Hereditary_set"><strong>hereditario</strong></a> si todos
sus elementos son conjuntos hereditarios. Como <a href="https://en.wikipedia.org/wiki/Vacuous_truth">verdad
vacua</a> podemos demostrar
que el <strong>conjunto vacío</strong> \(\varnothing\) es un conjunto hereditario y por
tanto (como veremos a continuación) también lo serán
\(\{\varnothing\}, \{\varnothing, \{\varnothing\}\},\{\{\varnothing\}\}, \dots\).
Combinando conjuntos hereditarios a partir de los axiomas podemos crear
una cantidad arbitrariamente grande de conjuntos y por tanto nos basta
nombrar de forma especial algunos de estos conjuntos para obtener
nuestra teoría.</p>
<p>La forma habitual de proceder es definir primero los números naturales
siguiendo los <a href="https://en.wikipedia.org/wiki/Ordinal_number#Von_Neumann_definition_of_ordinals">ordinales de Von
Neumann</a>:</p>
\[0 = \varnothing, 1 = \{0\} = \{\varnothing\}, 2 = \{0,1\} = \{\varnothing,\{\varnothing\}\}, \dots\]
<p>De esta forma obtenemos los números naturales<sup id="fnref:zfc-nats" role="doc-noteref"><a href="#fn:zfc-nats" class="footnote" rel="footnote">5</a></sup>. A continuación para
obtener los enteros, racionales, reales y complejos podemos definirlos
mediante relaciones de equivalencia adecuadas. Puedes encontrar una
posible construcción explícita en <a href="http://math.stackexchange.com/a/62868/135164">esta pregunta de Stack
Exchange</a>.</p>
<h4 id="las-funciones-son-conjuntos">Las funciones son conjuntos</h4>
<p>Una función es una operación que relaciona un elemento o tupla de
elementos de su dominio con un único elemento de su codominio. Para
formalizar este concepto podemos identificar (casi) todas las funciones
como un conjunto: su grafo.</p>
<p>De esta forma una aplicación \(f: A \to B\) puede verse como una 3-upla
\((A,B,G)\) con \(G = \{(a,b) \in A \times B \;:\; b = f(a) \}\) <sup id="fnref:zfc-funcion" role="doc-noteref"><a href="#fn:zfc-funcion" class="footnote" rel="footnote">6</a></sup>.</p>
<p>No todas las funciones pueden expresarse como conjuntos: las operaciones
clásicas sobre conjuntos (unión, intersección, conjunto potencia) así
como la aplicación que devuelve la cardinalidad de un conjunto son
aplicaciones que tienen como dominio todos los conjuntos, pero en ZFC no
existe el conjunto de todos los conjuntos. Podemos ver a estas
“funciones” simplemente como notación.</p>
<h4 id="algunas-cosas-que-no-son-conjuntos">Algunas cosas que no son conjuntos</h4>
<p>En algunas partes de las matemáticas como la <a href="https://libreim.github.io/blog/2014/10/04/intro-categorias/">teoría de
categorías</a>
resulta útil con frecuencia hablar de todos los conjuntos a la vez (por
ejemplo cuando queremos hablar de los objetos de la categoría
\(\texttt{Set}\)) pero se nos presenta el problema de que (en ZFC) no
existe el <a href="https://en.wikipedia.org/wiki/Universal_set"><em>conjunto
universal</em></a> (el conjunto de
todos los conjuntos). Para resolver este problema existen 3 opciones.</p>
<p>En primer lugar podríamos utilizar una <strong>teoría axiomática distinta</strong> que
incluyera la clase de todos los conjuntos como NBG. Esta teoría nos
permite utilizar todo lo que conocemos de ZFC añadiendo además nuevos
objetos que nos permiten hablar de colecciones más grandes sin inducir
paradojas.</p>
<p>Otra opción es utilizar una teoría como la <a href="http://math.stackexchange.com/a/234208/135164"><strong>teoría de
Tarski-Grothendieck</strong></a> que
incluye conjuntos que, si bien no son <em>el conjunto de todos los
conjuntos</em> sí que comparten muchas de sus propiedades.</p>
<p>Por último si queremos mantenernos en ZFC podemos introducir una <strong>nueva
notación</strong> para hablar de clases: si \(C\) es una clase definida por una
propiedad \(P\) introducimos el símbolo \(\in C\) como un predicado que
indica <em>… tiene la propiedad P</em>. De esta forma podemos utilizar una
notación parecida a la de los conjuntos para hablar de una cantidad
reducida de clases (aquellas definibles mediante una propiedad).</p>
<h3 id="los-axiomas">Los axiomas</h3>
<p>La teoría axiomática de conjuntos de ZFC es una extensión de la teoría
de conjuntos de Zermelo, descrita a principios del siglo XX como
respuesta a las paradojas de la teoría de conjuntos informal. Aunque
existen <a href="https://en.wikipedia.org/wiki/Paraconsistent_logic">corrientes filosóficas y
lógicas</a> que
permiten la existencia de contradicciones, las reglas de inferencia de
la lógica clásica hacen que si un sistema axiomático no es consistente
(tiene contradicciones) entonces podamos <a href="https://en.wikipedia.org/wiki/Principle_of_explosion">demostrar cualquier
cosa</a>. Por tanto
necesitamos establecer una teoría que no tenga esas contradicciones.</p>
<p>La más famosa de las paradojas de la teoría de conjuntos informal es la
<a href="https://en.wikipedia.org/wiki/Russell's_paradox">paradoja de
Russell</a>: <em>Si un
barbero afeita a todos los que no se afeitan a sí mismos, ¿se afeita a
sí mismo?</em>. En términos de la teoría de conjuntos informal se traduce
en:</p>
<blockquote>
<p>Sea \(R = \{x \;:\; x \notin x\}\). Entonces \(R \in R\) si y sólo si
\(R \notin R\)</p>
</blockquote>
<p>Otras paradojas que impulsaron la creación de esta teoría son la
<a href="https://en.wikipedia.org/wiki/Cantor's_paradox">paradoja de Cantor</a>
(no existe el conjunto de todos los cardinales) y la <a href="https://en.wikipedia.org/wiki/Burali-Forti_paradox">paradoja de
Burali-Fort</a> (no
existe el conjunto de todos los ordinales).</p>
<p>Para resolver estas paradojas necesitamos especificar las reglas de
formación de los conjuntos de tal manera que sean suficientemente
fuertes para describir todas las matemáticas pero no lleven a
contradicción. En el caso de ZFC estas reglas son iterativas:
construiremos conjuntos más complejos a partir del conjunto vacío
formando el <a href="https://en.wikipedia.org/wiki/Von_Neumann_universe">universo de von
Neumann</a>. A
continuación presentamos estas reglas (los axiomas) siguiendo la
descripción de <em>Kunen (1980)</em>.</p>
<h4 id="existencia">Existencia</h4>
\[\exists x (x = x)\]
<p>En la mayor parte de las definiciones de la lógica de primer orden se
asume que <a href="https://en.wikipedia.org/wiki/Empty_domain">el dominio de discurso no es
vacío</a>: si lo fuera muchas
de las reglas de inferencia y teoremas lógicos que se utilizan
normalmente no serían válidos en general. Por completitud añadimos este
axioma que nos indica que <strong>existe un conjunto</strong> <sup id="fnref:zfc-vacio" role="doc-noteref"><a href="#fn:zfc-vacio" class="footnote" rel="footnote">7</a></sup>.</p>
<h4 id="extensionalidad">Extensionalidad</h4>
\[\forall x \forall y (\forall z (z \in x \iff z \in y) \implies x = y)\]
<p>El axioma de extensionalidad nos indica que <strong>dos conjuntos son iguales
si tienen los mismos elementos</strong>. Es decir, al definir un conjunto sólo
importan sus elementos, pero no el orden o el número de repeticiones de
cada elemento: \(\{2,2,3,1\} = \{1,2,3\}\)</p>
<details class="ejercicio">
<summary>
<p><em>Definir \(\subseteq\) y probar que es una relación de orden</em></p>
</summary>
<p>Definimos</p>
\[a \subseteq b \iff \forall x (x \in a \implies x \in b)\]
<ul>
<li>Es <strong>reflexiva</strong> porque \(\implies\) es reflexiva</li>
<li>Es <strong>transitiva</strong> porque \(\implies\) es transitiva</li>
<li>Es <strong>antisimétrica</strong> por el axioma de extensionalidad</li>
</ul>
</details>
<h4 id="comprensión">Comprensión</h4>
<p><em>Si \(\varphi(x)\) es una fórmula en la que \(y\) no es una variable libre
se verifica</em></p>
\[\forall z \exists y \forall x (x \in y \iff x \in z \wedge \varphi(x))\]
<p>Como vimos en la primera sección la lógica empleada para describir ZFC
es la lógica de primer orden, que sólo permite utilizar cuantificadores
sobre nuestro dominio de discurso: <em>los conjuntos</em>. Por esta razón
cuando queremos hablar de algo que se cumple para todas las fórmulas
necesitamos incluir <em>esquemas de axioma</em>: un conjunto de axiomas
parametrizados por las fórmulas<sup id="fnref:zfc-segundo" role="doc-noteref"><a href="#fn:zfc-segundo" class="footnote" rel="footnote">8</a></sup>.</p>
<p>Obtenemos así una cantidad infinita (pero computable) de axiomas<sup id="fnref:zfc-enumerable" role="doc-noteref"><a href="#fn:zfc-enumerable" class="footnote" rel="footnote">9</a></sup>.
Estos axiomas nos indican que para cada \(z\) y cada propiedad \(\varphi\)
los elementos de \(z\) que cumplen \(\varphi\) forman un conjunto. Esto
justifica la notación \(\{x \in z \;:\; \varphi(x)\}\). Tienen sentido
entonces definiciones como
\(\mathbb{R}^+ = \{x \in \mathbb{R} \;:\; x > 0\}\), pero no
\(\{x : x = x\}\) (no hay \(z\)) o conjuntos autorreferentes como
\(Y = \{x : x \notin Y\}\) (\(y\) es una variable libre en \(\varphi\)).</p>
<details class="ejercicio">
<summary>
<p><em>Probar que existe el conjunto vacío:</em>
\(\exists \varnothing \forall x (x \notin \varnothing)\)</p>
</summary>
<p>Por el axioma de existencia existe un conjunto \(A\).</p>
<p>Definimos entonces \(\varnothing = \{x \in A \;:\; x \neq x\}\). Por el
axioma de reflexividad de la igualdad, ningún elemento pertenece a
\(\varnothing\).</p>
</details>
<details class="ejercicio">
<summary>
<p><em>Probar que no existe el conjunto
universal:</em> \(\nexists U \forall x (x \in U)\)</p>
</summary>
<p>Supongamos que existe \(U\).</p>
<p>Definimos entonces \(R = \{x \in U \;:\; x \notin x\}\). En tal caso
podemos aplicar la paradoja de Russell (\(R \in R \iff R \notin R\)) y
tenemos una contradicción.</p>
</details>
<p>Diferentes teorías axiomáticas de conjuntos han tenido históricamente
esquemas de axioma de comprensión con distintas restricciones: el
primero de ellos, propuesto por Frege, es el <a href="https://en.wikipedia.org/wiki/Axiom_schema_of_specification#Unrestricted_comprehension"><em>esquema de axioma de
comprensión no
restringido</em></a>:
Para cualquier fórmula \(\varphi\):</p>
\[\exists z (\forall x (x \in z \iff \varphi(x)))\]
<p>Este axioma lleva a la paradoja de Russell y por esta razón se restringe
el esquema de axioma para definir sólo subconjuntos. Otra opción es
restringir la forma de la fórmula \(\varphi\) de manera que esté
<a href="https://en.wikipedia.org/wiki/Stratification_(mathematics)#In_set_theory">estratificada</a>.
Esta es la opción que adopta NF y que permite la construcción del
conjunto universal (pero NF tiene otras propiedades poco deseables: es
incompatible con el axioma de elección). Puedes leer más sobre otras
posibles formas del esquema de axioma de comprensión (como la de la
teoría de conjuntos constructiva, que sólo utiliza cuantificadores
delimitados) <a href="https://ncatlab.org/nlab/show/axiom%2Bof%2Bseparation">en
nLab</a>.</p>
<details class="ejercicio">
<summary>
<p><em>Prueba que este esquema genera un número de axiomas numerable.</em></p>
</summary>
<p>El conjunto de axiomas que genera el esquema de axioma de comprensión es
equipotente al conjunto de fórmulas.</p>
<p>Sea \(A = \{\forall,\exists,\in,=,(,),\implies,\neg,x_1,x_2,\dots\}\). Es
claro que \(A\) es numerable. El conjunto de fórmulas es un subconjunto
de:</p>
\[\bigcup_{n \in \mathbb{N}} A^n\]
<p>Este conjunto es una unión numerable de conjuntos numerables (el
producto finito de numerables es numerable), por lo que es numerable.</p>
</details>
<details class="ejercicio">
<summary>
<p><em>Define la intersección y la diferencia. ¿Puedes definir la unión?</em></p>
</summary>
<ul>
<li>Si \(\mathcal{F}\) es un conjunto de conjuntos a los que queremos
hacer la intersección y \(A \in \mathcal{F}\):</li>
</ul>
<p>\(\bigcap \mathcal{F} = \{x \in A \;:\; \forall y (y \in \mathcal{F} \implies x \in y)\}\)</p>
<ul>
<li>
\[A-B = \{x \in A \;:\; x \notin B\}\]
</li>
<li>Aunque el predicado \(\exists y (y \in \mathcal{F} \wedge x \in y)\) es válido no podemos definir la unión porque no conocemos un conjunto más grande que los conjuntos que queremos unir.</li>
</ul>
</details>
<h4 id="par">Par</h4>
\[\forall a \forall b \exists z (a \in z \wedge b \in z)\]
<p>Este axioma justifica la expresión de conjuntos por enumeración: si \(a\)
y \(b\) son dos conjuntos también lo será \(\{a,b\}\) (y el axioma de
extensionalidad nos asegura además que esta expresión se refiere a un
único conjunto). Además, tomando \(a = b\) tenemos que si \(a\) es un
conjunto también lo será \(\{a,a\} = \{a\}\) (donde la igualdad se da por
el axioma de extensionalidad). Podemos además construir pares definiendo
\((a,b) = \{\{a\},\{a,b\}\}\).</p>
<p>El conjunto vacío es el único conjunto cuya existencia podíamos probar
hasta el momento: los axiomas de existencia, extensionalidad y
comprensión son consistentes con \(\forall y (y = \varnothing)\). Con el
axioma del par podemos formar una cantidad infinita de conjuntos:
\(\varnothing,\{\varnothing\}, \{\{\varnothing\}\},\dots\) aunque no
podemos justificar aún la existencia de ningún conjunto infinito (no
sabemos por ejemplo si
\(\{\varnothing,\{\varnothing\}, \{\{\varnothing\}\},\dots\}\) es un
conjunto).</p>
<details class="ejercicio">
<summary>
<p><em>Probar que</em> \((a,b) = (c,d) \iff a = c \wedge b = d\)</p>
</summary>
<p>Puedes leer la solución en <a href="https://en.wikipedia.org/wiki/Ordered_pair#Proving_that_definitions_satisfy_the_characteristic_property">Wikipedia</a>.</p>
<p>Con el axioma de unión podemos generalizar esta definición para definir
\((a_1,\dots,a_n)\) para cualquier \(n \in \mathbb{N}\).</p>
<p><strong>Extra</strong>: ¿Cómo puedes generalizarla para tuplas con una cantidad
infinita arbitraria de posiciones?</p>
</details>
<h4 id="unión">Unión</h4>
\[\forall \mathcal{F} \exists A \forall Y \forall x (x \in Y \wedge Y \in \mathcal{F} \implies x \in A)\]
<p>Como vimos en la sección del esquema de axioma de comprensión no podemos
definir la unión a partir de un predicado ya que necesitaríamos de la
existencia del conjunto universal.</p>
<p>Para solucionarlo introducimos entonces el <strong>axioma de unión</strong>: dada
cualquier colección de conjuntos \(\mathcal{F} = \{A_{\lambda}\}\_{\Lambda}\) existe un conjunto \(A\), que tiene todos los elementos de los \(A\_\lambda\) (es decir, si
\(x \in A\_\lambda\), entonces \(x \in A\)). Definimos a partir de este
conjunto la unión de una cantidad arbitaria de estos:</p>
\[\bigcup_{\lambda \in \Lambda} A_\lambda = \{ x \in A \;:\; \exists Y (x \in Y \wedge Y \in \mathcal{F})\}\]
<p>Obteniendo así justificación para las expresiones de la forma \(A \cup B\)
(basta tomar \(\mathcal{F} = \{A,B\}\))y uniones de una cantidad
arbitraria de conjuntos en general.</p>
<p>Utilizando el axioma de par y el axioma de unión podemos formar
conjuntos de cardinalidad finita arbitraria, pero no de cardinalidad
infinita.</p>
<h4 id="infinito">Infinito</h4>
<p>Para este axioma introducimos notación adicional para facilitar su
expresión: definimos \(S(x) = x \cup \{x\}\) (la función sucesor)<sup id="fnref:zfc-sucesor" role="doc-noteref"><a href="#fn:zfc-sucesor" class="footnote" rel="footnote">10</a></sup>.
Con esta notación el axioma queda:</p>
\[\exists X (\varnothing \in X \wedge \forall y (y \in X \implies S(y) \in X))\]
<p>Con lo que tenemos nuestro primer conjunto infinito. Podemos demostrar
que \(X\) <a href="https://en.wikipedia.org/wiki/Axiom_of_infinity#Extracting_the_natural_numbers_from_the_infinite_set">tiene un
subconjunto</a>
\(\mathbb{N} \subseteq X\) que verifica los axiomas de Peano, tomando
\(0 = \varnothing\) y \(S\) la función sucesor.</p>
<p>En sus orígenes este axioma fue
<a href="https://en.wikipedia.org/wiki/Controversy_over_Cantor's_theory">controvertido</a>
ya que no era considerado una verdad evidente. Aceptar los axiomas de
<a href="http://cantorsattic.info/Cantor's_Attic">grandes cardinales</a> para
nosotros es como aceptar el axioma de infinito para los
<a href="https://ncatlab.org/nlab/show/finite%2Bmathematics%20">finitistas</a>.</p>
<h4 id="potencia">Potencia</h4>
<p>Como hemos hecho en anteriores axiomas definimos nueva notación para
simplificar la expresión de los axiomas. En este caso definimos
\(x \subseteq y := \forall z (z \in x \implies z \in y)\). El axioma
queda:</p>
\[\forall x \exists y \forall z (z \subseteq x \implies z \in y)\]
<p>Este axioma afirma la existencia, para cada conjunto \(x\) de un conjunto
\(y\) que habitualmente llamamos <em>conjunto potencia</em> notado
\(\mathcal{P}(x)\) que es el <strong>conjunto de todos los subconjuntos</strong> de
\(x\). Este axioma nos permite crear conjuntos de cardinalidad
arbitrariamente grande (ya que por el teorema de Cantor,
\(|A| < |\mathcal{P}(A)|\)) <sup id="fnref:zfc-pst" role="doc-noteref"><a href="#fn:zfc-pst" class="footnote" rel="footnote">11</a></sup>.</p>
<details class="ejercicio">
<summary>
<p><em>Define \(A \times B\)</em></p>
</summary>
<p>Queremos un conjunto que tenga todas las parejas \((a,b) = \{\{a\},\{a,b\}\}\)
con \(a \in A\), \(b \in B\).</p>
<p>Es claro que
\(\{a\}, \{a,b\} \in \mathcal{P}(A \cup B)\). Por tanto:</p>
\[A \times B = \{x \in \mathcal{P}(\mathcal{P}(A \cup B)) \;:\; x = (a,b), a \in A, b \in B\}\]
<p>También podemos hacerlo con el esquema de axioma de reemplazamiento y el
axioma del par.</p>
<p><strong>Extra:</strong> ¿Cómo podemos definir un producto cartesiano de una cantidad
arbitaria de conjuntos?</p>
</details>
<h4 id="reemplazamiento">Reemplazamiento</h4>
<p><em>Si</em> \(\varphi(x,y)\) <em>es una fórmula en la que</em> \(w\) <em>no es una variable
libre,</em> \(z\) <em>es un conjunto y se tiene</em>
\(\forall x \; x \in z \implies \exists ! y \; \varphi(x,y)\) <em>se
verifica</em>:</p>
\[\exists w \; \forall x (x \in z \implies \exists y (y \in w \wedge \varphi(x,y)))\]
<p>La teoría original de Zermelo no incluía este esquema de axioma, que fue
incluido por Fraenkel para justificar la existencia de conjuntos como
\(\{\mathbb{N}, \mathcal{P}(\mathbb{N}), \mathcal{P}(\mathcal{P}(\mathbb{N})),\dots\}\),
útiles en la teoría de los ordinales<sup id="fnref:zfc-borel" role="doc-noteref"><a href="#fn:zfc-borel" class="footnote" rel="footnote">12</a></sup>. Este esquema de axioma
implica el esquema de axioma de comprensión y el axioma del par. Es poco
utilizado: la mayor parte de las matemáticas pueden construirse sin
utilizar este axioma. La idea del axioma es que la única cualidad que
define si una colección es o no un conjunto es su tamaño.</p>
<p>Este axioma necesita el concepto de <strong>predicado funcional</strong>: una fórmula
\(\varphi(x,y)\) que asocia a cada \(x\) un único \(y\). De esta forma el
axioma nos permite <em>reemplazar</em> los \(x\) por su correspondiente \(y\). Esto
justifica la notación ocasionalmente utilizada
\(\{F(x) \; : \; x \in A\}\)</p>
<p>Cabe destacar que las funciones <strong>no</strong> son predicados funcionales: los
predicados son numerables mientras que las funciones no lo son. De la
misma forma los predicados funcionales <strong>no</strong> son funciones:
\(\varphi(x,y) := y = \mathcal{P}(x)\) no puede expresarse como función en
ZFC.</p>
<details class="ejercicio">
<summary>
<p><em>Prueba que reemplazamiento implica comprensión</em></p>
</summary>
<p>Puedes encontrar la respuesta en <a href="https://math.stackexchange.com/questions/32483">Math
StackExchange</a>.</p>
</details>
<details class="ejercicio">
<summary>
<p><em>¿Existe el conjunto de todos los espacios topológicos?</em></p>
</summary>
<p>Supongamos que exista el
conjunto de todos los espacios topológicos. Definimos el predicado
funcional \(F((X,\tau_T)) = X\).</p>
<p>Como todo conjunto es un espacio topológico con la topología trivial
tenemos que: \(\{X \;:\; (X,\tau) \in T\} = U\), el conjunto universal,
que como ya probamos no existe. Por tanto <strong>no</strong>, no existe el conjunto
de todos los espacios topológicos.</p>
<p>Demostraciones similares pueden utilizarse para probar que no existe el
conjunto de todos lo grupos o el conjunto de todas las categorías.</p>
</details>
<h4 id="elección">Elección</h4>
<p>La introducción del axioma de infinito presenta un problema ya que no
todas las propiedades que podríamos deducir del resto de axiomas sobre
cualquier conjunto finito pueden generalizarse a los conjuntos
infinitos. Es el caso del <strong>axioma de elección</strong>. Para simplificar su
exposición asumimos bien definido el concepto de función.</p>
\[\forall \mathcal{F} \left[ \emptyset \notin \mathcal{F} \implies \exists f : \mathcal{F} \to \bigcup \mathcal{F} \quad \forall A (A \in \mathcal{F} \implies f(A) \in A)\right]\]
<p>Es decir: Dada una familia de conjuntos no vacios \(\mathcal{F}\) podemos
elegir un conjunto de cada uno de ellos. Equivalentemente, el producto
cartesiano de una familia de conjuntos no vacíos es no vacío.</p>
<p>El axioma de elección es controvertido para los matemáticos
<a href="https://en.wikipedia.org/wiki/Constructivism_(mathematics)">constructivistas</a>
porque permite demostrar la existencia de ciertos objetos sin dar una
construcción explícita de los mismos. Además permite demostrar
resultados chocantes como la <a href="https://en.wikipedia.org/wiki/Banach%E2%80%93Tarski_paradox">paradoja de
Banach-Tarski</a>.
No obstante es un axioma esencial para la justificación de muchas
propiedades matemáticas básicas. <a href="https://en.wikipedia.org/wiki/Axiom_of_choice#Equivalents">Son
equivalentes</a>
al axioma de elección:</p>
<ul>
<li>Toda función sobreyectiva tiene inversa por la derecha</li>
<li>Todo espacio vectorial tiene una base</li>
<li>El producto de espacios topológicos compactos es compacto</li>
</ul>
<p>También <a href="https://en.wikipedia.org/wiki/Axiom_of_choice#Results_requiring_AC_.28or_weaker_forms.29_but_weaker_than_it">es
necesario</a>
para la demostración de algunos teoremas básicos (aunque no es
equivalente a estos):</p>
<ul>
<li>La unión de una cantidad numerable de conjuntos numerables es
numerable</li>
<li>Existe un conjunto que no es medible Lebesgue</li>
<li>Si \(A\) es infinito existe una aplicación inyectiva
\(f:\mathbb{N} \to A\)</li>
</ul>
<h4 id="fundación">Fundación</h4>
\[\forall x [x \neq \varnothing \implies \exists y (y \in x \wedge x \cap y = \varnothing)]\]
<blockquote>
<p>The Axiom of Foundation is, as always in mathematics, totally
irrelevant - Kunen (1980)</p>
</blockquote>
<p>El axioma de fundación es un axioma poco utilizado que elimina conjuntos
de la forma \(x = \{x\}\) o secuencias infinitas de la forma
\(\dots \in x_3 \in x_2 \in x_1\). La mayor parte de las matemáticas
pueden construirse sin utilizar este axioma, que nos sirve para excluir
estos casos patológicos. Es el segundo de los axiomas introducidos por
Fraenkel.</p>
<h3 id="lecturas-adicionales">Lecturas adicionales</h3>
<p>Algunos textos clásicos sobre el tema y páginas en las que puedes leer
más sobre el tema son:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Set_Theory:_An_Introduction_to_Independence_Proofs">Set Theory: An Introduction to Independence
Proofs</a> -
Kenneth Kunen</li>
<li><a href="https://www.math.wisc.edu/~miller/old/m771-10/kunen770.pdf">Foundations of
Mathematics</a> -
Kenneth Kunen</li>
<li><a href="https://en.wikipedia.org/wiki/Zermelo%E2%80%93Fraenkel_set_theory">Zermelo-Fraenkel set
theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Von_Neumann%E2%80%93Bernays%E2%80%93G%C3%B6del_set_theory">Von Neumann–Bernays–Gödel set
theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Naive_Set_Theory_(book)">Naive Set
Theory</a> -
Halmos</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:zfc-alternativas" role="doc-endnote">
<p>Algunos ejemplos de teorías fundacionales alternativas son las
<a href="https://ncatlab.org/nlab/show/structural+set+theory">teorías de conjuntos
estructurales</a>,
las <a href="https://en.wikipedia.org/wiki/Homotopy_type_theory">teorías de
tipos</a> o la
<a href="https://ncatlab.org/nlab/show/ETCC">teoría de categorías</a>. La
equivalencia entre estas tres teorías fundacionales se expone en
<strong><a href="https://www.andrew.cmu.edu/user/awodey/preprints/stcsFinal.pdf">From Sets to Types to Categories to
Sets</a></strong> <a href="#fnref:zfc-alternativas" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-cuervos" role="doc-endnote">
<p>Un <a href="https://en.wikipedia.org/wiki/Raven_paradox">ejemplo clásico de paradoja</a> en la filosofía de la ciencia. <a href="#fnref:zfc-cuervos" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-dominio" role="doc-endnote">
<p>Uno puede preguntarse a qué se refieren las \(x\) en \(\forall x\).
Después de todo, como veremos en la sección de los axiomas ¡el
dominio de discurso estándar de la teoría de conjuntos no puede
verse como un conjunto! Existen diferentes formas de tratar con este
problema: podemos adoptar una <a href="http://math.stackexchange.com/a/121131/135164">postura
formalista</a> y ver la
lógica como unas <em>reglas de manipulación de símbolos</em> o utilizar
<a href="https://plato.stanford.edu/entries/plural-quant/#SetThe">cuantificación
plural</a>
(ver también <a href="http://math.stackexchange.com/a/1087050/135164">esta pregunta de
SE</a>). Nótese que (si
expresamos ZFC en lógica de primer orden) <a href="https://en.wikipedia.org/wiki/L%C3%B6wenheim%E2%80%93Skolem_theorem">sí existen modelos de
ZFC</a>
que pueden expresarse en ZFC, pero estos no son el modelo estándar. <a href="#fnref:zfc-dominio" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-casi" role="doc-endnote">
<p>Bueno, <em>casi</em> exclusivamente, también necesitamos clases y
conglomerados como veremos a continuación. <a href="#fnref:zfc-casi" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-nats" role="doc-endnote">
<p>No son la única definición posible: podríamos utilizar
\(\varnothing,\{\varnothing\},\{\{\varnothing\}\},\dots\) (esta es la definición que adoptó Zermelo). Sin embargo
con la definición dada en este post tenemos algunas propiedades
interesantes: por ejemplo \(a < b \iff a \in b\) lo que nos permite un tratamiento
más sencillo de la teoría de los ordinales. La <a href="https://ncatlab.org/nlab/show/structural+set+theory">teoría estructural de conjuntos</a> no distingue entre las distintas posibles construcciones de los números naturales u otros objetos sino que los define según sus propiedades. <a href="#fnref:zfc-nats" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-funcion" role="doc-endnote">
<p>Nótese que si cualquier gráfica es una función estamos considerando la <a href="https://en.wikipedia.org/wiki/Empty_function">función vacía</a>, que algunos autores excluyen. <a href="#fnref:zfc-funcion" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-vacio" role="doc-endnote">
<p>Incluso no asumiendo un dominio de discurso no vacío el axioma de
infinito también nos indica que existe un conjunto pero para reducir
la complejidad de la exposición de ZFC es interesante añadir este
axioma. <a href="#fnref:zfc-vacio" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-segundo" role="doc-endnote">
<p>Si expresáramos ZFC en lógica de segundo orden los esquemas de
axioma incluidos podrían simplemente expresarse como axiomas
añadiendo un cuantificador sobre el predicado correspondiente.
La demostración de que ZF(C) no es finitamente axiomatizable puede
encontrarse en <em>Kunen (1980) página 138</em>. Sin embargo <a href="https://en.wikipedia.org/wiki/Von_Neumann%E2%80%93Bernays%E2%80%93G%C3%B6del_set_theory">NBG</a>
<strong>sí</strong> es finitamente axiomatizable y es una extensión conservativa
de ZFC (es decir, todo teorema en ZFC es teorema en NBG). <a href="#fnref:zfc-segundo" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-enumerable" role="doc-endnote">
<p>Es decir, el lenguaje de los axiomas debe ser <a href="https://en.wikipedia.org/wiki/Recursively_enumerable_language">recursivamente
enumerable</a>.
Esto nos permite verificar que una prueba es correcta en una
cantidad finita de tiempo y nos impide tener como axiomas todos los
teoremas. <a href="#fnref:zfc-enumerable" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-sucesor" role="doc-endnote">
<p>\(S\) no es una función si no la restringimos a algún dominio, sino
simplemente notación: su dominio y codominio deberían ser el
conjunto universal que no existe. <a href="#fnref:zfc-sucesor" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-pst" role="doc-endnote">
<p>Algunos autores defienden que no necesitamos conjuntos de
cardinalidad arbitrariamente grande ya que la mayor parte de las
matemáticas suceden en conjuntos numerables o equipotentes a los
números reales. La <a href="https://en.wikipedia.org/wiki/Pocket_set_theory"><em>teoría de conjuntos de
bolsillo</em></a> propone
una alternativa en la que sólo existen conjuntos infinitos de estas
dos cardinalidades. <a href="#fnref:zfc-pst" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:zfc-borel" role="doc-endnote">
<p>Además es necesario para demostrar el <a href="https://en.wikipedia.org/wiki/Borel_determinacy_theorem">teorema de determinación
de Borel</a>. <a href="#fnref:zfc-borel" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Filosofía de la ciencia2016-09-18T00:00:00+00:00https://codual.github.io/2016/09/18/filosofia-de-la-ciencia
<p>Esta lista reúne lecturas sobre filosofía de la ciencia. He resaltado en negrita aquellas lecturas que me parecen más interesantes o relevantes. Los libros están marcados con :books: y las cosas que aún no he leído están marcadas con :hourglass_flowing_sand:.</p>
<p>Algunos papers y libros no tienen enlace. Tengo una copia de casi todos así que puedes pedírmela y si no puedes usar SciHub, Libgen o BookZZ. Si crees que hay algún paper o libro que me vaya a interesar ponlo en los comentarios o dímelo <a href="//telegram.me/mx_psi">por Telegram</a>. Iré actualizando esta lista con nuevas lecturas.</p>
<h2 id="introducciones-generales">Introducciones generales</h2>
<p>Algunas introducciones generales a la filosofía de la ciencia son:</p>
<ul>
<li>:books: <a href="//pages.wustl.edu/files/pages/imce/cfcraver/struct_scientif_theories_0.pdf"><strong>Blackwell Guide To Philosophy of Science</strong></a>. Los capítulos 1 y 2 presentan una introducción general de la historia de la filosofía de la ciencia del siglo XX y sus problemas y posturas clásicas. También tiene discusiones sobre otros temas más específicos como las teorías cuánticas, la evolución, la biología molecular o las ciencias cognitivas.</li>
<li>:books: <strong>An Introduction to The Philosophy of Physics</strong> Introducción al tratamiento de los problemas referentes a la inducción, las magnitudes físicas, el determinismo y la causalidad. Pueden leerse algunos capítulos (sobre los términos téoricos) en <a href="//www.marxists.org/reference/subject/philosophy/works/ge/carnap.htm">marxists.org</a>. Una discusión más extensa sobre el tema de estos capítulos puede leerse <a href="http://plato.stanford.edu/entries/theoretical-terms-science/#4">aquí</a> y <a href="http://plato.stanford.edu/entries/science-theory-observation">aquí</a>.</li>
<li>:books::hourglass_flowing_sand: <a href="//www.goodreads.com/book/show/1129675">The Routledge Companion to Philosophy of Science</a></li>
<li>:books::hourglass_flowing_sand: <a href="https://web.archive.org/web/20170328215436/http://kpfu.ru/docs/F991545867/seminar.pdf">The Routledge Companion to Epistemology</a></li>
<li>:books::hourglass_flowing_sand: Aspects of Scientific Explanation and Other Essays in the Philosophy of Science</li>
</ul>
<h2 id="teoría-de-la-confirmación">Teoría de la confirmación</h2>
<p>La teoría de la confirmación consiste en desarrollar un marco teórico para indicar cuándo cierta evidencia nos da información sobre la probabilidad de una cierta hipótesis.</p>
<ul>
<li><a href="http://patrick.maher1.net/preprints/ctk.pdf"><strong>Confirmation Theory</strong></a> Discute de forma general varios problemas de la teoría de la confirmación, entre ellos: el grado de confirmacion, la probabilidad inductiva y algunos problemas clásicos y objeciones a la condicion de Nicod, paradoja de los cuervos, y el <em>grue</em>.</li>
<li>:hourglass: <a href="https://philpapers.org/rec/NORCTB">Challenges to Bayesian Confirmation Theory</a></li>
</ul>
<h3 id="el-problema-de-la-inducción">El problema de la inducción</h3>
<p>El <a href="http://plato.stanford.edu/entries/induction-problem">problema de la inducción</a> consiste en hallar una justificación <em>a priori</em>
de la racionalidad de las inferencias inductivas (i.e. aquellas que van de los casos específicos a lo general). El intento de justificación más importante fue el realizado por Donald Cary Williams en su libro <em>The Ground of Induction</em>:</p>
<ul>
<li><a href="http://plato.stanford.edu/entries/williams-dc/#GroInd"><strong>The Ground of Induction</strong></a>. Discusión sobre el libro en la enciclopedia de la filosofía de Stanford.</li>
<li><a href="http://plato.stanford.edu/entries/induction-problem/#DemArgShoSouInd">A demonstrative argument to show the soundness of induction</a>. Otra discusión de la misma enciclopedia.</li>
</ul>
<p>Algunos de los argumentos contra esta justificación y contraargumentos a estos pueden leerse en:</p>
<ul>
<li><a href="http://plato.stanford.edu/entries/williams-dc/#ObjWilProSolProInd">Objections to Williams’ proposed solution to the problem of induction</a>. Lista de objeciones propuestas.</li>
<li><a href="http://web.maths.unsw.edu.au/~jim/randomness.pdf"><strong>Randomness and the Justification of Induction</strong></a> Una discusión sobre la <em>randomness reply</em> con contraargumentos.</li>
<li><em>The Hole in the Ground of Induction</em> y <em>Fixing the hole in the Ground of Induction</em> discuten las probabilidades a priori.</li>
</ul>
<h3 id="lógica-inductiva">Lógica inductiva</h3>
<p>La <strong>lógica inductiva</strong> es uno de los grandes proyectos de algunos empiristas como Carnap o Maher. Consiste en la creación de una teoría que permita asignar una probabilidad a una hipótesis dada una cierta evidencia. Algunos artículos y libros que explican qué es y los avances realizados son:</p>
<ul>
<li><a href="https://sci-hub.st/10.2307/2102817"><strong>The Two Concepts of Probability</strong></a></li>
<li>:books: <a href="http://patrick.maher1.net/preprints/pop.pdf"><strong>What is Probability?</strong></a>. Libro inacabado sobre los distintos conceptos de probabilidad y su evolución</li>
<li><a href="http://plato.stanford.edu/entries/logic-inductive">Inductive Logic</a> y <a href="http://plato.stanford.edu/entries/confirmation">Confirmation</a> para una discusión más extensa sobre el concepto.</li>
</ul>
<h4 id="probabilidad-a-priori">Probabilidad a priori</h4>
<p>Si queremos actualizar la probabilidad de una proposición a la luz de nueva evidencia nos basta aplicar el teorema de Bayes pero, ¿qué probabilidad tiene una proposición cuando no tenemos ninguna evidencia? La idea más sencilla es aplicar el <a href="//en.wikipedia.org/wiki/Principle_of_indifference">principio de indiferencia</a>, pero este rápidamente nos lleva a <a href="//en.wikipedia.org/wiki/Principle_of_indifference#Application_to_continuous_variables">algunos problemas</a>. Para solucionarlo se propone el <a href="http://bayes.wustl.edu/etj/articles/well.pdf">principio de transformación de grupos de Jaynes</a>. Algunas discusiones sobre este tema pueden encontrarse en:</p>
<ul>
<li>:books::hourglass_flowing_sand: Philosophical Theories of Probability</li>
<li>:books::hourglass_flowing_sand: <a href="//sci-hub.tw/10.1093/bjps/48.1.126">Scientific Reasoning: The Bayesian Approach</a></li>
<li><em>The Hole in the Ground of Induction</em> y <em>Fixing the hole in the Ground of Induction</em> discuten una objeción a la justificación de la inducción mencionada antes relacionada con las probabilidades <em>a priori</em>.</li>
</ul>
<p>Otra opción sería hacer una teoría subjetiva. La posibilidad de una cierta objetividad podría aún mantenerse si existiera convergencia. Contra esto se estudia la <a href="//www.cs.cmu.edu/~kkchang/paper/JernChangKemp.2009.NIPS.BayesianBeliefPolarization.pdf">polarización de creencias bayesianas</a>: ejemplos en los que dos personas con posturas contrarias tienden a reforzar éstas a la luz de la misma evidencia.</p>
<h2 id="medidas-y-conceptos">Medidas y conceptos</h2>
<p>¿Cómo definimos qué es un metro, un grado Celsius o un kilogramo? ¿Cómo se relaciona el concepto de un electrón con las observaciones que realizamos?</p>
<ul>
<li>:books::hourglass_flowing_sand: <a href="//www.goodreads.com/book/show/3175205-inventing-temperature">Inventing Temperature</a>, sobre cómo definir la temperatura.</li>
<li>:books::hourglass_flowing_sand: Fundamentals of Concept Formation in Empirical Science. Un libro clásico de Hempel sobre este tema.</li>
<li>:books: <strong>An Introduction to The Philosophy of Physics</strong> (mencionado al principio) trata la relación teoría-observación y la definición de magnitudes.</li>
</ul>
<h2 id="empirismo-lógico">Empirismo lógico</h2>
<p>El empirismo lógico es una postura en la filosofía de la ciencia que apoya el verificacionismo, el fenomenalismo y el operacionalismo. Es una forma de empirismo radical que tenía el objetivo resolver el problema de demarcación de la ciencia e integrar la lógica y las matemáticas.</p>
<p>Un análisis general sobre las ideas del positivismo lógico/empirismo lógico/neopositivismo, pueden verse en:</p>
<ul>
<li><a href="http://plato.stanford.edu/entries/logical-empiricism/#Iss">Logical Empiricism</a></li>
<li><a href="http://plato.stanford.edu/entries/vienna-circle/#SelDocTheCri">Vienna Circle</a></li>
<li>:books: <a href="//archive.org/details/AlfredAyer">Lenguaje, Verdad y Lógica</a>. Un tono autoritario y con pocos matices pero una buena introducción a algunos de los principios del positivismo lógico.</li>
<li>La Universidad de Pittsburgh consta con <a href="https://digital.library.pitt.edu/collection/rudolf-carnap-papers">un amplio archivo de escritos de Carnap</a>, uno de los autores más importantes de esta postura.</li>
</ul>
<p>Específicamente sobre el problema de <strong>demarcación de la ciencia</strong> es muy importante <a href="http://www.ditext.com/carnap/carnap.html"><strong>Empiricism, Ontology and Semantics</strong></a> (en español
<a href="http://biblioteca.cefyl.net/node/5263">aquí</a>). Es una introducción a la idea de los marcos lingüísticos de Carnap y la distinción entre preguntas internas y externas. Análisis del texto pueden encontrarse en SEP:</p>
<ul>
<li><a href="http://plato.stanford.edu/entries/ontological-commitment/#CarNeoCar"><strong>Sobre el <em>ontological commitment</em></strong></a></li>
<li><a href="http://plato.stanford.edu/entries/propositions/#intext">Sobre la distinción interna/externa</a></li>
<li><a href="http://digital.library.pitt.edu/u/ulsmanuscripts/pdf/31735061812875.pdf">My Views on Ontological Problems of Existence</a>. Un escrito posterior de Carnap sobre los problemas de existencia ontológicos</li>
</ul>
<p>El <strong>análisis lógico de las percepciones</strong> para la definición de los objetos que llevaban a cabo los empiristas lógicos y otros empiristas se conoce como <em>fenomenismo.</em> Algunos textos interesantes sobre el tema son:</p>
<ul>
<li><a href="http://plato.stanford.edu/entries/perception-episprob/#Phe">Epistemological Problems of Perception</a></li>
<li><a href="http://plato.stanford.edu/entries/logical-construction"><strong>Logical Constructions</strong></a></li>
</ul>
Qué he leído en el último año2016-09-06T00:00:00+00:00https://codual.github.io/2016/09/06/pocket
<noscript>
<div class="message">
Necesitas Javascript para poder ver correctamente este post.
</div>
</noscript>
<h2 id="los-datos">Los datos</h2>
<p>Uso <a href="https://getpocket.com">Pocket</a> para guardar los artículos y las páginas webs que encuentro en Twitter, Feedly o que me pasan y quiero leer o revisar más tarde. Desde el 27 de junio de 2015 he guardado automáticamente (usando <a href="https://ifttt.com">IFTTT</a>) en una hoja de cálculo todas las páginas que he guardado, su título y su URL. He intentado hacer un análisis de lo que he leído aquí.</p>
<p>En los 408 días<sup id="fnref:tiempo" role="doc-noteref"><a href="#fn:tiempo" class="footnote" rel="footnote">1</a></sup> hasta que descargué la lista he guardado un total de 2548 enlaces (unos 6 artículos al día). Este número puede estar un poco inflado: no leo todos los artículos que guardo, algunos links a otros links de Twitter y otros los descarto tras leer un poco porque no me parecen interesantes. Algunos artículos no se guardaron correctamente así que he tenido que eliminarlos. De los 2545 enlaces correctos pude acceder a 2347, no estando disponibles <strong>un 7.8%</strong>.</p>
<p>He guardado enlaces de un total de 970 dominios distintos (agrupando versiones móviles),
238 de estos más de una vez. Las páginas más guardadas han sido blogs que leo habitualmente (<a href="http://www.microsiervos.com">Microsiervos</a>, <a href="http://politikon.es">Politikon</a>, <a href="https://thesocietypages.org/socimages">Sociological Images</a>, <a href="https://digest.bps.org.uk">BPS Research Digest</a>), artículos de Wikipedia y preguntas de <a href="https://stackexchange.com">StackExchange</a><sup id="fnref:stackexchange" role="doc-noteref"><a href="#fn:stackexchange" class="footnote" rel="footnote">2</a></sup>. La diversidad de fuentes
es bastante grande por lo que estos sitios ocupan sólo el 30% del total. Es difícil
contar los agregadores de noticias como Hacker News, que probablemente también
aporten una parte importante de los enlaces.</p>
<div id="piechart" style="width: 800px; height: 550px;"></div>
<p>En el siguiente gráfico puede verse el número de artículos que guardé para leer
más tarde en cada semana del periodo estudiado. En <strong>rojo</strong> están los periodos
de exámenes, en <strong>verde</strong> las vacaciones y en <strong>gris</strong> el periodo lectivo.
El cambio más importante sucede en torno a mayo de 2016 ya que añadí
algunos de los feeds que lee gwern a Feedly.</p>
<div id="chart_div" style="width: 900px; height: 550px;"></div>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript" src="/js/pocket.js"></script>
<h2 id="recopilaciones">Recopilaciones</h2>
<p>Por último, algunas recopilaciones de los links que he leido
en distintas páginas o redes que pueden ser interesantes:</p>
<details>
<summary> Wikipedia</summary>
<ul style="ul columns: 2; -webkit-columns: 2; -moz-columns: 2;">
<li><a href="https://en.wikipedia.org/wiki/Benjamin_Kline_Hunnicutt">Benjamin Kline Hunnicutt</a></li>
<li><a href="https://en.wikipedia.org/wiki/International_waters">International waters</a></li>
<li><a href="https://en.wikipedia.org/wiki/Randomized_controlled_trial#section_8">Randomized controlled trial</a></li>
<li><a href="https://en.wikipedia.org/wiki/Optimal_decision">Optimal decision</a></li>
<li><a href="https://en.wikipedia.org/wiki/Expected_utility_hypothesis">Expected utility hypothesis</a></li>
<li><a href="https://en.wikipedia.org/wiki/Cox%27s_theorem">Cox's theorem</a></li>
<li><a href="https://en.wikipedia.org/wiki/Possibility_theory">Possibility theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Dempster%E2%80%93Shafer_theory">Dempster–Shafer theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Info-gap_decision_theory">Info-gap decision theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bayesian_probability_theory">Bayesian probability</a></li>
<li><a href="https://en.wikipedia.org/wiki/Fundamental_attribution_error">Fundamental attribution error</a></li>
<li><a href="https://en.wikipedia.org/wiki/Planning_fallacy">Planning fallacy</a></li>
<li><a href="https://en.wikipedia.org/wiki/Cognitive_bias_mitigation">Cognitive bias mitigation</a></li>
<li><a href="https://en.wikipedia.org/wiki/Data_dredging">Data dredging</a></li>
<li><a href="https://en.wikipedia.org/wiki/Pirah%C3%A3_language">Pirahã language</a></li>
<li><a href="https://en.wikipedia.org/wiki/Categorial_grammar">Categorial grammar</a></li>
<li><a href="https://en.wikipedia.org/wiki/Illusion_of_transparency">Illusion of transparency</a></li>
<li><a href="https://es.wikipedia.org/wiki/Rayos_N">Rayos N</a></li>
<li><a href="https://en.wikipedia.org/wiki/Donkey_sentence">Donkey sentence</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bambara_language">Bambara language</a></li>
<li><a href="https://en.wikipedia.org/wiki/Kripke_semantics">Kripke semantics</a></li>
<li><a href="https://en.wikipedia.org/wiki/Identity_of_indiscernibles">Identity of indiscernibles</a></li>
<li><a href="https://en.wikipedia.org/wiki/Ontology">Ontology</a></li>
<li><a href="https://en.wikipedia.org/wiki/Rule_of_three">Rule of three</a></li>
<li><a href="https://en.wikipedia.org/wiki/Computability_theory">Computability theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Primitive_recursive_function">Primitive recursive function</a></li>
<li><a href="https://en.wikipedia.org/wiki/Possible_world">Possible world</a></li>
<li><a href="https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)">Predicate (mathematical logic)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Singularity_Summit">Singularity Summit</a></li>
<li><a href="https://en.wikipedia.org/wiki/Copycat_(software)">Copycat (software)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Douglas_Hofstadter">Douglas Hofstadter</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bitrotten">Bit rot</a></li>
<li><a href="https://en.wikipedia.org/wiki/Prosody_(linguistics)">Prosody (linguistics)</a></li>
<li><a href="https://en.wikipedia.org/wiki/L%C3%ADngua_Geral">Língua Geral</a></li>
<li><a href="https://en.wikipedia.org/wiki/Nheengatu">Nheengatu language</a></li>
<li><a href="https://en.wikipedia.org/wiki/Evert_Willem_Beth">Evert Willem Beth</a></li>
<li><a href="https://en.wikipedia.org/wiki/Propositional_attitude">Propositional attitude</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Concept_of_Mind">The Concept of Mind</a></li>
<li><a href="https://en.wikipedia.org/wiki/Elbow_Room_(book)">Elbow Room (book)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Free_will">Free will</a></li>
<li><a href="https://es.wikipedia.org/wiki/%C3%8Dndice_de_desarrollo_humano">Índice de desarrollo humano</a></li>
<li><a href="https://en.wikipedia.org/wiki/Structural_functionalism">Structural functionalism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Gettier_problem">Gettier problem</a></li>
<li><a href="https://en.wikipedia.org/wiki/Newcomb%27s_paradox">Newcomb's paradox</a></li>
<li><a href="https://en.wikipedia.org/wiki/Randy_Gardner_(record_holder)">Randy Gardner (record holder)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Lists_of_unsolved_problems">Lists of unsolved problems</a></li>
<li><a href="https://en.wikipedia.org/wiki/Theory_of_justification">Theory of justification</a></li>
<li><a href="https://en.wikipedia.org/wiki/List_of_languages_by_type_of_grammatical_genders">List of languages by type of grammatical genders</a></li>
<li><a href="https://en.wikipedia.org/wiki/Women,_Fire,_and_Dangerous_Things">Women, Fire, and Dangerous Things</a></li>
<li><a href="https://en.wikipedia.org/wiki/Cognitive_linguistics">Cognitive linguistics</a></li>
<li><a href="https://en.wikipedia.org/wiki/Mindfulness-Based_Stress_Reduction">Mindfulness-based stress reduction</a></li>
<li><a href="https://en.wikipedia.org/wiki/Solomonoff%27s_theory_of_inductive_inference">Solomonoff's theory of inductive inference</a></li>
<li><a href="https://en.wikipedia.org/wiki/Von_Neumann%E2%80%93Bernays%E2%80%93G%C3%B6del_set_theory">Von Neumann–Bernays–Gödel set theory</a></li>
<li><a href="https://en.wikipedia.org/w/index.php?title=Axiom_of_Choice&redirect=no">Axiom of Choice</a></li>
<li><a href="https://en.wikipedia.org/wiki/Regression_toward_the_mean">Regression toward the mean</a></li>
<li><a href="https://en.wikipedia.org/wiki/Just-noticeable_difference#Marketing_applications_of_the_j.n.d">Just-noticeable difference</a></li>
<li><a href="https://en.wikipedia.org/wiki/Expected_utility_hypothesis">Expected utility hypothesis</a></li>
<li><a href="https://en.wikipedia.org/wiki/Nicolas_Bourbaki">Nicolas Bourbaki</a></li>
<li><a href="https://en.wikipedia.org/wiki/Reflexive_property_of_equality">Equality (mathematics)</a></li>
<li><a href="https://en.wikipedia.org/wiki/List_of_topics_in_logic">Outline of logic</a></li>
<li><a href="https://en.wikipedia.org/wiki/Outline_of_algebraic_structures">Outline of algebraic structures</a></li>
<li><a href="https://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein distance</a></li>
<li><a href="https://en.wikipedia.org/wiki/Von_Neumann%E2%80%93Bernays%E2%80%93G%C3%B6del_axioms">Von Neumann–Bernays–Gödel set theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Marginal_utility">Marginal utility</a></li>
<li><a href="https://en.wikipedia.org/wiki/Grothendieck_universe">Grothendieck universe</a></li>
<li><a href="https://en.wikipedia.org/wiki/Inaccessible_cardinal">Inaccessible cardinal</a></li>
<li><a href="https://en.wikipedia.org/wiki/Category_of_relations">Category of relations</a></li>
<li><a href="https://es.wikipedia.org/wiki/Cron_(Unix)">cron (Unix)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Predicate_functor_logic">Predicate functor logic</a></li>
<li><a href="https://en.wikipedia.org/wiki/Fundamental_group">Fundamental group</a></li>
<li><a href="https://en.wikipedia.org/wiki/Intuitionistic_type_theory">Intuitionistic type theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Homotopy_type_theory#cite_note-41">Homotopy type theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Intuitionistic_logic">Intuitionistic logic</a></li>
<li><a href="https://en.wikipedia.org/wiki/Sequent_calculus">Sequent calculus</a></li>
<li><a href="https://en.wikipedia.org/wiki/Natural_deduction">Natural deduction</a></li>
<li><a href="https://en.wikipedia.org/wiki/Temporal_logic">Temporal logic</a></li>
<li><a href="https://en.wikipedia.org/wiki/Linear_logic">Linear logic</a></li>
<li><a href="https://en.wikipedia.org/wiki/Hexspeak">Hexspeak</a></li>
<li><a href="https://en.wikipedia.org/wiki/Litotes">Litotes</a></li>
<li><a href="https://en.wikipedia.org/wiki/F-algebra">F-algebra</a></li>
<li><a href="https://en.wikipedia.org/wiki/Catamorphism">Catamorphism</a></li>
<li><a href="https://en.wikipedia.org/wiki/AVL_tree">AVL tree</a></li>
<li><a href="https://en.wikipedia.org/wiki/Binary_tree">Binary tree</a></li>
<li><a href="https://en.wikipedia.org/wiki/Functional_programming">Functional programming</a></li>
<li><a href="https://en.wikipedia.org/wiki/Declarative_programming">Declarative programming</a></li>
<li><a href="https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_inference">Hindley–Milner type system</a></li>
<li><a href="https://en.wikipedia.org/wiki/Entropy_(information_theory)">Entropy (information theory)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Catalan_number#cite_ref-1">Catalan number</a></li>
<li><a href="https://en.wikipedia.org/wiki/Extraversion_and_introversion">Extraversion and introversion</a></li>
<li><a href="https://en.wikipedia.org/wiki/Trotskyism">Trotskyism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Left_communism">Left communism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Xmonad">xmonad</a></li>
<li><a href="https://en.wikipedia.org/wiki/Meaning_of_life">Meaning of life</a></li>
<li><a href="https://en.wikipedia.org/wiki/Twin_Earth_thought_experiment">Twin Earth thought experiment</a></li>
<li><a href="https://en.wikipedia.org/wiki/Prison_abolition_movement">Prison abolition movement</a></li>
<li><a href="https://en.wikipedia.org/wiki/Prison_reform">Prison reform</a></li>
<li><a href="https://en.wikipedia.org/wiki/List_of_XYZZY_Awards_by_category">List of XYZZY Awards by category</a></li>
<li><a href="https://en.wikipedia.org/wiki/Free_love">Free love</a></li>
<li><a href="https://en.wikipedia.org/wiki/Denotational_semantics">Denotational semantics</a></li>
<li><a href="https://en.wikipedia.org/wiki/Natural_transformation">Natural transformation</a></li>
<li><a href="https://en.wikipedia.org/wiki/Categorical_logic">Categorical logic</a></li>
<li><a href="https://en.wikipedia.org/wiki/Death-qualified_jury">Death-qualified jury</a></li>
<li><a href="https://en.wikipedia.org/wiki/Voir_dire">Voir dire</a></li>
<li><a href="https://en.wikipedia.org/wiki/Concurrency_(computer_science)">Concurrency (computer science)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Parallel_Random_Access_Machine">Parallel random-access machine</a></li>
<li><a href="https://en.wikipedia.org/wiki/Petri_net">Petri net</a></li>
<li><a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes">Communicating sequential processes</a></li>
<li><a href="https://en.wikipedia.org/wiki/Universal_property">Universal property</a></li>
<li><a href="https://en.wikipedia.org/wiki/Description_logic">Description logic</a></li>
<li><a href="https://en.wikipedia.org/wiki/Comma_category">Comma category</a></li>
<li><a href="https://en.wikipedia.org/wiki/Equivalence_of_categories#Examples">Equivalence of categories</a></li>
<li><a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Pretty Good Privacy</a></li>
<li><a href="https://en.wikipedia.org/wiki/Berry_paradox">Berry paradox</a></li>
<li><a href="https://en.wikipedia.org/wiki/Hyperbolic_discounting">Hyperbolic discounting</a></li>
<li><a href="https://en.wikipedia.org/wiki/Long_Now_Foundation">Long Now Foundation</a></li>
<li><a href="https://en.wikipedia.org/wiki/Null_hypothesis">Null hypothesis</a></li>
<li><a href="https://en.wikipedia.org/wiki/List_of_social_bookmarking_websites">List of social bookmarking websites</a></li>
<li><a href="https://en.wikipedia.org/wiki/Statistical_significance">Statistical significance</a></li>
<li><a href="https://en.wikipedia.org/wiki/Data_anonymization">Data anonymization</a></li>
<li><a href="https://en.wikipedia.org/wiki/Single-subject_design">Single-subject design</a></li>
<li><a href="https://en.wikipedia.org/wiki/Phantom_of_Heilbronn">Phantom of Heilbronn</a></li>
<li><a href="https://en.wikipedia.org/wiki/Prior_probability">Prior probability</a></li>
<li><a href="https://en.wikipedia.org/wiki/Marriage_gap">Marriage gap</a></li>
<li><a href="https://en.wikipedia.org/wiki/Theories_of_poverty">Theories of poverty</a></li>
<li><a href="https://en.wikipedia.org/wiki/Math%E2%80%93verbal_achievement_gap">Math–verbal achievement gap</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bias_in_education">Bias in education</a></li>
<li><a href="https://en.wikipedia.org/wiki/Experimental_philosophy">Experimental philosophy</a></li>
<li><a href="https://en.wikipedia.org/wiki/Michael_Dummett">Michael Dummett</a></li>
<li><a href="https://en.wikipedia.org/wiki/Extensionality">Extensionality</a></li>
<li><a href="https://en.wikipedia.org/wiki/Symbolic_computation">Symbolic computation</a></li>
<li><a href="https://en.wikipedia.org/wiki/Minimax">Minimax</a></li>
<li><a href="https://en.wikipedia.org/wiki/Frobenius_theorem_%28real_division_algebras%29">Frobenius theorem (real division algebras)</a></li>
<li><a href="https://en.wikipedia.org/wiki/St._Petersburg_paradox">St. Petersburg paradox</a></li>
<li><a href="https://en.wikipedia.org/wiki/Category:Measures_(measure_theory)">Category:Measures (measure theory)</a></li>
<li><a href="https://en.wikipedia.org/wiki/MSI_protocol">MSI protocol</a></li>
<li><a href="https://en.wikipedia.org/wiki/MESI_protocol">MESI protocol</a></li>
<li><a href="https://en.wikipedia.org/wiki/Krohn-Rhodes_theory">Krohn–Rhodes theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Pocket_set_theory">Pocket set theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Descriptive_set_theory">Descriptive set theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Morse%E2%80%93Kelley_set_theory">Morse–Kelley set theory</a></li>
<li><a href="https://en.wikipedia.org/wiki/Virtual_economy">Virtual economy</a></li>
<li><a href="https://en.wikipedia.org/wiki/Standard_ML">Standard ML</a></li>
<li><a href="https://es.wikipedia.org/wiki/Fate/stay_night">Fate/stay night</a></li>
<li><a href="https://es.wikipedia.org/wiki/The_Boys_(c%C3%B3mic)">The Boys (cómic)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Effect_size">Effect size</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_MAGIC_criteria">MAGIC criteria</a></li>
<li><a href="https://en.wikipedia.org/wiki/Cohen's_d">Cohen's d</a></li>
<li><a href="https://en.wikipedia.org/wiki/Quality-adjusted_life_year#section_5">Quality-adjusted life year</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Daily_Stormer">The Daily Stormer</a></li>
<li><a href="https://en.wikipedia.org/wiki/McCollough_effect">McCollough effect</a></li>
<li><a href="https://en.wikipedia.org/wiki/Freenet">Freenet</a></li>
<li><a href="https://en.wikipedia.org/wiki/Small-world_network">Small-world network</a></li>
<li><a href="https://en.wikipedia.org/wiki/Dutch_Disease">Dutch disease</a></li>
<li><a href="https://en.wikipedia.org/wiki/Politics_of_Venezuela">Politics of Venezuela</a></li>
<li><a href="https://en.wikipedia.org/wiki/Compulsory_voting">Compulsory voting</a></li>
<li><a href="https://en.wikipedia.org/wiki/Tomasulo_algorithm">Tomasulo algorithm</a></li>
<li><a href="https://en.wikipedia.org/wiki/Big_Five_personality_traits">Big Five personality traits</a></li>
<li><a href="https://en.wikipedia.org/wiki/Inter_frame">Inter frame</a></li>
<li><a href="https://en.wikipedia.org/wiki/Missing_white_woman_syndrome">Missing white woman syndrome</a></li>
<li><a href="https://en.wikipedia.org/wiki/Neoliberalism">Neoliberalism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Refusal_of_work#Marxism">Refusal of work</a></li>
<li><a href="https://en.wikipedia.org/wiki/Random_variable">Random variable</a></li>
<li><a href="https://es.wikipedia.org/wiki/Ley_de_los_grandes_n%C3%BAmeros">Ley de los grandes números</a></li>
<li><a href="https://es.wikipedia.org/wiki/Esperanza_matematica">Esperanza matemática</a></li>
<li><a href="https://en.wikipedia.org/wiki/Esther_Perel">Esther Perel</a></li>
<li><a href="https://en.wikipedia.org/wiki/Socialist_calculation_debate">Socialist calculation debate</a></li>
<li><a href="https://en.wikipedia.org/wiki/Likert_scale">Likert scale</a></li>
<li><a href="https://en.wikipedia.org/wiki/Trotskyism">Trotskyism</a></li>
<li><a href="https://web.archive.org/web/20160419054458/https://en.wikipedia.org/wiki/Special:Courses">Courses</a></li>
<li><a href="https://en.wikipedia.org/wiki/Minimax">Minimax</a></li>
<li><a href="https://en.wikipedia.org/wiki/Effect_size">Effect size</a></li>
<li><a href="https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm">Floyd–Warshall algorithm</a></li>
<li><a href="https://en.wikipedia.org/wiki/Prison">Prison</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bellman_equation">Bellman equation</a></li>
<li><a href="https://en.wikipedia.org/wiki/Survey_methodology">Survey methodology</a></li>
<li><a href="https://en.wikipedia.org/wiki/Artificial_neural_network">Artificial neural network</a></li>
<li><a href="https://en.wikipedia.org/wiki/Normal_distribution">Normal distribution</a></li>
<li><a href="https://en.wikipedia.org/wiki/Confidence_interval">Confidence interval</a></li>
<li><a href="https://en.wikipedia.org/wiki/Regression_toward_the_mean">Regression toward the mean</a></li>
<li><a href="https://en.wikipedia.org/wiki/Generalized_function#Non-commutative_algebra_of_generalized_functions">Generalized function</a></li>
<li><a href="https://en.wikipedia.org/wiki/Distribution_(mathematics)#References">Distribution (mathematics)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Inductive_probability">Inductive probability</a></li>
<li><a href="https://en.wikipedia.org/wiki/Probabilistic_programming_language">Probabilistic programming language</a></li>
<li><a href="https://en.wikipedia.org/wiki/Solomonoff%27s_theory_of_inductive_inference">Ray Solomonoff's Theory of inductive inference</a></li>
<li><a href="https://en.wikipedia.org/wiki/Principle_of_indifference">Principle of indifference</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bayes'_theorem">Bayes' theorem</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bertrand%27s_paradox_(probability)">Bertrand paradox (probability)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Principle_of_transformation_groups">Principle of transformation groups</a></li>
<li><a href="https://en.wikipedia.org/wiki/Port_number">Port (computer networking)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Automated_theorem_proving">Automated theorem proving</a></li>
<li><a href="https://en.wikipedia.org/wiki/Nonviolent_resistance">Nonviolent resistance</a></li>
<li><a href="https://en.wikipedia.org/wiki/Bryan_Caplan#%22The_Ideological_Turing_Test%22">Ideological Turing Test</a></li>
<li><a href="https://en.wikipedia.org/wiki/Polysynthetic_language">Polysynthetic language</a></li>
<li><a href="https://en.wikipedia.org/wiki/Operation_Cherry_Blossoms_at_Night">Operation Cherry Blossoms at Night</a></li>
<li><a href="https://en.wikipedia.org/wiki/Behavioral_activation">Behavioral activation</a></li>
<li><a href="https://en.wikipedia.org/wiki/Glass_cliff">Glass cliff</a></li>
<li><a href="https://en.wikipedia.org/wiki/Homelessness">Homelessness</a></li>
<li><a href="https://en.wikipedia.org/wiki/Democratic_socialism">Democratic socialism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Criticism_of_capitalism">Criticism of capitalism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Socialist_economics#Karl_Marx_and_Das_Kapital">Socialist economics</a></li>
<li><a href="https://en.wikipedia.org/wiki/Economic_democracy">Economic democracy</a></li>
<li><a href="https://en.wikipedia.org/wiki/Workers%27_self-management">Workers' self-management</a></li>
<li><a href="https://en.wikipedia.org/wiki/Production_for_use">Production for use</a></li>
<li><a href="https://en.wikipedia.org/wiki/Economic_calculation_problem">Economic calculation problem</a></li>
<li><a href="https://en.wikipedia.org/wiki/Post-capitalism">Post-capitalism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Labour_theory_of_value">Labor theory of value</a></li>
<li><a href="https://en.wikipedia.org/wiki/State_capitalism">State capitalism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Steady_state_economy">Steady-state economy</a></li>
<li><a href="https://en.wikipedia.org/wiki/Anarcho-syndicalism">Anarcho-syndicalism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Anarchism">Anarchism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Anarchist_communism">Anarchist communism</a></li>
<li><a href="https://en.wikipedia.org/wiki/Decentralized_planning_(economics)">Decentralized planning (economics)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Theory_of_value_(economics)">Theory of value (economics)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Post-Keynesian_economics">Post-Keynesian economics</a></li>
<li><a href="https://en.wikipedia.org/wiki/Keynesian_economics">Keynesian economics</a></li>
<li><a href="https://en.wikipedia.org/wiki/Indicative_planning">Indicative planning</a></li>
<li><a href="https://en.wikipedia.org/wiki/Five-Year_Plan_(USSR)">Five-year plans for the national economy of the Soviet Union</a></li>
<li><a href="https://en.wikipedia.org/wiki/Mondragon_Corporation">Mondragon Corporation</a></li>
<li><a href="https://en.wikipedia.org/wiki/Dissolution_of_the_Soviet_Union">Dissolution of the Soviet Union</a></li>
</ul>
</details>
<details>
<summary> StackExchange</summary>
<ul style="ul columns: 2; -webkit-columns: 2; -moz-columns: 2;">
<li><a href="https://skeptics.stackexchange.com/questions/28211">Do homosexuals have a shorter life expectancy than heterosexuals?</a></li>
<li><a href="https://writers.stackexchange.com/questions/761">The "Rules" of Writing</a></li>
<li><a href="https://philosophy.stackexchange.com/questions/24795">To what extent are observations theory laden?</a></li>
<li><a href="https://skeptics.stackexchange.com/questions/28403">Does Electromagnetic Hypersensitivity (EHS) exist?</a></li>
<li><a href="https://math.stackexchange.com/questions/1354044">Can math be subjective?</a></li>
<li><a href="https://math.stackexchange.com/questions/1356095">Functions that are their own inversion.</a></li>
<li><a href="https://math.stackexchange.com/questions/1359562">Addition is to Integration as Multiplication is to ________</a></li>
<li><a href="https://rpg.stackexchange.com/questions/56252">What do I need to run a 5E campaign?</a></li>
<li><a href="https://rpg.stackexchange.com/questions/4457">What is role-playing, and where do I start?</a></li>
<li><a href="https://rpg.stackexchange.com/questions/11033">I'm at a loss with “Dungeons and Dragons.” How does one play it, anyway?</a></li>
<li><a href="https://worldbuilding.stackexchange.com/questions/6941">Using international waters to avoid legal punishment</a></li>
<li><a href="https://worldbuilding.stackexchange.com/questions/1353">Creating a realistic world map - Currents, Precipitation and Climate</a></li>
<li><a href="https://worldbuilding.stackexchange.com/questions/18051">Tomorrow is Groundhog Day… For everyone. How does society respond?</a></li>
<li><a href="https://skeptics.stackexchange.com/questions/28489">Does turning off cellular data when connected to WiFi extend a phone's battery life?</a></li>
<li><a href="https://worldbuilding.stackexchange.com/questions/12129">What would be the impact of a modern programmer and laptop being dropped into World War II, possibly breaking Enigma?</a></li>
<li><a href="https://worldbuilding.stackexchange.com/questions/316">Can you simply scale up animals?</a></li>
<li><a href="https://worldbuilding.stackexchange.com/questions/2">How can I break down the task of creating a world into manageable chunks?</a></li>
<li><a href="https://math.stackexchange.com/questions/1373728">What do sine, tan, cos actually mean?</a></li>
<li><a href="https://linguistics.stackexchange.com/questions/3484">What's the difference between syntax and grammar?</a></li>
<li><a href="https://math.stackexchange.com/questions/1392505">Mental Calculations</a></li>
<li><a href="https://math.stackexchange.com/questions/1399781">Why do we not have to prove definitions?</a></li>
<li><a href="https://math.stackexchange.com/questions/1416053">Why do both sine and cosine exist?</a></li>
<li><a href="https://math.stackexchange.com/questions/1412899">Is every axiom in the definition of a vector space necessary?</a></li>
<li><a href="https://meta.stackexchange.com/questions/7931">FAQ for sites</a></li>
<li><a href="https://skeptics.stackexchange.com/questions/28933">Does availability of birth control to adolescents lead to premarital sexual activity?</a></li>
<li><a href="https://math.stackexchange.com/questions/1424497">I roll a die repeatedly until I get 6, and then count the number of 3s I got. What's my expected number of 3s?</a></li>
<li><a href="https://math.stackexchange.com/questions/1428097">On average, how many friends would I need to have to have at least one friend's birthday every day?</a></li>
<li><a href="https://math.stackexchange.com/questions/1452425">What is the definition of a set?</a></li>
<li><a href="https://math.stackexchange.com/questions/1452844">What are some things we can prove they must exist, but have no idea what they are?</a></li>
<li><a href="https://math.stackexchange.com/questions/121128">When does the set enter set theory?</a></li>
<li><a href="https://tex.stackexchange.com/questions/263101">TeX</a></li>
<li><a href="https://tex.stackexchange.com/questions/1559">Adding a large brace next to a body of text - TeX</a></li>
<li><a href="https://math.stackexchange.com/questions/268726">Are there real-life relations which are symmetric and reflexive but not transitive?</a></li>
<li><a href="https://math.stackexchange.com/questions/402934">Why do we believe the Church-Turing Thesis?</a></li>
<li><a href="https://academia.stackexchange.com/questions/2219">How should I deal with discouragement as a graduate student?</a></li>
<li><a href="https://academia.stackexchange.com/questions/51631">How to ask dumb questions</a></li>
<li><a href="https://academia.stackexchange.com/questions/39017">Should I quit my PhD - workload, self-esteem and social life</a></li>
<li><a href="https://academia.stackexchange.com/questions/11765">"I've somehow convinced everyone that I'm actually good at this" - how to effectively deal with Imposter Syndrome</a></li>
<li><a href="https://academia.stackexchange.com/questions/11149">What are the potential pitfalls of having a PhD?</a></li>
<li><a href="https://math.stackexchange.com/questions/1505354">Can I think of Algebra like this?</a></li>
<li><a href="https://math.stackexchange.com/questions/286077">Implies vs. Entails vs. Provable</a></li>
<li><a href="https://skeptics.stackexchange.com/questions/30803">Did this Twitter bot predict the Paris shootings 2 days before they happened?</a></li>
<li><a href="https://math.stackexchange.com/questions/1342425">If a set is closed and open, then it is either the total or the empty set.</a></li>
<li><a href="https://matheducators.stackexchange.com/questions/10055">How to use false theorems or proofs?</a></li>
<li><a href="https://math.stackexchange.com/questions/1550414">Why are we justified in using the real numbers to do geometry?</a></li>
<li><a href="https://skeptics.stackexchange.com/questions/31045">Do predators assault women in female toilets pretending to be transgender?</a></li>
<li><a href="https://math.stackexchange.com/questions/108268">How can I find a homeomorphism from R^n to the open unit ball centered at 0?</a></li>
<li><a href="https://math.stackexchange.com/questions/1587040">Past open problems with sudden and easy-to-understand solutions</a></li>
<li><a href="https://german.stackexchange.com/questions/9526">Resources for learning German</a></li>
<li><a href="https://math.stackexchange.com/questions/668">What's an intuitive way to think about the determinant?</a></li>
<li><a href="https://math.stackexchange.com/questions/485822">Why is compactness so important?</a></li>
<li><a href="https://math.stackexchange.com/questions/1696686">Is linear algebra laying the foundation for something important?</a></li>
<li><a href="https://math.stackexchange.com/questions/3">List of interesting math podcasts?</a></li>
<li><a href="https://security.stackexchange.com/questions/29851">How many OpenPGP keys should I make?</a></li>
<li><a href="https://security.stackexchange.com/questions/31594">What is a good general purpose GnuPG key setup?</a></li>
<li><a href="https://security.stackexchange.com/questions/406">How should I distribute my public key?</a></li>
<li><a href="https://tex.stackexchange.com/questions/10284">Multiple Files input to one pgfplotstable - TeX</a></li>
<li><a href="https://skeptics.stackexchange.com/questions/1700">Do bigger or more monitors increase productivity?</a></li>
<li><a href="https://security.stackexchange.com/questions/101560">How to securely send private keys</a></li>
<li><a href="https://stats.stackexchange.com/questions/20836">Algorithms for automatic model selection</a></li>
<li><a href="https://stats.stackexchange.com/questions/31">What is the meaning of p values and t values in statistical tests?</a></li>
<li><a href="https://stats.stackexchange.com/questions/13314">Is R^2 useful or dangerous?</a></li>
<li><a href="https://security.stackexchange.com/questions/6141">Amount of simple operations that is safely out of reach for all humanity?</a></li>
<li><a href="https://math.stackexchange.com/questions/1769475">How to debug math?</a></li>
<li><a href="https://math.stackexchange.com/questions/1762001">Why do we classify infinities in so many symbols and ideas?</a></li>
<li><a href="https://math.stackexchange.com/questions/849179">Ways to study mathematics while commuting</a></li>
<li><a href="https://cstheory.stackexchange.com/questions/34398">Real computers have only a finite number of states, so what is the relevance of Turing machines to real computers?</a></li>
<li><a href="https://cstheory.stackexchange.com/questions/3650">Historical reasons for adoption of Turing Machine as primary model of computation.</a></li>
<li><a href="https://cstheory.stackexchange.com/questions/14811">What is the enlightenment I'm supposed to attain after studying finite automata?</a></li>
<li><a href="https://math.stackexchange.com/questions/1776194">Why do people accept the axiom of choice given the well ordering principle?</a></li>
<li><a href="https://security.stackexchange.com/questions/5126">What's the difference between SSL, TLS, and HTTPS?</a></li>
<li><a href="https://academia.stackexchange.com/questions/63366">Literature search methodology for non-academics?</a></li>
<li><a href="https://academia.stackexchange.com/questions/13594">How can I improve the effectiveness of my literature searches?</a></li>
<li><a href="https://academia.stackexchange.com/questions/14011">Selecting the relevant papers for a survey paper I have to write?</a></li>
<li><a href="https://math.stackexchange.com/questions/1781769">Is formal truth in mathematical logic a generalization of everyday, intuitive truth?</a></li>
<li><a href="https://security.stackexchange.com/questions/123234">How can I explain to non-techie friends that "cryptography is good"?</a></li>
<li><a href="https://math.stackexchange.com/questions/1795583">What is a topological space good for?</a></li>
<li><a href="https://math.stackexchange.com/questions/1789980">Do the axioms of set theory actually define the notion of a set?</a></li>
<li><a href="https://emacs.stackexchange.com/questions/281">How do I get a fancier mode line that uses solid colors and triangles?</a></li>
<li><a href="https://math.stackexchange.com/questions/1801970">Meaning of the word "axiom"</a></li>
<li><a href="https://security.stackexchange.com/questions/126188">Closed source binary blobs in chipsets - privacy threat?</a></li>
<li><a href="https://math.stackexchange.com/questions/1821075">Tough integrals that can be easily beaten by using simple techniques</a></li>
<li><a href="https://math.stackexchange.com/questions/23312">What is the importance of eigenvalues/eigenvectors?</a></li>
<li><a href="https://security.stackexchange.com/questions/17421">How to store salt?</a></li>
<li><a href="https://security.stackexchange.com/a/31846/10727">How to securely hash passwords?</a></li>
<li><a href="https://security.stackexchange.com/questions/49849">Timing Safe String Comparison - Avoiding Length Leak</a></li>
<li><a href="https://unix.stackexchange.com/questions/55203">Bash autocomplete: first list files then cycle through them</a></li>
<li><a href="https://stats.stackexchange.com/questions/17336">How exactly does one “control for other variables”?</a></li>
<li><a href="https://stats.stackexchange.com/questions/78816">How do you "control" for a factor/variable?</a></li>
<li><a href="https://skeptics.stackexchange.com/questions/31521">Was ISIS created by the USA?</a></li>
<li><a href="https://math.stackexchange.com/questions/1846247">Is 0! = 1 because there is only one way to do nothing?</a></li>
<li><a href="https://stats.stackexchange.com/questions/47771">What is the intuition behind beta distribution? - Cross Validated</a></li>
<li><a href="https://stats.stackexchange.com/questions/20520">What is an "uninformative prior"? Can we ever have one with truly no information?</a></li>
<li><a href="https://tex.stackexchange.com/questions/203874">sudo does not find tlmgr - TeX</a></li>
<li><a href="https://german.stackexchange.com/questions/404">What movies are good for learners who want to improve their grammar and vocabulary?</a></li>
<li><a href="https://stats.stackexchange.com/questions/6538">Mathematician wants the equivalent knowledge to a quality stats degree</a></li>
<li><a href="https://stats.stackexchange.com/questions/138">Free resources for learning R</a></li>
<li><a href="https://stackoverflow.com/questions/7644658">Are there type signatures which Haskell can't verify?</a></li>
<li><a href="https://stackoverflow.com/questions/10593096">Purely functional set</a></li>
<li><a href="https://stackoverflow.com/questions/14008125">Shell script common template</a></li>
<li><a href="https://stackoverflow.com/questions/11227809">Why is it faster to process a sorted array than an unsorted array?</a></li>
<li><a href="https://stackoverflow.com/questions/2394609">Makefile, header dependencies</a></li>
<li><a href="https://stackoverflow.com/questions/10239630">Where to find programming exercises for applicative functors?</a></li>
<li><a href="https://stackoverflow.com/questions/12653787">What optimizations can GHC be expected to perform reliably?</a></li>
<li><a href="https://stackoverflow.com/questions/1012573">Getting started with Haskell</a></li>
<li><a href="https://stackoverflow.com/questions/2933366">Deleting While Iterating in Ruby?</a></li>
<li><a href="https://stackoverflow.com/questions/118984">How can you program if you're blind?</a></li>
<li><a href="https://stackoverflow.com/questions/27286232">How does new Google reCAPTCHA work?</a></li>
<li><a href="https://stackoverflow.com/questions/34125">Which, if any, C++ compilers do tail-recursion optimization?</a></li>
<li><a href="https://stackoverflow.com/questions/1408651">Is optimizing certain functions with Assembler in a C/C++ program really worth it?</a></li>
<li><a href="https://stackoverflow.com/questions/549">The definitive guide to form-based website authentication</a></li>
</ul>
</details>
<details>
<summary> PDFs</summary>
<ul style="ul columns: 2; -webkit-columns: 2; -moz-columns: 2;">
<li><a href="https://dig1000holes.files.wordpress.com/2013/04/what-is-a-roleplaying-game-by-epidiah-ravachol.pdf"> What is a roleplaying game?</a></li>
<li><a href="https://research.stlouisfed.org/wp/2012/2012-035.pdf"> The Case Against Patents</a></li>
<li><a href="https://intelligence.org/files/CognitiveBiases.pdf">Cognitive Biases </a></li>
<li><a href="https://pcl.sitehost.iu.edu/rgoldsto/courses/dunloskyimprovinglearning.pdf">Improving Learning</a></li>
<li><a href="http://www.csie.ntu.edu.tw/~b94087/ITT.pdf">Intuitionistic Type Theory</a></li>
<li><a href="http://www.paultaylor.eu/stable/prot.pdf">Proofs And Types</a></li>
<li><a href="http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf">The Genuine Sieve of Eratosthenes</a></li>
<li><a href="http://www.cs.nott.ac.uk/~pszgmh/fold.pdf">A tutorial on the universality and expressiveness of fold</a></li>
<li><a href="http://homepages.inf.ed.ac.uk/wadler/papers/gr2/gr2.pdf"> The Girard-Reynolds Isomorphism</a></li>
<li><a href="http://www.jucs.org/jucs_10_7/total_functional_programming/jucs_10_07_0751_0768_turner.pdf">Total Functional Programming</a></li>
<li><a href="https://projecteuclid.org/download/pdfview_1/euclid.ss/1089808273">The Interplay of Bayesian and Frequentist Analysis</a></li>
<li><a href="http://www.cse.chalmers.se/~bengt/papers/hlcs.pdf"> Martin-L¨of’s Type Theory</a></li>
<li><a href="http://strictlypositive.org/diff.pdf">The Derivative of a Regular Type is its Type of One-Hole Contexts</a></li>
<li><a href="http://arxiv.org/pdf/math/0212377v1.pdf">Objects of Categories as Complex Numbers</a></li>
<li><a href="http://arxiv.org/pdf/1006.4131.pdf">A pedagogical history of compactness</a></li>
<li><a href="https://web.archive.org/web/20160307191922/http://www.math.jhu.edu/~eriehl/727/context.pdf">Category theory in context</a></li>
<li><a href="http://math.mit.edu/~dspivak/teaching/sp13/CT4S--static.pdf"> Category Theory for Scientists</a></li>
<li><a href="http://www.cs.cornell.edu/~ross/publications/proofgen/proofgen_tate_popl10.pdf">Generating Compiler Optimizations from Proofs</a></li>
<li><a href="http://arxiv.org/pdf/math/0602053v3.pdf">Towards a Definition of an Algorithm</a></li>
<li><a href="http://arxiv.org/pdf/1003.1343v1.pdf">What does Newcomb’s paradox teach us?</a></li>
<li><a href="http://ggp.stanford.edu/readings/fluxplayer.pdf">Fluxplayer: A Successful General Game Player</a></li>
<li><a href="http://lucacardelli.name/Papers/TypeSystems.pdf">Type Systems</a></li>
<li><a href="http://arxiv.org/pdf/1501.00011v1.pdf">Why now is the right time to study quantum computing</a></li>
<li><a href="http://papers.nips.cc/paper/3725-bayesian-belief-polarization.pdf">Bayesian Belief Polarization</a></li>
<li><a href="http://arxiv.org/pdf/1212.6177v2.pdf">How Much of the Web Is Archived?</a></li>
<li><a href="http://rsta.royalsocietypublishing.org/content/roypta/369/1956/4913.full.pdf">The time resolution of the St Petersburg paradox</a></li>
<li><a href="https://web.archive.org/web/20170107035209/https://www.human.cornell.edu/hd/ciws/upload/SexDifferencesMathIntensiveFields.pdf">Sex Differences in Math-Intensive Fields</a></li>
<li><a href="http://sci-hub.tw/5b323a335b63fe326adfaa74c9793559/10.1016%40S0140-6736%2814%2961690-1.pdf">Prosopometamorphopsia and facial hallucinations</a></li>
<li><a href="http://www.gwern.net/docs/genetics/2016-plomin.pdf"> Top 10 Replicated Findings From Behavioral Genetics</a></li>
<li><a href="http://www.stat.columbia.edu/~gelman/research/published/signif4.pdf">The Difference Between “Significant” and “Not Significant” is not Itself Statistically Significant</a></li>
<li><a href="http://www.stat.columbia.edu/~gelman/research/unpublished/p_hacking.pdf">The garden of forking paths: Why multiple comparisons can be a problem,even when there is no “fishing expedition” or “p-hacking” and the research hypothesis was posited ahead of time</a></li>
<li><a href="http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf"> Why Functional Programming Matters</a></li>
<li><a href="https://www.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf">Reflections on Trusting Trust </a></li>
<li><a href="http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf">Source Code Optimization</a></li>
<li><a href="http://cr.yp.to/antiforgery/cachetiming-20050414.pdf"> Cache-timing attacks on AES</a></li>
<li><a href="http://www.eurofound.europa.eu/sites/default/files/ef_files/pubdocs/2002/07/en/1/ef0207en.pdf">Working time preferences in
sixteen European countries</a></li>
<li><a href="http://www.ilo.org/wcmsp5/groups/public/---ed_protect/---protrav/---travail/documents/publication/wcms_187307.pdf">The effects of working time on productivity and firm performance</a></li>
<li><a href="http://www.cepr.net/documents/publications/min-wage-2013-02.pdf"> Why Does the Minimum Wage Have No Discernible Effect on Employment?</a></li>
<li><a href="https://kar.kent.ac.uk/46742/1/fp1187-altadmri.pdf"> 37 Million Compilations: Investigating Novice Programming Mistakes in Large-Scale Student Data</a></li>
<li><a href="http://www.liveink.com/IPCC%202007%20VSTF%20Research%20Paper.pdf"> Visual-Syntactic Text Formatting: Theoretical Basis and Empirical Evidence for Impact on Human Reading</a></li>
<li><a href="https://arxiv.org/pdf/1606.06565v2.pdf">Concrete Problems in AI Safety</a></li>
<li><a href="http://esperanto-edmonton.wdfiles.com/local--files/kellerman-answerkey/ACGOE_Kellerman_AnswerKey.pdf">A complete grammar of Esperanto</a></li>
<li><a href="http://www.gwern.net/docs/2015-mackenzie.pdf">Preventing future offending of delinquents and offenders: what have we learned from experiments and meta-analyses?</a></li>
<li><a href="http://www.michael-findley.com/uploads/2/0/4/5/20455799/cps__full-special-issue.pdf">Can Results-Free Review Reduce Publication Bias? The Results and Implications of a Pilot Study</a></li>
</ul>
</details>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:tiempo" role="doc-endnote">
<p>He tardado <del>un poco</del> MUCHO en terminar esto, y he guardado bastantes artículos desde que empecé a escribirlo (del 6 al 17 de agosto no hice otra cosa que leer y leí 186 artículos), pero estos se van a quedar para la próxima. <a href="#fnref:tiempo" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:stackexchange" role="doc-endnote">
<p>Una red de sitios de preguntas y respuestas sobre diversos temas. Estoy suscrito a las <a href="https://stackexchange.com/newsletters"><em>newsletters</em></a> de <a href="https://math.stackexchange.com">matemáticas</a>, <a href="https://skeptics.stackexchange.com">escepticismo</a> y <a href="https://security.stackexchange.com">seguridad informática</a> <a href="#fnref:stackexchange" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Repetición espaciada: consejos2016-07-07T00:00:00+00:00https://codual.github.io/2016/07/07/repeticion-espaciada
<em>Este post contiene fórmulas matemáticas que podrían
no visualizarse correctamente en un lector de RSS.</em>
<hr>
<p>La <a href="https://en.wikipedia.org/wiki/Spaced_repetition">repetición espaciada</a> es una técnica de aprendizaje y memorización que consiste en revisar el contenido con intervalos crecientes de tiempo entre una revisión y la siguiente. Es una técnica que parece ser <a href="https://www.gwern.net/Spaced%20repetition#background-testing-works">bastante efectiva</a> para <a href="https://www.gwern.net/Spaced%20repetition#subjects">gran cantidad de temas</a> y es más efectiva que estudiarlo todo junto en los últimos días. En suma, consiste en hacer tarjetas que tengan una pregunta o frase en un lado y una respuesta en el otro y en responder a esa pregunta o frase en intervalos crecientes.</p>
<p>He utilizado esta técnica en los últimos tres años y presento aquí algunos consejos prácticos a partir de mi experiencia y de algunos estudios para poner esta técnica en práctica. Si quieres leer más sobre la base de la repetición espaciada te recomiendo leer <a href="https://www.gwern.net/Spaced%20repetition">el artículo de Gwern sobre el tema</a>.</p>
<h2 id="para-qué-puedes-usarla">Para qué puedes usarla</h2>
<p>La repetición espaciada es más fácil de utilizar en campos de conocimiento en los que la información puede dividirse en unidades pequeñas que pueden memorizarse independientemente, como para aprender teoremas matemáticos, fórmulas o definiciones individuales.</p>
<p>Si quieres memorizar cosas más largas o que deben recordarse de forma exacta como enumeraciones, poemas o artículos de leyes es más complejo utilizar este sistema. Una opción es dividir el texto o lista en partes cortas indicando el principio y el final y responder con lo que hay en medio.</p>
<p>En el caso de temas de desarrollo para mí ha resultado efectivo hacer un esquema del contenido y hacer tarjetas que vayan de los títulos generales al contenido específico de cada sección, aunque es cierto que resulta más complejo.</p>
<p>En resumen, en principio puedes utilizar la repetición espaciada para <a href="https://www.supermemo.com/english/ol/ks.htm">memorizar cualquier cosa</a> pero <strong>debes dividirla en partes suficientemente pequeñas</strong> como para que no resulte difícil recordar cada una de una vez.</p>
<h2 id="qué-necesitas">Qué necesitas</h2>
<p>La forma más sencilla de practicar esta técnica es utilizar una aplicación para el ordenador o dispositivos móviles. Si quieres hacerlo a mano hay <a href="https://en.wikipedia.org/wiki/Leitner_system">algunos algoritmos</a><sup id="fnref:leitner" role="doc-noteref"><a href="#fn:leitner" class="footnote" rel="footnote">1</a></sup> para ello, pero (probablemente) sea más difícil mantener el interés si te lleva demasiado trabajo.</p>
<p>Yo uso la aplicación <a href="http://ankisrs.net">Anki</a> ya que tiene un <a href="https://ankiweb.net/about">sistema de sincronización</a> móvil-ordenador gratuito y permite utilizar LaTeX para escribir fórmulas. Algunos consejos de este post son especificos para Anki, pero la mayor parte de los sistemas de repetición espaciada tienen características similares así que será aplicable en su mayoría utilices la aplicación que sea.</p>
<p>Si quieres utilizar otra aplicación (en iOS Anki no es gratuita, por ejemplo) tienes una <a href="https://en.wikipedia.org/wiki/List_of_flashcard_software">comparativa de características en Wikipedia</a> y otra de <a href="https://www.gwern.net/Spaced%20repetition#popularity">popularidad en el post de Gwern</a>.</p>
<p>Si tu objetivo es aprender idiomas <a href="https://es.duolingo.com">Duolingo</a> y <a href="https://www.memrise.com">Memrise</a> utilizan este sistema y tienen tarjetas ya preparadas para memorizar vocabulario, estructuras gramaticales y otros aspectos.</p>
<h2 id="cómo-hacer-las-tarjetas">Cómo hacer las tarjetas</h2>
<p>Anki y otros servicios tienen tarjetas prehechas para aprender algunos temas. Mi recomendación (excepto si utilizas un sistema guiado como Duolingo) es que hagas tus propias tarjetas para poder controlar la información que memorizas y hacer que se corresponda de forma más fiable con el contenido que quieres memorizar.</p>
<p>¿Sobre qué hago las tarjetas? <a href="https://www.gwern.net/Spaced%20repetition#how-much-to-add">Gwern calcula</a> que emplearás para una tarjeta que aprendas durante 3 años un total de 30 o 40 segundos de media. Anki y otros sistemas tienen un <a href="http://ankisrs.net/docs/manual.html#leeches">sistema para identificar tarjetas especialmente difíciles de memorizar</a> así que no deberías tener miedo en añadir cualquier cosa que creas que puede resultar útil siempre que estés dispuesto a dedicarle el tiempo necesario. En mi caso para 3 asignaturas (~150 tarjetas) salen a una media de 3 minutos al día estudiando todos los días.</p>
<p>SuperMemo (una software para repetición espaciada) incluye <a href="https://www.supermemo.com/en/articles/20rules">una lista bastante extensa de consejos</a> para hacer tarjetas que sean efectivas. Algunos consejos que yo encuentro especialmente relevantes son:</p>
<ul>
<li><strong>Aprende antes de memorizar</strong>. No empieces a memorizar algo si no lo has entendido antes o no lo has utilizado de ninguna forma. Por ejemplo, si quieres memorizar un teorema, entiende primero de forma general sus implicaciones, lo que significa y para qué se usa.</li>
<li><strong>Utiliza el tipo de tarjeta más adecuado</strong> La mayor parte de los sistemas de repetición espaciada tienen distintos tipos de tarjetas: como mínimo hay tarjetas clásicas (una pregunta y una respuesta), tarjetas que pueden invertirse (se muestra un lado y debes responder el otro) y tarjetas con huecos (<a href="https://en.wikipedia.org/wiki/Cloze_test"><em>cloze deletion</em></a>). También puedes emplear (si quieres emplear el tiempo necesario) imágenes o diagramas con huecos para completar. Ten en cuenta también que <a href="https://www.gwern.net/Spaced%20repetition#review-summary">no todos los tipos de tarjetas son igual de efectivos</a>.</li>
<li><strong>Incluye todo el contexto</strong>. Por ejemplo, para aprender que <em>agua</em> se dice <em>akvo</em> en esperanto deberías tener una tarjeta en cada dirección<sup id="fnref:invertida" role="doc-noteref"><a href="#fn:invertida" class="footnote" rel="footnote">2</a></sup>: una en la que se te pregunte por la traducción de <em>agua</em> y otra en la que se te pregunte por la traducción de <em>akvo</em>.</li>
<li><strong>Divide la información lo más posible</strong>: La repetición espaciada funciona mejor si no tienes grandes cantidades de información que responder de una sóla vez. Si puedes dividir una tarjeta en dos independientes será más fácil aprender cada contenido. Evita además las listas demasiado largas (en mí caso más de 5 elementos suele resultar más difícil de memorizar)</li>
<li><strong>Sé consistente</strong>: Si tienes que hacer tarjetas sobre un tema parecido, evita dar información extra que te haga saber de qué tarjeta se trata. Si quieres aprender que <em>Los escarabajos tienen 6 patas</em> y <em>Las arañas tienen 8 patas</em> haz tarjetas de la forma <em>[…] tienen 6 patas</em> ocultando el artículo para que el género de la palabra del hueco no te de información.</li>
<li><strong>Evita ambigüedades</strong>: Debe ser claro sobre qué estás preguntando sin que tengas que dar información extra. Dos tarjetas con un título muy parecido pueden llevar a confusión y hacerte perder el tiempo. Si una pregunta tiene varias respuestas válidas posibles inclúyelas si ves que es relevante.</li>
</ul>
<h2 id="cuándo-hacer-las-tarjetas">Cuándo hacer las tarjetas</h2>
<p>Si vas a utilizar las tarjetas para memorizar el contenido de una asignatura es relevante el momento en el que hagas las tarjetas. En mi experiencia no deberías hacer las tarjetas justo en el momento en el que aprendes el contenido: hacer tarjetas lleva tiempo y muchas asignaturas tienen contenido introductorio que no es necesario memorizar y puedes estar malgastando el tiempo. <strong>Espera a saber qué contenido es relevante</strong> y en ese momento haz las tarjetas.</p>
<p>Si estás preparando un examen deberías empezar a estudiar las tarjetas con <strong>como mínimo 5 días</strong> (mi recomendación sería, si tienes el tiempo para hacerlo, que prepares las tarjetas y empieces a usarlas con 2 semanas de antelación aproximadamente).</p>
<h2 id="cuándo-estudiar">Cuándo estudiar</h2>
<p>Crear el hábito de estudiar las tarjetas todos los días es quizás la parte más difícil de todo el proceso. Mi recomendación es que busques un momento específico del día para hacerlo, por ejemplo, en el transporte público si lo utilizas y seas consistente en su uso. Dado que es más fácil memorizar por la noche <a href="https://www.gwern.net/Spaced%20repetition#when-to-review">quizás deberías estudiarlas por la noche</a>. No obstante la mayor parte de los estudios no controlan este factor y no parece afectar así que mi recomendación es que lo hagas en el momento que creas que va a ser más probable que crees el hábito.</p>
<h2 id="tarjetas-para-matemáticas">Tarjetas para matemáticas</h2>
<p>En el caso de utilizar tarjetas para memorizar cosas sobre matemáticas (el principal uso que les he dado) mi recomendación es:</p>
<ul>
<li>Considera incluir las definiciones como tarjetas de doble sentido si es necesario</li>
<li>Si una demostración es sencilla, incluye una tarjeta para la idea principal</li>
<li>Si usas variables en la respuesta menciónalas en la pregunta para facilitar la comprobación</li>
<li>Si una proposición o resultado no tiene nombre es más sencillo incluirlo como una tarjeta con huecos, tapando su forma lógica (<em>\(f\) es derivable […] \(f\) es continua</em><sup id="fnref:sii" role="doc-noteref"><a href="#fn:sii" class="footnote" rel="footnote">3</a></sup>) y/o las hipótesis implicadas (<em>\(f\) es […] implica que \(f\) es continua</em>).</li>
</ul>
<p>Para escribir fórmulas Anki utiliza <a href="https://www.mathjax.org/">MathJax</a> como soporte para escribir matemáticas<sup id="fnref:antiguo" role="doc-noteref"><a href="#fn:antiguo" class="footnote" rel="footnote">4</a></sup>.
Para utilizarlo puedes seguir <a href="http://libreim.github.io/blog/2015/03/14/latex">esta guía</a>.</p>
<p>Puedes incluir cualquier tipo de código LaTeX en tus tarjetas como fórmulas, diagramas o tablas. El caso de uso más frecuente son las fórmulas. Para insertarlas puedes teclear <code class="language-plaintext highlighter-rouge">Ctrl</code>+<code class="language-plaintext highlighter-rouge">M</code>,<code class="language-plaintext highlighter-rouge">E</code> (para fórmulas en medio de texto) o <code class="language-plaintext highlighter-rouge">Ctrl</code>+<code class="language-plaintext highlighter-rouge">M</code>,<code class="language-plaintext highlighter-rouge">M</code> (para fórmulas con su propia línea) o utilizar la sintaxis que ves debajo.</p>
<p>Por ejemplo, si queremos hacer una tarjeta con la fórmula de la suma de series geométricas pondríamos:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>La suma de los \(n\) primeros términos de una progresión geométrica de razón \(r\) con primer término \(a\) es:
\[\sum_{k=0}^{n-1} ar^k= a \, \frac{1-r^{n}}{1-r}\]
</code></pre></div></div>
<p>Y obtendríamos una tarjeta con texto:</p>
<blockquote>
<p>La suma de los \(n\) primeros términos de una progresión geométrica de razón \(r\) con primer término \(a\) es:
\(\displaystyle\sum_{k=0}^{n-1} ar^k= a \, \frac{1-r^{n}}{1-r}\)</p>
</blockquote>
<p>Si vas a utilizar Anki en un dispositivo sin LaTeX (un móvil, por ejemplo) pulsa <code class="language-plaintext highlighter-rouge">Herramientas</code> → <code class="language-plaintext highlighter-rouge">Comprobar multimedia…</code> para que se generen todas las imágenes de las fórmulas en un dispositivo con LaTeX y podrás acceder a estas en cualquier dispositivo sincronizado.</p>
<h2 id="enlaces-sobre-el-tema">Enlaces sobre el tema</h2>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Spaced_repetition">Spaced repetition - Wikipedia</a></li>
<li><a href="https://www.supermemo.com/en/articles/20rules">Effective learning: Twenty rules of formulating knowledge</a></li>
<li><a href="https://www.theguardian.com/education/2016/jan/23/spaced-repetition-a-hack-to-make-your-brain-store-information">Spaced repetition: a hack to make your brain store information</a></li>
<li><a href="http://ankisrs.net/docs/manual.html">Anki Manual</a></li>
<li><a href="https://www.gwern.net/Spaced%20repetition">Spaced repetition - Gwern.net</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:leitner" role="doc-endnote">
<p><a href="https://fluent-forever.com">Fluent Forever</a> tiene una guía para el sistema Leitner en su segundo apéndice <a href="#fnref:leitner" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:invertida" role="doc-endnote">
<p>Anki <a href="http://ankisrs.net/docs/manual.html#reverse-cards">dispone de un tipo de tarjeta</a> (<em>Básica e invertida</em>) que genera automáticamente una tarjeta en cada dirección. <a href="#fnref:invertida" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:sii" role="doc-endnote">
<p>Para evitar distinguir si la respuesta es <em>si y sólo si</em> o una implicación escribe las implicaciones de la forma <em>P implica [que] Q</em>. <a href="#fnref:sii" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:antiguo" role="doc-endnote">
<p>Este método sólo está disponible si utilizas Anki 2.1 o superior. En otro caso tendrás que utilizar LaTeX y dvipng siguiendo <a href="https://apps.ankiweb.net/docs/manual.html#latex-support">esta guía</a>. La sintaxis para escribir las tarjetas cambia ligeramente, pero puedes hacerte una idea con este artículo <a href="#fnref:antiguo" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Podcasts2016-06-21T00:00:00+00:00https://codual.github.io/2016/06/21/podcasts
<p>Una lista de podcasts que me gustan. Todos los podcast están <strong>en inglés.</strong></p>
<hr />
<h2 id="welcome-to-night-vale"><a href="http://www.welcometonightvale.com"><strong>Welcome to Night Vale</strong></a></h2>
<p><span class="message">Género:</span> Noticias Falsas, Horror, Comedia, Surrealismo.</p>
<p><span class="message">Episodios:</span> 20 - 30 minutos. Cada dos semanas. La historia comienza desde el principio y tiene episodios muy buenos pero tiene ya 90+ episodios. Los autores dicen que puedes escuchar desde donde quieras pero obviamente va a haber cosas que te pierdas. Una discusión de los episodios clave <a href="https://www.reddit.com/r/nightvale/comments/3ujhj6/">aquí [posibles spoilers]</a>.</p>
<p><span class="message">Descripción:</span> Una ciudad perdida en medio del desierto donde los
ángeles no existen y una nube brillante controla mentes.
Uno de los podcasts más valorados en iTunes.</p>
<p><span class="message">Valoración:</span> <strong>5/5</strong></p>
<hr />
<h2 id="sayer"><a href="http://geeklyinc.com/category/sayer/"><strong>Sayer</strong></a></h2>
<p><span class="message">Género:</span> Ciencia Ficción, Cyberpunk, Horror, Comedia</p>
<p><span class="message">Episodios:</span> ~20 minutos. Cada dos semanas por temporadas. Escuchar desde el principio.</p>
<p><span class="message">Descripción:</span> Sayer, una IA que se comunica contigo a través de un
implante en tu cerebro te guía en tu nuevo hogar en las instalaciones de
<em>Ærolith Dynamics.</em> Le da un aire a <a href="http://www.thinkwithportals.com/">Portal</a>.</p>
<p><span class="message">Valoración:</span> <strong>3/5</strong></p>
<hr />
<h2 id="invisibilia"><a href="http://www.npr.org/podcasts/510307/invisibilia">Invisibilia</a></h2>
<p><span class="message">Género:</span> Historias cortas (reales), reportajes.</p>
<p><span class="message">Episodios:</span> ~1 hora. Semanal por temporadas. Episodios independientes.</p>
<p><span class="message">Descripción:</span> Un podcast sobre cosas invisibles que está empezando su segunda temporada. Fantabuloso. A veces tiene un tono un poco <em>new-agey</em> pero es sólo eso, tono.</p>
<p><span class="message">Valoración:</span> <strong>5/5</strong></p>
<hr />
<h2 id="alice-isnt-dead"><a href="http://aliceisntdead.libsyn.com">Alice isn’t Dead</a></h2>
<p><span class="message">Género:</span> Horror, comedia, surrealismo.</p>
<p><span class="message">Episodios:</span> 20-30 minutos. Cada dos semanas por temporadas. Escuchar desde el principio.</p>
<p><span class="message">Descripción:</span> Un podcast de los creadores de Night Vale en el que conocerás por qué el pollo cruzó la carretera. El estilo es similar al de Night Vale y también ha recibido muy buenas críticas.</p>
<p><span class="message">Valoración:</span> <strong>4.5/5</strong></p>
<hr />
<h2 id="life-of-the-law"><a href="http://www.lifeofthelaw.org">Life of The Law</a></h2>
<p><span class="message">Género:</span> Historias cortas (reales), reportajes, entrevistas.</p>
<p><span class="message">Episodios:</span> 15-30 minutos. Cada dos semanas. Episodios independientes.</p>
<p><span class="message">Descripción:</span> Un podcast con episodios sobre la ley: las consecuencias del estado de emergencia en Francia o la inmigración y el sistema penitenciario en Estados Unidos.</p>
<p><span class="message">Valoración:</span> <strong>3.5/5</strong></p>
<hr />
<h2 id="psychcrunch"><a href="https://digest.bps.org.uk/podcast/">PsychCrunch</a></h2>
<p><span class="message">Género:</span> Reportajes, entrevistas.</p>
<p><span class="message">Episodios:</span> 10-15 minutos. Cada dos o tres meses. Episodios independientes.</p>
<p><span class="message">Descripción:</span> El podcast de la <a href="http://digest.bps.org.uk"><em>British Psychological Society’s Research Digest</em></a> (el blog también mola si os gusta la psicología). Episodios cortos sobre estudios en un cierto tema de psicología.</p>
<p><span class="message">Valoración:</span> <strong>3/5</strong></p>
<hr />
<h2 id="this-american-life"><a href="http://www.thisamericanlife.org/"><strong>This American Life</strong></a></h2>
<p><span class="message">Género:</span> Historias cortas (reales), reportajes.</p>
<p><span class="message">Episodios:</span> ~1 hora. Semanal. Episodios independientes.</p>
<p><span class="message">Descripción:</span> El podcast más escuchado en USA. Historias y reportajes
semanales sobre un tema común.</p>
<p><span class="message">Valoración:</span> <strong>4/5</strong></p>
<hr />
<h2 id="criminal"><a href="http://thisiscriminal.com/"><strong>Criminal</strong></a></h2>
<p><span class="message">Género:</span> Historias cortas (reales), crimen.</p>
<p><span class="message">Episodios:</span> 10 - 20 minutos. Mensual. Episodios independientes.</p>
<p><span class="message">Descripción:</span> Entrevistas y reportajes sobre sucesos relacionados con
crímenes.</p>
<p><span class="message">Valoración:</span> <strong>3/5</strong></p>
<hr />
<h2 id="the-truth"><a href="http://www.thetruthpodcast.com/"><strong>The Truth</strong></a></h2>
<p><span class="message">Género:</span> Ficción, improvisación.</p>
<p><span class="message">Episodios:</span> 15 - 20 minutos. Cada dos semanas. Episodios independientes.</p>
<p><span class="message">Descripción:</span> Historias cortas de ficción.
Recomiendo:</p>
<ul>
<li><em>The One About The Dead Dog</em></li>
<li><em>They’re Made Out of Meat</em></li>
<li><em>Silvia’s Blood</em></li>
<li><em>False Ending</em></li>
</ul>
<p><span class="message">Valoración:</span> <strong>3/5</strong></p>
<hr />
<p>Y ya está. Si ya los has escuchado todos o simplemente quieres encontrar alguno
más, otros podcasts interesantes son: </p>
<ul>
<li><a href="https://www.reddit.com/r/Prompted">Prompted</a>, el podcast oficial de <a href="https://www.reddit.com/r/WritingPrompts">/r/WritingPrompts</a>. Historias cortas a partir de una frase.</li>
<li><a href="http://www.nightvalepresents.com/withinthewires">Within The Wires</a>, el nuevo podcast de los creadores de Night Vale.</li>
<li><a href="http://serialpodcast.org/">Serial</a>, uno de los podcasts más escuchados en USA en el que investigan un caso cada temporada.</li>
<li><a href="http://www.kakosindustries.com/">Kakos Industries</a>, un podcast parodia sobre una empresa que te ayuda a hacer El Mal™.</li>
<li><a href="https://www.acast.com/saywhytodrugs/">Say Why to Drugs</a> un podcasts sobre drogas desde la perspectiva de la reducción del daño</li>
</ul>
Muerte a los acortadores2016-05-15T00:00:00+00:00https://codual.github.io/2016/05/15/acortadores
<p>Los acortadores de URL crean un enlace corto que redirecciona a otro dado.
Fueron popularizados por Twitter<sup id="fnref:twitter" role="doc-noteref"><a href="#fn:twitter" class="footnote" rel="footnote">1</a></sup>, y se utilizan para obtener estadísticas de uso o simplemente porque son más estéticas, fáciles de memorizar, escribir o distribuir. Aunque tienen usos legítimos los acortadores no son seguros y dañan Internet.</p>
<h2 id="cómo-funcionan">Cómo funcionan</h2>
<p>Un acortador funciona con una base de datos en la que un número (ID) identifica cada URL de forma única. La ID se genera aleatoriamente hasta encontrar una que esté libre: coger la mínima ID no ocupada <a href="https://www.quora.com/Is-exposing-database-auto-increment-id-considered-a-bad-practice/answer/Ted-Suzman">expone</a> mucha información<sup id="fnref:alemania" role="doc-noteref"><a href="#fn:alemania" class="footnote" rel="footnote">2</a></sup> y tiene problemas de concurrencia.
La URL que se genera es entonces <a href="http://stackoverflow.com/a/1562793/3414720">la ID convertida</a> a base 36 (<code class="language-plaintext highlighter-rouge">length ['a'..'z'] + length [0..9]</code>) o 62 (añadiendo mayúsculas).</p>
<p>De esta forma sólo hace falta ver la ID asociada a la URL que tenemos y redireccionar al usuario.
Esta operación añade un tiempo de carga notable a los links: una <a href="https://t37.net/why-link-shorteners-harm-your-readers-and-destroy-the-web.html">combinación de acortadores</a> frecuente puede añadir un retardo de 1-3 segundos en la carga de una web.
Pero este no es el principal problema de los acortadores.</p>
<h2 id="privacidad">Privacidad</h2>
<p>Es muy sencillo explorar las URLs que existen en un determinado servicio generándolas aleatoriamente. Además, algunos acortadores no generan las URLs uniformemente<sup id="fnref:uniforme" role="doc-noteref"><a href="#fn:uniforme" class="footnote" rel="footnote">3</a></sup>, lo que puede permitirnos encontrar URLs que funcionen más fácilmente.</p>
<p>Justo esto es lo que hicieron Martin Georgiev y Vitaly Shmatikov en <a href="http://arxiv.org/pdf/1604.02734v1.pdf">Gone in Six Characters: Short URLs Considered Harmful for Cloud Services</a>. Los investigadores generaron URLs para Bitly, Google Maps, OneDrive y otros servicios. Aunque sólo escanearon un pequeño porcentaje de las URLs del espacio completo<sup id="fnref:espacio" role="doc-noteref"><a href="#fn:espacio" class="footnote" rel="footnote">4</a></sup> encontraron unos 60 millones de URLs existentes.</p>
<p>Para algunos servicios como OneDrive, obtenida una URL era posible encontrar el resto
de las URLs generadas por el usuario y modificar e incluir <em>malware</em> en las carpetas compartidas.</p>
<p>En Google Maps y otros servicios de mapas las URLs encontradas daban
información sobre recorridos desde casas unifamiliares hasta sitios como centros de tratamiento de adicciones, clínicas de aborto, centros de detención juvenil u otras casas, lo que supone un grave problema de privacidad.
Estas direcciones pueden servir también para <a href="http://www.pnas.org/content/107/52/22436.long">identificar relaciones personales</a> y cosas tan simples como la ruta que haces hasta llegar al trabajo <a href="http://crypto.stanford.edu/~pgolle/papers/commute.pdf">pueden identificarte</a> de forma única. En suma, aunque no estén asociados a ningún nombre los datos de localización <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.651.44&rep=rep1&type=pdf">no son anónimos</a>. Por supuesto <del>la NSA</del> nadie se pondría a mirar
de forma sistemática este espacio de direcciones para obtener información sobre los
ciudadanos.</p>
<p>Microsoft ha desactivado la creación de URLs cortas en OneDrive (aunque todas las URLs antiguas siguen teniendo esta vulnerabilidad), y Google ha incrementando la longitud de las URLs cortas a 11-13 caracteres, lo que reduce drásticamente la densidad de URLs utilizadas entre las que se pueden generar.</p>
<p>En su estado actual los acortadores de URLs no son seguros ni privados. Cuando acortas
una URL debes asumir que su contenido podrá ser accedido por <del>la NSA</del> cualquiera con
suficiente poder computacional.</p>
<h2 id="aleatoriedad">Aleatoriedad</h2>
<p>Es imposible saber a donde apunta una URL acortada hasta hacer una petición al servicio, ya que las IDs se generan aleatoriamente. Esto tiene dos problemas importantes.</p>
<p>En primer lugar, no puedes saber si la página que hay detrás del link que visitas es segura. Aunque los acortadores suelen analizar las URLs para evitar el spam este análisis <a href="http://arxiv.org/pdf/1406.3687.pdf">no siempre es efectivo</a>. Además, si un servicio (como <a href="http://thenextweb.com/2009/06/16/popular-url-shortener-cligs-hacked">ocurrió con cli.gs</a>) es hackeado, sus URLs anteriormente seguras pueden ser redireccionadas a sitios maliciosos.</p>
<p>Y, en segundo lugar, si un servicio se interrumpe <strong>millones de URLs dejarán de funcionar</strong><sup id="fnref:interrupcion" role="doc-noteref"><a href="#fn:interrupcion" class="footnote" rel="footnote">5</a></sup>. Esto no es poco común: <a href="http://archiveteam.org">ArchiveTeam</a> tiene <a href="http://archiveteam.org/index.php?title=TinyURL#Dead_or_Broken">una lista</a>
de más de 300 acortadores que han dejado de funcionar y de <a href="http://archive.is/VCaCh">otra lista</a> de acortadores mantenida por yi.tl un 60% han desaparecido. La mayor parte de estos acortadores no cooperan en el archivado de sus bases de datos, lo que hace que estos links acaben siendo simplemente secuencias de caracteres aleatorias.</p>
<p>Los enlaces rotos son un grave problema para la conservación de la información en Internet. <a href="https://en.wikipedia.org/wiki/Link_rot#Prevalence">Entre un 3% y un 5%</a> <sup id="fnref:pocket" role="doc-noteref"><a href="#fn:pocket" class="footnote" rel="footnote">6</a></sup> de los links desaparecen cada año, lo que dificulta acceder a las referencias de las publicaciones científicas y, en general, conservar Internet. Organizaciones como <a href="http://archive.org">Internet Archive</a> archivan copias periódicas de la web, lo que nos permite acceder a documentos que de otra forma no estarían disponibles.</p>
<p><a href="http://arxiv.org/pdf/1212.6177v2.pdf">Entre un 35% y un 90%</a> de la web ha sido archivada alguna vez, pero cuando un acortador de URLs deja de funcionar dejamos de poder acceder a ese contenido. <a href="http://tracker.archiveteam.org:1337/status">URLTeam</a> y <a href="http://301Works.org">301Works</a> son proyectos que pretenden guardar las bases de datos de los servicios de acortadores, pero no son suficientes: debemos dar de una vez muerte a los acortadores.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:twitter" role="doc-endnote">
<p>Desde junio de 2010 cualquier URL en un tweet <a href="https://support.twitter.com/articles/344685">ocupa 23 caracteres</a> lo que hace inútiles los acortadores para su propósito original. <a href="#fnref:twitter" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:alemania" role="doc-endnote">
<p>Así se <a href="http://www.theguardian.com/world/2006/jul/20/secondworldwar.tvandradio">estimó el número de tanques</a> que producía Alemania en la Segunda Guerra Mundial. <a href="#fnref:alemania" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:uniforme" role="doc-endnote">
<p><a href="https://web.archive.org/web/20171215134500/http://w2spconf.com/2011/papers/urlShortening.pdf"><strong>Security and Privacy Implications of URL Shortening Services</strong> - Alexander Neumann, Johannes Barnickel, Ulrike Meyer</a> <a href="#fnref:uniforme" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:espacio" role="doc-endnote">
<p>Escanear el espacio completo es posible según el paper utilizando servicios como <a href="https://en.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud">Amazon EC2</a> o <em>botnets</em> en un tiempo razonable. <a href="#fnref:espacio" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:interrupcion" role="doc-endnote">
<p>Los acortadores de URLs son además más propensos a ser cerrados ya que entran bajo la jurisdicción del país que provee el <a href="https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains#Country_code_top-level_domains">nombre de dominio</a>. vb.ly <a href="http://www.economist.com/node/17249654">cerró</a> por no cumplir la ley Sharia de Lybia al permitir pornografía. <a href="#fnref:interrupcion" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:pocket" role="doc-endnote">
<p>En las redes sociales la pérdida puede llegar hasta <a href="https://arxiv.org/pdf/1209.3026v1.pdf">el 11%</a> cada año. <a href="/2016/09/06/pocket/">Mi estimación</a> en función de los links que he leído es similar <a href="#fnref:pocket" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
¿Cómo aprender LaTeX?2015-03-14T00:00:00+00:00https://codual.github.io/2015/03/14/latex
<em>Este post contiene fórmulas matemáticas que podrían
no visualizarse correctamente en un lector de RSS.</em>
<hr>
<p><em>Este post fue <a href="//libreim.github.io/blog/2015/03/14/latex/">publicado originalmente</a> en el blog de libreim el 14 de marzo de 2015</em></p>
<p><a href="http://www.latex-project.org">\(\LaTeX\)</a> es un lenguaje de marcado y composición de textos para crear documentos técnicos, crear gráficos, escribir matemáticas… Actualmente \(\LaTeX\) se utiliza junto con otros paquetes que añaden funcionalidades adicionales, por lo que dar una visión completa de sus capacidades es complejo. A continuación tienes una lista de recursos para aprender e utilizar \(\LaTeX\) y algunos de sus paquetes.</p>
<!--more-->
<h4 id="instalación">Instalación</h4>
<ul>
<li><strong>GNU/Linux</strong>: Ubuntu y otras distribuciones incluyen por defecto <a href="">TexLive</a>. Si quieres instalarla puedes hacerlo siguiendo <a href="https://www.tug.org/texlive/pkginstall.html">estas instrucciones</a>. TexLive incluye un gestor de paquetes (<a href="https://www.tug.org/texlive/doc/tlmgr.html">tlmgr</a>) para instalarlos manualmente, aunque puedes hacerlo automáticamente utilizando <a href="http://www.ctan.org/pkg/texliveonfly"><code class="language-plaintext highlighter-rouge">texliveonfly</code></a>.</li>
<li><strong>Windows</strong>: La distribución más utilizada es <a href="http://miktex.org/"><em>MikTeX</em></a>. Cuenta con un gestor de paquetes que los instala automáticamente. Aprende a utilizarlo <a href="http://docs.miktex.org/manual/localguide.html">aquí</a>.</li>
<li><strong>Mac OS</strong>: La distribución más utilizada es <a href="https://tug.org/mactex/"><em>MacTeX</em></a>. Puedes encontrar <a href="http://computers.tutsplus.com/tutorials/the-beginners-guide-to-using-tex-in-os-x--mac-45177">aquí</a> una guía de uso e instalación.</li>
<li><strong>Online</strong>: Puedes editar documentos online de forma colaborativa con <a href="https://www.sharelatex.com">ShareLaTeX</a>. Puedes encontrar otras opciones <a href="http://tex.stackexchange.com/questions/3/compiling-documents-online">aquí</a>.</li>
</ul>
<h4 id="introducciones-generales">Introducciones generales</h4>
<p>Si no conoces \(\LaTeX\), empieza leyendo <a href="http://tex.stackexchange.com/questions/4420/best-way-to-start-using-latex-tex">esta respuesta de tex.stackexchange</a> para tener una idea básica. Una vez hecho esto puedes leer:</p>
<ul>
<li>
<p>Una introducción muy corta (4 páginas) es <a href="http://osl.ugr.es/CTAN/info/latex-veryshortguide/veryshortguide.pdf"><em>The very short guide to typesetting with \(\LaTeX\)</em></a>. Después de leer esta introducción podrás utilizar \(\LaTeX\) de forma básica y generar documentos.</p>
</li>
<li>
<p>Una de las guías más utilizadas (130 páginas) es <a href="http://osl.ugr.es/CTAN/info/lshort/spanish/lshort-a4.pdf"><em>La introducción no-tan-corta a LATEX 2ε</em></a>, disponible <em>online</em> en español.</p>
</li>
<li>
<p>El <a href="http://en.wikibooks.org/wiki/LaTeX">WikiBook en inglés</a> y su versión <a href="http://es.wikibooks.org/wiki/Manual_de_LaTeX">en español</a> disponen también de guías divididas en secciones independientes, siendo muy útiles para consultar aspectos concretos.</p>
</li>
<li>
<p>Hay otras introducciones y libros en inglés <a href="http://tex.stackexchange.com/questions/11/what-are-good-learning-resources-for-a-latex-beginner">aquí</a>, y encontrarlos en otros idiomas (incluido en español) <a href="http://tex.stackexchange.com/questions/84384/latex-introductions-in-languages-other-than-english">aquí</a>.</p>
</li>
</ul>
<h4 id="matemáticas">Matemáticas</h4>
<p>\(\LaTeX\) ofrece la capacidad de escribir expresiones matemáticas utilizando una sintaxis especial. Puedes encontrar una guía rápida <a href="https://osl.ugr.es/CTAN/info/short-math-guide/short-math-guide.pdf">aquí</a>. Dada la gran cantidad de símbolos, existen distintos recursos para encontrar los símbolos adecuados:</p>
<ul>
<li><a href="http://detexify.kirelabs.org/classify.html">Detexify</a> permite dibujar un símbolo y obtener su comando.</li>
<li><a href="http://osl.ugr.es/CTAN/info/symbols/comprehensive/symbols-a4.pdf">The Comprehensive \(\LaTeX\) Symbol List (<strong>4MB!!</strong>)</a> incluye una lista que puedes consultar en caso de no encontrar el símbolo adecuado.</li>
</ul>
<h4 id="referencia-y-documentación">Referencia y documentación</h4>
<p>La gran cantidad de paquetes existentes hace difícil la existencia de un documentación exhaustiva de \(\LaTeX\). No obstante, algunos recursos que puedes utilizar para encontrar tus respuestas son:</p>
<ul>
<li><a href="http://tex.stackexchange.com/">tex.stackexchange</a>. Esta es la comunidad de preguntas y respuestas sobre TeX y \(\LaTeX\) de la red StackExchange. Si no encuentras, ¡siempre puedes preguntar!</li>
<li>La mayor parte de distribuciones incluyen gran cantidad de documentación, a la que puedes acceder utilizando el comando <code class="language-plaintext highlighter-rouge">texdoc</code> . Puedes leer más <a href="http://tex.stackexchange.com/questions/2124/is-there-a-comprehensive-and-complete-latex-reference">aquí</a>.</li>
<li><a href="http://www.ctan.org">CTAN</a> incluye la documentación de gran cantidad de paquetes.</li>
</ul>
<h4 id="plantillas">Plantillas</h4>
<p>Para empezar un documento complejo, es útil utilizar plantillas o ejemplos. Algunos recursos son:</p>
<ul>
<li>CTAN incluye gran cantidad de <a href="http://osl.ugr.es/CTAN/info/examples/">ejemplos</a> de distintos paquetes y funcionalidades.</li>
<li>Para encontrar plantillas puedes ver <a href="https://github.com/M42/plantillas">el repositorio</a> de @M42 y encontrar otras plantillas <a href="http://www.latextemplates.com/">aquí</a> y <a href="https://es.sharelatex.com/templates/">aquí</a>.</li>
</ul>
<h4 id="github-y-otros">Github y otros</h4>
<p>Otros recursos que pueden ser útiles son:</p>
<ul>
<li><strong>Macros</strong>: \(\LaTeX\) permite la creación de comandos y entornos. Para una guía básica puedes leer <a href="http://en.wikibooks.org/wiki/LaTeX/Macros">Wikibooks</a>. Para macros más avanzadas y clases, consulta <a href="http://tex.stackexchange.com/questions/12668/where-do-i-start-latex-programming">aquí</a>.</li>
<li><strong>Git y \(\LaTeX\)</strong>: Para integrar git, puedes leer <a href="http://stackoverflow.com/questions/6188780/git-latex-workflow">esta guía</a>.</li>
<li><code class="language-plaintext highlighter-rouge">tikz</code> permite crear imágenes y todo tipo de gráficos vectoriales. Para empezar a utilizarlo puedes leer <a href="http://tex.stackexchange.com/questions/9116/what-is-the-minimum-one-needs-to-know-to-use-tikz">aquí</a>. Además, puedes ver algunos ejemplos <a href="http://www.texample.net/tikz/examples/">aquí</a>.</li>
<li>Puedes encontrar una guía de beamer <a href="https://github.com/libreim/beamer">aquí</a>.</li>
</ul>
Positivismo lógico2014-09-14T00:00:00+00:00https://codual.github.io/2014/09/14/positivismo
<div class="message">
Este post se publicó originalmente en otro blog que ya no existe y lo publico aquí para que siga estando disponible.
No he revisado el contenido y es posible que no esté de acuerdo parcial o totalmente con el mismo.
</div>
<p>El positivismo lógico es una corriente filosófica del siglo XX, que
evolucionó del empirismo inglés. Con frecuencia descubro discusiones en
Internet sobre este movimiento, y muchas de estas discusiones acaban
afirmando que el positivismo lógico <a href="https://webhome.phy.duke.edu/~rgb/Philosophy/axioms/axioms/Why_Logical_Positivism.html" title="Why Logical Positivism is Bullshit">se refuta a sí mismo</a> o
que es incorrecto por razones que, en mi opinión, resultan de tener una
idea equivocada de lo que esta postura defiende. Es probable que este
artículo tenga alguna incorrección, pero creo que sirve para dar una
idea aproximada de qué es el positivismo lógico y de por qué no debemos
matarlo tan rápido.</p>
<p><a href="https://www.marxists.org/glossary/terms/p/o.htm#positivism" title="Marxists - Glossary of Terms">Algunos</a> autores distinguen tres positivismos: el positivismo de Comte, el
positivismo de Mach y Poincaré y el positivismo lógico, relacionado con
el <a href="http://plato.stanford.edu/entries/vienna-circle/" title="Vienna Circle - SEP">Círculo de Viena</a>.
Los primeros positivismos se centraban en la <em>unidad de la ciencia</em>: la
idea de que no existían las ciencias <em>especiales</em>, en oposición a la
tradicional división entre ciencias naturales y ciencias espirituales
(sociología, psicología…). Esta unidad de la ciencia derivó después en
el desarrollo de varios principios y distinciones, siempre con un
enfoque en la exaltación de la ciencia como método único para obtener
conocimiento:</p>
<h3 id="la-distinción-analítico-sintética">La distinción analítico-sintética</h3>
<p>Una de las principales bases de esta corriente es la distinción entre
proposiciones <em>analíticas</em> y <em>sintéticas.</em> Esta distinción surgió en la
filosofía de Kant, y podemos verla también en el <a href="http://en.wikipedia.org/wiki/Hume%27s_fork" title="Tenedor de Hume -enWiki">tenedor de Hume</a>.
Podemos definir estos términos como:</p>
<ul>
<li>Una proposición es <em>analítica</em> si y sólo si su valor de verdad
depende exclusivamente del significado de sus términos. Un ejemplo
podría ser <em>‘todos los solteros no están casados’</em> o cualquier
proposición matemática como <em>‘3 + 4 = 7’</em>.</li>
<li>Una proposición es <em>sintética</em> si y sólo si no es <em>analítica</em>. Un
ejemplo puede ser ‘<em>la fuerza ejercida entre dos cuerpos es
proporcional al producto de sus masas</em>’ o ‘<em>Existe al menos un
unicornio’</em>.</li>
</ul>
<blockquote>
<p>En Madrid estará permitido todo lo que no esté prohibido.</p>
<p>— Esperanza Aguirre (@EsperanzAguirre) <a href="https://twitter.com/EsperanzAguirre/status/596296675863470080">May 7,
2015</a></p>
</blockquote>
<p><em>Un ejemplo de proposición analítica</em></p>
<p>Esta distinción sufrió una <a href="http://plato.stanford.edu/entries/logical-empiricism/#Ana" title="Logical Empiricism § Analyticity - SEP">evolución compleja</a>
para adaptarse a nuevos resultados, como los teoremas de incompletitud
de Gödel, por lo que esta versión es una simplificación. Kant defendía
la existencia de las proposiciones sintéticas <em>a priori</em>, hecho que fue
negado por los positivistas lógicos, que defendían que todas las
proposiciones analíticas eran <em>a priori</em> y por tanto <em>necesarias</em> y que
las proposiciones sintéticas eran <em>a posteriori</em> y por
tanto <em>contingentes</em> .</p>
<h3 id="criterio-de-verificación">Criterio de verificación</h3>
<p>El criterio de verificación se basa en la distinción entre proposiciones
analíticas y sintéticas, y es quizás el principio más famoso del
positivismo lógico. Este principio puede verse ya en Hume:</p>
<blockquote>
<p>Si tomamos en nuestras manos cualquier volumen de teología o
metafísica escolástica, por ejemplo, preguntemos: ¿Contiene algún
razonamiento abstracto referente a cantidad o número? No. ¿Contiene
algún razonamiento experimental concerniente a cuestiones de hecho y
existencia? No. Arrójese entonces a las llamas, pues nada puede
contener que no sea sofistería o ilusión.</p>
<ul>
<li>Investigación sobre el entendimiento humano. Sección 12, parte III</li>
</ul>
</blockquote>
<p>El criterio, al igual que la distinción analítico-sintética también
sufrió algunos cambios, y contaba con varias versiones, dependiendo del
autor. En su rama ‘liberal’ podemos establecer el criterio como:</p>
<p>\Una sentencia es <em>cognitivamente significativa</em><sup id="fnref:nota1" role="doc-noteref"><a href="#fn:nota1" class="footnote" rel="footnote">1</a></sup> si y sólo si
es analítica o bien puede, <em>en principio</em>, confirmarse o desconfirmarse
mediante un procedimiento finito a través de la experiencia.</p>
<p>Esta versión del criterio no es la original, e incluye algunas
modificaciones. En las discusiones iniciales, se requería la
verificación completa, es decir, que existieran evidencias que
determinaran de forma concluyente el valor de verdad de las
proposiciones. Esto excluiría las leyes universales de ser
<em>cognitivamente significativas</em>, como por ejemplo ‘<em>Todos los cisnes son
blancos’</em>.</p>
<p>Durante los años 30 se produjo un proceso de <em>liberalización del
empirismo</em>, en el cual se cambió esta verificación completa por la
confirmación o desconfirmación, es decir, el aumento de la probabilidad
de que el valor de verdad de una proposición sea cierto o falso, de tal
manera que las leyes universales sí eran aceptadas, además de las
proposiciones acerca del pasado o futuro lejano. Una discusión al
respecto puede leerse en <em>Aspects of Scientific Explanation and other
Essays in the Philosophy of Science</em> de Hempel, en el <a href="http://www.andrew.cmu.edu/user/kk3n/80-300/hempel-empcrit.pdf">capítulo
4</a>.</p>
<p>Por otra parte podemos destacar que la confirmación debe poder
hacerse <em>en principio</em>, es decir, que se considera la posibilidad lógica
de encontrar la evidencia pero no la posibilidad técnica. Así, la
sentencia ‘<em>Existen del orden de 10<sup>80</sup> átomos en el universo’</em>
es <em>cognitivamente significativa</em> mientras que no lo sería de otra
forma, ya que no disponemos de la capacidad para ‘contar’ todos los
átomos del universo.</p>
<p>La consecuencia principal de este criterio es que las sentencias
metafísicas (las que no cumplen el criterio) no son <em>cognitivamente
significativas</em>, es decir que las discusiones tradicionales de teología,
ontología, ética normativa, estética o metafísica pasan, no sólo a ser
inútiles sino también a no tener significado cognitivo. Esto reduce la
filosofía a una disciplina lingüística que busca <em>marcos lingüísticos</em>
para el desarrollo de la ciencia, y que se encarga exclusivamente de
proposiciones analíticas. Puede leerse sobre el rechazo de la metafísica
en textos de Carnap como
<a href="http://philosophy.ru/edu/ref/sci/carnap.html" title="The Rejection of Metaphysics - Philosophy and Logical Syntax">éste</a>,
o, para una discusión más extensa, el libro <em>Lenguaje, Verdad y Lógica</em>
de Ayer. Sobre los marcos lingüísticos es relevante el ensayo de
Carnap, <em><a href="http://www.ditext.com/carnap/carnap.html">Empiricism, Semantics, and
Ontology</a>.</em></p>
<h3 id="críticas">Críticas</h3>
<p>Existen otros principios importantes de este movimiento que no
consideraremos aquí para no extender mucho el post, como la distinción
entre observación y teoría (sobre la que puedes leer
<a href="http://philosophy.ru/library/carnap/physics.html" title="Philosophical Foundations of Physics - Chapters 23 to 26">aquí</a>).
Una vez definidos los principios que normalmente son criticados del
positivismo lógico, pasemos a ver las críticas más frecuentes:</p>
<h4 id="el-criterio-de-verificación-no-pasa-el-criterio-de-verificación"><em>“El criterio de verificación no pasa el criterio de verificación”</em></h4>
<p>Esta crítica sea quizás la más frecuente, y ha sido expuesta por Popper,
Russell, o más recientemente por David Deustch. Podríamos exponerla de
la siguiente forma:</p>
<ol>
<li>Una sentencia es <em>cognitivamente significativa</em> si y sólo si es
analítica o bien puede, <em>en principio</em>, confirmarse o desconfirmarse
mediante un procedimiento finito a través de la experiencia. [Este
es el criterio de verificación anteriormente mencionado]</li>
<li>(1) no es analítica.</li>
<li>(1) no puede confirmarse mediante un procedimiento finito a través de la
experiencia.</li>
<li>(2) y (3) implican que (1) no es una sentencia <em>cognitivamente
significativa</em> y por tanto que el positivismo lógico se refuta a sí
mismo.</li>
</ol>
<p>Si esto fuera una crítica válida, entonces, les presento el <em>criterio de
verificación versión 1.1</em>, un criterio para el que los críticos
del positivismo lógico no tendrían razones para no aceptar:</p>
<p><strong><em>Criterio de verificación versión 1.1:</em></strong></p>
<p>Una sentencia es <em>cognitivamente significativa</em> si y sólo si es el
<em>criterio de verificación versión 1.1</em>, es analítica o bien puede, <em>en
principio</em>, confirmarse o desconfirmarse mediante un procedimiento
finito a través de la experiencia.</p>
<p>¡Solucionado! No hay más preguntas, señoría.</p>
<p>El problema es que esta revisión del criterio no es necesaria. La
naturaleza del criterio es tratada por varios autores. En el caso de
Ayer, por ejemplo, lo considera una definición técnica, es decir, que
(2) sería falso, ya que el criterio sería analítico. Otros autores
consideran que el criterio pertenece al <em>metalenguaje</em> y que su dominio
es el lenguaje, por lo que no tendría sentido aplicar el criterio a sí
mismo ya que no entra dentro de su dominio. Esto conlleva el problema de
que debería existir un criterio de verificación del <em>metalenguaje</em> que
perteneciera al <em>metametalenguaje</em> y así sucesivamente.</p>
<p>La solución de Carnap es, en mi opinión, la más satisfactoria. A partir
de 1937 Carnap establece que el positivismo lógico es una convención
lingüística y que, por tanto, no es cierta o falsa, sino que los
argumentos que pueden esgrimirse a su favor son de carácter pragmático.
Carnap defiende así que cualquier lenguaje que no contenga el principio
de verificación llegará a ‘contradicciones fastidiosas’ que no tendrán
solución. En este caso, el término <em>cognitivamente
significativo</em> conserva su significado original.</p>
<p>Una discusión al respecto de esta popular objeción puede encontrarse en
el <a href="http://plato.stanford.edu/entries/logical-empiricism/#Ana" title="Logical Empiricism § Empiricism, Verificationism, and Anti-metaphysics">artículo de SEP</a>
(sección 4.1, a partir del párrafo 12).</p>
<h4 id="críticas-a-la-distinción-analítico-sintética">Críticas a la distinción analítico-sintética</h4>
<p>Otro conjunto de críticas importante dentro de las discusiones
filosóficas, aunque quizás menos conocido para el público general son
las críticas a la distinción analítico-sintética. Las relaciones
analítico-<em>a priori</em>-necesario y sintético-<em>a posteriori</em>-contingente
son criticadas por varios autores.</p>
<p>Dado que no he leído los textos originales de la mayoría de las críticas
de este tipo, no puedo hacer una crítica que muestre con jusiticia los
argumentos en contra de ésta distinción, pero he de decir que
los que he leído, como los de Putnam, se basan, en mi opinión, en un
<a href="http://en.wikipedia.org/wiki/Equivocation">equívoco</a>. Las críticas más
relevantes de ésta distinción son las de Kripke en <em>Naming and
Necessity</em> y la de <em>Dos Dogmas del Empirismo</em> de Quine. Para una
revisión de estas puede leerse el artículo de
<a href="http://plato.stanford.edu/entries/analytic-synthetic/" title="The Analytic/Synthetic Distinction">SEP</a>.</p>
<p>Aún cuando estas críticas son aceptadas por muchos filósofos, la
realidad es que son aún debatidas en la filosofía contemporánea y que
existen muchos <a href="http://en.wikipedia.org/wiki/Analytic%E2%80%93synthetic_distinction#Responses">contraargumentos y definiciones
alternativas</a>
de analicidad, por lo que sin un análisis de los argumentos me parece
presuntuoso afirmar que estas críticas suponen una derrota del
positivismo lógico. Algunas de estas nuevas definiciones se basan en
criterios sintácticos y por tanto no sufren de la crítica de Quine.</p>
<p>En definitiva, aun cuando el positivismo lógico puede considerarse
‘muerto’<sup id="fnref:nota2" role="doc-noteref"><a href="#fn:nota2" class="footnote" rel="footnote">2</a></sup>, en el sentido de que no ha habido una
continuación fuerte de éste, es una postura que puede ser defendida con
justicia en relación con la filosofía de la ciencia y cuyas críticas
normalmente se originan por una idea equivocada de qué es.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:nota1" role="doc-endnote">
<p>Una palabra tiene <em>significado</em> cuando provoca una reacción en el receptor que haría el objeto o situación al que se refiere. Se usa el término <em>significado cognitivo</em> ya que los positivistas lógicos consideran que los términos metafísicos sí provocan una reacción en el receptor, pero esta no es cognitiva, sino emotiva. Es decir, cuando se afirma <em>El Absoluto es perfecto,</em> si bien no nos referimos a un estado del mundo, sí que puede provocar un cierto conjunto de emociones. <a href="#fnref:nota1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:nota2" role="doc-endnote">
<p>Esto no es del todo cierto. Podemos considerar como sucesores a los <a href="http://philosophy.stackexchange.com/questions/5966/logical-positivism-today" title="Logical positivism Today">postpositivistas verificacionistas</a> o al <a href="http://plato.stanford.edu/entries/constructive-empiricism" title="Constructive Empiricism - SEP">empirismo constructivo</a> de van Fraassen. <a href="http://patrick.maher1.net/index.html" title="Patrick Maher Homepage">Patrick Maher</a> también continuó el trabajo en lógica inductiva de Carnap. <a href="#fnref:nota2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
¿Hay algo en lo que todos estemos de acuerdo?2014-06-26T20:15:27+00:00https://codual.github.io/2014/06/26/hay-algo-en-lo-que-todos-estemos-de-acuerdo
<em>Este post contiene fórmulas matemáticas que podrían
no visualizarse correctamente en un lector de RSS.</em>
<hr>
<div class="message">
Este post se publicó originalmente en otro blog que ya no existe y lo publico aquí para que siga estando disponible.
No he revisado el contenido y es posible que no esté de acuerdo parcial o totalmente con el mismo.
</div>
<p>El mundo está lleno de opiniones, pero, normalmente, siempre estamos de
acuerdo en unos principios básicos. ¿O no?</p>
<p>En las bases de cualquier discusión se encuentra la lógica.
Tradicionalmente, la lógica más utilizada ha sido la lógica
proposicional, utilizada por primera vez en la Grecia Clásica. Esta
lógica se basa en <a href="http://en.wikipedia.org/wiki/Three_classic_laws_of_thought#Aristotle">3 principios</a>:</p>
<ol>
<li>El principio del <em>tertio excluso</em>, $A \vee \neg A$, que
establece que toda proposición es cierta, o bien su negación es
cierta. Este principio es rechazado por los <a href="http://en.wikipedia.org/wiki/Many-valued_logic">sistemas lógicos plurivalentes</a>.
Algunos de ellos sólo añaden un tercer valor <em>desconocido</em>, que
podríamos considerar como una visión de la lógica desde la
perspectiva del conocimiento que tenemos de sus proposiciones, pero
otros establecen un continuo de valores de verdad posibles. Es el
caso de la lógica <em>difusa</em><sup id="fnref:nota1" role="doc-noteref"><a href="#fn:nota1" class="footnote" rel="footnote">1</a></sup>. También es negado por la lógica intuicionista. Es, probablemente, el principio más controvertido de los tres.</li>
<li>El principio de <em>no contradicción</em>, $\neg (A \wedge \neg A)$, que establece que no puede darse al mismo tiempo una proposición y su negación. Aunque parezca sorprendente sí, hay gente que niega el principio de no contradicción (¿o tal vez deberíamos decir que lo niega y afirma al mismo tiempo?). El problema que provoca esto es que por el <a href="http://en.wikipedia.org/wiki/Principle_of_explosion">principio de explosión</a> podríamos demostrar cualquier proposición a partir de una contradicción. Para solucionar esto, los <a href="http://plato.stanford.edu/entries/dialetheism/">dialeteístas</a> niegan alguna de las inferencias necesarias para el principio de explosión, resultando en sistemas más débiles, la conocida como <a href="http://en.wikipedia.org/wiki/Paraconsistent_logic">lógica paraconsistente</a>. Abandonando el formalismo, las posiciones relativistas suelen aceptar las contradicciones porque no las consideran como tales.</li>
<li>El principio de identidad, $\forall x(x=x)$, es decir, que cualquier proposición es igual a sí misma o, como decía Gertrude Stein “<em>Rosa es una rosa es una rosa es una rosa</em>“. Formalmente no existe ningún sistema que rechace este principio (al menos que yo conozca) pero sí hay críticas a éste principio. Hegel, quien dijo que hay un pasaje desde la primera $A$ a la segunda en la proposición $A=A$<sup id="fnref:nota2" role="doc-noteref"><a href="#fn:nota2" class="footnote" rel="footnote">2</a></sup> y que por tanto son distintas de alguna forma.</li>
</ol>
<p>Podrías pensar que aquellos que critican la lógica son un grupo
reducido, o simplemente equivocado y que el problema se acaba aquí, pero
aún aceptando la lógica hay algunas proposiciones básicas para el
conocimiento que son puestas en duda.</p>
<p>Un ejemplo de ello son posiciones como el <a href="http://plato.stanford.edu/entries/abstract-objects/">nihilismo metafísico</a>, el <a href="http://en.wikipedia.org/wiki/Acosmism">acosmismo</a> o el <a href="http://en.wikipedia.org/wiki/Philosophy_of_mathematics#Mathematical_monism">monismo matemático</a>.
La primera de estas posturas establece que podría darse el caso de que no existiera ningún objeto. El acosmismo acepta únicamente la existencia de “el Absoluto” (signifique lo que signifique eso) y el monismo
matemático acepta únicamente la existencia de <a href="http://plato.stanford.edu/entries/abstract-objects/">objetos abstractos</a> matemáticos, posición adoptada por algunos nihilistas metafísicos. Las críticas son variadas y aunque en mi opinión ninguna tiene sentido, la más convincente podría ser la del nihilismo metafísico (que puedes leer <a href="http://en.wikipedia.org/wiki/Metaphysical_nihilism">aquí</a>).</p>
<p>Podríamos seguir considerando las posiciones filosóficas realistas, anti-realistas, quasi-realistas… pero mejor nos quedamos aquí. Incluso en los axiomas más básicos, en los principios más fundamentales sin los cuales no podríamos tener ningún tipo de conocimiento existen disputas sobre su veracidad o su necesidad. ¿Significa esto que debemos abrazar el relativismo postmoderno y añadir un par de críticas más a la lista?
En mi opinión tan sólo debemos justificar nuestras posturas con solidez para poder tener verdaderos debates, aunque también ignorar las críticas sin significado (una vez hayan sigo analizadas). Cuestionar lo que nos permite cuestionar es un ejercicio inútil y contradictorio y, la cruda realidad es que el mundo avanza gracias a estos pilares tan cuestionados.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:nota1" role="doc-endnote">
<p>La interpretación semántica de la lógica <em>difusa</em> puede ser distinta. <a href="https://web.archive.org/web/20180417181939/http://nafips.ece.ualberta.ca/nafips08/docs/Zadeh_NAFIPS08.pdf" title="Is There a Need For Fuzzy Logic?">Algunos autores</a> sugieren que la lógica difusa debe interpretarse como la probabilidad de que una proposición sea cierta. <a href="#fnref:nota1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:nota2" role="doc-endnote">
<p>Si quieres leer algo más sobre la critica hegeliana al principio de identidad, puedes hacerlo <a href="https://web.archive.org/web/20121021191307/http://www.proyectohermeneutica.org/pdf/conferencias/jr_rosales.pdf">aquí</a>. En mi opinión no es más que verborrea sin sentido, pero hay gente para todo, vaya. <a href="#fnref:nota2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
#ViolenceisViolence2014-05-29T10:17:48+00:00https://codual.github.io/2014/05/29/violenceisviolence
<div class="message">
Este post se publicó originalmente en otro blog que ya no existe y lo publico aquí para que siga estando disponible.
No he revisado el contenido y es posible que no esté de acuerdo parcial o totalmente con el mismo.
</div>
<p>Hace una semana, la <a href="http://www.mankind.org.uk/" title="Mankind Initiative">Iniciativa Mankind</a>, publicó <a href="http://www.youtube.com/watch?v=u3PgH86OyEM">este vídeo</a>.
El vídeo se ha extendido viralmente y tiene más de 5 millones de
visitas. A raíz de una serie de conversaciones en Twitter
me pareció interesante recopilar las razones por las que la campaña
probablemente sea un montaje, y por qué la estadística que aparece al
final del video también es engañosa.</p>
<p>En primer lugar, es muy difícil que se haya podido grabar con cámaras
ocultas en la zona del vídeo. Además, la zona es concurrida y los
actores aparecen con la misma ropa, en el mismo lugar, lo cual ya
<a href="http://blogs.elpais.com/autopsia/2014/05/los-tramposos-y-su-v%C3%ADdeo-trampa-hombres-al-borde-de-un-ataque-de-nervios.html">resulta algo sospechoso</a>.</p>
<p>Pero lo importante no es esto. Lo importante es que esta situación es
muy improbable. Hay un efecto sociopsicológico llamado <a href="https://en.wikipedia.org/wiki/Diffusion_of_responsibility" title="Diffusion of responsibility - enWiki">‘difusión de la responsabilidad’</a>,
observado en estudios como los de <a href="https://en.wikipedia.org/wiki/Bystander_effect" title="Bystander effect - Wikipedia">Darley - Latané</a> (que mencionó <a href="https://twitter.com/Aphrabh">@<span class="u-linkComplex-target">Aphrabh</span></a>)
por el cual es muy improbable que las mujeres que aparecen en el vídeo
salieran a defender a la chica, dado el alto número de personas que
había presentes. Así que la situación parece algo inverosímil.</p>
<p>El vídeo pretende justificar la lucha contra la violencia doméstica, y,
en palabras de la organización, <a href="https://web.archive.org/web/20130725181703/https://www.mankind.org.uk/aboutus.html">“Eliminar la política de género de la cuestión del abuso doméstico y asegurar que tanto los hombres como las mujeres víctimas sean tratados por igual”</a> (como apuntó <a href="https://twitter.com/510nm/status/471929461382713345">@510nm</a>). Para
ello, intenta mostrar con una estadística de la <em>Office for National Statistics</em> que no existe mucha diferencia entre la violencia doméstica sufrida por hombres y por mujeres.</p>
<p>Investigando un poco, la fuente de la estadística parece ser
<a href="http://www.ons.gov.uk/ons/publications/re-reference-tables.html?edition=tcm%3A77-328149">esta</a> (Appendix Tables, tabla 4.03). Sin embargo, el abuso doméstico del que
habla esta estadística no es el producido de mujeres a hombres, como da
a entender el vídeo. En el documento define la violencia doméstica como
situaciones de acoso, amenazas etc. ejercidas por “pareja o familia”. Es
decir, que aquí se cuenta la violencia de padres a hijos, la violencia
en parejas no heterosexuales y, en general, las agresiones recibidas por
un familiar, que son un conjunto mucho más amplio al de la violencia
mujer-hombre. Además, otras estadísticas<sup id="fnref:link" role="doc-noteref"><a href="#fn:link" class="footnote" rel="footnote">1</a></sup> (compartidas por <a href="https://twitter.com/Judg2/status/471941040556236800">@<span class="u-linkComplex-target">Doszak</span></a> o estas<sup id="fnref:link:1" role="doc-noteref"><a href="#fn:link" class="footnote" rel="footnote">1</a></sup>compartidas por <a href="https://twitter.com/laguiri">@laguiri</a>), parecen negar lo que afirma el vídeo: la violencia de hombres a mujeres es mucho más frecuente que la inversa.</p>
<p><strong>TL;DR</strong> El vídeo es engañoso y pretende apoyarse en estadísticas que
no afirman lo que aparece al final de éste. La organización detrás del
vídeo parece tener intenciones antifeministas que niegan la
discriminación y opresión que sufren las mujeres.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:link" role="doc-endnote">
<p>El link no está disponible <a href="#fnref:link" class="reversefootnote" role="doc-backlink">↩</a> <a href="#fnref:link:1" class="reversefootnote" role="doc-backlink">↩<sup>2</sup></a></p>
</li>
</ol>
</div>
El argumento ontológico2013-12-23T16:24:24+00:00https://codual.github.io/2013/12/23/argumento-ontologico
<div class="message">
Este post se publicó originalmente en otro blog que ya no existe y lo publico aquí para que siga estando disponible.
No he revisado el contenido y es posible que no esté de acuerdo parcial o totalmente con el mismo.
</div>
<p>El <em>argumento ontológico</em> es quizás uno de los argumentos más simples
que apelan a la existencia de un ser supremo, pero que en algunos casos
tiene una refutación más compleja. Ha tenido diversas variaciones a
través de la evolución de la filosofía, y aquí vamos a centrarnos en la
versión de Gödel que es <a href="https://en.wikipedia.org/wiki/Validity">válida</a>.</p>
<p>Este argumento, en general, se expone como lo siguiente (<em>versión
libre</em>):</p>
<ol>
<li><em>Dios</em> es el ser con todas las características positivas.</li>
<li>La existencia es una característica positiva.</li>
<li>Si <em>Dios</em> no existiera, entonces no tendría todas las
características positivas.</li>
<li><em>Dios</em> existe.</li>
</ol>
<p>El desarrollo del argumento por autores anteriores como Anselmo de
Canterbury o Descartes<sup id="fnref:nota1" role="doc-noteref"><a href="#fn:nota1" class="footnote" rel="footnote">1</a></sup>, similar al argumento mostrado
arriba, es normalmente refutado con la objeción que realiza Russell
mediante su <em>teoría de la descripción</em>. Russell lo reinterpreta de la
siguiente forma:</p>
<ol>
<li>El ser con todas las características positivas tiene todas las
características positivas.</li>
<li>La existencia es una característica positiva.</li>
<li>El ser con todas las características positivas existe.</li>
</ol>
<p>Lo importante de esta reformulación es (1), porque según la <em>teoría de
la descripción</em> esta proposición asume la existencia de ese
ser.</p>
<p>Tomemos la proposición “<em>El actual rey de Francia es calvo</em>”. Según Russell esta frase equivale a afirmar:</p>
<ol>
<li>Existe un <strong>x</strong> tal que <strong>x</strong> es <em>el actual rey de Francia</em>.</li>
<li>Para todo <strong>x</strong> y para todo <strong>y</strong>, si <strong>x</strong> es <em>el actual rey de
Francia</em> e <strong>y</strong> es <em>el actual rey de Francia</em> entonces <strong>x</strong>=<strong>y</strong>
(<em>El actual rey de Francia</em> es único)</li>
<li>Para todo <strong>x</strong> que es <em>el actual rey de Francia</em>, <strong>x</strong> es calvo.</li>
</ol>
<p>Queda claro entonces que la proposición es falsa porque (1) es falso (Francia no tiene rey en la actualidad). De la misma forma en el argumento ontológico, su primera proposición asume la existencia de Dios, por lo que el argumento es circular. El texto original de Russell se encuentra <a href="https://en.wikisource.org/wiki/On_Denoting" title="On Denoting - enWikisource">aquí</a>.</p>
<p>Kurt Gödel reformuló esta prueba en lógica modal,
a través de la cual presenta su argumento.
No voy a exponer este argumento porque mis conocimientos de lógica modal no son los
suficientes como para hacerlo, pero si queréis entender la prueba os
remito a la entrada sobre la misma de <a href="http://francis.naukas.com/2013/11/03/la-demostracion-de-godel-de-la-existencia-de-dios" title="La demostración de Gödel de la existencia de Dios">Francis</a>,
en Naukas o a la de <a href="https://web.archive.org/web/20130422043126/http://sas.uwaterloo.ca/~cgsmall/ontology.html" title="Kurt Gödel's Ontological Argument">Christopher Small</a>.</p>
<p>Basta decir que esta prueba evita los razonamientos circulares y no
define la existencia como una propiedad (crítica que realiza Kant), sino
que toma como propiedad que es necesaria la existencia de Dios. Este
argumento es válido, pero ¿Qué significa esto? ¿Los ateos están
equivocados? ¿Los Macbooks tienen poderes divinos<sup id="fnref:nota3" role="doc-noteref"><a href="#fn:nota3" class="footnote" rel="footnote">2</a></sup> y con
ellos podemos <a href="https://abcnews.go.com/Technology/computer-scientists-prove-god-exists/story?id=20678984" title="Computer Scientists 'Prove' God Exists">demostrar que Dios existe</a>?</p>
<p>Pues no tiene por qué. La observación del mundo nos lleva a
preguntarnos por el <em><a href="https://en.wikipedia.org/wiki/Problem_of_evil" title="Problema del mal - enWiki">problema del mal</a></em>. Así, nos quedamos con tres posibilidades:</p>
<ol>
<li>Existe una solución al <em>problema del mal</em>, <em>Dios</em> existe y se
corresponde con el Dios del teísmo clásico.</li>
<li>Las propiedades positivas de las que habla Gödel no se corresponden
con las que normalmente pensamos (ya que no resolvemos el <em>problema
del mal</em>) y <em>Dios</em> no se corresponde con el Dios del teísmo
clásico.</li>
<li>Las propiedades positivas no existen y <em>Dios</em> no existe.</li>
</ol>
<p>Asumir que las propiedades positivas de las que Gödel habla en un
“sentido moral-estético o en un sentido de pura atribución” existen es
una presunción un tanto arriesgada, y por otra parte estas son impuestas
por axiomas, así que <em>Dios</em> podrá ser lo que queramos, dependiendo de
los axiomas que escojamos. El argumento ontológico se queda pues en un
juego lógico que depende de los axiomas que escojamos, y que por tanto
no tiene interés para resolver el problema de la existencia de Dios.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:nota1" role="doc-endnote">
<p><em>The Skeptical Philosopher</em> tiene una introducción a los argumentos de <a href="http://skepticalphilosopher.blogspot.com.es/2008/07/anselms-proof-of-gods-existence.html" title="Anselm's Proof of God's Existence">Anselmo</a> y <a href="http://skepticalphilosopher.blogspot.com.es/2008/08/descartes-ontological-argument.html" title="Descartes & the Ontological Argument">Descartes</a> en su blog, así como de las refutaciones que hacen <a href="http://skepticalphilosopher.blogspot.com.es/2008/08/kant-russels-objections-to-ontological.html" title="Kant & Russel's Objections to Ontological Argument">Kant, Russell</a> y <a href="http://skepticalphilosopher.blogspot.com.es/2008/08/hume-why-you-cant-prove-thing-exists.html" title="Hume & why you can't prove a thing exists except by experience">Hume</a>. <a href="#fnref:nota1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:nota3" role="doc-endnote">
<p>Todo el asunto de la demostración de Dios con un MacBook no es más que una lectura sensacionalista de <a href="http://arxiv.org/pdf/1308.4526v4.pdf" title="Formalization, Mechanization and Automation of Gödel’s Proof of God’s Existence">este artículo</a>. En el se habla de cómo es posible demostrar este argumento mediante un programa de <em><a href="https://en.wikipedia.org/wiki/Automated_theorem_proving" title="Automated theorem proving -enWiki">Automated theorem proving</a></em>, con el objetivo de mostrar que el tratamiento de la lógica por ordenador puede llevarnos hacia una nueva filosofía. Pero de probar la existencia de Dios poco eh. <a href="#fnref:nota3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>