<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Apuntes</title>
	<atom:link href="http://www.metonymie.com/apuntes/feed" rel="self" type="application/rss+xml" />
	<link>http://www.metonymie.com/apuntes</link>
	<description>I blinded her with science!</description>
	<pubDate>Wed, 15 Oct 2008 09:27:14 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Resumen de sintaxis de Punteros en C</title>
		<link>http://www.metonymie.com/apuntes/2008/10/15/resumen-de-sintaxis-de-punteros-en-c.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/10/15/resumen-de-sintaxis-de-punteros-en-c.html#comments</comments>
		<pubDate>Wed, 15 Oct 2008 08:47:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Apuntes]]></category>

		<category><![CDATA[c]]></category>

		<category><![CDATA[punteros]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=27</guid>
		<description><![CDATA[Resumen de punteros en C para referencia rápida.]]></description>
			<content:encoded><![CDATA[Copiado directamente de K &amp; R.
<pre><code>
	int x = 1, y = 2, z[10];
	int *ip; /* ip es un puntero a int */

	//Se usa &amp;var para referenciar a la dirección de la variable a la que se quiere apuntar
	ip = &amp;x; /* ip apunta a x */

	//Se usa *puntero para referenciar el valor de la dirección a la que apunta el puntero
	y = *ip; /* y es ahora 1 ( el valor de x) */

	*ip = 0; /* x es ahora 0 */

	ip = &amp;z[0]; /* ip ahora apunta a z[0] */
</code></pre>
<h3>Un ejemplo de una función que toma punteros como parámetros</h3>
<pre><code>
void swap( int *px, int *py) {
	int temp;

	temp = *px;

	*px = *py;

	*py = temp;
}
</code></pre>
Llamando a la función y pasando los valores por referencia
<pre><code>
	swap(&amp;x, &amp;y);

	printf("\n");
	printf("%d %d\n", x, y);
	//Imprime 1, 0
</code></pre>
Que pasa si imprimo un puntero directamente sin usar * ?
<pre><code>
....
test1(&amp;x, &amp;y);
....

void test1( int *px, int *py) {
	//Imprime 1 0
	printf("%d %d\n", *px, *py);
	//Imprime la dirección de x y casteada a Int
	printf("%d %d\n", px, py);
}
</code></pre>
<h3>Arreglos, Punteros y aritmética de punteros</h3>
<pre><code>
#include 

int main() {
	int a[10], x;
	int *pa;
	//Relleno el array a con [0-9]
	for( x=0; x&lt;10; x++ ) {
		a[x] = x;
		printf(&#8221;%d\n&#8221;, a[x]);
	}

	pa = &amp;a[0];
	//pa es ahora un puntero que apunta a la primer dirección del arreglo

	printf(&#8221;%d %d\n&#8221;, a[7], *(pa+7) );
	//Imprime 7 7.. porque luego de pa= &amp;a[0], a[i] es igual a *(pa + i)
}
</code></pre>
<h3>Punteros y funciones</h3>
<pre><code>
//Toma como parámetro 2 punteros a char
int strlen( char *s, char *t) {
	while((*s++ = *t++) != '\0');
}
....

//Función que devuelve un apuntador a int
int *f();
</code></pre>
<h4>Referencias</h4>
<a class="amazon" href="http://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/">The C Programming Language</a>, Segunda Edición; Kernighan, Ritchie; Prentice Hall Hispanoamerica, 1991]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/10/15/resumen-de-sintaxis-de-punteros-en-c.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Macros en C</title>
		<link>http://www.metonymie.com/apuntes/2008/09/21/macros-en-c.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/09/21/macros-en-c.html#comments</comments>
		<pubDate>Sun, 21 Sep 2008 10:28:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[c]]></category>

		<category><![CDATA[macros]]></category>

		<category><![CDATA[pre-procesamiento]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=26</guid>
		<description><![CDATA[Apunte de Macros en C]]></description>
			<content:encoded><![CDATA[Los Macros (asi como los includes) se manejan en el preprocesador de C que es un paso anterior separado de la compilación.  Y permiten basicamente la definición de un termino que será remplazando siempre en el momento de la compilación por la expresión que se defina. El ejemplo típico es la definición de constantes, ej:
<pre><code>
#define MAX_SIZE 1000
</code></pre>
<h3>Macros con Variables</h3>
También pueden usarse Macros con variables, ej:
<pre><code>
#include &lt;stdio.h>
#define max(A, B) ((A) &gt; (B) ? (A):(B))
int main() {
	int x = 20;
	int y = 10;
	int z;

	//Gets transformed to z = ((x + y) &gt; (y - 10) ? (x + y):(y - 10));
	z = max(x + y, x - 10);
	//prints 30
	printf("%d\n", z);

	//Gets transformed to z = ((++x) &gt; (++y) ? (++x):(++y);
	z = max( ++x, ++y);
	// ++ is doubly evaluated
	//So x and y are doubly incremented
	//prints 22
	printf("%d\n", z);

}
</code></pre>
<strong>Nota: </strong> Hay que tener cuidado con los efectos secundarios que se pueden causar ver ejemplo de ++x
<h4>Cuidado con comerse los parentesis y los efectos secundarios que se pueden causar</h4>
<pre><code>
#include &lt;stdio.h>
#define square(x) x * x
#define square_works(x) (x) * (x);

int main() {
	int x = 20;
	int y = 10;
	int z;

	//Gets transformed to z = x + y * x + y
	//And because of precedence order is z = x + (y * x) + y
	z = square(x + y);
	//prints 230
	printf("%d\n", z);

	//Gets transformed to z = (x + y) * (x + y)
	z = square_works(x + y);
	//prints 900
	printf("%d\n", z);

}
</code></pre>
Para desdefinir un Macro se puede usar <code class="inline">undef</code> y se puede usar ( también para includes o defines ) estructuras condicionales con if, ej:
<pre><code>
#if SYSTEM_BITS == 64
	#define MAX_SIZE = 2^63
#elif
	#define MAX_SIZE = 2^31
#endif
</code></pre>
<h4>Referencias</h4>
<a class="amazon" href="http://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/">The C Programming Language</a>, Segunda Edición; Kernighan, Ritchie; Prentice Hall Hispanoamerica, 1991]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/09/21/macros-en-c.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Alcance de Variables en C</title>
		<link>http://www.metonymie.com/apuntes/2008/09/20/alcance-de-variables-en-c.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/09/20/alcance-de-variables-en-c.html#comments</comments>
		<pubDate>Sat, 20 Sep 2008 08:05:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[c]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=25</guid>
		<description><![CDATA[Apunte sobre el alcance de las diferentes declaraciones de variables en C.]]></description>
			<content:encoded><![CDATA[Este post es similar en temática a mis posts de <a href="http://www.metonymie.com/codewerks/category/oop">OOP</a> y <a href="http://www.metonymie.com/codewerks/2008/05/23/javascript-global-variables-weirdness.html">Javascript Global Variables Weirdness</a> salvo que sobre C.
<h3>Variables Automáticas</h3>
Se utilizan dentro del contexto de un bloque de código. Se inicializan y destruyen cuando termina el código de ese bloque. El típico ejemplo es las variables dentro de una función.
<pre><code>
int main() {
	double i;
	.......
	my_function();
	....
}
int my_function() {
	int i = 15;
	......
}
</code></pre>
En este ejemplo, la variable <code class="inline">i</code> de la función <code class="inline">my_function</code> es independiente de la <code class="inline">i</code> de la función <code class="inline">main</code>.
<h3>Variables Globales</h3>
Son accesibles y compartidas por todas las funciones definidas dentro de un archivo. Ej:
<pre><code>
#include &lt;stdio.h>
int i = 0;
int main() {
	printf("%d ", i);
	i++;
	my_function();
	printf("%d ", i);
}
int my_function() {
	printf("%d ", i);
	i = 15;
}
</code></pre>
Imprime
<pre><code>
0 1 15
</code></pre>
<h3>Variables Externas</h3>
Si se quiere utilizar una variable global definida en un archivo externo, es necesario declararla usando <code class="inline">extern</code> . Ej:
<h4>Archivo vars-1.c</h4>
<pre><code>
int i = 15;
</code></pre>
<h4>Archivo vars-2.c</h4>
<pre><code>
#include &lt;stdio.h>
extern int i; 

int main() {
	printf("%d ", i);
	i++;
	printf("%d ", i);
	return 1;
}
</code></pre>
<strong>Nota:</strong> Para compilar múltiples archivos ver <a href="http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html">Compiling multiple source files</a>. En este caso se uso:  <code class="inline">gcc -Wall vars-1.c vars-2.c -o "vars"</code>

Se podría haber usado la variable dentro de un bloque de código, por ejemplo una función, para lo que es necesario hacer un archivo de header:
<h4>Archivo vars.h</h4>
void my_function();
<h4>Archivo vars-1.c</h4>
<pre><code>
int i = 15;
char ch = 'a';
</code></pre>
<h4>Archivo vars-2.c</h4>
<pre><code>
#include &lt;stdio.h>
#include "vars.h"
extern int i; 

int main() {
	printf("%d ", i);
	i++;
	printf("%d ", i);
	my_function();
	return 1;
}
void my_function(){
	extern char ch;
	printf("%c ", ch);
}
</code></pre>
El archivo de header solamente tiene el prototipo de la función.
<h3>Variables Estáticas</h3>
Hace que una variable global limita su alcance al archivo en el que esta declarada. Por otro lado usada, dentro de una función, mantiene su valor en las diferentes llamadas a la función. El ejemplo típico es una función recursiva:
<pre><code>
#include &lt;stdio.h>
void my_function( int a );
int main() {
	my_function(0);
	printf("\n");
	my_function( 10 );
}
void my_function( int a ) {
	static int i;
	int b = 10;
	i += a;
	printf("| %d - %d |\t", i);
	i++;
	b++;
	if( i &lt; 5 ) my_function( 0 );
}
</code></pre>
Devuelve:
<pre><code>
| 0 - 10 |	| 1 - 10 |	| 2 - 10 |	| 3 - 10 |	| 4 - 10 |
| 15 - 10 |
</code></pre>
<strong>Nota: </strong> Las variables estáticas se inicializan en 0.

<strong>Nota: </strong> Cada vez que se llama a una función sus variables no estáticas se inicializan de cero , incluso cuando se llama a esta función recursivamente ( se crea un espacio de memoria nuevo para guardar sus variables automáticas para cada invocación de la función ). Esto se ejemplifica claramente por el comportamiento de la variable <code class="inline">b</code>.
<h3>Algunas conclusiones</h3>
Fue muy interesante ver esto, sobre todo al especular sobre como desarrollar un programa a gran escala sobre C. Por ejemplo, se podría considerar a un archivo con sus funciones definidas y sus variables globales propias ( no accesibles para otros archivos ) como un proto-objeto donde sus variables globales son sus atributos y sus funciones son sus métodos. Ahora, como la única forma de acceder a una variable de otro archivo-proto-objeto es a través de extern, se vuelve hyper evidente lo complicado que se transforma desarrollar arquitecturas complejas lidiando con esto. Repentinamente el paradigma OOP se transforma en MARAVILLOSO después de pensar un poco en esto!!!!
<h3>Algunos agregados más</h3>
Existe la opción <code class="inline">register</code> al declarar una variable para guardarla directamente en los registros de la maquina si va a ser muy utilizada.

Se puede declarar un array de la siguiente forma!!
<pre><code>
int primos[] = { 2 , 3 , 5 , 7, 11 , 13 }
</code></pre>
<h4>Referencias</h4>
<a class="amazon" href="http://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/">The C Programming Language</a>, Segunda Edición; Kernighan, Ritchie; Prentice Hall Hispanoamerica, 1991]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/09/20/alcance-de-variables-en-c.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Operadores Bitwise ( a nivel del Bit ) en C</title>
		<link>http://www.metonymie.com/apuntes/2008/09/12/operadores-bitwise-a-nivel-del-bit-en-c.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/09/12/operadores-bitwise-a-nivel-del-bit-en-c.html#comments</comments>
		<pubDate>Fri, 12 Sep 2008 08:00:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Apuntes]]></category>

		<category><![CDATA[c]]></category>

		<category><![CDATA[k &amp; R]]></category>

		<category><![CDATA[operaciones bitwise]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=24</guid>
		<description><![CDATA[Apunte de Operaciones a nivel de Bit en C]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas nuevas que aprendí en los primeros capítulos de <a href="http://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/" class="amazon">K &amp; R</a>, es la explicación de operaciones Bitwise. Lo cierto es que si bien sabia que existían como
nunca había tenido la necesidad de utilizarlas, nunca les preste atención. Este es un pequeño resumen por si las necesito a futuro.</p>

<h3>Operaciones &amp; , | , ~ y ^</h3>
<dl>
<dt>&amp; ( conjunción Lógica o multiplicación Booleana a nivel del bit ) </dt>

<dd>
Sean a, b dos cadenas de bits del mismo tamaño ( por ejemplo integer ). 
La operación  <code class="inline">a &amp; b</code> realiza una operación de Conjunción Lógica sobre cada uno de los bits de ambas cadenas, 
devolviendo una nueva cadena de bits de tamaño equivalente a a,b con un 1 en la posición donde tanto a como b tenian un 1 y un 0 en cualquier otro caso. Ej: 
<pre><code>
a     = 10010101 
b     = 00110100
a &amp; b = 00010100
</code></pre>
</dd></dl>
<dl>
<dt>| ( disyunción Lógica o suma Booleana a nivel del bit ) </dt>
<dd>

La operación <code class="inline">a | b</code> devuelve un 1 en la posición donde a o b ( o ambos ) tienen un 1 y un 0 cuando ambas tienen cero. Ej: 
<pre><code>
a     = 10010101 
b     = 00110100
a | b = 10110101
</code></pre>
</dd></dl>

<dl>
<dt>~ ( negación Lógica a nivel del bit ) </dt>
<dd>Sea a una cadena de bits. La operación <code class="inline">~a</code> invierte los 1s y 0s de a. Ej: 
<pre><code>

a  = 10010101 
~a = 01101010
</code></pre>
</dd></dl>

<dl>
<dt>^ ( Disyunción exclusiva Lógica a nivel del bit ) </dt>
<dd>
La operación <code class="inline">a ^ b</code> devuelve un 1 en la posición donde a o b ( pero no ambos ) tienen un 1 y un 0 cuando ambas tienen 0 o ambas tienen 1. Ej: 
<pre><code>
a     = 10010101 
b     = 00110100
a ^ b = 10100001
</code></pre>
</dd></dl>

<h3>Operaciones &lt;&lt; y &gt;&gt;</h3>
<dl><dt>Operación &lt;&lt; </dt>
<dd>Sea a una cadena de bits, n un entero, <code class="inline">a &lt;&lt; n</code>, devuelve la misma cádena movida n bits a la izquierda ( perdiendose los primeros n bits de la cadena )
y reemplazando las n posiciones a la derecha por 0. Ej:
<pre><code>
a      = 10010101 
a &lt;&lt; 2 = 01010100
</code></pre>

</dd>
</dl>
<dl><dt>Operación &gt;&gt; </dt>
<dd>Sea a una cadena de bits, n un entero, <code class="inline">a &gt;&gt; n</code>, devuelve la misma cadena movida n bits a la derecha ( perdiéndose los últimos n bits de la cadena )
y reemplazando las n posiciones a la izquierda por 0. Ej:
<pre><code>
a      = 10010101 
a &gt;&gt; 3 = 00010010
</code></pre>
</dd>
</dl>

<h3>Algunos Usos y Ejemplos</h3>
<h4>Multiplicación por 2<sup>n</sup></h4>
<p>Por propiedades de los números binarios, se cumple que agregando n 0s a la derecha es equivalente a multiplicar este mismo número por 2<sup>n</sup>. Ej:</p>
<pre><code>
int function multiplicar_por_exponente_de_2( int a, int power ) {
	return a &lt;&lt; power;
}
</code></pre>
<p><strong>Nota: </strong> Hay que cuidar el overflow de los datos considerando el tamaño de ints en nuestro sistema. Pero este no es un post sobre implementaciones de C.</p>

<h4>Cociente de dividir por 2<sup>n</sup></h4>
<pre><code>
int function cociente_de_exponente_de_2( int a, int power ) {
	return a &gt;&gt; power;
}
</code></pre>
<p><strong>Nota: </strong> Desde ya que esta función devuelve el cociente pero no el resto.</p>
<h4>Cociente y resto de dividir por 2<sup>n</sup></h4>

<pre><code>
unsigned int a, cociente, resto;
a = 757;
cociente = a &gt;&gt; 3;
resto =  (~((~0) &lt;&lt; 3)) &amp; a
</code></pre>
<p><strong>Nota: </strong> ~0 devuelve un int del tamaño del sistema con todos sus bits pasados a 1, al moverlo 3 posiciones a la izquierda se tiene todos 1s salvo los 3 últimos bits, al negar esto se obtiene todos 0s salvo los 3 últimos bits que nos sirven para obtener los valores que son el resto de la división.</p>
<h4>Representación en cadena binaria de un número</h4>
<pre><code>
void show_as_binary( int a, char str[]) {
	int x, size;
	size = (int)sizeof(b) * 8;
	for(x=0; x&lt;size; x++) {

		//This is necesary for a%2 might return -1 if a &lt; 0. 
		str[x] = &#8216;0&#8242; + ((a%2) &lt; 0 ? 1: (a%2) );
		a = a &gt;&gt; 1;
	}
	reverse(str);
}

</code></pre>
<h4>Representación en Octal de un número</h4>
<pre><code>
void show_as_octal( int a, char str[]) {
	int x, size;
	size = (int)sizeof(b) * 8;
	for(x=0; x&lt;size &amp;&amp; a!=0; x++) {
		str[ x ] = &#8216;0&#8242; + (a%8);
		a = a &gt;&gt; 3;
	}
	str[ x ] = &#8216;0&#8242;;
	reverse(str, (x+1));	

} 
</code></pre>
<h4>Uso de un int para múltiples flags</h4>
<p>Es una práctica común en Unix usar ints para pasar múltiples flags a funciones. Supongamos que necesito 4 flags distintos para una función o para lo que sea. Lo que puedo hacer es lo siguiente: </p>
<pre><code>
#define FLAG_A 1;
#define FLAG_B 2;
#define FLAG_C 4;
#define FLAG_D 8;

//Llamar a la función con FLAG_A y FLAG_D
call_function( FLAG_A | FLAG_D );

//Comparar si una variable tiene FLAG_B seteado
if( ( a &amp; FLAG_B ) == FLAG_B ) { ...

//Comparar si una variable no tiene FLAG_C seteado
if( ( ( a | FLAG_C ) != a ) { ... 

</code></pre>
<p>Lo interesante de esto es que al abstraernos de los ints y pensarlos como cadenas de bits, se pueden hacer operaciones de algebra de boole, donde cada bit toma un valor verdadero o falso, que nos sirve para evaluar colecciones de flags como colecciones de proposiciones booleanas. Ahorrándonos así de pasar un valor como argumento a la función para cada una. Ej:</p>
<pre><code>
//Comparar contra FLAG_A, FLAG_B y no FLAG_D
if ( ( ( a &amp; (FLAG_A | FLAG_B) ) == ( FLAG_A | FLAG_B ) ) &amp;&amp; ( ( a | FLAG_D ) != a ) ) { ...
</code></pre>
<p>Un ejemplo concreto es el uso de los permisos de archivos en linux.</p>

<p><code class="inline">chmod</code> toma un valor en octal que puede representarse así:</p>

<pre><code>

001<sub>2</sub> = 1<sub>8</sub> = x

010<sub>2</sub> = 2<sub>8</sub> = w

100<sub>2</sub> = 4<sub>8</sub> = r

</code></pre>

<p>De donde surgen sus relativas combinaciones, por ej:</p>

<pre><code>

011<sub>2</sub> = 3<sub>8</sub> = wx

110<sub>2</sub> = 6<sub>8</sub> = rw

111<sub>2</sub> = 7<sub>8</sub> = rwx

</code></pre>


<h3>Bonús. Ejercicios 2.6, 2.7 y 2.8 de K &amp; R</h3>

<h4>Ej 2.6</h4>
<p>Escriba una función <code class="inline">setbits( x,p,n,y )</code> que regresa x con los n bits que principian en la posición p iguales a los n bits más a la derecha de y, dejando los otros bits sin cambio.</p>
<pre><code>
//Ej 2.6
unsigned setbits(unsigned x, int p, int n, int y) {
	unsigned t, z;
	if(y &lt; n) { 
		perror("Error");
	} else {
		//All 0s except for the space that starts at y and has size n
		t = ~(~0&lt;&lt;n)&lt;&lt;(y-n);
		//Get the value of x in this position
		t = x &amp; t;
		//move the distance that p has from y
		t = t &lt;&lt; (p-y);
		//Set that same space to 0s in x, starting on p and with size n
		z = ~(~0&lt;&lt;n)&lt;&lt;(p-n);		
		x = x &amp; (~ z);
		//merge them
		t = x | t;
	}
	return t;
}

</code></pre>
<h4>Ej 2.7</h4>
<p>Escriba una función <code class="inline">invert( x,p,n )</code> que regresa x con los n bits que principian en la posición p invertidos, dejando los otros sin cambio.</p>
<pre><code>
//Ej 2.7
unsigned invert(unsigned x, int p, int n) {
	unsigned t, z;
	//All 0s except for the space that starts at p and has size n
	t = ~(~0&lt;&lt;n)&lt;&lt;(p-n);
	//Get the inverted value of x in this position
	z = (~x &amp; t);
	//merge them (first clean up x in the space that starts at p and has size n then merge with z)
	t = (~t &amp; x) | z;
	return t;
}
</code></pre> 

<h4>Ej 2.8</h4>
<p>Escriba una función <code class="inline">rightrot( x,n )</code> que regresa x rotado a la derecha n posiciones de bits.</p>
<pre><code>
//Ej 2.8
unsigned rightrot( unsigned a, int n) {
	unsigned t, mascara, x;
	t = 0;
	mascara = 1;
	for(x=0; x&lt;n; x++) {
		t = t &lt;&lt; 1;
		t = t | (mascara &amp; a);
		a = a &gt;&gt; 1;
	}
	return t;
}
</code></pre>]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/09/12/operadores-bitwise-a-nivel-del-bit-en-c.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ejercicio 4.7 de THRTLMP</title>
		<link>http://www.metonymie.com/apuntes/2008/09/10/ejercicio-47-de-thrtlmp.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/09/10/ejercicio-47-de-thrtlmp.html#comments</comments>
		<pubDate>Thu, 11 Sep 2008 04:01:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Teoría de Conjuntos]]></category>

		<category><![CDATA[lógica]]></category>

		<category><![CDATA[bertrand russell]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=23</guid>
		<description><![CDATA[Ejercicio 4.7 de The Haskell Road to Logic, Maths and Programming.]]></description>
			<content:encoded><![CDATA[<p class="Text">Se nos pide demostrar que siendo A un conjunto de conjuntos, el conjunto { x ∈ A | x ∉ x } ∉ A. Es interesante y por eso lo blogueo porque es una aplicación de la <a href="http://es.wikipedia.org/wiki/Paradoja_de_Russell">paradoja de Russell</a>. </p>


<h4 class="Subsection">Demostración</h4>

<p class="Text">Llamemos B al conjunto { x ∈ A | x ∉ x }. Supongamos que B ∈ A y consideremos a B con respecto a si mismo desde la relación ∈, o bien B ∈ B o bien B∉ B.  </p>

<p class="Text"> Supongamos que B ∈ B entonces por la propia definición de B, B ∉ B, lo cual es una contradicción. Ahora si  B ∉ B también por la definición de B sigue que B ∈ B, lo cual también es una contradicción. </p>

<p class="Text">Dado que nuestra premisa original nos lleva siempre a una contradicción, debe ser falsa, por consiguiente B ∉ A.</p>

<p class="Text">Es interesante también como este ejercicio sirve de introducción a los tipos y clases de Haskell.</p>]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/09/10/ejercicio-47-de-thrtlmp.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Teoría de Conjuntos ( Definiciones y Formulas Básicas )</title>
		<link>http://www.metonymie.com/apuntes/2008/09/10/teoria-de-conjuntos-definiciones-y-formulas-basicas.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/09/10/teoria-de-conjuntos-definiciones-y-formulas-basicas.html#comments</comments>
		<pubDate>Thu, 11 Sep 2008 03:56:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Apuntes]]></category>

		<category><![CDATA[Teoría de Conjuntos]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=22</guid>
		<description><![CDATA[Apunte de Definiciones básicas de Teoría de Conjuntos.]]></description>
			<content:encoded><![CDATA[<h3>Definiciones</h3>

<p>Conjunto: Colección de Objetos. A, B, C..<br/>Elemento: Objeto dentro de un conjunto. a, b, c.<br/>Representación por  extensión.<br/>A = {a, b, c, d}<br/>Representación por comprensión.<br/>A = {x | x &lt; 10 ∧ x &gt; -100}<br/>A = {x | Φ(x) }<br/>∈ pertenece a, es elemento de<br/><br/>∪ Union<br/>A ∪ B = {x | x ∈ A ∨ x ∈ B}<br/>∩ Intersección<br/>A ∩ B = {x | x ∈ A ∧ x ∈ B}<br/>A<sup>c</sup> Complemento<br/>A<sup>c</sup> = {x | x ∉ A}</p>



<h3>Equivalencias Basicas</h3>

<p>Doble negación<br/>A  = (A<sup>c</sup>)<sup>c</sup></p>

<p>Idempotencia<br/>A ∪ A = A<br/>A ∩ A = A</p>

<p>De morgan<br/>(A ∪ B)<sup>c</sup> = (A<sup>c</sup> ∪ B<sup>c</sup>)<br/>(A ∩ B)<sup>c</sup> = (A<sup>c</sup> ∩ B<sup>c</sup>)</p>

<p>Conmutativa<br/>(A ∪ B) = (B ∪ A)<br/>(A ∩ B) = (B ∩ A)</p>

<p>Asociativa<br/>(A ∪ B) ∪ C =  A ∪ (B ∪ C) <br/>(A ∩ B) ∩ C =  A ∩ (B ∩ C) </p>

<p>Distributiva<br/>A ∩ (B ∪ C)  = (A ∪ B)  ∩ (A ∪ C) <br/>A ∪ (B ∩ C)  = (A ∩ B)  ∪ (A ∩ C) </p>

<p>Absorción<br/>A ∩ (A ∪ B)  = A<br/>A ∪ (A ∩ B)  = A</p>





<h3>Universo, Conjunto Vacio</h3>

<p>U Universo<br/>∅ Conjunto Vacio</p>

<p>∅<sup>c</sup> = U<br/>U<sup>c</sup> = ∅</p>

<p>Dominancia<br/>U ∪ A = U<br/>∅ ∩ A = ∅</p>

<p>Identidad<br/>U ∩ A = A<br/>∅ ∪ A = A</p>

<p>Ley del medio excluido<br/>A ∪ A<sup>c</sup> = U </p>

<p>Contradicción<br/>A ∩ A<sup>c</sup> = ∅</p>




<h2>Inclusión, Inclusión estricta, Equivalencia, Resta, Diferencia simetrica</h2>


<h3>Definiciones</h3>

<p>⊆ Inclusión<br/>A ⊆ B = {x | x ∈ A =&gt; x ∈ B}<br/>⊂ Inclusión Estricta<br/>A ⊂ B &lt;=&gt; ∀x (x ∈ A =&gt; x ∈ B) ∧ ∃y (y ∈ B ∧ y ∉ A)<br/>= Equivalencia<br/>A = B &lt;=&gt; A ⊆ B ∧ B ⊆ A <br/>- Resta<br/>A - B = {x | x ∈ A ∧ x ∉ B}<br/>Δ Diferencia Simetrica<br/>A Δ B = {x | x ∈ A ∨ x ∈ B ∧ ¬ (x ∈ A ∧ x ∈ B) } = A ∪ B -(A ∩ B)<br/><br/>A, B son Disjuntos &lt;=&gt; A ∩ B = ∅<br/><br/>A<sup>c</sup> = U - A<br/></p>




<h2>Conjunto de Partes y Familias de Conjuntos</h2>


<h3>Definiciónes</h3>

<p>P(A) Conjunto de Partes<br/>X ∈ P(A) &lt;=&gt; X ⊆ A<br/>P(A) = {X | X ⊆ A}<br/><br/>Nota: ∀A( {∅} ∈ P(A) )</p>

<p>F, G Se usan para representar Familias de Conjuntos o o Colecciones de Conjuntos<br/>∪F = ∀x ( ∃y ( y ∈ F ∧ x ∈ y ) )<br/>∩F = ∀x ( ∀y ( y ∈ F -&gt; x ∈ y ) )</p>


<h3>Referencias</h3>
<p><a class="amazon" href="http://www.amazon.com/Haskell-Logic-Maths-Programming-Computing/dp/0954300696/">The Haskell Road To Logic, Math and Programming</a>; Doets, Van Eijck; King´s College London Publications; 2004</p>
<p><a class="amazon" href="http://www.amazon.com/How-Prove-Structured-Daniel-Velleman/dp/0521675995/">How to Prove It: A Structured Approach</a>; Velleman, Daniel; Cambridge University Press; 2006</p>
]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/09/10/teoria-de-conjuntos-definiciones-y-formulas-basicas.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Loops Elegantes</title>
		<link>http://www.metonymie.com/apuntes/2008/09/06/loops-elegantes.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/09/06/loops-elegantes.html#comments</comments>
		<pubDate>Sun, 07 Sep 2008 05:12:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[c]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=20</guid>
		<description><![CDATA[Post básico sobre el uso elegante de las expresiones en los for Loops .]]></description>
			<content:encoded><![CDATA[<p>Estoy en este momento estudiando <a href="http://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/" class="amazon">The C Programming Language</a>, más que nada como repaso de la sintaxis de C. Los ejercicios, aunque parecen básicos, son muy interesantes como problemas de programación.</p>
<p>En uno de los ejercicios se nos pide hacer una función <code class="inline"> reverse </code> que tome una cadena y la devuelva invertida. Mi solución rapida fue: </p>
<pre><code>
void reverse(char line[], int n) {
	int temp, i, j, t ;
	if( (n/2) == ((n+1)/2) ) {
		t = -1 ;
	} else {
		t = 0 ;
	} 

	j = (n/2) ;
	for(i=0 ; i &lt; j ; i++) {
		temp = line[i] ;
		line[i] = line[ (j*2)-i+t ] ;
		line[ (j*2)-i+t ] = temp ;
	}
	line[ n ] = &#8216;\0&#8242; ;
}
</code></pre>
<p>Pero en el cápitulo 3 dan la forma de codificarlo de los autores: </p>
<pre><code>
void reverse( char s[] ) {
	int c, i, j;
	for( i = 0, j = strlen(s)-1 ; i &lt; j ; i++, j&#8211; ) {
		c = s[i] ;
		s[i] = s[j] ;
		s[j] = c ;
	}
}
</code></pre>
<p>Me encanto como esta estructurado el loop, por el simple hecho de que no tengo la costumbre de hacer una doble inicialización y mucho menos un incremento y un decremento simultáneos en la tercera expresión del for. El código es super elegante y ahorra el problema y el exceso de código que tuve que poner en mi versión por si el tamaño de la cadena era impar o par.</p>
<h3>Por que no es buena práctica usar breaks en un loop.</h3>
<p>Además me di cuenta de lo siguiente, es una frase hecha que no es buena práctica usar breaks en un loop, el tema es que en realidad generalmente no es necesario ( salvo en casos especiales donde se necesita ejecutar algunas lineas de código antes de evaluar la condición del break ). Supongamos el siguiente codigo:</p>
<pre><code>
for( x=0 ; x &lt; n ; x++) {
	......
	.....
	if( condicion_de_break ) break ;
}
</code></pre>
<p>Se puede resolver más elegantemente de la siguiente forma:</p>
<pre><code>
for( x=0 ; x &lt; n &#038;&#038; !condicion_de_break ; x++) {
	......
	.....
}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/09/06/loops-elegantes.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Una Demostración con Incognitas</title>
		<link>http://www.metonymie.com/apuntes/2008/09/06/una-demostracion-con-incognitas.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/09/06/una-demostracion-con-incognitas.html#comments</comments>
		<pubDate>Sat, 06 Sep 2008 10:45:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[lógica]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=19</guid>
		<description><![CDATA[Lógica impecable.]]></description>
			<content:encoded><![CDATA[<p >Esta demostraci&oacute;n maravillosa que esta en el ejercicio 3.7.9 del libro  <a class="amazon" href="http://www.amazon.com/How-Prove-Structured-Daniel-Velleman/dp/0521675995/">How to Prove It: A Structured Approach</a>, que la transcribo directamente porque es fantástica.</p>

<p ><b>Teorema</b>: Existen 2 números Irracionales a,b tales que a<sup>b</sup> es racional.</p>

<p ><b>Demostraci&oacute;n</b>: O <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>

 <msup>
  <mrow>
   <mo>(</mo>
   <msqrt>
    <mn>2</mn>

   </msqrt>
   <mo>)</mo>

  </mrow>
  <msqrt>
   <mn>2</mn>
  </msqrt>
 </msup>

</math>es racional o es irracional.</p>

<p >Caso 1: Si es racional, ya se probo lo que queríamos probar porque <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>
 <msqrt>

  <mn>2</mn>
 </msqrt>
</math>es irracional y tomamos a=b=<math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>
 <msqrt>

  <mn>2</mn>
 </msqrt>
</math> .</p>

<p >Caso 2: Si es irracional entonces sea a = <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>
 <msup>
  <mrow>
   <mo>(</mo>

   <msqrt>
    <mn>2</mn>
   </msqrt>

   <mo>)</mo>
  </mrow>
  <msqrt>
   <mn>2</mn>

  </msqrt>
 </msup>
</math>y b = <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>
 <msqrt>

  <mn>2</mn>
 </msqrt>
</math>. Entonces podemos formar el numero <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>
 <msup>

  <mrow>
   <mo>(</mo>
   <msup>
    <mrow>

     <mo>(</mo>
     <msqrt>
      <mn>2</mn>

     </msqrt>
     <mo>)</mo>
    </mrow>
    <msqrt>

     <mn>2</mn>
    </msqrt>
   </msup>

   <mo>)</mo>
  </mrow>
  <msqrt>
   <mn>2</mn>

  </msqrt>
 </msup>
</math> = <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>

 <msup>
  <mrow>
   <mo>(</mo>
   <msqrt>
    <mn>2</mn>

   </msqrt>
   <mo>)</mo>

  </mrow>
  <mrow>
   <msqrt>
    <mrow>
     <mn>2</mn>
    </mrow>

   </msqrt>
   <mo>.</mo>

   <msqrt>
    <mn>2</mn>
   </msqrt>
  </mrow>
 </msup>
</math>= <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>

 <mrow>
  <msup>

   <mrow>
    <mo>(</mo>
    <msqrt>
     <mn>2</mn>
    </msqrt>
    <mo>)</mo>

   </mrow>

   <mn>2</mn>
  </msup>
  <mo>=</mo>
  <mn>2</mn>
 </mrow>
</math>. Como <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>

 <msqrt>

  <mn>2</mn>
 </msqrt>
</math>es irracional, <math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>
 <msup>
  <mrow>
   <mo>(</mo>
   <msqrt>

    <mn>2</mn>
   </msqrt>
   <mo>)</mo>
  </mrow>
  <msqrt>
   <mn>2</mn>
  </msqrt>

 </msup>
</math>es irracional por asumci&oacute;n de caso y 2 es racional, el Teorema queda demostrado.</p>

<p >Lo maravilloso es que llegamos a una demostraci&oacute;n rigurosa del teorema sin necesidad de saber si&nbsp;&nbsp;<math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>
 <msup>
  <mrow>
   <mo>(</mo>

   <msqrt>

    <mn>2</mn>
   </msqrt>
   <mo>)</mo>
  </mrow>
  <msqrt>
   <mn>2</mn>

  </msqrt>

 </msup>
</math>es irracional o no. Simplemente por exhaustaci&oacute;n de casos el teorema queda demostrado.<br /><b>Nota</b>: es irracional, lo que igual no quita lo maravilloso de la demostraci&oacute;n y lo impecable de su lógica.</p>




]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/09/06/una-demostracion-con-incognitas.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Alfabetos, Lenguajes y Gramáticas (Definiciones Básicas)</title>
		<link>http://www.metonymie.com/apuntes/2008/09/06/alfabetos-lenguajes-y-gramaticas-definiciones-basicas.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/09/06/alfabetos-lenguajes-y-gramaticas-definiciones-basicas.html#comments</comments>
		<pubDate>Sat, 06 Sep 2008 10:38:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Apuntes]]></category>

		<category><![CDATA[Lenguajes Formales]]></category>

		<category><![CDATA[Alfabetos]]></category>

		<category><![CDATA[Gramáticas]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=18</guid>
		<description><![CDATA[Apunte de Alfabetos, Lenguajes y Gramáticas. ]]></description>
			<content:encoded><![CDATA[<h3 >Alfabetos</h3>

<p ><font size="5"><b>&#931;</b></font><font size="4"><b> </b></font><b>: alfabeto</b>, Conjunto finito, no vacio de s&iacute;mbolos.</p>

<p ><b>Cadena: </b>sucesi&oacute;n de s&iacute;mbolos concatenados.</p>

<p ><font size="5">&#931;</font><font size="5"><sup>1</sup></font><font size="5"> = &#931;</font></p>

<p ><font size="5">&#931;</font><font size="5"><sup>n+1</sup>

</font><font size="5"> = { xy / x &#8712; &#931;, y &#8712; &#931;</font><font size="5"><sup>n</sup></font><font size="5"> } ;</font> donde <font size="4">x, y</font> son cadenas formadas por s&iacute;mbolos de <font size="4">&#931;</font>. <br /><b>Aclaraci&oacute;n:</b> en este caso <font size="4">x</font> representa una cadena formada por un solo s&iacute;mbolo de <font size="4">&#931;</font>. </p>

<p ><b>Ejs:</b> <br /><font size="5">&#931; = {a,b,c} =&gt; &#931;</font><font size="5"><sup>2</sup></font><font size="5"> = {aa, ab, ac, ba, bb, bc, ca, cb, cc }<br />aab &#8712; &#931;</font><font size="5"><sup>3</sup></font></p>


<h4 >Cardinalidad de un Alfabeto</h4>

<p ><font size="5">| &#931; | = 3&nbsp;&nbsp;=&gt; | &#931;</font><font size="5"><sup>2</sup></font><font size="5">| = 3</font><font size="5"><sup>2</sup></font><br /><br /><b>Generalizando:</b></p>

<p ><font size="5">| &#931; | = t&nbsp;&nbsp;=&gt; | &#931;</font><font size="5"><sup>n</sup></font><font size="5">| = t</font><font size="5"><sup>n</sup></font></p>



<h4 >Cadena Vacia</h4>

<p ><font size="5"><i>&lambda;</i></font>: Cadena o palabra vacia. Elemento neutro para la concatenaci&oacute;n de cadenas.</p>

<p ><b>Importante:</b> <font size="5">&#8704;&#931;:&nbsp;&nbsp;&#931;</font><font size="5"><sup>0</sup></font><font size="5">= { <i>&lambda;</i> }</font></p>



<h4 >Conjunto infinito de todas las cadenas que pueden formarse con un alfabeto</h4>

<p ><font size="5">&#931;</font><font size="5"><sup>*</sup></font><font size="5"> = </font><font size="5"><math xmlns='http://www.w3.org/1998/Math/MathML'
    
    
    display='inline'>
  <mrow>
  <munder>
   <mstyle minsize="2">
    <mover>
     <mo>⋃</mo>

     <mi>∞</mi>
    </mover>
   </mstyle>
   <mrow>
    <mi>n</mi>
    <mo>=</mo>
    <mn>0</mn>

   </mrow>
  </munder>
  <mstyle minsize="4">
   <mrow>
    <mi>Σ</mi>
    <mo>⁢</mo>
    <mpadded width="-0.1em">
     <msup>

      <mo> </mo>
      <mi>n</mi>
     </msup>
    </mpadded>
   </mrow>
  </mstyle>
 </mrow>
    
</math></font><font size="5">&nbsp;&nbsp;</font><font size="5"><br /></font><font size="5">| &#931; | = &#8734; </font></p>




<h3 >Cadenas y Concatenaci&oacute;n</h3>

<p >Se puede definir una cadena <font size="4"><b>W</b></font> sobre el alfabeto <font size="4"><b>&#931;</b></font> como: <font size="5">W = x</font><font size="5"><sub>1</sub></font><font size="5">x</font><font size="5"><sub>2</sub></font><font size="5">&#8230;..x</font><font size="5"><sub>n</sub></font><font size="5"> ; x</font><font size="5"><sub>i</sub></font><font size="5"> &#8712; &#931;</font> </p>


<h4 >Longitud de una cadena</h4>

<p ><font size="5">|| w || = n</font></p>



<h4 >Concatenaci&oacute;n</h4>

<p >Sean:<br /><font size="5">X = x</font><font size="5"><sub>1</sub></font><font size="5">x</font><font size="5"><sub>2</sub></font><font size="5">&#8230;..x</font><font size="5"><sub>n</sub></font><font size="5"> ; x</font><font size="5"><sub>i</sub></font><font size="5"> &#8712; &#931;<br />Y = y</font><font size="5"><sub>1</sub></font><font size="5">y</font><font size="5"><sub>2</sub></font><font size="5">&#8230;..y</font><font size="5"><sub>m</sub></font><font size="5"> ; y</font><font size="5"><sub>i</sub></font><font size="5"> &#8712; &#931;<br />=&gt; <br />XY = x</font><font size="5"><sub>1</sub></font><font size="5">x</font><font size="5"><sub>2</sub></font><font size="5">&#8230;..x</font><font size="5"><sub>n</sub></font><font size="5">y</font><font size="5"><sub>1</sub></font><font size="5">y</font><font size="5"><sub>2</sub></font><font size="5">&#8230;..y</font><font size="5"><sub>m</sub></font><font size="5">; &#8743; XY &#8712; &#931;<sup>n + m</sup></font></p>



<h4 >Propiedades de la Concatenaci&oacute;n</h4>

<p >1. Cerrada sobre si misma (Ley de Composici&oacute;n Interna)<br /><font size="5">&#931;</font><font size="5"><sup>*</sup></font><font size="5"> -&gt; </font><font size="5">&#931;</font><font size="5"><sup>*</sup></font><font size="5"> : </font><font size="5">&#931;</font><font size="5"><sup>*</sup></font></p>

<p >2. Asociativa<br /><font size="5">X(YZ) = (XY)Z</font></p>

<p >3. No Conmutativa<br /><font size="5">XY &#8800; YX</font></p>



<h4 >Longitud de una Concatenaci&oacute;n</h4>

<p ><font size="5">|| XY || = || X || + || Y ||; &#8704; X, Y &#8712; </font><font size="5">&#931;</font><font size="5"><sup>*</sup></font></p>



<h4 >Potencias de una cadena</h4>

<p ><font size="5">&#8704; X &#8712; </font><font size="5">&#931;</font><font size="5"><sup>*</sup></font><font size="5">:<br />X</font><font size="5"><sup>0</sup></font><font size="5"> = <i>&lambda;</i><br />X</font><font size="5"><sup>1</sup></font><font size="5"> = X<br />X</font><font size="5"><sup>2</sup></font><font size="5"> = XX<br />X</font><font size="5"><sup>n</sup></font><font size="5"> = XX<sup>n - 1</sup></font>

<font size="5"><br />|| X</font><font size="5"><sup>n</sup></font><font size="5">|| = n . || X ||</font></p>



<h4 >Prefijos, Sufijos</h4>

<p >sea <font size="4">W &#8712; </font><font size="4">&#931;</font><font size="4"><sup>*</sup></font><font size="4"> &#8743; W = XY</font> entonces <font size="4">X</font> es prefijo de <font size="4">W, Y</font> es sufijo de <font size="4">W</font>.<br />Si ad&eacute;mas:<br /><font size="4">Y &#8800; <i>&lambda;</i> =&gt; X </font>es prefijo propio de <font size="4">W</font><br /><font size="4">X &#8800; <i>&lambda;</i> =&gt; Y</font> es prefijo propio de <font size="4">W</font>&nbsp;&nbsp;</p>



<h4 >Subcadenas</h4>

<p >sea <font size="4">W &#8712; </font><font size="4">&#931;</font><font size="4"><sup>*</sup></font><font size="4"> &#8743; W = XZY</font> entonces <font size="4">Z</font> es subcadena de <font size="4">W</font>.</p>




<h3 >Lenguajes</h3>

<p >Sea <font size="4">&#931; &#8800; <i>&#966;</i>, L &#8838; </font><font size="4">&#931;</font><font size="4"><sup>*</sup></font> es un lenguaje sobre <font size="4">&#931;</font></p>

<p ><b>Importante:</b><font size="4"> <i>&#966;</i> &#8834; &#931; . <i>&#966;</i></font> es un lenguaje, llamado lenguaje Vacio. </p>



<h3 >Gram&aacute;tica</h3>

<p ><font size="4">G = (V, T, S, P) </font>es una gram&aacute;tica donde:<br /><font size="4">V</font>&nbsp;&nbsp;es un Alfabeto<br /><font size="4">T &#8834; V</font>, son los elementos terminales<br /><font size="4">S &#8834; V</font>, es el Start Symbol. O Simbolo de Comienzo.<br /><font size="4">P</font>, son las reglas de Producci&oacute;n.</p>



<h3 >Lenguaje generado por una gram&aacute;tica</h3>

<p >Todas las cadenas de elementos pertenecientes a <font size="4">T</font>, que pueden formarse a partir de las reglas de Producci&oacute;n <font size="4">P</font>. Se lo suele representar com <font size="4">L</font><font size="4"><sub>( G )</sub>

</font> .</p>


<h4 >Ejemplos</h4>


<h5 >1) L = { 1111<sup>n</sup>0<sup>n</sup> / n &#8712; N}. Lenguaje formado por todas las cadenas con prefijo 111 y luego una suseci&oacute;n de 10.</h5>

<p ><br /><font size="4">G = ( V,T,S</font><font size="4"><sub>0</sub></font><font size="4">,P )<br />V = {1,0,S}<br />T = {1,0}<br />S</font><font size="4"><sub>0</sub></font><font size="4"> = S<br />P:<br />S -&gt; S10</font><br /> <font size="4">S -&gt; 111S</font></p>



<h5 >2) L = Lenguaje formado por todas las cadenas con prefijo 111 y luego&nbsp;&nbsp;al menos un 1 o un 0 y luego una sucesi&oacute;n de 1s y 0s en cualquier orden. = {1110, 1111, 11101, 11100, 11110, 11111, &#8230;. }</h5>

<p ><font size="4">G = ( V,T,S</font><font size="4"><sub>0</sub></font><font size="4">,P )<br />V = {1,0,S,A,B}<br />T = {1,0}<br />S</font><font size="4"><sub>0</sub></font><font size="4"> = S<br />P:</font><br /><font size="4">AB -&gt; BA</font><br /><font size="4">BA -&gt; AB</font><br /><font size="4">A -&gt; 0</font><br /><font size="4">B -&gt; 1</font><br /><font size="4">S -&gt; SA</font><br /><font size="4">S -&gt; SB</font><br /><font size="4">S -&gt; 111S</font></p>



<h5 >3) L = Lenguaje que tiene la misma cantidad de 0s y 1s. = { <i>&lambda;</i>, 01, 10, 0011, 0110, 1100, 0101, 1010, &#8230;. }</h5>

<p ><font size="4">G = ( V,T,S</font><font size="4"><sub>0</sub></font><font size="4">,P )<br />V = {1,0,S, A, B}<br />T = {1,0}<br />S</font><font size="4"><sub>0</sub></font><font size="4"> = S<br />P:</font><br /><font size="4">AB -&gt; BA</font><br /><font size="4">BA -&gt; AB</font><br /><font size="4">A -&gt; 0</font><br /><font size="4">B -&gt; 1</font><br /><font size="4">S -&gt; SAB</font><br /><font size="4">S -&gt; <i>&lambda;</i></font><br /></p>



<h5 >Referencias</h5>

<p >Apuntes de Clase de Algebra y Matem&aacute;tica Discreta cursada en el segundo cuatrimestre de 2007 en la Universidad de Palermo dictada por Marcela Wilder.<br />Algebra Y Maten&aacute;tica Discreta, Gabriela Esper&oacute;n, Marcela Wilder, UP, 2007.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/09/06/alfabetos-lenguajes-y-gramaticas-definiciones-basicas.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ejercicio 3.42 de THRTLMP</title>
		<link>http://www.metonymie.com/apuntes/2008/08/04/ejercicio-3-42-de-thrtlmp.html</link>
		<comments>http://www.metonymie.com/apuntes/2008/08/04/ejercicio-3-42-de-thrtlmp.html#comments</comments>
		<pubDate>Mon, 04 Aug 2008 08:42:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[algebra]]></category>

		<category><![CDATA[lógica]]></category>

		<category><![CDATA[demostraciones]]></category>

		<category><![CDATA[números primos]]></category>

		<category><![CDATA[thrtlmp]]></category>

		<guid isPermaLink="false">http://www.metonymie.com/apuntes/?p=14</guid>
		<description><![CDATA[Resolución de los ejercicios 3.42 y 3.43 de The Haskell Road To Logic Math and Programming]]></description>
			<content:encoded><![CDATA[<p >Se nos pide demostrar si hay o no hay triplos de primos de la forma ( p , p+2, p+4 ) que no sean ( 3, 5, 7 ). Este ejercicio me gusto porque estuve unos 15 minutos pensando antes de poder resolverlo. Bueno, despues de mirar un poco la <a href="http://www.metonymie.com/apuntes/2008/08/04/lazy-evaluation-evaluacion-perezosa-en-haskell.html">Criba de Eratosthenes</a> y pensar en la aritmetica mod( 3 ) finalmente encontre la forma:</p>


<h4 >Demostraci&oacute;n</h4>

<p >Sabemos que p es primo por lo tanto no es multiplo de 3, o sea que es o de la forma 3k + 1 o 3k + 2 con k &#8712; Z. Supongamos que es de la forma 3k + 1, entonces p + 2 = 3k + 1 + 2 = 3 ( k + 1 ) entonces p + 2 es multiplo de 3 y no es primo. Ahora si es de la forma 3k + 2 entonces p + 4 = 3k + 2 + 4 = 3 ( k + 2) por lo que p + 4 es multiplo de 3 y no es primo. De lo que sigue que no existen triplos de primos de la forma ( p, p+2, p+4 ) salvo ( 3, 5, 7 ). </p>

<p >De manera similar puede resolverse el ejercicio 3.43, que es demostrar que siendo p primo, no existen primos de la forma ( p<sup>2</sup> + 2 ) &#8800; 11 o lo que es lo mismo con p &#8800; 3 .</p>



<h4 >Demostraci&oacute;n</h4>

<p >Si p es primo &#8800; 3 , entonces necesariamente no es multiplo de 3, o sea que es de la forma 3k + 1 o 3k + 2 con k &#8712; Z. Supongamos que es de la forma 3k + 1, entonces p<sup>2</sup> + 2 = ( 9k<sup>2</sup> + 6k + 1) + 2 = 3 ( 3k<sup>2</sup> + 2k + 1 ) , porque lo que es multiplo de 3 y no es primo. Supongamos entonces que es de la forma 3k + 2, entonces p<sup>2</sup> + 2 = ( 9k<sup>2</sup> + 12k + 4) + 2 = 3 ( 3k<sup>2</sup> + 4k + 2 ), multiplo de 3 y no primo. Por exhaustaci&oacute;n de casos, la proposici&oacute;n queda demostarda. </p>

<p >Bueno termine con el c&aacute;pitulo 3, si algui&eacute;n tiene la soluci&oacute;n del ejercicio 3.34 me har&iacute;a un favor enorme si me lo mandan porque estuve un buen rato y no lo pude resolver. Mierda, me gustar&iacute;a poder dedicarle m&aacute;s tiempo, pero si me cuelgo no avanzo m&aacute;s y quiero seguir aprendiendo Haskell.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.metonymie.com/apuntes/2008/08/04/ejercicio-3-42-de-thrtlmp.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
