lunes, 25 de octubre de 2010

.: Especialidades de Lenguajes Script :.

:: Especialidades de los lenguajes script ::



Materia. Lenguajes de Programación
Hora. M1 -M3 (Martes)

Que tal compañeros, estoy aquí de nuevo para informarles las acciones específicas o lo que se puede hacer con cada lenguaje script que vimos en le semana 3 de la clase ordinaria de Lenguajes de Programacion:



Awk
  • Modificar archivos.
  • Buscar y transformar bases de datos.
  • Generar informes simples.
  • Buscar un nombre particular en una carta.
  • Añadir un nuevo campo a una base de datos pequeña.
  • Realizar el tipo de funciones que proporcionan muchas de las herramientas de UNIX:
  • Buscar patrones (egrep)
  • Modificar archivos (tr o sed)
  • Especialmente diseñado para trabajar con archivos estructurados y patrones de texto.
  • Descomponer líneas de entrada de campos y comparar estos campos con patrones que se especifiquen.
Shell
  • Considerado como intérprete de comandos de Linux y su programación (programación Shell)
  • Es sólo un programa con el cual interactúan el usuario y el sistema operativo.
  • Generalmente se usa para agilizar los comandos de Shell sin la necesidad de estar escribiéndolos repetidamente.
Perl
  • Lenguaje interpretado orientado a búsqueda ,extracción y formateado de ficheros de tipo texto.
  • Muy usado para gestión y manejo de procesos (conteo, extracción de parámetros característicos…)
  • Combinación de las características de los lenguajes más usados por los programadores en UNIX como awk y Shell.
  • Su potencia se basa en la similitud con las mejores características del lenguaje estructurado C.
  • Cualquier utilidad de sh, awk o sed se puede implementar de una manera más potente y sencilla en Perl.
  • Construcción de pequeños programas que pueden usarse como filtros para ordenar información de ficheros, realizar búsquedas, etc.
PD. Significa que mis programas de Perl no los hice en base a su especialidad por lo que pude comprender con esta sección.


Python

Lenguaje de programación multiparadigma. Permite varios estilos de programación, como la programación:
  • Orientada a objetos.
  • Estructurada.
  • Funcional
  • Orientada a aspectos
TCL
  • Lenguaje script diseñado para integrarse en otras aplicaciones (como otros lenguajes scripts)
  • Soporta listas y arreglos, e implementa estructuras de control y llamadas a procedimientos
  • Tk es el toolkit de TCL para crear interfaces gráficas.
  • TCL/TK está diseñado para poder incorporarse como intérprete a otras aplicaciones
JavaScript
  • Lenguaje de tipo script compacto.
  • Basado en objetos y guiado por eventos
  • Diseñado específicamente para el desarrollo de aplicaciones para interactuar con la página Web. Hay una interacción cliente – servidor.
  • Se usa para pedir datos, confirmaciones, mostrar mensajes, crear animaciones, etc.
  • Ejemplos de uso de javascript: Tenemos a Hotmail, Facebook, etc.
Bibliografía

.: Lenguajes Lógicos (CO) :.

:: Caballos ::



Materia. Lenguajes de Programación

Hora. M1 -M3 (Martes)

Compañeros, aquí les presento el problema lógico que saque de una página aparte a la que estábamos viendo en clase, el cual resolví y después lo adapte a un código en Prolog.

El problema planteado fue el siguiente:

“Caballos”


El caballo de Mac es más oscuro que el de Smith, pero más rápido y más viejo que el de Jack, que es aún más lento que el de Willy, que es más joven que el de Mac, que es más viejo que el de Smith, que es más claro que el de Willy, aunque el de Jack es más lento y más oscuro que el de Smith. ¿Cuál es el más viejo, cuál el más lento y cuál el más claro?


Para la solución, primeramente obtuve las siguientes preposiciones de acuerdo a la redacción y luego las clasifique de acuerdo a las categorías de las preguntas que plantea el problema:


*Edad
  1. El caballo de Mac es más viejo que el caballo de Jack
  2. El caballo de Willy es más joven que el caballo de Mac
  3. El caballo de Mac es más viejo que el caballo de Smith
*Velocidad


  1. El caballo de Mac es más rápido que el caballo de Jack
  2. El caballo de Jack es más lento que el caballo de Willy.
  3. El caballo de Jack es más lento que el caballo de Smith
*Tonalidad de color
  1. El caballo de Mac es más oscuro que el caballo de Smith
  2. El caballo de Smith es más claro que el caballo de Willy
  3. El caballo de Jack es más oscuro que el caballo de Smith
Para poder obtener la solución, ordené a cada caballo de cada uno de las personas mencionadas en orden decreciente, dependiendo quien era más que el otro.


Por ejemplo, si nos vamos a la sección de edad, se obtiene lo siguiente:


**Edad (El más viejo)
  1. Mac
  2. Jack
  3. Willy
  4. Smith
Hay de aclarar que los últimos tres lugares son arbitrarios, pues lo único que nos interesa aquí es notar que el caballo de Mac es el más viejo de los cuatro.


Analizando las clasificaciones obtenemos lo siguiente:


**Velocidad (El más lento)
  1. Jack
  2. Mac
  3. Willy
  4. Smith
**Tonalidad de Color (El más claro)
  1. Smith
  2. Mac
  3. Willy
  4. Jack
Por consiguiente, tenemos los siguientes resultados:
  • Caballo más viejo. El de Mac.
  • Caballo más lento. El de Jack.
  • Caballo más claro. El de Smith
Como se puede apreciar, nunca pensé que fuera a ser así de sencillo. Meter este problema en prolog tampoco tuvo gran ciencia, como pueden apreciarlo en el código a continuación:

Código en Prolog.

Al momento que ejecuten swi-prolog en el terminal, seguir estas intrucciones:
  • consult('Caballos.pl').
  • listing.
Si desean revisar una de las cuestiones del problema, sólo hay que teclear el nombre de la función tal y como nos aparece en pantalla con ayuda de lo que fue el "listing", sólo que en lugar de terminar la línea con :-, deberá terminar el punto ( . ).

Se teclea punto y coma ( ; ) después de cada respuesta dada para poder ver más resultados.

PD. Fue demasiado fácil al final, considerando que el código está bien hecho y el problema se planteó de manera correcta.

Saludos a todos.


Fuente del Problema.


__________. “Lógica”. http://platea.pntic.mec.es/jescuder/logica.htm




.: Especialidades de Lenguajes Funcionales :.

:: Especialidades de Lenguajes Funcionales ::



Materia. Lab de Leng de Progr

Hora. V1 (Jueves)

En estos lenguajes lo que predomina principalmente son la definición y aplicación de las funciones que vayamos a utilizar.

Anteriormente comenté algo acerca de las especialidades de los lenguajes script, en lo que se enfocaban.

Ahora veremos algo similar, pero de algunos lenguajes funcionales.

Lenguaje R
  • Sistema para análisis estadísticos y gráficos.
  • Programar bucles para analizar conjuntos sucesivos de datos.
Cálculo Lambda

Sistema formal diseñado para investigar:
  • La definición de una función.
  • La aplicación de una función.
  • La recursividad.
Lisp
  • Lenguaje para Procesar Listas.
  • Creado por John McCarthy, el cual tenía el interés especial en aplicaciones matemáticas puesto que trataba de ofrecer un mecanismo alternativo a las Maquinas de Turing para poder formalizar algoritmos.
  • Implementaciones principalmente matemáticas.
  • Posee un manejo de memoria que libera el espacio utilizado por los objetos que ya no son requeridos.
Scheme
  • La verdad no localice nada concreto en cuestión de utilidad. Sólo que es un lenguaje derivado de LISP, donde su principal metodología se basa en la resolución de problemas.
  • Scheme permite resolver problemas complejos con programas cortos y elegantes.
Haskell
  • En concreto, Haskell únicamente surgió como un lenguaje funcional que reuniera todas las características de los lenguajes funcionales de la época (1980). He de ahí que se diga que Haskell es un lenguaje funcional de propósito general.
  • Incluye soporte para tipos de datos y funciones recursivas, listas, etc.
Erlang
  • Se usa en el contexto de sistemas distribuidos de control (NCS) tolerante a fallos de software.
  • Como lenguaje funcional tiene su uso en aplicaciones complejas, configurables dinámicamente, de modo que son casi inmunes ante fallos de software y hardware de modo que garantiza una operación sin detenerse en áreas como organización del control del tráfico aéreo/ferroviario, mensajería instantánea, servicios basados en Web (Amazon, Google, Yahoo, Facebook, etc.)
  • Su especialidad, que queda en contraste con la gran parte de otros lenguajes funcionales, es su gran naturaleza dinámica; las variables son dinámicas pues no son verificadas en tiempo de compilación, sino en el de ejecución, lo que quizás disminuya su rendimiento.
  • Y aunque este lenguaje provee de mecanismos tolerantes a fallos y a cubrir errores residuales en el código de producción, un sistema de tipos estáticos produciría claros beneficios en la práctica. Pero esto es un tema que aún se discute.
Si en sí desean conocer algo en específico que no se aclare aquí, no duden en comentarlo para ver que podemos encontrar.


Saludos a todos.

.: Lenguajes Script (LB) :.

:: Programas en Lenguajes Script (LB) ::



Materia. Lab de Leng de Progr
Hora. V1 (Jueves)

Como ejercicio referente al tema de lenguajes script y como algo similar al reporte tres de la clase ordinaria, también realice programas en los mismos lenguajes script que en el reporte de la clase ordinaria. Vamos a ver de qué se tratan:

Awk
Nombre. Utilidad.awk
Descripción. En esta aplicación de awk, contamos con un archivo fuente que contiene las cantidades de costo e ingreso de todo un semestre.

Código Fuente

Archivo Fuente
Aquí lo que se hace es que el programa lee la información contenida en el archivo llamado Registro.txt, de modo que obtiene la utilidad de cada mes en base al costo y el ingreso que tiene ese mes.
Al mismo tiempo va haciendo una suma total de todo el semestre sobre costos, ingresos y utilidades.
Durante el proceso del programa, se va imprimiendo (línea por línea) los meses, la cantidad de costo, ingreso y utilidad de ese mes en un archivo con el nombre de Utilidad.txt.
NOTA. Como pueden apreciar en el código, vemos un formato de impresión para cada uno de los campos que se van a imprimir en el archivo de destino. Por ejemplo:
printf “%-10s”, $1
Este formato indica que debe darse un ancho de 10 al campo número 1. El signo ( - ) indica que debe alinearse a la izquierda. Al no colocar ese signo, por lo normal, el contenido del campo se alineará a la derecha.
Archivo de destino (Resultados)
Después de hacer todas estas impresiones y finalizar la lectura del archivo fuente y los cálculos realizados, al final del archivo se imprimen los totales de los costos, ingresos y utilidades en todo el semestre; además de decir si fue un semestre de pérdidas o de ganancias.
Al igual que en el programa de la clase ordinaria de awk, también se ejecuta de la siguiente manera:
awk -f utilidad.awk Registro.txt > Utilidad.txt
Instrucción Mencionada en el terminal
Recuerden que al usar “>” sobre escribimos todo el contenido del archivo de destino; mientras que al usar “>>” ingresamos los resultados al final de los datos ya contenidos en el archivo de destino.

Shell
Nombre. Manejo_Carpetas.sh
Descripción. Esta “pequeño” código que realice en Shell hace algo parecido a mi programa de Shell de la clase ordinaria; sin embargo, la diferencia está en que en lugar de manipular archivos, manipula directorios.
Las acciones que realiza son las siguientes:
·         Crear
·         Mover
·         Copiar
·         Renombrar
·         Elimina
Menú de Opciones
Obviamente, antes de ejecutar alguna de estas acciones, te pregunta si la ubicación donde te encuentras es en la que deseas trabajar. Si no es así, tienes la opción de moverte hacía adelante o hacía atrás. Ya es decisión de cada usuario.
Inicio del Programa
Al igual que en el otro programa en este lenguaje, mi principal objetivo personal era adaptar algunas de las instrucciones de Shell de modo que si deseaba hacer algo con un directorio en el terminal, no tener que estar escribiendo repetidas veces lo mismo, es decir, tener algo más automático.
Perl
Nombre. Prom_Arrays.pl
Descripción. Nuevamente, volvemos con los arreglos de Perl, pero ahora usamos algo súper clásico conocido por todos: La obtención de promedios.
Aquí, se captura una N cantidad de agentes de telemarketing, para los cuales (en cada uno) se registra su puntaje en sus llamadas en las áreas de:
·         Calidad.
·         Tiempos.
·         Adherencia.
Captura de Datos
Al mismo tiempo que hacíamos el registro de cada agente, se va obteniendo el promedio en las métricas del mismo.
Después de estos cálculos, se va haciendo una suma de los promedios finales de cada uno de los agentes, para que al final podamos apreciar, no solo las métricas individuales de cada agente, sino un promedio final de grupo para darnos una idea de que tan afectado está tu supervisor en el mes.
Impresión de Resultados
NOTA. Las métricas de los agentes también afectan a las métricas del supervisor.
Python
Al momento de hacer los programas de Python para la clase de laboratorio, de tan dormido que estaba ya, no me percate que había hecho dos:
Primer Programa
Nombre. Suma_Multiplos.py
Descripción. Este pequeño y fácil programa en este particular lenguaje, lo que hace es que le ingresas un número N, y el proceso que realiza por medio de un “IF” dentro de un “WHILE” es verificar si el número “i” que se va corriendo es divisible, ya sea entre 3 ó 5.
Inicio del Programa
De ser esto cierto, imprimirá el número “i”. Aclarando que en sí, el número N que se ingresó al principio, sólo funciona como un límite para verificar números desde 1 hasta N.
Al final de la aplicación, se nos mostrara la suma de todos estos múltiplos de 3 ó 5.
Resultado Final
La verdad es que este programa lo saque de un conjunto de ejercicios complementarios de Python, pues no tenía ni las más remota idea que hacer.

Segundo Programa

Nombre. Suma_Potencias.py
Descripción. Nuevamente (nada más por no dejar) no volví a tener ni idea de que hacer.
Por lo que comencé a verificar los ejercicios en lenguaje C de un libro que tengo, por lo que decidí adaptar el programa que dice:
“Escribe el programa que al recibir como dato un número N entero, obtenga el resultado de la siguiente seríe:”
Resultado de la serie hasta N = 5
TCL
Nombre. Votos.tclsh
Descripción. Para este programa en TCL, volví a optar por la práctica de la instrucción “SWITCH”.
Ahora lo que realice fue un sencillo contador de votos en el proceso de las elecciones, donde te pide a qué partido fue el voto a favor.
Menú de Opciones
Cuando llegue el momento que decidas ya no registrar votos, al final te mostrará el total de votos que recibió cada partido, el total de votos en todo el proceso y el resultado de cuál fue el partido ganador en el proceso de elecciones.
Impresón de Resultados
Si se percataron, en el nombre de cada programa, encontramos el link de descarga para los códigos de los mismos.
Cualquier aporte que tengan para los códigos ya hechos son bienvenidos.
Saludos.

.: Lenguajes Lógicos (LB) :.

:: Deportistas ::



Materia. Lab de Leng de Progr

Hora. V1(Jueves)

Compañeros, aquí les presento el problema lógico que saque de una página aparte a la que estábamos viendo en clase, el cual resolví y después lo adapte a un código en Prolog.
El problema planteado fue el siguiente:
“Las Deportistas”
Ana, Beatriz y Carmen. Una es tenista, otra gimnasta y otra nadadora. La gimnasta, la más baja de las tres, es soltera. Ana, que es suegra de Beatriz, es más alta que la tenista. ¿Qué deporte practica cada una?
Lo primero a realizar, fue obtener las preposiciones que me proporcionaba el problema para analizar las condiciones de cada deportista:
*      La gimnasta es la más baja de las tres.
*      La gimnasta es soltera.
*      Ana es suegra de Beatriz
*      Ana es más alta que la tenista.
La respuesta fue fácil:
*      Gimnasta. Carmen.
*      Tenista. Beatriz.
*      Nadadora. Ana.
Para llegar a esta conclusión, primeramente partimos del hecho de que sólo hay tres mujeres: Ana, Carmen y Beatriz.
Deduje que Carmen es la gimnasta, pues la condición para la gimnasta es que debía ser soltera, y debido a que Ana es suegra de Beatriz, se me indica que tienen un parentesco en el cual ninguna de las dos partes son solteras.
Ahora sólo me queda Beatriz y Ana.
Concluí que Ana es la nadadora a causa de la preposición que dice que “Ana es más alta que la tenista”, la cual me dice que Ana no es la tenista y por consiguiente, debía de ser la nadadora.
Y por último, y debido a concepto de eliminación, es por lógica definir que Beatriz es la Tenista, pues es la persona que queda y ya sólo queda un deporte sin definir.
Código en Prolog
Al momento que ejecuten swi-prolog en el terminal, seguir estas intrucciones:
  • consult('Deportistas.pl').
  • listing.
Si desean revisar una de las cuestiones del problema, sólo hay que teclear el nombre de la función tal y como nos aparece en pantalla con ayuda de lo que fue el "listing", sólo que en lugar de terminar la línea con :-, deberá terminar el punto ( . ).

Se teclea punto y coma ( ; ) después de cada respuesta dada para poder ver más resultados.

Fuente del Problema

.: Intrucciones Scheme :.

:: Scheme ::



Materia. Lab de Leng de Progr

Hora. V1(Jueves)

En esta ocasión, hablaremos algo sobre el lenguaje Scheme.
Aclaro que me estoy basando al programa Cuad.scm” que realice para la clase normal, el cual te muestra los resultados de la variable x de una ecuación de segundo grado.
A como pude notarlo, un programa sencillo tiene una estructura como la que sigue:
(define (nombre_función argumentos)
                (proceso_función)
)
Con esto simplemente definimos una función que lleva a cabo cierto proceso, donde nombre_funcion es definido por nosotros mismos, y argumentos se refiere a las variables de entrada que va a recibir nuestra función para realizar los procesos que le indiquemos.
Para los que ya han visto algo de Scheme, me darán la razón que puede llegar a ser algo confuso, debido al uso de tantos paréntesis.
Y el problema al crear algo sencillo en Scheme directamente en el terminal es más difícil, pues no puedes regresarte en el renglón escrito para teclear algo que se te paso sin prescindir del back space. Es decir, si te falto escribir algo, tienes que borrar lo que has escrito en la línea hasta llegar al punto donde vas a colocar aquello que olvidaste.
Yo opino que es por esta razón por la cual recomiendo mejor crear el código en un archivo por medio de Emacs. Cabe mencionar que todo archivo perteneciente al lenguaje de Scheme, tiene la extensión *.scm. Por consiguiente podemos tener un archivo así:
nombre_del_archivo.scm
Hablando de algo más, por si se dan cuenta, el ordenamiento de las operaciones en lenguaje Scheme es prefija.
Es decir, el operador aparece antes de los dos argumentos que va a operar.
Por ejemplo, en elnguaje Scheme:
+ 4 5 ----->>> ES LO MISMOS QUE ----->>> 4 + 5
Otras instrucciones presentes
  • (cond ((condición) (proceso))
    (else (otro proceso)))

    Esta instrucción funciona como un simple IF - ELSE totalmente conocido en lenguaje C. Si la condición se cumple, se realiza el proceso indicado. De lo contrario, se lleva a cabo el otro proceso que hayamos estipulado.
  • (newline)Sólo imprime una nueva línea al momento de mostrar resultados en pantalla. Es como el \n en lenguaje C.
  • (display “xxx”)Muestra xxx en pantalla como si fuera un simple texto. Comparando con C nuevamente, es como el printf en Scheme.
Ejecutar un Archivo de Scheme
Para poder ejecutar un archivo de Scheme, primeramente debes tener instalado la paquetería Mit-Scheme. Lo siguiente es seguir los pasos a continuación.
Escribir en el terminal Mit-Scheme
  • Teclear (load “nombre_del_archivo.scm”)
  • Para ejecutar la función contenida en tu código se escribe lo siguiente:
nombre_de_la_función argumentos)

Donde argumentos son las variables que le mandas a la función para poder trabajar.

Por ejemplo: mi código de Scheme es el siguiente:
(define
  (ceros A B C)
     (cond ((>= (raiz A B C) 0) (solucion A B C))

     (else (display "\n\nNO HAY SOLUCION REAL"))))

(define
  (raiz A B C)
       (- (* B B) (* (* 4 A) C)))

(define
  (solucion A B C)
     (newline)

     (display (/ (+ (- B) (sqrt (raiz A B C))) (* 2 A)))

     (newline)

     (/ (- (- B) (sqrt (raiz A B C))) (* 2 A)))
Para correr mi programa ya dentro de la paquetería Mit-Scheme tuve que teclear lo siguiente:
(ceros A B C)
Como pueden apreciar, los argumentos o variables que le mando a mi función ceros se encuentran separados por espacios en blanco.
Problemas con el Código
Planteamiento
Tuve un ligero problema con mi código al momento de ejecutar el mismo.
Como todos saben, las ecuaciones de segundo grado tienen dos resultados para x, ya sean iguales o diferentes.
Por consiguiente, en la función que me calculaba los dos valores requeridos, incruste dos funciones para que sacara el valor negativo y el positivo, pues en la formula general para la ecuación de segundo grado, recuerden que tenemos un ±.
El problema era que al calcular el primer resultado, lo mostraba en pantalla y ahí terminaba mi programa. Ya no obtenía el segundo resultado.
La función que tenía para calcular dichos resultados es la siguiente:
(define
  (solucion A B C)
     (newline)

     (/ (+ (- B) (sqrt (raiz A B C))) (* 2 A))

     (newline)

     (/ (- (- B) (sqrt (raiz A B C))) (* 2 A)))

Verifique el código mediante el siguiente llamado:
(ceros 2 3 1)
En teoría, debía mandarme los resultados -1/2 y el resultado 1, justo en ese orden. Sin embargo sólo mostraba el resultado -1/2 y ahí acababa.
Solución implementada
Llegue a la conclusión que no podía hacer que Scheme mostrara dos resultados con la misma función, así que implemente la instrucción de display a la primera operación, de modo que el resultado lo implementara como un texto, y así poder pasar a calcular la segunda función y mostrarme el segundo resultado.
Efectivamente, así fue; ahora mi programa me muestra los dos valores de x. La función ahora quedo así:
(define
  (solucion A B C)
     (newline)

     (display (/ (+ (- B) (sqrt (raiz A B C))) (* 2 A)))

     (newline)

     (/ (- (- B) (sqrt (raiz A B C))) (* 2 A)))
Cualquier comentario o sugerencia, son bienvenidas.
También les comento que aquí les dejo los dos tutoriales en PDF sobre Scheme que me ayudaron para la realización de mi programa en cuestión de sintaxis.
Saludos a todos.

.: Intrucciones Erlang :.

:: Erlang ::



Materia. Lab de Leng de Progr

Hora. V1(Jueves)

Continuando con la breve explicación sobre sintaxis y creación de archivos en lenguajes funcionales, continuaremos con el lenguaje Erlang.
Nuevamente me baso en gran parte sobre mi programa probabilidad.erl, creado para la clase de laboratorio, el cual te ayuda en el cálculo de combinaciones y permutaciones. Las cuales son funciones muy usadas en la materia de probabilidad.
Inicio de un archivo en Erlang
Primeramente, todo archivo que se crea para el lenguaje Erlang debe iniciar de la siguiente forma:
-module(nombre_del_archivo).
-export([funcion1/N, funcion2/N,funcionM/N]).

Para la primera línea, se aclara que siempre se debe declarar en primera instancia un módulo con la extensión de erl, donde nombre_del_archivo es el nombre que se le dio al archivo.
No les voy a mentir, no me quedo perfectamente claro en sí para qué se hace esto. Sin embargo, lo interpreto como los encabezados que manejábamos en lenguajes script, como por ejemplo:
  • #!/usr/bin/perl
  • #!/usr/bin/python
La función export simplemente funciona (a como yo lo veo) como la definición o la declaración que se le hace a nuestro código erl de que va a usar todas las funciones que tengamos ahí. Pueden ser una, dos o más funciones las que declaren o se vayan a utilizar en el código, nada más es de que deben ir separadas por una coma ( , ).
Si se dan cuenta las funciones se declaran escribiendo función / N, donde función representa el nombre la función que vamos a manejar en nuestro programa.
N representa un número entero que hace referencia al número de variables que maneja dicha función.
Para que lo visualicen un poco más, mi programa empieza así;
-module(probabilidad).
-export([fac/1, permu/2, combi/2]).

Donde sí se dan cuenta, en la instrucción module tengo escrito en nombre de mi programa.
Si nos vamos a la declaración de funciones, vemos que fac se encuentra sobre 1; esto es porque esta función sólo recibe una variable para trabajar.
Nos vamos a las otras dos funciones, y vemos que ambas se encuentran sobre 2, y es porque requieren de dos variables que se le deben proporcionar para trabajar.
Simplemente compruébenlo.
fac(1) -> 1;
fac(N) -> N * fac(N - 1).      <- USA UNA VARIABLE

permu(N,X) -> ((fac(N)) / (fac(N - X))).  <- USA 2 VARIABLES

combi(N,X) -> ((fac(N)) / (fac(N - X) * fac(X))). <- USA 2 VAR.
Creación de procesos e Instrucciones.
Primeramente, lo que se debe de saber es que para colocar una función, el símbolo de =  que normalmente usamos, en Erlang se coloca ->.
Todo proceso e instrucción debe terminar con un punto ( . ), pues es lo que me indica el fin de mi proceso o función.
Cuando en un mismo proceso, se manejan más de una línea, únicamente se coloca punto y coma ( ; ) al final de cada renglón.
La manera de escribir una función (por lo más común) es la siguiente:
función(arg1, arg2) -> Proceso a realizar.
Donde arg1, arg2… representan las variables con las que va a trabajar nuestro código.
Un ejemplo de lo antes mencionado puede ser:
fac(1) -> 1;
fac(N) -> N * fac(N - 1).
Ejecución de un código en Erlang
Antes que nada, debemos escribir en el terminal erl. Una vez hecho esto, se escribe lo siguiente:
c(nombre_del_archivo.erl)
Por ejemplo en caso, escribiría:
c(probabilidad.erl)
Y para hacer funcionar alguna de esas funciones es la siguiente:
nombre_del_archivo:nombre_de_la función(argumentos).
Para que lo aprecien un poco más, si desea calcular 5 Combinación de 3 sólo se escribe lo siguiente:
probabilidad:combi(5, 3).
De cualquier forma les dejo el tutorial que maneje para Erlang y un link que también me fue de mucha utilidad.
Por mi parte es todo, ya saben que cualquier comentario no duden en hacerlo.
Saludos a todos.