miércoles, 2 de mayo de 2012

Respuesta 1er reto en Prolog (eyoZ)


Que tal, como dije, en la anterior entrada del blog hoy publicare la respuesta al reto propuesto (ver): bien comencemos:

Parte 1:

Nuestro licenciado trato de generar Fbf, pero no lo consiguió del todo, aquí su trabajo:

1.- ¬invetigador(x) v otras_habilidades v constructor_futuro(x)
2a.- ingeniero(x) v investigador(x)
2b.- científico(x) v investigador(x)
3a.- ¬ing_informatica(x) ^ otras_habilidades(x)
3b.- ¬ing_informatica(x) ^ ingeniero(x)

Como podrás darte cuenta el problema que se le a encargado a esta persona esta erróneo, pero no en su totalidad, recuerda que cualquier Fbf tiene que estar ligada a través de “v” y negando el primer predicado:

¬pvq~p→q

Una vez dicho esto será más claro notar los errores que existen en su lógica, corrigiéndolos quedara así:

1.- ¬invetigador(x) v otras_habilidades v constructor_futuro(x)
2a.- ¬ingeniero(x) v investigador(x)
2b.- ¬científico(x) v investigador(x)
3a.- ¬ing_informatica(x) v otras_habilidades(x)
3b.- ¬ing_informatica(x) v ingeniero(x)

Parte 2:

Ahora se te pide que hagas un programa en Prolog, con las Fbf obtenidas (si no sabes que necesitas revisa esta entrada (ver)), quedando de esta forma:

 constructor_futuro(X):-
            investigador(X),
            otras_habilidades(X).

 investigador(X):-
            ingeniero(X).

 investigador(X):-
            cientifico(X).

 ingeniero(X):-
            ing_informatica(X).
           
 otras_habilidades(X):-
            ing_informatica(X).

  cientifico('extmail').
  ing_informatica('alberto').

Como habrás notado una vez que tienes la Fbf solo es separar el consecuente, para generar la regla, las (,) significan un AND, y los (;) un OR, las reglas se construyen por el siguiente símbolo (:-) el cual significa un IF, para entra mas a fondo a los operadores te recomiendo veas los que aquí escribo (ver).

Parte 3:

Realizando las consultas que se pidieron los valores retornados son:

1.- ing_informatica(alberto)
Yes, ya que al buscar Prolog encuentra que es un Hecho

2.- ing_informatica(extmail)
No, ya que la búsqueda que hace Prolog determina que el Hecho que menciona a extmail, no es contenido por ing_informatica(), si no por científico()

3.- investigador(eyoz)
No, ya que eyoz, no figura como argumento en ningún Hecho, o Regla

4.- constructor_futuro(alberto)
Yes, ya que al hacer la búsqueda Prolog se encuentra con un Hecho que menciona a alberto, y después entre Regla y Regla, descubriendo que las Reglas hacen referencia a otras

5.- constructor_futuro(x)
Esta regla traerá a todos los constructores_futuros(), a los que se hace referencia en la base de conocimiento de nuestro programa, pero solo traerá a alberto,
Si colocamos un (;), desechara a la variable encontrada e ira en busca de otra posible respuesta, como en la base del conocimiento no se encuentran mas personas que cubran esta cualidad retornara un valor no.

Bien eso es todo, nos leemos en la próxima…

Dudas, comentarios, ya sabes retoswm [at] gmail.com

sábado, 28 de abril de 2012

1er Reto en Prolog (eyoZ)


Que tal… bueno hoy publicare un reto de programación sobre la inteligencia artificial (con una semana de atraso), así que comencemos.  Revisa el anterior post (ver).

Para hacer este reto me base en una frase que encontré en un libro (C# - Lenguaje Y Aplicaciones. CEBALLOS,  Javier)  [y ciertas discusiones con ExTmail], dice más o menos así: “Los científicos descubren el mundo tal cual es, los ingenieros crean el mundo que nunca fue”.

Ahora comencemos:

Enunciado del problema: Se ha pedido a un Licenciado que encuentre las Fbf de algunas sentencias lógicas, pero no sabe si lo ha hecho bien, ¡ayúdale!

Sentencias lógicas:

            1.    x: investigador(x) ^ otras_habilidades(x) → constructor_futuro(x)
            2.    x: científico(x) v ingeniero(x) → investigador(x)
            3.    x: ing_informatica(x) → ingeniero(x) ^ otras_habilidades(x)
            4.    ing_informatica(alberto)
            5.    científico(extmail)

Y el las transformo a Fbf, dando como resultado:

1.- ¬invetigador(x) v otras_habilidades v constructor_futuro(x)
2a.- ingeniero(x) v investigador(x)
2b.- científico(x) v investigador(x)
3a.- ¬ing_informatica(x) ^ otras_habilidades(x)
3b.- ¬ing_informatica(x) ^ ingeniero(x)

Resuelve el reto:

1.- Intenta revisar la lógica de este licenciado, ¿tiene fallas? De ser así corrígelas.
2.- Crea un programa en Prolog con las Fbf obtenidas, y realiza las siguientes consultas:

1.- ing_informatica(alberto)
2.- ing_informatica(extmail)
3.- investigador(eyoz)
4.- constructor_futuro(alberto)
5.- constructor_futuro(x)

Menciona el valor retornado por Prolog, y describe brevemente por que devuelve ese valor.

3.- abre el debugguer y repite la consulta no. 5, menciona brevemente el trabajo que hace Prolog.

Bien eso es todo, ¡inténtalo!, la respuesta al reto será publicada el día miércoles (sin falta), no olvides mandar tu respuesta, duda, comentario, etc. A:

retoswm [at] gmail.com

NOTA IMPORTANTE:

El programa de arriba carece de cualquier tipo de objetividad, y da a relucir parte de mi humor retorcido, solo se utilizo como ejemplo para esta introducción a Prolog. 


viernes, 20 de abril de 2012

Presentando… Retos de Inteligencia Artificial y Prolog (Reglas)


Que tal, hace ya mucho tiempo que no se publica nada por estos lares, así que vengo a desempolvar el blog, esta vez traigo las reglas para los retos de programación de Inteligencia Artificial, el IDE a utilizar será Amzi! Prolog.

Empecemos: lo primero descargar el IDE (ver), y si quieres puedes revisar la documentación (ver), para que se te facilite la programación en Prolog, en si los programas a desarrollar (al menos los que tengo hasta el momento), no requieren grandes conocimientos, a lo mas los justos de sintaxis.

Lo segundo, se te dará una base de conocimiento o bien una lógica de predicados, la cual tendrás que transformar en hechos y reglas en Prolog, o bien ya tendrás un código funcional, al que solo le tendrás que agregar la visualización de los datos.

Sea lo que se te pida, se te dará un enunciado (como en veces anteriores), con todas las instrucciones a realizar.

Bien creo que eso es todo por ahora, nos leeremos más tarde, mañana publicare el 1er reto en Prolog.


jueves, 15 de marzo de 2012

Respuesta 2do Reto (eyoZ)

¡Que tal!, como les dije en la entrada anterior, hoy publicare la respuesta a mi 2do reto de programación (aunque un poco tarde), me da nostalgia que nadie mando la respuesta, (ni siquiera un intento ¡NADA!), primero analicemos las instrucciones:

1.- El programa pretende almacenar 5 mensajes decodificados y después mostrarlos, no intentes programar un fichero, por el momento este no es nuestro objetivo, en primera instancia el código tiene varios errores, pero compila. Arregla solo el error de almacenado, ya que lo hiciste, ¿crees que es mejor que m y n sean estáticos o dinámicos, pensando en optimización de código? (explica brevemente tu respuesta), se cual sea tu respuesta aplícala al código, y por ultimo agrega las sentencias de control que necesites.

Aquí el código (original):

#include"conio.h"
#include"stdio.h"   main()
  {
        char Matriz [5][15];
       
        printf("Inserta Mensaje 1: ");
        scanf("%s", &Matriz[1]);
       
        printf("Inserta Mensaje 2: ");
        scanf("%s", &Matriz[2]);
       
        printf("Inserta Mensaje 3: ");
        scanf("%s", &Matriz[3]);
       
        printf("Inserta Mensaje 4: ");
        scanf("%s", &Matriz[4]);
       
        printf("Inserta Mensaje 5: ");
        scanf("%s", &Matriz[5]);
             
        printf("\nMensaje 1: ");
        printf("\n%s", Matriz[0]);
        printf("\n%s", Matriz[1]);
        printf("\n%s", Matriz[2]);
        printf("\n%s", Matriz[3]);
        printf("\n%s", Matriz[4]);
               
        getch();
  } 

Ahora hay que arreglarlo, primero contestamos la pregunta: ¿crees que es mejor que m y n sean estáticos o dinámicos, pensando en optimización de código? tenemos dos respuestas.

1.- Como ya se sabe que el código pretende almacenar 5 mensajes, conviene que m se reserve en 5 su tamaño y para n igualmente conviene tener el arreglo estático (nos ahorraremos memoria al iniciar A[m][n]).

2.- Si pensaste de una vez adelantarte al paso 2 del ejercicio, estas en lo correcto, pero como el programa es bastante "especifico", puesto que se sabe que es la continuidad de un ejercicio propuesto por Ex tmail (ver), así que m podrías darle un valor dinámico, mientras que a n, un valor estático suponiendo un "colchón" para la entrada.

Respuesta de la primera parte:

#include<conio.h>
#include<stdio.h>

 main()
 {
           
       char Matriz [5][15];                       
            
       for (int i=1; i < 6; i++){
                         
            printf("\n    Mensaje %d: ", i);
            scanf("%s", &Matriz[i]);
        }           
           
        printf("\n\n  Los mensajes son: \n\n");
       
       for (i=1; i<6; i++){              
             printf("\n%s", Matriz[i]);                    
       }
       getch();
  }    

Respuesta de la segunda parte:

#include<stdio.h>

 main()
 {
           
       char Matriz [5][15];                       
            
       for (int i=1; i < 6; i++){
                         
            printf("\n    Mensaje %d: ", i);
            fflush(stdin);
            gets(m[i]);
        }           
           
        printf("\n\n  Los mensajes son: \n\n");
       
       for (i=1; i<6; i++){              
             puts(m[i]);
             fflush(stdin);                   
       }
 }     

Eliminamos la librería conio.h ya que getch(); es  considerado como un error de programación, y utilizamos gets y puts para el tratado de cadenas, y fflush que nos ayuda a limpiar el buffer.

En lo personal yo cree un tercer condigo el cual es mas "robusto", por que permite ciertas cosas, revísalo (este último solo es opcional):

#include<stdio.h>
#include<stdlib.h>

 #define n_mensaje 50

 main()
 {
           
       char m[n_mensaje][20];     
       int i=0;                          
       int mensaje=0;                    
       char regresa;
     
       do{
          
            do{
              
                system("cls");
                 
                printf("\n  Cuantos Mensajes tienes: ");
                scanf("%d", &mensaje);
        
            }while(mensaje < 1 || mensaje > n_mensaje);      
                   
            for (i=1; i < mensaje; i++){
                         
                printf("\n    Mensaje %d: ", i);
                fflush(stdin);
                gets(m[i]);                       
     
            }           
           
            printf("\n\n  Los mensajes son: \n\n");
           
            for (i=1; i<mensaje; i++)
            {              
                puts(m[i]);
                fflush(stdin);                     
            }
     
            printf("\n\n\tPresione:\n\n\t\t   Repetir \"R\": ");
            printf("  :\"Q\" Salir\b\b\b\b\b\b\b\b\b\b\b\b");
            regresa=_getche();
     
       }while(regresa == 'R' || regresa == 'r');
 }

Bien eso es todo por el momento, dudas, comentarios, etc. retoswm [at] gmail.com, esperen el próximo reto el día sábado.

    

sábado, 10 de marzo de 2012

2do Reto de Programación (eyoZ)

Buenas noches tengan todos Uds. En esta tarde noche de sábado, ahora con una nueva entrada para este blog, lanzo el segundo reto de programación. Dando seguimiento al problema que planteo, Extmail, en su reto anterior (ver), y aunque separado pero no revuelto, el siguiente código, pretende almacenar los mensajes que se obtuvieron después de su decodificación.

1.- El programa pretende almacenar 5 mensajes decodificados y después mostrarlos, no intentes programar un fichero, por el momento este no es nuestro objetivo, en primera instancia el código tiene varios errores, pero compila. Arregla solo el error de almacenado, ya que lo hiciste, ¿crees que es mejor que m y n sean estáticos o dinámicos, pensando en optimización de código? (explica brevemente tu respuesta), se cual sea tu respuesta aplícala al código, y por ultimo agrega las sentencias de control que necesites.

2.- ¿Aun se puede optimizar  el código? (de ser así, hazlo).

Aquí el código:

 #include"conio.h"
 #include"stdio.h"

  main()
  {
        char Matriz [5][15];
       
        printf("Inserta Mensaje 1: ");
        scanf("%s", &Matriz[1]);
       
        printf("Inserta Mensaje 2: ");
        scanf("%s", &Matriz[2]);
       
        printf("Inserta Mensaje 3: ");
        scanf("%s", &Matriz[3]);
       
        printf("Inserta Mensaje 4: ");
        scanf("%s", &Matriz[4]);
       
        printf("Inserta Mensaje 5: ");
        scanf("%s", &Matriz[5]);
             
        printf("\nMensaje 1: ");
        printf("\n%s", Matriz[0]);
        printf("\n%s", Matriz[1]);
        printf("\n%s", Matriz[2]);
        printf("\n%s", Matriz[3]);
        printf("\n%s", Matriz[4]);
               
        getch();
  }

Nota: Recuerda las instrucciones de mis retos (ver), date una idea con la respuesta del reto anterior (ver).

Nota 2: ¿Tienes la respuesta? ¡Que esperas mándala! retoswm [at] gmail.com. 

Como ya no hay más por agregar me piro, la respuesta será publicada el miércoles.

jueves, 8 de marzo de 2012

Respuesta 1er Reto eyoZ

Que tal, antes que nada una disculpa, sé que dije que publicaría el día de ayer la respuesta de mi primer reto, bien... Se los presento (por cierto nadie lo respondió bien completamente).

La primera parte, se pedía que sin agregar mas líneas al código se colocara una "pausa", en pocas palabras frenar la ejecución del programa para que se viera el resultado cuando se da doble clic sobre el .exe

Se le puede dar solución así:

#include<stdio.h>
#include<stdlib.h> o #include<conio.h>
//aunque getch(); es considerado como un error de programación
 main()
 {
       int a=-1, b=4, R=6141.3;
       R=a+b;
       printf("Suma: %d", R);
       R=a-b;
       printf("\nResta: %d", R);
       system("pause"); o getch();
 }

Se eliminan las líneas  a=(-a*a)/-a; y  b=((b)*(b))/(b*-a); ya que el proceso solo gasta memoria y procesador, ya que a=(-(-1)*-1)/-(-1)= -1, recordar la ley de los signos, la siguiente línea es lo mismo b=((4)*(4))/(4*-(-1))= 4, como dije en líneas anteriores, no hay que agregar mas líneas, así que eliminamos estas por una cabecera y la línea de pausa, también se puede hacer lo siguiente:

#include<stdio.h>
main()
 {
       int a=-1, b=4, R=6141.3;
       char cosa;
       R=a+b;
       printf("Suma: %d", R);
       R=a-b;
       printf("\nResta: %d", R);
       cosa=_getche();
 }

Ahora pasemos a la optimización de código:

#include<stdio.h>

 main()
 {
       int a=-1, b=4;
       printf("Suma: %d", a+b);
       printf("\nResta: %d", a-b);
       _geche(); o getchar();    
 }
 
 Eso es todo, como ven es fácil, pero tenemos que apegarnos a lo básico, pruebas de escritorio, análisis del código, y sobretodo, saber leer y entender las instrucciones.

Sin mas por el momento me despido, solo para recordarles que el viernes por la noche o el sábado publicare mi segundo reto.

"No todo en la vida son bits, aunque aparentemente sea así..."- Orell Owen.

sábado, 3 de marzo de 2012

1er Reto Extmail


Si quieres leer de nuevo mis instrucciones da click aka --> INSTRUCCIONES

Abstracción: 2
Complejidad: 1
Nivel gral: 2

Un individuo desea crear un dispositivo para decodificar y desencriptar una señal si envía una cadena de  8 bits 10010011 y recibe lo siguiente:


a) Indique ¿qué tipo de codificación es? (UNIPOLAR,RZ,NRZ-I, NRZL, MANCHESTER,MANCHESTER DIFER)

b) Diseñe el programa  que  se requiere para decodificar ese tipo de señal (en c++) tomando como base las siguientes variables (puede agregar las que requiera):UP;DOWN;ADVANCE

c) Una vez que el individuo realizo la decodificación descubre una palabra clave de encriptación llamada PATO y al probar con las siguientes cadenas obtiene lo siguiente:

P=00 ;A=01; T=10; 0=11
01100110011001   ATATATA
01101100100101   ATOPTAA  

Programe el algoritmo que el individuo necesita (en el lenguaje deseado) y desencripte las siguientes cadenas:

011010010110010011001100011010101000
010010100101000100100100010001000100

Información Extmail

Después de haber leído las instrucciones y condiciones de eyoz07 VER AKI para la resolución de los retos, creo que es momento de que ponga información acerca de los míos:

Mis retos normalmente estarán en forma de acertijo problema, es decir, entregare un enunciado de un problema en particular creado por mi, deben ser muy observadores ya que habrá cosas que no mencione literalmente, pero se puede abstraer la pista del acertijo, en el mejor de los casos, cuando no sean problemas los que publique, les daré la solución de dichos problemas en donde deben encontrar el algoritmo o problema que nos da como resultado eso, cualquiera de los dos.

Trato de ser lo mas claro posible, pero el punto fuerte en WARMINDS es pensar y que mejor con acertijos o pruebas de razonamiento y programación. Tengo que aclarar que no solamente mostrare problemas de "cierta empresa necesita el balance de ....", no nada de eso aunque lo divertido aquí sera que serán interdisciplinarnos.

Daré una semana para resolver el acertijo problema y después a ello se colocara la solución a cada uno como comentario correspondiente, la solución la pueden enviar a  geek.mail329 [at] gmail.com

Si algo tiene solución, ¿para qué te vas a preocupar?; y si algo no tiene solución, ¿para qué te vas a preocupar?


1er Reto de Programacion

Buenas tardes, como lo prometí, les traigo el primer reto de programación.



Parte I: El código es básico (esta escrito en C), se trata de una suma y una resta, el propósito del programa no es tener data.in, solo data.out, tendrás que modificar el código para que tenga una "pausa" para poder ver el resultado cuando se ejecuta el .exe, sin agregar mas líneas a él. 

Parte II: Optimiza el código de tal forma que la ejecución no sobrepase los .01s y tengas el menor uso de memoria.

NOTA: Recuerda la entrada anterior de este blog para tener una mejor idea de lo que se espera, si es que no te quedo claro lo que se te pidió.

NOTA 2: Puedes utilizar cualquier SO, Compilador, o IDE.

NOTA 3: Los Resultados puedes enviarlos a: retoswm [at] gmail.com

CODE:
 #include<stdio.h>

 main()
 {
       int a=-1, b=4, R=6141.3;
       a=(-a*a)/-a;
       R=a+b;
       printf("Suma: %d", R);
       b=((b)*(b))/(b*-a);
       R=a-b;
       printf("\nResta: %d", R);     
 }



El miércoles se publicaran los resultados y más comentarios. Sin más que agregar nos vemos...