El post que buscas se encuentra eliminado, pero este también te puede interesar

Paradigma de programación: Programación Lógica

¿Que es un paradigma de programación?
Generalmente, durante el desarrollo de aplicaciones de software, se encuentran con diversos problemas que deben ser solucionados de distintas formas, utilizando los distintos algoritmos que existan para su solucion, o implementando uno particular para un caso concreto. Estos pueden ser vistos desde diversos enfoques. Uno de los mas utilizados es el de la Orientación a Objetos, utilizado en lenguajes de programacion como Java, C# e incluso C++.
Sin embargo, como sugiere el titulo, no solo este existe, sino que tambien hay otros que, de una u otra forma, simplifican la implementacion de ciertos algoritmos de solucion.
Citando a Wikipedia:

dijo:Un paradigma de programación es una propuesta tecnológica que es adoptada por una comunidad de programadores cuyo núcleo central es incuestionable en cuanto a que unívocamente trata de resolver uno o varios problemas claramente delimitados. La resolución de estos problemas debe suponer consecuentemente un avance significativo en al menos un parámetro que afecte a la ingeniería de software. Tiene una estrecha relación con la formalización de determinados lenguajes en su momento de definición. Un paradigma de programación está delimitado en el tiempo en cuanto a aceptación y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente.[/quote]

En este post, intentaré aclarar un paradigma algo distinto a lo que se esta acostumbrado normalmente, además daré un ejemplo de un lenguaje utilizado en el mismo

Programación Lógica, ¿eso con que se come?


En un principio, los lenguajes de programación eran muy relacionados con las operaciones de una máquina, es decir, operaciones aritméticas, acceso a memoria, apertura de archivos, entre otras funciones comunes de un computador. Estos programas pueden ocultar de cierta manera, su funcionalidad, pues su codigo puede ser bastante complejo y dificil de leer.
En cambio, para una persona normal, es muy facil modelar un problema utilizando lógica matematica, ademas de que ayuda a que los programas sean mas legibles y su mantenimiento sea mas sencillo.
El paradigma lógico de programación se basa en "premisas" que se dan a un universo, y basado en esas reglas (el cual se asumen como verdaderas) el programa responde un valor de verdad, concluido usando la lógica matematica. Un ejemplo de esto sería el siguiente:
Se tienen los siguientes hechos:

+las aves vuelan
+los pingüinos no vuelan
+"pichurri" es un ave
+"sandokan" es un perro
+"alegría" es un ave


Ademas, la siguiente restriccion:

+una mascota vuela si es un ave y no es un pingüino

es posible preguntar al programa cosas como:

+¿ "pichurri" vuela ?
+¿ qué mascotas vuelan ?


y el programa respondería
+Es cierto que "pichurri" vuela.
+"pichurri" y "alegría" vuelan.


Este ejemplo es altamente simple, sin embargo, permite mostrar de manera muy básica el poder de este paradigma


Prolog: Lenguaje de programación lógica

Primeramente, me gustaria especificar que basaremos nuestra sintaxis en swi prolog, interprete gratuito que esta disponible en internet. la consola de prolog esta definida por el caracter '?' Nota: aun cuando existe un estandar ISO de prolog, este no contempla todo el lenguaje, e incluso algunos compiladores no lo siguen al pie de la letra, por lo que los codigos que ponga de ejemplo puede que no funcionen en otro editor

Primero, como la mayoria de los lenguajes, se cuenta con una forma de introducir comentarios dentro del codigo. Esto se realiza con el signo %, y cubren toda una linea como un comentario. es decir:
%esto es un comentario
%esto tambien
esto no

las "variables" (entre comillas pues no es el concepto que se conoce como variable) pueden contener nombres alfanumericos, pero siempre deben empezar con una letra mayúscula o un guion bajo '_'. Por ejemplo:
Variable %es una variable
_var %es una variable
var %no es una variable

Ademas, existe una variable anonima, la cual puede tomar cualquier valor. Esta siempre será _, y se utiliza cuando haya un espacio que puede valer cualquier cosa, segun la clausula que se utilice.

Los atomos, o simbolos, del lenguaje, son cualquier grupo de caracteres, una sucecion de signos de puntuacion, o cualquier expresion entre comillas simples. A esto tambien se le conoce como functor. Notese que las variables no son functores, sino que sirven como parametros a estos.

para llamar a uno de los terminos, se utiliza la siguiente notacion:
functor(argumento1,argumento2,...,argumentoN

dependiendo del valor de N (el cual puede ser 0, en cuyo caso se omiten los parentesis) se le asigna una aridad al termino. Si el functor f tiene N argumentos, se utiliza la notacion f/N para indicar su aridad. Si N es 0, se dice que el termino es cerrado.

Algo que tiene diferente el lenguaje respecto a otros es la forma de tratamiento de las variables. En cierto modo, no son variables como tales, pues solo tiene dos estados. Primero, al ser declaradas, se dice que estan "libres", es decir, sin un valor asignado. Sin embargo, una vez que se les da un valor, este no cambia, por lo que se dice que esta "ligada" Una variable puede contener cualquier tipo de valor. Este es, a grandes razgos, el mecanismo de unificacion de variables. Con un ejemplo se puede entender mejor:

supongamos que declaramos un termino h/2, y lo utilizamos de la siguiente manera:
h(X,3) y h(10, Z)
Entonces se unifican los valores, a saber, X vale 10 y Z vale 3. Esto es por que hay una posible ligadura entre ambos valores. Este concepto se puede aplicar ademas, con dos variables. si se tiene un termino a/1, y se escribe como:
a(X) y a(Y)
los valores de X y Y quedaran ligados, es decir, es como escribir X=Y. Si X o Y se unifica a un valor, entonces la otra variable tambien tomara el mismo valor. En otras palabras, si X = Y y X = 2, se concluye que Y = 2 (recordemos que esto se basa en lógica matematica)

Este mecanismo es muy complejo y poderoso. Algunas propiedades que tiene y que confunden a la mayoria:
+ Las variables pueden aparecer mas de una vez dentro de un termino. Es decir, se puede tenr F(C,C) y F('hola',D). Esto hace que C se ligue al valor 'hola'. Como C esta ligado a hola, entonces D tambien se liga a 'hola', pues D se liga a C por ser segundo argumento
+Las variables no se unifican a valores distintos
+las variables anonimas son distintas, es decir, a(_,_) y a(2,3) unifican

En prolog, ademas de que las variables cambian, tambien cambia la forma de ejecucion de los programas. A continuacion, intentare explicar de manera entendible como se realiza esto.

En prolog, las unidades que se pueden ejecutar se llaman predicados. En esecencia, son semejantes a funciones en lenguajes imperativos, como C. En lo que se diferencia es que en estos, no se devuelve un valor, sino que se tienen dos posibles resultados, Verdadero o Falso (true o false) Un objetivo (goal en inglés) es una llamada particular a un predicado

En un goal, es posible utilizar variables libres como parametros, y el lenguaje devolvera todos los posibles valores que satisfacen la condicion que se quiere dar como verdadera. unos ejemplos tomados del tutorial en el que me baso para la estructura del post:
El caso más básico es aquél que no contiene variables: son_hermanos('Juan','Maria'). Este objetivo sólamente puede tener una solución (verdadero o falso).
Si utilizamos una variable libre: son_hermanos('Juan',X), es posible que existan varios valores para dicha variable que hacen cierto el objetivo. Por ejemplo para X = 'Maria', y para X = 'Luis'.
También es posible tener varias variables libres: son_hermanos(Y,Z). En este caso obtenemos todas las combinaciones de ligaduras para las variables que hacen cierto el objetivo. Por ejemplo, X = 'Juan' y Z = 'Maria' es una solución. X = 'Juan' y Z = 'Luis' es otra solución.


Dado que lo que estamos programando es logica, entonces es posible anidar objetivos utilizando conectivas, como lo son la conjuncion, la disyuncion y la negacion. Explico solo la conjuncion, que es la mas utilizada. el elemento que se utiliza para separar clausulas es la ',' la cual se interpreta como un "y". Pueden utilizarse variables libres, sin embargo, hay que tomar en cuenta el orden de ejecucion para las ligaduras. si algun objetivo retorna false, se detiene la ejecucion (al ser conjuncion, si una parte falla, todo fallará).

Ya con esto un poco claro (espero) es prudente ver un programa real, para poder analizar la estructura del codigo. Iré explicando cada una de las partes. Primeramente, se tienen un grupo de clausulas, que se utilizarán para las demostraciones. cada una de esta se separa por un cambio de linea, y son terminadas por un '.' Recordar que el orden es significativo. el formato de estas son:
cabeza :-
ojetivo1,
ojetivo2,
...,
ojetivoN.


El operador ':-' es como el operador "implica" en la logica matematica, Un ejemplo de esto es:
es_viejo(Individuo) :-
edad(Individuo,Valor),
Valor > 60.



Es posible eliminar el cuerpo de una clausula, lo que la hace un "hecho" y se asume como verdadero siempre.


De manera muy básica, esta es la explicacion del paradigma, ademas de principios del lenguaje. Existen muchos documentos en internet, lo que quise hacer es dar una especie de guia o de inicio, por eso no me adentre tanto en los detalles del lenguaje.
Cualquier duda que tengan, con gusto intentaré responderla de la mejor manera.

Anuncios

1 comentario - Paradigma de programación: Programación Lógica

@alnuar
me gusta mucho este tema, gracias x la info