domingo, 2 de junio de 2019

Semántica de los programas lógicos


La semántica da significado a los programas y nos permite describir formalmente lo que calculan. Hay tres maneras bien conocidas de dar significado o semántica a los programas lógicos: la semántica declarativa, la semántica operacional y la semántica denotacional (comúnmente llamada semántica de punto fijo). En esta sección presentamos algunas nociones y teoremas básicos relacionados a la semántica de los programas lógicos definidos.
Definición 2 : Sea L un lenguaje de primer orden.
1.        El universo de Herbrand de L, denotado HL, es el conjunto de todos los términos de base que pueden formarse a partir de las constantes y los símbolos de función que ocurren en L.
Ejemplo Sea L = {0,suc,nat} donde 0 es una constante, suc es un símbolo de función de aridad 1 y nat es un predicado de aridad 1. En los próximos tres ejemplos nos referiremos a este lenguaje. El universo de Herbrand de L es:
HL = {0,suc(0),suc(suc(0),...,suci(0),...}
2.        La base de Herbrand de L, denotada BL, es el conjunto de todos los ´átomos que pueden formarse a partir de los predicados que ocurren en L y los términos en HL.
              Ejemplo       La base de Herbrand de L es:
BL = {nat(0),nat(suc(0)),...,nat(suci(0)),...}.
3.        Una estructura A para L es una estructura de Herbrand si su dominio es HL y, para cada símbolo de función f de L y elementos t1 ...,tn de A, fA(t1,...,tn) = f(t1,...,tn). Para cada constante c en L, cA = c.
              Ejemplo       Una estructura de Herbrand para L es:
A = hHL,0A,sucA,BLi, donde 0A = 0 y sucA(t) = suc(t) para todo t ∈ HL.
4.        Si Γ un conjunto de sentencias, un modelo de Herbrand de Γ es una estructura de Herbrand que es un modelo para Γ. Debido a que en los modelos de Herbrand la interpretación de las constantes y los símbolos de función son fijas, es posible identificar un modelo de Herbrand con un subconjunto de la base de Herbrand.
Consideremos un programa lógico P. P induce un lenguaje de primer orden donde las constantes, los símbolos de función y los predicados son, respectivamente, las constantes, los símbolos de función y los predicados que ocurren en P. Entonces, podemos hablar del universo de Herbrand de P, denotado HP. Asimismo, podemos hablar de la base de Herbrand de P, denotada BP.
Ejemplo        Sea P el siguiente programa:
p(a)p(b)q(a)r(f(x))p(x),q(x)
El universo y la base de Herbrand de P son, respectivamente:
HP = {a,b,,f(a),f(b),f(f(a)),f(f(b)),f(f(f(a))),...}
BP = {p(a),p(b),q(a),q(b),p(f(a)),p(f(b)),q(f(a)),p(f(b)),p(f(f(a))), p(f(f(b))),q(f(f(a)),q(f(f(b))...}
Semántica declarativa. Desde el punto de vista lógico, un programa P puede verse como una teoría lógica formada por las cláusulas del programa. Los modelos de Herbrand de esta teor´ıa son considerados los modelos del programa P. Por ejemplo, la base de Herbrand del programa P, BP, es un modelo de P.
Entre las estructuras de Herbrand que son modelos de P, se destaca el que contiene exactamente los ´átomos que son consecuencia lógica de P. Este modelo corresponde al significado “entendido” o “estándar” del programa y es llamado el modelo mínimo de P, MP. El modelo MP se define como sigue:
MP = {A BP : P |= A}
Ejemplo         El modelo mínimo del programa P es:
MP = {p(a),p(b),q(a),r(f(a))}
Semántica operacional. Esta definida por el proceso de inferencia utilizado para probar que un objetivo puede ser derivado del programa. En la próxima sección estudiaremos en detalle este punto.
Semántica denotacional. Esta semántica asigna significado a un programa asociándole una función sobre el dominio calculado por el programa. El significado viene dado entonces por el punto fijo de la función, si existe.

4.1 INTRODUCCIÓN A LA PROGRAMACIÓN LÓGICA

La Programación Lógica estudia el uso de la lógica para el planteamiento de problemas y el control sobre las reglas de inferencia para alcanzar la solución automática.

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, entonces se dice que la idea esencial de la Programación Lógica es
Programa= lógica + control
Lógica (programador): hechos y reglas para representar conocimiento
Control (interprete): deducción lógica para dar respuestas (soluciones)
La programación lógica intenta resolver lo siguiente:
Dado un problema S, saber si la afirmación A es solución o no del problema o en qué casos lo es. Además queremos que los métodos sean implantados en maquinas de forma que la resolución del problema se haga de forma automática.
La programación lógica: construye base de conocimientos mediante reglas y hechos
*      Regla: implicación o inferencia lógica que deduce nuevo conocimiento, la regla permite definir nuevas relaciones a partir de otras ya existentes
Ej.:
Mortal (x): – humano(x)
x es mortal si x es humano
*      Hecho: declaración, cláusula o proposición cierta o falsa, el hecho establece una relación entre objetos y es la forma más sencilla de sentencia
Ej.:
Humano (Sócrates); Sócrates es humano
Ama (Juan, María) ; ama Juan a María
*      Consulta: se especifica el problema, la proposición a demostrar o el objetivo Partiendo de que los humanos son mortales y de que Sócrates es humano, deducimos que
Sócrates es mortal

Mortal (x): – humano(x);- los humanos son mortales; regla
Humano (Sócrates); Sócrates es humanos; hecho
Sócrates es mortal ; consulta

lunes, 11 de marzo de 2019

Intervalos


Intervalos

Funciones devuelven siempre el mismo valor:

·         Los lenguajes funcionales puros tienen la propiedad de transparencia referencial
·         Como consecuencia, en programación funcional, una función siempre devuelve el mismo valor cuando se le llama con los mismos parámetros
·         Las funciones no modifican ningún estado, no acceden a ninguna variable ni objeto global y modifican su valor

Diferencia entre declaración y modificación de variables:

·         En programación funcional pura una vez declarada una variable no se puede modificar su valor
·         En algunos lenguajes de programación (como Scala) este concepto se refuerza definiendo la variable como inmutable (con la directiva val).
·         En programación imperativa es habitual modificar el valor de una variable en distintos pasos de ejecución

Funciones


Un problema complejo se puede dividir en pequeños subproblemas más sencillos. Estos subproblemas se conocen como “Módulos” y su complementación en un lenguaje se llama subprograma (procedimientos y funciones).
Un subprograma realiza las mismas acciones que un programa, sin embargo, un subprograma lo utiliza solamente un programa para un propósito específico.
Un subprograma recibe datos de un programa y le devuelve resultados (el programa “llama” o “invoca” al subprograma, este ejecuta una tarea específica y devuelve el “control” al programa que lo llamo).
Función: Una función en matemáticas, es una operación que toma un o más valores (argumentos) y devuelve un resultado (valor de la función para los argumentos dados). Por ejemplo:
F(X) = X / (1+X2)
Donde:
F………….. Nombre de la función
X…………. Es el argumento (también conocido como parámetro formal)
Definición de funciones: Una definición de función se presenta de la siguiente manera:
Función nombre_funcion (p1, p2,…, pn)
Inicio
Bloque de instrucciones
Fin
Donde:
Función…………… Es la palabra clave que nos indica una definición de función.
Nombre_funcion…. Es el identificador con el cual se reconoce a la función en el cuerpo del
Algoritmo principal.
P1, p2,…, pn……… Es el grupo de parámetros que define a la función.
Llamado a una función
Cuando definimos una función solo le indicamos al algoritmo que esta función existe, pero una definición de función no implica la realización de las instrucciones que la constituyen. Para hacer uso de una función, el algoritmo principal la debe llamar. Por ejemplo:
Función F(X)
Inicio
F = X / (1 + X^2)
Fin
Inicio
Imprimir “Este es el algoritmo principal”
Leer N
R = F(N) llamado de la función
Imprimir “El resultado de la función es:”, R
Fin
2.3 intervalos
2.4 Operadores
Haskell soporta cinco operadores matemáticos básicos:
§  suma (+)
§  resta (-)
§  multiplicación (*)
§  división (/)
§  exponenciación ( ^)
El circunflejo que representa la exponenciación en la mayoría de los teclados saldrá usando la combinación de teclas “alt gr”+” {”, será necesario pulsar la barra espaciadora después de eso para que aparezca el circunflejo.
Veamos algunos ejemplos de funciones que usen estos operadores.




Como vemos en las funciones que hemos usado solo les enviamos un único parámetro, pero veamos un ejemplo en el que mandaríamos dos parámetros a la función
Observe que he tenido que cargar de nuevo el archivo de ejemplo en el entorno de desarrollo, el hecho de que guarde los cambios en el bloc de notas no hace que los cambios se reflejen en el entorno.
Para mandar dos parámetros observe que los he colocado entre paréntesis y separados por comas.

Tipos de datos


 El tipo de datos

En lenguajes de programación un tipo de dato es un atributo de una parte de los datos que indica al ordenador (y/o al programador) algo sobre la clase de datos sobre los que se va a procesar.


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.
Un tipo de dato entero en computación es un tipo de dato que puede representar un subconjunto finito de los números enteros. El número mayor que puede representar depende del tamaño del espacio usado por el dato y la posibilidad (o no) de representar números negativos. Los tipos de dato entero disponibles y su tamaño dependen del lenguaje de programación usado así como la arquitectura en cuestión. Por ejemplo, si para almacenar un número entero disponemos de 4 bytes de memoria tememos que: 4 Bytes = 4x8 = 32 bits Con 32 bits se pueden representar 232=4294967296 valores: Sólo positivos: del 0 al 4294967295 Positivos y negativos: del -2147483648 al 2147483647
Tipos de datos en coma flotante Se usan para representar números con partes fraccionarias. Hay dos tipos de coma flotante: float y double. El primero reserva almacenamiento para un número de precisión simple de 4 bytes y el segundo lo hace para un numero de precisión doble de 8 bytes.Tipo:float4 Bytes (32 bits) double8 Bytes (64 bits)

Tipo de dato carácter (Char) Es cualquier signo tipográfico, puede ser una letra, un número, un signo de puntuación o un espacio. Este término se usa mucho en computación. Un valor de tipo carácter es cualquier carácter que se encuentre dentro del conjunto ASCII ampliado, el cual está formado por los 128 caracteres del ASCII más los 128 caracteres especiales que presenta, en este caso, IBM.


Los valores ordinales del código ASCII ampliado se encuentran en el rango de 0 a 255. Dichos valores pueden representarse escribiendo el carácter correspondiente encerrado entre comillas simples (apóstrofos).Así, podemos escribir: ‘A' < 'a ‘Que significa: "El valor ordinal de A es menor que el de a" o "A está antes que a “Un valor de tipo carácter (char en inglés) se guarda en un byte de memoria. La única operación (además de las relacionales) que podemos hacer con caracteres es la concatenación concatenando dos caracteres, por ejemplo 'a' y 'X' obtendríamos la cadena "aX".
Tipo de dato lógico El tipo de dato lógico o booleano es en computación aquel que puede representar valores de lógica binaria, esto es, valores que representen falso o verdadero. Se utiliza normalmente en  programación, estadística, electrónica, matemáticas (Álgebra booleana), etc...Para generar un dato o valor lógico a partir de otros tipos de datos, típicamente, se emplean los operadores relacionales (u operadores de relación), por ejemplo: 0 es igual a falso y 1 es igual a verdadero (3>2)= 1 = verdadero (7>9)= 0 = falso
Palabra reservada una palabra reservada es una palabra que tiene un significado Gramatical especial para ese lenguaje y no puede ser utilizada como un identificador en ese lenguaje.
Por ejemplo, en SQL, un usuario no puede ser llamado "group", porque la palabra group es usada para indicar que un identificador se refiere a un grupo, no a un usuario. Al tratarse de una palabra clave su uso queda restringido. Ocasionalmente la especificación de un lenguaje de programación puede tener palabras reservadas que están previstas para un posible uso en futuras versiones. En Java const y goto son palabras reservadas — no tienen significado en Java, pero tampoco pueden ser usadas como identificadores. Al reservar los términos pueden ser implementados en futuras versiones de Java, si se desea, sin que el código fuente más antiguo escrito en Java deje de funcionar.


martes, 19 de febrero de 2019

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.

Estilo de programación (también llamado estándares de código o convención de código) es un término que describe convenciones para escribir código fuente en ciertos lenguajes de programación.

El estilo de programación es frecuentemente dependiente del lenguaje de programación que se haya elegido para escribir. Por ejemplo el estilo del lenguaje de programación C variará con respecto al del lenguaje BASIC.


  • Estilo K&R es el mas utilizado en el lenguaje C y PHP, el estilo fue llamado de esta forma porque fue usado por Kernighan y Ritchies en su libro The C Programming Lenguage.
  • Estilo Allman fue definido por Eric Allman, se trata de crear una nueva lineas para las llaves, e identar el códogo debajo de ellas.
  • Estilo BSD KNF tambien conocido como estilo Kernel Normal From, es la manera más usada para el codigo de la distribucción del software del sistema operativo de Berkeley.
  • Estilo Whitesmiths también llamado estilo wishart, se coloca las llaves asociadas con la instrucciones de control indentada.
  • Estilo GNU este coloca una llave sobre la linea las llaves son identadas por 2 espacios y el código que contiene identada por 2 espacios adicionales.




PROGRAMACIÓN ESTRUCTURADA



La programación estructurada es una forma de escribir programas para computadoras de forma clara, para ello utiliza únicamente tres estructuras: secuencial, selectiva e iterativa; siendo innecesario y no permitiéndose el uso de la instrucción o instrucciones de transferencia incondicional (GOTO).








PROGRAMACIÓN IMPERATIVA



La programación imperativa, en contraposición a la programación declarativa, es un paradigma de programación que describe la programación en términos del estado del programa y sentencias que cambian dicho estado. Los programas imperativos son un conjunto de instrucciones que le indican al computador cómo realizar una tarea.

La implementación de hardware de la mayoría de computadores es imperativa; prácticamente todo el hardware de los computadores está diseñado para ejecutar código de máquina, que es nativo al computador, escrito en una forma imperativa.



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.







PROGRAMACIÓN ORIENTADA A OBJETOS

La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o métodos) e identidad (propiedad del objeto que lo diferencia del resto). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.


Conceptos a tener en cuenta a la hora de programar:


Examen unidad 1