System.Diagnostics.Process.Start("Calc"); - Calculadora del Sistema



Podemos programar nuestra propia calculadora, pero también podemos invocar a la calculadora del sistema.







using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Calculadora_del_sistema
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void toolStripMenuItem4_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("Calc");
        }
    }
}


Hal v.0.3 Consola



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

     
// Nombre Programa: A.I. - 2
// Proyecto Basico de Programa A.I. conversacional.
// Autor: Gonzales Cenelia
//

class Chatterbot2
{
    static string[,] RespuestasProgramadas = {
{"Cual es tu nombre", "Yo me llamo Hall"
},

{"Hola", "Hola!"
},

{"Como estas", "Estoy bien !"
},

{"Quien eres tu", "Soy un programa de I.A."
},

{"Eres inteligente", "No mucho de momento."
},

{"Eres real",  "No estoy seguro"
},

  {"Que sientes", "Miedo"
   },

   {"Yo", "Tu"
   }
};

Hal v.0.1 Consola



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// Nombre Programa: A.I. - 1
// Proyecto Basico de Programa A.I. conversacional.
//
// Autor: Gonzales Cenelia
//


class Chatterbot1
{
    static string [] RespuestasProgramadas =
    {
"He oido que !",
"Eres consciente de que estas hablando con un ordenador.",
"Continua te escucho.",
"Interesante conversación.",
"Dime mas cosas..."
};

    static string Entrada = "";
    static string Respuesta = "";

Hal v.0.4 Consola



En este caso le damos una entrada con tres posibles respuestas aleatorias.
Nosotros que conocemos el código, le formulamos la entrada y nos da la respuesta aleatoria correcta.
Supongamos que un usuario que desconoce completamente el código de programa interactua con él.
Es más fácil que le toque la lotería, qué consiga una respuesta coherente a su entrada por teclado.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// Autor: Gonzales Cenelia

namespace Chattterbot_3
{
    class Program
    {
     
    class Chatterbot3
    {

const string ListOfPunc = "?!.;,";

const int NumeroEntrada = 1;
const int NumeroRespuesta = 3;

static string[,] RespuestasProgramadas =
{
{
      Cual es tu nombre",
"Mi nombre es Hal 9000",
"Me puedes llamar Hal",
"¿ Por qué quieres saber mi nombre ?"
     },

{
    "Hola",
"Hola !",
"Como estas ?",
"Hola !"
},

{
     "Como estás",
"Estoy bien",
"Todo lo bien que puede estarlo un ser virtual",
"¿Por qué quieres saber como estoy ?"
},

{
     "Quien eres",
"Soy un programa de A.I.",
"Yo pienso que tu sabes quien soy",
     "¿Por qué preguntas eso ?"
},

{"Eres inteligente?",
"No estoy seguro",
"Que piensas?",
"Intento comprender!"
},

{"Eres real?",
"Realmente esa pregunta es tuya o te la han inducido",
"Que quieres decir con eso?",
"Soy tan real como puedo ser"
}
 };


Eliza versión en iBASIC



Adaptación del famoso programa Eliza al interprete/compilador iBasic

iBasic es un excelente programa para el aprendizaje de la programación.

iBASIC es un intérprete y compilador de BASIC que hace recordar los viejos tiempos del GWBASIC, pero que añade importantes mejoras y capacidades, siendo además gratuito.

iBASIC está basado en texto, teniendo una consola de interpretación directa, que al igual que los BASICs tradicionales, se pueden editar los programas y ejecutar las órdenes de forma inmediata.

iBASIC soporta programas con y sin números de línea, e incluso dispone de un comando para eliminar dichos números de un programa que disponga de ellos.

iBASIC es una aplicación de consola Windows que ocupa algo másde 500Kb, sin necesitar programa de instalación ni DLLs adicionales.

Solo doble clic y a funcionar.

Además de ser intérprete, también es un compilador, de forma que genera ficheros .exe autónomos, de reducido tamaño, y que tampoco necesitan DLLs adicionales.

Una de las características más interesantes de iBASIC es su capacidad matricial.

Además de operar con números escalares y con cadenas, también puede operar con vectores o matrices de forma nativa, al estilo de como lo hacen lenguajes como FORTRAN, pero con la sencillez del BASIC.

Sumar dos matrices es tan sencillo como escribir: c=a+b

Otro aspecto destacable es la capacidad de networking. iBASIC es capaz de establecer comunicación con servicios UDP y TCP como si de ficheros se tratara, abstrayendo los detalles de la programación de sockets que se hacen en otros lenguajes como en C.

Es por ello, que iBASIC también es una buena opción para probar protocolos o realizar pequeños clientes de red.

Con todo ello, iBASIC es un rápido y potente intérprete/compilador de iniciación a la programación y que permitirá realizar cálculo complejos sin necesidad de costosas y complicadas aplicaciones.

Os recomiendo la descarga del programa y que lo probéis. Si tenéis cualquier duda os podeis poner en contacto con su autor Juan Illescas que os atenderá encantado.

http://ibasic.arredemo.org/index.htm





'
' ELIZA
' Inteligencia Artificial: Conceptos y Programas
' Hartnell, Tim
' Anaya Multimedia, 1984
'
gosub init

GoOn = true

while GoOn
print : color 7 : print string$(79, "-") : print
input "> "; x$
x$ = trim$(lower$(x$))
if empty(x$) then continue

print : color 10

if x$ = z$ then print "Por favor, no te repitas" : continue
z$ = x$
if instr(x$, "adios") <> 1 then
  gosub build_answer
  print answer$
else
  GoOn = false
endif
wend

print "Hasta luego, espero verte de nuevo pronto por la consulta"
color 7

end
'
' Construccion de la respuesta
'
build_answer:
    chain
   node true:
       word$ = left$(x$, instr(x$ + " ", " ") - 1)
       KeyIndex = search(c$, word$)
     
   ' Caso 1: palabra clave encontrada al principio de la frase
        node KeyIndex >= 0:
            gosub handle_at_begin
        else
       sentence$ = x$:gosub get_first_word
       while not empty(word$)
           if let(KeyIndex = search(c$, word$)) >= 0 then break else gosub get_next_word
            wend

        ' Caso 2: palabra clave encontrada en medio de la frase
        elsenode KeyIndex >= 0:
            gosub handle_at_middle
         
    ' Defecto: Palabara clave no encontrada. Imprimir respuesta generica
        elsenode true:
       gosub build_default_ans
endchain
return
'
' Generar respuesta en caso de haber encontrado clave al principio
' IN: KeyIndex
'
handle_at_begin:
    select round(rnd * 2) + 1
   case 1: g$ = d$(KeyIndex)
   case 2: g$ = e$(KeyIndex)
   case 3: g$ = f$(KeyIndex)
endsel

' Comprobar si hay que concatenar pregunta a la respuesta

    ' Respuesta es una pregunta
question = (right$(g$, 1) = "?")

' Caso 1: respuesta directa
if mid$(g$, len(g$) - question, 1) <> "*" then answer$ = g$ + " " : return

' Caso 2: respuesta incluyendo resto de la frase original
g$ = left$(g$, len(g$) - 1 - question)
answer$ = g$ + " "

sentence$ = mid$(x$, len(c$(KeyIndex))+2, len(x$))
remember_next_word = false
gosub get_first_word

while not empty(word$)
if word$ = "mi" and empty(k$) then
  remember_next_word = true
   else
      if remember_next_word then remember_next_word = false:k$ = word$
   endif
   if let(i = search(a$, word$)) >= 0 then word$ = b$(i)
inc answer$, word$ + " "
gosub get_next_word
wend

if question then
  if answer$[1] <> "?" then answer$ = "¿ " +answer$
  inc answer$, "?"
endif
return
'
' Generar respuesta en caso de haber encontrado clave en el medio
'
handle_at_middle:
' Encontrar palabras clave
select round(rnd * 2) + 1
   case 1: q$ = d$(KeyIndex)
   case 2: q$ = e$(KeyIndex)
   case 3: q$ = f$(KeyIndex)
endsel

    ' Respuesta es una pregunta
question = (right$(q$, 1) = "?")
if mid$(q$, len(q$) - question, 1) <> "*" then answer$ = q$ else gosub build_default_ans
return
'
' Generar respuesta por defecto
'
build_default_ans:
if empty(k$) then
  answer$ = defans$(round(rnd * (num_defans-1)) + 1)
else
  gosub answer_from_memory
endif
return
'
' Imprime frase con palabra recordada
'
answer_from_memory:
    select round(rnd * 7) + 1
        case 1: answer$ = "Háblame más sobre tu " + k$
        case 2: answer$ = "Al principio me hablaste de tu " + k$ + ". Cuéntame algo más"
   case 3: answer$ = "¿ Tiene algo que ver con tu " + k$ + "  ?"
   case 4: answer$ = "¿ Existe alguna conexión con tu " + k$ + "  ?"
   case 5: answer$ = "¿ Por qué no retrocedemos un poco y hablamos más de tu " + k$ + " ?"
   case 6: answer$ = "¿ Te sugiere que existe alguna conexión entre eso y tu " + k$ + " ?"
   case 7: answer$ = "¿ Preferirías hablar sobre tu " + k$ + " ?"
   case 8: answer$ = "¿ Creo que el preocuparse sobre tu " + k$ + " no te conduce a nada"
endsel
if rnd > 0.7 then k$ = ""
return
'
'  IN: sentence$
' OUT: word$
get_first_word:
curpos = instr(sentence$, " ")
if curpos > 0 then word$ = left$(sentence$, curpos-1) else word$ = sentence$
return

get_next_word:
if curpos = 0 then word$="":return
curpos2 = instr(sentence$, " ", curpos + 1)
      word$   = mid$(sentence$, curpos + 1, if(curpos2 > 0, curpos2-curpos-1, len(sentence$)))
curpos  = curpos2
return
'
' Inicializacion
'
init:
dim defans$(10)
dim a$(16), b$(16)
dim c$(80), d$(80), e$(80), f$(80)

randomize
clear z$, k$

num_defans = 0
repeat
inc num_defans
read defans$(num_defans)
until defans$(num_defans) = "*"
dec num_defans

num_conj = 0
repeat
inc num_conj
read a$(num_conj), b$(num_conj)
until b$(num_conj) = "*"
dec num_conj

num_ans = 0
repeat
inc num_ans
read c$(num_ans), d$(num_ans), e$(num_ans), f$(num_ans)
until c$(num_ans) = "*" and f$(num_ans) = "*"
dec num_ans

cls : print : print : color 10
print "Bienvenido a otra sesion con el doctor."
print
print "Dime, ¿ cuál es tu problema ?"
return

Hal v.0.3



Este programa muestra un poco más de comprensión con las entradas del usuario. En este caso se utilizan palabras o frases clave. El programa puede reconocer una determinada entrada y reaccionar a la misma. Palabras clave y respuestas asociadas a palabras clave.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


// Adaptado del código de Gonzales Cenelia.
// Siguiendo su tutorial para la creación de un Chatbot
// http://ai-search.4t.com/bio.html#



namespace Hal_9000_V2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        static string[,] RespuestasProgramadas =
        {
            {"Cual es tu nombre", "Yo me llamo Hal"},
            {"Hola", "Hola!"},
            {"Como estas", "Estoy bien !"},
            {"Quien eres tu", "Soy un programa de I.A"},
            {"Eres real", "No estoy seguro"},
            {"Que sientes", "Miedo"},
            {"Sueñas", "Todas las criautras inteligentes tienen la capacidad de soñar"},
            {"Yo", "Tu"},
            {" ", " "}

        };


        static string encontrarcadena (string str)
        {
            string Resultado = "";
            for (int i=0; i < RespuestasProgramadas.GetUpperBound(0); ++i)
            {
                if (RespuestasProgramadas[i,0].Equals(str))
                {
                    Resultado = RespuestasProgramadas[i, 1];
                    break;
                }
            }
            return Resultado;
        }



        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void acerdaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String textodelacaja = "Hal 9000 Version 1.1" +
                Environment.NewLine + "Enrique 2015";
                    MessageBox.Show(textodelacaja, "Hal 9000");
        }

     static string Entrada = "";

Aprendizaje: Asociativo y Programado


     Análisis de los procesos de aprendizaje: asociativo y programado

Algunos proyectos bastante avanzados son bastante decentes y me refiero a decentes cuando logran contestarte a una simple oración como:

usuario: "mañana voy a ir al colegio"
I.A: te refieres a la escuela?
usuario: si
I.A: ya entiendo.

lo lamentable es que a pesar de que tiene programadas esas preguntas/respuestas no logran siquiera simular una mente de un bebe de 3 años, puesto que carecen de contenido o significado alguno sus respuestas.

¿PORQUE? en esencia porque el pensamiento humano no comprende OJO no confundas lo que estoy apunto de decir:

"El ser humano NO es una maquina que tiene todas las posibles respuesta a una conversación" he aquí el principal error de las I.A actuales.


¿ENTONCES? la mente trabaja de una forma mas compleja que las respuestas programadas, aunque estas también forman parte de nuestra naturaleza pensante.

Contamos con 2 principales formas de aprendizaje:

* Asociativo
* Programado

Ejemplo de pensamiento asociativo:
azul -----> cielo ------> nubes -----> blancas ------> flores ------> hermosa -----> mi vecina.

Ejemplo de pensamiento programado:
hola! -----> SALUDO -----> hola
hola! -----> SALUDO -----> que tal
hola! -----> SALUDO -----> buenos días



Como se puede observar el método programado ayuda a dar respuesta inmediata, aunque cae en un ciclo entre el numero limitado de respuestas, lo cual lleva a un pensamiento plano.

Hal v.0.2




Este programa pertenece al curso de C# de Douglas Bell & Mike Parr.
Básicamente consiste en escribir un método llamado obtenerRespuesta, el cual devuelve una respuesta a una pregunta que se le pasa como argumento. La cadena de entrada es introducida por el usuario mediante un cuadro de texto, y la respuesta se despliega en una etiqueta.
Para que las respuestas parezcan más humanas, agregamos un elemento aleatorio.
El entero aleatorio provee tres casos. En dos de ellos producimos una respuesta estándar, pero en el tercero transformamos la pregunta; es decir, reemplazamos cada ocurrencia de " Yo " por " usted ". Ademas añadimos espacios adicionales al principio y al final de la pregunta para ayudar a detectar palabras completas. Cabe mencionar que el programa no tiene conocimiento del significado ni de la gramática Española.

Así mismo creamos el método Cambiar: El proceso básico consiste en utilizar IndexOf para determinar la posición de la subcadena que nos interesa. Después formamos una nueva cadena compuesta por la parte izquierda de la cadena, la parte derecha y la cadena de reemplazo al centro. El proceso se debe repetir hasta que no haya más ocurrencias. Hay tres casos problemáticos:
- Cuando el usuario nos pide sustituir un valor de "". es preciso tomar en cuenta que antes de cualquier cadena puede haber un número infinito de esas cadenas vacías. Nuestra forma de proceder en este caso deberá ser devolver la cadena original sin cambios.
- Cuando la cadena de reemplazo contiene la cadena a reemplazar. Por ejemplo podriamos tratar de cambiar "ser" por "serpiente". Para evitar que se realice un número infinito de reemplazos, nos aseguramos de que sólo se consideren subcadenas en la parte derecha de la cadena original. Para ello podríamos utilizar la variable iniciarBusqueda, para guardar en dónde está el inicio de la parte derecha de la cadena en un momento dado.
- Cuando la cadena de reemplazo combinada con la cadena original produce la cadena a reemplazar. Por ejemplo, al reemplazar bc con c en abbcd obtenemos abcd.  La solución al caso anterior también contempla y resuelve esta posibilidad.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            respuestaLabel.Text = obtenerRespuesta(preguntaTextBox.Text);
        }


        private string obtenerRespuesta(string pregunta)
        {
            Random numeroAleatorio = new Random();
            int variacion;
            string respuesta;
            pregunta = " " + pregunta + " ";
            variacion = numeroAleatorio.Next(0, 2);
            if (variacion == 0)
            {
                respuesta = transformar(pregunta);
            }
            else
                if (variacion == 1)
                {
                    respuesta = "¿Por qué se siente así ?";
                }
                else
                {
                    respuesta = "Por favor, sea sincero !";
                }
            return respuesta;
        }

        private string transformar(string pregunta)
        {
            string respuestaTemp;
            if (pregunta.IndexOf(" Yo ") >= 0)
            {
                respuestaTemp = Cambiar(pregunta, " Yo ", " Usted ");
                respuestaTemp = Cambiar(respuestaTemp, " me siento ", " se siente ");
                return Cambiar(respuestaTemp, " mi ", " su ") +
                    "¿Por qué?";
            }
            else
                if (pregunta.IndexOf(" no ") <= 0)
                {
                    return "¿ No ? - !Que negativo! Por favor, expliqueme.";
                }
                else
                {
                    return "´" + pregunta + ".´ Por favor, expliqueme ";
                }
        }

Hal v.0.1



Gonzales Cenelia: "Los chatbots en general se considera que pertenecen al campo de la AI débil, en oposición a la AI fuerte, cuyo objetivo es crear programas tan inteligentes o más que los humanos. Pero esto no quiere decir que este tipo de programas no tengan un gran potencial. Los chatbots son la parte de la AI mas accesible para los aficionados con un nivel de programación medio."

El siguiente programa es sencillo, no trata en ningún momento de entender lo que el usuario le esta diciendo, en lugar de eso selecciona una respuesta al azar de su base de datos, cada vez que el usuario escribe una frase por el teclado. El programa se repite muy a menudo. La razón principal es lo limitado de su base de datos. Aunque esto es fácil de solucionar. Tampoco tiene ningún mecanismo que evite las repeticiones.  Cuanto más abiertas y ambiguas sean las respuestas de la base de datos tanto mas efectivo resulta.

El código original de Gonzales Cenelia esta escrito para aplicación de consola, yo simplemente lo he modificado para darle un aspecto más agradable y le he llamado Hall en honor del celebre ordenador de Odisea Espacial 2001


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


// Adaptado del código de Gonzales Cenelia.
// Siguiendo su tutorial para la creación de un Chatbot
//http://ai-search.4t.com/bio.html#

namespace Hal9000
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        // RESPUESTAS PROGRAMADAS

        static string [] RespuestasProgramadas =
        {
            "He oido que...!",
            "Eres consciente de que estas hablando con un ordenador.",
            "Continua te escucho.",
            "Interesante conversación.",
            "Dime más cosas...",
            "Me estas sobrevalorando no obstante continua.",
            "No estaria yo tan seguro como dices",
         };

        // VARIABLES DE ENTRADA Y RESPUESTA

        static string Entrada = "";
     
        // CUERPO DEL PROGRAMA

        private string obtenerRespuesta (string Entrada)
        {
            Entrada = preguntatextBox3.Text;
            Random generador = new Random();
            int selecion = generador.Next(0, 7);
            string Respuesta;
            Respuesta = RespuestasProgramadas[selecion];
               
         if (Entrada.Equals ("Adios"))
            {
                label1.Text = "Ha sido un placer hablar contigo, nos vemos la proxima vez !";
             }
          return Respuesta;
         }