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