martes, 28 de mayo de 2019

4.9 Predicados mitologicos

4.9 Predicados mitologicos


El siguiente ejemplo muestra como se extrae functor y aridad:
?- functor ( termino (arg(1)),Functor,Aridad).
Functor = termino
Aridad = 1
Yes

Manipulación de términos.

El predicado functor es uno de los más útiles entre la biblioteca standard Prolog.
Este predicado permite extraer el functor y la aridad de un término cualquiera.
Pero, al ser reversible, también permite construir nuevos términos a partir del functor y la aridad deseada.
Los modos de uso son:
• functor(+Termino,-Functor,-Aridad).
• functor(-Termino,+Functor,+Aridad).

Predicados meta-lógicos

Ejemplo:

Predicados de Clasificacion

Los predicados meta-lógicos permiten controlar el algoritmo de resolución facilitando la meta-programación.

4.8 Manipulacion de terminos

4.8 Manipulacion de terminos


Consiste en construir programas que manipulan otros programas proporcionando una mayor expresividad al lenguaje

Predicados

Meta-Lógicos

abuelo(X,Y):-novar(X)
hombre(x), progenitor(x,z), progenitor(z,y).
abuelo(x,y):-novar(y)
progenitor(z,y), progenitor(x,z), hombre(x)
abuelo(x,y):- X es abuelo de Y
X es una variable no instanciada
Permiten controlar el algoritmo de resolución facilitando la meta-programación.
|?- var(x)
X = _
|?- X-1, var(x)
no
Es uno de los más útiles entre la biblioteca standard Prolog:

El predicado functor/3

4.7 Control de busqueda en programas logicos

4.7 Control de busqueda en programas logicos




El orden en que aparecen los literales dentro de una sentencia (dentro del cuerpo) o el orden en que se introducen las sentencias en el programa son importantes en PROLOG. El orden afecta tanto al correcto funcionamiento del programa, como al recorrido del árbol de llamadas, determinando, entre otras cosas, el orden en que PROLOG devuelve las soluciones a una pregunta dada. El orden de las sentencias determina el orden en que se obtienen las soluciones ya que varía el orden en que se recorren las ramas del árbol de búsqueda de soluciones. Ejemplo: A continuación se presentan dos versiones del programa "miembro de una lista". Ambas versiones tienen las mismas sentencias pero escritas en distinto orden. A ambas versiones les hacemos la misma pregunta ?miembro (X, [1,2,3]).

4.6 Programacion Logica con numeros, listas y arboles

4.6 Programacion Logica con numeros, listas y arboles


?- X is 3+5.
X = 8
?- X = 3+5.
X = 3+5
?- 3+5 =:= 2+6.
yes
?- 3+5 == 2+6.
no
?- 3+5 == 3+5.
yes
Es más fácil entender la forma de una estructura complicada si la escribimos como un árbol en el que el nombre es un nodo y los componentes son las ramas.

Numéricos

Arboles

Listas


Arboles
La representación de hechos simples no es lo común en la clasificación de elementos, sino que se agrupan los elementos de un mismo tipo en una lista.
Las listas son colecciones de elementos en PROLOG.
Una lista se divide en dos partes:
• Cabeza. Es el primer elemento de la lista.
• Cola. Es una lista con el resto de los elementos de la lista.
La cabeza y la cola de una lista se separan con el símbolo "|".


La representación de hechos simples no es lo común en la clasificación de elementos, sino que se agrupan los elementos de un mismo tipo en una lista.
Las listas son colecciones de elementos en PROLOG. Una lista se divide en dos partes:
• Cabeza. Es el primer elemento de la lista.
• Cola. Es una lista con el resto de los elementos de la lista. La cabeza y la cola de una lista se separan con el símbolo "|".

Si definimos:
masuno(X, Y): - Y is X+1.
xmasuno (X, Y): - Y = X+1.
Observaremos el siguiente comportamiento:
?- masuno (,5).
Yes
?- xmasuno(4,5)
No

Numericos
En PROLOG los objetos numéricos pueden corresponder a tipos integer o float de C.
Para realizar operaciones numéricas, se tiene el predicado is, que se comporta como una asignación en un lenguaje imperativo.
Así, el objetivo X is <expresión> será verdadero cuando X unifique con el resultado numérico de evaluar <expresión>.

Expresiones

Una representación declarativa es aquélla en la que el conocimiento está especificado, pero en la que la manera en que dicho conocimiento debe ser usado no viene dado. El más popular de los sistemas de programación lógica es el PROLOG.
PROLOG cuenta con operadores para la unificación y comparación, sea con evaluación o sea simbólica, como los siguientes:
• X is Y %unificación con evaluación.
• X = Y %unificación simbólica
• X=:=Y %comparación con evaluación
• X == Y %comparación simbólica.

Se puede establecer que el lenguaje PROLOG está orientado a la Inteligencia Artificial, usando la programación lógica.

También utiliza pocos comandos en comparación con otros lenguajes de programación. Sólo hemos comenzado a explorar el poder que viene de la modelización de cálculo dentro de la lógica de predicados.

4.5 Espacios de Busqueda

4.5 Espacios de Busqueda



Cuando se resuelve un problema, se busca la mejor solución entre un conjunto de posibles soluciones. Al conjunto de todas las posibles soluciones a un problema concreto se llama espacio de búsqueda. Cada punto en el espacio de búsqueda representa una posible solución. Cada posible solución se le puede asociar un fitness o un valor que indicará cómo de buena es la solución para el problema. Un algoritmo genético (AG) devolverá la mejor solución de entre todas las posibles que tenga en un momento dado.

Entonces parece que buscar una solución se reduce a buscar un valor extremo (mínimo o máximo) en el espacio de búsqueda. A veces el espacio de búsqueda puede ser bien definido, pero en la mayoría de las ocasiones sólo se conocen algunos puntos en el espacio de búsqueda. Cuando se usa un AG las posibles soluciones generan otras a medida que el genético evoluciona.

La resolución de un problema puede expresarse como la busqueda del extremo de una función Aquí resolvemos ese problema, este es un algorítmo genético que calcula el máximo de una función. La gráfica representa un espacio de busqueda y las líneas verticales son posibles soluciones. La línea roja es el mejor individuo de la población y las verdes el resto.

Pulsa el botón Empezar para que el genético comience, el botón Parar detendrá la ejecución, en el botón Paso a Paso se ejecutará un único paso creando una nueva población y el botón Reiniciar creará una nueva población inicial.

El problema estriba en que la búsqueda puede ser muy compleja por diversas razones, como por ejemplo no saber dónde buscar una solución o dónde empezar a buscarla. Existen muchos métodos que se usan para buscar una solución válida, pero no necesariamente obtienen la mejor solución. Algunos de estos métodos son los algoritmos de escalada, backtracking o vuelta atrás, búsqueda a ciegas y los algoritmos genéticos. Las soluciones que encuentran estos tipos de búsqueda suelen ser buenas soluciones, pero no siempre encuentran la óptima.

4.4 Consulta de una base de clausulas

4.4 Consulta de una base de clausulas



Tipos de datos estructurados:
  • Átomos: Constantes y variables de cadena.
  • Listas, representadas entre [ ].
Tipos definidos por el usuario. Las reglas para definir relaciones pueden actuar como tipos de usuario.
SELECT select_list
FROM table_source
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC] ]
FROM
Especifica de dónde queremos obtener los datos, es decir, de que tabla. Se utiliza no sólo en el comando de consulta, SELECT, sino también en los comandos UPDATE y DELETE .
WHERE
Está clausula es donde se indican las condiciones de filtrado de los datos. Estas condiciones se definen a través de los operadores lógicos y de comparación.

4.3 Representación clausada del conocimiento

4.3 Representación clausada del conocimiento



Representación del conocimiento es un termino para referirse a representaciones pensadas para el procesamiento por ordenadores modernos, en particular, para representaciones compuestas por objetos explícitos y de afirmaciones sobre ellos.
Representar el conocimiento mediante cláusulas permite a los ordenadores sacar conclusiones de conocimiento previamente almacenados.

Tipos de Cláusulas
Ejemplos
Enunciado 1.
Si algunos perros son mamíferos, luego todos son mamíferos.
Enunciado 2.
Todos los colibrís son aves.
Este colibrí es ave.

Conclusión:
Para que un programa experto reconozca
los enunciados, se tiene que convertir en clausulas o reglas, para que estas sean entendidas por el sistema y arroje un resultado final.
es importante mencionar que la sintaxis de las cláusulas; se debe de respetar los
()
,
_
.

4.2 semántica de los programas lógicos

4.2 semántica de los programas lógicos


La cabeza es un término simple. Por ejemplo, p (X, 12) podría ser la cabeza de una cláusula del predicado p/2. Es decir, todas las cláusulas de un mismo predicado tienen en la cabeza un término con el mismo functor y aridad, aunque los argumentos pueden ser distintos.
El cuerpo no es más que el conjunto de condiciones que deben cumplirse (tener éxito) para que el predicado tenga éxito si lo invocamos con un objetivo que unifique con la cabeza.
Semántica de los programas lógicos
Ejemplo:
Razonamiento lógico:
tiempo(lluvioso) --> suelo(mojado)
Representación correcta en prolog:
suelo(mojado):-tiempo(lluvioso).suelo(mojado)
Comentarios entre /**/
Objetos de Datos
Tipos de Datos primitivos: variables y constantes.
  • Enteros
  • Reales
  • Caracteres
  •  
Los identificadores con minúscula representan hechos, los que van con mayúscula variables.
Las reglas se utilizan en prolog para significar que un hecho depende de uno o más hechos.
Una reglas consiste en una cabeza y un cuerpo, unidos por el signo ":-".
La cabeza está formada por un único hecho.
El cuerpo puede ser uno o mas hechos (conjunción de hechos), separados por una coma (","), que actúa como el "y" lógico.
Las reglas finalizan con punto (".").
Semántica Lógica
El pasaje a forma clausal se puede realizar aplicando cinco reglas
SEMANTICA DE LOS PROGRAMAS LÓGICOS
Alumno: Saul Adan Aguilar Vera
Eliminar implicaciones
Desplazar negaciones hacia interior de la sentencia (sobre las conjunciones, disyunciones y cuantificadores) hasta quedar delante de fórmulas atómicas.
Desplazar las disyunciones hacia el interior de la sentencia (sobre las conjunciones y cuantificadores) hasta quedar conectando únicamente literales.

4.1 Introducción al modelo de programación lógica

4.1 Introducción al modelo de programación lógica


En los comienzos de los años 70 el francés Alain Colmenuer desarrolló el lenguaje PROLOG que también permite el desarrollo de aplicaciones en forma declarativa. 

En general el PROLOG es un demostrador automático de problema, el cual utiliza una Base de Conocimientos en forma de reglas de inferencia deductivas (cláusulas de Horn), es decir sus reglas tienen como consecuente una única acción y las inferencias obte¬nidas son estrictamente lógicas (verdaderas o falsas), aunque puede parecer una limitación, esto no es totalmente justo, ya que PROLOG permite programar mecanismos inferenciales con lógica probabilisticas, dado que se trata de búsquedas en árboles con acumulación de evidencias.

El PROLOG como lenguaje surgido del cálculo de predicados, tomó las siguientes ideas de la lógica para su ejecución.
1) Un conjunto de axiomas o hechos.
2) Reglas de inferencias las cuales se resuelven por resolución y unificación.
3) El objetivo a demostrar, que serán las condiciones a unificar con las reglas.

También tomó del LISP el tratamiento de las listas para la repre¬sentación de estructuras complejas. Aunque el PROLOG tuvo su origen en la lógica matemática no fue una transposición exacta, y esta ligada a las discusiones que sostienen desde hace años los principales investigadores de la Inteligencia Artificial, los cuales están divididos en dos grandes grupos, de una parte Minsky quien propone estudiar los mecanismos del pensamiento humano y luego simularlo en la computadora.
Lo más importante para Minsky son los conceptos, o sea la inter¬pretación que se le puede dar a cada palabra en dependencia de un contexto dado. 

El otro grupo encabezado por Mac Carthy (autor del LISP), afirma que la lógica matemática es el elemento característico para la representación del razonamiento y su implantación en la computadora, este grupo centra su atención en la formalización y en la estructura de los conocimientos más que en el sentido de los mismos.

La lógica desde la antigüedad se concibió como el método de descubrir las leyes del pensamiento, pero estas leyes siempre han estado restringidas al pensamiento científico y muy especialmente el matemático, quedando fuera el sentido común. Esta deficiencia es admitida por los defensores de la lógica, pero ellos consideran que la lógica es la única senda posible para desarrollar programas capaces de mostrar inteligencia.
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


La programación lógica comprende dos Paradigmas de Programación la Programación Declarativa y la Programación funcional. La programación declarativa gira en torno al concepto de predicado, o relación entre elementos. La programación funcional se basa en el concepto de función (que no es más que una evolución de los predicados), de corte más matemático.

lunes, 29 de abril de 2019

3.Arboles Binarios

¿Para que sirve un árbol binario?

Como todos sabemos un árbol binario es una estructura de datos, y como todas, este sirve para organizar datos para facilitar su manipulación, ya sea el ingreso, borrado o búsqueda de datos, y precisamente una de las principales ventajas de los árboles binarios es la búsqueda, ya que como en muchos algoritmos de búsqueda necesitamos tener la información ordenada y en nuestros árboles binarios precisamente los datos van ingresando de forma ordenada.
Recorridos con los conocidos métodos recursivos:

  • Inorden
  • Postorden
  • Preorden
Árboles binarios. 
Un árbol binario es un conjunto finito de elementos, el cual está vacío o dividido en tres subconjuntos separados: 
  • El primer subconjunto contiene un elemento único llamado raíz del árbol.
  • El segundo subconjunto es en sí mismo un árbol binario y se le conoce como subárbol izquierdo del árbol original.
  • El tercer subconjunto es también un árbol binario y se le conoce como subárbol derecho del árbol original.
  • El subárbol izquierdo o derecho puede o no estar vacío. Cada elemento de un árbol binario se conoce como nodo del árbol.

Tipos de Árboles

  • Árboles Binarios: Un árbol binario es un conjunto finito de elementos, el cual está vacío o dividido en tres subconjuntos separados: raíz del árbol, subárbol izquierdo y subárbol derecho
  • Árbol de búsqueda binario auto-balanceable: Es el que intenta mantener su altura, o el número de niveles de nodos bajo la raíz, tan pequeños como sea posible en todo momento, automáticamente
  • Árboles AVL: están siempre equilibrados de tal modo que para todos los nodos, la altura de la rama izquierda no difiere en más de una unidad de la altura de la rama derecha o viceversa.
  • Árboles Rojo-Negro : Un árbol rojo-negro es un árbol binario de búsqueda en el que cada nodo tiene un atributo de color cuyo valor es rojo o negro.
  • Árboles AA: utilizado para almacenar y recuperar información ordenada de manera eficiente
  • Árbol de segmento: es una estructura de datos en forma de árbol para guardar intervalos o segmentos. Permite consultar cuál de los segmentos guardados contiene un punto.
  • Árboles Multicamino: es un árbol ordenado cuyos nodos deben tener un número específico de hijos.
  • Árboles B: Es un árbol de búsqueda que puede estar vacío o aquel cuyos nodos pueden tener varios hijos, existiendo una relación de orden entre ellos.
Un árbol binario es un árbol en el que ningún nodo puede tener más de dos subárboles. En un árbol binario cada nodo puede tener cero, uno o dos hijos (subárboles). Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como hijo derecho.
Existen tipos de árboles binarios que suelen usarse para fines específicos, como:
  • Árbol binario de búsqueda
  • Árbol de Fibonacci

  • CARACTERÍSTICAS Y PROPIEDADES DE LOS ÁRBOLES.
  • * NODO indica un elemento, o ítem, de información.
    2.    * Todo árbol que no es vacío, tiene un único nodo raíz.
    3.    * Un nodo X es descendiente directo de un nodo Y, si el nodo X es apuntado por
    1.    el nodo Y. X es hijo de Y.
    4.    * Un nodo X es antecesor directo de un nodo Y, si el nodo X apunta al nodo Y. X
    2.    es padre de Y.
    5.    *Se dice que todos los nodos que son descendientes directos (hijos) de un mismo
    3.    nodo (padre), son hermanos.
    6.    * Todo nodo que no tiene ramificaciones (hijos), se conoce con el nombre de
    4.    terminal u hoja.
    7.    * Todo nodo que no es raíz, ni terminal u hoja se conoce con el nombre de
    5.    interior.
    8.    * Grado es el número de descendientes directos de un determinado nodo. Grado
    6.    del árbol es el máximo grado de todos los nodos del árbol.
    9.    * Nivel es el número de arcos que deben ser recorridos para llegar a un
    7.    determinado nodo. Por definición, la raíz tiene nivel 1.
    10. *Altura del árbol es el máximo número de niveles de todos los nodos del árbol.


lunes, 11 de marzo de 2019

2.3.-INTERVALOS


2.3 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

4.9 Predicados mitologicos

4.9 Predicados mitologicos El siguiente ejemplo muestra como se extrae functor y aridad: ?- functor ( termino (arg(1)),Functor,A...