Ejemplo de Sistema Experto

domains

persona = symbol

predicates

hombre (persona)
fumador (persona)
vegetariano (persona)
pareja_elegida (persona)

goal:

pareja_elegida(X) and write ("la posible pareja de Sofía es", X), nl.

clauses

hombre (josé).
hombre (mario).
hombre (tomas).
hombre (antonio).
fumador (tomas).
vegetariano (josé).
vegetariano (tomas).
pareja_elegida (X)∧hombre (X), not (fumador (X)).
pareja_elegida (X)∧hombre (X), vegetariano (X).

7.4 Herramientas y entornos de programacion y desarrollo


Una herramienta para la construcción de sistemas basados en el conocimiento no es sólo un lenguaje de programación de alto nivel orientado al desarrollo de estos sistemas. Este equipo lógico de desarrollo tiene, entre otras, las siguientes características o utilidades:
  • Posibilidades para el desarrollo de prototipos.
  • Un motor de inferencia.
  • Un método o varios para la representación del conocimiento.
  • Una o varias técnicas para el manejo de la incertidumbre. 
  • Un generador de interfaces gráficos (no siempre).
Estas herramientas están muy orientadas hacia el usuario final de la aplicación y, por lo tanto, es fundamental elegir la herramienta adecuada al entorno de aplicación. Son muchos los factores que influyen a la hora de tomar una decisión. 

Un entorno de desarrollo integrado, llamado también IDE (Integrated Development Environment), es un programa informático compuesto por un conjunto de herramientas de programación. Puede dedicarse en exclusiva a un solo lenguaje de programación o bien poder utilizarse para varios. 

Un IDE es un entorno de programación que ha sido empaquetado como un programa de aplicación, es decir, consiste en un editor de código, un compilador, un depurador y un constructor de interfaz gráfica (GUI). Los IDEs pueden ser aplicaciones por sí solas o pueden ser parte de aplicaciones existentes.

Componentes

  • Un editor de texto
  • Un compilador
  • Un intérprete
  • Un depurador
  • Un cliente
  • Posibilidad de ofrecer un sistema de control de versiones.
  • Factibilidad para ayuda en la construcción de interfaces gráficas de usuario.

7.3 Lenguajes Declarativos


Un lenguaje declarativo es un tipo de lenguaje de programación basado más en las matemáticas y en la lógica que los lenguajes imperativos, más cercanos estos al razonamiento humano. Los lenguajes declarativos no dicen cómo hacer una cosa, sino, más bien, qué cosa hacer. A diferencia de los imperativos, no suele haber declaración de variables ni tipos.

La programación declarativa es una forma de programación que implica la descripción de un problema dado en lugar de proveer una solución para dicho problema, dejando la interpretación de los pasos específicos para llegar a dicha solución a un intérprete no especificado. La programación declarativa adopta, por lo tanto, un enfoque diferente al de la programación imperativa tradicional.

En otras palabras, la programación declarativa provee el "qué", pero deja el "cómo" liberado a la implementación particular del intérprete. Por lo tanto se puede ver que la programación declarativa tiene dos fases bien diferenciadas, la declaración y la interpretación.

Caracteristicas de los lenguajes de programacion declarativos
  • Los lenguajes declarativos están orientados a buscar la solución del problema, sin preocuparse por la forma de llegar a ello; es decir, el programador debe concentrarse en la lógica del algoritmo, más que en el control de la secuencia.
  • Los programas están formados por un conjunto de definiciones o ecuaciones, las cuales describen lo que debe ser calculado, no en sí la forma de hacerlo.
  • Las variables sólo pueden tener asignado un solo valor a lo largo de la ejecución del programa, lo cual implica que no puede existir asignación destructiva. Debido a esto, cobra especial importancia el uso del anidamiento y la recursividad.
  • Las listas representan la estructura fundamental de datos.
  • El orden de la ejecución no resulta importante debido a que no existen efectos colaterales; es decir, que al calcular un valor, resulta imposible afectar el cálculo de otros y con esto se puede afirmar que cualquier secuencia de ejecución deberá conducir al mismo resultado.
  • Las expresiones o definiciones pueden ser usadas como valores y por lo tanto se pueden tratar como argumentos de otras definiciones.
  • El control de la ejecución no es responsabilidad del programador.
La Programación Declarativa, es un paradigma de programación que está basado en el desarrollo de programas especificando o "declarando" un conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o transformaciones que describen el problema y detallan su solución. La solución es obtenida mediante mecanismos internos de control, sin especificar exactamente cómo encontrarla. No existen asignaciones destructivas, y las variables son utilizadas con transparencia referencial.


7.2 Lenguajes Orientados a Objetos


Se le llama así a cualquier lenguaje de programación que implemente los conceptos definidos por la programación orientada a objetos. La programación orientada a objetos (POO) es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento.

La programación orientada a objetos es una forma de programar que trata de encontrar una solución a diversos problemas, introduciendo nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes: 

Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.

Herencia: Es la facilidad mediante la cual una clase hereda en ella cada uno de los atributos y operaciones de otra, como si esos atributos y operaciones hubiesen sido definidos por la misma clase. Por lo tanto, puede usar los mismos métodos y variables publicas declaradas en la clase de origen. Los componentes registrados como "privados" (private) también se heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y sólo pueden ser accedidos a través de otros métodos públicos. 

Objeto: Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos) los mismos que consecuentemente reaccionan a eventos. Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase.

Método: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

Evento: Es un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera.

Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método.

Estado interno: es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase.

Componentes de un objeto: atributos, identidad, relaciones y métodos.

Identificación de un objeto: un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes.

Siguiendo esa idea, cualquier lenguaje que permita la definición de tipos de datos , de operaciones nuevas sobre esos tipos de datos, y de instanciar el tipo de datos podría ser considerado orientado a objetos.

La programación orientada a objetos, intenta simular el mundo real a traves del significado de objetos que contiene caracteristicas y funciones. Los lenguajes orientados a objetos se clasifican como lenguajes de quinta generacion.
 




7.1 Lenguajes funcionales


Los lenguajes funcionales se basan en la declaración de funciones aritméticas, tratan de ser un lenguaje expresivo y matemáticamente elegante. Los programas escritos en lenguajes funcionales están compuestos únicamente por la definición de funciones, pero no se trata de subrutinas de un programa iterativo, si no más bien como funciones puramente matemáticas.

Los lenguajes funcionales suelen usarse mucho para Inteligencia Artificial, ofreciendo al programador un buen número de recursos expresivos que permiten resolver problemas complejos mediante programas pequeños y robustos. Para alguien que está acostumbrado a programar en lenguajes imperativos u orientado a objetos, la curva de aprendizaje es un poco más grande; cuesta un poco entender el paradigma.

Lo complicado es que en general no existe la asignación de variables, se trabaja en forma recursiva, con memoria dinámica, y, en algunos lenguajes, cualquier programa se puede escribir en una sola línea (por ejemplo en APL), lo que dificulta un poco su lectura.

Entre ellos cabe destacar: un sistema de tipos polimórficos que permite definir una amplia variedad de estructuras de datos de uso genérico, la posibilidad de definir funciones que aceptan otras funciones como argumentos y devuelven funciones como resultado, facilidades para definir y manipular estructuras de datos infinitas, un modelo computacional simple, claro y bien fundamentado, etc. De no menor importancia es la posibilidad de razonar, de forma sencilla, acerca de las propiedades de los programas: su corrección, su eficacia, su comportamiento en ejecución. Esto permite optimizar las tareas de implementación de los lenguajes funcionales.

Los lenguajes funcionales son: Haskell, Miranda, R, Lisp, Scala, Scheme, ML, Erlang entre otros. Podemos encontrar, en casi todos los lenguajes de programación funcional, un núcleo común de conceptos y técnicas asentado sobre bases firmemente establecidas.


UNIDAD VII - LENGUAJES DE PROGRAMACION Y HERRAMIENTAS DE SOFTWARE PARA LOS SISTEMAS EXPERTOS

 
Que tal bloggers, aqui estoy de nuevo para que comenzemos con nuestra unidad 7, que sera segun nuestro temario acerca de los lenguajes de programacion y las herramientas que nos pueden ser de ayuda para el desarrollo de un Sistema Experto. Asi que... comenzemos:

Antes de  otra cosa debemos de saber que el camino para seleccionar el lenguaje o herramienta para el sistema experto está lleno de confusiones. Para aclarar mejor algunas dudas debemos de tomar en cuenta las siguientes definiciones:
 
Lenguaje: es un traductor de comandos escrito con una sintaxis específica. Un lenguaje para sistemas expertos también proporcionará un mecanismo de inferencia que ejecute las instrucciones del lenguaje. Dependiendo de la forma en que este implantado, el mecanismo de inferencia puede proporcionar encadenamiento hacia atrás, hacia adelante o ambos.

Herramienta:
es un lenguaje adicionalmente asociado con programas de utilerías para facilitar el desarrollo, la depuración y el uso de los programas de aplicación. Los programas de utilerías pueden incluir editores de texto e imágenes, depuradores, administradores de archivos e incluso generadores de código.

Shell: herramienta con propósitos especiales, diseñada para cierto tipo de aplicaciones en las que el usuario solo debe proporcionar la base del conocimiento. El ejemplo clásico de esto es el Shell de EMYCIN, este se hizo al eliminar la base del conocimiento medico del sistema experto MYCIN.

El Shell EMYCIN demostró que podía volver a utilizarse el software esencial de MYCIN como mecanismo de inferencia y la interfaz de usuario. Este fue un paso muy importante en el desarrollo de la tecnología para los modernos sistemas expertos, porque significó que no era necesario construir desde cero cada nueva aplicación.
 
 
 

6.3 - Tendencias Futuras


Las tendencias de los SE proyectan a implementaciones de tecnologías como Redes Neuronales, reconocimiento y procesamiento del lenguaje natural, reconocimiento de patrones, estas implementaciones prometen un futuro exitoso para lo SE y los fortalecerán aun más, haciéndolos más eficientes y más precisos. 
 
Inteligencia Artificial Distribuida.

Ya que es difícil pronosticar , a largo plazo, como evolucionarán todas las ramas implicadas de la Inteligencia Artificial y, por tanto, los mismos Sistemas Expertos; solo se puede especular sobre cuales seran las tendencias a corto plazo, que en general, podrian llevar a la consolidación e integración de las técnicas existentes.

Los mayores avances vendrán en el área de la Inteligencia Artificial Distribuida (DAI), llevados por la necesidad de disponer de Sistemas Expertos modulares que cooperen entre si y con los expertos humanos.

Sistemas Expertos más grandes.

En un futuro se pronostica que lo SE serán de un tamaño mucho más grande que en la actualidad, debido a que se pretende que sean de tipo multidominios, es decir que puedan resolver problemas de diferentes dominios.

Reconocimiento del lenguaje natural.

Se tenderá al empleo del lenguaje natural en la salida y en la entrada del Sistema Experto. Hoy en día se siguen haciendo grandes esfuerzos por consolidar los mecanismos de reconocimiento del lenguaje natural, mecanismos que hoy en día aún no son una realidad. 

Sistemas Expertos con redes neuronales.

Una de las múltiples ramas por las cuales se ha desarrollado la investigación es el desarrollo de las llamadas "redes neuronales”. Una red neuronal es el intento de poder realizar una simulación computacional del comportamiento de partes del cerebro humano mediante la réplica en pequeña escala de los patrones que éste desempeña para la formación de resultados a partir de los sucesos percibidos.

Esta línea de la Inteligencia Artificial ha permitido grandes avances en el aprendizaje y el manejo de conocimiento, es una de las líneas más prometedoras para los Sistemas Expertos, ya que estos manejan grandes volúmenes de conocimiento.

Interfaces inteligentes.

La tendencia los lo SE con respecto las interfaces humanas, es la creación de estas de forma fácil de operar, se crearán interfaces más amigables, inteligentes y versátiles. 

Sistemas Expertos con visión artificial.

La Visión artificial, también conocida como Visión por Computador o Visión técnica, es un subcampo de la Inteligencia Artificial. El propósito de la visión artificial es programar una computadora para que "entienda" una escena o las características de una imagen.

Sistemas Expertos Evolutivos.

La teoría de los Sistemas Evolutivos parte del constante cambio en los sistemas tanto de la información que manejan como de su estructura y desde hace mas de veinte años se han aplicado a la solución de problemas en áreas como el reconocimiento de patrones y lenguaje natural, la generación de música por computadora y la vida artificial entre otros, dando muy buenos resultados.

Aplicando este enfoque al ámbito de la programación, los Sistemas Evolutivos estudian la forma de construir sistemas capaces de modificar sus reglas, procesos, datos, y/o estructura, cada vez que nueva información ingresa al mismo.

6.2.1 En tiempo diferido


Es el control tradicional, que requiere un espacio temporal para que la información obtenida sea procesada con intenciones de verificación. 


Como ejemplo de este tipo de control esta la cuenta contable de resultados, la cual va captando información, pero hasta que transcurra un trimestre o un año esa información no tiene utilidad desde el punto de vista del control.

6.2 Control

Un sistema de control participa en la realización de las tareas de interpretación, diagnóstico y reparación de forma secuencial. Con ello se consigue conducir o guiar un proceso o sistema.

Los sistemas de control son complejos debido al número de funciones que deben manejar y el gran número de factores que deben considerar; esta complejidad creciente es otra de las razones que apuntan al uso del conocimiento, y por tanto de los SE.

Cabe aclarar que los sistemas de control pueden ser en lazo abierto, si en el mismo la realimentación o el paso de un proceso a otro lo realiza el operador, o en lazo cerrado si no tiene que intervenir el operador en ninguna parte del mismo.

6.1.3 Reparacion, correccion o terapia


La reparación, corrección, terapia o tratamiento consiste en la proposición de las acciones correctoras necesarias para la resolución de un problema.

Los SE en reparación tienen que cumplir diversos objetivos, como son:
  • Reparación lo más rápida y económicamente posible.
  • Orden de las reparaciones cuando hay que realizar varias.
  • Evitar los efectos secundarios de la reparación, es decir la aparición de nuevas averías por la reparación.
 

6.1.2 Diagnostico


El diagnóstico consiste en identificar las causas internas que provocan un problema, avería o disfunción a partir de una serie de datos o síntomas que son consecuencia de la misma y que son observables.

Los SE en diagnóstico encuentran múltiples dificultades a la hora de realizar su tarea como son las siguientes:
  • Manifestaciones  Nuevas.  Es  decir,  síntomas  que  no  se  habían  observado  con anterioridad.
  • Causas Nuevas.
  • Manifestaciones debidas a varias causas.
  • Datos Inaccesibles, caros o de obtención peligrosa.
  • Relaciones no biyectivas entre los datos y las causas.
  • Fallos o averías de aparición intermitente.
  • Existencia de varios fallos simultáneos o en cadena


6.1.1 Interpretacion


La interpretación consiste en encontrar el significado de los datos de entrada obtenidos por sensores o introducidos por el usuario.

Con frecuencia aparecen datos contradictorios, incompletos o inexactos, por lo que hay que dotar al SE de conocimiento para resolver un problema de este tipo, y que de todas formas llegue a una resolución. Existen dos tipos de interpretación:
  • Análisis: La interpretación de datos se obtiene mediante la separación o distinción de las partes que forman los datos.
  • Síntesis: La interpretación de los datos se obtiene mediante la combinación de los mismos. 

La monitorización es un caso particular de la interpretación, y consiste en la comparación continua de los valores de las señales o datos de entrada y unos valores que actúan como criterios de normalidad o estándares.

6.1 - Tareas que realiza un Sistema Experto


En la actualidad los Sistemas Expertos, ofrecen grandes posibilidades y sus aplicaciones son de gran utilidad en temas tan variados que pueden ir desde la medicina hasta la enseñanza. En las empresas, los Sistemas Expertos empiezan a tener cada vez mayor auge, hasta el punto de ir suponiendo un punto de referencia importante en la toma de decisiones para los directivos. En realidad, incluso se podría decir que el límite de las aplicaciones de los Sistemas Expertos está en la imaginación humana, siendo siempre de utilidad allí donde se necesite un experto.

Según la clase de problemas hacia los que estén orientados, podemos clasificar los Sistemas  Expertos  en  diversos  tipos  entre  los  que  cabe  destacar  interpretacion, diagnosis,  pronóstico, planificación, reparación , correccion, control e instrucción.

UNIDAD VI - APLICACION DE LOS SISTEMAS EXPERTOS

Que tal bloggers ahora les voy a presentar mas informacion sobre los sistemas expertos, en esta ocasion trataremos los temas que corresponden a la unidad 6, y la cual trata sobre la aplicacion y las tareas que realiza un S.E.

 Estos son los puntos que trataremos en el desarrollo de esta unidad:

   6.1 Tareas que realiza un Sistema Experto
        6.1.1 Interpretacion
        6.1.2 Diagnostico
        6.1.3 Reparacion, correccion o terapia
    6.2 Control
        6.2.1 En tiempo diferido
        6.2.1 En tiempo real
    6.3 Tendencias futuras

Espero les sea de utilidad esta informacion.

5.3 Ingeniería del conocimiento


La Ingeniería del conocimiento es una disciplina que forma parte de la I.A., consiste en diseñar y generar Sistemas Expertos basados en el conocimiento que antes no existía, a partir de la información contenida en las bases de datos documentales y mediante el cruce del contenido de los documentos. 

Se apoya en metodologia de instrucciones y en tecnologias de informacion, en un intento por representar el conocimiento y razonamiento humanos en un tema especifico, dentro de un sistema artificial.

La ingeniería del conocimiento engloba a los científicos, tecnología y metodología necesarios para procesar el conocimiento. Su objetivo es extraer, articular e informatizar el conocimiento de un experto.

La ingeniería del conocimiento parte lógicamente de la Teoría actor-red, ya que pone de manifiesto redes y genera otras nuevas. Además hace uso de la Teoría de la Traducción-Traslación, ya que mediante el acercamiento y puesta en relación de actores, se produce una traducción para llevar los enunciados o modalidades a nuevos estadios de evolución.

La Ingeniería del Conocimiento debe usar técnicas y metodologías de carácter cuantitativo e instrumental. Así, las redes las describe matemáticamente mediante la teoría de los grafos. Para determinar la intensidad de los enlaces emplea índices de similitud o cercanía y como algoritmo fundamental el Análisis de Palabras Asociadas. Alternativamente también se puede emplear análisis mediante redes neuronales. 

El Análisis de Palabras Asociadas se basa en “leer” los documentos y generar redes sociocognitivas a partir de la asociación de las palabras que hay en los documentos. El resultado es lo que se denominan Bases de Conocimiento, en oposición a Bases de Datos, que tan solo contienen datos

5.2 Seguridad en la programacion


La mayoria de las personas piensan que la seguridad es cosa de juego y que muchas veces la inseguridad de software es un problema que aqueja solo a los desarrolladores de software. Pero la verdad, hoy en dia la mayoria de las aplicaciones, si no es que todas tiene un bug o una vulnerabilidad por donde se puede acceder y escalar privilegios o modificar informacion confidencial. Estas son las  fuentes de vulnerabilidades mas comunes en el software:

1. Cambios en el ambiente de ejecución: Los parches, los cambios en la configuración y variables de entorno alrededor de las aplicaciones son elementos críticos para mantener una ejecución adecuada y controlada de las rutinas y acciones previstas en el software. Al descuidar este aspecto, es probable involucrar efectos de borde o condiciones de excepción no previstas que comprometan no solamente un módulo de la aplicación sino el sistema de información mismo.

2. Desbordamientos y chequeos de sintaxis: Dos elementos importantes en la revisión y evaluación de software. Por un lado la evaluación de los desbordamientos bien sea de memoria o de variables específicas dentro de un programa y por otro lado, la verificación de buen uso de los comandos o palabras reservadas en el lenguaje de programación, que permitan al programador un uso adecuado y eficiente de las estructuras. Si este aspecto no se considera con el rigor necesario, se estará comprometiendo la integridad del ambiente de ejecución de la aplicación.

3. Convenientes pero peligrosas características del diseño del software: Esta fuente de vulnerabilidad nos presenta funcionalidades que son deseables en el software para aumentar la versatilidad de uso de las aplicaciones. Entre estas tenemos herramientas de depuración o debugging, conexiones remotas en puertos especiales, entre otras, las cuales ofrecen importante elementos a los programadores y usuarios, pero que generalmente abren posibilidades de ingresos no autorizados que comprometen la integridad de sistemas y socavan la confianza del usuario frente a la aplicación.

4. Invocaciones no controladas: Este hacemos referencia a un inadecuado manejo de errores o excepciones en las aplicaciones o exceso de privilegios de ejecución, los cuales se manifiestan en comportamientos inesperados del software que generalmente ofrecen mayores privilegios o accesos adicionales a la información del sistema. En este sentido, el control adecuado de interrupciones, mensajes de error y entorno de ejecución de los programas se vuelve crítico al ser éstos elementos los que definen la interacción del software con el usuario final y su relación con el entorno de ejecución.

5. Bypass a bajo nivel: Las implicaciones de esta fuente de vulnerabilidades hace referencia al aseguramiento que la aplicación debe tener al ser invocada o ejecutada en un ambiente computacional seguro. El programador debe fortalecer y asegurar una manera autorizada de ingreso a la aplicación por parte del usuario, estableciendo mecanismos de monitoreo y control que velen porque esto se cumpla. El sobrepasar un control de acceso a un objeto, bien sea a través de permisos deficientemente otorgados, artificios que interrumpan la normal ejecución (contraseñas de BIOS) o por la manipulación de la memoria de ejecución de la aplicación constituye un atentado directo contra la confiabilidad e integridad del software.

6. Fallas en la implementación de protocolos: Los elementos de seguridad mencionados en este apartado, hacen referencia a las medidas de seguridad en redes. Si bien, los protocolos utilizados para transmisión y control de datos, presentan múltiples fallas, éstas con frecuencia no son consideradas dentro del proceso de implementación de una aplicación. En este sentido, sabemos que las aplicaciones que se ejecutan sobre TCP/IP tienen inherentes las fallas de éste conjunto de protocolos, por tanto es menester del programador establecer junto con el encargado de la seguridad informática, analizar los posibles requerimientos de seguridad necesarios para que la aplicación funcione sobre un ambiente de red que brinde mayores niveles de seguridad y control de tráfico.

7. Fallas en software de base: Todas las aplicaciones finalmente se ejecutan bajo la supervisión de un software de base o sistema operacional. Generalmente cuando se desarrollan aplicaciones, las condiciones o aseguramiento del software de base, no es condición para la adecuada ejecución de aplicaciones. Nada ganamos con aplicar y efectuar un amplio espectro de pruebas y controles, cuando el ambiente de ejecución o el software base no ha pasado por una valoración y afinamiento necesario para asegurar un ambiente de ejecución estable y seguro. En este punto, se llama la atención tanto a proveedores como a programadores, donde el trabajo conjunto debe ser una constante para incrementar los niveles de seguridad y disminuir las vulnerabilidades frecuentes inherentes al arte y la ciencia de programar.

¿Pero que pueden hacer los programadores?

Primero que nada es recomendable aprender sobre ingenieria de software, no solo para la seguridad si no para el buen funcionamiento y/o optimizacion del codigo fuente.

Algunas reglas paa una programacion segura son:

1. Menor Privilegio: Este principio establece que un sujeto sólo debe dar a un objeto los privilegios que necesita para completar sus tareas asignadas.

2. Economía y simplificación de mecanismos de seguridad: Este principio establece que los mecanismos de seguridad que se establezcan deben ser tan sencillos como sea posible.

3. Configuraciones por defecto seguras: Este principio comenta que a menos que un sujeto haya otorgado acceso explícito a un objeto, éste no debería tenerlo. Es decir, todo lo que no está estrictamente permitido es prohibido.

4. Mediación completa: Este principio afirma que todos los accesos a un objeto(s) deben ser verificados para asegurarse de que cuentan con el permiso para hacerlo.

5. Diseño abierto: Este principio establece que la seguridad de un mecanismo no debería depender del secreto o confidencialidad de su diseño o implementación.

6. Privilegios condicionados: Este principio dice que se deben mantener los privilegios necesarios en diferentes momentos, en diferentes rutinas o programas. Es decir, los privilegios no deben ser estáticos para los programas o rutinas en el tiempo y en ejecución.

7. Menor mecanismo común: Este principio comenta que deben existir el menor número de recursos compartidos entre sujetos u objetos.

8. Aceptación psicológica: Este principio comenta que el mecanismo de seguridad que se establezca para un objeto no debe sugerir mayor dificultad a la que si el mecanismo no estuviese presente. En otras palabras, el mecanismo de seguridad deber ser fácil de usar.