Showing posts with label turbo prolog. Show all posts
Showing posts with label turbo prolog. Show all posts

Monday, June 11, 2018

Para revivir a Delphi


Borland fue una empresa de software que en su momento sus políticas revolucionaron el cómputo y la programación. Su compilador original, Turbo Pascal, fue un éxito instantáneo al venderlo en 50 dólares. El sistema venía en un diskette y traía compilador y editor (¡en sólo 12K bytes!) y un buen número de ejemplos. Fue el estándar del lenguaje Pascal por muchos años. Microsoft incluso decidió dejar de vender su propio compilador de Pascal porque simplemente no podían competir.

Con el tiempo y el éxito de este compilador, empezaron a salir una serie de bibliotecas de desarrollo: Turbo Editor ToolBox, Graphix ToolBox, Turbo Lightning, entre otros, Turbo Pascal se convirtió en una estupenda herramienta. Borland entonces sacó su versión 4, 5, 5.5, 6 y 7, la cual ya era mucho más pulida que la original, pero conservaba la filosofía de compilar a toda velocidad, haciendo que el programar fuese mucho más fácil y atractivo para los desarrolladores.

Entonces Borland inició la aventura de crear los "turbo lenguajes", y sacó Turbo C, Turbo Basic e incluso Turbo Prolog. Hay que señalar que al menos los dos últimos de esos lenguajes fue creación de Borland, sino que se encargaron a diferentes empresas. Y con ello probablemente la empresa creció y se hizo de muchos más adeptos. Borland incluso sacó a la venta el Turbo Prolog Toolbox, que contenía muchísimas herramientas para los que programábamos en turbo Prolog, una versión no muy estándar de Prolog, pero sí mucho más atractiva incluso para ciertas aplicaciones del mundo real.

Pero algo pasó. Tal vez la moda terminó. Quizás muchos programadores, particularmente de Turbo Basic y Turbo Prolog, migraron -los primeros- a Visual Basic, Los números deben haber dado con la decisión de regresar a sus fabricantes originales Turbo Prolog y Turbo Basic. Por ejemplo, El compilador de Turbo Basic fue creado por Bob Zale, a quien Borland compró los derechos. Cuando Borland decidió abandonar la línea de Turbo BASIC, Zale compró nuevamente los derechos para continuarlo mejorando y comercializarlo bajo el nombre de PowerBASIC a partir de 1989.

De Turbo Prolog podemos decir que PDC Prolog / Visual Prolog fue quien creó este sistema, pero la licencia del programa fue vendida por Borland a la división de la empresa que se había encargado de su desarrollo, la cual había creado en 1984 la compañía PDC (Prolog Development Center) y se hizo cargo del producto; pasó a comercializarlo con el nombre de PDC Prolog (para primero para los sistemas operativos MS-DOS y OS/2, y posteriormente para Windows 3.1) y en 1996 renombró el software a Visual Prolog, actualizando y manteniendo el producto en el mercado hasta la actualidad. A partir de la versión 6.0 (lanzada en 2002) el lenguaje era completamente orientado a objetos.

Sin embargo, Borland parecía haberse establecido como una empresa de software exitosa. En algún momento compró DBase y de pronto, por alguna razón, separaron sus sistemas de bases de datos, Dbase e Interbase, con los de desarrollo, Turbo C y Turbo Pascal. Para ese entonces (1995), Borland ya estaba anunciando Delphi 1.0, que fue la primera herramienta RAD que pensaba competir no contra Visual Basic, que se consideraba en muchos sentidos solamente para hacer prototipos, sino contra Power Builder, que de acuerdo al CEO de Borland, Phillipe Kahn, era a quien había que desbancar.

Delphi se fue desarrollando a toda velocidad y la acogida de los programadores fue estupenda. En los siguientes años los programadores tuvieron un número enorme de bibliotecas, rutinas, documentación, etcétera, tanto en las páginas web como por parte de Borland. La empresa entonces sacó, año con año, nuevas versiones del compilador de Delphi y de C++ Builder y todo parecía ir sobre ruedas.

Pero de nuevo, algo pasó y de pronto Borland se vendió. He aquí un resumen de estos eventos:
  • En 1991, Borland adquirió la compañía Ashton-Tate, de la que siguió comercializando sus productos estrella, dBase e Interbase.
  • Hacia 1993-94 hubo acuerdos con WordPerfect de cara a la cooperación en ofimática, comercializándose conjuntamente sus productos.
  • Tras la compra de Visigenic (empresa especializada en CORBA y creadora de VisiBroker) en 1997, cambió su nombre a Inprise.
  • En 1999 Microsoft hace una inversión en la compañía, 2 meses después de haber ocasionado la salida de los principales directivos de Inprise.
  • En 2000 hubo un intento fallido de fusión con Corel.
  • En 2001, Inprise retomó su afamado nombre, denominándose desde entonces Borland Software Corporation.
  • El 14 de noviembre de 2006 el departamento de IDEs y compiladores (Borland Developer Tools Group) se separó de Borland formando una nueva filial (cuyo único accionista era Borland), llamada CodeGear. La casa matriz, Borland Software Corporation, se centrará en herramientas de análisis, diseño y "gestión del ciclo de vida de la aplicación" (Application Lifecycle Management, ALM).
  • En mayo de 2008 Borland Software Corporation llegó a un acuerdo para la venta de CodeGear a Embarcadero Technologies por 23 millones de dólares.
  • En mayo de 2009, el desarrollador de software Micro Focus compra Borland Software Corporation por 75 millones de dólares.
Hoy Embarcadero es quien comercializa los productos de lo que fuera Borland. y los programadores siguen trabajando intensamente sobre sus compiladores, haciendo que estos puedan compilar para Android, iOS y Mac, inclusive. pero esto conlleva un gran costo y las herramientas de Embarcadero son muy costosas para la mayoría de los programadores y más si vivimos en países donde las devaluaciones están siempre al acecho. Pero incluso, para los estadounidenses, Embarcadero no vende software barato y por ello quizás, además de que hay muchos sistemas con versiones gratuitas (como Visual Studio para la comunidad), Delphi no C++ Builder han podido llegar a ser lo que fueron en su mejor tiempo. Y es una pena, porque son herramientas estupendas. De hecho, Embarcadero ahora está pensando en versiones de sus productos para Linux por lo que, podemos decir, siguen trabajando fuertemente y con la pasión de siempre.

¿Cómo poder recuperar el lustre del pasado? ¿Cómo hacer que los programadores puedan regresar a las nuevas versiones de Delphi y C++ Builder? No es sencillo, pro probablemente una buena alternativa es bajar los precios y hacer sus productos muchos más accesibles. La pregunta de ¿qué es más fácil, vender mil de a peso o 1 de a mil? resuelve esto. Probablemente sea difícil vender un producto de a 1000, pero vender mil de a peso quizás no sea tan sencillo. Tal vez puedan venderse unos 800 u 850. ¿No sería mejor política?

Como en todo, el precio es fundamental en la decisión de lo que decidimos adquirir. Si Embarcadero fuese menos costoso para quienes usan herramientas de desarrollo, las comunidades de programadores crecerán (como lo hicieron en el pasado) y por ende, todo mejorará para esta herramientas. En el fondo, el problema quizás es hacer gráficas en donde se vea cuánta gente compra herramientas de desarrollo, a qué precio, y en dónde se maximizan las ganancias con respecto a la cantidad de usuarios y no al total de lo vendido.

Y si hago toda esta reflexión es porque me parece que Delphi y C++ Builder merecerían regresar al gusto de los programadores. Las herramientas han madurado y ahora hacen muchas cosas que antes era complicado. Pero los mejores sistemas de programación no sólo depende de los compiladores y del desarrollo de los creadores de los mismos, sino del volumen de clientes que pueden tener. Ahí lo dejo a las reflexión mientras me voy silenciosamente.

Monday, January 09, 2012

Concurso para programadores reales


Se supone que los programadores reales, los de verdad, son tan capaces que casi casi no necesitan herramientas de software para sus labores. Esto por supuesto es una exageración que se ha llevado ya al extremo del folklore urbano (*) en esta rama de la ciencia.

Pues bien, Facebook lanzó la segunda versión de su concurso "hacker-cup", para aquellos interesados en pasar a la historia como uno de los mejores programadores del planeta. El concurso está abierto a todo aquel que quiera participar, en cualquier parte del mundo y hasta donde he entendido no hay ninguna restricción sobre qué lenguaje de programación usar.

La justa se hará en sucesivas fechas, en las cuales se irá obteniendo a los ganadores. Por ejemplo, en la primera etapa se plantean tres problemas., Si se resuelve al menos uno, se pasa a la siguiente prueba. ¿Qué tipo de pruebas se exigen en el concurso? No lo sé, pero he aquí un ejemplo del año pasado: se trata de hallar dos números enteros, del 1 al cien, que pongan todas las posibles combinaciones de estos números en la forma A^2 + B^2.

Por ejemplo, 25 puede ponerse como 3^2 + 4^2 o bien, 0^2 + 5^2.

No pienso entrar en el concurso, porque francamente no tengo tiempo y seguro hay programadores mil veces más clavados que yo. Sin embargo, este pequeño problema, se me ocurre, se puede resolver fácilmente en Prolog. He aquí mi código, el cual probaré a la brevedad:

predicates
   suma (integer,integer,integer)
   num(integer)
   prueba

clauses
    suma(R, A, B) :- R = (A^2) + (B^2).
    num(0).
    num(1).
    num(2).
    num(3).
        .
        .
        .
    num(99).
    num(100).

    prueba :-
      num(A),
      num(B),
      R = A,         
      suma(R,A,B),
      write("Los valores de los números son ", A, " y  ", B), nl,
      fail.

 goal
    prueba.         


Ahora que pruebe mi código pondré las reflexiones del caso.
_____
(*) El término "programador real" describe a esos programadores "duros" que prácticamente reniegan de todas las herramientas y lenguajes modernos para hacerlo todo desde una manera más directa y efectiva, muchas veces relacionada con el hardware. El arquetipo de los programadores reales es sin duda Mel Kaye, de la McBee Computer Corporation, quien está inmortalizado en "La Historia de Mel", en la cual se dice que "escribió en código de máquina, sin adornos, todo su código en el inescrutable código hexadecimal. Directamente".

Sunday, November 20, 2011

Inteligencia artificial y sistemas expertos


La inteligencia artificial, término que acuñó John McCarthy me parece, se basa en la idea de hacer sistemas inteligentes, tan capaces como los que puede lograr el cerebro humano. Sin embargo, se halló, después de los primeros años frustrantes, que la inteligencia humano no sólo era complicada, sino mucho más complicada de lo que habíamos pensado. Por ello, hubo una división natural de tareas: visión por computadora; sistemas expertos; reconocimiento de patrones; entre otros.



Uno de los temas que por algunos años estuvieron en boga, pero que probablemente han caído en el desuso es el de los sistemas expertos, el cual se basa en escribir software que fuese tan bueno como un experto humano en un tema particular. En ese sentido por ejemplo, un programa de ajedrez como los actuales, que le ganan al 99.99% de los jugadores humanos,  es un sistema experto muy exitoso, pero las técnicas de programación para jugar tan bien están lejos de la teoría tradicional de los sistemas expertos. En este caso las cosas son así. Un sistema experto se basa en tres subtemas:

  • Interfaz con el usuario
  • Base de conocimientos (reglas de producción)
  • Motor de inferencias

En ese sentido, cuando se va a trabajar con un sistema experto hay que reconocer cómo se diseñará cada parte. En el caso de la interfaz del usuario, aunque hay muchas alternativas, la más común es responder "sí" o "no" a las preguntas que hace el sistema. esto -desde luego- no es tan poderoso como aquellos sistemas que además de responder a preguntas con "sí" o "no", también puedes darle un valor de confiabilidad a la respuesta. Por ejemplo,

Pregunta: "¿Te duele la cabeza"
Respuesta: "sí"
Pregunta: Del 1 al 10, ¿cuánto te duele? (donde 10 es el dolor más fuerte)

este tipo de sistemas usan probabilidad para decidir el margen de confiabilidad de las respuestas que entrega el sistema experto, basado en las confiabilidades que se dieron en las diferentes respuestas por parte del usuario. Para ello se usa el teorema de Bayes Sin embargo, para poner las cosas de la manera más simple, muchos sistemas expertos solamente permiten responder "sí" o "no".

Pues bien, una vez hecho esto, tenemos que describir la base de conocimientos, la cual es la que nos dará información sobre el tema que nos ocupa. Por ejemplo, en el programa muestra que te mando, la base de conocimientos es la información sobre los diferentes perros que existen. Así, un snauzer será un perro pequeño, con cola y orejas cortas, de buen talante, etc. En esta base se definen algunos perros y sus características. La idea del sistema experto es que el programa vaya pidiéndole información al usuario para que éste pueda concluir de qué perro se trata. Las bases de conocimiento están puestas en general como predicados "causa - efecto". Así, una regla en general podría ser: "si te duele la cabeza es que tienes gripe". La causa: el tener gripe; el efecto: el dolor de cabeza.

El motor de inferencias es quien pregunta al usuario basándose en esas cláusulas causa - efecto. Los sistemas expertos usan tres posibles motores de inferencia:

  • encadenamiento hacia atrás (backward chaining)
  • encadenamiento hacia adelante (forward chaining)
  • sistema de borrador (blackboard system)

El primer caso funciona así: Imagina que vas con el médico porque te sientes mal. Él te ve y te empieza a preguntar cosas sobre tus malestares. Sin embargo, antes de empezar las preguntas, las dirige asumiendo que tienes gripe, por ejemplo. Entonces te preguntará síntomas asociados de la gripe. Si le das más de una respuesta que no es presumiblemente de la gripe, se formulará mentalmente otra hipótesis y de nuevo empezará el interrogatorio.

El segundo caso es el encadenamiento hacia adelante. Siguiendo el ejemplo anterior, vas al médico y éste comienza a preguntarte qué te duele, pero no asume que tiene gripe o cualquier otra enfermedad. Lo que hace es acumular datos (respuestas) y entonces busca en su base de conocimientos qué es lo que más se parece a lo que puedes tener.

El sistema de borrador ya es obsoleto. Imagina un salón de clases lleno de expertos humanos en alguna materia. Entonces se plantea un problema y cada experto tiene un pedazo del borrador en la pared para poner su solución. Después de que todos hayan puesto su posible solución, un supervisor lee todas las respuestas y arma la respuesta final. Así funcionaba HearSay, un sistema de reconocimiento de voz de los años ochentas, actualmente en desuso.

Cabe señalar que los sistemas expertos deben estar construídos para no repetir hasta el hartazgo la misma pregunta. Por ejemplo, imagina que un sistema de encadenamiento hacia atrás te pregunta si te duele la cabeza y le contestas que no. Si es así, probablemente la primera hipótesis, la de tener gripe, no funcione. Entonces el sistema crea a través de la siguiente regla la nueva hipótesis. Si en esta nueva regla hay que preguntar de nuevo si te duele la cabeza, sería poco inteligente y serio de un sistema que te volviese a preguntar lo mismo. Así, el sistema experto (como el que te mando), guarda las respuestas del usuario y checa antes si ya respondiste a la pregunta para no volverla a preguntar.

Otra cuestión, que no está considerada en el sistema experto es la de explicar su funcionamiento. Es decir, ¿por qué el sistema experto llegó a las conclusiones y diagnósticos a los que llegó? Hay muchas maneras de hacer esto pero una de ellas es simplemente avisarle al programador, vía mensajes a la pantalla, en qué regla está trabajando. Otrso sistemas expertos pueden trazar la ruta de desarrollo. Por ejemplo, pueden decirte: "primero usé la regla 4, la cual me remitió a la regla 92 y por las respuestas del usuario tuve que probar las reglas 153 y 25", etc. Pero esto es mucho más sofisticado y difícil de programar.



/*      Program: Dog Expert        */
/* Purpose: To show the working of */
/* an expert system. It is a pro-  */
/* duction rule-based system.      */
/*                                 */
/* Remarks: This is a dog classi-  */
/* cation expert system. It uses a */
/* set of production rules for the */
/* purpose of inferring.           */

domains

database

   xpositive(symbol,symbol)
   xnegative(symbol,symbol)


predicates

   do_expert_job
   do_consulting
   ask(symbol,symbol)
   dog_is(symbol)
   it_is(symbol)
   positive(symbol,symbol)
   negative(symbol,symbol)
   remember(symbol,symbol,symbol)
   clear_facts

goal

   do_expert_job.


clauses

/*  User Interface System (UIS) */

do_expert_job :-
     makewindow(1,7,7,"An Expert System",1,16,22,58),
     nl, write(" ************************************"),
     nl, write("    Welcome to a Dog Expert System"),
     nl, write("                                 "),
     nl, write(" This is a dog identification system"),
     nl, write(" Please, respond by typing in 'yes'"),
     nl, write(" or 'no'.            Thank you.    "),
     nl,nl,
     do_consulting,
     write("Press space bar..."), nl,
     readchar(_),
     clearwindow,
     exit.

do_consulting :-
     dog_is(X), !,
     nl, write(" Your dog may be a(n) ",X,"."),
     clear_facts.

do_consulting :-
     nl, write("Sorry, unable to determine the dog."),nl,
     clear_facts.

ask(X,Y) :-
     write("   Question :- ",X," it, ",Y," ? "),
     readln(Reply),
     remember(X,Y,Reply).


/* Inference Engine (INE) */

positive(X,Y) :-
     xpositive(X,Y),!.

positive(X,Y) :-
     not(negative(X,Y)),!,
     ask(X,Y).

negative(X,Y) :-
     xnegative(X,Y),!.

remember(X,Y,yes) :-
     asserta(xpositive(X,Y)).

remember(X,Y,no) :-
     asserta(xnegative(X,Y)),
     fail.

clear_facts :-
     retract(xpositive(_,_)),
     fail.

clear_facts :-
     retract(xnegative(_,_)),
     fail.


/* Production Rules */


dog_is("English Bulldog") :-
     it_is("short-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("Beagle") :-
     it_is("short-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"long ears"),
     positive(has,"good natured personality"),!.

dog_is("Great Dane") :-
     it_is("short-haired dog"),
     positive(has,"low-set tail"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),
     positive(has,"weight over 100 lb"),!.

dog_is("American Foxhound") :-
     it_is("short-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),!.
    
dog_is("Cocker Spaniel") :-
     it_is("long-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"low-set tail"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),!.

dog_is("Irish Setter") :-
     it_is("long-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("Collie") :-
     it_is("long-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("St. Bernard") :-
     it_is("long-haired dog"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),
     positive(has,"weight over 100 lb"),!.
    
it_is("short-haired dog") :-
     positive(has,"short-haired"),!.
    
it_is("long-haired dog") :-         
     positive(has,"long-haired"),!.

Este sistema experto está escrito para turbo prolog, que funciona bajo MsDOS y está sacado del libro -si mal no recuerdo- Exploring Artificial Intelligence With Turbo PROLOG por Keith Weiskamp, el cual no sé dónde está. No lo halló más.