informe trabajo catedras

23
x x

Upload: christian-quert

Post on 27-Jan-2016

240 views

Category:

Documents


1 download

DESCRIPTION

8x es una herramienta didáctica para el aprendizaje de la Lógica de Predicados dePrimer Orden, pudiéndose crear modelos y evaluar fórmulas en ellos.Se desarrolló como trabajo nal para las materias Análisis y Diseño de Algoritmos Iy Ciencias de la Computación II, de la carrera Ingeniería de Sistemas de la UniversidadNacional del Centro de la Provincia de Buenos Aires.

TRANSCRIPT

Page 1: Informe Trabajo Catedras

∀x

Luciano Gervasoni - [email protected]

Emmanuel Maggiori - [email protected]

Diciembre de 2011

Resumen

∀x es una herramienta didáctica para el aprendizaje de la Lógica de Predicados de

Primer Orden, pudiéndose crear modelos y evaluar fórmulas en ellos.

Se desarrolló como trabajo �nal para las materias Análisis y Diseño de Algoritmos I

y Ciencias de la Computación II, de la carrera Ingeniería de Sistemas de la Universidad

Nacional del Centro de la Provincia de Buenos Aires.

Page 2: Informe Trabajo Catedras

Índice

1. Introducción 4

1.1. Lógica de predicados de primer orden . . . . . . . . . . . . . . . . . . . . . . 41.2. Validez en todos o ningún modelo . . . . . . . . . . . . . . . . . . . . . . . . 51.3. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2. Tipos de datos abstractos 5

2.1. Diagrama de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2. TDA error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3. TDA modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.4. TDA formula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.5. TDA disyuncion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.6. TDA negacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.7. TDA predicado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.8. TDA termino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.9. TDA funcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.10. TDA variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3. Algoritmo de veri�cación 11

3.1. Recorrido del árbol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2. Métodos veri�car . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.2.1. Disyunción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.2.2. Negación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.2.3. Para todo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.2.4. Existe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.2.5. Predicado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.3. Métodos evaluar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.3.1. Función . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.3.2. Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.3.3. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.4. Complejidad temporal del recorrido del árbol . . . . . . . . . . . . . . . . . . 16

4. Analizador sintáctico-léxico 17

4.1. Gramática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.2. Léxico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.3. Clase veri�cadorFormulas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

4.3.1. Pseudocódigo del método veri�car . . . . . . . . . . . . . . . . . . . 194.3.2. Método crearAST . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

5. Modelos implementados: granja y mundo 19

5.1. Modelo granja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205.2. Modelo mundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2

Page 3: Informe Trabajo Catedras

6. Interfaz grá�ca 21

7. Conclusiones 23

3

Page 4: Informe Trabajo Catedras

1. Introducción

1.1. Lógica de predicados de primer orden

La lógica de predicados de primer orden es una extensión de la lógica proposicional.Hace uso de los mismos operadores (implicación, disyunción, conjunción y negación) peroreemplaza a las proposiciones por predicados. Éstos son funciones booleanas, que devuelvenverdadero o falso y reciben por lo menos un parámetro. Por ejemplo, "Juan y Pedro sonamigos"podría ser un predicado y se representaría de la siguiente manera:

SonAmigos(Juan, Pedro)

La novedad de la lógica de primer orden está en poder establecer un dominio (Juan,Pedro, ...) y usar variables cuanti�cadas como parámetros de los predicados. Se podría decirentonces, "Todas las personas del dominio son amigas entre sí", de la siguiente manera:

∀x∀ySonAmigos(x, y)

Se puede ver que para cuanti�car en este caso se incluyó un nuevo operador: el cuan-ti�cador universal (para todo). El segundo y último operador que se adiciona a la lógicaproposicional es el cuanti�cador existencial, que representa la existencia de al menos un ele-mento del dominio que hace válido al predicado. Se simboliza ∃. Estos dos operadores afectana la fórmula inmediatamente a la derecha, como lo hace la negación.

Se mencionó que los parámetros de un predicado pueden ser, además de constantes (ele-mentos del dominio), variables. Sin embargo, la lógica de primer orden extiende aun más estoy permite que los parámetros sean "términos": tanto variables y constantes como funciones.Las funciones reciben, al igual que los predicados, al menos un término como parámetro,y devuelven un elemento del dominio. Entonces, los predicados retornan valores de verdad(como las proposiciones) y las funciones le asocian a cada elemento del dominio, otro.

Se podría de�nir entonces, por ejemplo, una función �padre� y crear la fórmula siguiente:

SonAmigos(Juan, padre(pedro))

(son amigos Juan y el padre de Pedro). También se podría decir

∀xSonAmigos(padre(Juan), x)

y se estaría representando que el padre de Juan es amigo de todas las personas del dominio.Así, la lógica de primer orden va ganando poder y permite de�nir fórmulas mucho más

complejas y expresivas:

∃x∀ySonAmigos(padre(x), y) ∨ ∃x∀ySonAmigos(x, padre(y))

(existe una persona cuyo padre es amigo de todos o existe una persona amiga de los padresde todos). Se nota, claramente, que los límites de la lógica de primer orden son in�nitos.

Cuando se quiere evaluar la validez de las fórmulas, se puede ver que ésta debe estarnecesariamente asociada a un dominio y debe existir respuesta a los predicados y a las

4

Page 5: Informe Trabajo Catedras

funciones. En los ejemplos anteriores, si se desconoce quién es padre de quién o quién esamigo de quién, o incluso quiénes son las personas consideradas, no se podrá determinar silas fórmulas son válidas o no. A este conjunto de elementos se lo conoce como interpretacióno modelo, y es el eje principal del desarrollo de este trabajo.

1.2. Validez en todos o ningún modelo

Se mencionó que las fórmulas sólo se pueden declarar válidas en un modelo determinado.Sin embargo, hay ciertas fórmulas que se pueden, luego de analizarlas, declarar válidas entodos los modelos o en ningún modelo. Es decir, se puede deducir que una fórmula será válidaen cualquiera de los in�nitos modelos posibles, o que no lo será en ninguno.

Por ejemplo, se ve intuitivamente que es imposible que exista un modelo que haga válidaa la siguiente fórmula:

∃x(Predicado(x)∧ ∼ Predicado(x))

(nunca podrá existir un elemento del dominio que haga válido a un predicado y también asu negado, independientemente del modelo).

1.3. Motivación

Para detectar las situaciones en que una fórmula es válida en todo modelo (lógicamenteválida) o en ninguno (contradictoria), existen varios mecanismos que se estudiaron en clase,como el método de resolución o los modelos de Herbrand.

Como trabajos �nales de Ciencias de la Computación II se habían desarrollado herramien-tas que implementaban algunas de las técnicas estudiadas en la materia. Sin embargo, nohabía una herramienta para evaluar fórmulas en un modelo dado (y no en todos o ninguno).Como los modelos pueden ser in�nitos, se debería permitir al usuario crear modelos dentrode límites establecidos y haciendo uso de predicados y funciones conocidas por el programa.Se trataría de una herramienta didáctica para el aprendizaje de la lógica.

Se vio un programa de esta naturaleza desarrollado previamente por una universidadespañola llamado �Moros y Cristianos� [1]. Se decidió imitar su idea creando otros modelosy completando la lógica de primer orden al incorporar funciones.

Se buscaba también analizar el costo de los algoritmos que se implementaran y haceruso de tipos de datos abstractos y del lenguaje c++, conocimientos adquiridos en Análisis yDiseño de Algoritmos I.

2. Tipos de datos abstractos

A continuación se presentan los tipos de datos abstractos involucrados en la veri�caciónde fórmulas [4] . La solución se diseñó utilizando un conjunto de clases para representar alas fórmulas y una clase abstracta que representa al modelo. De esta manera se pudieronindependizar los métodos para veri�car fórmulas del modelo en cuestión. Así, se podría

5

Page 6: Informe Trabajo Catedras

utilizar el mismo mecanismo de veri�cación con distintos modelos. A su vez, se usó una clasepara representar al error.

Para la veri�cación también se recurrió al uso del mapa de la biblioteca estándar. Estenos permitió de�nir una instancia para las variables. Por ejemplo, cuando se cuanti�ca, seinstancia una variable en cada uno de los elementos del dominio. El mapa se puede usar paraasociar a cada variable con el elemento que se está instanciando.

A continuación se muestra un diagrama de clases y la especi�cación algebraica de lostipos de datos abstractos.

2.1. Diagrama de clases

2.2. TDA error

Representa el estado de error en la veri�cación. Puede indicar la ausencia de error, o lapresencia de error, su tipo e información asociada.

Class Error

6

Page 7: Informe Trabajo Catedras

Imports String

Basic constructors Crear, Set

E�ective

Types Error

Operations

Crear: ->Error

Set: Error x tipoError x String ->Error

getTipo: Error ->tipoError

getId: Error ->String

End-Class

2.3. TDA modelo

Es una clase abstracta que representa a un modelo y pide a sus subclases que implemententodos los métodos necesarios para la veri�cación de fórmulas.

Class Modelo

Imports String, Boolean, Set[String], Vector[String]

Basic Constructors Crear

Deferred

Types Modelo

Operations

Crear: ->Modelo

GetDominio: Modelo ->Set[String]

Veri�carPredicado: Modelo x String x Vector[String] ->Boolean

EvaluarFuncion: Modelo x String x Vector[String] ->String

EndClass

2.4. TDA formula

Representa una fórmula de la lógica de primer orden. Es una clase abstracta con unmétodo virtual veri�car. Todas las operaciones de la lógica son clases que heredan a ésta.

Class Formula

Imports Map, Modelo, Error, Boolean

Deferred

7

Page 8: Informe Trabajo Catedras

Types Formula

Operations

Veri�car: Formula x Modelo x Mapa x Error ->Boolean

End-Class

2.5. TDA disyuncion

Hereda a la clase formula y representa una disyunción lógica. Su constructor pide dosformula* que son los operandos izquierdo y derecho de la disyunción. Este mismo modelolo siguen las demás operaciones binarias de la lógica (conjunción, disyunción, implicación).Implementa el método veri�car heredado de formula.

Class Disyuncion

Inherits Formula

Basic constructors Crear

E�ective

Types Disyuncion

Operations

Crear: Formula x Formula ->Disyuncion

Veri�car: Disyuncion x Modelo x Mapa x Error ->Boolean

End-Class

2.6. TDA negacion

Hereda a la clase fórmula y representa una negación lógica. Su constructor pide unaformula* por ser una operación unaria. Implementa al método veri�car heredado de formula.Este mismo modelo siguen las clases paraTodo y existe que son las operaciones unarias queintroduce la lógica de primer orden.

Class Negacion

Inherits Formula

Basic constructors Crear

E�ective

Types Negacion

Operations

Crear: Formula ->Negacion

Veri�car: Negacion x Modelo x Mapa x Error ->Boolean

End-Class

8

Page 9: Informe Trabajo Catedras

2.7. TDA predicado

Esta clase representa a un nodo terminal del árbol asociado a una fórmula. Es el equiva-lente a la variable booleana de la lógica proposicional. La lógica de primer orden extiende lavariable booleana a predicados booleanos, que reciben parámetros. Por lo tanto, esta claseque hereda a formula, no sólo implementa el método veri�car, sino que cuenta con un miem-bro vector de términos (que son los n parámetros que recibe el predicado). Estos parámetrosson necesarios para evaluar la validez del predicado en cuestión, y en este caso el métodoveri�car se comunica necesariamente con el modelo, debido a que cada predicado tiene unsigni�cado determinado en un modelo dado.

Class Predicado

Imports Vector, Termino, vectorTerminos

Inherits Formula

Basic constructors CrearVacío,CrearLleno, AgregarTermino

E�ective

Types Predicado

Operations

CrearVacío: String ->Predicado

CrearLleno: String x vectorTerminos ->Predicado

AgregarTermino: Predicado x Termino ->Predicado

Veri�car: Predicado x Modelo x Error ->Boolean

End-Class

2.8. TDA termino

Como se mencionó anteriormente, el TDA predicado contiene un vector de términos. Eltérmino se representó mediante este TDA abstracto. Los términos en la lógica de primerorden pueden ser variables/constantes o funciones. Este TDA termino cuenta con un métodoevaluar que devuelve un elemento del dominio asociado al término. Por ejemplo, si el términoen cuestión fuera una función, evaluar devolverá el elemento del dominio correspondiente ala evaluación de esa función en el modelo. Si fuera una variable, devuelve el elemento deldominio en el que está cuanti�cada la variable en el momento.

Class Termino

Imports Map, Modelo, Error, String

Basic constructors

E�ective

Types Termino

9

Page 10: Informe Trabajo Catedras

Operations

Evaluar: Termino x Modelo x Mapa x Error ->String

End-Class

2.9. TDA funcion

Representa a una función de la lógica de primer orden y hereda a la clase termino. Espe-ci�ca su método evaluar. Tiene un miembro vector de termino* que le asocia los parámetrospara evaluar la función. El método evaluar deberá comunicarse con el modelo para devolverun valor.

Class Funcion

Imports Vector, vectorTerminos

Inherits Termino

Basic constructors CrearVacío, CrearLleno, AgregarTermino

E�ective

Types Funcion

Operations

CrearVacío: String ->Funcion

CrearLleno: String x vectorTerminos ->Funcion

AgregarTermino: Funcion x Termino ->Funcion

Evaluar: Funcion x Modelo x Mapa x Error ->String

End-Class

2.10. TDA variable

Representa a una variable de la lógica de primer orden e implementa el método evaluarheredado de la clase termino. Este método es el responsable de devolver un elemento deldominio que se encuentre asociado a esta variable según el mapa de instancias.

Class Variable

Inherits Termino

Basic constructors Crear

E�ective

Types Variable

Operations

Crear: String ->Variable

Evaluar: Variable x Modelo x Mapa x Error ->String

End-Class

10

Page 11: Informe Trabajo Catedras

3. Algoritmo de veri�cación

3.1. Recorrido del árbol

Se vio anteriormente que cada elemento de la lógica, representado con un TDA, tiene unconstructor que lo asocia a otros elementos de la lógica. De esta manera, se puede ver que lamanera en que se está modelando una fórmula es un árbol. Los nodos internos del árbol sonoperaciones (sean unarias o binarias) y las hojas son predicados.

Ejemplo:

La estrategia de resolución consiste en hacer un recorrido post-orden del árbol, en el cualse accede a las hojas, se las evalúa en el modelo, y se empieza a hacer un recorrido haciaatrás en el cual se van aplicando las operaciones hasta llegar a la raíz.

Hay una situación en la que se opera también pre-orden, es decir, en el recorrido hacia lashojas. Es el caso de los cuanti�cadores. Lo que se hace ante la presencia de un cuanti�cadores repetir lo que queda del recorrido varias veces. Es decir, se itera las veces necesarias,con distintas instancias para la variable cuanti�cada, hasta poder determinar la validez delcuanti�cador. Por ejemplo, si hay un �existe x�, lo que queda del recorrido hasta las hojasse repetirá varias veces para cada elemento del dominio (recurriendo al mapa de instancias).Basta encontrar un x que haga que la veri�cación del subárbol en cuestión devuelva verdaderopara determinar que el �existe x� se cumple, y se puede dejar de iterar.

Ejemplo:

11

Page 12: Informe Trabajo Catedras

3.2. Métodos veri�car

3.2.1. Disyunción

A continuación se muestra el pseudocódigo del método veri�car de una disyunción.

bool tempIzq = izquierda->veri�car(modelo,instancia,error); //veri�co la validezdel hijo izquierdo

si no hubo error, sigo;

bool tempDer = derecha->veri�car(modelo,instancia,error); //veri�co la validezdel hijo derecho

si no hubo error, sigo;

devuelvo (tempIzq OR tempDer);

Se puede ver que la estrategia es llamar al método veri�car de ambos hijos y luego, en funciónde sus valores de verdad, usar el operador lógico correspondiente de c++ para devolver elresultado. Los demás operadores binarios realizan un proceso análogo (con AND para laconjunción y NOT A OR B para la implicación).

Se debe notar que no se modi�ca ni se usa el mapa de instancias, así como tampoco existeun error que se asocie a este método. En cambio, sí se veri�ca si hubo error en alguno de loshijos para no continuar innecesariamente.

3.2.2. Negación

A continuación se muestra el pseudocódigo de la operación unaria negación:

devuelvo (!(hijo->veri�car(modelo,instancia,error)));

Este método simplemente devuelve la negación del valor de verdad de la veri�cación del hijo.

3.2.3. Para todo

Pseudocódigo del método veri�car de la clase paraTodo:

dominio = le pido el dominio al modelo;

busco a la variable cuanti�cada en el dominio;

si la encuentra, error; //porque no se puede cuanti�car una constante

si no hubo error, sigo;

busco si ya se encuentra la variable instanciada en el mapa;

si es así, la guardo temporalmente en temp;

bool resultado = true;

mientras (queden elementos en el dominio por veri�car,

12

Page 13: Informe Trabajo Catedras

y resultado sea true,

y no haya error) {

asocio (en el mapa) la variable en cuestión con un elemento del dominio (queno haya sido asociado aún);

resultado = hijo->veri�car(modelo,instancia,error);

}

si no hay error, sigo;

recupero el estado anterior del mapa para esta variable (guardado en temp);

devuelvo resultado;

Se puede ver que lo que se hace es iterar para cada elemento del dominio las veces necesariashasta terminar con todos los elementos del dominio o, en caso de que una instancia devuelvafalse, termino (dado que, justamente, no se cumple para toda instancia). En caso de encontraruna error, se deja de iterar.

Antes de empezar se guarda el estado del mapa para la variable cuanti�cada y luego se loreestablece. Esto se hace por si se da el caso de que se emplee una fórmula del siguiente tipo:∀x(Predicado(x)∧∀xOtroPredicado(x)) (donde se usa la misma variable para cuanti�car condistintos alcances).

3.2.4. Existe

Pseudocódigo del método veri�car de existe:

dominio = le pido el dominio al modelo;

busco a la variable cuanti�cada en el dominio;

si la encuentra, error; //porque no se puede cuanti�car una constante

si no hubo error, sigo;

busco si ya se encuentra la variable instanciada en el mapa;

si es así, la guardo temporalmente en temp;

bool resultado = false;

mientras (queden elementos en el dominio por veri�car,

y resultado sea false,

y no haya error) {

asocio (en el mapa) la variable en cuestión con un elemento del dominio (queno haya sido asociado aún);

resultado = hijo->veri�car(modelo,instancia,error);

}

13

Page 14: Informe Trabajo Catedras

si no hay error, sigo;

recupero el estado anterior del mapa para esta variable (guardado en temp);

devuelvo resultado;

Análogamente al método veri�car de paraTodo, se realizan las veri�caciones de errores co-rrespondientes y se itera con los elementos del dominio. La condición de corte de la iteraciónes distinta: se itera mientras no se haya encontrado una instancia que devuelva verdadero.En caso de encontrarla se determina la validez del existe y se deja de iterar.

3.2.5. Predicado

Un predicado se forma con un identi�cador del predicado (el nombre) y un vector detérminos. Ese vector puede contener tanto funciones como variables. Para decidir la validezo no de un predicado es necesario comunicarse con el modelo en cuestión y para eso se debellamar a la función veri�carPredicado del modelo. Esta función recibe como parámetro unvector de constantes. Por ejemplo, un modelo tiene la capacidad de decidir si Predicado(a,b)es válido. En cambio, no decide si Predicado(f(a),b) lo es. Por lo tanto, antes de efectuar laconsulta al modelo, se deben evaluar los parámetros del predicado. Por ejemplo, llamar almétodo evaluar para f(a) devolverá una constante que responde a esa función en el modelo.Luego de llamar al método evaluar para cada uno de los términos asociados al predicado,y construir el vector de constantes, se puede llamar al método veri�carPredicado con estevector. Más adelante se detalla el funcionamiento de los métodos evaluar.

Pseudocódigo:

crear un vector consulta;

para cada término i del predicado

agregar al vector (el resultado de evaluar al término i);

si no hay error, sigo;

bool resultado = modelo.veri�carPredicado(con el vector consulta);

si no hay error, sigo;

devolver resultado;

3.3. Métodos evaluar

3.3.1. Función

Como la clase funcion hereda a termino es necesario especi�car su método evaluar. Estemétodo debe devolver el resultado de evaluar la función en el modelo en cuestión, es decirotro elemento del dominio.

Como una función tiene una serie de parámetros, análogamente al predicado, se llamaprimero al método evaluar de cada parámetro y luego se llama a un método evaluarFunciondel modelo.

Pseudocódigo:

14

Page 15: Informe Trabajo Catedras

crear un vector consulta;

para cada término i de la función

agregar al vector (resultado de evaluar al término i);

si no hay error, sigo;

string elemento = modelo.evaluarFuncion(con el vector consulta);

si no hay error, sigo;

devolver elemento;

3.3.2. Variable

El método evaluar de una variable es el encargado de usar el mapa de instancias. En estepaso se determina si la variable en cuestión es, en realidad, una constante. Si no es así esnecesario encontrar una instancia para esta variable en el mapa (que haya sido cuanti�cada)y sino es el caso de que sea libre.

Pseudocódigo:

si está la variable en el mapa

temp = instancia de la variable; //estaba cuanti�cada

sino

temp = variable; //no estaba cuanti�cada

si está temp en el dominio

devuelvo temp;

sino

error; //la variable es libre

15

Page 16: Informe Trabajo Catedras

3.3.3. Ejemplo

3.4. Complejidad temporal del recorrido del árbol

Se deseó evaluar la complejidad del recorrido del árbol que representa la fórmula. Cuandose busca calcular la complejidad se debe de�nir en función de qué variable se considerael tamaño de la entrada. En este caso, se buscó de�nir la complejidad en función de lacantidad de operadores lógicos. Se consideró, en cambio, que el costo de veri�car predicadoses constante (porque veri�car un predicado es dependiente del modelo).

Se vio que la presencia de cuanti�cadores altera considerablemente la cantidad de opera-ciones, por iterar en función del dominio. Entonces, para simpli�car los cálculos, se decidiócrear un árbol genérico que represente el peor de los casos en función de la cantidad deoperadores.

Si se considera un árbol determinado que tiene un cuanti�cador en alguna posición, lacantidad de pasos necesaria para resolver la fórmula es peor cuanto más cerca de la raíz esté

16

Page 17: Informe Trabajo Catedras

el cuanti�cador. Esto se debe a que el cuanti�cador repite reiteradas veces el recorrido delárbol que se encuentra por debajo de él. Entonces, se elaboró un árbol en el cual todos loscuanti�cadores se encuentran en la raíz. A continuación, se ubican todos los demás operadoreslógicos. Finalmente, se encuentran los predicados en las hojas.

Se puede ver que recorrer la parte del árbol posterior a los cuanti�cadores, tiene un costode n, siendo n la cantidad de operadores. Es decir, para resolver una fórmula no cuanti�cada,alcanza con visitar una vez cada nodo. Si se añade un cuanti�cador por encima de este árbol,se realizará el recorrido anterior d veces (siendo d el tamaño del dominio). Por lo tanto,un total de dn veces. Supongamos que se añade un segundo cuanti�cador. Lo anterior serealizará d veces. Se tienen entonces d²n pasos. Podemos concluir de esta manera que parak cuanti�cadores se realizan dkn pasos.

La complejidad temporal del recorrido resulta ser, entonces, del orden O(dkn).Al observar el resultado se puede ver que lo que resulta ser de mayor peso en la complejidad

es la cantidad de cuanti�cadores. Justamente, son los cuanti�cadores la novedad que aportala lógica de predicados de primer orden a la lógica proposicional, y es curioso notar que seanlo que introduce mayor di�cultad en la resolución de las fórmulas.

4. Analizador sintáctico-léxico

Hasta ahora se describió la veri�cación de fórmulas mediante el uso de un árbol querepresenta a la fórmula en cuestión. La creación del árbol a partir de una cadena de texto serealiza mediante un parser, generado por Bison Parser Generator [2]. Para la identi�caciónde subsecuencias en la cadena (análisis léxico) se empleó Flex [6].

El análisis sintáctico se representa en el archivo de con�guración de Bison mediante unagramática libre de contexto, y esta se usa para reconocer la sintaxis. A medida que se reco-noce la cadena se van ejecutando �acciones semánticas� en las cuales se realizan dos tareas:construir el árbol de sintaxis abstracta (mediante las clases diseñadas para representar a lasfórmulas de la lógica) y mantener estructuras que lleven un control de las estructuras creadas(para poder destruirlas en caso de que la cadena en un punto no respete la sintaxis).

Para que se realice correctamente el análisis sintáctico-léxico se deben comunicar el parsercon el escáner. El parser está diseñado para operar en función de los �tokens� que reciba delescáner. Un token es, por ejemplo, PARATODO o incluso COMA. Por lo tanto, en el parser se

17

Page 18: Informe Trabajo Catedras

de�ne la gramática (sintaxis) [7] y en el escáner los tokens que se deberán reconocer (léxico).

4.1. Gramática

A continuación se presenta la gramática empleada para con�gurar el parser. Para hacerlomás legible, se reemplazó a los tokens que representan caracteres (COMA, AND) por susrespectivos caracteres. Los tokens IDVAR, IDPRED e IDFUNC se dejaron de esa manera yde ellos se habla más adelante.

comienzo := cond //para realizar acciones al principio

cond := disy � cond | disy

disy := conj∨disy | disy

conj := factor∧conj | factor //factor se llama a una unidad cuanti�cada o negada

factor :=∀ IDVAR factor | ∃ IDVAR factor | ¬ factor | ( cond ) | pred

pred := IDPRED ( terms ) //terms representa una lista de términos

terms := term | terms , term

term := IDVAR | IDFUNC ( terms )

4.2. Léxico

Para la con�guración del escáner se de�nieron tokens para identi�car operadores lógicosy demás caracteres necesarios (paréntesis, comas). En el caso de los operadores lógicos sebuscó que se pudieran representar mediante el carácter conocido y trabajado en clase, perotambién uno alternativo que se encuentre fácilmente en el teclado. Se de�nieron, entonces,las siguientes alternativas:

Para todo: "∀", "@"Existe: "∃", "#"

Negación: "¬", "~"

Disyunción: "∨", "|"

Conjunción: "∧", "&"

Implicación: "�", "=>"

También se debieron de�nir los tokens para identi�car variables, funciones y predicados(IDVAR, IDFUNC, IDPRED). Los tres debían ser distinguibles entre sí. Se decidió quelas variables deberían identi�carse con una serie de minúsculas (por ejemplo, �x�) y lasfunciones con una serie de mayúsculas (por ejemplo, �ELMASALEJADO� . Los predicadosdebían contar con un primer carácter en mayúscula y el que sigue en minúscula (por ejemplo,EsCapital).

18

Page 19: Informe Trabajo Catedras

4.3. Clase veri�cadorFormulas

Para ejecutar el análisis sintáctico-léxico se implementó una clase llamada veri�cadorFor-mulas. Esta clase realiza todas las tareas necesarias para determinar si una fórmula es válidao no en un modelo dado. Tiene un único método público veri�car, al cual se le pasa unacadena de texto, un puntero a un modelo y un puntero a un error. Este método se encargade devolver true o false (evaluando a la fórmula en el modelo) y, en caso de haber un error,quedará de�nido en el objeto correspondiente.

4.3.1. Pseudocódigo del método veri�car

formula* raíz = crear árbol de sintaxis abstracta;

si no hay error, sigo; //los errores en este punto pueden haber sido de sintaxis ode léxico

si el tamaño del dominio del modelo es cero

error; //la lógica de primer orden prohíbe dominios vacíos

si no hay error, sigo;

creo un mapa de instancias vacío;

return raíz->veri�car(modelo, instancia, error);

4.3.2. Método crearAST

Este método privado busca crear el árbol de sintaxis abstracta a partir de una cadena detexto. Realiza las siguientes tareas:

De�ne un archivo temporal (solicitando al sistema operativo la ruta donde se almacenanlos archivos temporales)

Crea un archivo en ese lugar y le carga la cadena de texto correspondiente

Asocia al parser con ese archivo (mediante la función yyrestart)

Ejecuta el parsing de la cadena (mediante yyparse)

Ante algún error lo de�ne en el objeto error y devuelve una raíz del árbol nula

Si no hubo error devuelve la raíz del árbol generado por el parser

5. Modelos implementados: granja y mundo

Se buscó implementar dos modelos distintos para esta aplicación, de interés para el apren-dizaje de la lógica. Se hablará de modelos, por simpleza, pero en realidad el modelo es lainstancia que crea el usuario. Las clases modeloGranja y modeloMundo permiten representar

19

Page 20: Informe Trabajo Catedras

a una instancia de esos modelos. Ambas heredan a la clase abstracta modelo y, por lo tanto,deben implementar sus métodos virtuales. Estos son getDominio (que devuelve el dominio),veri�carPredicado y evaluarFuncion. Además, en cada uno se añadió lo que se considerónecesario para el funcionamiento del modelo.

5.1. Modelo granja

Este modelo consiste en una imagen de una granja, sobre la cual se pueden agregaranimales en distintos lugares. Cada animal tiene sus atributos, que son la especie, la ubicacióny si está dormido. Se establecieron predicados para este modelo, especialmente enfocándoseen las distintas posibilidades de cuanti�car los animales. Por ejemplo, se escribió el predicadoEsAve por incluir tanto a las gallinas como a los patos.

Se quiso de�nir también una función, lo cual aporta la di�cultad de tener que devolversiempre un elemento del dominio, dado otro. Se incluyó entonces ELMASCERCANO, quedado un animal devuelve el más lejano en la imagen, o él mismo de ser el único. El modelose implementó usando un conjunto de strings para identi�car a los animales, y un mapa queasocia un registro de atributos a cada animal.

Se de�nieron, �nalmente, los siguientes predicados:

MismoLugar(x,y)

EstaDormido(x)

MismaEspecie(x,y)

EsMamifero(x)

EsAve(x)

EstaEnElCorral(x)

EstaEnElBosque(x)

EstaEnElPasto(x)

EstaEnElAire(x)

EsVaca(x)

EsChancho(x)

EsPato(x)

EsGallina(x)

20

Page 21: Informe Trabajo Catedras

5.2. Modelo mundo

Este modelo consiste en un planisferio dividido en continentes sobre el cual se pudieranubicar ciudades (capitales o no) y conectarlas entre sí. La idea de este modelo era trabajarsobre predicados relacionados con las conexiones entre las ciudades, además de la ubicacióngeográ�ca y su condición de ciudad capital.

Se escribió la función LAMASALEJADA que retorna para cada ciudad la más alejada enel mapa a ésta.

Se utilizó un planisferio alternativo al que se ve comúnmente, para poder marcar bien ladiferencia entre Europa y Asia que no existe desde lo geográ�co en realidad, pero se estudiannormalmente como continentes separados.

Para implementarlo se uso un conjunto de strings para representar las ciudades, un mapade atributos y un grafo para representar las conexiones.

Los predicados que se de�nieron fueron los siguientes:

EsCapital(x)

MismoContinente(x,y)

SonIguales(x,y)

EstaEnAfrica(x)

EstaEnAmerica(x)

EstaEnAsia(x)

EstaEnEuropa(x)

EstaEnOceania(x)

HayConexion(x,y) - conexión directa, HayConexion(x,x) es verdadero

SePuedeLlegar(x,y) - conexión indirecta, SePuedeLlegar(x,x) es verdadero

EstaMasAlSur(x,y)

6. Interfaz grá�ca

La interfaz grá�ca se diseñó utilizando las librerías Qt 4.7 y usando el entorno de desarrolloQT Creator. [5]

Se querían cumplir una serie de objetivos. Debido a que se planteó como una herramientadidáctica para enseñar la lógica de primer orden, las fórmulas debían lucir de la mismamanera que lucen cuando se estudian en clase. Es decir, usar los mismos símbolos y demanera intuitiva.

21

Page 22: Informe Trabajo Catedras

Se quería remarcar que la validez de una fórmula depende del modelo en que se evalúe, ypor eso se consideró necesario crear más de un modelo y que se pudiera trabajar con variosa la vez, y veri�car las mismas fórmulas en los distintos modelos.

La solución a la posibilidad de emplear varias ventanas en simultáneo la dio el componenteMDI de Qt. Este componente permite visualizar varias ventanas en un mismo espacio. Seempleó de la siguiente manera: se creó una ventana principal con las funciones comunes atodos los modelos, como abrir, guardar y veri�car fórmulas en un modelo. Se incluyeron doscomponentes MDI, uno para visualizar múltiples modelos, y otro para visualizar múltiplesfórmulas.

La veri�cación de fórmulas se realiza utilizando el modelo que esté activo dentro del MDIde modelos y la ventana de fórmulas que esté activa en el MDI de fórmulas.

El MDI correspondiente a las fórmulas, muestra ventanas de un tipo que se creó utilizan-do el diseñado de Qt Creator. El MDI correspondiente a los modelos, en cambio, muestrauna clase abstracta ventanaModelo, que hereda a la clase vetana de Qt, pero le agrega mé-todos virtuales que permiten obtener el modelo asociado a la ventana y así poder veri�carlas fórmulas. Se diseñaron dos modelos, Granja y Mundo. Para ambos se diseñó la ventanacorrespondiente (heredando a ventanaModelo). En ambos modelos se usó como eje del diseñoa los componentes QGraphicsView y QGraphicsScene, que están pensados para mostrar mu-chos elementos de tipo QGraphicsItem. Fue de mucha utilidad porque nos permitió asociar alos elementos del dominio con los ítems. El componente cuenta con diversos métodos grá�cospara administrar y visualizar a los ítems dentro de la escena. Por ejemplo, los ítems se puedenmover con el mouse y se puede hacer zoom en la escena, y todo esto ya viene implementadocon el componente.

Para incorporar estos componentes se usaron como referencia los ejemplos de la docu-mentación de

Qt. Como se quería que la interfaz fuera intuitiva, justamente por el �n didáctico dela aplicación, se usaron barras de herramientas e íconos. Las imágenes se obtuvieron en sutotalidad de www.openclipart.org por ser de dominio público y se las editó mediante Inkscape.

Para poder guardar modelos y fórmulas se utlizó XML, empleando la clase QDomDocu-ment de�nida en la librería Qt. La clase abstracta ventanaModelo pide que se implementendos métodos relacionados, que son representacionXML (que debe devolver un QDomDocu-ment asociado al modelo, para poder guardarlo) y cargarXML (que debe poder cargar elmodelo a partir de un QDomDocument).

22

Page 23: Informe Trabajo Catedras

7. Conclusiones

Este trabajo permitió integrar los contenidos aprendidos en dos materias de distintanaturaleza, lo que lo convierte en una herramienta aplicada. Sirvió tanto para hacer uso delas técnicas de programación que se aprendieron, como para a�anzar los conocimientos enlógica.

Fue también llamativa la utilidad que tuvieron conocimientos anteriores, como las gra-máticas libres de contexto para resolver el problema del análisis sintáctico.

Se trató también de la primer experiencia en la implementación de una interfaz grá�ca,lo cual fue muy positivo haciendo uso del framework Qt. Para el desarrollo de la interfaz fueclave recurrir constanmente a la documentación y seguir ejemplos, un hábito indispensable ala hora de programar.

Referencias

[1] Departamento de Ciencia de la Computación e Inteligencia Arti�cial de la Universidad deAlicante. Moros y cristianos. http://www.dccia.ua.es/logica/MyC.

[2] Free Software Foundation. Bison - gnu parser generator manual.http://www.gnu.org/s/bison/.

[3] Virginia Mauco. Ciencias de la computación ii, apuntes.http://ccomp2.alumnos.exa.unicen.edu.ar.

[4] B. Meyer. Object-Oriented Software Construction, chapter 6. Prentice Hall, 1997.

[5] Nokia. Online reference documentation. http://doc.qt.nokia.com/.

[6] Flex Project. Lexical analysis with �ex. http://�ex.sourceforge.net/manual/.

[7] Virginia Mauco Rosana Barbuzza. Ciencias de la computación i, apuntes. http://ciencias-de-la-computacion-i.alumnos.exa.unicen.edu.ar.

23