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.