Translate

domingo, 24 de noviembre de 2019

Más de Prolog

Seguimos con Prolog

Veamos los operadores que nos trae prolog :


El operador "is" permite evaluar expresiones: X is Y

Veamos un ejemplo:

longitud([],0).
longitud([_|Resto],N):-
   longitud(Resto,N1), N is N1+1.

Luego tenemos los operadores lógicos


Con estos operadores podemos hacer lo siguiente: 










Predicado de control. Corte (!) : El corte es un predicado predefinido que se denota mediante un punto de exclamación (!), no tiene argumentos, y cuya evaluación es siempre cierta. 

Los cortes permiten al programador intervenir en el control del programa, puesto que su presencia hace que el sistema ignore ciertas ramas del árbol.

Su utilidad básica, dado que reduce el espacio de búsqueda de soluciones, es mejorar la eficiencia de los programas, evitando la exploración de partes del árbol de resolución de las que se sabe de antemano que no conducirán a ninguna nueva solución.

Veamos un ejemplo :

La representación anterior calcula correctamente los valores de la función, pero tiene el siguiente inconveniente.
Supóngase que se realiza la consulta:
?- f(0,Z), Z>1.

La respuesta de Prolog será “falso”, pero para llegar a dicha conclusión el sistema tiene que recorrer las 3 posibles ramas del árbol

Lo anterior es poco eficiente, puesto que, al ser las tres reglas que describen el predicado f mutuamente excluyentes, una vez que se ha encontrado una solución con una de ellas no tiene sentido probar con el resto. En efecto, la función que se esta calculando tiene la siguiente estructura condicional:

si X ≤ 10 entonces Y = 0; 
si no: si X ≤ 20, entonces Y = 1; 
si no: Y = 2

Esto se puede espresar de la siguiente manera con el operador ! : 


Con esta nueva versión, la respuesta de Prolog a la consulta 

?- f(0,Z), Z>1.

será también “falso”, pero ahora, gracias a la introducción del corte en la primera regla, el sistema solo tendrá que explorar la primera rama del árbol.


Primeros pasos en Docker


Docker es un container management service, que en castellano sería un servicio administrador de contenedores. Es sin duda la tecnología más de moda en estos tiempos.

La idea es desarrollar en contenedores que pueden ser desplegados en cualquier equipo de esta manera la aplicación puede funcionar en cualquier pc y no tenemos el tipico problema de que una aplicación funcione en un computador y en otro no.

Docker esta formado por los siguientes componentes :

  • Docker for Linux, Mac, Windows : este componente permite correr Docker sobre estas plataformas
  • Docker Engine : Es usado para crear imágenes y contenedores
  • Docker Hub : Se utiliza para registrar las imágenes y luego poder utilizarlas
  • Docker Compose : Es utilizado para definir aplicaciones a partir de múltiples containers.


Para instalar docker podemos hacerlo del manual de la pagina oficial: https://docs.docker.com/install/

Una forma de ver si docker quedo bien instalado es hacer :

docker version

De esta forma si docker nos retorna la version, bueno… Anda!

Si necesitamos información de nuestro docker podemos hacer:

docker info

De esta manera vamos a tener información de nuestro contenedor.

Pero si de verdad queremos probar si funciona nuestro docker podemos probar una imagen por defecto, esto sería como un “Hola Mundo” de docker. Empecemos revisando la sintasis, para correr una imagen debemos hacer :

docker run image

Donde image es el nombre de la imagen que queremos correr.

Por ende si queremos correr la imagen “hello-world” :

docker run image hello-world

Este comando lo que va hacer es bajarte la imagen de “hello-world” y luego la va a ejecutar.

Creo que para empezar, bien!

Luego seguimos en posteriores post.

sábado, 23 de noviembre de 2019

Estado del Octoverso


GitHub ha publicado Estado del Octoverso que es un informe anual detallando, una serie de cifras y datos interesantes sobre los desarrolladores, repositorios, proyectos y lenguajes de programación que alberga la plataforma.

Con más de 40 millones de desarrolladores, incluyendo 10 millones de nuevos usuarios registrados en 2019, GitHub ya alcanza más de 44 millones de repositorios. En lo que va de año esos desarrolladores colaboraron usando más de 370 lenguajes de programación.

Lo que más me llamo la atención este año es que Python ha pasado a Java. Esto claramente se debe a que han aumentado los proyectos en maching learnig y sin duda en esta disciplina, python es el rey.



Entre los lenguajes que más crecieron esta dart y Rust :


Sin más dejo link : https://octoverse.github.com/


jueves, 14 de noviembre de 2019

Listas en prolog

Seguimos con Prolog

Una lista es una secuencia de elementos tales como:
[clara,tomas,jose,isabel]

La representación interna de las listas en PROLOG es con árboles binarios, donde la rama de la izquierda es el primer elemento –o cabeza– de la lista y la rama de la derecha es el resto –o cola– de la lista.

[]. Es una lista vacía. Y es el final de la lista (igual que funcional)


En el ejemplo anterior, la cabeza será clara y la cola
[tomas,jose,isabel].

El último elemento siempre es la lista vacía ([]).

La cabeza y la cola de una lista se pueden separar con el símbolo “|”.

[a,b,c]
[a|[b,c]]
[a,b|[c]]
[a,b,c|[]]
[a|X],[Y|[b,c]]

?- [a,b,c] == [a,b|[c]].
true.

El orden de los elementos en la lista importa y un elemento se puede repetir en una lista.

Supongamos que queremos determinar si un elemento es miembro de una lista. Los siguientes serían ejemplos del funcionamiento de la relación “miembro”.

miembro(b,[a,b,c]). %PROLOG respondería sí.
miembro(b,[a,[b,c]]). %PROLOG respondería no.
miembro([b,c],[a,[b,c]]). %PROLOG respondería sí.

Siendo miembro :

miembro(X,[X|_]).
miembro(X,[_|R]):-miembro(X,R).


sábado, 9 de noviembre de 2019

Sincronizar canales en Go


Podemos usar canales para sincronizar la ejecución entre goroutines. Veamos un ejemplo de un programa que espero a que termine una gorutine:

package main
import (
    "fmt"
    "time"
)

func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")
    done <- true
}

func main() {
    done := make(chan bool, 1)
    go worker(done)
    <-done
}

$ go run channel-synchronization.go   
working...done     

Cuando debemos esperar a que terminen varias gorutinas, podemos usar un WaitGroup.

Si eliminamos la línea <- done de este programa, el programa se cerraría incluso antes de que el worker comenzara.

Dejo link: https://gobyexample.com/channel-synchronization

viernes, 8 de noviembre de 2019

Libros de Java Code Geeks

Download IT Guides!

 
The web server is used in products such as Apache ActiveMQ, Alfresco, Apache Geronimo, Apache Maven, Apache Spark, Google App Engine, Eclipse, FUSE, iDempiere, Twitter’s Streaming API and...
 
 
The first specification of JAXB was done in March 2003 and the work process is tracked in the Java Specification Request 31. In this specification request you can find a lot of...
 
 
JavaFX 2.0 and later is implemented as a native Java library, and applications using JavaFX are written in native Java code. JavaFX Script has been scrapped by Oracle, but development is...
 
 
A servlet can almost be thought of as an applet that runs on the server side-without a face. Java servlets make many Web applications possible.
Java...
 

martes, 5 de noviembre de 2019

Machine Learning (aprendizaje automático) con Python: una introducción práctica

Me llego un mail de edX sobre machine learning en python en castellano. Toma tu torta!

A anotarse y estudiar!!!

Inscríbete hoy
‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 
 
 
Cursos|Programas|Mi Cuenta
 
 
Machine Learning (aprendizaje automático) con Python: una introducción práctica
 
El Machine Learning puede ser una herramienta increíblemente beneficiosa para descubrir información y predecir tendencias futuras. Este curso de aprendizaje automático con Python te brindará todas las herramientas que necesitas para comenzar con el aprendizaje supervisado y autónomo.
Inscríbete hoy ▸
 
Recursos útiles para comenzar
 
Razones para agregar cursos en línea a tu currículum y ​​cómo hacerlo
Al buscar un nuevo empleado, diferentes empleadores buscan cosas diferentes, pero todos intentan responder a la misma pregunta : ¿puede este individuo agregar valor a mi negocio?...
Aprende Más ▸

 
3 habilidades que necesitas para triunfar
A medida que la tecnología revoluciona la economía digital, estamos redefiniendo lo que significa tener éxito en el trabajo. Aparte de las competencias técnicas, los estudios muestran que los empleados también necesitarán una combinación...
Aprende Más ▸
 
 
 
YouTube Twitter LinkedIn Facebook Instagram Reddit
 
Download edX's App Download edX's Google Play App
 
edX es la plataforma de confianza para la educación y el aprendizaje.
 
¡Ahorra 10% en programas selectos! Haz clic aquí.
 
edX para Negocios — Soluciones de aprendizaje en línea para tu organización
 
© 2012-2019 edX Inc. Edx, Open edX, y MicroMasters son marcas registradas de edX Inc.
 
Ver el email en el navegador | Salir de la lista
 
141 Portland St. 9th Floor, Cambridge, MA 02139
 

lunes, 4 de noviembre de 2019

Cuáles era sus lenguajes de programación favoritos, odiados o recomendarían para aprender a programar...

Unas 15K personas de todo el mundo han contestado el meme en Twitter de cuáles era sus lenguajes de programación favoritos, odiados o recomendarían para aprender a programar... Los he recopilado y analizado con @graphext y aquí un hilo con los principales insights que encontré 👇

Este es un tweet muy interesante Victoriano Izquierdo :




domingo, 3 de noviembre de 2019

Prolog


PROLOG es un lenguaje de programación declarativo. Los lenguajes declarativos se diferencian de los lenguajes imperativos o procedurales en que están basados en formalismos abstractos (PROLOG está basado en la lógica de predicados de primer orden y LISP, otro lenguaje de programación declarativa, en lambda calculo), y por tanto su semántica no depende de la máquina en la que se ejecutan. Las sentencias en estos lenguajes se entienden sin necesidad de hacer referencia al nivel máquina para explicar los efectos colaterales.

PROLOG es un lenguaje de programación muy útil para resolver problemas que implican objetos y relaciones entre objetos. Está basado en los siguientes mecanismos básicos, que se irán explicando :
  • Unificación
  • Estructuras de datos basadas en árboles
  • Backtracking automático
La sintaxis del lenguaje consiste en lo siguiente:
  • Declarar hechos sobre objetos y sus relaciones
  • Hacer preguntas sobre objetos y sus relaciones
  • Definir reglas sobre objetos y sus relaciones
Vamos utilizar SWI-prolog : https://swish.swi-prolog.org/

Las cláusulas PROLOG son de tres tipos: hechos, reglas y preguntas. Las cláusulas PROLOG consisten en una cabeza y un cuerpo. Los hechos son cláusulas que tienen cabeza pero no tienen cuerpo. Las preguntas sólo tienen cuerpo. Las reglas tienen siempre cabeza y cuerpo. Los hechos son siempre ciertos. Las reglas declaran cosas que son ciertas dependiendo de una condición. El programa PROLOG (o base de datos PROLOG) está formado por hechos y reglas y para PROLOG no hay ninguna distinción entre ambas. Las preguntas se le hacen al programa para determinar qué cosas son ciertas.

Los hechos PROLOG : 

En consola:
assert(progenitor(laura, damian)).

En un archivo:
progenitor(laura, damian).

“progenitor” es el nombre de la relación o nombre de predicado y “laura” y “damian” son los argumentos. Los hechos acaban siempre con punto. 

Las reglas en PROLOG: 

Existe en PROLOG la posibilidad de definir la relación “abuelo(X,Y)” o la relación “tio(X,Y)” como reglas, además de poderlo hacer como hechos o como conjunción de objetivos.

[user].
abuelo(X,Y):- 
progenitor(X,Z), progenitor(Z,Y).
tio(X,Y):- 
progenitor(Z,Y), progenitor(V,Z), progenitor(V,X).
<EOF> 

También podemos crear reglas recursivas : 

[user].
predecesor(X,Y):-progenitor(X,Y).
predecesor(X,Y):-progenitor(X,Z), predecesor(Z,Y).

La definición de varias reglas con el mismo nombre de relación equivale en PROLOG a la “O” lógica o disyunción.

Las preguntas PROLOG

Sobre un conjunto de hechos se pueden realizar una serie de preguntas en la consola. Por ejemplo:

?- progenitor(laura, damian).
true.
?- progenitor(juan, damian).
false.

PROLOG busca automáticamente en la base de datos si existe un hecho que se puede unificar.

También se puede consultar por medio de variables. Por ejemplo:

?- progenitor(jose,X).
X = ana ;
X = patricia.

Debemos consultar más de un resultado por medio de la tecla “Tab”

Sintaxis en Prolog : Los objetos o términos PROLOG pueden ser objetos simples o estructuras. Los objetos simples pueden ser constantes o variables. Las constantes serán átomos o números. Los átomos empiezan con letra minúscula (nunca con números), pueden contener caracteres especiales y pueden ser nombres entre comillas simples. Los números serán enteros o reales, sin una definición explícita de tipos. PROLOG se utiliza para una programación simbólica, no numérica, por eso los enteros se utilizarán por ejemplo para contar el número de elementos de una lista, pero los reales son poco utilizados. Las variables empiezan con mayúscula o con subrayado. Las variables anónimas son aquellas cuyo nombre es sólo el carácter subrayado (_). Se usan cuando no es importante el nombre de la variable o cuando la variable no puede unificar con otra, dentro de la misma cláusula.

Términos. Constantes: Números. Este tipo de constantes se utilizan para representar tanto números enteros como números reales y poder realizar con ellos operaciones aritméticas.
Átomos. Los átomos se utilizan para dar nombre a objetos específicos, es decir, representan individuos concretos. Existen tres clases principales de átomos:
Cadenas formadas por letras, dígitos y el símbolo de subrayado, que deben empezar necesariamente por una letra minúscula.  
Cualquier cadena de caracteres encerrada entre comillas simples.

Términos. Variables
Las variables en Prolog se representan mediante cadenas formadas por letras, dígitos y el símbolos de subrayado, pero deben necesariamente empezar por una letra mayúscula  o por un símbolo de subrayado. 

Ejemplos: X, Resultado_1, Entrada, _total3, _3bis
Las variables que empiezan con un símbolo de subrayado, se denominan variables anónimas, y se usan cuando se necesita trabajar con variables cuyos posibles valores no interesan. 

Términos compuestos. Listas : Uno de los términos compuestos mas importantes y útiles que ofrece Prolog son las listas, secuencias ordenadas de cero o mas elementos, donde los elementos pueden ser cualquier tipo de termino. La lista vacía se representa mediante el átomo [] , toda lista no vacía tiene una cabeza y un resto (que será una lista), y se representa mediante un termino compuesto de paridad 2, cuyos argumentos son, respectivamente, la cabeza y el resto de la lista.
La notación consiste en enumerar entre corchetes todos los elementos de la lista, separados por comas. 
Ejemplos,  [a, []] o [a] y [a, b, c, []] o [a,b,c] 

Prolog también dispone de otra notación para las listas, que consiste en representar la lista con cabeza X y resto Y mediante el termino [X|Y]. Esta ultima  notación es fundamental para poder separar la cabeza del resto de una lista.

Y vamos a continuar...

Programación lógica

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. La programación lógica gira en torno al concepto de predicado, o relación entre elementos.

La lógica matemática es la manera más sencilla, para el intelecto humano, de expresar formalmente problemas complejos y de resolverlos mediante la aplicación de reglas, hipótesis y teoremas. De ahí que el concepto de "programación lógica" resulte atractivo en diversos campos donde la programación tradicional es un fracaso.

La programación lógica encuentra su hábitat natural en aplicaciones de inteligencia artificial o relacionadas:
  • Sistemas expertos, donde un sistema de información imita las recomendaciones de un experto sobre algún dominio de conocimiento.
  • Demostración automática de teoremas, donde un programa genera nuevos teoremas sobre una teoría existente.
  • Reconocimiento de lenguaje natural, donde un programa es capaz de comprender (con limitaciones) la información contenida en una expresión lingüística humana.
La programación lógica también se utiliza en aplicaciones más "mundanas" pero de manera muy limitada, ya que la programación tradicional es más adecuada a tareas de propósito general.

La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer orden, aunque también incorporan algunos comportamientos de orden superior como la lógica difusa. En este sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la única teoría lógica de orden superior que es demostradamente computable (hasta el momento).

Un concepto importante de programación lógica es la descomposición de programas en sus componentes lógicos y sus componentes de control. Con lenguajes de programación lógica de bajo nivel, estos componentes determinan la solución del problema, por eso los componentes de control pueden variar para proporcionar alternancia de ejecución de un programa lógico. Estos conceptos son capturados con el eslogan

Algoritmo= lógica + control

donde "lógica" representa un programa lógico y "control" diferentes estrategias de demostración del teorema.

Esto no se queda así, seguimos con prolog!!