viernes, 26 de julio de 2013


César Andrés Ruiz Saltos

Los siguientes ejercicios que veremos a continuación son para prolog  y ya han sido probados

 

1._ Solo determina si lo que recibe es una lista

lista([]):-!.
lista([X|Y]):-lista(Y).

 

2._ Concatena dos listas un ejemplo muy básico dentro de la programación

concatenar([],L,L).
concatenar([X|M],L,[X|Z]):-concatenar(M,L,Z).



3._Calcula la longitud de la lista algo muy útil para futuras creación y combinaciones con otros programas

long([],0):-!.
long([X|Y],S):-long(Y,T),!, S is T + 1.



4._Suma los elementos de la lista, este es otro de los mas usados cuando aprendemos a desarrollar nuestra lógica y muy útil

suma_elem([X],X):-!.
suma_elem([X|Y],S):-suma_elem(Y,T), S is T + X.



5._Invierte una lista en todos sus niveles aquí veremos que usaremos la parte de concatenar para poder realizar la invertida

invertir_tot([],[]):-!.
invertir_tot([X|M],S):-lista(X),invertir_tot(X,P),invertir_tot(M,T),concatenar(T,[P],S).
invertir_tot([X|M],S):-invertir_tot(M,T),concatenar(T,[X],S),!.



6._Muestra los últimos n elementos de la lista, simplemente  lo que deseamos ver

da_n_ultim(L,N,S):-invertir_tot(L,T),da_n_pri(T,N,R),invertir_tot(R,S).

 

7._ Elimina los elementos repetidos que estén en una lista

elim_repet([],[]):-!.
elim_repet([X|M],S):-not lista(X), elimina_x(M,X,T),elim_repet(T,Y),
             concatenar([X],Y,S).
elim_repet([X|M],S):-lista(X), elim_l1_de_l2(X,M,T),elim_repet(X,Y),    
             elim_repet(T,J),concatenar([Y],J,S).

8._ Determina si una lista se encuentra en orden creciente o decreciente ósea de mayor a menor o de menor a mayor


creciente([X,Y|Z]):- X

             creciente([Y|Z]).
creciente([X]).

decreciente([X,Y|Z]):- X>Y,
               decreciente([Y|Z]).
decreciente([X]).


9._Calcula la potencia de un número, N elevado a la N1 donde n será la base y n1 será el exponente

potencia(0,0,'No se puede calcular'):-!.
potencia(N,0,1):-N=\=0.
potencia(N,N1,S):-N2 is N1 -1,potencia(N,N2,R),!, S is R*N.



10.- Determina si un elemento X pertenece a una lista

pert(X,[X|M]):-!.
pert(X,[R|M]):-pert(X,M).





 
 
 
 
 
 
 

miércoles, 24 de julio de 2013

Lógica Computacional


PROGRAMACIÓN LÓGICA.

Los programas se ejecutan verificando la presencia de una cierta condición habilitadora y, cuando se satisface, ejecutan una acción apropiada. También se le conoce como lenguaje con base en reglas.

BASES DE PROLOG.

La programación lógica es un intento de definir un estilo de programación alternativo al estilo convencional de von Neumann. En él, el programador describe indirectamente un proceso, definiendo un conjunto de asertos o condiciones, las cuales deben ser satisfechas en orden a que el proceso complete su tarea. El propio algoritmo resultante no está completamente bajo el control del programador, sino que el programador debe conocer el mecanismo de control subyacente para especificar un conjunto correcto de asertos.

La programación lógica es, por su naturaleza poco corriente, difícil de asimilar por las personas que se han formado en el estilo de von Neumann. El lenguaje Prolog representa un estilo relativamente nuevo de programación.

Diseñado principalmente para las aplicaciones de inteligencia artificial, el estilo del Prolog
se basa en la noción de definir objetos y relaciones de inferencia entre clases de objetos.
Tiene unos fuertes fundamentos teóricos en el cálculo de proposiciones. Gran parte de la
reciente atención al Prolog se debe a su papel prominente en el proyecto japonés de computadoras de la quinta generación.



El Prolog fue desarrollado a principios de los años 1970 por Philippe Rousel, del Grupo de inteligencia Artificial de la Universidad de Marsella. Su primer intérprete se implementó en 1972. debido a que el uso del Prolog ha estado restringido a la comunidad de inteligencia artificial –la cual tiene una consistencia relativamente pequeña en programación, comparada con la de, por ejemplo, la comunidad de procesamiento de datosel lenguaje no es aún ampliamente conocido. Además, por la misma razón, el Prolog no ha cambiado dramáticamente desde su concepción, ni se ha hecho ningún esfuerzo por estandarizarlo. Definido como un lenguaje de inteligencia artificial, el Prolog se ha utilizado en los siguientes tipos de aplicaciones:

  Prueba de teoremas y resolución de problemas.
 Lógica matemática.
 Comprensión del lenguaje natural.
 Sistemas expertos.
 Representación del conocimiento.

Debido a que el estilo de la programación lógica es muy distinta del de otros dominios de aplicación, Prolog no ha gozado de un amplio uso en áreas distintas de la inteligencia artificial. Su estructura de ejecución impone un estilo de programación diferente, el cual no se ha mostrado aún efectivo en la programación numérica, aplicaciones de procesamiento de datos o en la programación de sistemas.



Sintaxis


ESTRUCTURA
Un programa Prolog está formado por una secuencia de enunciados (cláusulas): hechos, reglas y variables.

Hechos
Expresan relaciones entre objetos.
Supongamos que queremos expresar el hecho de que "un coche tiene ruedas". Este hecho, consta de dos objetos, "coche" y "ruedas", y de una relación llamada "tiene".
La forma de representarlo en PROLOG es:
tiene(coche,ruedas).
Algunas características de los hechos son:
·         Los nombres de objetos y relaciones deben comenzar con una letra minúscula.
·         Primero se escribe la relación, y luego los objetos separados por comas y encerrados entre paréntesis.
·         Al final de un hecho debe ir el carácter "." (punto).
El orden de los objetos dentro de la relación es arbitrario, pero debemos ser coherentes a lo largo de la base de hechos.


Reglas
Las reglas se utilizan en Prolog para significar que un hecho depende de uno o más hechos. Es la representación de las implicaciones lógicas del tipo p ---> q (p implica q).
Algunas características son:
·         Una regla consiste en una cabeza y un cuerpo, unidos por el signo " :- ".
·         La cabeza esta formada por un único hecho.
·         El cuerpo puede ser uno o más hechos (conjunción de hechos), separados por una coma (","), que actúa como el "y" lógico.
·         Las reglas finalizan con un punto (".").
·         Variables
Representan objetos que el mismo PROLOG determina. Una variable puede estar instanciada o no instanciada. Esta instanciada cuando existe un objeto representado por una variable. De este modo, cuando preguntamos “Un coche tiene X ?,”
Prolog busca en los hechos cosas que tiene un coche y respondería:
X = ruedas. Instanciando la variable X con el objeto ruedas.
o    Los nombres de variables comienzan siempre por una letra mayúscula.
Como ya nombramos las cláusulas haremos el siguiente razonamiento lógico:
tiempo(lluvioso) ----> suelo(mojado)
suelo(mojado)
Que el suelo esté mojado, es una condición suficiente de que el tiempo sea lluvioso, pero no necesaria. Por lo tanto, a partir de ese hecho, no podemos deducir que esté lloviendo (pueden haber regado las calles). La representación correcta en Prolog, sería:
suelo(mojado) :- tiempo(lluvioso).
suelo(mojado).
Cabe señalar que la regla esta "al revés". Esto es así por el mecanismo de deducción hacia atrás que emplea Prolog.

Bibliografia


(2012, 05). Pragmatica. BuenasTareas.com. Recuperado 05, 2012, de http://www.buenastareas.com/ensayos/Pragmatica/4366325.html



Paradigmas de la Programacion

Existen  4 paradigmas básicos en la programación que conoceremos a continuacion.

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. Esto se debe a que el hardware de los computadores implementa el paradigma de las Máquinas de Turing. Desde esta perspectiva de bajo nivel, el estilo del programa está definido por los contenidos de la memoria, y las sentencias son instrucciones en el lenguaje de máquina nativo del computador (por ejemplo el lenguaje ensamblador).
*Los lenguajes imperativos de alto nivel usan variables y sentencias más complejas, pero aún siguen el mismo paradigma. Las recetas y las listas de revisión de procesos, a pesar de no ser programas de computadora, son también conceptos familiares similares en estilo a la programación imperativa; cada paso es una instrucción, y el mundo físico guarda el estado (Zoom).
*Los primeros lenguajes imperativos fueron los lenguajes de máquina de los computadores originales. En estos lenguajes, las instrucciones fueron muy simples, lo cual hizo la implementación de hardware fácil, pero obstruyendo la creación de programas complejos. Fortran, cuyo desarrollo fue iniciado en 1954 por John Backus en IBM, fue el primer gran lenguaje de programación en superar los obstáculos presentados por el código de máquina en la creación de programas complejos.
Programación lógica.
Como principales lenguajes de progamacion que tenemos en esta clases estan:
-Basic
-Pascal
-Java
-Phyton

Programación lógica


La programación lógica consiste en la aplicación del corpus de conocimiento sobre lógica para el diseño de lenguajes de programación; no debe confundirse con la disciplina de la lógica computacional.
La programación lógica es un tipo de paradigmas de programación dentro del paradigma de programación declarativa. El resto de los subparadigmas de programación dentro de la programación declarativa son: programación funcional, programación basada en restricciones, programas DSL (de dominio específico) e híbridos. La programación lógica 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.
Como principal lenguaje en esta categoria podriamos nombrar al PROLOG.





Programación funcional






-Los lenguajes de programación funcional, especialmente los que son puramente funcionales, han sido enfatizados en el ambiente académico principalmente y no tanto en el desarrollo de software comercial. Sin embargo, lenguajes de programación importantes tales como Scheme, Erlang, Objective Caml y Haskel, han sido utilizados en aplicaciones comerciales e industriales por muchas organizaciones. La programación funcional también es utilizada en la industria a través de lenguajes de dominio específico como R (estadística), Mathematica (matemáticas simbólicas), J y K (análisis financiero), F# en Microsoft.NET y XSLT (XML). Lenguajes de uso específico usados comúnmente como SQL y Lex/Yacc, utilizan algunos elementos de programación funcional, especialmente al procesar valores mutables. Las hojas de cálculo también pueden ser consideradas lenguajes de programación funcional.
-La programación funcional también puede ser desarrollada en lenguajes que no están diseñados específicamente para la programación funcional. En el caso de Perl, por ejemplo, que es un lenguaje de programación imperativo, existe un libro que describe como aplicar conceptos de programación funcional. JavaScript, uno de los lenguajes más ampliamente utilizados en la actualidad, también incorpora capacidades de programación funcional.
Como principales lenguajes en este campo tenemos los siguientes:
Lenguajes puros como :Haskell y el Miranda
Lenguajes hibridos como : Scala , Lisp,Ocaml.





Programación orientada a objetos





La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento. Su uso se popularizó a principios de la década de los años 1990. En la actualidad, existe variedad de lenguajes de programación que soportan la orientación a objetos
Algunos que tenemos son:
C++
C#
Visual Basic

Bibliografía

                                                                                             




martes, 23 de julio de 2013

Ejercicios propuestos de Prolog por Johnny Andrés Ochoa Parrales

              
            Ejemplo de listas en Prolog

1)
 lista([ana,juan,jose]).

inversa([],[]).
inversa([H|T],L):-inversa(T,S),append(S,[H],L).            
   
Consulta :inversa([1,2,3],L).
Revierte los elementos de la lista  de fin a inicio.

2)
            longitud([],0):-!.

longitud([X|Y],S):-longitud(Y,T),!, S is T + 1.

Consulta :longitud([1,2,3,4],S).

Devuelve los elementos que se encuentran dentro de la lista.

3)
       suma_elem([],0).
suma_elem([X|Y],S):-suma_elem(Y,T), S is T + X.

Consulta : suma_elem([1,2,3],S).
Devuelve la suma de los elementos que se enuentran dentro de la lista

 4)
4.       primer_elem([X|Y],X):-!.
Consulta :primer_elem([1,2,3],S)

Devuelve el primer elemento de la lista.

5)
        ultimo_elem(L,S):-inversa(L,T),primer_elem(T,S).

Consulta: ultimo_elem([1,2,3],S).
Devuelve el ultimo elemento de la lista.

6)
        pertenece(X,[X|M]):-!.
pertenece(X,[R|M]):-pertenece(X,M).
Consulta:pertenece(3,[1,2,3,4]).

 Verifica si el elemnto a pedir se encuentre o pertenece dentro de la lista.











viernes, 19 de julio de 2013

INTERPRETACIÓN LÓGICA

  • Conceptos de lógica que se definen.
  • Mecanismos de derivación a partir de reglas de inferencias.
  • Unificación (realiza dicha operación en presencia de variables).




Compiladores e intérpretes

• Existen una gran variedad de estrategias para conseguir que un programa se
ejecute en un ordenador
• Todas se basan en los "meta-programas" (compiladores, intérpretes, etc.)
cuyos datos de entrada son el código fuente de otros programas.
Compilación
• Ejemplos: C, C++
• Diferentes momentos en la vida de un programa: tiempo de compilación y
tiempo de ejecución
• Mayor eficiencia





 Interpretación
• Ejemplos: BASIC, LISP, Python, Ruby
• No hay diferencia entre el tiempo de compilación y el tiempo de ejecución
• Mayor flexibilidad: el código se puede construir y ejecutar "onthefly" (funciones lambda o clousures)

GNU Prolog
El GNU Prolog (también llamado gprolog) es un compilador con un ambiente interactivo de depuración para el lenguaje Prolog disponible para Unix, Windows y Mac OSX. También soporta algunas extensiones al Prolog incluyendo programación con restricciones sobre un dominio finito, usando gramáticas cláusula definida, y una interface de sistema operativo
El compilador convierte el código fuente de Prolog en codigo byte que se puede ser interpretado por una máquina abstracta de warren y convierte esto en código ejecutable independiente.

SWI-Prolog
SWI-Prolog es una implementación en código abierto del lenguaje de programacion PROLOG. Su autor principal es Jan WielemakerSWI-Prolog posee un rico conjunto de características, bibliotecas, herramientas y una documentación extensiva, funciona en las plataformas Unix, Windows y MacintoshEl nombre SWI deriva de Sociaal-Wetenschappelijke Informatica ("Informática de Ciencias Sociales"), el antiguo nombre de un grupo de investigación en la Universidad de Amsterdan en el que Wielemaker está integrado. El nombre de ese grupo se cambió a HCS(Human-ComputerStudies).

Amzi Prolog.
Es un Prolog comercial, pero tiene versiones para uso personal sin costo.

Prolog comercial. La página contiene una gran variedad de material en Prolog y varios enlaces interesantes.



Arity/Prolog 32
Es un completo entorno de programación en Prolog para Windows de 32 bits que incluye un verdadero compilador, editor, depurador, intérprete y ayuda. Para descargarlo hay que rellenar un formulario.


CU~PROLOG 
Es un lenguaje CLP experimental adecuado para el procesamiento de lenguajes naturales. Hay versiones Unix, MS-DOS (djcup) y Macintosh (MacCup).



Es un intérprete de Prolog compatible con Java que permite añadir la potencia de Prolog a cualquier aplicación o applet Java.

 Es un intérprete Prolog escrito en Java con un sistema innovador de built-ins basado en la extensión Fluents.
 es un entorno de programación en Prolog para Windows sucesor de Turbo Prolog y PDC Prolog.
La Personal Edition es gratuita, pero sólo debe usarse para su aprendizaje y no se deben distribuir los ejecutables generados, que mostrarán al principio un letrero.






XSB 

Es una extensión de Prolog para incluir una implementación eficiente de memorización y una implementación inicial de HiLog. Se puede descargar el código fuente y ejecutables para Windows.

Es un intérprete de un lenguaje tipo Prolog implementado en Java. Es muy portable y puede ejecutarse como aplicación o como applet.
SLDDRAW
Se trata de una aplicación que nos permite trazar arboles de ejecución SLD que meustra el árbol SLD y permite manipularlo hasta conseguir una representación adecuada, el árbol se genera por niveles y, dado un árbol puede tener ramas infinitas, Un circulo verde o rojo nos indica  claramente si el árbol esta completo o no. Esta herramienta nos facilita la visualización de árboles SLD para un programa y objetivo dado, permite modificar la visualización atendiendo a varios parámetros,  controla el nivel de profundidad del árbol.

Otros sitios interesantes relacionados con Prolog.