Sie sind auf Seite 1von 96

INSTITUTO TECNOLÓGICO SUPERIOR DE PÁNUCO

División de Ingeniería en
Sistemas Computacionales

PROGRAMACIÓN LOGICA &


FUNCIONAL

ANTOLOGÍA

UNIDAD IV. MODELO DE PROGRAMACIÓN LÓGICA.

Melo Hernández Jaime Javier IS16CO324

Titular de la materia:
MCA. Gil Santana Esparza.

Pánuco, Ver. 19 de diciembre de 2019


INTRODUCCIÓN.
El presente documento muestra conceptos subyacentes a los paradigmas de programación,
así como características que los hacen un enfoque particular y novedoso de la programación
que lo convierten en una clara opción frente al enfoque imperativo convencional en el área
del desarrollo de software.

El estilo de programación imperativa (es decir, la programación a través de acciones que


modifican el estado del computador) ha dominado el panorama de la programación desde
sus inicios; los lenguajes de más amplio uso están basados en estos paradigmas.

Una razón fundamental de este dominio reside en que los lenguajes imperativos son más
cercanos a la forma como realmente funciona la máquina. Existen otros paradigmas de
programación diferentes al imperativo como la programación funcional y la programación
lógica, cuyo estudio, desarrollo y uso han estado principalmente restringidos al ámbito
académico.

En el cual, en este documento se pretende mostrar las ideas subyacentes a la programación


basada en sus paradigmas, así como ilustrar las características que la hacen un enfoque
particular y novedoso de la programación.
DESARROLLO.
Para empezar, como punto central hacia el tema ¿Qué es un paradigma?.

Sabemos qué el término paradigma se origina en la palabra griega παράδειγμα


[parádeigma] que en griego antiguo significa "modelo" o "ejemplo". “Es aquello que debe ser
observado; la clase de interrogantes que deben desarrollarse para obtener respuestas en
torno al propósito que se persigue; qué estructura deben poseer dichos interrogantes y
marca pautas que indican el camino de interpretación para obtener los resultados.”
(Universidad de colima. “¿Qué es un paradigma?”. 2008)

Entonces entendemos como tal que un paradigma es un modelo a seguir, enfocándonos al


tema de programación existen 2 principales tipos de paradigma; Lógico y funcional.

Figura 1.1 “Paradigma Imperativo y Declarativo”.

Hay una gran cantidad de Lenguajes de Programación (LP), algunos han evolucionado más
que otros, algunos siguen vigentes, mientras otros han sido operativos durante períodos más
cortos y actualmente están en desuso.

Dada esta gran variedad, es difícil mostrar una visión de todos, sin embargo, resulta
más claro verlos bajo una clasificación o paradigma.

En general un lenguaje es un método conveniente que describe las estructuras de


información y las acciones para ejecución de una tarea.

Aspectos que provocan la evolución de los Lenguajes de Programación.

 Recursos y tipos de ordenadores


 Aplicaciones y necesidades de los usuarios
 Nuevos métodos de programación
 Estudios teóricos
 Estandarización

Cabe mencionar que estos aspectos son importantes, pues como se mencionaba en clase,
puede que existieran Lenguajes de Programación que fueron establecidos en un cierto
paradigma y por su evolución pasaron a ser de uno nuevo, un tal ejemplo sería: C# que paso
a C++.

Clasificación por paradigma.

Paradigma Imperativo.

• Describe la programación como una secuencia instrucciones o comandos que


cambian el estado de un programa.

• Indica el ¿Cómo? No el ¿Por qué?

• El código máquina en general está basado en el paradigma imperativo.

• Su contrario es el paradigma declarativo.

De los cuales se derivan:

 Programación Orientada a Objetos.


 Programación Estructurada.

Paradigma Orientado a Objetos.

 Basado en la idea de encapsular estado y operaciones en objetos.


 Se puede incluir, el paradigma basado en objetos, que posee herencia y subtipos
entre objetos.
 Lenguajes: Simula, Smalltalk, C++, Java, Visual Basic .NET, etc.
 Su principal ventaja es la reutilización de códigos y su facilidad para pensar soluciones
a determinados problemas.
Es un paradigma de programación dentro del paradigma imperativo que introduce
conceptos como:

 Clase: Definiciones de las propiedades y comportamiento de un tipo de objeto


concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto
a partir de ellas.
 Herencia: Es la facilidad mediante la cual la clase D hereda en ella cada uno de los
atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido
definidos por la misma D. Por lo tanto, puede usar los mismos métodos y variables
publicas declaradas en C. Los componentes registrados como "privados" (private)
también se heredan, pero como no pertenecen a la clase, se mantienen escondidos al
programador y sólo pueden ser accedidos a través de otros métodos públicos. Esto es
así para mantener hegemónico el ideal de OOP.
 Objeto: Entidad provista de un conjunto de propiedades o atributos (datos) y de
comportamiento o funcionalidad (métodos) los mismos que consecuentemente
reaccionan a eventos. Se corresponde con los objetos reales del mundo que nos
rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase.
 Método: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se
desencadena tras la recepción de un "mensaje". Desde el punto de vista del
comportamiento, es lo que el objeto puede hacer. Un método puede producir un
cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo
mensaje para otro objeto del sistema.

Características de la Programación Orientada a Objetos.

Existe un acuerdo acerca de qué características contempla la "orientación a objetos", las


características que conllevan a este estilo de programación son las más importantes:

Abstracción.

Denota las características esenciales de un objeto, donde se capturan sus comportamientos.


Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar
trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin
revelar cómo se implementan estas características. Los procesos, las funciones o los
métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas es
requeridas para ampliar una abstracción.
El proceso de abstracción permite seleccionar las características relevantes dentro de
un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en
el mundo real. La abstracción es clave en el proceso de análisis y diseño orientado a objetos,
ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la
realidad o el problema que se quiere atacar.

Encapsulamiento.

Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma
entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los
componentes del sistema. Algunos autores confunden este concepto con el principio de
ocultación, principalmente porque se suelen emplear conjuntamente.

Polimorfismo.

Comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo


nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto
que se esté usando. O, dicho de otro modo, las referencias y las colecciones de objetos
pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una
referencia producirá el comportamiento correcto para el tipo real del objeto referenciado.

“Como vimos en clase y comentamos en el grupo, sabemos que un paradigma es un


ejemplo de modelo, el imperativo conlleva a la programación orientada a objetos y esté es un
paradigma de programación enfocado en usar nuevas técnicas para mejorar la utilización de
recursos al hacer un programa.”

Paradigma Estructurado.
 La programación se divide en bloques (procedimientos y funciones) que pueden o no
comunicarse entre sí.
 Se controla con secuencia, selección e iteración.
 Permite reutilizar código programado y otorga una mejor compresión de la
programación.
 Indica el ¿qué hacer?

El primer paradigma formal de programación de computadores se conoció como la


programación estructurada, dado que es un modelo de programación que se basa en la
máquina de estados de Von Newmann y se fundamenta en tres estructuras básicas. Antes
de la programación estructurada se acudía a una técnica conocida como “programación
libre”, en la cual cada programador hacía sus programas como a bien tuviera.
Como consecuencia, el estudio exhaustivo de los programas realizados a partir de la
llamada programación libre permitió ir encontrando que todos los programas se encontraban
y hacían uso de tres estructuras específicas. A partir de allí, tomando los conceptos
matemáticos de la máquina de estados de von Newmann y de la máquina de Turing, se
configuro un paradigma que, luego de más de sesenta años de haber sido formulado, sigue
teniendo alguna vigencia; dado el tiempo de refinamiento, no solo perdura en algunas
expresiones tecnológicas, sino que ha abierto la puerta para que otros paradigmas irrumpan
en el mundo de la programación de computadores solucionando apropiadamente lo que el
paradigma estructurado no había podido solucionar, o para lo cual sus soluciones eran
altamente ineficientes o sus conceptos profundamente escasos (Van Roy, 2003).

“El propósito de este lenguaje es mantener un código en orden y como su nombre lo


dice ‘Estructurado’, mantener una estructura a seguir para que el programa y/o lenguaje de
programación pueda ser compilado, y en esta se indica como se debe programar algo para
resolver un determinado problema indicando al programa con un lenguaje de programación
determinado las instrucciones para resolverlo.”

Paradigma Declarativo.

• Incluye el paradigma procedimental (procedural)

• Describe (declara) cómo es algo (las propiedades dela solución buscada), dejando
indeterminado el algoritmo (conjunto de instrucciones) usado para encontrar esa
solución.

• Tiene desventajas en la eficiencia, pero ventajas en la solución de determinados


problemas.

Paradigma Funcional.

• Concibe a la computación como la evaluación de funciones matemáticas y evita


declarar y cambiar datos, hace hincapié en la aplicación de las funciones y
composición entre ellas, más que en los cambios de estados y la ejecución secuencial
de comandos (como lo hace el paradigma procedimental).

• Permite resolver problemas de forma elegante y evitan los efectos secundarios


comunes en otro tipo de programaciones.
La programación funcional se deriva del paradigma funcional, un modelo matemático
basado en el cálculo Lambda que posibilita la construcción de soluciones simples basadas
en funciones como núcleo básico de la programación.

La función constituye el elemento principal a partir del cual se construye una solución que
luego se revierte en un programa y que cuenta con características como paso de
argumentos, nominación única, recursión, omisión de declaraciones y retornos automáticos
(Schildt, 2000).

En la actualidad, la tendencia a construir soluciones basadas en funciones eficientes ha


posibilitado no solo que se fortalezca la programación funcional, sino también la
programación estructurada y la programación orientada a objetos, que son las tendencias
modernas que marcan el avance tecnológico en la actualidad (Van Santen, 2010).

Programación Lógica.

• Se basa en la definición de reglas lógicas para luego, a través de un motor de


inferencias lógicas, responder preguntas planteadas al sistema y así resolver los
problemas.

• Ej.: Prolog, Mercury, Oz.

“Es un paradigma de programación que se basa en la lógica de primer orden. Esta lógica
nos la han enseñado en la escuela en nuestras clases de español, que, mediante reglas,
puedes derivar conclusiones, por ejemplo:
Figura 1.2 “Ejemplo del entorno Prolog”.

Estilos de programación.

El estilo de programación se refiere a la forma en que se da formato al código fuente. Los


lenguajes de programación tienen la particularidad de cumplir un doble rol. Por un lado,
sirven para comunicar humanos con computadoras. Son la forma de transformar una serie de
abstracciones como algoritmos, módulos, tipos de datos y sistemas en algo que una
computadora pueda ejecutar.
Figura 1.3
“Estilos de programación”

“Esto más que nada, va en conjunto con los paradigmas de programación, pues como se
dice un estilo, es un modelo a seguir, cada uno, cada programador adopta el estilo a seguir
en base a su problemática pensando en como resolverlo.”

Evaluación de expresiones.

Una expresión es una combinación de operadores y operandos de cuya evaluación se


obtiene un valor. Los operandos pueden ser nombres que denoten objetos variables o
constantes, funciones, literales de cualquier tipo adecuado de acuerdo con los operadores u
otras expresiones más simples.

La evaluación de una expresión da lugar a un valor de algún tipo, una expresión se


dice que es del tipo de su resultado. Para evaluar una expresión es necesario conocer la
prioridad de los operadores, con lo cual se puede determinar cuál operación se va a realizar
antes que las demás.
Figura 1.4 “Jerarquía de Operadores en base a operaciones aritméticas”.

Tipos de datos.
Se comprende que los tipos de datos en un sentido amplio, un tipo de datos define un
conjunto de valores y las operaciones sobre estos valores. Casi todos los lenguajes de
programación explícitamente incluyen la notación del tipo de datos, aunque lenguajes
diferentes pueden usar terminología diferente.

La mayor parte de los lenguajes de programación permiten al programador definir


tipos de datos adicionales, normalmente combinando múltiples elementos de otros tipos y
definiendo las operaciones del nuevo tipo de dato. Por ejemplo, un programador puede crear
un nuevo tipo de dato llamado "Persona" que especifica que el dato interpretado como
Persona incluirá un nombre y una fecha de nacimiento.

Figura 1.5 “Clasificación de los tipos de datos”.


CONCLUSIÓN.

Para retomar como punto final en esta investigación, comprendí una nueva forma de ver la
programación, establecida por paradigmas y clasificación de ellos, de cómo utilizábamos uno
de los dos sin saberlo, claramente el paradigma imperativo además constatar que el
paradigma declarativo es muy poderoso si sabemos utilizarlo en nuestro conocimiento como
sismólogos ya que en la carrera nuestro enfoque fue hacia el paradigma estructurado y
orientado a objetos,

Además de que la optimización de código al utilizar la programación lógica y funcional


nos permite aprovechar mejor los recursos de nuestras computadoras al utilizar menos
memoria y gestionar mejor el poder de procesamiento y podemos lograr increíbles resultados
que con el paradigma imperativo nos llevaría mucho tiempo y recursos lograr.
REFERENCIAS BIBLIOGRAFICAS.

Van Roy P. “Concepts, Techniques and Models of Computer Programming”. (2003).


Estocolmo: Swedish Institute of Computer Science.

Trejos O. “Fundamentos de Programación”. (2005). Pereira, Editorial Papiro:

Trejos O. “La esencia de la lógica de programación”. (2002). Manizales: Centro Editorial


Universidad de Caldas.

Universidad Autónoma del Estado de México (UAEM). Programa de Estudios por


Competencias “Lenguaje de Programación Estructurado. (2016).

Gonzales Osorio Fabio A. “Programación funcional: conceptos y perspectivas”. (2007).


Universidad Nacional de Colombia.
MAPA CONCEPTUAL
PARADIGMAS DE LA
PROGRAMACIÓN.
UNIDAD 2:
MODELO DE PROGRAMACIÓN
FUNCIONAL
INSTITUTO TECNOLÓGICO SUPERIOR DE PÁNUCO

División de Ingeniería en
Sistemas Computacionales

PROGRAMACIÓN LOGICA &


FUNCIONAL

Reporte de investigación.
“Características de la programación funcional.”

UNIDAD II. MODELO DE PROGRAMACIÓN FUNCIONAL.

Melo Hernández Jaime Javier IS16CO324

Titular de la materia:
MCA. Gil Santana Esparza.

Pánuco, Ver. 19 de diciembre de 2019


INTRODUCCIÓN.
El presente documento muestra conceptos subyacentes al concepto de programación
funcional, así como características que los hacen un enfoque particular y novedoso de la
programación funcional que lo convierten en una clara opción frente al enfoque en el cual
surgió esta necesidad.

El principal objetivo del paradigma funcional es conseguir lenguajes expresivos y


matemáticamente elegantes, en los que no sea necesario bajar al nivel de la máquina para
describir el proceso llevado a cabo por el programa, y evitando el concepto de estado del
cómputo. La secuencia de computaciones llevadas a cabo por el programa se regiría única y
exclusivamente por la reescritura de definiciones más amplias a otras cada vez más
concretas y definidas, usando lo que se denominan definiciones dirigidas.

Claro que, para entender más el concepto de programación funcional, es necesario


adentrarse acerca de los orígenes de la programación funcional, y que en base a todo esto
su historia puede rastrearse al matemático Alonzo Church, que trabajaba en la Universidad
de Princeton, y, al igual que otros matemáticos de allí, estaba interesado en la matemática
abstracta, particularmente en el poder computacional de ciertas máquinas abstractas.

Al mismo tiempo que Church, otro matemático, Alan Turing, desarrolló una máquina
abstracta para intentar resolver el mismo tiempo de problemas planteados por Church. Como
consecuente, en este documento se pretende mostrar las ideas subyacentes a la
programación explicada, así como ilustrar las características que la hacen un enfoque
particular y novedoso de este paradigma de programación.
DESARROLLO.

Historia.

Su principal origen proviene del Cálculo Lambda (o λ-cαlculo), una teoría matemática
elaborada por Alonso 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 orígenes
teóricos del modelo funcional se remontan a la década del 30, más precisamente al año
1934, cuando Alonso Church introdujo un modelo matemático de computación llamado
lambda calculo.

A pesar de que en esta época las computadoras aun no existían, esté cálculo se
puede considerar como el primer lenguaje funcional de la historia y sus fundamentos fueron
la base de toda la teoría de la programación funcional y de los lenguajes funcionales
desarrollados posteriormente. Se puede decir que los lenguajes funcionales modernos son
versiones de lambda cálculo con numerosas ayudas sintácticas.

Características del lenguaje funcional.

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, en las que se verifican ciertas
propiedades como la transparencia referencial (el significado de una expresión depende
únicamente del significado de sus subexpresiones), y por tanto, la carencia total de efectos
laterales.

Otras características propias de estos lenguajes son la no existencia de asignaciones


de variables y la falta de construcciones estructuradas como la secuencia o la iteración (lo
que obliga en la práctica a que todas las repeticiones de instrucciones se lleven a cabo por
medio de funciones recursivas).

Existen dos grandes categorías de lenguajes funcionales: los funcionales puros y los
híbridos. La diferencia entre ambos estriba en que los lenguajes funcionales híbridos son
menos dogmáticos que los puros, al admitir conceptos tomados de los lenguajes
procedimentales, como las secuencias de instrucciones o la asignación de variables.
Características de la programación funcional.

Entre las características de la programación funcional destacamos:

 Programación declarativa
 Definición y evaluación de funciones
 Uso de la recursión
 Funciones como datos primitivos

Definición y evaluación de funciones.

Cualquier lenguaje funcional permite la definición de nuevas funciones como forma de


abstracción, y la evaluación de expresiones como forma de computación.

Ya hemos visto cómo definir y evaluar funciones en Scheme:

(define (cuadrado x) (* x x)) (+ (cuadrado 3) (cuadrado 2))

En esta expresión estamos definiendo una función con un argumento formal (x) que tiene
como cuerpo la expresión (* x x) y le estamos dando el nombre de cuadrado. Después
evaluamos una expresión en la que llamamos a la función recién definida y a la función
primitiva '+'.

En el caso de LISP sería lo mismo, pero de la siguiente forma;

(defun (argumento x)

( * x y))

(+ (cuadrado 3) (cuadrado 2))

Eso dependiendo del nombre de los argumentos, y las funciones a llamar.

“Cada lenguaje de programación tiene su sintaxis y propia escritura, en esté,


analizamos cómo hacer definiciones al mismo modo de como evaluar las funciones. En la
clase cuando trabajamos con el manual de prácticas en CLISP, existen demasiadas
funciones las cuales analizar, una de las más interesantes fue QUOTE, puesto a que es una
función que no evalúa nada simplemente regresa el argumento sin más, puede
malinterpretarse con que sería lo mismo a un print en java, caso que no es cierto”.

Expresiones y valores.
La noción de expresiones es central en la programación funcional. Existen muchos tipos de
expresiones matemáticas, quizás no todas permiten la misma notación, pero sí todas tienen
ciertas características comunes. La característica más importante de la notación matemática
es que una expresión se usa para denotar (o describir) un valor. “En otras palabras, el
significado de una expresión es su valor y no llegan a existir otros efectos ocultos.”

El valor de una expresión depende únicamente de los valores de las expresiones que
la constituyen (si es que existen) y estas sub-expresiones pueden reemplazarse libremente
por otras que posean el mismo valor.

El Lenguaje Lisp.

El Lisp es el lenguaje más importante del paradigma funcional. De él nacen una enorme
variedad de dialectos, de los que Scheme es uno de los más extendidos en ámbitos
académicos en la actualidad.

El origen del Lisp se remonta al año 1956, en el que John McCarthy estaba buscando
una solución para programar el computador IBM 704, en los primeros proyectos de
inteligencia artificial. A finales de 1958 McCarthy, ya profesor de Ingeniería Electrónica y
Marvin Minsky, profesor de matemáticas, ambos en el MIT, comenzaron el MIT Artificial
Intelligence Project e iniciaron la implementación del Lisp.

Uno de los factores que contribuyeron más al éxito del Lisp es su carácter pragmático.
No se trata de un lenguaje puramente funcional ni declarativo, sino que es posible realizar
sentencias imperativas en las que se modifican el valor de posiciones de memoria a las que
hacen referencia a variables.
CONCLUSIÓN.

Para retomar como punto final en esta investigación, comprendí una nueva forma de ver la
programación, establecida por el paradigma funcional y sus características.

La programación funcional nos permitirá desarrollar software mucho más legible y fácil
de testear, nos concentramos en qué estamos haciendo y no en cómo se está haciendo.

Incluso habrá ocasiones que solo con este paradigma pudiéramos resolver
problemáticas a soluciones complejas de la vida cotidiana entabladas al paradigma funcional
junto con sus métodos de programación. Y al igual que a lo largo de la materia, nos
enfocaremos más a esté, sin lugar a dudas será un aprendizaje importante en nuestra
formación en la carrera y un arma poderosa en la Ingeniería de software pues los programas
con este paradigma carecen de efectos colaterales.
REFERENCIAS BIBLIOGRAFICAS.

John C. Mitchel. “Concepts in Programming Languages”. Cambridge University. Press, 2003.


Cap. 3, 4.2 y 4.4.

Van Roy P. “Concepts, Techniques and Models of Computer Programming”. (2003).


Estocolmo: Swedish Institute of Computer Science.

Trejos O. “Fundamentos de Programación”. (2005). Pereira, Editorial Papiro:

Trejos O. “La esencia de la lógica de programación”. (2002). Manizales: Centro Editorial


Universidad de Caldas.

Universidad Autónoma del Estado de México (UAEM). Programa de Estudios por


Competencias “Lenguaje de Programación Estructurado. (2016).

Gonzales Osorio Fabio A. “Programación funcional: conceptos y perspectivas”. (2007).


Universidad Nacional de Colombia.
INSTITUTO TECNOLÓGICO SUPERIOR DE PÁNUCO

División de Ingeniería en
Sistemas Computacionales

PROGRAMACIÓN LOGICA &


FUNCIONAL

Reporte de investigación.
“Reconocer la estructura y elementos de
programación en el lenguaje LISP”

UNIDAD I. CONCEPTOS FUNDAMENTALES.

Melo Hernández Jaime Javier IS16CO324

Titular de la materia:
MCA. Gil Santana Esparza.

Pánuco, Ver. 19 de diciembre de 2019


INTRODUCCIÓN.
El presente documento muestra conceptos relacionados al lenguaje de programación LISP.

Sabemos que LISP. Es un lenguaje que muestra la información estructurada en listas


en las que se pueden gestionar la información que estas contienen. De ahí el nombre que se
le dió a este lenguaje, Lisp (List-Processing), porque fue creado principalmente para el
procesamiento de listas. Es un lenguaje funcional que se apoya en la utilización de funciones
matemáticas para el control de los datos. Pero el elemento fundamental en el Lisp es la lista.

De ahí los apuntes y temas comentados en clase, se retoman en este documento.


DESARROLLO.
Programación funcional.

La programación funcional es un paradigma de programación declarativa basado en la


definición puramente matemáticas. Lisp es un lenguaje representativo de este paradigma y
maneja intérpretes de expresiones top-level.

La programación funcional se caracteriza por los programas que regresan valores más
que modificar cosas. Lisp es un lenguaje con una sola sintaxis para expresar los programas.
Esta sintaxis se basa en listas. Lisp es un lenguaje matemático basado en la teoria de las
funciones recursivas y en el cálculo Lambda.

Hay una gran cantidad de programas escritos en Lisp para emular comportamiento
inteligente o bien sistemas expertos:

 Diagnóstico de infecciones en la sangre: MYCIN.


 Evaluar formaciones geológicas: Prospector.
 Asignar puertas de embarque en aeropuertos: Aris.
 Demostrar teoremas matemáticos: Otter.

2.1 El tipo de datos.

Lisp maneja los enteros. También las cadenas de caracteres delimitados por comillas. Los
enteros y las cadenas se evalúan a ellos mismos.

Los símbolos y las listas son los tipos de datos propios de Lisp. Los simbolos son
palabras. Los simbolos no se evalúan a si mismos. Si se requiere se debe usar Quote
(apóstrofe).

Las listas se representan como cero o más elementos entre paréntesis. Los elementos
pueden ser de cualquier tipo, incluso una lista. Si no se utiliza quote con las listas se tomarán
como llamada a una función.

'(ejemplo de lista)
Para lisp puede empezar escribir una lista, mientras uno no cierre el parentesis, seguira
esperando para realizar la lista. El error más frecuente al momento de programar son los
parentesis.

Se puede usar la función list para construir listas:

(list'(esta es una lista de)(+5 2)"elementos")

La lista vacía se representa con paréntesis vacios o con la palabra nil.

2.2 Funciones.

Para definir nuestras propias funciones se utiliza defun que trabaja con tres argumentos:

El nombre de la función, la lista de parámetros y el cuerpo de la función que puede ser una o
más expresiones.

Ejemplo:

(defun primero enlalista(variableparametro)

(car variableparametro)

Ejemplo para llamar la función:

(primeroenlalista '(x y z))

Los simbolos y en las listas deben acompañarse con quote para ser trabajados. De lo
contrario Lisp lo intenta procesar como código.

Ejemplo:

(defun multiplica (x y)

(* x y))
Ejemplo para llamar la función:

(multiplica 3 4)

2.4 Operadores.

En la expresión (+ 2 3) el simbolo + es llamado el operador y los numeros 3 y 4 son sus


argumentos o parametros. Como el operador viene al principio de la expresión, esta
notación se conoce como prefija.

Por ejemplo, si queremos sumar tres numeros en notación infija, necesitaremos usar
dos veces el operador +:

2+3+4

En Lisp, las siguientes sumas son válidas:

(+)

(+ 6)

(+ 6 1)

(+ 6 7 8)

Como los operadores pueden tomar un número variable de elementos.

Las expresiones pueden anidarse, esto es, el arguemnto de una expresión puede ser otra
expresión compleja:

(*(+ 7 2)(- 3 2))

(<(/ 6 3) 3)
Regla de evaluación de las expresiónes.

En Lisp, * es una función y (* 2 3) es una llamada a la función. Cuando Lisp evalúa una
llamada a alguna función, lo hace en dos pasos:

1. Los argumentos de las llamadas son evaluados de la izquierda a derecha.

2. Los valores de los argumentos son pasados a la función nombrada por el operador.

Si alguno de los argumentos es a su vez una llamada de la función, será evaluado con las
mismas reglas.

Ejemplo:

Evaluar la expresión (*(- 5 3)(/ 6 2)

1. Lisp evalúa el primer argumento de izquierda a derecha (- 5 2). 5 es evaluado como


5 y 2 es evaluado como 2. Estos valores son pasados a la función - que regresa el valor 3.

2. El siguiente argumento (/ 6 2)

Existen operadores en Lisp que no son funciones. Los operadores que no siguen las reglas
de evaluación se conocen como operadores especiales. Una de estos operadores especiales
es quote('). Quote no evalúa nada sólo despliega lo que el usuario introduce. Realmente se
utiliza para aquellos casos en los que se desea evitar que una expresión sea evaluada.

Ejemplo:

(quote(/ X Y))

2.5 Aplicaciones de las listas.

La función cons se utiliza para construir listas. Si su segundo argumento es una lista, se
regresa una nueva lista con el primer argumento agregado en el frente.
Ejemplo:

(cons'a'(b c d))

(cons'a(cons 'b nil))

Otra función para trabajar listas es car. El car de una lista es el elemento más a la izquierda.

Ejemplo:

(car '(x y z))

La funcion cdr es el resto de la lista quitando el primer elemento.

Ejemplo:

(cdr '(x y z))

Otras combinaciones pueden ser:

(car (cdr (cdr '(a b c d))))

(caddr '(a b c d))

(third '(a b c d))

Para analizar si un argumento es una lista se utiliza la función listp, que regresa el valor
verdadero (t) o el valor de falso (nil).
Condicionales.

La condicional if trabaja normalmente con tres argumentos: la expresión test, la expresión


then y la expresión else.

Ejemplo:

(if(listp'(x y z)

(* 6 3)

(/ 6 3)

(if(listp'(x y z)

(* 6 3)

(/ 6 3)

Variables.

En Lisp las variables no tienen tipo son los valores los que tienen un tipo. No es necesario
declarar el tipo de una variable porque cualquier variable puede recibir cualquier objetivo de
cualquier tipo.

El operador let se utiliza para crear variables locales.

Ejemplo:

(let((x 7)(y 8))

(* x y))

Una expresión let se conforma de dos partes:


La primera parte es la lista de expresiones que define las variables locales en el
formato:

 Variable-expresión. La expresión contiene el valor para inicalizar la variable.


 La segunda parte es el cuerpo de let conformado por el conjunto de expresión que
serán evaluados en el orden que aparecen.

Para crear variables globales se utiliza defparameter. Por convención, se definen las
variables globales con asterisco al inicio y fin del nombre definido.

Ejemplo:

(defparameter *varejemplo* "Gil")

Recursividad.

Una función puede llamar a cuawlquier función. Y si una función se llama a sí misma se
llama recursividad.

Ejemplo:

(defun numero()

(format t "Escribe un numero menor de 10:")

(let((num (read)))

(if (< num 10)

num

(numero))))
Iteración.

Para incluir ciclos se puede utilizar la iteración con do. El operador do puede crear variables y
su primer argumento es una lista de especificación de variables. El formato de esta lista es
(variable valor-inicial actualización).

Ejemplo:

(defun calculacuadrado (numinicial numfinal)

(do (

(i numinicial (+ i 1))

((> i numfinal) 'final)

(format t "~A ~A ~%" i(* i i))

CONCLUSIÓN.

Para retomar como punto final en este reporte, vimos prácticamente el lenguaje LISP, como
se utiliza, su complejidad y funciones a utilizar, realmente fue algo complejo, por el simple
hecho de ser algo nuevo y novedoso, pero que con algo de practica y como buen
programador tener, una buena lógica matemática, para entender la realidad de todo esto.
MAPA CONCEPTUAL
PROGRAMACIÓN
FUNCIONAL.
MANUAL DE PRACTICAS
INSTITUTO TECNOLÓGICO SUPERIOR DE PÁNUCO
INGENIERÍA EN SISTEMAS COMPUTACIONALES

MANUAL DE PRÁCTICAS DE LABORATORIO

de LISP

MATERIA:

PROGRAMACIÓN LÓGICA Y FUNCIONAL

ELABORÓ:

M.C.A. GIL SANTANA ESPARZA


INTRODUCCIÓN.

La asignatura de Programación Lógica y Funcional aporta al perfil del Ingeniero en Sistemas


Computacionales la capacidad de desarrollar habilidades para la generación de soluciones
automatizadas basadas en lenguajes de inteligencia artificial, considerando el entorno y la aplicación
de diversas técnicas, herramientas y conocimientos.

Los programas para computadora actualmente son fundamentales en muchas áreas del ser humano,
debido a que se usan para resolver diversos problemas en la ciencia, la industria y los negocios. Para
cubrir estas necesidades, se han desarrollado lenguajes de programación dentro de la inteligencia
artificial. El Ingeniero en Sistemas Computacionales contribuirá, aplicando estos conocimientos para
la solución de problemas a través de la programación lógica y funcional, con una conciencia ética y
de respeto al medio ambiente.
OBJETIVO GENERAL.

Conocer los principios lógicos y funcionales de la programación para identificarlos y aplicarlos en la


resolución de problemas.

COMPETENCIAS GENÉRICAS A DESARROLLAR.

Competencias instrumentales:

• Capacidad de análisis y síntesis.

• Conocimientos básicos de la carrera.

• Manejo de todos los recursos que proporciona la computadora.

• Solución de problemas.

• Toma de decisiones.

Competencias sistémicas:

• Capacidad de aplicar los conocimientos en la práctica.

• Capacidad de aprender.

• Capacidad de generar nuevas ideas.

• Habilidad para trabajar en forma autónoma.

• Búsqueda del logro.

Competencias interpersonales:

• Capacidad crítica y autocrítica.

• Habilidades interpersonales.
NOMBRE DE LA PRÁCTICA: Funciones básicas.
No. DE PRÁCTICA: 1

OBJETIVOS: Aplicar y analizar los comandos básicos de


LISP y sus elementos funcionales.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique la función QUOTE y sus variantes analizando su
funcionalidad y determinando cuál es el número de argumentos que recibe, qué tipo de argumentos
recibe y, cuál es el valor de retorno.

Describa el desarrollo de la práctica y anote los resultados y/o conclusiones.

DESARROLLO:

Para el desarrollo de la practica, en la parte del Shell de GNU de CLISP.

Operador Argumento.

(quote ( A B C ) )

[1]> (quote (A B))

(A B)

[2]> (quote (A B C))

(A B C)

[3]> (quote (A B C D))

(A B C D)

[4]> (quote (A B C D E))

(A B C D E)

[5]> (quote (A B C D E F))


(A B C D E F)

[6]> (quote (A B C D E F G))

(A B C D E F G)

[7]> (quote (A B C D E F G 56))

(A B C D E F G 56)

[8]> (quote (A B C D E F G 56 89))

(A B C D E F G 56 89)

[9]> (quote (A B C D E F G 56 89 100000))

(A B C D E F G 56 89 100000)

[10]> (quote (Jaime Javier Melo Hernandez))

(JAIME JAVIER MELO HERNANDEZ)

[11]> (quote (Jaime Javier Melo Hernandez 1.5))

(JAIME JAVIER MELO HERNANDEZ 1.5)

[12]> (quote (Jaime Javier Melo Hernandez 1.5 true))

(JAIME JAVIER MELO HERNANDEZ 1.5 TRUE)

[13]> (quote (Jaime Javier Melo Hernandez 1.5 true false))

(JAIME JAVIER MELO HERNANDEZ 1.5 TRUE FALSE)

[14]> (quote (+ 4 5Jaime Javier Melo Hernandez 1.5 true false))

(+ 4 5JAIME JAVIER MELO HERNANDEZ 1.5 TRUE FALSE)

[15]> (quote (+ 4 5 Jaime Javier Melo Hernandez 1.5 true false))

(+ 4 5 JAIME JAVIER MELO HERNANDEZ 1.5 TRUE FALSE)

[16]> (quote (+ 4 5 Jaime Javier Melo Hernandez 1.5 true false * # $%))
En el paso 16 vemos como el carácter “#” no es admito, puesto que CLIPS lo detecta
como un carácter especial.

Mandando el siguiente mensaje “READ en #<INPUT CONCATENATED-STREAM #<INPUT


STRING-INPUT-STREAM> #<IO TERMINAL-STREAM>>: los objetos escritos como # a
causa de *PRINT-LEVEL* no pueden volverse a leer”

Aquí el mensaje de erro al introducir el carácter “#”.


RESULTADOS/CONCLUSIONES:

Referente a la practica 1, al realizarla comprendí que “QUOTE (‘)” no es una función en sí, sino
más bien es un operador especial que no evalúa nada, simplemente regresa o despliega los
datos introducidos por el usuario.

NOMBRE DE LA PRÁCTICA: Funciones básicas.


No. DE PRÁCTICA: 2

OBJETIVOS: Aplicar y analizar los comandos básicos de


LISP y sus elementos funcionales.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique las funciones CAR y CDR analizando su funcionalidad y
utilidad, tomando como base los siguientes ejercicios:

CAR (A B C)

CAR (QUOTE (A B C))

CAR ‘(x y z)

CDR ‘(x y z)

(car (cdr (cdr ‘(a b c d))))

(caddr ‘(a b c d))

(third ‘(a b c d))

Determine cuál es el número de argumentos que recibe, qué tipo de argumentos recibe y, cuál es el
valor de retorno.
Describa el desarrollo de la práctica y anote los resultados y/o conclusiones.

DESARROLLO:

 CAR (A B C)

o La primera marca que no esta definida, puesto a que CAR es una propiedad del
CLIPS, al momento de evaluar manda el siguiente error “EVAL: la función A no está
definida”
 CAR (QUOTE (A B C))

o Evalua la expresion obtenida de quote, dando como resultado siempre el primer valor
de esta.
 CAR ‘(x y z)

o Es lo mismo que el operador QUOTE, realiza la misma acción.


 CDR ‘(x y z)

o Aplica lo mismo que la función CAR, solo que esta devuelve como resultado, todos los
valores pasados el primero.
 (car (cdr (cdr ‘(a b c d))))

o Devuelve como resultado el tercer valor del argumento, al tomar principalmente la


primera expression que sería cdr, nos mandaría el valor c, con la segunda expression,
sería la b, y la ultima como es conjunto de todas, da el 3er resultado.
 (caddr ‘(a b c d))

 (third ‘(a b c d))


o Al mismo modo de las 2 funciones anteríores, esta obtiene el tercer resultado del
argumento.

RESULTADOS/CONCLUSIONES:

Podemos aplicar diferentes funciones en Lisp que nos llevaran a un mismo resultado, pero
su forma de ejecutarlo será diferente.

NOMBRE DE LA PRÁCTICA: Funciones básicas.


No. DE PRÁCTICA: 3

OBJETIVOS: Aplicar y analizar los comandos básicos de


LISP y sus elementos funcionales.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique la función EQ analizando su funcionalidad, tomando


como base los siguientes ejercicios:

EQ (COMPUTADORA COMPUTADORA)

EQ (PC pc)

EQ (QUOTE PC ‘PC)

EQ (RED REDES)

Determine cuál es el número de argumentos que recibe, qué tipo de argumentos recibe y, cuál es el
valor de retorno.

Describa el desarrollo de la práctica y anote los resultados y/o conclusiones.


DESARROLLO:

 EQ (COMPUTADORA COMPUTADORA)
o
 EQ (PC pc)
 EQ (QUOTE PC ‘PC)
 EQ (RED REDES)

RESULTADOS/CONCLUSIONES:

NOMBRE DE LA PRÁCTICA: Definición de Funciones.


No. DE PRÁCTICA: 4

OBJETIVOS: Aplicar y analizar los comandos para definir


nuevas funciones del usuario.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique la función DEFUN analizando su funcionalidad, tomando
como base los siguientes ejercicios:
- Defina una función que reciba como parámetro una lista variable y regrese el primer elemento
de la lista.
- Defina una función que reciba dos elementos como parámetros y regrese la multiplicación de
los mismos.

Determine cuál es el número de argumentos que recibe, qué tipo de argumentos recibe y, cuál es el
valor de retorno.

Describa el desarrollo de la práctica y anote los resultados y/o conclusiones.

DESARROLLO:

 Defina una función que reciba como parámetro una lista variable y regrese el primer elemento
de la lista

Se creo una función la cual, regreso un parámetro mostrando el primer elemento en la lista.

 Defina una función que reciba dos elementos como parámetros y regrese la multiplicación de
los mismos.

Se definió una función multiplica la cual recibe dos parámetros como valores, al mandar a llamar a
esta función, realiza la ejecución de una multiplicación.

RESULTADOS/CONCLUSIONES:
Se analizo la creación de una función a utilizar, es indispensable recalcar que como estas
funciones trabajan en memoria, al cerrar el programa se borran. Por lo que es mejor, guardar
la sintaxis en un editor de texto con la extensión “.lisp” y después compilarla con clisp, si el
código esta bien, este se compila y deja dos archivos extra.

NOMBRE DE LA PRÁCTICA: Operadores.


No. DE PRÁCTICA: 5

OBJETIVOS: Aplicar y analizar los operadores para evaluar


expresiones.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique la notación prefija para realizar las operaciones con los
siguientes números:

SUMAS:

2, 3 y 4.

6y1

6, 7 y 8

EXPRESIONES:

SUMA 7 y 2

RESTA 3 y 2
MULTIPLICA LOS RESULTADOS ANTERIORES

DESARROLLO:

 2, 3 y 4.

 6

 6y1

 6, 7 y 8

RESULTADOS/CONCLUSIONES:

Analizando las sumas de estas expresiones y la sintaxis correspondiente. Como el operador


viene al principio de la expresión, esta notación se conoce como prefija. Y Cuando Lisp evalúa
una llamada a alguna función, lo hace en dos pasos.

NOMBRE DE LA PRÁCTICA: Operadores.


No. DE PRÁCTICA: 6

OBJETIVOS: Aplicar y analizar los operadores para evaluar


expresiones.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.
INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP evalúa las siguientes expresiones y analiza el comportamiento de
cada argumento:

(* (- 5 2) (/ 6 2))

(quote (/ 18 3))

‘ (/ 18 3)

DESARROLLO:

 (* (- 5 2) (/ 6 2))

 (quote (/ 18 3))

 ‘ (/ 18 3)

RESULTADOS/CONCLUSIONES:
Con las practicas realizadas anteriormente comprendemos que Lisp evalúa el primer
argumento de izquierda a derecha (- 5 2). 5 es evaluado como 5 y 2 es evaluado como 2. Estos
valores son pasados a la función - que regresa el valor 3.

En la primera operación los argumentos de las llamadas son evaluados de la izquierda a


derecha. Ademas de que los valores de los argumentos son pasados a la función nombrada
por el operador.

NOMBRE DE LA PRÁCTICA: Operadores lógicos.


No. DE PRÁCTICA: 7

OBJETIVOS: Aplicar y analizar los operadores lógicos para


evaluar expresiones.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP evalúa las siguientes expresiones y analiza el comportamiento de
cada argumento:

(and t (/ 6 3))

(and t t (* 6 3))

(and t t (* 6 3) t)

(and t nil (* 6 3))

(and t t (* 6 3) nil)
(or nil (* 5 3) nil)

DESARROLLO:

 (and t (/ 6 3))

 (and t t (* 6 3))

 (and t t (* 6 3) t)

 (and t nil (* 6 3))

 (and t t (* 6 3) nil)

 (or nil (* 5 3) nil)

RESULTADOS/CONCLUSIONES:

Retorna en modo de operadores lógicos, mostrando según lo que indique la operación y


muestra lo que este a la derecha, en la segunda expresón.
En el elemento nil, se vuelve todo 0 por su estructura de control, mientras que el elemento or
regresa el valor más a la izquierda diferente de nil.

Esto lo vimos en la materia de matemáticas discretas y otras materias.+

NOMBRE DE LA PRÁCTICA: Aplicaciones de las listas.


No. DE PRÁCTICA: 8

OBJETIVOS: Aplicar y analizar la función para construir


listas.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique la función CONS analizando su funcionalidad, tomando
como base los siguientes ejercicios:

cons ’a ’ (b c d)

cons ’a (cons ’b nil)

Determine cuál es el número de argumentos que recibe, qué tipo de argumentos recibe y, cuál es el
valor de retorno.

Describa el desarrollo de la práctica y anote los resultados y/o conclusiones.

DESARROLLO:
 cons ’a ’ (b c d)

 cons ’a (cons ’b nil)

RESULTADOS/CONCLUSIONES:

En clase el Docente nos explicaba que Lisp maneja funciones como en este caso la practica
con la función cons, la cual es utilizada para construir listas. Si su segundo argumento es una
lista, se regresa una nueva lista con el primer argumento agregado en el frente.

NOMBRE DE LA PRÁCTICA: Condicionales.


No. DE PRÁCTICA: 9

OBJETIVOS: Aplicar y analizar el uso de instrucciones


condicionales.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique la condicional IF analizando la lógica para los casos
verdaderos y el comportamiento para el caso falso, tomando como base los siguientes ejercicios:

(if (listp ‘(x y z))


(* 6 3)

(/ 6 3))

(if (listp 18)

(+ 6 3)

(- 6 3))

Determine cuál es el número de argumentos que recibe, qué tipo de argumentos recibe y, cuál es el
valor de retorno.

Describa el desarrollo de la práctica y anote los resultados y/o conclusiones.

DESARROLLO:

(if (listp ‘(x y z))

(* 6 3)

(/ 6 3))

Si este es una lista hace una operación true. Si no detecta que es una lista ejecuta un false.

(if (listp 18)

(+ 6 3)

(- 6 3))
Verifica si el valor en el if es una lista, al no serla este se convierte en un else, realizando la segunda
operación.

RESULTADOS/CONCLUSIONES:

Entendemos que la función if es una condicional, en clase que se comentaba que la


condicional if trabaja normalmente con tres argumentos: la expresión test, la expresión then y
la expresión else.

NOMBRE DE LA PRÁCTICA: Recursividad.


No. DE PRÁCTICA: 10
OBJETIVOS: Aplicar y analizar la recursividad en LISP.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique la recursividad analizando la lógica y su comportamiento,


tomando como base el siguiente ejercicio:

- Escriba un programa LISP recursivo que determine si un número es primo.

DESARROLLO:
RESULTADOS/CONCLUSIONES:

Referente a la practica realizada, realmente fue algo complejo de realizar.


La función en si solo recibirá dos parámetros que se evaluan entre la primera condición y la
otra para saber si es primo y el divisor,

NOMBRE DE LA PRÁCTICA: Iteraciones.


No. DE PRÁCTICA: 11
OBJETIVOS: Aplicar y analizar los ciclos en LISP.
RECURSOS: GNU CLISP, Laptop o PC de laboratorio.

INSTRUCCIONES:

Utilizando el SHELL de GNU CLISP aplique la iteración con la instrucción DO para resolver el
siguiente ejercicio:

- Escriba un programa LISP que defina la función para calcular el cuadrado de un rango de
números. La función debe recibir dos argumentos: valor inicial y valor final, y debe calcular el
cuadrado de los números comprendidos en ese rango.

DESARROLLO:
RESULTADOS/CONCLUSIONES:

Este fue uno de los más difíciles de realizar.


UNIDAD 3:
PROGRAMACIÓN LOGICA
INSTITUTO TECNOLÓGICO SUPERIOR DE PÁNUCO

División de Ingeniería en
Sistemas Computacionales

PROGRAMACIÓN LOGICA &


FUNCIONAL

Reporte de investigación.
“Sintaxis y semántica de la lógica de primer orden y
cláusulas de Horn”

UNIDAD III. PROGRAMACIÓN LÓGICA.

Melo Hernández Jaime Javier IS16CO324

Titular de la materia:
MCA. Gil Santana Esparza.

Pánuco, Ver. 19 de diciembre de 2019


INTRODUCCIÓN.
El presente documento muestra conceptos relacionados a la programación lógica.

Una forma de razonar para resolver problemas en matemáticas se fundamenta en la


lógica de primer orden. El conocimiento básico de las matemáticas se puede representar en
la lógica en forma de axiomas, a los cuales se añaden reglas formales para deducir cosas
verdaderas (teoremas) a partir de los axiomas.

Gracias a físicos matemáticos del siglo pasado, se encontró la manera de automatizar


computacionalmente el razonamiento lógico, particularmente para un conjunto significativo de
la lógica de primer orden, que permitió que la lógica matemática diera origen a otros tipos de
lenguajes de programación, conocidos como lenguajes lógicos.

También se conoce a estos lenguajes como lenguajes declarativos, porque todo lo que
el programador tiene que hacer para solucionar un problema es describirlo vía axiomas y
reglas de deducción. Dando referencia a todo esto, como introducción al tema de
investigación.
DESARROLLO.
Programación lógica.

La programación lógica tiene sus orígenes en los trabajos de prueba automática de


teoremas. Para esto se utiliza una única regla de inferencia llamada principio de resolución,
mediante la cual la prueba de un teorema puede ser llevada a cabo en forma automática. La
resolución es una regla que se aplica sobre las fórmulas surgidas de la lógica de primer
orden y la demostración de teoremas mediante esta regla de inferencia se lleva a cabo por
reducción al absurdo.

3.1 Repaso de la lógica de primer orden.

Se sabe como tal, que la mayoría de los lenguajes de programación se basan en la teoría lógica de
primer orden, aunque también incorporan algunos comportamientos de orden superior, en este sentido,
destacan los lenguajes funcionales ya que se basan en el Cálculo Lambda, es la única teoría lógica de
orden superior.

Esto ya mencionado en unidades anteriores y temas mencionados en clase. Dos


definiciones que pueden definir de manera simple son:

"Modelar problemas por medio de la abstracción, utilizando un sistema de lógica


formal que permite llegar a una conclusión por medio de hechos y reglas"

"Aplicación de reglas de la lógica para inferir conclusiones a partir de datos."

Para entender todo esto, es necesario entender ¿Qué es la programación lógica?

Como respuesta a la pregunta, La programación lógica, junto con la funcional, forma parte de
lo que se conoce como Programación Declarativa, es decir la programación consiste en
indicar como resolver un problema mediante sentencias, en la Programación Lógica, se
trabaja en una forma descriptiva, estableciendo relaciones entre entidades, indicando no como,
sino que hacer.
Para definir la idea, se dice que la idea esencial de la programación lógica es:

3.2 Unificación y resolución.

Para probar la existencia de algo:

Suponer lo opuesto y usar modus ponens y la regla de eliminación del cuanticador universal,
para encontrar un contra ejemplo al supuesto.

Modus Ponendo Ponens.

El modus ponendo ponens es un tipo de argumento lógico, de inferencia razonada,


perteneciente al sistema formal de las reglas de deducción de la conocida lógica
proposicional. Esta estructura argumentativa es la pauta inicial que se transmite en la lógica
proposicional y se relaciona directamente con los argumentos condicionales.

El argumento modus ponendo ponens puede ser visto como un silogismo de dos patas, que
en vez de usar un tercer término que le sirva de enlace, más bien utiliza una sentencia
condicional con la cual relaciona al elemento antecedente con el elemento consecuente.

Entendiendo el concepto, podemos ver al modus ponendo ponens como un


procedimiento (modus) de las normas de deducción, que por medio de la aseveración
(ponendo) de un antecedente o referencia, logra aseverar (ponens) a un consecuente
o conclusión.

Esta formulación razonable parte de dos proposiciones o premisas. Busca poder


deducir a través de estas una conclusión que, a pesar de estar implícita y
condicionada dentro del argumento, requiere de una doble afirmación —tanto del
término que le precede como de sí misma— para poder llegar a ser considerada un
consecuente.

Modus Ponendo Tollens.

Modus ponendo tollens es una regla de inferencia válida de la lógica proposicional, a veces
abreviado MPT. El modus ponendo tollens establece que, si no es posible que dos términos
sean simultáneamente verdaderos; y uno de ellos es verdadero; entonces se puede inferir
que el otro término no puede ser verdadero.

El modus ponendo tollens puede escribirse formalmente como:

donde cada vez que aparezcan las instancias de " ¬(𝑃⋀𝑄) " y " 𝑃 " en las líneas de una
demostración, se puede colocar " ¬𝑄 " en una línea posterior. En resumen, "si P y Q no
pueden ser verdad simultáneamente, y P es verdad, entonces Q no puede ser verdad."

Referente a la conclusión del tema Modus ponendo tollens, es el principio de que, si se


sostiene la negación de una conjunción, y también una de sus oraciones conjuntivas,
entonces la negación de la otra oración conjuntiva asimismo se sostiene.

3.3 Cláusulas de Horn.

Resolución SLD.

La resolución general es un mecanismo muy potente de demostración... pero tiene un alto


grado de indeterminismo: en la selección de las cláusulas con las que hacer resolución y en
la selección de los literales a utilizar en la resolución Desde el punto de vista computacional
es muy ineficiente.

Una cláusula de Horn es una secuencia de literales que contiene a lo sumo un literal positivo.
Al escribirla en notación de Kowalski tendrá una de estas cuatro formas:
Los hechos y las reglas se denominan cláusulas definidas: los hechos representan “hechos
acerca de los objetos” (de nuestro universo de discurso), relaciones elementales entre estos
objetos las reglas expresan relaciones condicionales entre los objetos, dependencias.

Selection-rule driven Linear resolution for Definite clauses.

Es un caso particular de la resolución general, donde: Los resolventes son siempre objetivos
(cláusulas sin cabeza). Los programas son conjuntos de cláusulas (de Horn) definidas, i.e.,
hechos y reglas. Hay una función de selección que selecciona un átomo del resolvente a
quien aplicar resolución.

Esto es un ejemplo de una cláusula de Horn:


CONCLUSIÓN.

Como punto final, doy como entendido en los lenguajes lógicos se utiliza el formalismo de la
lógica de primer orden para representar el conocimiento sobre un problema y para hacer
preguntas que, si se demuestra que se pueden deducir a partir del conocimiento dado en
forma de axiomas y de las reglas de deducción estipuladas, se vuelven teoremas.

Así se encuentran soluciones a problemas formulados como preguntas. Con base en


la información expresada dentro de la lógica de primer orden, se formulan las preguntas
sobre el dominio del problema y el intérprete del lenguaje lógico trata de encontrar la
respuesta automáticamente.

El conocimiento sobre el problema se expresa en forma de predicados (axiomas) que


establecen relaciones sobre los símbolos que representan los datos del dominio del
problema.

Para que todo esto visto, lo implementemos en la siguiente unidad, ya en base a la


programación en el lenguaje de PROLOG.
REFERENCIAS BIBLIOGRAFICAS.

Modus ponendo ponens. 2013. Lógica. España: Webnode. Recuperado de: leyes-de-
inferencia5.webnode.es.

Mazón, R. (2015). Ponendo ponens. México: Súper Mileto. Recuperado de:


supermileto.blogspot.com.
MAPA CONCEPTUAL
MANUAL DE EJERCICIOS
INSTITUTO TECNOLÓGICO SUPERIOR DE PÁNUCO

División de Ingeniería en
Sistemas Computacionales

PROGRAMACIÓN LOGICA &


FUNCIONAL

MANUAL DE PRACTICAS.
“Ejercicios de lógica de primer orden”

UNIDAD III. PROGRAMACIÓN LÓGICA.

Melo Hernández Jaime Javier IS16CO324

Titular de la materia:
MCA. Gil Santana Esparza.

Pánuco, Ver. 19 de diciembre de 2019


UNIDAD 3: PROGRAMACIÓN LÓGICA.
Lógica de predicados.
Predicado: Expresión que se puede conectar con una o varias expresiones formando una
oración.

Marisol es una alumna.

Es una alumna es un predicado que se conecta con la expresión Marisol.

 Modo en el que razonamos con expresiones.


o Predicado con expresión = propiedad
o Predicado con dos o más expresiones = relación
Ejemplos:

Marisol es una alumna. (Propiedad)

Marisol es más brillante que Ernesto. (Relación)

 Predicados como funciones.


Funciones cuyos argumentos puedan ser expresiones.

Marisol es una alumna.

Como función:

Alumno (Marisol)

A (m)

 Predicados como funciones.


Carlos compró un carro.

Compró un carro (Carlos)

C (c)

Marisol es más brillante que Ernesto

Más brillante (Marisol, Ernesto)

B (m, e)
La lógica de predicados permite representar objetos y propiedades a diferencia de la lógica
proposicional que sólo considera hechos.

Los objetos pueden ser:

 Personas
 Objetos físicos
 Conceptos

 Las cualidades, relaciones o atributos se denominan predicados.


 Los objetos se conocen como argumentos o términos del predicado.
 Los predicados tienen un valor de veracidad que depende de sus términos.
 Un predicado puede ser verdadero para un conjunto de términos, pero falso para otro.

Ejercicio: Para las siguientes oraciones indica donde existe una relación y donde una
propiedad. Después expresarlas como funciones.

1. Pedro estudia la misma carrera que Juan. (Relación)


2. Predo y Juan estudian juntos. (Relación)
3. A(m). (Propiedad)
4. Jorge arregla la computadora de Mary. (Relación)
Objetos:

Personas, cosas, números, colores, animales, …

Relaciones:

Diferente_que, hermano_de, cerca_de, amigo_de, de_color, hijo_de, padre_de,


vive_en, es_el_dueño…

Propiedades:

Rojo, redondo…

Funciones:

el_siguiente, mayor_que, sumatoria


Conectivas:

¬ (Negación) ¬P

^ (Conjunción) P^Q

V (Disyunción) PvQ

→ (Condicional P → Q ( ¬P v Q)

←→ (Bicondicional: Si o solo si) P ←→ Q ((P → Q) ^ (Q → P))

Ɐ (Cuantificador universal) (para cada x, para cada todo x, cada x, todo x, cualquier x, todos)

ⱻ (Cuantificador existencial) para algunos.

Para representar los predicados utilizando conectivas lógicas se simplificará su expresión.

Carlos nada rápido.

Nada rápido (Carlos)

N(c)

Nc

Martha está alegre

Ésta alegre (Martha)

A(m)

Am

Andrés es un miembro del club

Ma

Juan es un musico

Sj
El salón está desordenado

Ds

La mesa es cuadrada

Cm

Luis nombró secretario a José

Sij

Si Adriana es alta, entonces Karla es baja.

Alta (Adriana)

O el autobús se ha retrasado o este horario está equivocado.

Si Antonio está aquí, entonces puede empezar la asamblea.

Juan ganará si y sólo si entrena cada día.

Brasil está en América y Canadá está en América.

Definición de términos.

1. Los símbolos para términos y predicados se dan por separado.


2. El número de términos apropiados al predicado se indica añadiendo al predicado un
número de variables igual al de términos.
3. Entre la formula en símbolos lógicos y su equivalente en lenguaje ordinario se coloca
un término de enlace de equivalencia < - >
4. El signo = se coloca entre los símbolos lógicos para términos que representan objetos
aislados y los nombres correspondientes en el lenguaje corriente de los mismos
objetos.
La demostración y sus métodos.
Conociendo las formas de las proposiciones y teniendo los instrumentos de simbolización,
podemos dirigirnos hacia una parte importante de la Lógica formal: Inferencia y deducción.

Se empieza con conjuntos de fórmulas que se denominan premisas. El objetivo es


utilizar las reglas de la inferencia de manera que conduzcan a otras fórmulas que se
denominan conclusiones. La conclusión que se obtiene es consecuencia lógica de las
premisas si cada paso que se da para llegar a la conclusión está permitiendo sus reglas.

La idea de inferencia se puede expresar de la manera siguiente:

Si las premisas son verdaderas, entonces las conclusiones que se derivan de ellas
lógicamente, han de ser verdaderas.

Considerando las siguientes fórmulas:

P -> Q ; P

La primera expresión expresa que, si se verifica P, entonces se

Reglas de inferencia y demostración

Demostraciones.

Cuando se usa una regla de inferencia para pasar de un conjunto de proposi

Modus Ponendo Ponens. Regla de inferencia (método) que permite demostrar Q a permitir
de P -> Q

Premisa 1. Si él está en el partido de futbol, entonces él está en el estadio.

Premisa 2.

Modus Ponendo Ponens.

Esta regla de inferencia es el método (modus), que afirma (ponens) el consecuente,


afirmando (ponendo) el antecedente.
Esquematizando:

1. R -> S P
2. R S
3. S PP 12

1. ¬A ->¬B 4. M 1. R

2. ¬A 5. M -> N 2. R -> (¬TvQ)

1. ¬B 6. N 3. ¬TvQ

1. A -> B P

2. B -> C P

3. A P

4. B PP 1,3

5. C PP 2,4

1. S ->¬T P

2. S P

3. ¬T->R P

4.¬T PP 1,2

5. R PP 3,4

Si se levanta aire húmedo, entonces refrescará.

Si refresca, entonces se formarán nubes.

Se levanta aire húmedo.

Entonces se formarán nubes.

A = se levanta aire húmedo

R = refrescará
N = se formarán nubes.

1. A->R

Premisas y conclusiones.

1. Todos los perros son animales. Lassie es un perro. Por tanto, Lassie es un animal.

P = perros

A = animales

L = Lassie

Ɐ x (Px -> Ax)

1. Pl -> Ax P

2. Pl P

3. Al PP 1,2

2. Todos los loros son pájaros. Todos los pájaros son vertebrados. Polly es un loro. Por
tanto, Polly es un vertebrado.

L = loros

J = pájaros

V = vertebrados

P = Polly

Ɐ x (Lx -> Px)

Ɐ x (Px -> Vx)

1. Lp -> Pp

2. Pp -> Vp

3. Lp

4. Pp PP 1,3

5. Vp PP 2,4
La demostración y sus métodos.

Regla de inferencia y demostración.

Modus Tollendo Tollens. Regla de inferencia que se aplica también a las reglas
proposicionales. Pero en este caso, negando (tollendo) el consecuente, se puede negar
(tollens) el antecedente de la condicional.

Premisa 1. Si tiene luz propia, entonces el astro es una estrella.

Premisa 2. El astro no es una estrella.

Conclusión. Por tanto, no tiene luz propia.

P = tiene luz propia 1. P -> Q P

Q = el astro es una estrella. 2. ¬Q P

3. ¬P T T 1,2

Permite pasar de dos premisas: (a) es una premisa condicional y (b) una preposición que
niega el consecuente.

3. Todo presidente es un Jefe de Estado nombrado por elección. Un jefe de estado no


nombrado por elección es un monarca. El rey Balduino es un monarca. Por tanto, el rey
Balduino no es un presidente.

P = presidente

J = Jefe de Estado

M = monarca

B = Balduino

Ɐ x (Px -> Jx)


Ɐ x (Jx¬M)
UNIDAD 4:
MODELOS DE PROGRAMACIÓN
LÓGICA.
INSTITUTO TECNOLÓGICO SUPERIOR DE PÁNUCO

División de Ingeniería en
Sistemas Computacionales

PROGRAMACIÓN LOGICA &


FUNCIONAL

Reporte de investigación.
“Estructura del lenguaje Prolog.”

UNIDAD IV. MODELO DE PROGRAMACIÓN LÓGICA.

Melo Hernández Jaime Javier IS16CO324

Titular de la materia:
MCA. Gil Santana Esparza.
Pánuco, Ver. 19 de diciembre de 2019
INTRODUCCIÓN.
El presente documento muestra conceptos subyacentes al concepto de
programación lógica, así como características que los hacen un enfoque particular
y novedoso de la programación lógica que lo convierten en una clara opción frente
al enfoque en el cual surgió esta necesidad. Principalmente los lenguajes más
usados en IA: Lisp y Prolog.

El concepto de lógica está ligado al del pensamiento científico. Así como la


lógica provee de un lenguaje preciso para expresar en forma explícita las metas,
conocimiento, suposiciones.

Las computadoras también son objeto de estudio científico. Al igual que la


lógica requieren de una forma precisa y de proposiciones explícitas para expresar
nuestras metas y suposiciones.

Sin embargo, mientras la lógica se ha desarrollado con el pensamiento


humano como única consideración externa, el desarrollo de la máquina ha estado
gobernado desde el principio por restricciones de tecnología e ingeniería. Aunque
las computadoras fueron diseñadas para ser usadas por el hombre, sus
dificultades en su construcción han sido tan dominante, que el lenguaje para
expresar problemas y decirles cómo hacer las cosas fue diseñado desde la
perspectiva de la ingeniería de la computadora.
DESARROLLO.

Historia.

El primer uso de la lógica como lenguaje de programación es una secuela del


algoritmo de unificación de Robinson y su principio de resolución.

Algunos puntos principales de la historia de Prolog:

 Coulmerauer (1970) desarrolló un lenguaje para hacer deducciones de


texto.
 Se aplica un mecanismo de resolución sobre predicados especiales,
cláusulas de Horn, llamado unificación.
 La difusión del lenguaje se produce en los 80, pero de forma muy limitada
debido a la falta de aplicaciones en dicho lenguaje.
 Desarrollado en Europa en la década de los años 70 (Edimburgo y
Marsella).
o Aplicaciones IA. En EEUU LISP.
 Base del proyecto 5ª Generación en Japón.
o PROLOG hubiese sido su lenguaje máquina.
 Estándar ISO desde 1996: basándose en la sintaxis de Edimburgo.

Prolog: un lenguaje conversacional.

Al contrario que la mayoría de los lenguajes de programación, Prolog es un


lenguaje conversacional, según los diferentes registros; es decir, el sistema Prolog
mantiene un diálogo continuo con el programador desde el inicio de la sesión
hasta el final de la misma. (Clocksin, W.F. “Programming in Prolog”, 2a edición.
Springer–Verlag.)

Este diálogo toma generalmente la forma de un interrogatorio, a lo largo del


cual el programador planteará preguntas al sistema Prolog. Por su parte, el
sistema Prolog responderá cada una de las preguntas formuladas por el
programador en la medida en que esto sea posible. Prolog le indica al
programador que está esperando a que éste le formule una pregunta mostrando
en pantalla el siguiente símbolo.

?−

Tras este símbolo, el programador puede teclear una pregunta (terminada


en un punto) y pulsar el retorno de carro. Con ello, el programador solicita al
sistema Prolog que responda a la pregunta recién formulada. Una vez procesada
la pregunta el sistema Prolog mostrará en pantalla la respuesta correspondiente.

Por ejemplo, si queremos preguntar a Prolog si 5 es igual a 2+3 podemos


teclear la pregunta:

¿ − 5 𝑖𝑠 2 + 3.
𝑇𝑟𝑢𝑒

Después de pulsar el retorno de carro, Prolog comprobará que


efectivamente 2 y 3 suman 5 y, por lo tanto, responderá afirmativamente (True).
Prolog puede dar también respuestas negativas a las preguntas

¿ − 1 𝑖𝑠 1 + 1.
𝐹𝑎𝑙𝑠𝑒

Es importante recordar que todas las preguntas formuladas a Prolog deben


terminar en un punto. Si se olvida incluir el punto, por más veces que se presione
retorno de carro, Prolog considerará que la pregunta no está formulada en su
totalidad y, por lo tanto, seguirá esperando a que se termine de formular la
pregunta.

También es posible que cometamos algún error al teclear una pregunta.


Como veremos más adelante, las preguntas son realmente términos Prolog y
deben ajustarse a una sintaxis formal concreta. Si la pregunta en cuestión no es
un término Prolog correcto, habremos cometido un error sintáctico.
Afortunadamente, Prolog es capaz de detectar tales errores y nos avisará que no
entiende la pregunta formulada. Por ejemplo, si al formular la pregunta anterior
olvidamos teclear el operador de suma (+).

El sistema Prolog nos advierte de que hay un error sintáctico (syntax error),
mostrando la pregunta recién formulada y el punto en que se encuentra el error (**
here **).

Bases de Prolog.

Para responder a las preguntas formuladas por el programador, Prolog


consulta una base de conocimiento. Al iniciar una sesión Prolog, esta base de
conocimiento almacena un conocimiento básico que incluye, entre otras cosas,
conceptos y definiciones de la aritmética de los números naturales. Este
conocimiento permite a Prolog responder correctamente las siguientes preguntas:

Obviamente, Prolog no es capaz de responder cualquier pregunta que le


formulemos. Por ejemplo, si le preguntamos a Prolog si el pato Lucas es un pato.

Prolog nos responderá que no sabe determinar si algo es o no un pato,


pues su base de conocimiento no incluye información acerca de los patos.
Formalmente, lo que ocurre es que el predicado lógico ‘esPato/1’ no está definido
(undefined predicate). A lo largo de la conversación mantenida con el
programador, Prolog no sólo es capaz de responder a ciertas preguntas que se le
formulen, sino que es también capaz de aprender sobre aquello que no sabe.
Durante la sesión, es posible ampliar esta base de conocimiento añadiendo
definiciones de conceptos sobre los que Prolog no sabe nada (como por ejemplo
una definición de pato), o bien modificando y extendiendo definiciones sobre
conceptos que Prolog ya conoce (por ejemplo, añadiendo nuevos operadores
aritméticos sobre los naturales).

La base de conocimiento se expresa mediante hechos y reglas Prolog, que


no son otra cosa que una representación sintáctica concreta de cláusulas de Horn
de primer orden. Por lo tanto, todo el conocimiento Prolog queda expresado
empleando (casi) exclusivamente lógica de primer orden. Por ello se dice que
Prolog es un lenguaje lógico y que la programación en Prolog es programación
lógica. Un programa Prolog no es por tanto más que un conjunto de hechos y
reglas que expresan cierto conocimiento mediante lógica de primer orden.

Directorios y ficheros de Prolog.

Los programas Prolog se almacenarán en ficheros de texto (con extensión '.pl').


Prolog adquiere nuevos conocimientos consultando (es decir, leyendo) estos
programas. Para facilitar al programador el acceso a los programas almacenados
en los ficheros, Prolog define un conjunto de predicados especiales que permiten
navegar por el sistema de ficheros y visualizar los directorios.

Un detalle importante a tener en cuenta es que Prolog utiliza notación


diferente a MS-DOS para representar las rutas de los ficheros. Mientras que en
MS-DOS los directorios que forman parte de una ruta se separan entre sí por el
carácter '\', en Prolog se emplea el carácter '/' con el mismo propósito.

Así, el directorio MS-DOS C:\juegos\comecoco se escribe en notación


Prolog C:/juegos/comecoco.

PWD/0.

El predicado pwd imprime el directorio de trabajo actual (es equivalente al


comando MS-DOS cd sin parámetros). Por ejemplo, si nuestro directorio de
trabajo es c:\prolog\javier (en notación MS-DOS), al preguntar a Prolog por el
directorio actual obtenemos

?- pwd.
c:/prolog/javier
es decir, el directorio actual en notación Prolog.

LS/0.

El predicado ls lista el contenido del directorio de trabajo actual (es equivalente al


comando MS-DOS dir). Por ejemplo, si el directorio actual contiene los ficheros
'patos.pl' y 'familia.pl' al ejecutar ls obtenemos

?- ls.
patos.pl familia.pl
CONCLUSIÓN.

A diferencia de los lenguajes de programación clásicos, que dividen un


problema en áreas y procedimientos, detallándolos paso a paso de una manera
explícita mediante instrucciones; Prolog permite describir estructuras de datos, sus
relaciones y objetivos por ser un lenguaje declarativo; y el proceso por el cual
ejecuta las tareas no se establece de forma explícita en el programa, sino que se
determina por el proceso de traducción del lenguaje. Es importante mencionar que
el Lenguaje Prolog tiene una estructura de programación orientada a dar
soluciones a problemas del área de aplicación de la Inteligencia Artificial mediante
estructuras de programación orientadas a la resolución de problemas de una
manera no-clásica.

Aun no he aprendido Prolog podemos valorarlo como lenguaje específico


para la programación basada en hechos, predicados y reglas, ver sus alcances y
potencialidades, y descubrir que intentar desarrollar soluciones similares con
búsquedas de objetivos en otros lenguajes tradiciones sería muy extenso y con
poca eficacia. No todos los programadores y docentes de Informática conocen
este lenguaje, ni su aplicación en Inteligencia Artificial y Sistemas Inteligentes, sin
embargo, Prolog, es una herramienta muy efectiva a la hora de buscar soluciones
mediante la Programación Lógica y el aprovechamiento de elementos de otras
áreas tales como la Matemática Discreta, ayudándonos a “unir los puntos”, y
encontrar nuevos datos a partir de otros preexistentes.
REFERENCIAS BIBLIOGRAFICAS.

John C. Mitchel. “Concepts in Programming Languages”. Cambridge University.


Press, 2003. Cap. 3, 4.2 y 4.4.

Van Roy P. “Concepts, Techniques and Models of Computer Programming”.


(2003). Estocolmo: Swedish Institute of Computer Science.

Trejos O. “Fundamentos de Programación”. (2005). Pereira, Editorial Papiro:

Trejos O. “La esencia de la lógica de programación”. (2002). Manizales: Centro


Editorial Universidad de Caldas.

Bratko, I. “Prolog Programming for Artificial Intelligence”, 4a edici´on. Addison–


Wesley.

Clocksin, W.F. y Mellish, C.S. “Programming in Prolog”, 2a edici´on. Springer–


Verlag.

Das könnte Ihnen auch gefallen