Categoría: ⇁ Provisión Prolog

¿Por qué programar en lógica?

Las computadoras deben entenderse como dispositivos que facilitan la resolución de problemas. Programarlas es colaborar para esa causa, saber hacerlo es otra cosa. Si hablamos de lógica, podemos llegar a varias definiciones, pero la más sencilla es la más fácil de entender, y pues en eso consiste la lógica (por donde le quieran ver); es la forma más fácil de hacer y deshacer. Desde que se ha conocido la estructura de las computadoras, se ha venido programando de forma similar. La utilización de lenguajes de programación (imperativos) se fundamenta en el cómo hay que dotar de instrucciones para concebir un programa y que este se comporte como debe comportarse para conseguir esos resultados esperados, entonces nos centramos en ese “cómo” sin tomar en cuenta el “qué” hace determinado programa. Esto es que el programador debe especificar (con mucha precisión) cómo hay que valorar el resultado y no en qué hay que valorar.

Esos lenguajes imperativos necesitan de instrucciones específicas que deben realizarse si o si, para concebir los resultados deseados. Los programas escritos en dichos lenguajes deben comportarse de determinada manera (la necesaria) para llegar a un fin.

Si tomamos en cuenta que las personas no piensan de esa forma imperativa, entonces ¿para qué programar bajo esa condición? Yo propongo que usemos la lógica.  🙂

Bien, es necesario saber que la programación debe ser aprendida de manera muy personalizada, cada persona emprende ritmos distintos. Si programamos “lógica”, un lenguaje muy particular es Prolog. Este lenguaje tiene su razón de ser en la “lógica” (Programación lógica), por supuesto. Es la utilización del razonamiento lógico. No es complicado entender este lenguaje, puesto que se puede partir de lo más sencillo (para adquirir confianza), antes de abordar temas complejos. En realidad todo aprendizaje requiere avanzar poco a poco, sin prisas y sin pausas.

Prolog usa sentencias descriptivas (tiene relaciones que nos interesan) que la computadora interpreta como programas. La sutil diferencia de este lenguaje enfocado a la descripción de un conjunto de relaciones es que se sustenta en la interpretación (descripción) de quién programa y no en los requerimientos para programar. Tal vez para un mismo problema existan distintas descripciones (pero ese es otro punto). Aquí no son importantes esas secuencias de instrucciones en la programación. Aquí es indispensable encontrar argumentos en una relación utilizando la descripción del programa.

Sí, la lógica ayuda a pensar claramente y se encuentra en todos los espacios y contextos posibles, pero para programar en Prolog tenemos que tomar en cuenta sus reglas (todos los lenguajes utilizan reglas) que son principalmente: Los programas son sentencias. Y las sentencias describen algún tipo de relación. Para finalizar, un ejemplo que utiliza la forma más sencilla de una sentencia:

 individuo                      relación                   individuo

Carlos                           adora-a                       María

Este es el léxico que se utiliza para escribir programas en PROLOG, siempre en esa forma (individuorelaciónindividuo). Esta es la idea centrar para empezar a entender las dinámicas de este tipo de programación. 

En este blog se describen conceptos básicos para empezar a programar en lenguaje Prolog. Esta entrada tiene como propósito responder a su propio título, para tratar de darle sentido a la programación, sin subestimar a la lógica. Puede ser entretenido…

 

prologme1  

Nota 12: Operaciones con Listas en Prolog.

¿Cómo saber si un elemento pertenece a una determinada lista?

L= [ a, b, c, d, e]; la pregunta es si ” c ” pertenece a la lista anterior… A evidencia clara diremos que sí,  ¿pero cómo podemos consultar esto en Prolog?.

Bien, manifestando nuestro primer hecho tenemos que: un elemento de Y es un elemento de las lista T esto es :

elemento( T, Y) .

Esto sucede si T es una lista e Y es un elemento de la lista.

———– Clausulas

% hecho1             elemento( [ X| T ], X ).    %línea1

% regla                 elemento( [ X| T ], Y ):- elemento( T, Y ).       %línea2

————

Teniendo lo anterior, podemos hacer uso de una % regla  que implica el uso de la recursividad(mandando a llamar al %hecho1, cuando así sea conveniente), la regla sería aplicable cuando Prolog al tratar de dar respuesta a la consulta  no empate de primera instancia con nuestro %hecho1(este hecho se focaliza cuando el elemento buscado es la cabeza de la lista). Prolog tendrá que  cumplir el objetivo con las siguientes clausulas pertinentes de la regla, cuando los elementos de la consulta empaten o coincidan con los elementos descritos en la regla, hará uso de la recursividad mandando a llamar %hecho1. Esto implica que al ser Y un elemento identificado en la lista, sea miembro de la lista T.

¿Cómo sucede esto?

Teniendo nuestras clausulas siguientes:

lista1

y haciendo una consulta:

lista2

tenemos que:

La respuesta será afirmativa.  Pero para ello se realiza todo un proceso.

Para empezar, Prolog focalizará su deducción en el primer hecho %línea1:

elemento( [ X| T ], X ).

Esto no empata puesto que X=a,  T=[b,c,d,e],  X=a    queremos saber si el elemento  c, pertenece a la lista, pero con esa cláusula se tiene que en ese momento “c” no es la cabeza de la lista. Prolog sigue buscando su objetivo pero ahora con la línea,  la regla   %línea2 .

elemento( [ X| T ], Y ):- elemento( T, Y ).

X=a, T=[b,c,d,e], Y=c  Aquí empata perfectamente con la regla, esto implica seguir con la siguiente consulta que es  elemento( T, Y ). esto deduce una llamada al hecho1  Al entrar a la regla se hace referencia al hecho y trata de empatar,  elemento( [ a| [b,c,d,e] , c ).  situación que no sucede, esto implica que comienza el siguiente nivel, es decir, ahora el elemento que se evalúa es b de la lista. Cada elemento que se evalúa pasa por las dos líneas si así es conveniente.

X=b, T=[c,d,e], Y=c    empata nuevamente con la regla pero con la cláusula recursiva no. con la recursividad se va evaluando cada elemento de la lista. Siguiente nivel:

X=c, T=[d,e], Y=c       empata de pies a cabeza. Empata de primera instancia con el hecho1.  elemento( [ c| [d,e] , c ) ¿el elemento c pertenece a la lista? Yes. Puesto que X=c, T=[d,e], X=c

X es el primer elemento de la lista, coincide con el término que se está buscando. La respuesta es afirmativa. Cuando se encuentra coincidencia se detiene la busqueda, ya no hay necesidad de seguir buscando en el siguiente nivel y por supuesto no hay necesidad de pasar a la línea2.

Todo lo anterior se resume en: Al hacer una determinada consulta, Prolog pretenderá hallar la solución buscando en nuestra primera línea línea1 , si las variables empatan dará una respuesta, caso contrario, se busca solución en la segunda línea línea2, que en este caso es nuestra regla. Esta regla contiene otra consulta:      elemento( T, Y ).    donde evalúa un elemento perteneciente a una lista, esto sugiere que se vuelva a comenzar con el primer hecho, haciendo una recursividad. T contienen los elementos de la lista a excepción del primero. Al hacer la recursividad se eliminan uno por uno los elementos de la lista hasta que el elemento que queda como cabeza en X coincida con nuestro hecho1.  Aunque existan variables con el mismo nombre no significa que tengan el mismo valor.

¿Me expliqué?

Nota 11: Amadas Listas en Prolog.

Vamos a hablar de las listas, mas bien, del manejo de las listas en Prolog. Una lista es una secuencia de términos. Toda lista es una estructura de datos simples.
Una lista en Prolog tiene la característica de reconocer la cabeza y cola de la misma, dicho de otra manera, reconoce al elemento que encabeza una lista y por ende al resto de los elementos o términos  de la lista (parte restante de la lista).

Lista    L= [ a, b, c, d, e, f ]

La cabeza de la lista L es: a

El resto o cola de la lista L es: b,c,d,e,f

Otra manera de poder definir la lista anterior sería de la siguiente manera:

L=[ a| b,c,d,e,f]

Las formas en que son definidas las listas en Prolog de manera interna, se basan en  una estructura de árbol: donde la cabeza de la lista (a) se ubica en el lado izquierdo de la estructura de árbol binario, y los demás elementos se colocan del lado derecho de la base. De las ramas pertenecientes a el resto de la lista (b,c,d,e,f) se desprende cabeza y cola, todo esto continua hasta que el elemento último de la lista sea una lista vacía ” [ ]  “ que siempre marca el fin de cualquier lista. (ver la imagen siguiente)

listas

Ejemplos de listas en Prolog:

1–>    L=  [ antonio, lopez, mendez ]

cabeza= antonio — cola=lopez, mendez

2–>   L=  [ [mango,papaya], [aguacate, chayote] ]

cabeza= [mango,papaya] — cola= [aguacate, chayote]

3–>   L=  [mujer]

cabeza=mujer — cola= [ ] lista vacía

4–>   L= [ ]

cabeza= No hay — cola= lista vacía

5–>   L =  [ [a,b,c] | d,e,f [g,h,i] ]

cabeza= [a,b,c] — cola= d,e,f [g,h,i]

Las listas son un tema importante en Prolog, al igual las listas hacen uso de un término importante en este lenguaje de programación, la recursión(reglas recursivas). En la siguiente entrada hablaremos de las operaciones que pueden hacerse con las listas, como agregar un elemento a la lista, considerar si determinado elemento pertenece a la misma, unir términos en una nueva lista o tal vez eliminar alguno de ellos.

Nota 10: Aprendizaje online de Prolog.

Muchos hacen alarde al aprendizaje, a la enseñanza, a la educación. Muchas son las formas en que han variado cada una de estas en la usanza del tiempo, si bien pueden existir diversas opiniones de lo que puede aportar cada uno de los modelos educacionales con los cuales hemos experimentado, creo que lo que está a la vuelta de la esquina son los nuevos métodos de aprendizaje por medio de la red de redes. Este blog, nació por la condición de iniciar un curso de Prolog en línea, en realidad, se mucho de muy poco, asi que me decidí a iniciar una nueva estrategia para construir conocimiento, saber algo de Prolog no le hace mal a nadie y por supuesto que no puede dar dolencia, cuando  resulta de tu curiosidad la aplicabilidad de temas en Inteligencia Artificial.

estudiando

No, no es que no me guste tener vínculo presencial  con algún  grupo estudiantil o tal profesor en turno, puesto que la mayoría de mis experiencias educativas han sido de esa manera,  no resulta fuera de lugar decir que, ésa es una de las tantas formas de construir aprendizaje, de estudiar, de formar conocimiento, una de las vías tradicionales de aprender, de poder tener correspondencia con personas que se inquietan por algún mismo tema.  Las formas en que uno puede instruirse son variadas, todos aprendemos algo cada instante, nada absolutamente nos puede ser excesivo, si de conocimiento se trata. Pues bien, regresando al punto-objetivo de esta entrada, esta nueva forma de aprender a mi tiempo, a mi modo, a mi estilo, a mi nivel de voluntad, con la pretensión de retribuir lo aprendido de distintas formas, bajo diversas vías, con muchas personas en iguales condiciones, es un modo para formalizar o ligar una plataforma de conocimiento, que en este caso es Prolog con la ayuda de este blog en el cual se discuten sus temáticas. Si eres un aprendiz de cursos en línea, platícame ese acontecimiento.

Sinceramente, ¿conoces Prolog?… si la respuesta no es muy efectiva, ni te me inquietes, que al paso del tiempo he aprendido que(y si gustas leer mis entradas) nada es tan difícil que no pueda encontrase buscando (y leyendo). Bajo la malla digital podemos dar ese primer paso.

Mi curso en línea está fundamentado con la siguiente comunidad:

Curso: Inteligencia Artificial con Prolog.
https://www.facebook.com/groups/IntarProlog/

Nota 9: Recopilando lo aprendido [conceptos] y algo más.

Con las anteriores entradas se ha focalizado en los tópicos indispensable para entender el lenguaje de programación declarativo, PROLOG. Señalando una característica de éste es que, “Las sentencias en estos lenguajes se entienden sin necesidad de hacer referencia al nivel máquina para explicar los efectos colaterales.” Esto significa que un programa desarrollado en Prolog se usa como una especificación o descripción formal de un problema.

Concretamente, ¿qué se pretende con un lenguaje declarativo?

* Declarar hechos sobre objetos y sus relaciones.”

* Hacer preguntas sobre objetos y sus relaciones.”

* Definir reglas sobre objetos y sus relaciones.”

Los tres anteriores puntos forman la sintaxis del lenguaje.

Lo hechos en Prolog ( para mayor información puedes checar la entrada Nota 2: Conceptos en Prolog, que se encuentra en este blog 🙂 )

Repasando otra vez, la sintaxis en Prolog se basa en: Variables(referidas con letras mayúsculas), Constantes(en minúscula), todas las afirmaciones terminan con punto, el uso de las sentencias adicionales, denominadas reglas. Conjunción, se utiliza la como como operador lógico AND , . Disyunciones, se utiliza como operador lógico OR ;

(?-) éste es el indicador de comando.

Respuestas en Prolog cuando se utilizan consultas:

Para cumplir un objetivo en Prolog(una meta, para responder a una consulta) se deben de satisfacer una o varias metas(objetivos). Con esto se hace referencia a Backtranking o Retroceso. “Un hecho puede hacer que un objetivo se cumpla inmediatamente, mientras que una regla sólo puede reducir la tarea a la de satisfacer una conjunción de subobjetivos. Si no se puede satisfacer un objetivo, se iniciará un proceso de Backtranking. Este proceso consiste en intentar satisfacer los objetivos buscando una forma alternativa de hacerlo.” En Prolog para producir procesos repetitivos existen dos técnicas: Backtranking y Recursión.

El backtranking tiene como propósito encontrar las soluciones a un objetivo, cosa que la recursión(cuando las cláusulas se llaman a sí mismas) no puede hacerlo. “Una pregunta en Prolog (variables X1, … Xn) tiene la forma: ? B1, B2, … Bn y se lee, ¿existen valores para las variables X1, … Xn tales que B1 y B2 y… Bn son ciertas? Las consultas son un mecanismo utilizando en Prolog para recuperar información cuando se hace una pregunta lo que se pretende es determinar si esa pregunta es consecuencia lógica del programa. Si Prolog responde “Yes”, significa que ha podido demostrar dicha consulta, si responde “No(false)” es que no ha podido demostrarlo. Hasta aquí contamos con un pasaje a lo antes aprendido, ahora pues, podemos comensar con un tema interesante utilizado en la programación procedural, Estructuras, Listas… hasta entonces, pues.

Referencias:

El lenguaje de Programación Prolog. –Francisco Toledo Lobo Julio Pacheco Aparicio M. Teresa Escrig Monferrer / *Prolog– Faraón Llorens Largo-Ma Jesús Castel de Haro  /*Red de redes

Nota 8: Modo declarativo en Prolog.

Los programas en Prolog pueden entenderse de dos maneras, declarativa y proceduralmente.

Forma declarativa: Determina si una meta dada es cierta y para qué valores es cierta.

“Una instancia de una cláusula C es la cláusula C con cada una de sus variables sustituidas por algún término. Una “variante” de una cláusula C es una instancia de la cláusula C tal que cada variable se sustituye por otra variable.”

” Una coma entre metas denota una conjunción de metas: todas tienen que ser ciertas. Prolog acepta además la disyunción de metas : cualquiera de las metas en una disyunción tiene que ser verdadera. La disyunción se indica con el símbolo de punto y coma (;). “

 

Considerando el siguiente programa:
f1

Si consultamos lo siguiente:

ejerdeclarativo1

¿La meta f(s(1), A).  es cierta?, sí lo es, porque es idéntica a la cláusula f(s(1), dos).  A es un término que cambia por el “dos”. Por lo tanto la meta es cierta.

—————————————-

¿Qué encontramos con las siguientes consultas?:

f2

1) La meta no es válida. puesto que no existe una instancia pertinente ni cláusula que empate con los términos en la consulta.

2) Meta válida. Empata con la última clausula del programa. 1 se instancia en X, C es una variante en N. La regla recursiva  se cumple.

3) La meta es válida. La meta coincide con la cláusula f( s(s(1)), tres). D es un término que se sustituye por s(s(1))

Nota 7: Referencias sobre Prolog.

En la red de redes existe un sin fin de información, la cual puede sustentar todos los temas habidos y por haber de la humanidad. Todo tipo de temáticas pueden ser consultados en la web, esta concepción no tiene nada nuevo, pero esta entrada tiene la intención de citar, ampliar y consultar  distintas fuentes de las cuales podemos estudiar y conocer de qué va  PROLOG. La información parte de distintas fuentes, blogs(como este), artículos que están disponibles en línea, libros digitales que tienen las mismas condiciones para acceder a cualquier información de conceptos en Prolog. Un referente muy importante son las comunidades en la red, que tienen una misma pretensión; aprender, intercambiar información (de lo aprendido, o haciendo extensivo algún tipo de aportación en algún tema), junto con todo esto se socializa implementando una comunicación por red(comunicación virtual), haciendo uso de herramientas que permitan cumplir con el intercambio de opiniones, aportaciones de los propios participantes.

Este blog es causa de asuntos aprendidos(y muchos otros por conocer) en Prolog, es resultado de un curso que está siendo tomado en línea. Tener una opción de estudio por esta vía abre las posibilidades de aprender a mi ritmo, a mi forma, a mi condición. Nada mejor que auto-instruirse a través de la malla de conocimientos en línea. Una experiencia muy gratificante, muy dinámica, sin seguir patrones caducos de la educación formal.

Pueden haber muchos puntos de encuentro e información  en Prolog, pero me permito citar algunas referencias con las que tengo oportunidad de interactuar y consultar :

% Comunidad de programadores en Prolog en el mundo, por Facebook:

https://www.facebook.com/groups/iaprolog/?ref=ts&fref=ts

% Comunidad de aprendices en Prolog , en G+ y Facebook:

http://goo.gl/oRGGz

https://www.facebook.com/groups/PrologBasico/

%Comunidades de programadores que resuelven o atienden temáticas respecto a Prolog:

http://www.lawebdelprogramador.com/foros/Prolog/index1.html

Algunos ejemplares digitales para aprender Prolog se pueden consultar abiertamente.

%Libros completos en Prolog, por medio de Google Reader:

http://goo.gl/LOi1A     %en Inglés.

http://goo.gl/oCvsz  %en Español

%Libro sobre implementaciones de Prolog en sistemas expertos, por Google Reader:

http://goo.gl/ZFieZ

%Páginas/blogs sobre Prolog.

http://proton.ucting.udg.mx/tutorial/prolog/index.htm

http://fcqi.tij.uabc.mx/usuarios/ardiaz/conceptos.html

http://www.desarrolloweb.com/articulos/1573.php

http://www.learnprolognow.org/

Un libro del que estoy basando mis apuntes de este blog es: Prolog . Material de Apoyo a la Licenciatura en Matemáticas- Área Computación- UAGro.

Las referencias respecto a Prolog a la usanza de seguir aprendiendo irán aumentando, pendientes…