Vous êtes sur la page 1sur 12

INSTITUTO TECNOLÓGICO DE POCHUTLA

PROGRAMACIÓN LOGICA Y FUNCIONAL.

DOCENTE: ING. SALINAS SÁNCHEZ ALBERTO.


EQUIPO:
BERNAL CRUZ MARISOL.
BARRIOS RUIZ LUIS ALBERTO.
DIAZ ZARATE JAIME.
DIAZ HERNÁNDEZ MARIO.
MANZANO RUIZ URIEL.

INGENIERÍA EN SISTEMAS COMPUTACIONALES.


SEMESTRE: 8°
COMPARACIÓN DEL LENGUAJE LÓGICO Y FUNCIONAL.

SAN PEDRO POCHUTLA, OAXACA A 13 DE FEBRERO DEL 2018.


PROGRAMACIÓN FUNCIONAL
La programación funcional es un paradigma de programación declarativa basado en la utilización de funciones matemáticas. Sus orígenes provienen del Cálculo
Lambda, una teoría matemática elaborada por Alonzo Church como apoyo a sus estudios sobre computabilidad. Un lenguaje funcional es a grandes rasgos, un azúcar
sintáctico del Cálculo Lambda.
Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de
un lenguaje imperativo, sino como funciones puramente matemáticas.
Los lenguajes funcionales
 Haskell
 ML
 Lisp
 WSDL
PROGRAMACIÓN LÓGICA
La programación lógica consiste en la aplicación del corpus de conocimiento sobre lógica para el diseño de lenguajes de programación. La programación lógica
comprende dos paradigmas de programación:

 La programación declarativa
 La programación funcional.
La programación declarativa gira en torno al concepto de predicado, o relación entre elementos. La programación funcional se basa en el concepto de función (que
no es más que una evolución de los predicados), de corte más matemático.
Los lenguajes lógicos
 Prolog
 Godel
 Curry
CARACTERÍSTICA PROLOG HASKELL
Prolog es un lenguaje lógico, utilizado para programar en el campo Es un lenguaje de programación estandarizado multipropósito
¿Qué es? de la inteligencia artificial. puramente funcional con semánticas no estrictas y fuerte
tipificación estática.

Las variables son cadenas de letras, dígitos y el signo '_'. Estas Podemos almacenar resultados intermedios asignándoles
empiezan con una letra mayúscula o el símbolo '_': nombres. Estos nombres se llaman variables. Cuando se ejecuta
un programa, cada variable se sustituye por el valor al que se
X refiere. Por ejemplo, considere el siguiente cálculo
Objeto2
_23
Resultado Preludio> 3.141592653 * 5 ^ 2
_x23 78.539816325

Lista_Participantes
Esa es el área aproximada de un círculo con radio 5 , de acuerdo
Cuando una variable aparece en una cláusula sola, no se necesita
VARIABLES inventar un nombre para ella. Se usa llamarla variable "anónima", con la fórmula . Por supuesto, es engorroso escribir los
cuando es escrito únicamente el signo '_'. Por ejemplo, consideremos
la siguiente regla: dígitos de , o incluso para recordar más que los primeros. La
programación nos ayuda a evitar la repetición sin sentido y la
hijo(X) :- padre (X,Y). memorización al delegar estas tareas en una máquina. De esta
forma, nuestras mentes se mantienen libres para tratar con ideas
más interesantes. Para el presente caso, Haskell ya incluye una
La regla dice: para toda X, X tiene un hijo si X es el padre de alguna
Y. Nosotros estamos definiendo la propiedad hijo el cual, no depende variable llamada pi que almacena más de una docena de dígitos
del nombre del hijo. Entonces, aquí hay un lugar en donde podemos
usar una variable anónima. Si rescribimos la cláusula: para nosotros. Esto permite no solo un código más claro,
sino también una mayor precisión.
hijo(X) :- padre(X,_).
Los operadores aritméticos incluyen los símbolos para suma, resta,
IMPORTANCIA DE CADA VARIABLE
multiplicación y división. En Prolog, si dos enteros son sumados,
restados o multiplicados, el resultado será un entero. Siempre que infixr 9 ·
uno de los operandos, en cualquiera de estas operaciones sea un
infixl 9 !!
número real, el resultado siempre será un real. El resultado de una
división, siempre que los operandos sean enteros o reales, será infixr 8 ↑, ↑↑, ∗∗
siempre real.
infixl 7 ∗, /, ’quot’, ’rem’, ’div’, ’mod’
ARITMÉTICOS
infixl 6 +, -
Todas las versiones de Prolog soportan los siguientes operadores infixr 5 :, ++
aritméticos, listados en el orden de prioridad de ejecución.
infix 4 ==, 6=, <, ≤, ≥, >, ’elem’, ’notElem’
 + --> SUMA infixr 3 &&
 - --> RESTA infixr 2 k
 * --> MULTIPLICACIÓN
 / --> DIVISIÓN infixl 1 , =
 // --> DIVISIÓN ENTERA infixr 1 =
OPERADORES  MOD --> RESIDUO
 ^ --> POTENCIA infixr 0 $, $!, ’seq’
 Cualquier operador puede usarse de modo prefijo o
Los paréntesis se pueden utilizar para dar preferencia de ejecución infijo,
en una expresión compuesta. Prolog utiliza la precedencia de
operadores con la regla de la mano izquierda. independientemente de cómo esté declarado
infix 4 ∼=
A continuación se muestran algunas operaciones más complejas que
PROLOG provee: (∼=) :: Float -> Float -> Bool
(∼=) x y = abs (x - y) < 0.0001
OPERACIÓN DESCRIPCIÓN
Sqrt(X) Calcula la raíz cuadrada de la variable  Toda funci´on puede convertirse en un operador si se
log(X) Calcula el logaritmo de X escribe
ln(X) Calcula el logaritmo natural de X entre acentos franceses:
abs(B) Regresa el valor absoluto de B
suma :: Integer -> Integer -> Integer
sin(T) Seno de T
cos(A) Coseno de A suma x y = x + y
tan(C) Tangente de C x ’suma’ y = x + y
RELACIONALES Main> suma 1 2 Main> 1 ’suma’ 2
 Se puede dar prioridad y asociatividad al uso infijo de
Prolog soporta los siguientes operadores relacionales:
cualquier función: infixl 6 ’suma’
 = --> IGUAL QUE
 > --> MAYOR QUE Operadores son funciones binarias cuyo nombre es simbólico
 >= --> MAYOR O IGUAL QUE
 >= --> MENOR O IGUAL QUE (cadena de signos, no letras)
 <> --> DESIGUAL QUE Pueden ser invocados de forma infija
 =/= --> DIFERENTE QUE
 is --> EVALUADOR DE EXPRESIÓN Hay operadores predefinidos como &&, ||, +, −, ∗, /y ↑
 seed --> GENERADOR DE NÚMEROS ALEATORIOS
Podemos definir nuevos operadores utilizando uno o más de
Cuando dos objetos que son símbolos o cadenas de caracteres son los siguientes símbolos:
comparados, los caracteres son convertidos a su equivalente ASCII.
: ! #$%& ∗ + · / <=>?@\ ↑ |− ∼
El valor de cada carácter es examinado a partir del operador
relacional, de izquierda a derecha. ∼ solo una vez y al principio. Solo es reservado
Los operadores que comienzan por (:) tienen un significado
especial, constructores infijos de datos
Ejemplos de operadores:
+ + + && || ≤ == 6= · // $ predefinidos
@@ % − + −
WV<+>?
Reservados: :: → ⇒ : .. = @ \ | ← ∼
Un predicado es la relación directa con una expresión. Cada Es posible escribir varias expresiones matemáticas directamente
predicado usado en una cláusula de Prolog debe ser declarado, en ghci y obtener un resultado. Prelude es el prompt por defecto
basado en la declaración de los tipos de dominios para cada uno de de GHCi.
los nombres de los objetos.

paciente(nombre, edad, peso, presion_sanguínea). Prelude> 3 * 5


mercado(encargado, vendedor). 15
Prelude> 4 ^ 2 - 1
Estructuras 15
Prelude> (1 - 5)^(3 * 2 - 4)
Los objetos estructurados (o simplemente estructuras) son objetos 16
que tienen varios componentes. Los componentes pueden ser a su
vez estructuras. Por ejemplo, la fecha, puede ser vista como una Las cadenas van entre "comillas dobles." Puede concatenarlas
estructura con 3 componentes: día, mes y año. Las estructuras son con
tratadas en el programa como objetos simples, aunque estén
formadas por muchos componentes. El orden en que se combinan los
componentes dentro de un objeto simple, es la forma en que
escogemos una functor. Un functor conveniente para nuestro
++
EXPRESIONES ejemplo es fecha. Entonces la fecha 1o. de Enero 1975 puede
escribirse:
Prelude> "Hello"
fecha(1, enero, 1975) "Hello"
Prelude> "Hello" ++ ", Haskell"
Todos los componentes en este ejemplo son constantes (2 enteros y un "Hello, Haskell"
átomo). En la siguiente figura vemos como se representa en forma de árbol,
y a su vez cómo está escrito en Prolog:

Ahora bien, cualquier día de enero de 1975 puede representarse mediante la


estructura:

fecha(Día, enero, 1975)

Donde Día es una variable que puede ser instanciada por cualquier objeto
en cualquier momento de la ejecución del programa. Sintácticamente, todos
los objetos de datos en Prolog son términos. Por ejemplo, enero
y date(1,enero,1975) son términos.
Consultas

Para plantear una consulta en Prolog, el usuario simplemente prueba ésta,


para ver si ésta es verdadera. Si la prueba es positiva, Prolog contesta: YES,
de lo contrario responde NO, o también se usa TRUE o FALSE, Las funciones se llaman colocando los argumentos directamente
dependiendo del programa que se use para la programación del después del nombre de la función. No hay paréntesis en la
llamada a la función:
lenguaje. paciente ("ana", femenino). yes
Prelude> succ 5
6
Prelude> truncate 6.59
6
Prelude> round 6.59
7
Prelude> sqrt 2
1.4142135623730951
Prelude> not (5 < 3)
True
Prelude> gcd 21 14
7
Cuando se quiere hacer un comentario que cuenta con más de una Hay dos modos de incluir comentarios en un programa:
línea, se hace de la siguiente manera: Comentarios de una sola línea: comienzan por dos guiones
consecutivos ( – – ) y abarcan hasta el
/* Comentario x Comentario y */ final de la línea actual:

Si el comentario es de una solo línea simplemente se antecede el f :: Integer → Integer


signo de % al comentario. Es importante saber que los comentarios f x = x + 1 – – Esto es un comentario
COMENTARIO. no tienen efecto en la ejecución del programa.
Comentarios que abarcan m´as de una línea: Comienzan por los
% Comentario caracteres {− y acaban con −}.
Pueden abarcar varias líneas y anidarse:

{- Esto es un comentario
de m´as de una l´ınea -}
g :: Integer → Integer
g x = x – 1
La programación lógica está basada en la noción de relación. Debido Un patrón es una expresión como argumento
a que en la relación es un concepto más general de una aplicación. en una ecuación
La programación lógica es potencialmente de alto nivel. Considerar • Es posible definir una función dando más de
2 conjuntos de valor S y T, R es la Relación entre S y T, para toda X Una ecuación para ´esta.
que pertenece a S y Y que pertenece a T y R(X,Y) es verdadero o X Al aplicar la función a un parámetro concreto
falso. Dado a, determinar el valor m(a). En la programación Lógica la comparación de patrones determina la ecuación
se implementa las relaciones. Sea R una relación: a utilizar.
Patrones constantes
Dado a y b, determinar cuando R(a,b) es verdadero. Un patrón constante puede ser un número, un
Dado a, encontrar todos los Y/R(a,y) es verdadero. Carácter o un constructor de dato.
RELACIONES/ Dado b, encontrar todos los X/R(x,b) es verdadero.
PATRONES Encontrar X y Y/R(x,y) es verdadero. f :: Integer → Bool
f 1 = True
f 2 = False

• La definición de la conjunción y disyunción de


valores lógicos usa patrones constantes (True y
False son dos constructores de datos para el tipo
Bool):
infixr 3 &&
(&&) :: Bool → Bool → Bool
TIPOS False && x = False
True && x = x
infixr 2 ||
Si R(x) entonces relación unitaria.
Si R(x,y) entonces relación binaria. (||) :: Bool → Bool → Bool
Si R(x, y, z) entonces relación ternaria. False || x = x
True || x = True
Un programa en PROLOG define una colección de relaciones. Cada
relación es definida por una o más cláusulas. • Regla para la comparación de patrones Se comprueban los
patrones correspondientes a las distintas ecuaciones en el orden
INTERPRETACIÓN EN PROLOG dado por el programa, hasta que se encuentre Una que unifique.
Dentro de una misma ecuación se intentan unificar los patrones
A:-A1,...,An.
correspondientes a los Argumentos de izquierda a derecha.
:--->Es equivalente "Si" o "si". En cuanto un patrón falla para un argumento, se pasa a la
siguiente ecuación. Patrones para listas Es posible utilizar
; --> Es equivalente "AND". patrones al definir funciones que trabajen con listas.
[ ] solo unifica con un argumento que sea una lista vacía.
[x ], [x , y], etc. solo unifican con listas de uno, dos, etc.
; --> Es equivalente a "OR" argumentos.
(x : xs) unifica con listas con al menos un elemento
suma :: [Integer ] → Integer
suma [ ] = 0
suma (x : xs) = x + suma xs
suma [1, 2, 3]
à ! sintaxis de listas
suma (1 : (2 : (3 : [ ])))
=⇒ ! segunda ecuaci´on de suma {x ¾ 1, xs ¾ 2 :
(3 : [ ])}
. . .
6
Al iniciar Prolog, aparece la consola en la cual se hacen las Vamos a comenzar lanzando la consola de Haskell, para ello
consultas: en una terminal escribiremos el siguiente comando:

1. ghci

Como puedes ver nos carga:

El promp es Prelude, podemos cambiarlo, en este caso


vamos a ponerlo en hkl, para ello ejecutaremos:
En el menú de File/New se abre un nueva ventana para escribir 
código fuente.
EJECUCIÓN.
1. :set prompt "hskl> "

Vemos como ha cambiado:

Para terminar con el primer ejemplo, vamos a ver como hacer


unas operaciones en esta consola, a continuación está la
captura de los ejemplos, podemos ver una suma, una división
(vemos que nos muestra décimales, en otros lenguajes nos
habría devuelto la parte entera), y una operación con
parentesis, para apreciar su función.
1. Tener el programa de Prolog abierto.
2. En el código fuente se compila, haciendo clic en el menú
compile.
3. En la consola se hace la consulta.

:?-easter(2000,Y,D).
Y=4, Nota
D=23. Si deseamos salir de la consola de Haskell escribimos:

Easter es un programa que se encuentra en la carpeta de Examples
que vienen en prolog.
1. :q

C:/Pro386w/examples/Easter.pl Y damos enter.


Podemos comparar cadenas, números, como hacemos en el
Si las premisas son contradictorias el argumento no es valido resto de lenguajes, veamos como funciona:

P1^P2^...^Pn Þ Q
Q:-p1 ^p2 ^...^Pn Cláusula = Clause
Implicación Premisa
\ Q es una conclusión Q:-P1,P2,...Pn.

La comparación entre tipos distintos nos arroja un error, como


era de esperar.
Referencia
Alonso, J. A. (28 de septiembre de 2016). Vestigium. Obtenido de http://www.glc.us.es/~jalonso/vestigium/i1m2016-tipos-y-clases-en-haskell/

desconocido. (23 de octubre de 2007). haskell. Obtenido de http://www.lcc.uma.es/~pacog/apuntes/pd/cap02.pdf

Josue. (26 de agosto de 2016). solvetic. Obtenido de https://www.solvetic.com/tutoriales/article/2995-introduccion-al-lenguaje-haskell/

libros, w. (27 de abril de 2017). wiki libros. Obtenido de https://en.wikibooks.org/wiki/Haskell/Variables_and_functions#Functions

magent_mx. (1 de enero de 2008). prolog UABC. Obtenido de http://fcqi.tij.uabc.mx/usuarios/ardiaz/conceptos.html

Prezi. (26 de agosto de 2014). Obtenido de https://prezi.com/ggkamwud-e_h/programacion-logica-y-funcional/?webgl=0

wiki, h. (9 de octubre de 2016). haskell wiki. Obtenido de https://wiki.haskell.org/Aprende_Haskell_en_10_minutos#Sintaxis_conveniente

Vous aimerez peut-être aussi