Professional Documents
Culture Documents
HUERTA
Carrera:
Ing. En sistemas computacionales
Materia:
Programacin lgica funcional
Trabajo:
Antologa
Profesor:
Jos Luis Gonzlez Ortiz
Alumno:
Abraham Maximiliano Murillo Aguilar
12101040
16/06/2016
solucin.
Verificabilidad: La facilidad con que pueden comprobarse las propiedades de un
sistema. Si el estilo de cdigo hace obvia la estructura esa ayuda a verificar que el
Estilo K&R:
[C]
void main()
{
while (1) {
printf("Hello World!");
}
}
[/C]
Estilo BSD KNF (Kernel Normal Form):
BSD.
Estilo de cdigo del Kernel de Linux (Linux kernel coding style)
Utiliza dos tabuladores (Hard tab y Soft tab) de 8 y 4 columnas respectivamente
El hard tab es utilizado para indentar bloques de cdigo
El soft tab se utiliza para indetacion adicional en aquellos casos que una lnea
continue en varias lneas
[C]
static void
shrek(void *cx, char *obj, int arg,
void *argv, void *rval)
{
if (CheckProperty(cx, o, "data",
CONTS_LIMIT,
NULL, NULL, ) != 0) {
fprintf(stderr,"Cannot check property\n");
fflush(stderr);
}
free(data);
return (NO_ERROR);
}
[/C]
Estilo Allman
[C]
//for (int i=0; i < x; i++) //while (x == y) if (x == y) { something(); somethingelse(); } [/C]
GNU style
espacios ms
Popularizado por Richard Stallman
El comando reformat del editor Emacs reformatea el cdigo, por defecto, con este
estilo (como no poda ser de otra manera)
[C]
while (x == y)
{
something ();
somethingelse ();
}
finalthing ();
[/C]
Estilo Whitesmith
if(condicion)
{
sentencia0;
sentencia1;
}
Evaluacin de expresiones
Son el mtodo fundamental que tiene el programador de expresar computacionales
Las expresiones estn compuestas por operadores, operandos, parntesis y llamadas
funciones. Los operadores pueden ser:
-
Expresiones
3+6*14
-4*7+2+3/4-5
(33+3*4)/5
2+2*3
8+7*3+4*6
16*6-3*2
4/2*3/6
6/2/1/5-2/4*2
3+3*2
(((B+C)/2*A+10)*3*B)-6
resultado
87
-30.25
9
8
53
90
1
-4.0
9
324
A=4
B=5
C=1
long:
Enteros.
Tamao
64-bits.
Entre
9223372036854775807.
-9223372036854775808
char: Caracteres. Tamao 16-bits. Unicode. Desde '\u0000' a '\uffff' inclusive. Esto
es desde 0 a 65535
Variables
Una variable es un rea en memoria que tiene un nombre y un Tipo asociado. El Tipo es o
bien un Tipo primitivo o una Referencia.
Es obligatorio declarar las variables antes de usarlas. Para declararlas se indica su nombre y
su Tipo, de la siguiente forma:
tipo_variable nombre ;
Ejemplos:
int i;
// Declaracion
char letra;
de
// Declaracion
de
un
entero
un
caracter
letra
que Letra.
5;
=
//
'c';
//
a
a
la
la
variable
variable
i
letra
se
le
se
le
asigna
el
valor
asigna
el
valor
'c'
=
letra
5;
=
'c';
Operador en Java
Significado
suma
resta
multiplicacin
divisin
%
residuo
incremento
-- decremento
Jerarqua de los operadores aritmticos
Asociatividad
Empezando por los parntesis ms internos
De derecha a izquierda, ++ y -- dependiendo de la po
De izquierda a derecha
De izquierda a derecha
De derecha a izquierda
Funcin
F=x/ (1+x^2)
Fin
Inicio
Imprimir este es el algoritmo principal
Leer N
R=F(N) llamado de la funcin
Imprimir el resultado de la funcin es: , R
Fin
Disciplina de tipos
los tipos que ingieren es decir se comprueban de forma esttica, en tiempo de
compilacin.
En los lenguajes de programacin con disciplinas de tipos, cada tipo representa una
coleccin de valores o datos similares. El conocer los tipos de las funciones ayuda a
documentar los programas y evita errores en tiempo de ejecucin.
Un lenguaje tiene la disciplina de tipos si los errores se detectan siempre, es
necesario determinar los tipos de todos los operados, ya sea en tiempos de compilacin o
ejecucin.
C: no tiene disciplina de tipos, por que realiza comprobacin de tipos sobre las
uniones, y permite funciones con parmetros sobre los que no se realizan
comprobacin de tipos.
Java: si tiene disciplina de tipos porque no hay uniones
Haskell: tambin pose disciplinas de tipos, porque los tipos de los parmetros de las
funciones se conocen en tiempo de compilacin.
Haskell y otros lenguajes funcionales utilizan el sistema de tipos milner, que tienen 2
caractersticas fundamentales
Paradigmas de programacin
Un paradigma de programacin es una coleccin de patrones conceptuales que modelan la
forma de razonar sobre problemas, formular soluciones y de estructurar paradigmas de
programacin son:
Programacin imperativa
En este paradigma un programa es una secuencia finita de instrucciones que se ejecutan una
tras otra. Los datos utilizados se almacenan en memoria principal y se referencia utilizando
variables
Ejemplo
Leer (x)
Leer (y)
Resultado= x+y
Escribir (resultado)
Programacin funcional
Paradigma en que todas las sentencias son funciones en el sentido matemtico del trmino.
Un programa es una funcin que se define por composicin por funciones ms simples la
misin de la computadora ser evaluar funciones.
Ejemplo
Predecesor (x)= x-1, si x>0
Sucesor (x) = x+1
Sumar (x,0)=x
Sumar (x,y)= sucesor(suma
Programacin lgica
En este paradigma un programa consiste en declarar una serie de hechos (elementos
conocidos y relacin de objetos completos) y reglas (relacin general entre objetos
Este paradigma puede ser tanto imperativo cmo funciona y lgico. Lo que caracteriza un
lenguaje orientado objetos es la forma de manejar la informacin qu est basada en tres
conceptos
Puesto que haskell es un lenguaje funcional puro viene descrito a travs de evaluacin de
expresiones
Evaluacin de expresiones: para producir valores todo valor tiene asociado un tipo ejemplo,
valores de expresiones son los valores atmicos tales como entero 5 o el carcter a o la
funcin \xx+1 y los valores estructurados de la lista [1 2 3] Y por ltimo El par (b,4).
Las expresiones de tipos son trminos sintcticos que denotan tipos
Ejemplos de expresiones de tipo son los tipos atmicos:
Integer(enteros con precisin ilimitada)
Char (caracter)
Interger Integer(funciones que aplican Interger sobre Interger)
[Interger](lista homognea de enteros)
(char, Interger) par formado por un carcter y un entero
Paradigma de la programacin funcional
En un sentido estricto la programacin funcional define un programa como una funcin
matemtica qu convierte unas entradas en una salida sin ningn estado interno y ningn
efecto lateral. La no existencia de un estado interno y la ausencia de efectos laterales es
una caracterstica de la programacin clara viva. Otras caractersticas del paradigma
funcional son las siguientes:
Recursin
Funciones como tipo de datos primitivos
Uso de listas
> promp
EJEMPLO 1
EJEMPLO 2
EJEMPLO 3
EJEMPLO 4
EJEMPLO 5
quote ()
Sirve para imprimir
1)
2)
3)
Lista vaca
car
cdr
Valores de verdad
List T=verdadero si es lista
Nil=falso si no es lista
Funciones
Defun
RECURSIVIDAD
Definir una funcin llamada par recibir un nmero y deber mostrar T si es par
o NIL si no es
Entradas y Salidas
Variables
Iteracin
>(root arbol)
CIELO
>(sub-tree arbol soleado)
(HUMEDAD (NORMAL SI) (ALTA NO))
>(sub-tree arbol nublado)
SI
>(leaf (sub-tree arbol soleado))
NIL
>(leaf (sub-tree arbol nublado))
T
(defun root(tree)
(car tree))
(defun sub-tree(tree attribute-value)
(second (assoc attribute-value (cdr tree))))
(defun leaf (tree)
(atom tree))
Evaluacin perezosa
3.1 estrategias de la evaluacin perezosa
Una estrategia de evaluacin es un conjunto de reglas para evaluar expresiones es un
lenguaje de programacin.
Una estrategia de evaluacin define cundo y en qu orden los argumentos a una funcin
son evaluados, cuando se sustituyen en la funcin y lo que la sustitucin se forma.
Estrategias de evaluacin
- Para los ejemplos se considera la funcin
Mult :: (Int, Int) Int
mult (x, y) = x * y
[por def. de +]
= 3*5
= 15
[por def. de *]
[por def. de +]
[por def. de +]
[por def. de +]
= 3*5
[por def. de +]
= 15
[por def. de -]
1
Si empezamos a evaluar de derecha a izquierda
n+ (n: =1)
Programacin
lgica
tcnicas
de
programacin
funcional
funcional
perezosa
el
con
el
no-determinismo
mecanismo
existen
de
varias
comparticin.
tcnicas
como
son
tcnica de backtrain (prolog) si un alternativa falla el flujo de torna hasta la ltima decisin
e
intenta
otra
algoritmo
no
no
determinista
determinista
ofrece
muchos
posibles
resultados
determinista.
Pueden simularse utilizando la lista de xito como ejemplo: x=x, x candidatos vlidos
Datos
no
deterministas
Requiere tipos de datos diferentes como son Data list m a= nil (cons (m a) (m (list a))
Puede representar lista perezosa no determinista.
Cons [2] [Nil, cons [1]]:: list { } int.
Los argumentos representan computacin no determinista permute y IsSorted se pueden
adoptar a la lista de tipo permute y genera permutaciones perezosamente los rendimientos
IsSorted [true, false] es aplicada por encima de la lista (s).
Ejercicio1.hs en haskell
doble numero = 2*numero
media3 x y z = (x+y+z)/3
pepe = ("pepe",21)
juan = ("juan",17)
maria = ("maria",33)
pedro = ("pedro",12)
sofia = ("sofia",7)
juana = ("juana",65)
personas = [pepe,juan,maria,pedro,sofia,juana]
sumaMonedas a b c d e = 1*a+2*b+5*c+10*d+20*e
volumenEsfera r = (4/3)*pi*r^3
ultimaCifra x = rem x 10
Ejercicio2.hs en haskell
xor3 x y = (x || y) && not (x && y)
xor4 x y = x/= y
rotal xs = tails xs ++ [head xs]
rota n xs = drop n xs ++ take n xs
rango xs = [minium xs, maximun xs]
palindromo xs = xs == reverse xs
interior xs = tail (init xs)
finales n xs = drop (length xs - n) xs
segmento m n xs = drop (m-1) (take n xs)
extremos n xs= take n xs ++ drop (length xs -n) xs
mediano x y z = x + y + z - minimum [x,y,z] - maximum [x,y,z]
esIguales x y z = x == y && y == z
Ejercicio3.hs en haskell
funcionCociente :: Integer-> Integer-> Integer
funcionCociente a b = if (mod a b == 0) then (div a b)
else (mod a b)
Ejercicio4.hs en haskell
rango xs = [minimum xs, maximum xs]
palindromo xs = xs == reverse xs
tresIguales x y z = x == y && y == z
xor1 True True = False xor1 True False = True xor1 False True = True xor1
False False = False
xor4 x y = x /= y
cuadrante (x,y) | x > 0 && y > 0 = 1 | x < 0 && y > 0 = 2 | x < 0 && y <
0 = 3 | x > 0 && y < 0 = 4
circulo :: Int -> Int circulo n = length [(x,y) | x <- [0..n], y <- [0..n],
x^2+y^2 < n^2]
circulo' :: Int -> Int circulo' n = length [(x,y) | x <- [0..m], y <- [0..m],
x^2+y^2 < n^2] where m = raizCuadradaEntera n
e = 2.71828459
pitagoricas :: Int -> [(Int,Int,Int)] pitagoricas n = [(x,y,z) | x <- [1..n], y <[1..n], z <- [1..n], x^2 + y^2 == z^2]
quiere(juan,elena).
quiere(pedro,raquel).
quiere(pedro,belen).
quiere(x,maria).
quiere(_,maria).
quiere(maria,_).
quiere(juan,x),gusta(maria,y).
quiere(juan,x),gusta(maria,x).
padre(alberto,ana).
padre(alberto,juan).
padre(alberto,maria).
padre(alberto,carlos).
padre(ana,luis).
padre(ana,pedro).
padre(maria,juana).
padre(maria,elena).
padre(carlos,dalia).
padre(pedro,luz).
padre(pedro,peter).
padre(juana,rene).
hijo(X,Y):-padre(Y,X).
abuelo(X,Z):-padre(X,Y), padre(Y,Z).
nieto(X,Z):-abuelo(Z,X).
bisabuelo(X,W):-abuelo(X,Z),padre(Z,W).
bisnieto(W,X):-bisabuelo(X,W).
hermano(Y,Z):-padre(X,Y),padre(X,Z).
primo(X,Z):-hermano(Y,Z).
/* animal(anim)<-Anim es un animal */
animal(mono).
animal(gallina).
animal(araa).
animal(mosca).
animal(cocodrilo).
/*gusta(X,Y)<-a X le gustanY */
gusta(mono,banana).
gusta(araa,mosca).
gusta(alumno,parranda).
gusta(betty,angy).
gusta(cocodrilo,X):-animal(X).
gusta(mosca,espejo).
/*regalo(X,Y)<-a Y es un buen regalo para para X */
regalo(X,Y):-animal(X),gusta(X,Y).
pais(usa).
pais(canada).
pais(mexico).
pais(usa,washington).
pais(canada,ottawa).
pais(mexico,cdmx).
compra(X,Y):-sevende(Y),gusta(X,Y),bueno(Y).
sevende(vestido).
sevende(sombrero).
sevende(zapatos).
gusta(jaime,zapatos).
gusta(maria,vestido).
gusta(maria,sombrero).
bueno(sombrero).
nacimiento(pedro,fecha(12,ago,1970)).
compra2(X,Y):-gusta(X,Y);bueno(Y).
sevende(vestido).
sevende(sombrero).
sevende(zapatos).
gusta(jaime,zapatos).
gusta(maria,vestido).
gusta(maria,sombrero).
bueno(sombrero).
bueno(short).
/* Entradas y salidas
Para salidas se usa el comando Write para desplegar un texto o una
variable.
? write('Hola...').
saludos:-nl,tab(4),write('hola Angie'),nl,tab(20),write(X).
?saludo.
name:-write('Anote su nombre:
'),read(Nombre),nl,write('Hola'),write(Nombre).
?name.
anote su nombre:Angie.
Hola Angie
*/
saludos:-nl,tab(4),write('hola Angie'),nl,tab(20),write(X).
name:-write('Anote su nombre:
'),read(Nombre),nl,write('Hola'),write(Nombre).
materiales(1,cemento,50).
materiales(2,arena,20).
materiales(3,cal,10).
equipo(1,revolvedora,1500).
equipo(2,taladro,800).
trabajo(A,B,C,D).:-materiales(X,A,B), equipo(Y,C,D):-(X==Y).
producto(X,C,X1,C1):-materiales(X,C), equipo (X1,C1).
proyectaN(Descripcion):-materiales(Descripcion,_).
seleccionar(Descripcion,Cantidad):-materiales(Descripcion,Cantidad),
Cantidad>15.
producto(X,C,X1,C1):-materiales(X,C), equipo(X1,C1).
union(X,Y):-materiales(X,Y);equipo(X,Y).
diferencia(X,Y):-union(X,Y), \+(materiales(X,Y)).
hombreymujer(X,Y):-eshombre(X);esmujer(Y).
padre(luis,pablo).
padre(luis,rosa).
madre(adela,pablo).
madre(adela,rosa).
madre(dolores,javier).
padre(pablo,javier).
madre(rosa,irene).
madre(rosa,miguel).
padre(felipe,miguel).
padre(felipe,irene).
padre(miguel,salvador).
padre(javier,david).
padre(javier,claudia).
madre(silvia,claudia).
madre(silvia,david).
eshombre(luis).
eshombre(pablo).
eshombre(felipe).
eshombre(javier).
eshombre(miguel).
eshombre(david).
eshombre(salvador).
esmujer(adela).
esmujer(dolores).
esmujer(rosa).
esmujer(silvia).
esmujer(irene).
esmujer(claudia).
hijo(X,Y):-padre(Y,X).
abuelo(X,Z):-padre(X,Y), padre(Y,Z).
abuela(X,Z):-padre(X,Y), padre(Y,Z).
nieto(X,Z):-abuelo(Z,X).
nieta(X,Z):-abuelo(Z,X).
bisabuelo(X,W):-abuelo(X,Z),padre(Z,W).
bisabuela(X,W):-abuelo(X,Z),padre(Z,W).
bisnieto(W,X):-bisabuelo(X,W).
bisnieta(W,X):-bisabuelo(X,W).
hermano(Y,Z):-padre(X,Y),padre(X,Z).
hermana(Y,Z):-padre(X,Y),padre(X,Z).
primo(X,Z):-hermano(Y,Z).
prima(X,Z):-hermano(Y,Z).
tio(X,Y):-hermano(Y,Z).
tia(X,Y):-hermano(Y,Z).
N is M+1.
es_lista([]). es_lista([_|_]).
concatena([],L,L). concatena([X|L1],L2,[X|L3]) :- concatena(L1,L2,L3).
ultimo(X,[X]). ultimo(X,[_|Y]) :- ultimo(X,Y).
concatena(Z,[X],L).
subconjunto(Y,Z).