Lenguajes para IA

Conceptos Fundamentales de LISP

Lisp se distingue por su diseño único basado en expresiones, donde el código y los datos comparten la misma estructura básica: las listas. Este principio se conoce como homoiconicidad y es una de las razones por las que Lisp es tan poderoso.

1. Estructura y Evaluación de Expresiones

En Lisp, todo es una expresión, y las expresiones siguen la forma:

(función argumento1 argumento2 ...)

Cuando una expresión es evaluada, Lisp:

  • Evalúa los argumentos de izquierda a derecha.
  • Aplica la función al resultado de los argumentos evaluados.

Ejemplo: (+ 1 2 3) ;; Se evalúan primero 1, 2 y 3, y luego se aplica la suma -> 6

2. Átomo vs. Lista

Átomos: Son los elementos más básicos, como números, cadenas o símbolos.

42 ;; Número
"Hola" ;; Cadena
'x ;; Símbolo

Listas: Secuencias de elementos delimitadas por paréntesis.

'(1 2 3) ;; Lista de tres elementos

3. Funciones y Evaluación Diferida

Lisp permite definir funciones usando defun:

(defun cuadrado (x)
(* x x)) ;; La función devuelve el cuadrado de x
(cuadrado 5) ;; Resultado: 25

Soporta funciones de orden superior, lo que significa que puedes pasar funciones como argumentos o devolverlas.

Ejemplo con mapcar (aplica una función a cada elemento de una lista):

(mapcar #'cuadrado '(1 2 3 4)) ;; Resultado: (1 4 9 16)

4. Estructuras de Control

Lisp incluye construcciones para realizar control de flujo, como condicionales y bucles.

Condicionales:
if: Una decisión simple.
(if (> 10 5)
"Mayor"
"Menor")
;; Resultado: "Mayor"

cond: Similar a una estructura if-else múltiple

(cond
((> 10 20) "Mayor que 20")
((> 10 5) "Mayor que 5")
(t "Ninguna condición"))
;; Resultado: "Mayor que 5"

Bucles:
loop: Una forma versátil de iterar

(loop for i from 1 to 5 collect (* i i))
;; Resultado: (1 4 9 16 25)

5. Recursión: Fundamento Teórico

Lisp fue diseñado con énfasis en la recursión. Muchas funciones en Lisp se implementan recursivamente debido a su afinidad con la teoría matemática de funciones.

Ejemplo: Calcular la suma de una lista de números.

(defun suma-lista (lista)
(if (null lista) ;; Caso base: si la lista está vacía
0
(+ (car lista) (suma-lista (cdr lista))))) ;; Suma el primer elemento y recursión sobre el resto
(suma-lista '(1 2 3 4)) ;; Resultado: 10
 

 

Introducción a Prolog

Prolog (PROgramming in LOGic) fue desarrollado en los años 70 y se basa en el paradigma lógico. A diferencia de lenguajes imperativos como C o Python, en Prolog defines hechos, reglas y haces consultas para que el intérprete determine si algo es verdadero o falso.

  • Hechos: Representan afirmaciones.
  • Reglas: Representan relaciones y dependencias entre hechos.
  • Consultas: Preguntas que el programa intenta responder basándose en hechos y reglas

Sintaxis y Ejemplos Simples

1. Hechos

Un hecho es una afirmación sobre el mundo. Por ejemplo:

% Definimos algunos hechos
hombre(juan).
mujer(maria).
padre(juan, maria). % Juan es padre de María

2. Reglas

Las reglas establecen relaciones entre hechos. Tienen la forma:

resultado :- condición1, condición2, ... .

Ejemplo:

progenitor(X, Y) :- padre(X, Y).

Esto define que X es progenitor de Y si X es padre de Y.

3. Consultas

Puedes realizar preguntas a Prolog para obtener respuestas:

?- hombre(juan).   % ¿Es Juan un hombre?
true.              % Respuesta: Sí


?- mujer(juan).    % ¿Es Juan una mujer?
false.             % Respuesta: No


?- progenitor(juan, maria).  % ¿Es Juan progenitor de María?
true.

Ejemplo Completo: Árbol Genealógico

Definimos una base de conocimiento básica para representar relaciones familiares.

% Hechos
hombre(juan).
hombre(pedro).
mujer(maria).
mujer(ana).


padre(juan, maria).
padre(juan, pedro).
madre(ana, maria).
madre(ana, pedro).


% Reglas
progenitor(X, Y) :- padre(X, Y).
progenitor(X, Y) :- madre(X, Y).


hermano(X, Y) :-
    progenitor(P, X),
    progenitor(P, Y),
    X \= Y.  % X y Y no son la misma persona

4. Listas

Prolog también trabaja con listas, que se escriben entre corchetes:

% Ejemplo de lista
miembro(X, [X|_]).           % X es miembro si está en la cabeza de la lista
miembro(X, [_|T]) :- miembro(X, T). % O si está en la cola


?- miembro(3, [1, 2, 3, 4]).
true.

5. Backtracking (Retroceso)

Prolog explora todas las posibilidades para responder consultas. Si una regla no se cumple, retrocede para probar otras opciones.

Ejemplo:

color(rojo).
color(verde).
color(azul).


?- color(X).   % Encuentra todos los colores disponibles
X = rojo ;
X = verde ;
X = azul.

6. Recursión

Prolog utiliza recursión para problemas como calcular la longitud de una lista:

% Caso base
longitud([], 0).


% Caso recursivo
longitud([_|T], N) :-
    longitud(T, N1),
    N is N1 + 1.


?- longitud([1, 2, 3, 4], N).
N = 4.

Introducción a Python

Python es un lenguaje de programación de alto nivel creado por Guido van Rossum en 1991. Se utiliza en diversos campos como desarrollo web, análisis de datos, inteligencia artificial, automatización y más.

Características Principales

Sencillo y Legible: Su sintaxis es clara y fácil de aprender.
Multiplataforma: Funciona en diferentes sistemas operativos.
Interpretado: Se ejecuta línea por línea.
Multiparadigma: Soporta programación orientada a objetos, funcional e imperativa.
Gran Ecosistema: Amplia colección de librerías y frameworks (como NumPy, Django, etc.).

Teoría Básica

Sintaxis Simple: No usa llaves {} ni ;. Los bloques se definen con indentación.

if 5 > 3:
print("5 es mayor que 3")

Tipos de Datos:

Números: int, float, complex.
Texto: str.
Booleanos: True, False.
Colecciones: list, tuple, set, dict

numero = 10 # int
texto = "Hola, Python" # str
lista = [1, 2, 3] # list

Variables: No requieren declaración explícita de tipo.

x = 5
y = 2.5
print(x + y) # Resultado: 7.5

Funciones: Se definen con def.

def saludo(nombre):
    return f"Hola, {nombre}!"


print(saludo("Mundo"))  # Resultado: Hola, Mundo!

Condicionales y Bucles:

Condicional:

x = 10
if x > 5:
print("Mayor a 5")
else:
print("Menor o igual a 5")

Bucle for

for i in range(5):
print(i) # Imprime del 0 al 4

Bucle while

contador = 0
while contador < 3:
print(contador)
contador += 1

Ejemplos Prácticos:

1. Cálculo de Factorial:

def factorial(n):
    if n == 0 or n == 1:
        return 1
    return n * factorial(n - 1)


print(factorial(5))  # Resultado: 120

2. Números Pares en una Lista

numeros = [1, 2, 3, 4, 5, 6]
pares = [x for x in numeros if x % 2 == 0]
print(pares) # Resultado: [2, 4, 6]

3. Gestión de Archivos

# Crear y escribir en un archivo
with open("archivo.txt", "w") as archivo:
    archivo.write("Hola, este es un archivo de texto.")


# Leer el contenido del archivo
with open("archivo.txt", "r") as archivo:
    contenido = archivo.read()
    print(contenido)  # Resultado: Hola, este es un archivo de texto.

4. Diccionario de Contactos

contactos = {"Juan": "123-456", "María": "789-012"}


# Acceder a un valor
print(contactos["Juan"])  # Resultado: 123-456


# Añadir un nuevo contacto
contactos["Pedro"] = "345-678"


# Recorrer los contactos
for nombre, telefono in contactos.items():
    print(f"{nombre}: {telefono}")

Obra publicada con Licencia Creative Commons Reconocimiento Compartir igual 4.0

Creado con eXeLearning (Ventana nueva)