Lógica Matemática para Simulación

Universidad de Los Andes
Facultad de Ingeniería
Maestría en Modelado y Simulación de Sistemas
Lógica Matemática para Simulación
Sprint 1: ¿Cómo realizar una página web desde
Prolog?
Julio César Luna.
C.I V-13.622.337
Mérida, 04 de Febrero de 2015
Introducción
La programación lógica es un paradigma de los lenguajes de programación en el cual
los programas se consideran como una serie de aserciones lógicas. De esta forma, el
conocimiento se representa mediante reglas, tratándose de sistemas declarativos. Una
representación declarativa es aquélla en la que el conocimiento está especificado, pero en la
que la manera en que dicho conocimiento debe ser usado no viene dado. El más usado de
los sistemas de programación lógica es el PROLOG.
Un programa escrito en PROLOG puro, es un conjunto de cláusulas de Horn. Sin
embargo, PROLOG, como lenguaje de programación moderno, incorpora más cosas, como
instrucciones de Entrada/Salida, etc.
Una cláusula de Horn puede ser o bien una conjunción de hechos positivos o una
implicación con un único consecuente (un único termino a la derecha). La negación no tiene
representación en PROLOG, y se asocia con la falta de una afirmación (negación por fallo),
según el modelo de suposición de un mundo cerrado (CWA); solo es cierto lo que aparece en
la base de conocimiento o bien se deriva de esta.
Las diferencias sintácticas entre las representaciones lógicas y las representaciones
PROLOG son las siguientes:
* En PROLOG todas las variables están implícitamente cuantificadas universalmente.
* En PROLOG existe un símbolo explicito para la conjunción “y” (“,”), pero no existe uno
para la disyunción “o”, que se expresa como una lista de sentencias alternativas.
* En PROLOG, las implicaciones p –> q se escriben al revés q :- p, ya que el intérprete
siempre trabaja hacia atrás sobre un objetivo.
Reglas.
Las reglas se utilizan en PROLOG para significar que un hecho depende de uno o más
hechos. Son la representación de las implicaciones lógicas del tipo p —> q (p implica q).
Supóngase el siguiente razonamiento lógico:
tiempo(lluvioso) —-> suelo(mojado)
suelo(mojado)
Que el suelo está, mojado, es una condición suficiente de que el tiempo sea lluvioso, pero no
necesaria. Por lo tanto, a partir de ese hecho, no podemos deducir mediante la implicación,
que está, lloviendo (pueden haber regado las calles). La representación correcta en
PROLOG, sería:
suelo(mojado) :- tiempo(lluvioso).
suelo(mojado).
Sabiendo que la regla está “al revés”. Esto es así por el mecanismo de deducción hacia atrás
que emplea PROLOG. Si se cometiera el error de representarla como:
tiempo(lluvioso) :- suelo(mojado).
suelo(mojado).
PROLOG, partiendo del hecho de que el suelo está mojado, deduciría incorrectamente que
el tiempo es lluvioso.
Pregunta tipo 1:
¿Cómo generar una página web a partir de un código con html termerizado en
Prolog?
A continuación se realiza un ejemplo básico de cómo generar una página web
mediante Prolog. Se puede observar mediante una página web un breve mensaje de
bienvenida que dice: “Bienvenidos a mi página web”, para ello se realiza el siguiente código
fuente:
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/html_write)).
:- http_handler(root(bienvenidos), say_hi, []).
server(Port) :http_server(http_dispatch, [port(Port)]).
say_hi(_Request) :reply_html_page(title('Bienvenidos'),[ h2('Bienvenidos a mi página Web')]).
?-server(80).
Y se tiene como resultado,
Si se quiere darle un poco de color a la página web generada mediante PROLOG, se le agrega
la siguiente sintaxis al código fuente:
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/html_write)).
:- use_module(library(http/http_parameters)).
:- use_module(library(http/html_head)).
:- http_handler(root(bienvenidos), say_hi, []).
server(Port) :http_server(http_dispatch, [port(Port)]).
say_hi(_Request) :reply_html_page(title('Bienvenidos'),[center( h1('Bienvenido
Web'))]),format('<html><head><title></title></head><body
bgcolor="yellow"></body></html>').
?-server(80).
Y se obtiene el siguiente resultado,
a
mi
Página