Welcome! Wikis are websites that everyone can build together. It's easy!

Lenguajes generadores de SBC

Para el desarrollo de sistemas basados en el conocimiento se han venido utilizando tanto lenguajes de programación específicos de la inteligencia artificial, como de propósito general; estos lenguajes los podemos dividir de la siguiente forma:
  • Imperativos: PASCAL, C/C++
  • Funcionales: LISP
  • Declarativos: PROLOG, CHIP, OPS5
  • Orientados a Objetos: SmallTalk, Hypercard, CLOS
A continuación encontramos una breve descripción de algunos de ellos y varios ejemplos.

Pascal
Es un lenguaje de programación desarrollado por el profesor Suizo Niklaus Wirth a finales de los años 60. Su objetivo era crear un lenguaje que facilitara el aprendizaje de la programación a sus alumnos. Sin embargo con el tiempo su utilización excedió el ámbito académico para convertirse en una herramienta para la creación de aplicaciones de todo tipo. Pascal se caracteriza por ser un lenguaje de programacion estructurado fuertemente tipificado. Esto implica que:

  1. El código esta dividido en porciones fácilmente legibles llamadas funciones o procedimientos. De esta forma Pascal facilita la utilización de la programación estructurada en oposición al antiguo estilo de programación monolítica.
  2. El tipo de dato de todas las variables debe ser declarado previamente para que su uso quede habilitado.

Características únicas

A diferencia de lenguajes de programación descendientes de C, Pascal utiliza el símbolo:= para la asignación en vez de =. Si bien el segundo es más conciso, la práctica ha demostrado que muchos usuarios utilizan el símbolo de igualdad para comparar valores en lugar del comparador de C que es el símbolo ==. Dado que Pascal no permite asignaciones dentro de expresiones y utiliza sintaxis distinta para asignaciones y comparaciones, no sufre errores. Además sus programas tienen definidas dos partes: declarativa y ejecutiva. En la primera debe aparecer todo lo que se usará en la segunda, de lo contrario se detecta como desconocido y evita ciertas incomprensiones. En la parte declarativa se enuncian Unit existentes, procedimientos, funciones, variables, constantes y nuevos tipos de datos estructurados. Otra diferencia importante es que en Pascal, el tipo de una variable se fija en su definición; la asignación a variables de valores de tipo incompatible no están autorizadas. Esto previene errores comunes donde variables son usadas incorrectamente porque el tipo es desconocido. Esto también evita la necesidad de notación húngara, esto es prefijos que se añaden a los nombres de las variables y que indican su tipo. Ejemplo de código usando la estructura lineal
program raiz(input, output);
(* Obtener la raíz cuadrada de un número real x cualquiera. *)
var x, y: real;
respuesta: string;
begin
writeln('** Calcular la raíz cuadrada de x **');
writeln('Entrar x (> 0): ');
readln(x);
y := sqrt(abs(x)); (* Raíz cuadrada del valor absoluto de x para evitar raíces imaginarias *)
writeln;
if (x<0) then (* Si x es negativo, el resultado se notifica como imaginario *)
writeln('La raíz cuadrada de ', x, ' es el número imaginario ', y,'i')
else
writeln('La raíz cuadrada de ', x, ' es ', y);
writeln;
writeln('** Fin **');
readln; (* Espera a que el usuario pulse enter para salir del programa *)
end.


C
Es un lenguaje de programación creado en 1969 por Ken Thompson y Dennis M. Ritchie en los Laboratorios Bell como evolución del anterior lenguaje B, a su vez basado en BCPL. C es apreciado por la eficiencia del código que produce y es el lenguaje de programación más popular para crear software de sistemas, aunque también se utiliza para crear aplicaciones. Se trata de un lenguaje débilmente tipado de medio nivel pero con muchas características de bajo nivel. Dispone de las estructuras típicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar código en ensamblador con código C o acceder directamente a memoria o dispositivos periféricos.

Ventajas

  • Lenguaje muy eficiente puesto que es posible utilizar sus características de bajo nivel para realizar implementaciones óptimas.
  • A pesar de su bajo nivel es el lenguaje más portado en existencia, habiendo compiladores para casi todos los sistemas conocidos.
  • Proporciona facilidades para realizar programas modulares y/o utilizar código o bibliotecas existentes.

C++
Es un lenguaje de programación, diseñado a mediados de los años 1980, porBjarne Stroustrup, como extensión del lenguaje de programacionC. Se puede decir que C++ es un lenguaje que abarca tres paradigmas de la programación: la programación estructurada, la programación genérica y la programación orientada a objetos. Las principales características del C++ son el soporte para programación orientada a objetos y el soporte de plantillas o programación genérica. Además posee una serie de propiedades difíciles de encontrar en otros lenguajes de alto nivel:

  • Posibilidad de redefinir los operadores (sobrecarga de operadores)
  • Identificación de tipos en tiempo de ejecución (RTTI)
C++ está considerado por muchos como el lenguaje más potente, debido a que permite trabajar tanto a alto como a bajo nivel, sin embargo es a su vez uno de los que menos automatismos trae lo que "dificulta" mucho su aprendizaje.

Diferencias de Tipos respecto de C

En C++, cualquier tipo de datos que sea declarado completo se convierte en un tipo de datos único. Las condiciones para que un tipo de datos T sea declarado completo son a grandes rasgos las siguientes:
  • Es posible al momento de compilación conocer el espacio asociado al tipo de datos.
  • T Tiene al menos un constructor, y un destructor, bien declarados.
  • Si T es un tipo compuesto, o es una clase derivada, o es la especificación de una plantilla, o cualquier combinación de las anteriores, entonces las dos condiciones establecidas previamente deben aplicar para cada tipo de dato constituyente.
En general, esto significa que cualquier tipo de datos definido haciendo uso de las cabeceras completas, es un tipo de datos completo. En particular, y, a diferencia de lo que ocurría en C, los tipos definidos por medio de struct o enum son tipos completos. Como tales, ahora son sujetos a sobrecarga, conversiones implícitas, etcétera. Los tipos enumerados, entonces, ya no son simplemente alias para tipos enteros, sino que son tipos de datos únicos en C++. El tipo de datos bool, igualmente, pasa a ser un tipo de datos único, mientras que en C funcionaba en algunos casos como un alias para alguna clase de dato de tipo entero.

LISP
Es uno de los más utilizados desde los comienzos de la I.A. Se trata de uno de los lenguajes de alto nivel más antiguos. Se creó en 1950 en el MIT por John McCarthy. Es un lenguaje cuyo principal estructura de datos son las listas, aún cuando se han ido incorporando otras estructuras más sofisticadas como pueden ser los objetos.
Tiene como ventaja el manejo de sus estructuras a muy alto nivel lo que facilita la implementación rápida de los modelos y su facilidad de modificación. Como desventaja está su relativa lentitud frente a lenguajes de propósito general como C. La mayoría de las primeras herramientas de desarrollo de sistemas basados en el conocimiento fueron escritas en LISP y, en la actualidad, conviven con otras que se han desarrollado en C++.
En LISP se dan los siguientes conceptos característicos:
  • Listas y Átomos: La estructura más importante es la lista. Los átomos pueden subordinarse a cualidades.
  • La Función: Cada función LISP y cada programa LISP tiene estructura de lista. Los programas no pueden distinguirse sintácticamente de los datos. LISP ofrece sus propias funciones básicas.
  • Forma de Trabajo: LISP es un lenguaje funcional. Ofrece la posibilidad de realizar definiciones recursivas de funciones. La unión de procedimientos se realiza de forma dinámica, es decir en plena ejecución, y no como en otros lenguajes de programación. El sistema realiza automáticamente una gestión dinámica de memoria.
El programa que se muestra a continuación es un programa en LISP que calcula y visualiza la media de una lista de números de entrada. Por ejemplo, si la entrada es la lista: (85.5 87.5 89.5 91.5) Entonces el resultado presentado será el valor 88.5. La variable x se utiliza para almacenar la lista de entrada y la variable n se utiliza para determinar cuántos valores hay. La variable med contiene al final la media calculada.
(defun sum (x) ; calcula la suma de una lista x
(cond ((null x) O)
((atom x) x)
(t (+ (car x) (sum (cdr x)]
(defun cont (x) ; cuenta el número de valores de x
(cond ((null x) O)
((atom x) 1)
(t (addl (cont (cdr x)]
(defun media () ; el programa principal comienza aquí
(print 'introducir la lista a promediar')
(setq x (read))
(setq n (count x))
(setq med (/ (sum x) n))
(princ "la media es = ‘ ‘)
(print med)]


El programa está compuesto de tres funciones del LISP, cada una indicada por la cabecera "defun" (abreviación de "define function”). La primera función "sum" calcula la suma aritmética de los elementos de la lista x. La segunda, "cont", calcula el número de valores de la lista. La tercera función, "media", es el programa principal y controla la entrada (usando "read”), el cálculo de la media "med" y la salida (usando "print").

PROLOG
Fue creado por Alain Colmenauer en la Universidad de Marsella en 1972. Se trata de un lenguaje declarativo frente a los lenguajes de programación más usuales que son procedurales. Los lenguajes declarativos, a diferencia de los procedurales, no describen secuencialmente el algoritmo de resolución del problema, sino que se limitan a describir los hechos conocidos y las relaciones existentes entre ellos. Los lenguajes procedurales están orientados al "cómo" mientras que los declarativos están orientados al "qué". Es el lenguaje declarativo, en el caso que nos ocupa PROLOG, quien a partir de los datos introducidos deduce nuevos hechos y resuelve el problema automáticamente.

PROLOG tiene incluido, por tanto, un motor de inferencia que se encarga de realizar búsquedas en su base de hechos. Programar con PROLOG, por tanto, consiste en asertar hechos sobre objetos y preguntar al sistema sobre sus relaciones. Este lenguaje, aún cuando se le reconocen sus bondades, no ha tenido una gran utilización (si se exceptúa Francia, Gran Bretaña y Japón con el proyecto de 5ª generación, en el que se adoptó como lenguaje de programación PROLOG) siendo su principal aplicación el manejo de bases de datos relacionales junto con lenguajes de bases de datos de 4ª generación asociados a éstas.

En la actualidad, es común la utilización de lenguajes orientados a objeto (tales como C++) para el desarrollo de generadores de sistemas basados en el conocimiento y de los propios sistemas basados en el conocimiento por su rendimiento, en términos de tiempo de ejecución, superior al de las herramientas generales. La incorporación de la programación orientada a objetos al lenguaje C ha facilitado la labor de modelización que requiere todo sistema basado en el conocimiento y su rapidez de ejecución así como el hecho de ser uno de los lenguajes de programación más conocidos ha hecho que su uso vaya en aumento.

Ejemplo de Código Prolog

%%%%
declaraciones
%%

padrede('juan', 'maria'). % juan es padre de maria
padrede('pablo', 'juan'). % pablo es padre de juan
padrede('pablo', 'marcela').
padrede('carlos', 'debora').

% A es hijo de B si B es padre de A
hijode(A,B) :- padrede(B,A).

% A es abuelo de B si A es padre de C y C es padre B
abuelode(A,B) :-
padrede(A,C),
padrede(C,B).

% A y B son hermanos si el padre de A es también el padre de B y si A y B no son lo mismo
hermanode(A,B) :-
padrede(C,A),
padrede(C,B),
A \== B.

% A y B son familiares si A es padre de B o A es hijo de B o A es hermano de B
familiarde(A,B) :-
padrede(A,B).

familiarde(A,B) :-
hijode(A,B).

familiarde(A,B) :-
hermanode(A,B).

%%%%
consultas
%%

%juan es hermano de marcela?
?- hermanode('juan', 'marcela').
yes

% carlos es hermano de juan?
?- hermanode('carlos', 'juan').
no

% pablo es abuelo de maria?
?- abuelode('pablo', 'maria').
yes

% maria es abuela de pablo?
?- abuelode('maria', 'pablo').
no


Smalltalk
Es un sistema informático que permite realizar tareas de computación mediante la interacción con un entorno de objetos virtuales. Metafóricamente, se puede considerar que un Smalltalk es un mundo virtual donde viven objetos que se comunican mediante el envío de mensajes. Un sistema Smalltalk esta compuesto por:
  • Máquina virtual
  • Imagen virtual que contiene todos los objetos del sistema
  • Lenguaje de programación (también conocido como Smalltalk)
  • Biblioteca de Objetos reusables
  • Opcionalmente un entorno de desarrollo que funciona como un sistema en tiempo de ejecución.

Características

Se busca que todo lo que se pueda realizar con un ordenador se pueda realizar mediante un Sistema Smalltalk, por lo que en algunos casos se puede considerar que incluso sirve como Sistema Operativo. Smalltalk es considerado el primero de los lenguajes orientados a objetos. En Smalltalk todo es un objeto, incluidos los números reales o el propio entorno Smalltalk. Como lenguaje tiene las siguientes características:
  • Orientación a Objetos Pura
  • Tipado dinámico
  • Interacción entre objetos mediante envío de mensajes
  • Herencia simple y con raíz común
  • Reflexión computacional completa
  • Recolección de basura
  • Compilación en tiempo de ejecución o Interpretado
  • Múltiples Implementaciones
Smalltalk ha tenido gran influencia sobre otros lenguajes como Java o Ruvy, y de su entorno han surgido muchas de las prácticas y herramientas de desarrollo promulgadas actualmente por las metodologías ágiles.

HyperCard
Fue una aplicación informática de Apple Computer que se contó entre los primeros sistemas hipermedia con éxito anteriores a la Worl Wide Web. Conceptualmente se acerca a una base de datos, pues almacena información, siendo además gráfico, flexible y capaz de crear ficheros fáciles de modificar. También incluía HiperTalk, un lenguaje de programación potente y relativamente fácil de usar, para manipular los datos y la interfaz de usuario. Los usuarios de HyperCard lo usaban a menudo como un sistema de programación para el desarrollo rápido de aplicaciones más que como base de datos. HyperCard corre nativamente sólo en Mac OS versiones 9 y anteriores, pero puede usarse aún en el modo Classic de Mac OS X. HyperCard no era sólo un motor de base de datos; la apariencia de cada tarjeta podía modificarse, de la misma forma que puede escribirse información no estándar sobre las tarjetas de un rolodex. Una capa de fondo especial de cada pila contenía elementos que aparecían en todas las demás tarjetas de la misma pila, o en todas las tarjetas basadas en dicho fondo. Los fondos podían incluir imágenes, además de los objetos también disponibles para las demás tarjetas: campos gráficos, botones, campos de texto y otros elementos típicos de las GUIs. Cada tarjeta podía entonces contener datos diferentes asociados a los campos de texto o gráficos, creando de esta forma la funcionalidad de base de datos. Por ejemplo, una libreta de direcciones podía confeccionarse añadiendo al fondo unos cuantos campos de texto para contener el nombre y la dirección. Tras esto, el usuario puede añadir nuevas tarjetas y rellenar los campos. El fondo puede ser modificado en cualquier momento, permitiendo que los cambios fueran fáciles de hacer. Los operaciones básicas como búsqueda, adición y borrado estaban integradas en el entorno de HyperCard, permitiendo que las bases de datos simples fuesen configuradas y usadas por cualquiera capaz de usar un ordenador Macintosh.
CLOS Es el acrónimo inglés de Common Lisp Object System y es una extensión de ANSI Common Lisp para permitir la programacion orientada a objetos que ha sido adoptada por otros dialectos de Lisp como EuLisp o Emacs Lisp. Inicialmente fue propuesta como un añadido del lenguaje, pero posteriormente CLOS fue adoptado como parte de estándar ANSI de Common Lisp. CLOS es un lenguaje de programación dinámico dirigido a objetos que difiere mucho de lo que podemos encontrar en lenguajes de programación estáticos orientados a objetos como C++ o Java. CLOS está inspirado en sistemas Lisp orientados a objetos anteriores como MIT Flavors o Common LOOPS, aunque es más genérico que éstos. Precisamente la generalidad de CLOS es la característica más difícil de obtener, aunque crear un sistema OO en Lisp es fácil: La implementación orientada a objetos de CLOS se conoce como CLOS Metaobject Protocol o MOP y permite que el sistema sea extensible y personalizable.
CLOS es un sistema de resolución múltiple. Esto significa que los métodos se pueden distinguir según los tipos de todos los argumentos. Los métodos en CLOS se agrupan en funciones genéricas, colecciones de métodos con el mismo nombre y estructura de argumentos, pero con argumentos de tipos diferentes.


Latest page update: made by jarrubla , Sep 6 2007, 5:46 PM EDT (about this update About This Update jarrubla Edited by jarrubla

206 words added

view changes

- complete history)
Keyword tags: None
More Info: links to this page

Anonymous  (Get credit for your thread)


Started By Thread Subject Replies Last Post
jluqueco Sobre los lenguajes 0 Aug 30 2007, 3:57 PM EDT by jluqueco
Thread started: Aug 30 2007, 3:57 PM EDT  Watch
Buscando informacion sobre los lenguajes SBC encontre algo que nos puede ayudar acerca de los lenguajes:

In the last few years, formal modeling languages have begun to play an increasingly important role in the knowledge acquisition community. A testimony to this is the steady stream of proposals for such formal languages for knowledge-based system (KBS) modeling. These modeling languages differ from both the high-level informal modeling languages-for example, those used in CommonKADS--and from directly executable languages. Various authors have argued the advantages of such formal modeling languages: They reduce the vagueness and ambiguity of informal descriptions, enable validation of completeness and consistency through formal proofs, and bridge the gap between the informal model and the system design. However, these advantages come at a price. As the software engineering community well knows, formal modeling languages suffer from problems that severely limit their usefulness. They are often not expressive enough to handle real-world applications, and they are usually complex and hard to read. Moreover, constructing a formal model is difficult, error prone, and expensive.

Espero que sirva de ayuda.
Do you find this valuable?    
Keyword tags: None