miércoles, 10 de noviembre de 2010

C Ecuación de segundo grado

Laboratorio

Descripción del problema:
Encontrar la solución a una ecuación de segundo grado.
Dada la ecuación de segundo grado ax²+bx+c=0, se calcula el discriminante
disc=b²-4ac
Si el discriminante es mayor que 0 las dos raíces son reales y distintas
x1=(-b+√disc)/(2a)
x2=(-b-√disc)/(2a)
Si el discriminante es igual a 0, entonces las dos raíces son reales e iguales y se calculan:
x1=x2=-b/2
Y si el discriminante es menor que 0, entonces las dos raíces son complejas conjugadas y se calculan:
xr=-b/2a xi= (√-disc)/2a

Código en C
Para empezar a realizar este programa primero se escribe #include<stdio.h> que es la libreria estándar del lenguaje de programación C, enseguida se hace llamada a la libreria<stdio> , que será utilizada en el programa para utilizar funciones ya definidas como la raíz cuadrada, y el la potencia.
Ahora abrimos la función principal del programa int main(int argc, char** args), y se declararan todas las variables que voy a utilizar.

Significado de las variables:
a es el coeficiente de x²
b es el coeficiente x
c es la constante de la ecuación
disc es el valor del discriminante
x1 y x2 representan el valor de las raíces reales
xi es la raíz compleja imaginaria
xr la raíz compleja real

Después de haber declarado las variables, ahora pedimos al usuario el valor de a, b y c, para poder obtener el valor del discriminante, pero con la condición de que el valor de a no sea 0, si es así se pide volver a introducir el valor de a haciendo uso del bucle while.

#include<stdio.h>
#include<math.h>

int main(int argc, char** args){
float a, b, c, disc, x1, x2, xi, xr;
printf("\n\t\tSolucion de una ecuacion de segundo grado");
printf("\n\t\t_________________________________________\n\n\n");
printf("\t\t\tEscribe el valor de a --> ");
scanf("%f", &a);
while(a==0){
printf("\t\tEl valor de a no puede ser 0 ingrese el valor de nuevo -->");
scanf("%f", &a);
}
printf("\t\t\tEscribe el valor de b --> ");
scanf("%f", &b);
printf("\t\t\tEscribe el valor de c --> ");
scanf("%f", &c);


Para obtener el valor del discriminante se utilizó la función pow(), que cumple la función de elevar un numero a una determinada potencia, la forma de escribirse es pow(base, exponente).
Después se utilizo la estructura condicional if para determinar si el valor del disc es mayor que 0, entonces entra a la condición y se efectúan las operaciones correspondientes para obtener x1 y x2.

Si no se cumple esa condición entonces entra a otro condicional para saber si disc es igual a 0, y se lleva acabo la operación indicada, si el disc no es igual a 0 entonces el valor del discriminante pasa realizar la operación correspondiente.

Por último para terminar el programa se cierran los las estructuras condicionales y la función principal main.

disc=pow(b, 2.0)-4*a*c;
if(disc>0.0){
printf("\t\t\tLas dos raices son reales");
x1=((-b+sqrt(disc))/(2.0*a));
x2=((-b-sqrt(disc))/(2.0*a));
printf("\n\t\t\tx1=%.2f x2=%.2f", x1, x2);
}
else{
if(disc==0.0){
x1=(-b)/(2.0*a);
printf("\n\t\t\tLa ecuacion solo tiene una raiz %.2f", x1);
}
else{
xr=(-b/(2.0*a));
xi=(sqrt(-disc)/(2.0*a));
printf("\n\t\tLa raiz real es %.2f y la imaginaria es %.2f", xr, xi);
}
}
printf("\n\n\t\t\t");
}


Programa ejecutado, donde el discriminante es:

Mayor que 0:


Menor que 0:


Igual a 0:


Y este es el código para descargar:
ecuacion.c

Lenguaje C Fracciones

Materia: Lenguajes de Programación

Hola compañeros en esta entrada voy a explicarles un código que recuerdo lo hicimos en alguna clase de la materia Taller de Programación, en este código en C utilizo typedef struct, se trata de un programa que suma, resta, multiplica y divide fracciones.
Lo voy a ir explicando bloque por bloque luego ya lo junto todo.

Primero que nada incluyo la librería estándar y defino la estructura de el tipo de dato que se llama FRAC y a su vez contiene dos variables de tipo short que se ve algo así:
#include<stdio.h>
typedef struct {
short numerador;
short denominador;
}FRAC;
después defino una función setvalue que va a regresar un dato tipo FRAC y va a entrar en ella dos variables llamadas a y b que corresponden al numerador y al denominador, esta función sirve para saber si la fracción con la que quiero trabajar es correcta, porque si llegara tener un 0 en el denominador pues no se puede acer ninguna suma, resta multiplicación o division con ella, para esto dentro la función tengo un if que me ayuda a identificar el denominador y si el denominador no es 0 pues devuelve la variable tipo FRAC correctamente pero si es 0 manda un mensaje de error y regresa un valor equivocado.
FRAC setvalue(int a, int b){
FRAC ar;
if(b!=0){
ar.denominador=b;
ar.numerador=a;
return(ar);
}
printf("Entonces el valor no existe");
ar.numerador=-1;
ar.denominador=1;
return(ar);
}
Ahora esta función que aunque es muy pequeña es de gran utilidad para poder mostrar las fracciones de esta forma numero1/numero2, recibe una variable tipo FRAC llamada ar, de ar obtiene el numerador(ar.numerador) y el denominador(ar.denominador) y los coloca de la forma ar.numerador/ar.denominador, la función no regresa nada porque lo único que hace es dar formato a la impresión.
void toprint (FRAC ar){
printf("%d/%d", ar.numerador, ar.denominador);
return;
}
Y ahora viene la parte matemática
Defino la función mult que va a recibir dos tipo FRAC de entrada que son a y b y va a regresar otro tipo FRAC al que llamé ar. Para obtener la multiplicación de una fracción se tiene que multiplicar el numerador1 por el numerador2 y el denominador1 por el denominador2, bueno en código es igualito, tengo que entra FRAC a, en dónde obviamente a tiene su denominador(a.denominador) y su numerador(a.numerador), lo mismo pasa con b(b.numerador y b.denominador), entonces hay que obtener el valor de FRAC ar, es decir el valor de ar.numerador y ar.denominador, para esto se multiplica a.numerador*b.numerador y esto es igual a ar.numerador, y a.denominadorr*b.denominador y esto es igual a ar.denominador, se ve largo pero esto es en realidad muy simple, este es el código:
FRAC mult(FRAC a, FRAC b){
FRAC ar;
ar.numerador=a.numerador*b.numerador;
ar.denominador=a.denominador*b.denominador;
return(ar);
}

Lo mismo para la división, bueno tomando en cuenta que para la división se multiplica el numerador1*denominador2 y el numerador2*denominador1, la forma de implementarlo en ódigo es:

FRAC div(FRAC a, FRAC b){
FRAC ar;
ar.numerador=a.numerador*b.denominador;
ar.denominador=a.denominador*b.numerador;
return(ar);
}
Y la suma y resta de fracciones ya no es tan directa, pero tampoco es la gran cosa, la fórmula para sumar fracciones es multiplicar el numerador1 por el denominador2 y sumarle la multiplicación de el numerador2 por el denominador1 y esto es el numerador resultante y el denominador se obtiene de multiplicar el denominador1 por el denominador2, esto obviamente es de la manera más fácil, no simplificada, el código en C queda así:

FRAC suma(FRAC a, FRAC b){
FRAC ar;
ar.numerador=a.numerador*b.denominador+b.numerador*a.denominador;
ar.denominador=a.denominador*b.denominador;
return(ar);
}

Y para la resta es lo mismo:

FRAC rest(FRAC a, FRAC b){
FRAC ar;
ar.numerador=a.numerador*b.denominador-b.numerador*a.denominador;
ar.denominador=a.denominador*b.denominador;
return(ar);
}
Ahora la función principal el main que va llamara todas estas funciones que ya explique, bueno primero definí tres variables tipo FRAC las dos primera son los datos de entrada en las funciones de los que tanto he hablado, y la otra es el resultado, en los primeros renglones del main podemos ver la llamada la función multiplicar que primero que nada le da valores a las dos fracciones con las que estaremos trabajando, después evalúa con la función setvalue para saber si es el denominador no es 0, enseguida llama a la función de multiplicar para obtener el resultado, la ya lo que sigue es la forma de imprimirlo con la función toprintf que definí arriba, que me permite usar "/" para que se puedan ver como fracciones en la pantalla, despues uso otro print aunque este ya depende si es multiplicación, dimisión, suma o resta bueno en este caso es la multiplicación entonces escribo un "*" .
 int main(void){
FRAC nomvar1, nomvar2, nomvar3;
nomvar1=setvalue(1,3);
nomvar2=setvalue(1,2);
nomvar3=mult(nomvar1, nomvar2);
printf("\n\t");
toprint(nomvar1);
printf(" * ");
toprint(nomvar2);
printf(" = ");
toprint(nomvar3);

/*todo lo que sigue es lo mismo*/
FRAC n1, n2, n3;
n1=setvalue(1,3);
n2=setvalue(1,2);
n3=div(n1, n2);
printf("\n\t");
toprint(n1);
printf(" / ");
toprint(n2);
printf(" = ");
toprint(n3);


FRAC m1, m2, m3;
m1=setvalue(1,3);
m2=setvalue(1,2);
m3=suma(m1, m2);
printf("\n\t");
toprint(m1);
printf(" + ");
toprint(m2);
printf(" = ");
toprint(m3);

FRAC p1, p2, p3;
p1=setvalue(1,3);
p2=setvalue(1,2);
p3=rest(p1, p2);
printf("\n\t");
toprint(p1);
printf(" - ");
toprint(p2);
printf(" = ");
toprint(p3);

printf("\n\n\n");
system("pause");
}



La muestra de la ejecución del código:



Por sí alguien lo quiere descargar:
fracciones.c

Cualquier duda, corrección, etc. comenten.

Símbolo mayor y menor que en html

Materia: Lenguajes de Programación

Hola compañeros son muy pocos quienes han subido entrada sobre C, sin embargo ya a varios les he hecho la misma observación, cuando queremos subir el código en C al blog obviamente este incluye una librería <stdio.h>, que por casualidad la librería esta entre el signo de "menor que(<)" y el de "mayor que(>)", y digo casualidad porque de esa misma manera se encierran las etiquetas de html, es por eso que aveces cuando copiamos y pegamos el código en el blog nuestro editor html "piensa" que es una etiqueta y como no esta cerrada simplemente la elimina, o algunas veces escribe algo así </stdio.h>, eso significa que html quiere "corregir" el error de que la supuesta etiqueta no este cerrada.

Lo que quiero decir es esto, en vez de que copien el código directamente en el editor html del blog:

# include <stdio.h> // necesario para utilizar printf()

int main(void)
{
printf("Hola Mundo\n");
// return 0 implícito en C99 para main().
}

deben de modificarlo antes de esta manera para cuidar esos detalles:


# include &lt;stdio.h&gt; // necesario para utilizar printf()

int main(void)
{
printf("Hola Mundo\n");
// return 0 implícito en C99 para main().
}


Espero chequen la entrada, para que puedan evitar ese problema en el blog, ya que por esos pequeños detalles aveces si queremos copiar el código rápido y compilarlo pues no funciona :D.

lunes, 8 de noviembre de 2010

Lenguajes Lógicos Reporte

El problema lógico que elegí en clase es el siguiente:

Missing Fish
Two fathers took their sons fishing.
Each man and son caught one fish, but when they returned to camp there were only 3 fish. How could this be?
(None of the fish were eaten, lost, or thrown back.)

Dos padres con sus hijos fueron de pesca.
Cada hombre y su hijo atraparon un pez, pero cuando regresaron al campamento solo había tres pescados ¿Cómo puede ser esto?
(Ninguno de los peces se comieron, murió o escapó).

Bueno este problema es más que lógico capcioso ya que en un principio se presta a pensar que tenemos 2 padres y 2 hijos lo que da un total de 4 personas y si cada una atrapo un pez, pues lo lógico es que hayan 4 peces, sin embargo solo hay tres.

Entonces hay que pensar el problema con más detenimiento desde el principio textualmente el poblema dice: "Dos padres con sus hijos fueron de pesca.", lo cual no quiere decir forzosamente que son 4 personas, porque?... porque nos dice que hay dos padres y dos hijos sin embargo no especifica si hay o no parentescos entre ellos, por eso podemos hacer la suposición de que es posible que haya por ahi un truco en el que un hijo pueda ser papá a la vez, y así tener 2 hijos y 2 papás, pero solo son tres personas.

Ahora podemos llegar a la solución del problema diciendo que si dos hijos y dos padres se fueron de pesca y sólo hay tres pescados no hay porque alarmarse ya que cada quíen tiene su propio pescado :D, tenemos el PAPÁ el HIJO(que también es papá) y el otro hijo.

En términos de programación no me fué tan fácil expresarlo primero que nada hice un árbol con parentesco de padres con hijos:

padre_de(pedro,jose).
padre_de(pedro,luis).


padre_de(jose,daniel).
padre_de(jose,hector).

padre_de(luis,carlos).
padre_de(luis,simon).
padre_de(luis,edgar).

padre_de(edgar,lalo).

y aquí ahora debo de encontrar todas las combinaciones posibles en las que podemos involucrar padre_de(A,B), padre_de(C,D) dónde A es diferente de C y D es diferente de B y obtener así las combinaciones(X,Y,Z) dónde esta combinación me dará como resultado tres personas en las que se va a cumplir el razonamiento que expuse anteriormente, sin dar la pista clave del problema.
Pero no se aún como plantearlo en Prolog :/, antes de esto mi código era el siguiente:

padre_de(pedro,jose).
padre_de(pedro,luis).


padre_de(jose,daniel).
padre_de(jose,hector).

padre_de(luis,carlos).
padre_de(luis,simon).
padre_de(luis,edgar).

padre_de(edgar,lalo).

combinacion(X,Y,Z):-padre_de(X,Y),padre_de(Y,Z).

..pero aquí no dejo que prolog razone el problema y ecuentre el truco aunque me da todas las combinaciones de tres personas.

Bueno espero me comenten y si hayan alguna solución a mi código me lo digan :D, ya estuve viendo en los blogs y nadie tiene algo parecido :S, encontré en el grupo de la Doctora Sara un blog en el que resolvían el problema pero creo que esta mal la forma en que lo plantearon en prolog.

domingo, 7 de noviembre de 2010

Otro Lógico

Materia Lenguajes de Programación

1. SILENCIO. Si Ángela habla más bajo que Rosa y Celia habla más alto que Rosa, ¿habla Ángela más alto o más bajo que Celia?

Este problema lo podemos analizar rápidamente teniendo las siguientes proposiciones:
Ángela habla más bajo que Rosa.
Celia habla más alto que Rosa.

Acomodando por las que hablan mas bajo tenemos:
Angela habla más bajo que Rosa,
Rosa habla más bajo que Celia,
y como Angela habla más bajo que Rosa y Rosa habla más bajo que Celia tenemos que Angela habla más bajo que Celia,

Teniendo entonces este orden desde la que habla más bajo a la que habla mas alto:
Angela,
Rosa,
Celia

Entonces la respuesta es que Angela habla más bajo que Celia.

Este es el código en prolog habla.pro con la función alto(X,Y), se obtienen las combinaciones o también podemos sustituir directamente el nombre de Angela o Celia para contestar la pregnta directamente.

Ejecución:


Fuente del problema
LÓGICA-http://platea.pntic.mec.es/jescuder/logica.htm

Prolog-Laboratorio

Hola compañeros para la semana de Lenguajes lógicos de laboratorio voy a realizar dos programas en Prolog que ví en mi materia de matemáticas discretas:

El primero:

¿Qué persona es cuñado de quién? Si se tienen los siguientes parentescos:
Pedro es hermano de Luis,
Luis es el esposo de Ana,
Antonio es el esposo de Elsa y
Juan es el hermano de Luis,
Carlos es el hermano de Juan,
Elsa es hermana de Luis y
Elsa es esposa de Antonio.

Bueno el problema esta un poquito confuso por tantos parentescos pero basta con hacer un arbolito para despejar dudas :D:

Analizando:

Por hermanos
Pedro es hermano de Luis,
Juan es el hermano de Luis,
Carlos es el hermano de Juan,
Elsa es hermana de Luis (Elsa tambien es hermana de Pedro, juan y Carlos)

Por esposos
Luis es el esposo de Ana,
Antonio es el esposo de Elsa y
Elsa es esposa de Antonio.

Para encontrar los cuñados se sabe que si tenemos cuñados "a", "c" , "a" debe de tener un esposo que es "b", y "b" tiene un hermano "c" que será el cuñado de "a".

cuñados(a,c):-esposo(b,a),hermano(b,c).
Este es mi código en prolog:

%hermano(A,B)
hermano(luis,pedro).
hermano(luis,juan).
hermano(luis,carlos).
hermano(luis,elsa).
hermano(juan,carlos).
hermano(elsa,luis).
hermano(elsa,pedro).
hermano(elsa,juan).
hermano(elsa,carlos).

%esposo(A,B)
esposo(luis,ana).
esposo(elsa,antonio).

cunados(A,C):-esposo(B,A),hermano(B,C).


Resultado:
Tenemos que Ana es cuñada de Pedro, Juan, Carlos y Elsa y Antonio es cuñado de Pedro, Luis, Juan y Carlos. Y estas son todas las combinaciones que me da el programa:


El segundo:

Un estudiante de ingeniería piensa lo siguiente:
Si estudio aprobaré el examen de cálculo integral, pero si hago la tarea también. El estudiante quiere realizar las dos cosas y piensa estudiaré o hare la tarea. Demuestre que cualquiera de las dos decisiones le ayudará a aprobar el examén de cálculo integral.

En este problema es muy fácil plantear la tabla de verdad puesto que tenemos 4 combinaciones posibles, el mismo problema me dice que si estudia aprueba, si hace la tarea aprueba, y si hace las dos estudiar y la tarea tambien aprueba, entonces la única manera de que repruebe es que ni estudie ni haga la tarea, esta relación se representa por medio del operador lógico OR "o" o "v", bueno la tabla de verdad queda de la siguiente forma:

T = Tarea
E = Estudia
V ="VERDADERO"
F = "FALSO"

E v T Resultado
V o V V
V o F V
F o V V
F o F V

Ese es el razonamiento del problema con su código en prolog que cuando escribimos algunas de las posibilidades el programa me dice ciero o falso si esque aprueba o no:
pasa(est,tar).
pasa(est,notar).
pasa(noest,tar).
p_exam(X,Y):-pasa(X,Y).

Y la captura de pantalla:



Con el primero problema lógico no batalle nada, pero para este último no estoy del todo segura de que mi código sea correcto, tarde mucho pero no se de que otra forma plantearlo espero comenten y me puedan ayudar con el :D

Lenguajes Lógicos Prolog

Materia: Lenguajes de Programación

Alain Coulmerauer y Philippe Roussel iniciaron en 1970 el desarrollo de Prolog quienes tuvieron como finalidad desarrollar un lenguaje en el que se pudieran hacer deducciones a partir de texto. Prolog viene de "PROgramming LOGic"(programación lógica), fue desarrollado en Francia en 1972.
En 1972 se llevo acabo la primera implementación de Prolog usando el compilador ALGOL W de Wirth concluyendo las características básicas del lenguaje actual en 1973. El uso de este lenguaje creció muy rápido entre quienes se dedicaban a la programación lógica, se daba a conocer principalmente por experiencias personales de quienes lo usaban y no por la comercialización de producto.
El uso de este lenguaje se extendió hasta los años 80's, pero la falta de aplicaciones eficaces de Prolog han impedido su crecimiento.

Prolog es el lenguaje más popular en la categoría de programación lógica, Prolog no es un lenguaje como los que hemos visto anteriormente para usos generales, más bien esta orientado a llegar a la solución del problema a través del cálculo de predicados.

Sus aplicaciones vienen de dos distintos caminos:
  • Preguntas a bases de datos: Las bases de datos nos dan relaciones entre los elementos que están guardando en las bases de datos, sin embargo no todas las relaciones se pueden indicar, podemos usar Prolog para obtener las relaciones que no están indicadas explícitamente, pero si se dan los datos necesarios para obtener las relaciones implícitas.
  • Pruebas matemáticas: Es posible también dar las especificaciones para pruebas matemáticas con una serie de reglas y poder así hacer un modelo para generar pruebas de teoremas.

Para Prolog se tienen que especificar datos y dejar que la computadora dedujera la secuencia de ejecución para esa solución, a diferencia de los demás lenguajes en los que especificamos el algoritmo que soluciona el problema.

Por ejemplo se tiene la siguiente información de una línea aérea:

vuelo(numero_de_vuelo, ciudad_origen, ciudad_destino, hora_salida, hora_llegada)

los vuelos de Monterrey a Guadalajara se pueden especificar como:

vuelo(numero_de_vuelo, Monterrey, Guadalajara, hora_salida, hora_llegada)

Aquí un ejemplo más completo tomando el anterior pero ahora se quiere obtener una parada intermedia entre dos vuelos se tiene la ciudad de origen del primero vuelo y la cuidad de destino del segundo vuelo, entonces no se especifica el algoritmo pero si se dicen las condiciones que debe cumplir la solución:

vuelo(vuelo1, Monterrey, X, salida1, llegada1),
vuelo(vuelo2, X, Guadalajara, salida2, llegada2),
sale2>=llegada1+30

La X indica esa ciudad intermedia que se esta buscando y que debe de cumplir con el requisito de tener un vuelo que provenga de Monterrey y un vuelo que vaya para Jalisco además de que la hora de salida del segundo vuelo sea mayor o igual a la hora de llegada del primer vuelo más 30 minutos.
Estos datos son más que suficientes para que Prolog pueda encontrar la solución al problema.

Los programas en Prolog se componen por una serie de hechos relacionados y un conjunto de reglas. Prolog solicita entradas al usuario, el usuario debe introducir una pregunta y los hechos y reglas que mencioné anteriormente son utilizados para determinar cuales preguntas son ciertas de acuerdo a la base de datos.

Cuando el usuario escribe alguna pregunta o el nombre de una función se regresa "yes" o "no" dependiendo de la verdad o falsedad de la pregunta, se introduce ";" para obtener el siguiente conjunto de valores que corresponden con la pregunta hasta que ya no hay mas valores que satisfacen la pregunta y se imprime "no" y se espera a la nueva pregunta, el cambio de renglón indica que ya no se quieren ver más resultados. Prolog tiene una sintaxis y semántica muy simples ya que busca relaciones entre una serie de objetos, la variable y la lista son estructuras de datos de Prolog.
Los comentarios en Prolog se hacen con /*...*/ igual que en C.

Aunque Prolog ha obtenido gran éxito al resolver problemas que relacionan bases de datos y algunos otros campos, la función original con la que fue creada de obtener soluciones sin especificar detalles algoritmos no se alcanzo realmente.


Referencias:
Pratt, T.W., & Zelkowitz, M.W. (1998). Lenguajes de programación. Pearson, Prentice Hall.

Cálculo lambda

Materia : Lenguajes de Programación

Fue introducido en los 30's por Alonzo Church y Stephen Kleene con el objetivo de dar una teoría general de las funciones es un sistema formal diseñado para definir funciones, la forma de utilizarlas y la recursión. El cálculo lambda influye en lenguajes funcionales como Lisp, Haskell y ML. Es utilizado como un fundamento de lenguajes de programación porque aporta una sintaxis básica de programación, la semántica para el concepto e función en la transformación de argumentos en resultados y una forma de definir primitivas de programación.

El calculo lambda es el lenguaje de programación mas pequeño consiste en transformación simple(sustituir variables) y en definir funciones. El calculo lambda se puede decir que es equivalente a las máquinas Turing porque es capaz de evaluar y expresar cualquier función computable. Church había querido hacer un sistema formal completo para modelizar la matemática pero después separo el calculo lambda y lo ideo para que estudiara la computabilidad.

El calculo lambda usa objetos llamados lambda-términos:
v
λv.E1
(E1 E2)
  • v es un nombre de variable, E1 Y E2 son lambda términos y λv.E1 se llaman abstracciones v es el parámetro formal y E1 es el cuerpo de la abstracción.
  • λv.E1 es una función que recibe v como valor para sustituir y devuelve el valor de E1 para cada ocurrencia de
  • (E1 E2) son llamados aplicaciones esta forma representa la llamada a la función E1 recibiendo como argumento E2.

Sintaxis del calculo lambda:

<término> ::= <variable> |
λ<variable> . <término> |
( <término> <término> )

En donde λ es la lista de argumentos y es el cuerpo de la abstraccion funcional, la sintaxis que mostré anteriormente representa una función con un solo argumento, con mas argumentos se puede representar como :
λx1. λx2. .... λxn. M

El sistema necesita que la aplicaron funcional y su resultado puedan ser evaluadas como expresiones que representen el mismo valor
(M N) = R
La regla Beta permite producir expresiones que sean equivalentes de la siguiente forma: "la manera de sustituir en el cuerpo de la abstracción funcional cada ocurrencia de la variable que hace de argumento nominal por el argumento efectivo de la aplicación funcional correspondiente.", la forma de representarlo es a siguiente:

(λx .M N) = [N/x] M

La parte de (λx .M N) se puede interpretar como sustituir la N todas las veces que ocurre x en M.


Referencias

martes, 2 de noviembre de 2010

Grabar el escritorio

Hola compañeros, para el próximo reporte necesitamos grabar un vídeo, en esta entrada les muestro un programa que podría ser una buena opción para grabar el escritorio de la computadora y nuestra voz para dar la explicación aunque esto de la voz puede ser opcional.

Primero hay que descargar el programa "gtk-recordMyDesktop":

sudo apt-get install gtk-recordmydesktop

sudo apt-get install recordmydesktop



ya que esta instalado lo veremos en Applications>Sound&Video>gtk-recordMyDesktop


Ahora podemos probar el programa, así se ve cuando lo abrimos:


Cuando queremos empezar a grabar presionamos el botón Record, podemos ver que esta grabando porque en la parte de derecha, arriba del escritorio aparece un botón tipo "play":


Para parar la gradación presionamos ese botón "stop" y el programita deja de grabar el escritorio:

Lo guardamos:



Y ahora tenemos nuestro archivo en un formato no muy cómodo(.ogv) para lo que nosotros necesitamos que es subirlo a you tube, lo que a mi me paso cuando sube un archivo en este formato a you tube fue que solo se escuchaba pero no se veía nada, entonces ahora tendremos que convertirlo a ..avi con este formato no habrá ningún problema.

Ahora para convertir el archivo instalamos:

sudo apt-get install mencoder


Una vez instalado podemos convertir nuestro video.ogv a .avi con la siguiente instrucción en el terminal:

mencoder -idx mivideo.ogv -ovc lavc -oac mp3lame -o mivideo.avi

Esta es la captura de pantalla convirtiendo el proyecto.ogv a prueba.avi:


Y aquí esta el vídeo con el nuevo formato:


Este es un vídeo que grabé con este programa:

Espero les sirva, cualquier duda, corrección o lo que sea pueden comentarlo :D
Doctora me gustaría que esta entrada fuera para puntos extras para la materia si es que así lo considera.


NOTA: Esta entrada fué corregida con la ayuda de mi amiga Gemma quien se dio cuenta que me faltaba de agregar un comando para descargar otro paquete necesario, :D gracias Gemiwis!

lunes, 1 de noviembre de 2010

Scheme

Laboratorio

Scheme
Es un lenguaje de programación funcional y dialecto de Lisp fue creado por Guy L. Steele y Gerald Jay Sussman en los años 70's. La filosofía de Scheme es minimista, es decir, solo contiene lo esencial quitando los elementos sobrantes.
Fue el primer dialecto en Lisp, también fue uno de los primeros lenguajes de programación con continuaciones explicitas, y tiene también gestión automática de memoria igual que Erlang a esto se le llama recolección de basura con esto se quiere decir que es un mecanismo implícito de gestión de memoria(me gustaría hablar de ello en mi siguiente entrada).
La estructura básica del lenguaje son las listas.
Scheme se llamaba originalmente Schemer pero como en el sistema operativo ITS que es el que usaban sus autores, se limitaba la longitud del nombre a 6 caracteres.

Algunas ventajas y desventajas
No necesita reglas de precedencia porque carece de operadores, utiliza la notación prefija para las llamadas a las funciones, Scheme facilita la programación funcional, no tiene variables globales ni efectos secundarios.
Algunas funciones tienen nombres que son comunes de usar para nombrar variables esto provoca errores comunes.

Ahora algunos ejemplos:

Primero que nada instalar Scheme..
sudo apt-get install mit-scheme
Este es un ejemplo de un programa que imprime un triángulo, le agregué algunos comentarios con ";" para explicar las líneas:

(define (T) ;lo que hacemos con esta función es la figura con la que se ;llenara el triángulo
(display "*"))

(define (dibuje cant) ;esta funcion me dibuja los "*" pasando un espacio :entre ellos
(do ((i 0 (+ i 1)))
((= i cant) )
(t)
(display " ")))

(define (triangulo) ;y esta es la que me dibuja el triangulo aquí defino ;que el tamaño sea de 10 *'s
(do ((i 1 (+ i 1)));observa como se hace el ciclo :D
((= i 10) )
(dibuje i);llamada a la funcion
(newline)));pasa renglon

Este ejemplo lo obtuve de una pagina de Internet aunque tenia algunos errores o no estaba completo ya que donde puse display " ", tenia una función que llamaron espacio, pero no estaba declarada, me parece mucho mas sencillo solo poner " " directo y no declarar otra función llamada espacio, bien esta es la página.

El programa se guarda con la extensión .scm y se compila con el comando (load "programa"), esta es la ejecución del programa:


Y uno que realicé con varias funciones:
(display "Hola elige alguna función")
(display "Raiz, suma, cuadrado, potencia o resta")
(define(raiz X)(sqrt X))
(define(cuadrado X)(* X X))
(define(suma X Y)(+ X Y))
(define(potencia X Y)(expt X Y))
(define(resta X Y)(- X Y))
Ejecución:


Estos son algunos sitios que consulté antes de hacerlo: