lunes, 30 de septiembre de 2013

Prolog, lista de backtracks


En prolog listar BACKTRACKS suele ser muy util, esta simple funcion con algunas modificaciones genera una lista A de backtracks, asimismo el segundo argumento (Ax) puede usarse como una lista de variables no deseadas


p(1).
p(2).
p(3).
p(4).
p(5).
p(6).
p(7).
p(8).
p(9).

pes([X|A],Ax):-
    p(X),
    not(member(X,Ax)),
    pes(A,[X|Ax]),!.

pes([],Ax):-!.


-----------(corrida de ejemplo)--------------------
 [debug]  ?- pes(A,[]). 
A = [1, 2, 3, 4, 5, 6, 7, 8, 9]. 

 [debug]  ?- pes(A,[4,5,6,7]).
A = [1, 2, 3, 8, 9].

Hasta la proxima.

martes, 24 de septiembre de 2013

Bash, argumentos

     Muchas veces se necesita modificar el comportamiento de un script para hacerlo mas flexible, la mejor forma de lograrlo es utilizando argumentos. 
 
     Los argumentos se pasan al lado del script cuando se lo llama desde la consola de comando:

./script arg1 arg2 arg3 ... argN

    Para recuperar los valores de estos argumentos simplemente hay que referenciarlos con $1, $2, $N, tambien hay argumentos especiales como $# (num de args), $@ (array que contiene todos los args).

#!/bin/bash

echo "hay"$#"parametros"
echo "estos son: "$@

if [ $1 == yo ]; then
echo "Sorpresa!"
fi

lunes, 23 de septiembre de 2013

Mas Condiciones de BASH

Esto va a ser rapido y potente:

condicional IF+else:

if [ cond ]; then
 #code
 #more code
elif [cond2]; then
 #cond2 code
 #some more code
else
 #code
fi #cerrar condicion

condicional Case:

case $var
        valor_1)
               #code
        valor_2)
               #code
esac #cerrar case 


bucle for:

for i in $array
do
 #code 
 # $i toma el valor de cada posision del array
 # array tambien puede ser el output de un comando
 #code
done   




Y eso hace una introduccion a lo que son los condicionales de Bash, hay otros como while, until y select, pero son menos utiles y si en algun momento los llegan a usar la sintaxis no es my diferente.

Prolog: casos base y el resorte recursivo

El querido Prolog, para este post voy a suponer que se tienen nociones basicas de la sintaxis de prolog. Mas que nada quiero explicar algunas cosas un poco raras que tiene prolog.
 
Los casos base:

    En prolog todo es recursivo, no existen ni for, while, case, nada de eso. En vistas de esta hermosa cualidad definir los casos base gana una importancia mucho mayor a la usual. Pero, como definir un correcto caso base ? En general hay que pensar como queremos iniciar una variable (0 o []), aunque todo depende de como se diseñe el algoritmo.
 
El "resorte recursivo":

    Ese es el nombre que le di a una de las cualidades de la recursion, que es: Cuando se ejecuta una funcion recursiva primero chequea si esta en el caso base, de no ser asi se llama de nuevo a si misma hasta llegar al caso base. 

Definamos una simple funcion para entenderlo mejor:

func([A|B],[A|L]):- func(B,L).
func([],[]).

Ahora si lo ejecutamos con la consulta func([1,2,3],B) haria esto:

func([1,2,3], B)
func([2,3], B)  [quedo 'flotando' el 1]
func([3],B)
func([],[]) [en el caso base y B unifico con [], ahora va a volver por donde vino]
func([3],[3])
func([2,3],[2,3])
func([1,2,3],[1,2,3])

B=[1,2,3]

Claro que nosotros solo vemos el resultado y esta es una version simplificada de lo que veriamos si estuvieramos en modo trace. Pero supongo que es suficiente para entender el punto.
 

Bash y el querido IF

    En programacion (cualquier tipo de programacion) en general se necesita preguntar algo, para eso existe if este sencillo condicional nos ayuda bastante.

    El uso es muy simple, si la condicion que esta entre los corchetes resulta verdadera se ejecuta la secuencia de comandos en el interior del if : 

#!/bin/bash
echo "dame un numero"
read A

if [ $A==0 ]; then
echo "diste un cero"
fi
 
if [ $A==1 ]; then
echo "diste un unp"
fi  

    Este script simplemente nos avisa si ingresamos un 0 o un 1, si ingresamos otro numero no dice nada.

Notas sobre la sintaxis:

    La sintaxis es if [ condicion ]; then comandos fi el fi cierra nuestro condicional, tambien hay que tener muy en cuenta que los corchetes estan separados de la condicion por un espacio!

    Y eso es todo sobre el uso basico, en otra entrada ampliare como usar else

 

domingo, 22 de septiembre de 2013

Un poco de BASH

    En linux uno de los interpretes predeterminados es BASH o simplemente SH, algo asi como el equivalente de batch en windows.

    Para empezar podemos decir que todos los comandos que son accesibles desde la consola pueden utilizarse en BASH, ls, grep, wc, ect...

Un simple script de ejemplo:


 #!/bin/bash

clear
echo "listar los directorios"
ls

echo "presione una tecla para salir"
read
clear

este script simplemente muestra los directorios y luego borra la plantalla.

Ahora, supongamos que lo llamamos "listar.sh" como correrlo?

Hay varias formas, la primera;

Como script:
$ bash ./listar.sh

Como ejecutable:
$ chmod +x listar.sh (le damos los derechos de ejecucion)
$ ./listar.sh

En general es preferible dar derechos de ejecucion para facilitar las cosas, pero podriamos decir que es a gusto del programador.


Linux, por que #! ?

Para los que esten empezando a programar en Linux puede parecerles raro el hecho de que en cada script se use en la primera linea

#!/bin/bash 

 Pero esta simple linea tiene una utilidad, aunque sea un comentario linux lee esta linea para saber que interprete usar. Asi entonces podemos obviar la extencion. 

Otro truco que podemos usar para facilitar la experiencia de programar es crear un directorio llamado /bin en nuestra carpeta de usuario y añadirlo al $PATH. Asi simplemente podremos correr nuestros scripts como si fueran un comando mas desde la consola

$ PATH=$PATH:/home/(username)/bin
$ export PATH

 $ mi_script  arg1 ... argN


 

Hello

Hola, hello or whatever!

Todavia no puedo decidir en que idioma publicar en este blog, tal vez en español sea una mejor idea. 

Bueno, hasta luego.