XML e JAVA no Desenvolvimento de um Editor de Fórmulas do

Propaganda
XML e JAVA no Desenvolvimento de um Editor de
Fórmulas do Cálculo de Predicados
Carlos Eduardo de Lima, Edeilson Milhomem da Silva, Lucas Roberto Bechert
Schmitz, Parcilene Fernandes de Brito, Fabiano Fagundes
Curso de Sistemas de Informação – Centro Universitário Luterano de Palmas (CEULP)
Palmas, TO, Brasil
{careli, milhomem, lucas, pfb, fagundes}@ulbra-to.br
Resumo
Neste artigo são apresentados conceitos das linguagens JAVA e XML
utilizados para o desenvolvimento de um editor de fórmulas do Cálculo de
Predicados. Para isso, foram apresentadas as etapas de construção da
linguagem PCML, desenvolvida em XML para a verificação da validação das
fórmulas, e a utilização das APIs DOM e SAX para a manipulação do
documento XML no ambiente JAVA.
1 Introdução
O objetivo do presente artigo é apresentar as etapas de desenvolvimento de um editor de
Fórmulas do Cálculo de Predicados. As etapas vão desde a concepção da estrutura do
documento necessária para a validação das fórmulas até a comparação entre as APIs da
linguagem de programação JAVA que foram utilizadas para o desenvolvimento do editor no
ambiente JAVA.
O editor faz parte do projeto de construção de um provador de Teoremas em JAVA, assim,
neste artigo será apresentada a parte inicial do projeto, ou seja, a definição de métodos
eficientes para o tratamento das fórmulas do Cálculo de Predicados inseridas pelo usuário.
Conceitos de XML, JAVA e das API’s DOM e SAX serão apresentados na seção 2. Na
seção 3 será apresentada uma proposta de uma linguagem de marcação para o Cálculo de
Predicados. Esta linguagem é descrita na seção 4 juntamente com a utilização das API’s
JAVA DOM e SAX no editor de Fórmulas. A seção 5 apresenta as considerações finais e as
conclusões.
2 XML e JAVA
Nesta seção serão apresentados conceitos de duas linguagens de programação utilizadas
neste trabalho: XML e JAVA.
2.1 XML
XML – eXtensible Markup Language (Linguagem de Marcação Extensível) é uma
linguagem de marcação que surgiu para expandir as capacidades do HTML – HyperText
Markup Language (Linguagem de Marcação de Hipertexto). Linguagens de marcação são
linguagens que descrevem a estrutura de um documento, ou seja, como estão dispostas as
informações do documento. As linguagens de marcação determinam a forma de como o
documento está estruturado, e de acordo com essa estrutura, determinam como ele será
apresentado. Regras explícitas determinam onde estas estruturas começam e terminam através
de marcas (tags) que são colocadas antes e depois do conteúdo associado [KIRK and
PITTS-MOULTIS, 2000], [MCGRATH, 1999], respectivamente tag de início e tag de
fim.
Os documentos descritos em XML baseiam-se em três componentes distintos: estrutura,
conteúdo e apresentação. Isso facilita o processo de alterações posteriores, pois com a XML
é possível alterar o conteúdo de um documento sem alterar o seu modo de exibição, ou viceversa.
A estrutura é definida através de uma DTD (Document Type Definitions) em que estão
contidas as informações e elementos responsáveis pela organização do documento
[MCGRATH, 1999], ou seja, é na definição do tipo do documento que serão especificadas
as marcações da linguagem que está sendo desenvolvida. O conteúdo é o valor atribuído, em
um arquivo XML, para a estrutura definida no DTD.
O DTD é um arquivo, que pode ser feito separado do documento XML ou junto ao próprio,
que fornece um conjunto de regras para o documento XML ao qual ele está anexado. No
arquivo DTD serão definidos os tipos de elementos que serão permitidos dentro do
documento XML, as características, atributos e conteúdos de cada elemento, notações que
podem ser encontradas em um documento e as entidades que podem ser utilizadas [KIRK
and PITTS-MOULTIS, 2000], (Figura 1).
1.<!ELEMENT autor (#PCDATA)>
2.<!ELEMENT titulo (#PCDATA)>
3.<!ELEMENT
artigo
(AUTOR+,
CONTEUDO)>
4.<!ELEMENT conteudo (#PCDATA)>
TITULO,
Figura 1 – exemplo de uma DTD com quatro elementos e um atributo.
A vantagem de se criar uma linguagem de marcação é que esta oferecerá a liberdade de
agrupar os dados da maneira que precisa, ao invés de ter que se adaptar com a maneira que
outros criaram para agrupar dados [MCGRATH, 1999].
2.2 JAVA
JAVA é uma linguagem de programação baseada nos conceitos da orientação a objetos e
que tem como uma de suas características o fato de ser multiplataforma, ou seja, um
programa escrito em JAVA pode ser executado em várias plataformas (Sistemas
Operacionais) diferentes. Isso se deve ao fato de ser uma Linguagem interpretada. O JAVA
oferece várias APIs – JAVA Applications Programming Interface (conjunto de classes
predefinidas) – para as mais diversas aplicações, entre elas estão a DOM (Document Object
Model) E SAX (Simple API for XML), APIs JAVA para a manipulação de documentos
XML.
2.2.1 DOM (Document Object Model)
O DOM (Document Object Model) é uma API que define uma funcionalidade padrão para
navegação e manipulação de conteúdo e de estrutura em documentos XML e HTML. O
DOM transforma o arquivo de texto (documento XML) em uma estrutura de árvore, assim,
podemos evitar problemas como marcas não fechadas e marcas aninhadas de maneira
inadequada [ANDERSON, 2001], já que cada elemento é considerado como um nó da
árvore gerada.
Uma vantagem do DOM para manipular documentos XML é que ele tem acesso aleatório, ou
seja, o nó pode ser criado ou anexado a qualquer momento e em qualquer lugar da árvore
XML. Ele evita relacionamentos inadequados de pai-filho e informações associadas,
garantindo assim, boa formação e gramática adequada.[ANDERSON, 2001]
Figura 2 – Representação do Modelo Conceitual.[FEDERIZZI, 2002] – Modificada
De acordo com a figura 2, a API DOM analisa um documento XML, validado opcionalmente
por uma DTD, a partir da utilização de um Parser que faz a leitura do documento e o
armazena na memória no formato de uma árvore. Sendo assim, o conteúdo e a estrutura do
documento são identificados e, na utilização dos métodos existentes na API DOM, a árvore
gerada pode ser manipulada.
2.2.2 SAX – (Simple API for XML)
A SAX (Simple API for XML) é uma interface que permite escrever aplicações para ler
documentos XML. Ela fornece o beneficio de se poder analisar um arquivo XML de qualquer
tamanho, já que, contrária ao DOM, ela não carrega o documento inteiro na memória. A
SAX se mostra muito útil quando se quer criar sua própria estrutura de dados e também
quando se quer apenas um pequeno subconjunto de informações.[ANDERSON, 2001]
Sendo assim, a SAX não tem métodos que permitem a alteração do documento gerado, ela o
acessa apenas em modo de leitura.
A SAX pode ser definida como uma interface JAVA que permite escrever aplicações para ler
dados contidos em um documento XML. Ela é uma interface baseada em eventos, que são
disparados sempre que é encontrado algum elemento no documento XML, esses eventos são
disparados na abertura e no fechamento do documento, dos elementos e quando são
encontrados os caracteres.[ANDERSON, 2001]
O parser que implementa a SAX acessa de forma seqüencial o documento XML efetuando
apenas a leitura do mesmo. Disparando eventos sempre que há um início e o fim de uma tag,
e para cada trecho de caracteres. Desta forma, o parser lê o documento XML sem a
necessidade da criação de um modelo de objeto na forma de árvore, tornando-se, assim,
mais rápido. A Figura 3 apresenta o funcionamento do parser que implementa o SAX.
Figura 3 – Representação do Funcionamento do paser que implementa o
SAX.(Federizzi, 2002) – Modificada
3 Uma linguagem de marcação para o Cálculo de Predicados
Tendo em vista a complexidade dos termos da lógica de predicados, uma linguagem de
marcação que melhor descreva e estruture esses termos vem a facilitar a compreensão dos
mesmos por parte de alguém que esteja iniciando seus estudos na lógica formal. Uma das
etapas para a definição de uma linguagem de marcação que estruture o termos da lógica de
predicados é definir como estes termos são formados.
Pode-se verificar nas seções anteriores que as linguagens de marcação permitem estruturar
documentos de forma que cada parte deste possa ser facilmente identificada e acessada. Uma
outra vantagem das linguagens de marcação, é que as mesmas facilitam a interpretação da
estrutura de algum domínio, como ocorre com o MathML que facilita a interpretação de
termos matemáticos e também facilita o entendimento de como são formados alguns
elementos da matemática. Isto também ocorre com o CML, que facilita o entendimento de
como são formados alguns elementos químicos.
A lógica das proposições (no qual está inserido o Cálculo Proposicional) parte da noção de
acontecimento ou de fato. A proposição (que pode ser representada por uma letra do
alfabeto, exemplo P) representa um fato: “O Pedro está doente”, “A Patrícia estuda”. A
Lógica dos Predicados (no qual está inserido o Cálculo de Predicados) parte da noção de
objeto. Trata-se então de definir o objeto, situando-o numa classe que poderá ser ligada a
outras classes. [THIRY, 1996].
Quando se trata de Lógica de Predicados, deve-se levar em consideração não apenas a
proposição, mas também a classe a qual ela pode ou não pertencer. Para isso usam-se os
quantificadores Universal e Existencial. Usa-se o quantificador universal quando se afirma que
uma proposição está, ou não, totalmente incluída em uma classe. Usa-se o quantificador
existencial quando se pode afirmar pelo menos a existência, ou não, de alguma proposição
em determinada classe [COPI, 1978].
O Cálculo de Predicados possui uma linguagem bem definida. Segundo [NOLT, 1991], esta
linguagem é dividida em duas partes: os símbolos lógicos (cuja interpretação permanece fixa
em todos os contextos) e os símbolos não-lógicos (cuja interpretação varia de problema para
problema).
Símbolos Lógicos: operadores lógicos: ‘~’,’? ’,’? ’,’? ’,’? ’; quantificadores: ‘? ’,’ ? ’;
parênteses: ‘(’,’)’. Símbolos Não-Lógicos: letras nominais: letras minúsculas de ‘a’ a ‘t’;
variáveis: letras minúsculas de ‘u’ a ‘z’; letras predicaditivas: letras maiúsculas;
Nem toda construção a partir da utilização destes símbolos pode resultar numa fórmula
correta do Cálculo de Predicados, daí a importância do conceito de Fórmula Bem Formada
(FBF). O conceito de FBF do Cálculo de Predicados é definido pelas seguintes regras de
formação [NOLT, 1991]:
1. Toda formula atômica é uma FBF;
2. Se ? é uma FBF, então sua negação também o é;
3. Se ? e ? são FBFs, então (? ? ? ), (? ? ? ), (? ? ? ), (? ? ? ) são FBFs;
4. Se ? é uma FBF contendo uma letra nominal ? , então qualquer fórmula da forma ? ?
? ? ?? ou ? ? ? ? ?? é uma FBF, onde ? ? ?? é o resultado de se substituir uma ou mais
ocorrências de ? em ? por uma variável ? que ocorre em ? .
Uma fórmula do cálculo de Predicados pode ser considerada um argumento dedutivo, ou
seja, dada um conjunto de premissas verdadeiras, infere-se uma conclusão verdadeira.
Podendo também existir um argumento dedutivo sem o conjunto de premissas, desta forma, a
conclusão não necessita de outros fatos para ser provada, ela é necessariamente verdadeira,
a isso denominamos teoremas ou axiomas. Podemos verificar na figura 4 um exemplo de um
teorema e de uma fórmula composta por premissa e conclusão, ambos sendo fórmulas bem
formadas.
1.Exemplo de argumento com premissas:
P? C, P C
2.Exemplo de
(Teorema):
argumento
sem
premissas
P? (P? C)
Figura 4 – Exemplo de um teorema e de uma fórmula bem formados
No editor citado neste trabalho será dada ênfase a utilização correta dos símbolos, ou seja, se
um condicional foi formado
necessariamente por dois elementos (antecedente e
conseqüente), se o quantificador universal tem uma variável ligada a ele etc.
4 O EDITOR DE FÓRMULAS DO CÁLCULO DE PREDICADOS.
Para o desenvolvimento do editor foi necessário definir como cada componente de uma
fórmula do Cálculo de Predicados deveria ser armazenado. Foi proposto que se construísse
uma linguagem que desse o suporte necessário para se trabalhar com o Cálculo de
Predicados. Essa linguagem é a PCML – Predicatus Calculus Markup Language
(Linguagem de Marcação para o Cálculo de Predicados).
Um outro passo importante para a construção do Editor é, com base no documento PCML,
gerar as classes em JAVA para que se possa manipular os elementos que compõe o
argumento e que poderão mostrar se o argumento é ou não válido, com base na estrutura de
prova que será implementada no projeto provador de teoremas em JAVA. Como a linguagem
PCML foi desenvolvida em XML e o Editor está sendo desenvolvido em JAVA, foi
necessário utilizar mecanismos de acesso ao documento PCML, ou seja, utilizar APIs do
JAVA que possibilitasse a manipulação desses documentos.
4.1 PCML
A PCML é a linguagem desenvolvida em XML para representar argumentos do Cálculo de
Predicados. O DTD da linguagem é apresentado na Figura 5.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<!ELEMENT ARG (PREM*,CONC)>
<!ELEMENT PREM (DISJ|CONJ|BIC|COND|UNI|EXI|PRED)>
<!ELEMENT CONC (DISJ|CONJ|BIC|COND|UNI|EXI|PRED)>
<!ELEMENT SENT (#PCDATA)>
<!ELEMENT DISJ (PRIM,SEG)>
<!ELEMENT CONJ (PRIM,SEG)>
<!ELEMENT BIC (PRIM,SEG)>
<!ELEMENT COND (ANT,CONS)>
<!ELEMENT
(PRED*,UNI*,EXI*,(DISJ|CONJ|BIC|COND|SENT)*,VAR)>
<!ELEMENT
(PRED*,UNI*,EXI*,(DISJ|CONJ|BIC|COND|SENT)*,VAR)>
<!ELEMENT PRED (SENT,(VAR*,CONST*))>
<!ELEMENT ANT (PRED|(DISJ|CONJ|BIC|COND|UNI|EXI))>
<!ELEMENT CONS (PRED|(DISJ|CONJ|BIC|COND|UNI|EXI))>
<!ELEMENT PRIM (PRED|(DISJ|CONJ|BIC|COND|UNI|EXI))>
<!ELEMENT SEG (PRED|(DISJ|CONJ|BIC|COND|UNI|EXI))>
<!ELEMENT VAR (#PCDATA)>
<!ELEMENT CONST (#PCDATA)>
<!ATTLIST UNI NEG CDATA #IMPLIED>
<!ATTLIST EXI NEG CDATA #IMPLIED>
<!ATTLIST SENT NEG CDATA #IMPLIED>
<!ATTLIST SENT NEG CDATA #IMPLIED>
<!ATTLIST COND NEG CDATA #IMPLIED>
UNI
EXI
Figura 5 – DTD da PCML.
Na primeira linha da Figura 5 define-se o elemento raiz ARG (argumento) que conterá 0
(zero) ou mais premissas (PREM) e uma só conclusão (CONC). As demais linhas definem
todos os outros elementos que formarão as premissas e a conclusão do argumento. Os únicos
elementos que conterão dados (caracteres) serão os elementos SENT (linha 4), VAR (linha
16) e CONST (linha 17). Estes serão respectivamente as letras sentenciais, as variáveis e as
constantes.
A definição deste DTD é de grande valia para um fácil entendimento da linguagem PCML.
Este foi estruturado de tal maneira que possibilitasse uma rápida compreensão, não apenas
para o entendimento da linguagem, mas também para o próprio entendimento dos elementos
que compõe o Cálculo de Predicados. O documento XML da PCML é exemplificado na
figura 6.
1.<?xml version= '1.0'encoding="ISO8859-1"?>
2.<!DOCTYPE ARG SYSTEM "PCML.dtd">
3.<?xml-stylesheet href= "PCML.xsl" type="text/xsl"?>
4. <ARG>
5. <CONC>
6.
<UNI>
7.
<VAR>x</VAR>
8.
<PRED>
9.
<SENT>P</SENT>
10.
<VAR>x</VAR>
11.
</PRED>
12. </UNI>
13. </CONC>
Figura 6 – Atribuição de valores em um documento XML para a formação de um
teorema.
4.2 Objetivos da Utilização das APIS Dom e SAX no Editor do Cálculo de Predicados
Na figura 7 (A) é apresentado um documento em XML, representando a fórmula ? xPx |Pa. Ou seja, dada uma propriedade quantificada universalmente (a premissa), é possível
deduzir que essa mesma propriedade se aplica a um indivíduo em particular (a conclusão). No
documento XML cada elemento que compõe a fórmula é separado e posicionado conforme
uma hierarquia, ou seja, a variável x, pertence ao predicado P, que está agregado ao
quantificador universal ? e sua variável x. É possível identificar que Pa está definido como a
conclusão da fórmula, dado o fato de que Pa é filho do elemento Conc (conclusão).
Na figura 7 (B), é mostrado como a API SAX trata este documento XML, ou seja, ao utilizar
esta API é possível identificar uma marca inicial, um conjunto de caracteres e uma marca final,
porque o analisador identifica a existência de eventos significativos à medida que eles
ocorrem. Conforme o exemplo, é verificada a identificação de cada parte do documento
XML, assim, se uma aplicação tivesse como objetivo apenas a leitura dos elementos do
documento, a SAX seria a melhor opção. Já na figura 7 (C) é apresentada a árvore gerada a
partir da utilização do DOM, assim a visualização da relação entre os elementos é facilmente
identificada. Os dados podem ser manipulados com precisão e podem, também, ser
acrescentados novos elementos na árvore. Desta forma, é possível identificar, por exemplo,
qual a conclusão da fórmula, suas premissas, os elementos internos de um condicional etc.
Baseado em Eventos
<?xml version = “1.0”?>
<arg>
A
<prem>
API SAX
<uni>
<var> x </var>
<pred>
<sent> P <sent>
<var> x </var>
</pred>
</uni>
</prem>
Baseado em Árvore
start element: arg
start element: prem
start element: uni
start element: var
characters: x
end element: var
start element: pred
start element: sent
characters: P
end element: sent
start element: var
characters: x
end element: var
end element: pred
end element: uni
end element: prem
start element: conc
start element: pred
start element: send
characters: P
end element: sent
start element: const
characters: a
end element: const
end element: pred
end element: conc
B
<conc>
<pred>
<sent> P </sent>
<const> a <const>
C
</pred>
</conc>
</arg>
API DOM
Figura 7 –Modelo de da Passagem dos API’s DOM e SAX
Foram testadas as duas APIs para a utilização no editor de fórmulas. Na verificação do início
e do fim de um elemento da fórmula, a utilização da API SAX foi mais eficiente, dado a
rapidez na busca destas informações, tendo em vista que não há a necessidade de gerar a
árvore na memória.
Mas, quando há a necessidade de verificar a existência de um determinado elemento na
fórmula, bem como identificar as relações entre estes elementos, o DOM apresentou os
melhores resultados. Assim, devido a própria natureza da sua estrutura (em forma de árvore),
a realização de pesquisas mais complexas é mais dinâmica e eficiente.
No desenvolvimento do editor de Fórmulas, foi levada em consideração a natureza de cada
problema, para a definição de qual API seria mais adequada. O DOM utiliza o parser para
todo o processo de leitura, criação do modelo de objeto JAVA, criação de uma referencia
para este modelo de objeto e só depois destes passos o objeto pode ser manipulado. Já o
SAX não depende tanto do parser para todo o processo, este apenas realiza processo de
leitura do documento XML disparando uma série de eventos, sempre que necessário. É de
responsabilidade do programador desenvolver uma aplicação que possa interpretar esses
eventos. [IDRIS, 2002]
As dificuldades encontradas na SAX para a manipulação dos elementos são sanadas com a
utilização do DOM, sendo assim, a partir da árvore do DOM, e dos métodos existentes na
própria API, torna-se mais fácil trabalhar com cada elemento da fórmula. Desta forma, é
possível definir que na continuação do trabalho – quando se partir do editor para o provador
de teoremas – a API DOM será mais adequada.
No exemplo da figura 8 é possível, a partir dos métodos constantes na própria API DOM,
identificar, por exemplo, a primeira premissa do argumento e qual constante está ligada
diretamente a letra predicativa desta primeira premissa. Assim, as buscas que devem ser
utilizadas para acessar os elementos do documento XML ficam mais simples.
ARG
PRE
PRE
PRED
...
SENT
CONST
P
a
...
Figura 8 – Apresentação do documento que é gravado na memoria pelo DOM.
Como no editor de fórmulas foram trabalhadas a leitura e validação do documento, foi preciso
identificar o erro (se existisse) e apresentá-lo de uma forma legível ao usuário. Para este
problema, a API DOM teve um desempenho mais favorável.
Na figura 9 é exposto um trecho de um código PCML que contém um erro. Como os erros
são retornados de forma técnica, impossibilitando que um usuário leigo os compreenda, as
mensagens de erros retornados pela utilização da API foram traduzidas para o usuário.
Vejamos como a API DOM trabalha a detecção dos erros a partir da utilização dos seus
métodos.
.
.
.
<COND>
<CONS>
<PRED>
<SENT> P <\PRED>
<CONST> a <\CONST>
</PRED>
</CONS>
</COND>
.
.
.
Figura 9 – Trecho de um código PCML com erro
De acordo com a DTD do PCML, que foi mostrada anteriormente, o trecho de código acima
está incorreto, pelo fato da tag COND (condicional) exigir, necessariamente, a presença dos
elementos ANT (antecedente) e CONS (conseqüente).
Figura 10 – Representação do erro gerado pela API DOM
A figura 10 representa um erro gerado quando se utiliza o parser da API DOM para ler o
documento XML que está com erro. Pode-se verificar que o erro não é retornado de uma
forma clara. Assim sendo, o Editor será responsável por tratar esse erro e retorná-lo ao
usuário de uma forma mais compreensível, como pode ser observado na figura 11.
figura 11 – Mesagem retornada para o usuário.
O processo de identificar os erros é um dos pontos complexos, assim quando não está claro
qual elemento está faltando ou sobrando numa determinada tag, é retornado para o usuário
uma mensagem mais genérica. No exemplo que foi apresentado acima está faltando um dos
filhos do condicional, como não é possível identificar se este filho é o elemento ANT ou o
elemento CONS, a mensagem passada para o usuário reflete apenas que o problema da
fórmula inserida por ele está na utilização errônea da sintaxe do condicional.
Na utilização do parser SAX para este mesmo problema foi verificado que ele não conseguiu
detectar os erros, pois o mesmo apenas percorre o documento marcando o início e o final de
cada elemento, não importando se esse elemento está ou não no local correto. A priori o
parser SAX não será utilizado para a detecção dos erros, mas não se refutou totalmente a
possibilidade de se conseguir sanar este problema.
Assim, é possível a partir do editor, verificar se uma fórmula do Cálculo de Predicados é bem
formada e, caso não seja, apresentar uma mensagem ao usuário apontando o erro. Desta
forma, esta ferramenta acoplada ao provador de teoremas poderá se tornar um ambiente de
ensino satisfatório dos cálculos da Lógica Formal.
5 CONSIDERAÇÕES FINAIS
Foram observados neste trabalho os aspectos relevantes da utilização da XML e da
linguagem JAVA para o desenvolvimento de um sistema que faça a leitura e o tratamento de
fórmulas do Cálculo de Predicados . Para isso, levou-se em consideração as APIs
necessárias para fazer a manipulação do documento XML no ambiente JAVA.
As APIs DOM e SAX mostraram-se úteis no que diz respeito aos relatórios de erros e aos
métodos de navegação no documento XML, sendo que a API DOM se mostrou mais
apropriada para casos em que era necessário saber a hierarquia dos elementos. Isso permite
visualizar a utilização desta API em trabalhos futuros como a busca dos elementos que serão
utilizados para a prova de uma fórmula do Cálculo de Predicados.
Assim, pretende-se desenvolver novos testes para a verificação do desempenho das APIs
no tratamento dos erros, já que este é um ponto primordial para a atuação satisfatória do
editor de fórmulas. Pretende-se, também, fazer a agregação do editor de fórmulas ao
provador de Teoremas, formando-se, assim, um ambiente de ensino do Cálculo de
Predicados.
6 REFERENCIAS
[ANDERSON, 2001] ANDERSON, R. et al. Professional XML. Rio de Janeiro: Editora
Ciência Moderna LTDA., 2001
[COPI, 1978] COPI, Irving M.. Introdução à lógica. São Paulo: Mestre Jou, 1978.
[FEDERIZZI, 2002] Federizzi, G. Link . Disponível em Setembro de 2002 no sitio web
http://www.inf.ufrgs.br/procpar/disc/inf01008/trabalhos/sem01-1/t2/apis_xml_JAVA/
[IDRIS, 2002] IDRIS, Nazmul. Disponível em Setembro de 2002
http://developerlife.com/saxtutorial1/default.htm
no sitio web
[KIRK and PITTS-MOULTIS, 2000] KIRK, Cheryl, PITTS-MOULTIS, Natanya. XML –
Black Book. São Paulo: Makron Books, 2000.a
[MACGRATH, 1999] MACGRATH, Sean. XML – Aplicações práticas. Rio de Janeiro:
Campus, 1999.
[NOLT, 1991] NOLT, John, ROHATYN, Dennis. Lógica. São Paulo: McGraw-Hill, 1991
[THIRY, 1996] Thiry, Philippe. Noções de Lógica. Liscoa,Portugal: Edições 70, 1996
Download