P-Datalog - Universidade Federal de Uberlândia

Transcrição

P-Datalog - Universidade Federal de Uberlândia
Mônica Sakuray Pais
P-Datalog¬: uma linguagem dedutiva para consultas a banco de
dados com inconsistências
Faculdade de Computação
Universidade Federal de Uberlândia
2004
Ficha Catalográfica
1. Folha de rosto:
Autor:
Orientador:
Nome do curso:
Local e ano de publicação:
Mônica Sakuray Pais
Sandra Aparecida de Amo
Pós-Graduação da Faculdade de Computação - UFU
Uberlândia-MG 2004
2. Introdução:
Uma abordagem paraconsistente na integração de banco de dados permite que dados inconsistentes sejam identificados e mantidos, e ainda assim seja possı́vel deduzir informações consistentes. Isto é, a presença de inconsistência não invalida
todo o banco de dados como no enfoque clássico, mas somente uma parte dele: a
que contém a inconsistência. Além disto, partimos do pressuposto que a presença
de uma informação identificada como inconsistente é mais significativa do que a
sua ausência por completo do banco de dados. Nesta dissertação é proposta uma
linguagem dedutiva de consultas a banco de dados contendo inconsistências denominada P-Datalog¬ . A semântica declarativa de P-Datalog¬ é uma extensão da
semântica bem-fundada de Datalog¬ . A lógica base para a semântica de P-Datalog¬
é a lógica paraconsistente 3-valorada LFI1. Um método de avaliação bottom-up para
programas P-Datalog¬ baseado em um operador de ponto fixo alternante, e a sua
implementação, são apresentados nesta dissertação.
3. Sumário:
1. Introdução; 2. Fundamentos Teóricos; 3. Trabalhos Relacionados; 4. PDatalog¬ ; 5. Método de avaliação bottom-up; 6. Conclusão e trabalhos futuros;
Apêndice A: Listagem da implementação.
4. Palavras chaves:
Linguagem de consultas a banco de dados; Banco de dados dedutivos; Programação
em lógica; Informação inconsistente; Paraconsistência.
5. Número total de páginas:
140 páginas.
6. email:
[email protected].
7. Telefone fixo para contato:
(64) 461-2483.
i
Mônica Sakuray Pais
P-Datalog¬: uma linguagem dedutiva para consultas a banco de
dados com inconsistências
Dissertação apresentada à Universidade Federal
de Uberlândia, Minas Gerais, como parte dos
requisitos exigidos para obtenção do tı́tulo de
Mestre em Ciência da Computação.
c
°Todos
os direitos resevados
ii
UNIVERSIDADE FEDERAL DE UBERLÂNDIA
FACULDADE DE COMPUTAÇÃO
Os abaixo assinados, por meio deste, certificam que leram e recomendam para a Faculdade de Computação a aceitação da dissertação intitulada
“P-Datalog¬ : uma linguagem dedutiva para consultas a banco de
dados com inconsistências” por Mônica Sakuray Pais como parte dos
requisitos exigidos para a obtenção do tı́tulo de Mestre em Ciência da
Computação.
Uberlândia, 11 de Agosto de 2004
Orientador:
Profa . Dra . Sandra de Amo
Universidade Federal de Uberlândia UFU/MG
Banca Examinadora:
Prof. Dr. Sergio Lifschitz
Pontifı́cia Universidade Católica do Rio de Janeiro/RJ
Prof. Dr. João Nunes de Souza
Universidade Federal de Uberlândia UFU/MG
iii
UNIVERSIDADE FEDERAL DE UBERLÂNDIA
Data: 11 de Agosto de 2004
Autor:
Tı́tulo:
Mônica Sakuray Pais
P-Datalog¬ : uma linguagem dedutiva para
consultas a banco de dados com inconsistências
Faculdade: Faculdade de Computação
Grau: Mestre
Convocação: Agosto
Ano: 2004
A Universidade Federal de Uberlândia possui permissão para distribuir e ter cópias
desse documento para propósitos exclusivamente acadêmicos, desde que a autoria seja
devidamente divulgada.
Autor
O AUTOR RESERVA OS DIREITOS DE PUBLICAÇÃO, E ESSE DOCUMENTO
NÃO PODE SER IMPRESSO OU REPRODUZIDO DE OUTRA FORMA, SEJA NA
TOTALIDADE OU EM PARTES SEM A PERMISSÃO ESCRITA DO AUTOR.
iv
Ao meu marido, José Carlos, que sempre me
incentivou e me apoiou em todos os sentidos, e
aos nossos filhos, João e Carlos, que cresceram
junto com o desenvolvimento deste trabalho.
v
Agradecimentos
Agradeço à minha orientadora Sandra, pela paciência, compreensão e incentivo.
Ao meu marido, José Carlos, que sempre fez tudo o que fosse possı́vel para suprir
a minha ausência junto aos meus filhos, e nos momentos mais difı́ceis nunca me deixou
desistir.
Ao João e Carlos, nossos filhos, que sempre estiveram em primeiro lugar, apesar dos
perı́odos em que eu estive ausente, e me motivaram a me desdobrar para conseguir finalizar
este trabalho.
A toda a minha familia que sempre me incentivou, me apoiou e compreendeu a minha
ausência.
À Simone, Decina e Simone, que me ajudaram a manter a minha casa funcionando e
a cuidar da minha famı́lia.
À coordenação do programa de Pós-graduação da FACOM-UFU e aos meus colegas
de mestrado. Em especial ao Daniel, que sempre respondeu prontamente a todo pedido
de ajuda, e pela sua contribuição na implementação de P-Datalog¬ . À Reane e Michel,
meus consultores informais. Ao Paulo e Lacordaire, companheiros de inúmeras viagens a
Uberlândia. À Marcela pela ajuda na revisão do texto.
Aos meus colegas de trabalho e da direção da CEFET-Urutaı́-Go, em especial ao
Eliézer que foi o primeiro a acreditar que esse mestrado seria possı́vel, e ao prof. Campos
viabilizou a minha entrada no programa de mestrado inter-institucional da CAPES.
Ao programa de mestrado inter-institucional da CAPES que financiou o desenvolvimento deste trabalho.
vi
Resumo
Possibilidades de ocorrência de inconsistências no banco de dados surgem ao integrarmos dados provenientes de diferentes fontes. Uma abordagem paraconsistente na
integração de banco de dados permite que dados inconsistentes sejam identificados e mantidos, e ainda assim seja possı́vel deduzir informações consistentes. Isto é, a presença de
inconsistência não invalida todo o banco de dados como no enfoque clássico, mas somente
uma parte dele: a que contém a inconsistência. Além disto, partimos do pressuposto
que a presença de uma informação identificada como inconsistente é mais significativa
do que a sua ausência por completo do banco de dados. Nesta dissertação é proposta
uma linguagem dedutiva de consultas a banco de dados contendo inconsistências denominada P-Datalog¬ . A semântica declarativa de P-Datalog¬ é uma extensão da semântica
bem-fundada de Datalog¬ . A lógica base para a semântica de P-Datalog¬ é também uma
extensão da lógica paraconsistente 3-valorada LFI1. Um método de avaliação bottom-up
para programas P-Datalog¬ baseado em um operador de ponto fixo alternante, e a sua
implementação, são apresentados nesta dissertação.
vii
Abstract
We are faced with the possibility of inconsistency in databases when integrating data
coming from multiple different sources. A paraconsistent approach for database integration allows keeping inconsistent information and reasoning in its presence. In this paper,
we use an extension of a paraconsistent logic (LFI1) as the underlying logic for the specification of P-Datalog¬ , a deductive query language for databases containing inconsistent
information. We present a declarative semantics which captures the desired meaning of
a recursive query executed over a database containing inconsistent facts and whose rules
allow infering information from inconsistent premises. This semantics is a natural extension of the well-founded semantics of Datalog¬ . We also present a bottom-up evaluation
method for P-Datalog¬ programs based on an alternating fixpoint operator and discussion
on implementation issues.
Sumário
1 Introdução
2
2 Fundamentos Teóricos
2.1 Conceitos algébricos . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Ordem Parcial . . . . . . . . . . . . . . . . . . . . . .
2.1.2 Reticulados . . . . . . . . . . . . . . . . . . . . . . .
2.1.3 Operadores . . . . . . . . . . . . . . . . . . . . . . .
2.1.4 Ponto Fixo . . . . . . . . . . . . . . . . . . . . . . .
2.2 Classificação de programas na programação em lógica . . . .
2.3 Lógica LFI1 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Datalog sem negação . . . . . . . . . . . . . . . . . . . . . .
2.4.1 Teoria da prova . . . . . . . . . . . . . . . . . . . . .
2.4.2 Teoria de modelos . . . . . . . . . . . . . . . . . . . .
2.4.3 Teoria do Ponto Fixo . . . . . . . . . . . . . . . . . .
2.4.4 Métodos de avaliação de Datalog . . . . . . . . . . .
2.5 Datalog¬ - Datalog com negação . . . . . . . . . . . . . . . .
2.5.1 A negação e suas implicações semânticas . . . . . . .
2.5.2 Semântica de modelo estável . . . . . . . . . . . . . .
2.5.3 Semântica bem-fundada . . . . . . . . . . . . . . . .
2.5.4 Ponto fixo Reincidente para Semântica bem-fundada
2.5.5 Ponto fixo Alternante para Semântica bem-fundada .
2.6 Conclusão do capı́tulo . . . . . . . . . . . . . . . . . . . . .
3 Trabalhos Relacionados
3.1 Inconsistência na programação em lógica . . . . . . .
3.1.1 Semântica 4-valorada de programa lógico geral
3.2 Inconsistência na integração de fontes de dados . . .
3.2.1 Abordagem da revisão de crença na integração
3.2.2 Abordagem paraconsistente na integração . .
viii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
6
6
8
8
11
12
13
15
18
19
22
25
26
27
29
32
39
41
46
.
.
.
.
.
47
47
48
55
55
60
SUMÁRIO
ix
4 P-Datalog¬
4.1 Sintaxe P-Datalog¬ . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Modelos de programas P-Datalog¬ . . . . . . . . . . . . . . . . . . . .
4.2.1 Lógica 4-valorada 4-LFI1: a lógica base de P-Datalog¬ . . . . .
4.2.2 Modelos 4-valorados . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Programas P-Datalog¬ Estendidos . . . . . . . . . . . . . . . . . . . . .
4.3.1 Operador de consequência imediata 4-TP . . . . . . . . . . . . .
4.3.2 Semântica do ponto fixo para programas P-Datalog¬ estendidos
4.4 Modelos 4-estáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5 Semântica bem-fundada de P-Datalog¬ . . . . . . . . . . . . . . . . . .
5 Método de avaliação bottom-up
5.1 Algoritmo do ponto fixo alternante . . . . . . . . . . . .
5.1.1 Sequência alternante . . . . . . . . . . . . . . . .
5.1.2 Instâncias I∗ , I∗ e I∗∗ . . . . . . . . . . . . . . . .
5.1.3 Cálculo da semântica bem-fundada de P-Datalog¬
5.2 Resultados Comparativos . . . . . . . . . . . . . . . . . .
5.3 Implementação do provador P-Datalog¬ . . . . . . . . . .
5.3.1 A linguagem de programação OCaml . . . . . . .
5.3.2 Provador P-Datalog¬ . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
69
69
70
70
71
75
76
78
81
83
.
.
.
.
.
.
.
.
85
85
85
90
92
100
102
102
103
6 Conclusão e trabalhos futuros
106
A Listagem da implementação do provador P-Datalog¬
112
Lista de Figuras
1.1
Evolução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1
Matrizes dos conectivos de LFI1 . . . . . . . . . . . . . . . . . . . . . . . . 14
3.1
Lógica 4-valorada FOUR . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.1
4.2
4.3
Lógica 4-valorada 4-LFI1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Sı́mbolos associados a um átomo A em P-Datalog¬ . . . . . . . . . . . . . 72
Matrizes dos conectivos de 4-LFI1 . . . . . . . . . . . . . . . . . . . . . . . 73
6.1
Matriz dos valores-verdade associados aos literais •A e ◦A . . . . . . . . . 106
1
3
Capı́tulo 1
Introdução
Informações contraditórias em um sistema de banco de dados tradicional normalmente
não são permitidas, e nem armazenadas, devido a um controle preventivo executado pelo
gerenciador do banco de dados. Com o desenvolvimento das tecnologias de rede, surgiram
os bancos de dados distribuı́dos, onde as informações são acessadas e atualizadas por
diversas fontes. Banco de dados locais possuem suas próprias restrições de integridade,
e são livres de contradições. Porém, dois bancos de dados locais podem ser mutamente
contraditórios, o que acarreta em procedimentos complexos e de alto custo para restaurar
e manter a consistência do banco de dados no nı́vel global.
Entretanto, existem situações em que a presença de uma informação inconsistente é
mais significativa do que sua ausência por completo do banco de dados. Ou seja, um banco
de dados onde é possı́vel armazenar informações seguras e também informações controversas, é uma representação mais próxima do mundo real onde os conflitos e incertezas
estão presentes. Segundo Gabbay [GH91], as inconsistências não são necessariamente algo
“ruim”. Elas fazem parte do mundo real e podem direcionar para uma ação mais correta
do que simplesmente a sua eliminação. Uma inconsistência pode ser um indicador da
necessidade de que uma ação externa ao banco de dados seja tomada, como por exemplo,
que o usuário seja consultado, ou que as restrições de integridade sejam revistas.
As instâncias de um banco de dados consistente podem ser representadas através da
lógica clássica 2-valorada. Uma tupla instanciada de uma dada relação é um fato positivo.
Um fato negativo representa uma tupla instanciada que não está armazenada. A lógica
clássica 2-valorada verifica o “princı́pio da explosão” onde temos que {A, ¬A} ` B, para
toda fórmula B. Assim a presença de fatos inconsistentes (A e ¬A) numa teoria torna-a
trivial, ou seja, é possı́vel deduzir qualquer coisa desta teoria, inutilizando-a em termos
de informação.
Quando consideramos que o banco de dados pode conter informações armazenadas
como controversas, a lógica 2-valorada já não é suficiente para representar uma instância
deste banco de dados. É necessário um terceiro valor-verdade, o valor inconsistente, para
2
CAPÍTULO 1. INTRODUÇÃO
3
P-Datalog¬
Datalog¬
Datalog
Figura 1.1: Evolução
ser associado aos fatos controversos, ou seja, uma lógica 3-valorada.
Em [dACM00, dACM02] foi introduzida a lógica paraconsistente 3-valorada LFI1 como
base de um modelo de integração de banco de dados. Lógicas paraconsistentes são aquelas
em que o princı́pio da explosão não é verificado, isto é, a presença de fatos inconsistentes
não acarreta que qualquer coisa possa ser inferida. No artigo [dACM00] são discutidas algumas questões inerentes à paraconsistência através da proposta de um modelo de
banco de dados baseado em um tratamento axiomático das propriedades básicas da informação inconsistente. A partir de propriedades semânticas que seriam desejáveis para
um tratamento bem-fundado dos dados inconsistentes, chegou-se à lógica LFI1- Logic
of Formal Inconsistency, onde as inconsistências são localizadas e indicadas ao invés de
serem descartadas. Em [dACM02] é apresentado um método baseado na lógica LFI1 que
executa a integração de fontes de dados heterogêneas e resulta em um banco de dados
paraconsistente, onde as informações inconsistentes são identificadas e mantidas no banco
de dados.
Dentre as linguagens de consultas a banco de dados temos Datalog, uma linguagem
declarativa capaz de expressar a recursividade, mas incapaz de expressar a diferença
relacional. A sua extensão, a linguagem Datalog¬ , completou a expressividade de Datalog
com a inclusão de literais negativos somente no corpo de suas regras, onde a negação
utilizada é a negação por default. Porém o Datalog¬ é uma linguagem de consultas a
banco de dados consistentes. É necessário então, definir uma linguagem de consultas
a banco de dados com inconsistências, uma linguagem com grande poder de expressão
como Datalog¬ , e que seja capaz de raciocinar na presença da inconsistência, ou seja,
um Datalog¬ paraconsistente. Denotamos esta linguagem de P-Datalog¬ . A Figura 1.1
mostra que P-Datalog¬ captura Datalog¬ e Datalog. É importante ressaltar que apesar da
linguagem P-Datalog¬ , não permitir literais negativos na cabeça das regras, as instâncias
do banco de dados contém inconsistências, e portanto a semântica de P-Datalog¬ também
deve ser capaz de raciocinar na presença da inconsistência.
Os conceitos de contradição e inconsistência não são necessariamente iguais. Porém,
ao longo deste texto, identificaremos inconsistência com contradição; ou seja, um fato A
é inconsistente quando existe evidência a favor de A e também existe evidência contrária
CAPÍTULO 1. INTRODUÇÃO
4
a A.
Exemplo 1.0.1 (Motivação) Suponha que existe a seguinte regra em um concurso
público fictı́cio para contratação de servidores: “se o candidato não possui dı́vidas com
o imposto de renda, e existe evidência de que o candidato é indicado por uma pessoa
influente que não é funcionário público, então o candidato pode conseguir o cargo”.
Podemos traduzir esta regra em um programa P-Datalog¬ Pcargo :
cargo(x) ← ∼devedor(x), indicadoPor(x,y), ∼cargo(y)
O sı́mbolo ∼ representa a negação por default, e os literais ∼ devedor(x) e ∼ cargo(y)
representam informação negativa segura: o fato que x não possui registro de dı́vidas na
Receita Federal e que y não é um funcionário público. Por outro lado, o literal indicadoPor(x,y) representa uma informação que não é totalmente segura. Ele apenas garante que
existe registro de que x é indicado por y, porém essa informação pode ser controversa.
Suponha que temos os seguintes fatos armazenados no banco de dados:
I
= {◦ indicadoPor(charles,joseph), ◦ indicadoPor(joseph,charles),
◦ indicadoPor(paul,james), • indicadoPor(john,kevin),
◦ indicadoPor(james,kevin), ◦ devedor(james)}
Os sı́mbolos ◦ e • que acompanham cada fato significam que o fato é seguro e controverso, respectivamente. Seja o seguinte modelo 4-valorado J de Pcargo que inclui os fatos
de I, ou seja, J concorda com I sobre os valores dos átomos devedor e indicadoPor. Como
veremos mais tarde, J é de fato a semântica bem-fundada do programa Pcargo e instância
inicial I. Os valores dos átomos cargo na instância J são descritos a seguir:
verdadeiro
falso
cargo(paul)
cargo(kevin), cargo(james)
inconsistente
indefinido
cargo(john)
cargo(charles), cargo(joseph)
Este modelo afirma que James certamente não obtém o cargo. James possui dı́vidas
com a Receita Federal, e este resultado favorece Paul a vencer o concurso. Paul não deve
imposto de renda e é indicado por James, que não é funcionário público.
Já no caso de John, ele está em dia com a Receita Federal mas é contraditório que
ele seja indicado por Kevin, que também não é funcionário público. Kevin também não
passa no concurso porque ele não é indicado por ninguém. Desta forma, é controverso
que John consiga o cargo.
Por outro lado, é indefinido se Charles e Joseph vão conseguir o cargo. Eles preenchem
quase todos os requisitos: eles não devem imposto de renda, eles possuem a indicação de
uma pessoa influente mas para obter o cargo eles dependem um do outro: Charles indica
Joseph e Joseph indica Charles. Logo Charles consegue o cargo se Joseph não conseguir
e vice-versa.
CAPÍTULO 1. INTRODUÇÃO
5
Contribuição da dissertação. Esta dissertação apresenta a definição da linguagem
dedutiva P-Datalog¬ para consultas a banco de dados em que podem existir fatos identificados como inconsistentes armazenados. P-Datalog¬ é uma extensão natural da linguagem
Datalog¬ . O diferencial encontra-se na instância do banco de dados: para P-Datalog¬
as instâncias do banco de dados podem conter fatos verdadeiros, falsos e inconsistentes,
e o resultado de programas P-Datalog¬ pode conter além de fatos verdadeiros, falsos e
inconsistentes, fatos indefinidos cuja veracidade ou falsidade não pode ser comprovada.
A partir da semântica bem-fundada [Prz90] do Datalog¬ , é definida uma extensão
desta semântica para programas P-Datalog¬ , a qual é denominada semântica bem-fundada
P-Datalog¬ .
Uma vez definida a semântica bem-fundada P-Datalog¬ , um método de avaliação
bottom-up, baseado no algoritmo do ponto fixo alternante [Van89], é descrito. A implementação do algoritmo para a obtenção da semântica bem-fundada P-Datalog¬ foi feita
com o uso da linguagem de programação Objective Caml, e resultou em um provador
P-Datalog¬ .
A dissertação é concluı́da com propostas de melhorias e possı́veis trabalhos a serem
futuramente desenvolvidos.
Organização. Algumas definições teóricas são fundamentais para o desenvolvimento e
bom entendimento de nosso trabalho, e no capı́tulo 2 elas são descritas. Neste capı́tulo
são introduzidos conceitos algébricos importantes referentes aos fundamentos teóricos de
Datalog¬ e sua semântica bem-fundada. Também são descritas a sintaxe e semântica
da lógica paraconsistente LFI1. No capı́tulo 3 são apresentados alguns trabalhos onde
são propostos enfoques que permitem o tratamento de informação inconsistente, tanto no
contexto de programação em lógica quanto no contexto de integração de dados.
A descrição do trabalho desenvolvido nessa dissertação se inicia no capı́tulo 4 com a
definição da linguagem lógica de consultas P-Datalog¬ e a sua semântica bem-fundada
4-valorada. A seguir, no capı́tulo 5, é descrito o método de avaliação bottom-up com a
apresentação de um algoritmo baseado no algoritmo do ponto fixo alternante e a implementação do algoritmo que resultou em um provador P-Datalog¬ . Resultados comparativos são mostrados e analisados. No anexo encontra-se a listagem da implementação.
No capı́tulo 6 é apresentada a conclusão da dissertação e a apresentação de propostas
para a extensão de P-Datalog¬ como trabalhos a serem realizados futuramente.
Capı́tulo 2
Fundamentos Teóricos
A definição da linguagem de consulta P-Datalog¬ faz uso de conceitos teóricos relacionados
com a programação em lógica e a sua semântica. A programação em lógica baseiase em fundamentos algébricos que são descritos sucintamente na primeira seção deste
capı́tulo. Na seção seguinte, seção 2.2, são classificados os programas dentro do contexto
da programação em lógica.
Na seção 2.3 é descrita a lógica paraconsistente LFI1, que será utilizada na definição
de P-Datalog¬ no capı́tulo 4.
A linguagem de consultas Datalog, sua sintaxe e suas diferentes abordagens semânticas
são descritas na seção 2.4. Em seguida, na seção 2.5, é introduzida uma extensão da
linguagem Datalog, o Datalog¬ e sua semântica bem-fundada, juntamente com métodos
construtivos para obtenção desta semântica bem-fundada.
Os fundamentos da lógica clássica utilizados neste texto, podem ser encontrados em
[Fit96] e em [NS97]. Um texto introdutório e mais acessı́vel, é apresentado em [Sou02].
2.1
Conceitos algébricos
Nesta seção apresentamos alguns conceitos algébricos importantes na fundamentação
teórica da programação em lógica. Maiores detalhes podem ser encontrados em [Llo93].
2.1.1
Ordem Parcial
Seja S um conjunto. Uma relação R sobre S é um subconjunto de S ×S. Isto é, R ⊆ S ×S.
Se (x, y) ∈ R, denotamos como xRy.
Definição 2.1.1 (Ordem Parcial) Uma relação R sobre S é uma ordem parcial se:
1. xRx, para todo x ∈ S (reflexiva).
2. Se xRy e yRx então x = y, para todo x, y ∈ S (anti-simétrica).
6
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
7
3. Se xRy e yRz então xRz, para todo x, y, z ∈ S (transitiva).
Exemplo 2.1.1 A relação de ordem 6 definida no conjunto dos números reais é uma
ordem parcial. Porém a relação < não é uma ordem parcial, pois não é reflexiva.
Exemplo 2.1.2 Seja S =P(U ) conjunto das partes de um conjunto U com a relação de
ordem A ⊆ B. É fácil verificar que é uma ordem parcial.
Vamos adotar uma notação padrão e utilizar 6 para denotar uma ordem parcial.
Um conjunto S munido de uma ordem parcial 6 é chamado de conjunto parcialmente
ordenado, e é denotado por (S, 6).
Definição 2.1.2 (Limitante inferior e superior) Seja (S, 6) um conjunto parcialmente
ordenado e X um subconjunto de S:
• a ∈ S é chamado de limitante superior de X se x 6 a para todo x ∈ X;
• b ∈ S é chamado de limitante inferior de X se b 6 x para todo x ∈ X;
Entre os limitantes superiores de um dado subconjunto X, existe o menor entre todos
os limitantes superiores. E, entre os limitantes inferiores existe o maior entre eles. A
seguir temos a definição destes elementos:
Definição 2.1.3 (Supremo e ı́nfimo) Seja (S, 6), um conjunto parcialmente ordenado,
e X um subconjunto de S:
1. Dizemos que a ∈ S é um supremo de X, se:
(a) a > x, para todo x ∈ X; e
(b) se b > x, para todo x ∈ X então a 6 b.
Denotamos a por sup(X), o menor limitante superior de X.
2. Dizemos que a ∈ S é um ı́nfimo de X, se:
(a) a 6 x, para todo x ∈ X; e
(b) se b 6 x, para todo x ∈ X então a > b.
Denotamos a por inf(X), o maior limitante inferior de X.
Exemplo 2.1.3 Seja S = P(U ), como no exemplo 2.1.2. Dado X ⊆ S, X = {xi |i ∈ I},
[
\
I ⊆ N, então sup(X) = xi e inf (X) = xi .
i∈I
i∈I
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
8
Proposição 2.1.1 ([Llo93]) Se existe sup(X), então ele é único. De modo similar, se
existe inf (X), então ele é único.
Observe que sup(X) e inf (X) podem não existir para todo subconjunto X de um
conjunto parcialmente ordenado S.
Exemplo 2.1.4 Seja S = (R, 6) e X = N. Não existe a ∈ R tal que a é sup(N), pois N
não é limitado superiormente.
2.1.2
Reticulados
Um conjunto parcialmente ordenado L é dito um reticulado se exitem sup e inf do
conjunto {x, y} para todo x, y ∈ L. É fácil mostrar que esta propriedade se estende aos
subconjuntos finitos {x1 , . . . , xn } quaisquer, isto é, num reticulado existem o sup e inf
de qualquer subconjunto finito {x1 , . . . , xn }.
O reticulado é dito completo, se existem sup e inf para todo subconjunto X (inclusive
os infinitos). O sup do reticulado completo L é denotado por >, e o inf por ⊥.
Exemplo 2.1.5 Seja S = P(U ), como no exemplo 2.1.2, S é um reticulado completo.
[
\
De fato, dado X ⊆ S, X = {xi |i ∈ I}, definimos sup(X) = xi e inf (X) = xi .
i∈I
i∈I
Exemplo 2.1.6 Seja S = R − N. Dados x, y ∈ S, temos que sup{x, y} = max{x, y} e
inf {x, y} = min{x, y}. Portanto, S é um reticulado.
Seja X ⊆ S e X = {x ∈ S|0 < x < 1}. O subconjunto X não possui sup nem inf . Logo,
S não é um reticulado completo.
2.1.3
Operadores
Definição 2.1.4 (Operador monotônico) Seja L um reticulado completo, e T : L →
L um operador. T é dito monotônico se sempre que x 6 y, então T (x) 6 T (y).
Exemplo 2.1.7 Seja Pf in (N) o conjunto das partes finitas de N. Dado X ⊆ Pf in (N),
[
\
onde X = {xi |i ∈ I}, definimos sup(X) =
xi e inf (X) =
xi , o que caracteriza o
i∈I
i∈I
conjunto Pf in (N) como um reticulado completo.
O operador T : Pf in (N) −→ Pf in (N) é definido da seguinte forma: T (x) = x ∪ x0 ,
onde x0 = {0}.
T é um operador monotônico. De fato, se x1 ⊆ x2 , então como T (x1 ) = x1 ∪ {0} e
T (x2 ) = x2 ∪ {0} temos T (x1 ) ⊆ T (x2 ).
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
9
Exemplo 2.1.8 Seja o seguinte operador T : Pf in (N) −→ Pf in (N) definido da seguinte
forma: T (x) = Pf in (N) − x.
T não é um operador monotônico. De fato, se x1 ⊂ x2 então como T (x1 ) = Pf in (N)−x1
e T (x2 ) = Pf in (N) − x2 , temos T (x1 ) 6⊂ T (x2 ).
Definição 2.1.5 (Subconjunto Direto) Seja L um reticulado completo, e X ⊆ L. X
é direto se todo subconjunto finito de X possui um limitante superior em X.
Exemplo 2.1.9 Seja o seguinte conjunto L = [0, 1]. O subconjunto X = [0, 1) é direto,
pois para todo X 0 ⊆ X, consideramos o elemento a, onde a é maior que todos os elementos
de X 0 . Como a ∈ X 0 então a ∈ X.
Exemplo 2.1.10 Seja o seguinte conjunto L = P(N), e X ⊆ L onde X = {{1}, {2}, {3}, ...}.
Seja X 0 ⊆ X, X 0 = {{1}, {2}}. Note que o limitante superior de X 0 é dado pelo conjunto
{1, 2} que não pertence a X. Portanto, X não é direto.
Exemplo 2.1.11 Seja o seguinte conjunto L = P(N), e X ⊆ L onde
X = {{1}, {3}, ..., {1, 3}, ..., {1, 3, 5}, ...}. Note que todo subconjunto finito de X possui
limitante superior em X. Portanto, X é direto.
Definição 2.1.6 (Operador contı́nuo) Seja L um reticulado completo e T : L → L
um operador. Se X ⊆ L e X = {x1 , x2 , ...}, denotamos por T (X) = {T (x1 ), T (x2 ), ...}. T
é dito contı́nuo se para todo X ⊆ L, X direto, temos T (sup(X)) = sup(T (X)).
Exemplo 2.1.12 Seja o conjunto L = P(N), e o operador T : L → L, onde T (x) =
x ∪ {0}. Suponha X ⊆ L, X = {xi |x ∈ I},onde X é direto.
X
x1
x2
...
xn
...
T (X)
x1 ∪ {0}
x2 ∪ {0}
...
xn ∪ {0}
...
S
S
Temos que sup(X) = xi e sup(T (X)) = xi ∪ {0}.
S
Aplicando-se T a sup(X) , temos T (sup(X)) = sup(X) ∪ {0} = xi ∪ {0}. Portanto,
sup(T (X)) = T (sup(X)).
Proposição 2.1.2 ([Llo93]) Se o operador T é contı́nuo, então T é monotônico.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
10
Exemplo 2.1.13 Seja o operador contı́nuo T : L → L. Vamos mostrar que T é monotônico.
Sejam x, y ∈ L, e x 6 y. Vamos mostrar que T (x) 6 T (y).
Seja X = {x, y}. Os possı́veis subconjuntos finitos de X e seu respectivos limitantes
superiores são descritos a seguir:
X0 ⊆ X
X0 = ∅
X 0 = {x}
X 0 = {y}
X 0 = {x, y}
Limitante superior de X 0
x, y
x, y
y
y
Observe que x ∈ X é limitante superior de X 0 = ∅, pois a seguinte asserção é verdadeira: ∀a ∈ ∅, a 6 x.
Todos os subconjuntos finitos de X possuem limitante superior em X. Portanto, X é
direto. Temos que T (X) = {T (x), T (y)}. Como o operador T é contı́nuo e X é direto,
então T (sup(X)) = sup(T (X)). Sabemos que sup(X) = y, logo sup(T (X)) = T (y).
Logo T (x) 6 T (y), o que nos permite concluir que T é monotônico.
A recı́proca desta proposição não é verdadeira. Se o operador T é monotônico não
implica que T é contı́nuo, como comprova o seguinte exemplo:
Exemplo 2.1.14 Seja o conjunto L = [0, 1] e o operador T : L → L definido a seguir:
(
0 se x < 1
T (x) =
1 se x = 1
É fácil verificar que para todo x, y ∈ L, se x > y então T (x) > T (y). A seguir temos
todas as possibilidades de valores para x e y tal que x 6 y:
x
x<1
x<1
x=1
y
y<1
y=1
y=1
T (x) e T (y)
T (x) = T (y)
T (x) 6 T (y)
T (x) = T (y)
Portanto, o operador T é monotônico.
Vamos verificar se T também é contı́nuo. Seja o seguinte conjunto X ⊆ L, X =
{0, 12 , 34 , . . .}. X é um conjunto direto, pois todos subconjuntos finitos de X possuem
limitante superior em X. Note que o sup(X) = 1 e T (1) = 1 Aplicando-se o operador T
a cada um dos elementos de X, obtemos T (X) = {0, 0, 0, ...}, onde o sup(T (X)) = 0.
Concluı́mos que a propriedade T (sup(X)) = sup(T (X)) não é válida, pois 1 6= 0, e
portanto o operador T é monotônico e não é contı́nuo.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
2.1.4
11
Ponto Fixo
A seguir são introduzidos conceitos e definições relativas à teoria do ponto fixo.
Definição 2.1.7 (Ponto fixo) Seja L um reticulado completo e T : L → L um operador. Dizemos que a ∈ L é um ponto fixo de T se T (a) = a.
Definição 2.1.8 (Menor ponto fixo) Seja L um reticulado completo e T : L → L um
operador. Dizemos que a ∈ L é o menor ponto fixo de T se:
1. a é um ponto fixo; e
2. para todo ponto fixo b de T , temos a 6 b.
Denotamos o menor ponto fixo de T por lf p(T ).
Exemplo 2.1.15 Seja Pf in (N) o conjunto das partes finitas de N.
O operador T : Pf in (N) −→ Pf in (N) é definido da seguinte forma: T (x) = x ∪ x0 ,
onde x0 = {0}.
Temos que T (x0 ) = x0 ∪ x0 = {0} = x0 . Logo x0 é ponto fixo de T e também o menor
ponto fixo de T .
Proposição 2.1.3 ([Llo93]) Seja L um reticulado completo e T : L → L um operador.
O menor ponto fixo de T , se existir, é único e lf p(T ) = inf {x ∈ L : T (x) = x}.
Proposição 2.1.4 ([Llo93]) Seja L um reticulado completo e T : L → L um operador
monotônico. Então o menor ponto fixo de T existe e lf p(T ) = inf {x ∈ L : T (x) 6 x}.
A seguir é descrito um método iterativo para o cálculo do menor ponto fixo.
Definição 2.1.9 Seja L um reticulado completo e T : L → L um operador monotônico.
Então, definimos a sequência T0 , T1 , . . . como sendo:
T0 = ⊥
T1 = T (T0 )
T2 = T (T1 )
...
Tn = T (Tn−1 )
...
onde ⊥ representa o conjunto vazio, e T ↑= sup{T0 , T1 , . . .}.
Repare que pelo fato de T ser monotônico, a sequência T0 , T1 . . . é crescente, isto é,
T0 ⊆ T1 ⊆ . . ..
De fato:
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
12
T0 ⊆ T1 , pois ⊥ ⊆ T1
T1 ⊆ T2 , pois T (⊥) ⊆ T (T1 )
T2 ⊆ T3 , pois T (T1 ) ⊆ T (T2 )
...
Temos que T ↑ é justamente o ponto fixo do operador T , no caso de T ser contı́nuo,
conforme é indicado pela proposição a seguir.
Proposição 2.1.5 ([Llo93]) Seja L um reticulado completo e T : L → L um operador
contı́nuo. Então, lf p(T ) = T ↑.
2.2
Classificação de programas na programação em
lógica
A programação em lógica possui diferentes tipos de programas que podem ser classificados
baseando-se na presença ou não dos sı́mbolos de negação no corpo e/ou na cabeça das regras; e no tipo de negação utilizada. A classificação apresentada a seguir, foi apresentada
em [Ari02], e ela não é seguida de maneira uniforme nos vários trabalhos pesquisados durante o desenvolvimento desta dissertação. Os programas aqui definidos como “programa
lógico padrão (standard)”, em alguns trabalhos aparecem definidos como “programa lógico
normal ”, apesar da negação utilizada ser a negação por default.
Nas definições serão utilizadas as seguintes notações:
1) p, q, r, p1 , p2 , . . . são fórmulas atômicas.
2) L, L1 , L2 , . . . são ¬literais, isto é, são átomos A ou átomos negados ¬A com a
negação explı́cita.
Definição 2.2.1 (Programa lógico definido(definite)) Um programa lógico definido
é um conjunto finito de regras do tipo: p ← p1 , . . . , pn . Os programas lógicos definidos
são positivos, ou seja, não possuem o sı́mbolo de negação nas suas regras.
Exemplo 2.2.1 (Programa lógico definido) O programa seguinte é um programa lógico
definido:
p ← q, r
q ← p, s
Definição 2.2.2 (Programa lógico padrão) Um programa lógico padrão é um conjunto finito de regras do tipo: p ← p1 , . . . , pm , ∼ pm+1 , . . . , ∼ pn .
Exemplo 2.2.2 (Programa lógico padrão) O programa seguinte é um programa lógico
padrão:
p ← q, ∼ r
q ←∼ p, s
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
13
Os programas P-Datalog¬ , como será definido no capı́tulo 4, são programas lógicos
padrões: a negação é a negação por default, e esta somente aparece no corpo das regras.
Definição 2.2.3 (Programa lógico normal) Um programa lógico normal é um conjunto finito de regras do tipo: p ← L1 , . . . , Ln .
Exemplo 2.2.3 (Programa lógico normal) O programa seguinte é um programa lógico
normal :
p ← q, ¬r
q ← ¬p, s
Note que a diferença entre um programa lógico padrão e um normal está apenas no
tipo de negação utilizada: nos programas padrões a negação é a negação por default.
Definição 2.2.4 (Programa lógico geral) Um programa lógico geral é um conjunto
finito de regras do tipo: L ← L1 , . . . , Ln .
Exemplo 2.2.4 (Programa lógico geral) O programa seguinte é um programa lógico
geral :
p ← q, ¬r
¬q ← ¬p, s
Definição 2.2.5 (Programa lógico estendido) Um programa lógico estendido é um
conjunto finito de regras do tipo: L ← L1 , . . . , Lm , ∼ Lm+1 , . . . , ∼ Ln .
Exemplo 2.2.5 (Programa lógico estendido) O programa seguinte é um programa
lógico estendido:
p ← q, ¬r, ∼ t
¬q ←∼ ¬p, s
2.3
Lógica LFI1
Nesta seção é descrita a sintaxe e a semântica da lógica LFI1 - Logic of Formal Inconsistency. Uma apresentação detalhada pode ser encontrada no artigo [dACM00].
Seja R uma assinatura1 finita sem sı́mbolos funcionais e Var um conjunto de sı́mbolos
de variáveis. As fórmulas da lógica LFI1 são definidas de modo usual como na lógica de
primeira ordem, com a adição de um novo sı́mbolo • (cujo significado é “é inconsistente”).
Uma fórmula de LFI1 é definida indutivamente pelas seguintes regras (e somente elas):
• Se R é um sı́mbolo de predicado de aridade k e x1 , ..., xk são constantes ou variáveis,
então R(x1 , ..., xk ) e x1 = x2 são fórmulas atômicas ou átomos. O primeiro é
chamado de átomo relacional e o último de átomo de igualdade.
1
Uma assinatura denota um alfabeto constituı́do por um conjunto finito de sı́mbolos de predicados,
constantes e funções.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
∨
t
i
f
t
t
t
t
i
t
i
i
f
t
i
f
t
i
f
(a)
¬
f
i
t
•
f
t
f
∼
f
f
t
14
→
t
i
f
t
t
t
t
i
i
i
t
f
f
f
t
∧
t
i
f
t
t
i
f
i
i
i
f
f
f
f
f
(b)
Figura 2.1: Matrizes dos conectivos de LFI1
• Se F, G são fórmulas e x é uma variável, então F ∨ G, ¬F , ∀xF , ∃xF e •F são
fórmulas.
Sejam x uma variável e F uma fórmula que contém x. A ocorrência da variável x
em F é ligada se x pertence ao escopo de um quantificador (∀x) ou (∃x) em F . Caso
contrário, a ocorrência da variável x em F é livre. Se existe pelo menos uma ocorrência
ligada de x em F , então a variável x é ligada em F . Se existe pelo menos uma ocorrência
livre de x em F , então a variável x é livre em F [Sou02].
Se x1 , . . . , xn são variáveis livres da fórmula F e c1 , . . . , cn são constantes ou variáveis,
denotamos por F [c1 , . . . , cn /x1 , . . . , xn ] a fórmula obtida pela substituição de cada ocorrência
de uma variável xi por ci , para i = 1, . . . , n. Uma sentença é uma fórmula sem variáveis
livres. Um fato é um átomo relacional sem variáveis livres. Denotamos por F o conjunto
de fatos.
Em seguida vamos definir interpretações para fórmulas de LFI1.
É importante
destacar, que no contexto de banco de dados, somente são consideradas as interpretações
de Herbrand, aquelas para as quais Dom (o conjunto dos sı́mbolos de constantes da
linguagem) é o domı́nio de avaliação das variáveis, e onde cada sı́mbolo de constante é
interpretado por si mesmo. Desta forma, uma avaliação é uma aplicação v : Var →
Dom.
Definição 2.3.1 Seja R uma assinatura finita. Uma interpretação sobre R é uma
aplicação δ : F → {f (falso), t (verdadeiro), i (inconsistente)}.
Uma interpretação de fatos pode ser estendida para sentenças proposicionais de modo
natural usando-se as matrizes de conectivos da Figura 2.1 (a), onde o sı́mbolo ¬ representa
a negação clássica, e o sı́mbolo ∼ representa a negação por default.
O conectivo ∧ é definido pela correspondência: A ∧ B ≡ ¬(¬A ∨ ¬B). Já o conectivo
→ é definido pela correspondência: A → B ≡ B ∨ ¬(A ∨ •A). As matrizes para ∧ e →
são dadas pela Figura 2.1 (b).
A extensão de δ para sentenças quantificadas é obtida através do conceito de quantificadores de distribuição, introduzido por [Car87]. Basicamente este conceito traduz a
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
15
intuição básica de que um quantificador universal pode ser visto como uma conjunção
ilimitada e um quantificador existencial como uma disjunção ilimitada.
Seja Dom o conjunto infinito de sı́mbolos de constantes da linguagem, F uma fórmula
e ai sı́mbolos de constante correspondentes a um elemento de Dom. Então, temos que:
∀xF ≡ F (a1 ) ∧ F (a2 ) ∧ . . .; e
∃xF ≡ F (a1 ) ∨ F (a2 ) ∨ . . .
Como será visto no capı́tulo 4, as regras de um programa P-Datalog¬ equivalem a
fórmulas constituı́das por uma disjunção universalmente quantificada, e que são interpretadas sobre um Universo de Herbrand finito. Para domı́nios finitos, os quantificadores
universais que aparecem nas fórmulas podem ser vistos como uma conjunção limitada,
como é mostrado a seguir.
Seja Dom o conjunto finito de sı́mbolos de constantes de cardinalidade n, onde ai são
os sı́mbolos de constante correspondentes a um elemento de Dom, e F é uma fórmula.
Então, temos que:
∀xF ≡ F (a1 ) ∧ . . . ∧ F (an ); e
∃xF ≡ F (a1 ) ∨ . . . ∨ F (an )
Definição 2.3.2 Seja F (x1 , ..., xn ) uma fórmula de LFI1 com variáveis livres x1 ,. . .,xn , v
uma avaliação e δ uma interpretação. Dizemos que (δ, v) satisfaz F (x1 , ..., xn ) (denotado
por (δ, v) |= F (x1 , ..., xn )) se e somente se δ(F [v(x1 ), ..., v(xn )/x1 , ..., xn ]) é t ou i.
Exemplo 2.3.1 Seja R um sı́mbolo de predicado binário. Seja δ uma interpretação tal
que δ(R(a, b)) = t, δ(R(c, b)) = i e δ(R(p, q)) = f para todo (p, q) tal que p 6= c e p 6= a, ou
q 6= b. Então, (δ, v) |= (∃x • R(x, y) ∧ ¬∀xR(x, y)), onde v é uma avaliação que v(y) = b,
pois: δ |= (∃x • R(x, b) ∧ ¬∀xR(x, b)) ⇐⇒ δ(∃x • R(x, b) ∧ ¬∀xR(x, b)) ∈{t, i}, e
δ(∃x • R(x, b) ∧ ¬∀xR(x, b)) = δ((•R(a, b) ∨ •R(b, b) ∨ •R(c, b)) ∧ ¬(R(a, b) ∧ R(b, b) ∧
R(c, b))) = ((•t ∨ •f ∨ •i) ∧ ¬(t ∧ f ∧ i)) = (t ∧ ¬f) = t.
Se (δ,v) |= F para toda avaliação v, dizemos que δ é um modelo de F (denotado por
δ |= F ).
A lógica LFI1 é uma lógica paraconsistente uma vez que ela não verifica o princı́pio
da explosão, isto é, {A, ¬A} 6|= B para todo B. De fato, se considerarmos a interpretação
δ do exemplo 2.3.1, temos que δ |= R(c, b) e δ |= ¬R(c, b) mas δ 6|= R(b, a).
2.4
Datalog sem negação
Nesta seção é introduzida a linguagem de consultas Datalog [AVH95], e as diferentes
abordagens na definição de sua semântica. Um texto em português e mais acessı́vel sobre
bancos de dados dedutivos é apresentado em [Lif97].
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
16
A linguagem Datalog pode ser vista como uma versão simplificada da programação
em lógica [Llo93]. Ao longo desta seção serão ressaltadas algumas das diferenças entre
um programa Datalog e um programa lógico.
Um programa Datalog define as relações que ocorrem nas cabeças das regras baseado
em outras relações. Esta definição é recursiva, de maneira que relações definidas podem
também aparecer no corpo de regras. Um programa Datalog é interpretado como um
mapeamento de instâncias sobre as relações que ocorrem somente nos corpos das regras,
para instâncias sobre as relações que ocorrem nas cabeças das regras.
A seguir são formalizados os principais conceitos envolvidos na linguagem Datalog.
Definição 2.4.1 (Sintaxe do Datalog) Uma regra (Datalog) é uma expressão da forma
R1 (u1 ) ← R2 (u2 ), ..., Rn (un ),
onde n ≥ 1, R1 , ..., Rn são nomes de relações e u1 , ..., un são tuplas não instanciadas de
aridades apropriadas. Cada variável ocorrendo em u1 deve ocorrer em pelo menos uma das
tuplas u2 , ..., un (esta restrição não ocorre nos programas lógicos). Um programa Datalog
é um conjunto finito de regras Datalog.
A cabeça da regra é a expressão R1 (u1 ); e R2 (u2 ), ..., Rn (un ) que forma o corpo da
regra.
Um programa Datalog responde às necessidades das linguagens de consultas a bancos
de dados, e ao contrário de um programa lógico, não aceita sı́mbolos de função na sua
sintaxe.
Exemplo 2.4.1 (Programa Datalog) Seja G uma relação que representa um grafo.
Considere o programa Datalog PF T descrito a seguir:
T (x, y) ← G(x, y)
T (x, y) ← G(x, z), T (z, y)
O programa PF T mapeia uma relação G (um grafo) sobre uma relação T . A relação T
assim definida é o fecho transitivo (FT) de G.
Definição 2.4.2 (Instanciação) Dada uma avaliação2 v de variáveis, uma instanciação
de uma regra R1 (u1 ) ← R2 (u2 ), ..., Rn (un ) com v, é a regra obtida pela substituição de
cada variável x por v(x).
R1 (v(u1 )) ← R2 (v(u2 )), ..., Rn (v(un ))
O conjunto de regras instanciadas do programa Datalog P é denotado por ground(P ).
2
Uma avaliação é um mapeamento de sı́mbolos de variáveis para sı́mbolos de constantes.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
17
Note que no contexto da programação lógica, o termo predicado é frequentemente
usado no lugar do termo nome de relação, R(u) é denotado por átomo ou fórmula atômica,
o termo fato denota um átomo instanciado, e o termo literal denota um átomo ou um
átomo negado.
As instâncias do banco de dados são representadas de forma linear, como conjuntos
finitos de fatos. No caso de Datalog, estas instâncias são 2-valoradas, isto é, representam
como verdadeiros os fatos que pertencem ao banco de dados, e como falsos os fatos que
não pertencem.
Definição 2.4.3 (Instância) Seja R o esquema do banco de dados formado pelo conjunto finito de nomes de relações. Seja R uma relação de aridade n, R ∈ R. Um fato sobre
R é uma expressão do tipo R(u), onde u é uma tupla instanciada, ou seja, u = a1 , . . . , an
onde ai são constantes, 1 6 i 6 n. Uma instância de relação R é um conjunto finito de
fatos sobre R. Uma instância do banco de dados sobre o esquema R é um conjunto finito
I, que é a união de instâncias de relação R, para toda relação R ∈ R.
Exemplo 2.4.2 Seja o esquema do banco de dados que contém as relações binárias
G(x, y) e T (x, y). A seguir temos a instância I deste banco de dados:
I = {G(1, 2), G(2, 3), G(3, 4), T (1, 3), T (2, 4)}
Dado um programa Datalog P , denotamos por adom(P ) o conjunto de constantes que
aparecem em P , e por adom(I) o conjunto de constantes que ocorrem na instância I. A
união adom(P ) ∪ adom(I) é denotada por adom(P, I).
Uma relação extensional é uma relação que ocorre somente no corpo das regras. Uma
relação intencional é uma relação que ocorre na cabeça de alguma regra do programa
Datalog P . O esquema (do banco de dados) extensional, denotado por edb(P ), consiste do
conjunto de todos os nomes de relações extensionais; enquanto que o esquema intencional
idb(P ) consiste de todos os nomes de relações intencionais. O esquema de P , denotado
por sch(P ), é a união de edb(P ) e idb(P ).
Exemplo 2.4.3 Considere o programa PF T do exemplo 2.4.1. Suas relações são classificadas como:
edb(PF T ) = {G},
idb(PF T ) = {T },
sch(PF T ) = {G, T }.
A semântica de um programa Datalog é um mapeamento apropriado de instâncias do
banco de dados sobre edb(P ) para instâncias do banco de dados sobre idb(P ), isto é, é
uma certa instância das relações intencionais que captura de maneira natural o que se está
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
18
definindo. Em alguns contextos, os dados de entrada são chamados de banco de dados
extensional e o programa de banco de dados intencional.
Os programas lógicos possuem uma vasta coleção de propostas, métodos e ferramentas
para definição da sua semântica correta [Dix96]. O programa Datalog é um programa
lógico com restrições, o que simplifica a definição de sua semântica, como é descrito a
seguir.
Existem três diferentes abordagens para se definir a semântica do Datalog: semântica
baseada na teoria de modelos, semântica baseada no ponto fixo e semântica baseada na
teoria da prova. Estas abordagens são equivalentes.
A semântica da linguagem P-Datalog¬ será definida segundo a abordagem baseada na
teoria de modelos e no ponto fixo. Esta é a razão pela qual a seguir serão apresentadas
essas duas semânticas da linguagem Datalog em maiores detalhes do que a semântica da
teoria da prova. Em [AVH95] pode ser encontrada uma melhor descrição da semântica
da teoria da prova para a linguagem Datalog.
2.4.1
Teoria da prova
A semântica da teoria da prova é baseada na obtenção de provas dos fatos. Um fato está
no resultado se existe uma prova para ele utilizando as regras e os fatos do banco de
dados.
Na perspectiva da teoria da prova, há dois modos de se deduzir fatos. O primeiro é
visualizar programas como “fábricas” produzindo todos os fatos que podem ser provados
a partir de fatos conhecidos. As regras são usadas de forma bottom-up, começando de
fatos conhecidos e deduzindo todas as possibilidades de novos fatos.
O segundo modo é a avaliação top-down que começa a partir de um fato a ser provado
e tenta demonstrá-lo pela dedução de lemas que são necessários para a prova. Esta é
a intuição por trás de uma técnica particular (chamada Resolução SLD) que originou o
campo de provas de teoremas, e encontra-se no cerne da programação em lógica.
Exemplo 2.4.4 Considere o programa PF T do exemplo 2.4.1:
T (x, y) ← G(x, y)
T (x, y) ← G(x, z), T (z, y)
Supondo que a instância com os fatos iniciais armazenados no banco de dados seja da
seguinte forma:
{G(1, 2), G(2, 3), G(3, 4)}
Para provar T (1, 4), pela segunda regra do programa PF T , este fato pode ser provado
pela prova de G(1, 2) e T (2, 4). G(1, 2) é um fato do banco de dados, temos então que
provar T (2, 4).
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
19
Aplicando-se a segunda regra novamente, temos G(2, 3) (um fato do banco de dados)
e T (3, 4) (aplicando-se a primeira regra), e obtemos T (2, 4).
Portanto, T (1, 4) é verdadeiro.
2.4.2
Teoria de modelos
Segundo a teoria de modelos, o programa Datalog é um conjunto de sentenças3 da lógica de
primeira ordem [Sou02], também chamado de teoria, que descreve um resultado desejado.
A instância do banco de dados resultante da execução do programa deve satisfazer as
sentenças, e neste caso é denominada modelo do programa.
Entretanto, pode existir mais de uma instância do banco de dados que satisfaz o
programa, sendo então necessário definir qual delas corresponde ao resultado esperado.
Os critérios necessários para esta escolha vão além das próprias sentenças do programa.
Dentro do contexto da teoria de modelos, são descritos a seguir: as relações entre
regras do programa Datalog e sentenças da lógica clássica de primeira ordem, noções de
modelo e o conceito de modelo esperado.
Programa Datalog como sentenças da lógica de primeira ordem
Uma regra da linguagem Datalog pode ser associada a uma sentença da lógica de primeira
ordem da seguinte maneira.
Seja ρ uma regra Datalog do tipo:
ρ : R1 (u1 ) ← R2 (u2 ), . . . , Rn (un ).
Podemos associá-la à seguinte sentença de primeira ordem:
∀x1 . . . xn (R1 (u1 ) ← R2 (u2 ) ∧ . . . ∧ Rn (un )),
(2.1)
onde x1 , . . . , xn são variáveis que ocorrem na regra ρ e ← corresponde à implicação lógica
clássica. Para um programa Datalog P , a conjunção de sentenças associadas às regras de
P é denotada por ΣP .
Uma instância I satisfaz uma regra ρ, denotado por I |= ρ, se para cada instanciação
da forma:
Ri (v(u1 )) ← R2 (v(u2 )), . . . , Rn (v(un ))
onde se R2 (v(u2 )), . . . , Rn (v(un )) pertence à I então Ri (v(u1 )) também pertence à I.
Exemplo 2.4.5 O programa PF T do exemplo 2.4.1 equivale às seguintes fórmulas da
lógica de primeira ordem:
3
Uma sentença é uma fórmula sem variáveis livres.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
20
1. ∀x∀y(T (x, y) ← G(x, y))
2. ∀x∀y∀z(T (x, y) ← (G(x, z) ∧ T (z, y)))
Seja a instância J = {G(1, 2), G(2, 3), G(3, 4), T (1, 2)}. Neste caso, uma instanciação
da primeira regra de PF T nos fornece a seguinte regra r: T (1, 2) ← G(1, 2).
Temos que G(1, 2) e T (1, 2) pertencem a J e portanto J |= r.
Note que a sentença (2.1) é equivalente à
∀x1 . . . xn (R1 (u1 ) ∨ ¬R2 (u2 ) ∨ . . . ∨ ¬Rn (un )).
(2.2)
Uma fórmula que consiste de uma disjunção de literais onde apenas um deles é positivo,
como em (2.2), é chamada de cláusula de Horn. Um programa Datalog pode ser visto
como um conjunto de cláusulas de Horn.
Modelo esperado
Entre os modelos de ΣP é preciso especificar qual deles corresponde ao resultado esperado.
Para a linguagem Datalog, tal modelo não deve conter mais fatos além do necessário para
satisfazer as sentenças de ΣP . Esta é a definição intuitiva de modelo minimal. Então o
modelo esperado é um modelo minimal, como definido a seguir.
Definição 2.4.4 Seja P um programa Datalog e I uma instância sobre sch(P ). Um
modelo de P é uma instância sobre sch(P ) que satisfaz ΣP . A semântica de P sobre I,
denotada por P (I), é, caso exista, o modelo minimal de P contendo I.
Observação 2.4.1 (Modelo minimal) Reforçando a escolha do modelo minimal como
uma solução natural, temos a hipótese do mundo fechado (CWA) que relaciona o banco de
dados com o mundo que ele modela. Normalmente os bancos de dados são incompletos,
pois fatos que estão no mundo não estão necessariamente registrados no banco de dados.
É intuitivo que os fatos que estão armazenados no banco de dados sejam considerados
verdadeiros; porém os que não estão, poderiam ser considerados falsos, verdadeiros ou
indefinidos. A hipótese do mundo fechado soluciona este problema: assume que todos os
fatos que não estão no banco de dados são falsos. Dentro desta linha de pensamento, é
razoável considerar verdadeiros somente os fatos que são verdadeiros em todos os mundos
modelados. Ou seja, o modelo minimal consiste dos fatos que são conhecidos em todos os
modelos de mundo que satisfazem as sentenças do programa.
Segundo a definição anterior 2.4.4, a semântica P (I) é uma instância sobre sch(P ). O
conjunto de todas as instâncias sobre sch(P ), considerando-se somente o domı́nio dado
por adom(P, I), é um conjunto finito.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
21
Definição 2.4.5 Dados um programa P e uma instância I, B(P, I) é uma instância sobre
sch(P ) definida do seguinte modo:
a) Para cada relação R ∈ edb(P ), um fato R(u) ∈ B(P, I) se e somente se R(u) ∈ I; e
b) Para cada relação R ∈ idb(P ), cada fato R(u) com constantes em adom(P, I) está
em B(P, I).
É importante destacar que no contexto de banco de dados somente são consideradas
as interpretações de Herbrand ([Llo93]), aquelas para as quais o conjunto dos sı́mbolos
de constantes é o domı́nio de avaliação das variáveis e onde cada sı́mbolo de constante é
interpretado por si mesmo. Desta forma, B(P, I) é também chamado de base de Herbrand.
Na programação em lógica a base de Herbrand é um conjunto infinito, devido a presença
dos sı́mbolos de função.
O exemplo seguinte mostra o B(P, I) de um programa Datalog, segundo a definição
anterior.
Exemplo 2.4.6 Continuando com o programa do exemplo 2.4.1, onde sch(PF T ) = {G, T },
e considerando a instância I = {G(1, 2), G(2, 3), G(3, 4)}, temos que:
adom(P, I) =
B(P, I) =
{1, 2, 3, 4}, e
{G(1, 2), G(2, 3), G(3, 4),
T (1, 1), T (1, 2), T (1, 3), T (1, 4),
T (2, 1), T (2, 2), T (2, 3), T (2, 4),
T (3, 1), T (3, 2), T (3, 3), T (3, 4),
T (4, 1), T (4, 2), T (4, 3), T (4, 4), }
O lema apresentado a seguir mostra que B(P, I) é um modelo de P que contém I.
Lema 2.4.1 ([AVH95]) Seja P um programa Datalog e I uma instância sobre edb(P ),
então B(P, I) é modelo de P contendo I.
Desta forma, se existe semântica para P e instância I, então P (I) é um subconjunto
de B(P, I). O teorema seguinte mostra que a semântica P (I) sempre existe.
Teorema 2.4.1 ([AVH95]) Seja P um programa Datalog, I uma instância sobre edb(P )
e M o conjunto de modelos de P contendo I. Então:
T
1) A intersecção dos modelos de P que contém I, denotada por M é o modelo minimal
de P contendo I. Portanto P (I) existe e é definido.
2) adom(P (I)) ⊆ adom(P, I).
3) Para cada R ∈ edb(P ), P (I)(R) = I(R).
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
22
Os resultados do teorema 2.4.1 nos fornece uma maneira de calcular a semântica
de programas Datalog: dados P e I, é necessário determinar qual das instâncias que
pertencem a B(P, I) são modelos de P contendo I, para então calcular a intersecção
destes modelos. É um algoritmo ineficiente apesar de eficaz.
Na próxima seção é descrito a semântica de programas Datalog na abordagem da
teoria do ponto fixo.
2.4.3
Teoria do Ponto Fixo
Nesta seção serão utilizadas as definições e proposições sobre reticulados, operadores e
teoria do ponto fixo apresentadas na seção 2.1.
A semântica do programa, segundo a teoria do ponto fixo, pode ser definida como uma
solução particular de uma equação de ponto fixo. A abordagem direciona para a iteração
de uma consulta até que um ponto fixo é alcançado.
É definido um operador denotado por operador de consequência imediata, que produz
novos fatos a partir de fatos conhecidos. Após a definição do operador de consequência
imediata, são apresentadas propriedades algébricas (definidas na seção 2.1) que este operador possui, e que são importantes na construção da semântica do programa Datalog.
O conjunto de instâncias sobre sch(P ) é denotado por InstP . Existe uma ordem natural de precedência entre as instância fornecida pelo operador ⊆. Desta forma, (InstP , ⊆)
formam um reticulado completo.
Definição 2.4.6 Seja P um programa Datalog. O operador de consequência imediata,
denotado por TP , é um mapeamento TP : InstP → InstP da seguinte forma:
Para cada instância I pertencente a InstP , e para todo fato A ∈ B(P, I), A ∈ TP (I)
se e somente se:
1)A corresponde a uma relação R onde R ∈ edb(P ), e A ∈ I; ou
2) existe regra de ground(P ) do tipo A ← B1 , . . . , Bn , onde Bi ∈ B(P, I) e Bi ∈ I,
para todo i, 1 6 i 6 n.
O exemplo seguinte mostra a aplicação do operador TP .
Exemplo 2.4.7 Considere o programa PF T apresentado no exemplo 2.4.1 que calcula o
fecho transitivo do grafo G:
T (x, y) ← G(x, y)
T (x, y) ← G(x, z), T (z, y)
Considere a instância:
I = {G(1, 2), G(2, 3), G(3, 4)}.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
23
O operador TP aplicado à instância I é mostrado a seguir:
TP (I) = I ∪ {T (1, 2), T (2, 3), T (3, 4)}.
Lema 2.4.2 ([AVH95]) Seja P um programa Datalog. O operador TP é monotônico.
Um operador monotônico (definição 2.1.4) possui propriedades que são importantes
na construção da semântica de programas Datalog, como as proposições 2.1.3 e 2.1.4, que
mostram que para um operador monotônico sempre existe um único menor ponto fixo.
Desta forma podemos garantir que o operador de consequência imediata TP possui sempre
um menor ponto fixo que é único.
O próximo lema mostra que um ponto fixo de TP é sempre um modelo de P contendo
I.
Lema 2.4.3 ([AVH95]) Seja P um programa Datalog e I uma instância sobre sch(P ).
Se I é ponto fixo de TP então I é modelo P .
Entretanto, nem todo modelo de P é ponto fixo, como mostra o exemplo a seguir:
Exemplo 2.4.8 Seja o seguinte programa Datalog P :
p←s
q←r
O programa possui o seguinte modelo:
M = {p, r, q},
e TP (M) = {r, q} 6= M. Portanto M é modelo de P e não é ponto fixo de TP .
O operador TP aplicado a qualquer modelo de um programa P contendo I, resulta
sempre em uma instância que está contida ou é igual ao modelo. É o que ocorre no
exemplo 2.4.8, onde TP (M) ⊆ M, e é o que formaliza o lema seguinte.
Lema 2.4.4 ([AVH95]) Seja P um programa Datalog e I uma instância sobre sch(P ).
I é modelo de P se e somente se TP (I) ⊆ I.
Todos os lemas anteriores levam ao teorema seguinte que conclui que o menor ponto
fixo de TP para um programa Datalog P e instância inicial I, coincide com o modelo
minimal de P contendo I, o modelo P (I).
Teorema 2.4.2 ([AVH95]) Seja P um programa Datalog e I uma instância sobre edb(P ).
O operador TP possui um menor ponto fixo contendo I que é igual a P (I).
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
24
O resultado apresentado pelo teorema anterior mostra que sempre existe semântica
para programas Datalog, e que esta semântica coincide com o menor ponto fixo do operador TP . A seguir será apresentado um método construtivo para obtenção da semântica.
Definição 2.4.7 Seja uma instância I sobre edb(P ). O operador TP define a sequência
TP (I), TP2 (I), TP3 (I) . . ., que é denotada por {TPi (I)}i>0 , onde:
TP1 (I) = TP (I)
TP2 (I) = TP (TP (I))
TP3 (I) = TP (TP2 (I))
...
TP ↑= sup{TPn }n>0
De I ⊆ TP (I) e de TP ser monotônico, temos que a sequência {TPn }n>0 é crescente:
I ⊆ TP (I) ⊆ TP2 (I) ⊆ TP3 (I) ⊆ . . . ⊆ B(P, I).
O conjunto B(P, I) é finito para programas Datalog, e desta forma a sequência {TPi (I)}i>0
converge para um ponto fixo em um número finito de passsos. Seja N o número de fatos
em B(P, I). A sequência {TPi (I)}i>0 converge para um ponto fixo em no máximo N passos.
Isto é, para i > N temos TPi (I) = TPN (I), e em particular temos que:
TP (TPN (I)) = TPN (I)
Então TPN (I) é ponto fixo de TP . O ponto fixo obtido pela sequência {TPi (I)}i>0 é
denotado por TP (I) ↑.
Exemplo 2.4.9 Continuando o exemplo 2.4.7, a aplicação iterativa de TP é mostrada a
seguir:
TP (I) = I ∪ {T (1, 2), T (2, 3), T (3, 4)}
TP2 (I) = TP (TP (I)) = TP (I) ∪ {T (1, 3), T (2, 4)}
TP3 (I) = TP (TP2 (I)) = TP (I) ∪ {T (1, 4)}
TP4 (I) = TP (TP3 (I)) = TP3 (I)
É possı́vel notar que a sequência de instâncias produzidas por TP é crescente e que a
partir da quarta iteração é atingido um ponto fixo que corresponde à instancia dada por
TP3 .
A partir do programa P e sua instância inicial I é possı́vel, através do operador TP ,
construir a sequência {TPi (I)}i>0 que converge para o modelo minimal de P contendo I.
Este resultado é formalizado pelo próximo teorema.
Teorema 2.4.3 ([AVH95]) Seja P um programa Datalog e I uma instância sobre edb(P ).
Então, TP (I) ↑= P (I).
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
25
Observação 2.4.2 (Teoria do ponto fixo na programação em lógica) Os programas
Datalog são mais simples que os programas lógicos. Em particular, os programas lógicos
podem ter sı́mbolos de função, o que torna o conjunto B(P, I) infinito. Desta forma nem
sempre a sequência {TPi (I)}i>0 converge em um número finito de passsos. Entretanto, a
sequência {TPi I (∅)}i>0 converge em um número finito de passos. Então, na programação
em lógica, a instância inicial I é incorporada ao programa dando origem a um novo programa denotado por PI . O programa PI é obtido de P com a adição de regras do tipo
A ← para cada fato A presente na instância I. Esta regra com corpo vazio é chamada
de clausula unitária, e no caso do Datalog ela não contém variáveis. O operador de consequência imediata TPI é definido sobe o reticulado completo formador InstP , onde um
fato A ∈ TPI (K) se e somente se existe regra em ground(PI ) do tipo A ← B1 , . . . , Bn
onde {B1 , . . . , Bn } ⊆ K. O operador TPI é contı́nuo e monotônico, e pela proposição
2.1.5 temos que o ponto fixo de TPI é o sup(Ki |i > 0), onde K0 = ⊥ e para cada i > 0,
Ki = TPI (Ki−1 ). No caso do Datalog, ⊥ = ∅ e:
∅ ⊆ TPI (∅) ⊆ . . . ⊆ TPi I (∅) ⊆ . . .
que converge para P (I).
2.4.4
Métodos de avaliação de Datalog
Datalog é uma linguagem declarativa, e desde a sua introdução surgiram vários métodos
procedimentais de avaliação de seus programas, e uma série de técnicas de otimização
desses métodos. Os métodos de avaliação são geralmente separados em duas classes:
avaliações bottom-up e avaliações top-down. A seguir, estas técnicas são brevemente introduzidas. Uma descrição mais detalhada pode ser encontrada em [AVH95] e [CGT90],
e em [Lif97] temos um texto introdutório em português.
As avaliações bottom-up utilizam um método baseado em uma sequência de iterações
do operador de consequência imediata Tp , onde a partir dos fatos contidos no banco de
dados inicial, e do programa Datalog, são deduzidos novos fatos que constituem em uma
instância do banco de dados intencional. As regras de um programa são vistas como
fábricas que produzem todos os fatos que são consequência lógica do programa Datalog a
partir dos fatos presentes inicialmente na instância do banco de dados. Dentre os métodos
de avaliação bottom-up, temos os métodos: ingênuo (naif ) e semi-ingênuo. O método
ingênuo corresponde ao método de avaliação bottom-up mais simples, e o método semiingênuo é uma otimização do método ingênuo, onde cálculos redundantes são eliminados.
A classe de métodos de avaliação top-down, ao invés de partir dos fatos iniciais,
primeiro consideram uma consulta e as regras do programa antes de chegar a uma resposta. Seja P um programa Datalog. Uma consulta Datalog é o par (P, q), onde q é uma
regra Datalog cuja cabeça é constituı́da de uma nova relação query, da seguinte forma:
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
26
query(u) ← R(v)
onde R ∈ idb(P ). Um fato é relevante à consulta (P, q) sobre a instância inicial I, se existe
uma prova para query no qual o fato ocorre. Os métodos top-down buscam melhorar a
eficiência da avaliação considerando somente fatos relevantes. Dentre os métodos topdown, temos os algoritmos Query-Subquery, Recursive Query Answering/Frozem Query
Iteration.
Um resultado importante das pesquisas sobre métodos de avaliação de Datalog, é
que existem técnicas de otimização, como magic-sets, que tornam métodos bottom-up tão
eficientes quanto os top-down.
2.5
Datalog¬ - Datalog com negação
Nesta seção é introduzida a linguagem de consulta Datalog¬ [AVH95], e são apresentadas duas abordagens semântica para programas Datalog¬ : semântica de modelo estável
[GL88] e semântica bem-fundada [Prz90]. No final desta seção, dois métodos construtivos
da semântica bem-fundada, baseados em operadores de ponto fixo [Van89, Prz89], são
descritos.
A linguagem Datalog descrita na seção anterior expressa vários tipos de consultas
recursivas, porém possui alguns pontos fracos quanto a sua força de expressão. O Datalog
não é capaz de expressar consultas do tipo diferença entre duas relações, como mostra o
exemplo a seguir:
Exemplo 2.5.1 Um programa Datalog que verifica os pares não conectados em um grafo
G, seria um complemento do programa PF T do exemplo 2.4.1 que calcula o fecho transitivo
de um grafo. Seja PF T Comp o resultado da adição da seguinte regra ao programa PF T :
CT (x, y) ←∼ T (x, y)
A linguagem Datalog¬ é uma extensão da linguagem Datalog, em que é permitido no
corpo das regras literais negativos como mostra a definição seguinte.
Definição 2.5.1 (Sintaxe de Datalog¬ ) Um programa Datalog¬ é um conjunto finito
de regras do tipo:
A ← L1 , ..., Ln
onde A é um átomo do tipo R(u), e Li são literais do tipo R(u) ou ∼ R(u), sendo que R é
o nome de relação e u é uma tupla não instanciada de aridade apropriada, e ∼ representa
o sı́mbolo da negação por default.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
27
No contexto da programação em lógica, programa do tipo definido pela sintaxe de
Datalog¬ é denominado programa lógico padrão (definição 2.2.2). Nesta seção, e nas
próximas, é considerado que os programas possuem os seus dados de entrada incorporados,
da mesma forma que os programas PI (veja observação 2.4.2).
Observação 2.5.1 (Negação por default) O operador de negação (∼) que é utilizado
nos programas Datalog¬ representa a negação por default, que baseia-se na falta de
evidência de que determinado fato é verdadeiro. Esta negação está relacionada com a
hipótese do mundo fechado - CWA (veja observação 2.4.1). A maioria das semânticas
aplicadas ao programa p ←∼ q resulta em q falso e p verdadeiro. A falta de evidência de
que q é verdadeiro é usada para assumir que q é falso. A negação por default é mais fraca
do que outro tipo de negação denominada negação explı́cita [APP96], em que é necessário
que exista uma prova de que o fato é falso para que a sua negação explı́cita (¬) seja
considerada verdadeira. Ou seja, não basta o fato estar ausente do banco de dados para
que a sua negação explı́cita suceda.
2.5.1
A negação e suas implicações semânticas
Ao incluir a negação no Datalog, temos a necessidade de definir a semântica dos fatos
negativos. Infelizmente as semânticas do Datalog sem negação não podem simplesmente
ser estendidas para o Datalog¬ . No caso da semântica baseada na teoria do ponto fixo,
podemos estender de forma natural a definição do operador de consequência imediata TP
(definido em 2.4.6) para programas com negação, como mostra a definição seguinte.
Definição 2.5.2 Seja P um programa Datalog. O operador de consequência imediata
estendido, denotado por TP0 , é um mapeamento TP0 : InstP → InstP da seguinte forma:
para cada instância I pertencente a InstP , e para todo fato A ∈ B(P, I), A ∈ TP0 (I) se e
somente se:
1. A corresponde a uma relação R onde R ∈ edb(P ), e A ∈ I; ou
2. existe regra de ground(P ) do tipo A ← L1 , . . . , Ln , onde para todo literal positivo
Li = C, C ∈ B(P, I) e C ∈ I; e para todo literal negativo Li =∼ C, C ∈ B(P, I) e
C 6∈ I, para todo i, 1 6 i 6 n.
Porém o operador estendido TP0 aplicado a um programa lógico padrão não é monotônico,
como mostra o próximo exemplo.
Exemplo 2.5.2 Seja o programa Datalog¬ P0 descrito a seguir:
p ←∼ q.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
28
Sejam as instâncias4 I = {p} e J = {p, q}. É fácil ver que I ⊆ J. Aplicando o operador
TP0 às instâncias I e J, temos TP0 (I) = {p} e TP0 (J) = {q}. Ou seja, TP0 (I) ⊆
6 TP0 (J).
Portanto, TP0 não é monotônico.
Como o operador TP0 não é monotônico, não se pode mais garantir que sempre existe
um ponto fixo, nem que o menor ponto fixo é único, e nem que a sequência {TP0 i (∅)}i>0
sempre converge para o menor ponto fixo de TP0 , como mostram os exemplos seguintes:
Exemplo 2.5.3 Seja o programa Datalog¬ P1 mostrado a seguir:
p ←∼ p.
O cálculo de TP0 a partir da instância vazia é dado por:
TP0 (∅) = {p}
TP01 (∅) = ∅
TP02 (∅) = {p}
TP03 (∅) = ∅
TP04 (∅) = {p}
...
Portanto TP0 não posui ponto fixo.
Exemplo 2.5.4 Seja o programa Datalog¬ P2 mostrado a seguir:
p ←∼ q
q ←∼ p
Portanto, TP0 posui dois pontos fixos minimais: I1 = {p} e I2 = {q}, pois TP0 ({p}) =
{p} e TP0 ({q}) = {q}.
Exemplo 2.5.5 Seja o programa Datalog¬ P3 mostrado a seguir:
p ←∼ r
r ←∼ p
p ←∼ p, r
Temos que TP0 ({p}) = {p}. Logo, {p} é ponto fixo de TP0 .
A sequência {TP0 i (∅)}i>0 é mostrada a seguir:
4
Seguindo a notação utilizada em Datalog (seção 2.4), as instância são representadas como conjuntos
de átomos positivos.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
29
TP0 (∅) = {p, r}
TP01 (∅) = {}
TP02 (∅) = {p, r}
TP03 (∅) = {}
TP04 (∅) = {p, r}
...
Portanto, a sequência {TP0 i (∅)}i>0 não converge para o menor ponto fixo.
A semântica baseada na teoria de modelos também não pode ser naturalmente estendida para o Datalog¬ . Um programa Datalog¬ pode ter vários modelos minimais,
como mostra o exemplo 2.5.4 onde {p} e {q} são modelos minimais de P . É necessário
determinar qual deles é o modelo esperado.
Várias semânticas tem sido propostas para distinguir o modelo esperado dos outros
modelos candidatos. Entre as abordagens propostas, as mais importantes são a semântica
por estratificação, a semântica de modelo estável e a semântica bem-fundada.
A semântica por estratificação [AVH95, Lif97] impõe como restrição sintática aos programas considerados, a ausência de recursão negativa. Isto é, a definição de um predicado
intencional não deve incluir o seu próprio complemento, como no programa Pcargo do
exemplo de motivação 1.0.1 mostrado a seguir:
cargo(x) ← ∼devedor(x), indicadoPor(x,y), ∼cargo(y).
Tal restrição não é imposta pela semântica bem-fundada nem pela semântica de modelo estável. A semântica de P-Datalog¬ , definida no capı́tulo 4, é uma semântica bemfundada.
A semântica de modelo estável [GL88] possui muito em comum com a semântica bemfundada. Van Gelder et al. [VRS91] foram os primeiros a definir a semântica bem-fundada,
e esta definição foi reconstruı́da em termos de modelos 3-estáveis por Przymusinski [Prz90].
Nas próximas seções são descritas a semântica de modelos estáveis (2-valorados) [GL88] e a
semântica bem-fundada baseada em modelo 3-estável [Prz90]. Os programas considerados
são programas Datalog¬ , e serão chamados simplesmente de programas.
2.5.2
Semântica de modelo estável
Nesta seção é apresentada a definição da semântica de modelo estável apresentada por
Gelfond e Lifschitz em [GL88].
Gelfond e Lifschitz definiram que o resultado esperado de um programa é um modelo
capaz de reproduzir a si mesmo ao passar por uma certa transformação, chamada de
transformação de estabilidade. Desta forma, um fato presente no modelo não pode ser
deduzido mais tarde como falso, e todos os fatos falsos que podem ser deduzidos do modelo
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
30
já devem estar no modelo. Esta é a definição intuitiva de modelo estável, que é definido
formalmente a seguir.
Definição 2.5.3 A transformação de estabilidade S é definida da seguinte maneira. Seja
P um programa e I uma instância inicial. O programa P 0 é obtido de P eliminando-se:
1) Toda regra instanciada que possui literal negativo ∼ B tal que B ∈ I;
2) Todo literal negativo do corpo das regras restantes.
Desta forma P 0 é um programa sem negação, e através do operador de consequência
imediata TP (definido em 2.4.6) é possı́vel se chegar ao único modelo minimal de P 0 . O
menor ponto fixo de TP aplicado ao programa P 0 , estabilizado a partir do programa P e
instância I, é denotado por SΠ (I).
A definição de modelo estável é formalizada a seguir.
Definição 2.5.4 (Modelo estável) Seja P um programa e I uma instância. Se SΠ (I) = I
então I é modelo estável de P .
A definição anterior nos indica uma maneira de verificar se uma determinada instância
é um modelo estável através do uso da transformação de estabilidade S e do operador de
consequência imediata TP . O próximo teorema mostra que os modelos estáveis, como o
próprio nome indica, são modelos do programa.
Teorema 2.5.1 ([GL88]) Seja P um programa. Todo modelo estável de P é também
modelo de P .
A semântica de modelo estável é definida a seguir.
Definição 2.5.5 (Semântica de modelo estável) Se um programa P possui somente
um modelo estável, então P possui uma semântica de modelo estável que coincide com
este único modelo estável de P .
No próximo exemplo é mostrado o caso em que uma instância não é modelo estável e
uma outra instância que é o único modelo estável.
Exemplo 2.5.6 Considere o seguinte programa Pwin :
move(1, 2) ←
win(x) ← move(x, y), ∼ win(y)
O programa ground(P ) é mostrado a seguir:
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
31
move(1, 2) ←
win(1) ← move(1, 1), ∼ win(1)
win(1) ← move(1, 2), ∼ win(2)
win(2) ← move(2, 2), ∼ win(2)
win(2) ← move(2, 1), ∼ win(1)
0
Seja M1 = {win(2)}. Então, pela transformação de estabilidade S, temos que Pwin
corresponde à:
move(1, 2) ←
win(1) ← move(1, 1)
win(2) ← move(2, 1)
Então SΠ (M1 ) = {move(1, 2)} que é diferente de M1 . Portanto M1 não é modelo
estável. Tal resultado era de se esperar pois M1 não é modelo de Pwin .
0
Seja a instância M2 = {move(1, 2), win(1)}, onde Pwin
é:
move(1, 2) ←
win(1) ← move(1, 2)
win(2) ← move(2, 1)
Então SΠ (M1 ) = {move(1, 2), win(1)} = M2 . Portanto M2 é modelo estável de Pwin .
Existem outros modelos estáveis entre as 26 possibilidades5 de instâncias de Pwin ?
Neste caso, é certo que toda programa transformado P 0 inclui move(1, 2) e não inclui
move(1, 1), move(2, 1), move(2, 2). Desta forma elimina-se muitas das possibilidades, e
após examinar todas as restantes, conclui-se que M2 é o único modelo estável de P .
Portanto, M2 é a semântica de modelo estável de P .
A semântica de modelo estável não se aplica a programas que não possuem modelo
estável, ou àqueles que possuem vários modelos estáveis, como mostram os exemplos a
seguir:
Exemplo 2.5.7 (Programa com nenhum modelo estável) Considere o seguinte programa P descrito a seguir:
work ← ∼ tired
sleep ← ∼ work
tired ← ∼ sleep
angry ← ∼ paid,work
paid ←
5
O valor 6 corresponde ao número de átomos de B(P ).
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
32
O programa não possui nenhum modelo estável, e portanto não possui uma semântica de
modelo estável.
Exemplo 2.5.8 (Programa com vários modelos estáveis) Considere o seguinte programa P1 :
p ←∼ q
q ←∼ p
O programa possui dois modelos estáveis: {p} e {q}, e portanto não possui uma semântica
de modelo estável.
2.5.3
Semântica bem-fundada
Nesta seção é apresentada a proposta de semântica bem-fundada baseada em modelos
3-estáveis [Prz90], onde podem ser encontradas as demonstrações dos resultados aqui
relatados.
A semântica bem-fundada introduzida por Van Gelder et al. [VRS91], é definida como
um modelo de um programa que corresponde ao modelo esperado, também chamado
de modelo canônico, onde alguns fatos podem ter o seu valor indefinido. Van Gelder
introduziu o conceito de modelo total e parcial, onde os modelos parciais, ao contrário
dos modelos totais, são aqueles em que alguns fatos podem ter o seu valor-verdade não
determinado. Os modelos parciais podem ser vistos como interpretações 3-valoradas onde
é possı́vel distinguir fatos verdadeiros, falsos e indefinidos.
Przymusisnski [Prz90] argumenta que a necessidade de se considerar interpretações 3valoradas para descrever o nosso conhecimento é justificável se considerarmos que o nosso
conhecimento quase sempre é incompleto. É necessário que possamos representar fatos
nem verdadeiros e nem falsos: os fatos indefinidos. Da mesma forma, um programa pode
conter predicados cuja veracidade ou falsidade são determináveis, e outros indeterminados.
Semânticas que são definidas somente para uma classe limitada de programas geralmente
não conseguem obter uma resposta para programas deste tipo, como a semântica de
modelo estável [GL88] (veja exemplo 2.5.7).
O próximo teorema mostra a estreita ligação entre a semântica de modelo estável e a
semântica bem-fundada:
Teorema 2.5.2 ([VRS91]) Se a semântica bem-fundada de um programa P é um modelo total, então este modelo é o único modelo estável (2-valorado) de P .
Em muitos programas a semântica bem-fundada coincide com a semântica de modelo
estável, dando-nos a impressão de que a única diferença entre elas é que a semântica bemfundada define modelos parciais quando o programa possui mais de um modelo estável.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
33
Entretanto, existem programas que possuem um único modelo estável e a semântica bemfundada é um modelo parcial. Ou seja, o sentido contrário do teorema 2.5.2 não é necessariamente verdadeiro, como será mostrado no exemplo 2.5.14.
A seguir é descrita a lógica 3-valorada que é a lógica base da semântica bem-fundada.
Os termos utilizados a seguir, que são relacionados a lógica, podem ser encontrados em
[Sou02].
Lógica 3-valorada
A lógica 3-valorada, definida em [Prz89, Prz90], introduz o valor-verdade indefinido em
adição aos valores-verdade verdadeiro e falso da lógica clássica 2-valorada.
Seja L uma linguagem de primeira ordem sobre o alfabeto A da lógica clássica de
primeira ordem acrescido dos sı́mbolos proposicionais t, f e u, que denotam as propriedades de um dado átomo ser verdadeiro, falso e indefinido, respectivamente. As
fórmulas de L são definidas de modo usual como na lógica de primeira ordem.
Dado um programa P , o conjunto de constantes de P é denotado por adom(P ); o
conjunto de todos os átomos de P instanciados define a base de Herbrand, e é denotado
por B(P ). O programa instanciado ground(P ), é formado pelas regras de P instanciadas
de acordo com adom(P ).
A seguir é definida uma interpretação 3-valorada, onde serão consideradas somente as
interpretações de Herbrand. Nas interpretaçõe de Herbrand os sı́mbolos de constantes são
interpretados por si mesmo [Llo93].
Definição 2.5.6 (Interpretação 3-valorada) Uma interpretação 3-valorada I é definida
pelo par hT ; F i, onde T e F são subconjuntos disjuntos de B(P ). O conjunto T contém
todos os átomos instanciados que são verdadeiros em I, o conjunto F contém todos os
átomos instanciados que são falsos em I, e o conjunto U contém os átomos restantantes,
onde U = B(P ) − (T ∪ F ). Os átomos de U são indefinidos em I. Uma interpretação
3-valorada é uma interpretação 2-valorada se o conjunto U é vazio.
Toda interpretação 3-valorada I da proposição t (f, u) é verdadeira (falsa, indefinida
respectivamente.)
Seja V ={f, u, t} o conjunto de valores-verdade. O conjunto V possui uma ordem
natural dada por: f 6 u 6 t. Przymusinski [Prz90] ressalta que o valor intuitivo de u é
o de parcialmente verdadeiro. Se um determindo fato A é interpretado como u significa
que foi atribuı́do alguma (porém limitada) verdade ao fato A.
Toda interpretação 3-valorada I = hT ; F i pode ser vista como uma função I : B(P ) →
V , onde:


 t se A ∈ T
I(A) =
f se A ∈ F


u se A ∈ U
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
34
A noção de interpretação é estendida para as fórmulas fechadas da linguagem na
definição seguinte.
Definição 2.5.7 Seja I uma interpretação 3-valorada. Então:
• Seja A um átomo instanciado. Então I(A) = t (u, f ) se A é verdadeiro (indefinido,
falso), respectivamente, em I.
• Seja A um átomo instanciado. Se I(A) = t então I(∼ A) = f. Se I(A) = f então
I(∼ A) = t. Se I(A) = u então I(∼ A) = u.
• Sejam F e G duas fórmulas fechadas, então:
I(F ∧ G) = min{I(F ), I(G)};
I(F ∨ G) = max{I(F ), I(G)};
(
t, se I(G) > I(F )
I(G ← F ) =
f, caso contrário
I(∀xF (x)) = min{I(F (A))|A ∈ B(P )};
I(∃xF (x)) = max{I(F (A))|A ∈ B(P )}
onde o máximo e o mı́nimo de um conjunto vazio é verdadeiro e falso respectivamente.
A definição de modelo é dada a seguir.
Definição 2.5.8 Uma interpretação M de um programa P é modelo de P se para toda
a regra r de ground(P ) temos que M(r) = t. Ou seja, se r é do tipo A ← L1 , . . . , Ln ,
temos que:
M(A) > min{M(L1 ), . . . , M(Ln )}.
Exemplo 2.5.9 Seja o programa P mostrado a seguir:
p ←∼ q
q ←∼ p
Seja I uma interpretação 3-valorada de P , tal que: I = h{p}; {q}i, onde T = {p},
F = {q} e U = ∅. Ou seja, I(p)=t e I(q)=f.
Seja J uma interpretação 3-valorada de P , tal que: J = h∅; ∅i, onde T = ∅, F = ∅ e
U = {p, q}. Ou seja, J(p)=u e J(q)=u.
Tanto a interpretação I quanto a interpretação J são modelos de P .
A ordem natural entre interpretações 3-valoradas é dada pelo operador 4 definida a
seguir.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
35
Definição 2.5.9 Sejam as interpretações I = hT ; F i e J = hT 0 ; F 0 i.
I 4 J se e somente se T ⊆ T 0 e F ⊇ F 0 .
Esta definição equivale a
I 4 J se e somente se ∀A ∈ B(P ) I(A) 6 J(A).
Exemplo 2.5.10 Sejam as interpretações I = h{p}; {q}i e J = h∅; {p, q}i. Temos a
seguinte ordem: J 4 I.
Modelo 3-estável
Przymusisnski [Prz90] apresenta uma definição de modelo 3-estável, que é uma extensão
definição de modelo estável (2-valorado) [GL88]. Todo modelo estável (2-valorado) é um
modelo 3-estável, como será mostrado. No decorrer do texto é usado simplesmente modelo
estável para denotar modelo estável 2-valorado.
Przymusisnski mostra que todo programa P possui pelo menos um modelo 3-estável,
e que o modelo que possui os fatos verdadeiros e falsos presentes em todos os modelos
3-estáveis de P coincide com a semântica bem-fundada de P .
Um resultado importante, válido para programa sem negação, é que todo programa
sem negação possui um único modelo minimal (seção 2.4). Przymusinski define então,
o programa positivo estendido, que é um programa sem negação, onde são permitidas as
proposições t, u e f, que representam valores-verdade, entre os literais do corpo das regras
do programa.
Uma vez definidos os programas positivos estendidos, a definição do operador de consequência imediata TP (definido em 2.4.6) é estendida para a lógica 3-valorada da seguinte
forma:
Definição 2.5.10 (Operador de consequência imediata 3-valorado) Seja P um programa positivo estendido, I uma interpretação 3-valorada de P , e A ∈ B(P ). O operador
de consequência imediata denotado por 3-TP é definido por:


 max{I(Fk )} se existem regras do tipo A ← Fk em ground(P),
3-TP (I)(A) =
para todo k, k > 0;


f
caso contrário
Em seguida é mostrado que para um programa positivo estendido P , o operador 3-TP
possui um menor ponto fixo que corresponde ao modelo minimal de P .
Teorema 2.5.3 ([Prz90]) Se P é um programa positivo estendido, então o operador
3-TP possui um menor ponto fixo MP , e MP é modelo minimal de P .
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
36
Exemplo 2.5.11 Seja P o programa positivo estendido mostrado a seguir:
c←
a ← c, u
b ← b, u
O modelo minimal de P corresponde à interpretação 3-valorada I, onde I = h{c}; {b}i.
I também é o menor ponto fixo de 3-TP , obtido construtivamente a partir da interpretação
I0 = h∅; ∅i, como é mostrado a seguir:
3-TP (I0 ) = h{c}; {a, b}i
3-TP1 (I0 ) = h{c}; {b}i
3-TP2 (I0 ) = h{c}; {b}i
O menor ponto fixo de 3-TP coincide com a interpretação 3-valorada I, que por sua vez é
o modelo minimal de P .
Przymusinski propõe uma extensão da transformação de estabilidade S [GL88] (descrita na seção 2.5.3) para interpretações 3-valoradas, e a partir da qual é definido o modelo
3-estável.
Definição 2.5.11 Seja P um programa e I uma interpretação 3-valorada. A transformação GL estendida produz o programa PI pela substituição de toda ocorrência de
literais do tipo ∼ A em ground(P ), pelo valor-verdade dado por I(∼ A). Desta forma, o
programa PI é um programa positivo estendido. Denotamos o menor ponto fixo de 3-TP
aplicado a PI por Γ∗ (I).
O exemplo a seguir mostra como é aplicada a transformação GL estendida.
Exemplo 2.5.12 Considere o mesmo programa P apresentado no exemplo 2.5.7:
work ← ∼ tired
sleep ← ∼ work
tired ← ∼ sleep
angry ← ∼ paid,work
paid ←
e a interpretação 3-valorada I = hpaid; angryi. A transformação GL estendida produz o
seguinte programa PI :
work ← u
sleep ← u
tired ← u
angry ← f, work
paid ←
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
E o menor ponto fixo do operador 3-TP aplicado a
37
P
I
é dado por Γ∗ (I) = I.
O exemplo anterior mostra que a partir da interpretação 3-valorada I não se deduziu
nenhum fato verdadeiro e nenhum fato falso que já não estivesse em I. Logo a interpretação I satisfaz a definição intuitiva de modelo 3-estável que é formalizada a seguir.
Definição 2.5.12 Uma interpretação 3-valorada M de um programa P é um modelo
3-estável se e somente se Γ∗ (M) = M.
Esta definição é uma extensão direta da definição de modelo estável (2-valorado) de
Gelfond e Lifschitz [GL88]. É mostrado em [Prz90] que quando o modelo 3-estável é uma
interpretação 3-valorada onde nenhum fato possui o valor-verdade u, então este modelo
coincide com o modelo estável. Programas que não possuem modelo estável possuem
modelo 3-estável como foi mostrado no exemplo 2.5.12.
Observação 2.5.2 (Grau de informação) Przymusinski diferencia duas ordens naturais entre as interpretações 3-valoradas. Uma delas, denotada por 4 (definição 2.5.9), é
chamada de ordem padrão, e a outra denotada por 4k , é chamada de ordem de conhecimento (também conhecida como ordem de Fitting), onde u 6k t, u 6k f, t e f são
incomparáveis.
A noção de modelo 4k minimal é diferente da noção de modelo minimal. Enquanto que
modelo minimal de um programa P minimiza o grau de verdade dos átomos pela minimização do conjunto de átomos positivos e maximização dos negativos; modelo 4k minimal
minimiza o grau de informação de seus átomos através da minimização do conjunto de
átomos positivos e negativos, e pela maximização dos indefinidos. Desta forma, pode se
dizer que o modelo MP que contém os fatos positivos e negativos que estão presentes em
todos os modelos 3-estáveis de um programa P é o modelo 4k minimal entre todos os
modelos 3-estáveis de P .
O principal resultado apresentado por Przymusinski [Prz90] é que a semântica bemfundada de todo programa P é dada pelo modelo 3-estável 4k minimal de P . Este resultado implica em todo programa possuir pelo menos um modelo 3-estável, e implica na
semântica bem-fundada de um programa P ser modelo 3-estável de P . Este resultado é
formalizado pelo seguinte teorema:
Teorema 2.5.4 ([Prz90]) Todo programa P possui um modelo 3-estável 4k minimal
denotado por MP . O modelo MP sempre coincide com a semântica bem-fundada de P , e
é chamado de modelo bem-fundado de P .
Desta forma, o modelo MP dado pela semântica bem-fundada para um programa P
é o mais cético de todos os modelos 3-estáveis, pois é o que possui maior quantidade de
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
38
fatos indefinidos. Pode se dizer que a semântica bem-fundada “acredita” somente nos
fatos que são sustentados em todos os mundos (os modelos 3-estáveis) do programa.
O próximo exemplo mostra um programa para o qual a semântica de modelo estável
não se aplica, e a semântica bem-fundada se aplica.
Exemplo 2.5.13 (Programa possui apenas a semântica bem-fundada) Considere
programa P do exemplo 2.5.8, mostrado a seguir:
p ←∼ q
q ←∼ p
O programa possui dois modelos estáveis: em um deles p é verdadeiro e q é falso, e no
outro p é falso e q é verdadeiro. Portanto o programa não possui uma semântica de modelo
estável. Entretanto a semântica bem-fundada de P é dada pela interpretação 3-valorada
onde p e q são indefinidos.
Os modelos 3-estáveis são extensões de modelos estáveis. Entretanto, a semântica
bem-fundada não estende a semântica de modelo estável. O próximo exemplo mostra que
o sentido contrário do teorema 2.5.2 não é válido. Existem programas para os quais a
semântica de modelo estável não coincide com a semântica bem-fundada.
Exemplo 2.5.14 Seja P o seguinte programa:
a ←∼ b
b ←∼ a
p ←∼ p
p ←∼ b
P possui um único modelo 2-estável, onde a e p são verdadeiros, e b é falso. Porém a
semântica bem-fundada de P é um modelo parcial e igual a vazio, ou seja, a, b e p são
indefinidos.
A definição de semântica bem-fundada apresentada nesta seção, apenas oferece um
mecanismo para identificar se determinada interpretação representa a semântica bemfundada de um programa P . Para se obter o modelo correspondente à semântica bemfundada, é necessário testar todas as possı́veis de interpretações 3-valoradas do programa,
identificar as que são modelos 3-estáveis, e então construir o modelo da semântica bemfundada com os fatos verdadeiros e falsos presentes em todos os modelos 3-estáveis de
P.
Métodos construtivos e mais eficientes do que a descrição anterior foram propostos
por Przymusinski [Prz89] e Van Gelder [Van89]. Ambos os métodos são baseados na
semântica do ponto fixo, e são descritos nas próximas seções.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
2.5.4
39
Ponto fixo Reincidente para Semântica bem-fundada
Na seção anterior foi apresentada a definição de semântica bem-fundada baseada em
modelos 3-estáveis [Prz90]. Um método construtivo desta semântica é apresentado por
Przymusinski em [Prz89], e é descrito nesta seção.
As definições da lógica 3-valorada, programa, interpretação 3-valorada e modelos 3estáveis, encontram-se na seção anterior 2.5.3.
Seja P um programa e I uma interpretação 3-valorada. São definidos então, dois
operadores TI e FI que geram novos fatos não presentes em I a partir do programa P e
dos fatos já conhecidos que estão em I.
Definição 2.5.13 Sejam os conjuntos T e F de átomos instanciados. É definido que:
TI (T )={A| se existe regra do tipo A ← L1 , . . . , Lm em ground(P )6 e todo i 6 m, Li
é verdadeiro em I ou Li ∈ T }
FI (F )={A| se toda regra do tipo A ← L1 , . . . , Lm em ground(P ) e existe i 6 m, Li é
falso em I ou Li ∈ F }
Proposição 2.5.1 ([Prz89]) Os operadores TI e FI são monotônicos, isto é:
TI (T ) ⊆ TI (T 0 ) se T ⊆ T 0 ; e
FI (F ) ⊆ FI (F 0 ) se F ⊆ F 0 .
Os subconjuntos TI e FI denotam os menores pontos fixos, respectivamente, dos operadores TI e FI , e são obtidos de forma iterativa como definido a seguir:
Definição 2.5.14 Seja I = hT ; F i uma interpretação 3-valorada de um programa P .
Temos que:
TI0 = ∅
TIn+1 = TI (TIn )
TI =
[
TIn
n<ω
FI0 = B(P )
FIn+1 = FI (FIn )
FI =
\
FIn
n<ω
onde B(P ) denota o conjunto de átomos de P instanciados (base de Herbrand ).
Proposição 2.5.2 ([Prz89]) A sequência {TIn }n>0 é crescente, e a sequência {FIn }n>0 é
decrescente.
Intuitivamente temos que TI contém novos fatos verdadeiros que podem ser derivados
de P conhecendo-se I, e FI contém os fatos que são deduzidos como falsos a partir de P
e I.
6
O programa instanciado é denominado ground(P )
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
40
A partir de TI e FI é possı́vel definir o operador I, que estende a interpretação I para
I(I), adicionando-se à interpretação I os novos fatos verdadeiros de TI e os falsos de FI
que foram obtidos de P conhecendo-se I:
Definição 2.5.15 Seja I uma interpretação 3-valorada. É definido que:
I(I) = I ∪ hTI ; FI i
Proposição 2.5.3 ([Prz89]) O operador I(I) é monotônico.
Definição 2.5.16 O operador I(I) define a seguinte sequência de passos:
Mn+1
M0 = h∅; ∅i
= I(Mn ) , isto é, Mn+1 = Mn ∪ hTMn ; FMn i
[
Mα =
Mβ
β<α
A sequência {Mn }n>0 é monotonicamente crescente e converge para o menor ponto fixo
de I, denotado por MP .
O modelo MP denota o menor ponto fixo de I, que por sua vez é definido através dos
pontos fixos dos operadores TI e FI . Isto explica a denominação operador de ponto fixo
reincidente de P .
O próximo teorema comprova que o modelo MP obtido de modo construtivo, coincide
com o modelo fornecido pela semântica bem-fundada.
Teorema 2.5.5 ([Prz89]) O modelo MP é modelo minimal 3-valorado de P , e coincide
com a semântica bem-fundada de P .
O próximo exemplo mostra a aplicação do operador I.
Exemplo 2.5.15 (Cálculo do modelo ponto fixo reincidente) Considere o seguinte
programa P :
w(X) ← m(X, Y ), ∼ w(Y )
Intuitivamente temos que para resolver w(X) é preciso encontrar um Y tal que m(X, Y )
é verdadeiro e não é possı́vel resolver w(Y ). Suponha que inicialmente temos os fatos
{m(a, b), m(b, c), m(d, d)}. Os átomos relativos ao predicado m são omitidos pois são
fixos.
B(P ) = {w(a), w(b), w(d), m(a, b), . . .}.
M0 = h∅; ∅i
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
41
M1 = I(M0 ) , i. e. M1 = M0 ∪ hTM0 ; FM0 i
0
TM
=∅
0
1
0
2
TM0 = TM0 (TM
) = ∅ = TM
0
0
0
FM0 = B(P )
2
0
1
= FM0 (FM
) = {w(c)} = FM
FM
0
0
0
M1 = h∅; {w(c)}i
M2 = I(M1 ) , i. e. M2 = M1 ∪ hTM1 ; FM1 i
0
TM
=∅
1
1
0
2
TM
= TM1 (TM
) = {w(b)} = TM
1
1
1
0
FM
=
B(P
)
1
1
0
2
FM
= FM1 (FM
) = {w(c)} = FM
1
1
1
M2 = h{w(b)}; {w(c)}i
M3 = I(M2 ) , i. e. M3 = M2 ∪ hTM2 ; FM2 i
0
TM
=∅
2
1
0
2
TM2 = TM2 (TM
) = {w(b)} = TM
2
2
0
FM
=
B(P
)
2
1
0
2
FM
= FM2 (FM
) = {w(a), w(c)} = FM
2
2
2
M3 = h{w(b)}; {w(a), w(c)}i = M4
Portanto, o modelo M3 é o modelo MP , e coincide com o modelo bem-fundado de P , onde
w(b) é verdadeiro, w(a) e w(c) são falsos, e w(d) é indefinido.
2.5.5
Ponto fixo Alternante para Semântica bem-fundada
Nesta seção é apresentada outra definição construtiva da semântica bem-fundada [Prz90]
(descrita na seção 2.5.3), que foi proposta por Van Gelder em [Van89].
A idéia intuitiva do método apresentado em [Van89], é construir monotonicamente um
conjunto de fatos negativos até se chegar a um ponto fixo. A partir deste conjunto de
fatos negativos são deduzidos fatos positivos. A união do conjunto de fatos positivos com
o conjunto de fatos negativos forma um conjunto que coincide com o modelo definido pela
semântica bem-fundada.
A definição do ponto fixo alternante trabalha com conjuntos de átomos, negados ou
não. Tais átomos pertencem ao conjunto de átomos instanciados do programa, denotado
por B(P ), ou base de Herbrand. Desta forma as instâncias são definidas como conjuntos
de literais (átomos ou átomos negados), e os átomos que não estão no conjunto são
considerados indefinidos.
A seguir são apresentadas definições de notações que serão utilizadas nesta seção.
Definição 2.5.17 Se I é um conjunto de literais, então ∼ I denota o conjunto de literais
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
42
de I complementados, do seguinte modo:
1) Para todo A ∈ I, temos ∼ A ∈∼ I;
2) Para todo ∼ A ∈ I, temos A ∈∼ I.
As operações + e − representam respectivamente as operações de união e diferença
entre conjuntos.
Exemplo 2.5.16 Seja I = {p, ∼ q} e J = {p, ∼ q, r, s}. Então:
∼ I = {∼ p, q},
I + J = {p, ∼ q, r, s},
J − I = {r, s}.
Definição 2.5.18 (Conjugado) O conjugado de um conjunto de literais é definido somente para conjuntos onde todos os literais são positivos ou todos são negativos do
seguinte modo:
1) Se I é um conjunto de literais positivos, então o seu conjugado é dado por:
Ī =∼(B(P )−I);
2) Se J é um conjunto de literais negativos, então o seu conjugado é dado por:
J̄ =B(P )−(∼ J).
É utilizada a convenção de se identificar os conjuntos de literais (ou instâncias) com o
sinal “∼” (ou “+”) sobreescrito, para indicar que se trata de um conjunto onde todos os
literais são negativos (ou positivos). Os sı́mbolos fazem parte dos identificadores, e não
representam a operação de negação (ou adição).
Na semântica de modelo estável [GL88] (descrita em 2.5.2) a instância I de um programa P é representada como um conjunto dos átomos instanciados positivos que são
verdadeiros na instância. Desta forma, o conjugado de I, denotado por Ī, é o conjunto
com os átomos instanciados negativos que são verdadeiros em I.
Exemplo 2.5.17 Seja I = {p, q} e B(P ) = {p, q, r, s}. Então:
Ī = {∼ r, ∼ s}.
Definição 2.5.19 A transformação de estabilidade S 0 é definida da seguinte maneira.
Seja P um programa e I∼ um conjunto de átomos negativos. O programa transformado
P 0 é obtido das regras de ground(P ), onde:
1) Literais negativos do tipo ∼ p, que ocorrem no corpo das regras, são considerados
como novos átomos identificados por ∼ p7 ;
2) É acrescentado ao programa transformado P 0 uma regra do tipo ∼ p ← para todo
∼ p ∈ I∼ .
7
Neste caso o sinal ∼ apenas faz parte do identificador do átomo.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
43
Desta forma o programa transformado P 0 é um programa sem negação, e através do
operador de consequência imediata TP 0 , uma extensão direta de TP (definido em 2.4.6), é
possı́vel se chegar ao único modelo minimal de P 0 . O menor ponto fixo de TP 0 é denotado
por SP (I∼ ).
Definição 2.5.20 Seja P 0 um programa transformado e I uma instância. O operador
TP 0 (I) é definido por:
TP 0 (I) = {A | existe regra em ground(P ) do tipo A ← B1 , . . . , Bn onde
{B1 , . . . , Bn } ⊆ I},
onde é necessário que os literais negativos estejam explicitamente presentes em I.
Da mesma forma que o menor ponto fixo de TP pode ser obtido de forma iterativa,
o menor ponto fixo de TP 0 também pode ser obtido de forma construtiva a partir da
instância vazia, como é mostrado a seguir:
TP1 0 (∅) = TP 0 (∅)
TP2 0 (∅) = TP 0 (TP 0 (∅))
TP3 0 (∅) = TP 0 (TP2 0 (∅))
...
TP 0 ↑= sup{TPn0 }n>0
Definição 2.5.21 Seja P um programa e I∼ um conjunto de átomos negativos. SP (I∼ )
é o menor ponto fixo de TP 0 , onde P 0 é obtido da transformação S 0 de P e instância I∼ .
Ou seja, SP (I∼ ) = TP 0 ↑.
Exemplo 2.5.18 Seja o programa P descrito a seguir:
p ←∼ q
q ←∼ r
onde B(P ) = {p, q, r}.
Seja a instância M = {q}. O conjugado de M é dado por M = {∼ p, ∼ r}. Ou seja,
M é o conjunto dos átomos negativos que são verdadeiros segundo a instância M .
O programa transformado P 0 obtido de ground(P ) e instância I∼ = M , é mostrado a
seguir:
p ←∼ q
q ←∼ r
∼p←
∼r←
O cálculo iterativo de TP 0 é dado por:
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
44
TP 0 (∅) = {∼ p, ∼ r}
TP1 0 (∅) = {q, ∼ p, ∼ r} = TP2 0
TP 0 ↑= {q, ∼ p, ∼ r}.
Logo, SP (I∼ ) = {q, ∼ p, ∼ r}. Este resultado mostra que a partir do conjunto de fatos
negativos I∼ , foi derivado um único fato positivo (q) e o conjunto inicial de fatos negativos
({∼ p, ∼ r}).
A versão estendida do operador de transformação de estabilidade Sπ [GL88] (descrito
em 2.5.3) é definida a seguir:
Definição 2.5.22 Seja P um programa e I∼ um conjunto de fatos negativos. O operador
de transformação de estabilidade estendido S̄P (I∼ ) é definido por:
S̄P (I∼ ) = SP (I∼ ) =∼ (B(P ) − SP (I∼ )).
Exemplo 2.5.19 Continuando o exemplo 2.5.18, onde SP (I∼ ) = {q, ∼ p, ∼ r}, temos
que S̄P (I∼ ) = {∼ p, ∼ r} = I∼ .
Proposição 2.5.4 ([Van89]) Seja P um programa e M um conjunto de átomos positivos que representa uma instância de P . Seja M o conjugado de M .
Se S̄P (M ) = M então M é modelo estável de P .
Exemplo 2.5.20 A instância M dada no exemplo 2.5.18 é modelo estável de P .
O operador de ponto fixo alernatante é definido a seguir.
Definição 2.5.23 Seja P um programa e I∼ um conjunto de fatos negativos. O operador
de ponto fixo alternante denotado por AP (I∼ ) é definido por:
AP (I∼ ) = S̄(S̄P (I∼ ))
Proposição 2.5.5 ([Van89]) O operador AP (I∼ ) é monotônico.
A seguir é definido o modelo resultante da aplicação do operador ponto fixo alternante.
Definição 2.5.24 O menor ponto fixo do operador AP aplicado ao programa P e instância
I∼ é denotado por A∼ . É definido que A+ = SP (A∼ ), e o modelo do ponto fixo alternante
denotado por MAP é dado por MAP = (A+ + A∼ ).
Intuitivamente temos que A∼ é o conjunto de fatos negativos deduzidos do programa
P a partir da instância com os fatos negativos conhecidos inicialmente I∼ . A partir deste
conjunto A∼ é deduzido um conjunto de fatos positivos A+ , e a união destes conjuntos
resulta no modelo do ponto fixo alternante MAP . O modelo MAP coincide com o modelo definido pela semântica bem-fundada. Este resultado importante é formalizado no
próximo teorema.
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
45
Teorema 2.5.6 (Modelo bem-fundado) O modelo produzido pela aplicação operador
ponto fixo alternante AP coincide com a semântica bem-fundada.
Exemplo 2.5.21 (Cálculo do modelo ponto fixo alternante) Considere o mesmo programa P do exemplo 2.5.15:
w(X) ← m(X, Y ), ∼ w(Y )
Suponha que inicialmente temos os fatos {m(a, b), m(b, c), m(d, d)}. Desta forma, B(P ) =
{w(a), w(b), w(c), w(d), m(a, b), . . .}. Os átomos relativos ao predicado m serão omitidos
uma vez que eles são fixos.
O programa instanciado ground(P ) é descrito a seguir:
w(a) ← m(a, b), ∼ w(b)
w(b) ← m(b, c), ∼ w(c)
w(d) ← m(d, d), ∼ w(d)
Vamos calcular a sequência definida pela aplicação do operador AP mostrada a seguir:
I∼
0 = ∅
∼
I1 = S̄P (I∼
0)
1
∼
AP = I2 = S̄P (I∼
1)
∼
I∼
3 = S̄P (I2 )
∼
A2P = I∼
4 = S̄P (I3 )
...
∼
I∼
1 = S̄P (I0 )
SP (I∼
↑= ∅
0 ) = TP ∪I∼
0
∼
I1 =∼ (B(P ) − SP (Ī0 )) = {∼ w(a), ∼ w(b), ∼ w(c), ∼ w(d)}
∼
I∼
2 = S̄P (I1 )
SP (I∼
↑= {w(a), w(b), w(d), ∼ w(a), ∼ w(b), ∼ w(c), ∼ w(d)}
1 ) = TP ∪I∼
1
∼
I∼
2 =∼ (B(P ) − SP (I1 )) = {∼ w(c)}
A1P (∅) = {∼ w(c)}
∼
I∼
3 = S̄P (I2 )
↑= {w(b), ∼ w(c)}
SP (I∼
2 ) = TP ∪I∼
2
∼
I3 =∼ (B(P ) − SP (I∼
2 )) = {∼ w(a), ∼ w(c), ∼ w(d)} = Ī5
∼
I∼
4 = S̄P (I3 )
↑= {w(b), w(d), ∼ w(a), ∼ w(c), ∼ w(d)}
SP (I∼
3 ) = TP ∪I∼
3
∼
I∼
4 =∼ (B(P ) − SP (I3 )) = {∼ w(a), ∼ w(c)} = Ī6
CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
46
A2P (∅) = {∼ w(a), ∼ w(c)} = A3P (∅)
∼
∼
∼
∼
Como I∼
5 = I3 e I4 = I6 , então I4 é o ponto fixo de AP .
A∼ = {∼ w(a), ∼ w(c)}
A+ = SP (A− ) = {w(b)}
Portanto o modelo do ponto fixo alternante é {∼ w(a), w(b), ∼ w(c)}, e este é também
o modelo fornecido pela semântica bem-fundada. Nesta representação os fatos omitidos,
como w(d), são associados ao valor-verdade indefinido.
2.6
Conclusão do capı́tulo
Neste capı́tulo foram introduzidos os fundamentos teóricos que são importantes para a
compreensão da definição de P-Datalog¬ . Na primeira seção foram apresentados conceitos
algébricos utilizados na programação em lógica. Em seguida, na seção 2.2, foi apresentada
uma classificasção de programas na programação em lógica, segundo a qual os programas
P-Datalog¬ , definidos no capı́tulo 4, são da classe de programas lógicos padrões, ou seja,
programas que aceitam a negação por default somente no corpo de suas regras.
Na seção 2.3 foi descrita a lógica paraconsistente LFI1, a lógica base de P-Datalog¬ .
Os programas P-Datalog¬ são formados por regras que podem ser associadas a fórmulas
fechadas da lógica LFI1.
A linguagem de consultas P-Datalog¬ é uma extensão da linguagem Datalog¬ , que por
sua vez, é uma extensão de Datalog, como mostra a Figura 1.1. A linguagem de consultas
Datalog, sua sintaxe, suas diferentes abordagens semânticas e métodos de avaliação, foram
descritas na seção 2.4. Em seguida, na seção 2.5, foi introduzida a linguagem Datalog¬ e
sua semântica bem-fundada, juntamente com métodos construtivos para obtenção desta
semântica bem-fundada.
Capı́tulo 3
Trabalhos Relacionados
O tratamento de inconsistências tem sido um assunto amplamente abordado em trabalhos
de pesquisa. Alguns são diretamente relacionados com a integração de banco de dados e
outros relacionados com a programação em lógica como representação do conhecimento.
Neste capı́tulo são apresentadas propostas de tratamento de informações inconsistentes
na programação em lógica (seção 3.1), e na integração de dados (seção 3.2).
3.1
Inconsistência na programação em lógica
O poder de expressão dos programas lógicos tem sido enriquecido com a adição à sua
sintaxe da negação tanto no corpo como na cabeça das regras, e também devido a inclusão de mais de um tipo de negação. Tais avanços implicam em novas maneiras de se
representar e processar o conhecimento através de programas lógicos.
A avaliação de consultas à base de dados é mais precisa, uma vez que é possı́vel
distinguir entre a consulta que falha porque não sucede (negação por default), e a que
falha num sentido mais forte, quando a negação sucede (negação explı́cita). Outro avanço
importante é a possibilidade de se representar e se raciocinar na presença de informações
conflitantes, pois a presença de literais positivos e negativos na cabeça das regras pode
gerar informações contraditórias que devem ser tratadas de alguma forma: eliminando-as
ou mantendo-as e ainda assim conseguir raciocinar.
É importante ressaltar que apesar da linguagem P-Datalog¬ , descrita em detalhes no
capı́tulo 4, não permitir literais negativos na cabeça das regras, as instâncias do banco
de dados contém inconsistências, e portanto a semântica de P-Datalog¬ também deve ser
capaz de raciocinar na presença da inconsistência.
Segundo [DP98], existem diferentes maneiras de se tratar a inconsistência na programação em lógica:
• Abordagem da revisão de crença (Belief revision): o programa é corrigido
de maneira que as inconsistências são eliminadas.
47
CAPÍTULO 3. TRABALHOS RELACIONADOS
48
• Abordagem paraconsistente: a semântica aceita as contradições e o processo de
dedução consegue lidar com a presença de inconsistências.
A informação contraditória pode ocorrer devido a algum erro na especificação e é
desejável que o erro seja corrigido. Neste caso as técnicas baseadas na abordagem da
revisão de crença devem ser utilizadas. Em outras situações a informação fornecida é por
si só contraditória e não deve ser corrigida. Neste caso é necessário um mecanismo de
dedução paraconsistente.
Entretanto, para se executar uma correção pela abordagem da revisão de crença é
necessário detectar a inconsistência e sua origem numa primeira etapa. Ou seja, um
mecanismo paraconsistente é um passo intermediário para se executar a correção pela
abordagem da revisão de crença.
Uma extensa pesquisa sobre diversas semânticas paraconsistentes( [Sak92, PA92, BS87]
e outras), é apresentada em [DP98], com enfoque nas semânticas bem-fundadas e de modelos estáveis. Em [Sak92] e [PA92], são apresentadas extensões da semântica bem-fundada
para programas lógicos estendidos, definida por Przmusinski [Prz90]. A semântica [Sak92],
ao contrário da semântica de Przymusinski, adota uma abordagem paraconsistente, e
baseia-se em uma lógica 7-valorada. Os trabalhos de Blair e Subrahmanian [BS87, CS89]
foram pioneiros na introdução da paraconsistência na programação em lógica. Neles é proposto um tratamento de informações contraditórias de modo coerente, sem a trivialização
do processo dedutivo. A semântica apresentada em [BS87] é descrita a seguir.
3.1.1
Semântica 4-valorada de programa lógico geral
Nesta seção é apresentada a semântica de programas lógicos gerais proposta por Blair e
Subrahmanian em “Paraconsistent Logic Programming” [BS87], onde podem ser encontrados maiores detalhes sobre os resultados apresentados e suas demonstrações.
Em [BS87], Blair e Subrahmanian propõem transformar um programa lógico geral em
um programa sem negação, pela substituição dos sı́mbolos de negação por átomos anotados (annotated atoms). Para possibilitar a representação de informações inconsistentes e
também das informações incompletas, é utilizada a lógica 4-valorada de Belnap [Bel77].
Lógica 4-valorada FOUR
Quando a negação é permitida na cabeça das regras, os programas podem ser inconsistentes pois podem deduzir fatos do tipo ¬A e A. Para representar a semântica destes
programas onde os fatos podem ser verdadeiros, falsos, indefinidos ou contraditórios, é
necessária uma lógica pelo menos 4-valorada. Uma das mais conhecidas lógicas 4-valoradas
é a lógica FOUR (figura 3.1), definida por Belnap [Bel77], onde temos o conjunto de
valores-verdade T ={⊥, f, t, >}, cujos elementos representam respectivamente os valores
CAPÍTULO 3. TRABALHOS RELACIONADOS
¡¡
¡¡
¡
¡
¡¡
f>
>>
>>
>>
>
49
>=
==
==
==
=
⊥
¢
¢¢
¢
¢¢
¢¢
t
Figura 3.1: Lógica 4-valorada FOUR
indeterminado, falso, verdadeiro e contraditório. A ordem entre os valores do conjunto T
é dada por:
∀xy ∈ T x 4 y ⇔ x = y ∨ x = ⊥ ∨ y = >
de forma que o conjunto T e a ordem 4 formam um reticulado completo (veja seção 2.1.2).
Os literais anotados são introduzidos na definição seguinte.
Definição 3.1.1 Seja A um literal, isto é, um átomo ou a negação de um átomo. Então
A : µ é chamado de literal anotado, onde µ ∈ T e µ é chamado de anotação de A. Se
µ ∈ {t, f}, então A : µ é chamado de literal bem anotado, e µ de anotação-w.
O significado intuitivo de um literal bem anotado A : t é “A é conhecido como verdadeiro”. Da mesma forma A : f possui o significado intuitivo de “A é conhecido como
falso”. Note que tanto A : t quanto A : f são literais positivos anotados (não são precedidos pelo sı́mbolo de negação), mesmo que A : f contenha uma informação negativa.
As fórmulas anotadas consideradas são fórmulas bem formadas [Sou02] com a adição
dos literais anotados descritas indutivamente a seguir.
Definição 3.1.2 (Fórmulas)
1) Um átomo anotado é um literal positivo anotado.
2) Todo átomo anotado é uma fórmula anotada.
3) Se A : µ é um átomo anotado, então ¬A : µ é uma fórmula anotada.
4) Se F1 , F2 são fórmulas anotadas, então F1 ∧ F2 , F1 ∨ F2 , F1 ← F2 , F1 ↔ F2 são
fórmulas anotadas.
5) Se F é uma fórmula e x uma variável, então ∀xF e ∃xF são fórmulas anotadas.
Um programa cujos literais são anotados é chamado de programa Horn generalizado,
como é definido a seguir.
Definição 3.1.3 (Programa Horn generalizado GHP) Um programa Horn generalizado denotado por GHP é um conjunto finito de cláusulas do tipo:
A0 : µ0 ← A1 : µ1 , . . . , An : µn
CAPÍTULO 3. TRABALHOS RELACIONADOS
50
onde A0 , . . . , An são literais e µ0 , . . . , µn são anotações-w. Este tipo de cláusula é denominada cláusula-gh.
Note que no programa GHP só aparecem anotações-w cujos valores-verdade são sempre f ou t.
Exemplo 3.1.1 O programa seguinte é um exemplo de um programa GHP.
¬p(a) : t ← p(b) : f
p(a) : f ← p(b) : t
p(b) : t ← p(a) : f
p(b) : f ← ¬p(a) : f
Semântica dos programas GHP
As interpretações de um programa GHP P são mapeamentos de B(P ) → T , onde B(P )
denota o conjunto de átomos instanciados do programa P (base de Herbrand).
A negação de uma anotação é definida por: ¬t = f, ¬f = t, ¬⊥ = ⊥ e ¬> = >.
Definição 3.1.4 Uma interpretação I satisfaz uma sentença1 F , denotado por I |= F de
acordo com:
1)
2)
3)
4)
5)
6)
7)
8)
I |= A : µ se e somente se I(A) < µ,
I |= ¬A : µ se e somente se I |= A : ¬µ,
I |= F1 ∧ F2 se e somente se I |= F1 e I |= F2 ,
I |= F1 ∨ F2 se e somente se I |= F1 ou I, |= F2 ,
I |= F1 ← F2 se e somente se I 6|= F2 ou I |= F1 ,
I |= F1 ↔ F2 se e somente se I |= F1 ← F2 e I |= F2 ← F1 ,
I |= (∀x)F se e somente se I |= F 0 para toda instanciação F 0 de F ,
I |= (∃x)F se e somente se I |= F 0 para alguma instanciação F 0 de F .
onde F , F1 , F2 são sentenças.
A definição de modelo de programa GHP é dada a seguir.
Definição 3.1.5 Uma interpretação I é modelo de um programa GHP P se e somente se
I satisfaz todas as cláusulas-gh pertencentes a P .
Definição 3.1.6 (Instância e modelo) Seja o programa GHP G descrito a seguir:
p(a) : t ← p(b) : f
p(b) : t ← p(a) : f
1
Sentenças são fórmulas sem variáveis livres.
CAPÍTULO 3. TRABALHOS RELACIONADOS
51
Sejam I1 , I2 e I3 interpretações de G onde:
I1 (p(a)) = f
I2 (p(a)) = f
I3 (p(a)) = ⊥
I1 (p(b)) = t;
I2 (p(b)) = f;
I3 (p(b)) = ⊥.
As interpretações I1 e I3 são modelos de G, porém I2 não é modelo de G.
A ordem natural entre as instâncias I1 e I2 de um dado programa GHP P é dada por:
I1 4 I2 se e somente se ∀A ∈ B(P ), I1 (A) 4 I2 (A)
O conjunto de interpretações do programa GHP P , denotado por InstP e a ordem 4
formam um reticulado completo.
Na seção 2.5 foram apresentadas duas semânticas de programas Datalog¬ que têm
em comum o uso de alguma forma de transformação do programa com negação em um
programa sem negação, e então é aplicado um operador que é uma extensão do operador
de consequência imediata TP (definido em 2.4.6) para construir o modelo minimal. Blair
e Subrahmanian propõem um esquema similar, onde é feita a substituição dos literais
negativos (precedidos pelo sı́mbolo de negação) no programa por átomos anotados, e
depois definem um operador TG que é uma extensão do operador TP .
A definição seguinte mostra como os sı́mbolos de negação que precedem os literais do
programa são substituı́dos por anotações.
Definição 3.1.7 Se C é uma cláusula-gh de um programa GHP G, então o resultado
da substituição de todos os literais negados do tipo ¬A : µ de C por A : ¬µ é chamada
de contraparte positiva de C e denotada por C pos . O programa GHP Gpos é obtido pela
substituição de toda cláusula-gh C do programa GHP G por C pos .
O próximo teorema assegura que o esquema de átomos anotados é suficiente para
substituir os átomos negados pela negação implı́cita na forma de átomos anotados com o
valor-verdade f.
Teorema 3.1.1 ([BS87]) Uma interpretação I é modelo do programa GHP G se e somente se I é modelo de Gpos .
O programa Gpos definido anteriormente não possui literais negativos (a negação
está implı́cita na forma da anotação associada ao átomo). Assim como na definição
da semântica de programas Datalog, que são programas sem negação, foi mostrado que
é possı́vel obter o seu modelo minimal através do operador TP (definido em 2.4.6), para
programas Gpos é definido uma extensão deste operador.
CAPÍTULO 3. TRABALHOS RELACIONADOS
52
Definição 3.1.8 Seja Gpos um programa GHP. Então TG é um mapeamento de InstP
para InstP definido por:
TG (I)(A) = sup{µ|A : µ ← B1 : µ1 , . . . , Bk : µk é uma cláusula-gh instanciada de Gpos , e
I |= B1 : µ1 , . . . , Bk : µk }.
Desta forma, o valor-verdade µ de A corresponde ao menor limitante superior de todos
os µs das cláusulas-gh onde A é cabeça, e o corpo é satisfeito em I.
De forma análoga ao desenvolvimento apresentado para a semântica do ponto fixo
de programas Datalog sem negação na seção 2.4, onde as propriedades do operador TP
(definido em 2.4.6) são apresentadas, resultados similares serão mostrados para o operador
TG de forma sucinta. Os resultados apresentados a seguir e as suas demonstrações são
encontrados em [BS87].
Lema 3.1.1 ([BS87]) Seja Gpos um programa GHP. Temos, então, os seguintes resultados:
• O operador TG é monotônico;
• Uma instância I é um modelo de Gpos se e somente se TG (I) 4 I;
Teorema 3.1.2 ([BS87]) Todo programa GHP Gpos possui um modelo minimal MG .
MG coincide com o menor ponto fixo de TG .
A próxima definição mostra que TG ao ser aplicado de forma iterativa, a partir da
instância inicial onde todos os átomos possuem o valor-verdade igual a ⊥, define uma
sequência crescente.
Definição 3.1.9 O operador TG calculado de forma iterativa é mostrado a seguir:
TG0 = ⊥
TGn = TG (TGn−1 )
TG ↑= sup{TGn }n>0
O operador TG é monotônico e, desta forma podemos definir a seguinte sequência crescente:
TG0 4 TG1 4 . . . 4 TG ↑.
O modelo minimal MG do programa GHP Gpos pode ser construı́do iterativamente
pela sequência definida em 3.1.9 pois TG ↑ corresponde ao menor ponto fixo de TG , como
mostra o próximo teorema.
CAPÍTULO 3. TRABALHOS RELACIONADOS
53
Teorema 3.1.3 ([BS87]) Seja Gpos um programa GHP e MG o seu modelo minimal.
Então temos que TG ↑= MG .
Exemplo 3.1.2 (Aplicação do operador TG ) Considere o seguinte programa G:
p(a) : t ← q(a) : f, r(a) : t
p(b) : t ← q(b) : f, r(b) : t
p(c) : t ← q(c) : f, r(c) : t
q(a) : t ←
r(a) : t ←
r(b) : f ←
q(b) : f ←
r(a) : f ←
r(c) : t ←
q(c) : f ←
O cálculo do menor ponto fixo a partir da instância ⊥ é descrito a seguir:
TG↑ = TG3 =
TG0
TG1
TG2
=
=
=
p(a)
⊥
⊥
⊥
p(b) p(c) q(a)
⊥
⊥
⊥
⊥
⊥
t
⊥
t
t
q(b)
⊥
f
f
q(c) r(a) r(b) r(c)
⊥
⊥
⊥
⊥
f
>
f
t
f
>
f
t
A semântica de programas GHP é definida da seguinte forma:
Definição 3.1.10 (Semântica de programas GHP) A semântica do programa GHP
G é definida pelo modelo minimal de Gpos . Este modelo coincide com o menor ponto fixo
do operador TG do programa Gpos de acordo com o teorema 3.1.3.
Um programa GHP G e sua interpretação, descritos através de literais anotados,
podem ser traduzidos para um programa e interpretação sem as anotações, através de um
procedimento apresentado em [DP98], e descrito a seguir.
Tradução de GHP para programa lógico geral
Seja um programa GHP Gpos e uma cláusula-gh arbitrária de Gpos da forma
A0 : µ0 ← A1 : µ1 , . . . , An : µn .
O corpo da cláusula-gh é transformado em uma conjunção de literais denotada por Body,
onde cada literal anotado Ai : t (Ai : f) é substituı́do por Ai (¬Ai ) respectivamente.
O programa QGHP é construı́do a partir de cada uma das cláusulas-gh de Gpos do
modo descrito a seguir:
1) Se µ0 = ⊥ então nada é adicionado a QGHP .
2) Se µ0 =f (µ0 =t) então é adicionada a regra ¬A0 ← Body (A0 ← Body) respectivamente.
3) Se µ0 = > então as duas regras ¬A0 ← Body e A0 ← Body são adicionadas ao programa
QGHP .
Desta forma, QGHP é um programa lógico geral pois pode apresentar literais negativos
tanto no corpo quanto na cabeça das regras.
A relação entre uma instância G de um programa Gpos e uma instância 3-valorada
(definida em 4.2.1) M é dada por:
CAPÍTULO 3. TRABALHOS RELACIONADOS
G(A) = ⊥
G(A) = t
G(A) = f
G(A) = >
se
se
se
se
e
e
e
e
somente
somente
somente
somente
se
se
se
se
54
A 6∈ M
A∈M
A 6∈ M
A∈M
e
e
e
e
¬A 6∈ M
¬A 6∈ M
¬A ∈ M
¬A ∈ M
Exemplo 3.1.3 (Traduzindo GHP ) Considere a tradução do programa GHP G do
exemplo 3.1.2 para um programa QGHP :
p(a) ← ¬q(a), r(a)
p(b) ← ¬q(b), r(b)
p(c) ← ¬q(c), r(c)
q(a) ←
r(a) ←
¬r(b) ←
¬q(b) ←
¬r(a) ←
r(c) ←
¬q(c) ←
A instância 3-valorada correspondente ao resultado TG ↑ é:
{ p(c), q(a), ¬q(b), ¬q(c), r(a), ¬r(a), ¬r(b), r(c)}.
Nesta representação os átomos com valor-verdade indefinido, e os contraditórios são representados da forma A e ¬A, como ocorre com o átomo r(a).
Discussão
A semântica de P-Datalog¬ , que será descrita no capı́tulo 4, também utiliza uma lógica 4valorada, porém a ordem entre os valores-verdade é dada por f 6 u 6 i 6 t (os valores u e i
correspondem a ⊥ e >). Intuitivamente, temos que o valor u (indefinido) é uma indicação
mais fraca da presença de um fato no banco de dados do que o valor i (inconsistente). A
semântica de P-Datalog¬ é uma extensão da semântica bem-fundada de Datalog¬ (seção
2.5.3).
A semântica de programas GHP assume que todo fato que não possa ser provado é
considerado indefinido, enquanto que na semântica de P-Datalog¬ ele pode ter um valor
assumido por default, como mostra o exemplo seguinte.
Exemplo 3.1.4 Considere o seguinte programa lógico geral P :
p ← ¬q
q←
O programa GHP G correspondente ao programa P é mostrado a seguir:
p:t←q:f
q:t←
Calculamos o menor ponto fixo de TG :
TG↑
= TG2 =
TG0
TG1
=
=
p q
⊥ ⊥
⊥ t
CAPÍTULO 3. TRABALHOS RELACIONADOS
55
Portanto, a semântica de programas GHP produz o modelo que diz que q é verdadeiro e p
é indefinido, pois não existe regra com ¬p na cabeça, e desta forma não é possı́vel afirmar
que p é falso.
Se considerarmos o programa P como um programa P-Datalog¬ , e mudarmos a negação
para a negação por default, o modelo produzido pela semântica de P-Datalog¬ dirá que q
é verdadeiro e p é falso.
3.2
Inconsistência na integração de fontes de dados
O problema da ocorrência de informações inconsistentes que surgem do processo de integração de fontes heterogêneas de dados, tem sido extensamente abordado em várias
pesquisas [ABC99, ABK00, ABC03, dACM02, CG01, Cho98, Sub94]. Assim como foi
descrito na seção anterior, a inconsistência na integração de fontes de dados é tratada segundo a perspectiva da revisão de crença, ou segundo a perspectiva paraconsistente. Nas
próximas seções são descritos dois trabalhos, cada um com uma abordagem diferente,
apresentados em [CG01] e em [ABC99]. O primeiro trabalho trata a integração de fontes
de dados sob a perspectiva da revisão de crença, enquanto que o segundo apresenta uma
abordagem paraconsistente.
3.2.1
Abordagem da revisão de crença na integração
Nesta seção é descrita a proposta de Cholvy e Garion [CG01] que propõe uma lógica sob
a perspectiva da revisão de crença (belief revision), capaz de raciocinar e integrar dados
provenientes de diversas fontes de informação.
Na integração de dados, as informações podem ser vistas como crenças que as fontes
tem sobre o mundo real. Neste caso podemos dizer que o objetivo do processo de integração é aperfeiçoar a nossa percepção do mundo real através da compilação das diferentes
crenças fornecidas pelas fontes de informação.
Quando lidamos com múltiplas fontes de informação existe a possibilidade de ocorrência
de inconsistências entre as fontes, e o processo de integração de fontes deve tratar de alguma forma estas possı́veis inconsistências. Cholvy e Garion argumentam que muitas
vezes o processo de integração depende de informações adicionais sobre as fontes a serem
integradas como, por exemplo, o grau de confiabilidade de cada uma delas (quanto mais
confiável for a fonte de informação, mais de acordo com ela deve estar o resultado do processo de integração). Entretanto, se este tipo de informação adicional, também chamado
de meta-informação, não é conhecido, então é preciso definir outro critério para a integração de fontes de informação.
Cholvy e Garion citam dois operadores definidos por Konieczny e Pino-Perez [KPP98]
que podem ser utilizados como critério no processo de integração: o operador de maioria
CAPÍTULO 3. TRABALHOS RELACIONADOS
56
e o de consenso. A diferença intuitiva entre um operador de maioria e um de consenso é
que o operador de consenso tenta negociar um resultado que agrade ao máximo possı́vel de
fontes, enquanto que um operador de maioria escolhe, como resultado da integração, o que
é acreditado pela maioria das fontes. Ou seja, o operador de consenso tenta minimizar a
insatisfação individual, enquanto que o de maioria tenta minimizar a insatisfação global.
Por exemplo, José, Pedro e Carlos têm que dedidir o que farão à noite. José e Pedro
querem ir ao restaurante e ao cinema. Carlos não que sair, não quer ir ao restaurante e nem
ao cinema. Um operador de maioria determinaria que o grupo sairia para o restaurante e
o cinema, enquanto que o de consenso definiria que o grupo iria ou ao restaurante ou ao
cinema, mas não aos dois lugares. Desta forma, cada membro do grupo seria satisfeito o
máximo possı́vel.
A partir do operador de maioria é definida a lógica MF que permite raciocinar com
os dados provenientes de diversas fontes de informações, e possibilita a integração destes
dados de acordo com o operador de maioria.
Em [CG01], Cholvy e Garion definem a linguagem da lógica MF, sua semântica segundo a teoria de modelos e segundo a teoria da prova. A semântica de MF é um tipo
de semântica de Kripke da lógica modal. Como a lógica modal foge do escopo desta
dissertação, maiores informações sobre este assunto podem ser encontradas em [Che80].
A lógica MF e o seu sistema axiomático2 são descritos a seguir.
A lógica MF
A lógica MF é definida para que seja possı́vel raciocinar com a fonte de informação resultante da integração de várias fontes. As fontes de informação são vistas como conjuntos
de literais, e representam intuitivamente, diferentes crenças sobre o mundo real. Desta
forma, a integração de fontes de informação pode ser vista como um multi-conjunto, cuja
definição é dada a seguir.
Definição 3.2.1 Um multi-conjunto M S é um conjunto onde ocorrências redundantes
são aceitas, e a relação de pertinência é dada por S ∈i M S , onde i é um inteiro que
representa o número ocorrências do elemento S em M S. A notação S ∈0 M S representa
o caso em que S 6∈ M S.
F
Sejam M S1 = [S1 , . . . , Sn ] e M S2 = [Sn+1 , . . . , Sm ] dois multi-conjuntos. M S1 M S2 =
[S1 , . . . , Sm ] é a união de M S1 e M S2 .
Sejam db1 e db2 duas fontes de informação. A fonte de informação obtida da integração
F
de db1 e db2 é denotada por db1 + db2 , que é igual a db1 db2 .
2
Um sistema axiomático é constituı́do por um conjunto de fórmulas e regras de inferência que permitem
a representação e dedução de conhecimento [Sou02].
CAPÍTULO 3. TRABALHOS RELACIONADOS
57
Exemplo 3.2.1 Considere as seguintes fontes de dados: db1 = {a, b}, db2 = {a, ¬c} e
db3 = {¬a, c}. A integração destas fontes de dados, denotada por (db1 +db2 )+db3 , produz
o multiconjunto M descrito a seguir:
M = [a, b, a, ¬c, ¬a, c],
onde a ∈2 M , b ∈1 M , c ∈1 M , ¬a ∈1 M , ¬b ∈1 M .
Seja L a linguagem definida pela lógica proposicional [Sou02]. A linguagem da lógica
MF, denotada por L0 , é obtida de L adicionando-se operadores modais [Che80], como
mostra a definição seguinte.
i
Definição 3.2.2 (Fórmulas de L0 ) Sejam Bdb
e Bdb operadores modais, i um número
inteiro e db uma fonte de informação. Temos que:
i
1) Se F é uma fórmula de L, então Bdb
F e Bdb F são fórmulas de L0 .
2) Se F1 e F2 são fórmulas de L0 então ¬F1 , F1 ∧ F2 são fórmulas de L0 . E as fórmulas
F1 ∨ F2 e F1 → F2 são definidas a partir de ∧, ¬, da forma usual.
Sejam db1 e db2 duas fontes de informação. Então:
1
Bdb
a
1
0
Bdb2 a
1
Bdb
a
1 +db2
Bdb1 +db2 a
indica
indica
indica
indica
que
que
que
que
db1 possui uma ocorrência de a;
db2 não possui ocorrência de a;
db1 + db2 possui uma ocorrência de a;
db1 + db2 acredita em a.
A seguir é formalizado um esquema axiomático para a lógica MF. Este sistema é
correto e completo em relação à semântica de MF [CG01]. Como foi dito, a semântica
de MF é um tipo de semântica de Kripke da lógica modal, e não será descrita nesta
dissertação. É possı́vel compreender o significado dos operadores modais introduzidos,
através do sistema axiomático descrito a seguir.
Nas definições seguintes, db e db0 são fontes de informação; F e G são fórmulas de L;
L, L1 , L2 , . . . são literais de L; e i, j, k são inteiros.
Os axiomas3 da lógica MF são:
(A0 ) Axiomas da lógica proposicional [Sou02]
(A1 ) Bdb ¬F → ¬Bdb F
(A2 ) Bdb F ∧ Bdb (F → G) → Bdb G
j
i
(A3 ) Bdb
L → ¬Bdb
L se i 6= j
j
i
k
(A4 ) Bdb L ∧ Bdb0 L → Bdb+db
se k = i + j
0L
j
i
(A5 ) Bdb L ∧ Bdb ¬L → Bdb L se i > j
i
i
(A6 ) Bdb
L ∧ Bdb
¬L → ¬Bdb L
3
Um axioma é uma fórmula que representa um conhecimento dado a priori, a partir do qual novos
conhecimentos podem ser deduzidos [Sou02].
CAPÍTULO 3. TRABALHOS RELACIONADOS
58
(A7 ) Bdb (L1 ∨ . . . ∨ Ln ) → Bdb L1 ∨ . . . ∨ Bdb Ln onde Li 6= Lj
As regras de inferência são:
(1) Se `M F F e `M F (F → G) então `M F G (Modus Ponens).
(2) Se `M F F então `M F Bbd F para todo Bbd .
A notação `M F F denota que F é teorema de MF, isto é, uma fórmula que é instância
de um axioma ou que foi deduzida dos axiomas e regras de inferência.
O significado intuitivo de alguns dos axiomas anteriores é dado a seguir:
(A3 ) diz que o número de ocorrências de um literal em uma fonte de informação é
único;
(A4 ) indica que o número de ocorrências de um literal, na fonte obtida da integração
de duas outras fontes de informação, é dado pela soma dos números de ocorrências deste
literal em cada uma das fontes integradas;
(A5 ) e (A6 ) mostram o operador de maioria sendo aplicado. O axioma (A6 ) mostra que
quando a inconsistência é detectada ela é eliminada: a fonte de informação não acredita
no literal contraditório;
A lista de informações relativas ao conteúdo de cada fonte de informação a ser integrada
é representada pela fórmula ψ definida a seguir.
Definição 3.2.3 (Fórmula ψ) Sejam db1 , . . . , dbn n conjuntos consistentes de literais L
a serem integrados. A fórmula ψ é definida da seguinte forma:
n
^
^
^
0
1
L)
Bdb
Bdb
L
∧
ψ= (
i
i
i=1 L∈dbi
L6∈dbi
Note que pela definição anterior cada literal está presente ou não em uma dada fonte
dbi , e portanto é representado sempre com o número de ocorrências igual a 0 ou 1.
O próximo resultado mostra que o conhecimento deduzido da fórmula ψ é consistente.
Proposição 3.2.1 ([CG01]) Para uma dada fórmula ψ, uma fórmula F de L e uma
fonte de informação db, temos que:
6`M F ψ → Bdb F ou 6`M F ψ → ¬Bdb F ; e
`M F ψ → Bdb F ou `M F ψ → ¬Bdb F .
O exemplo seguinte mostra resultados obtidos da aplicação do sistema axiomático de
MF à fonte de informação obtida da integração de diversas fontes.
Exemplo 3.2.2 (Dedução em MF) Considere as fontes de dados do exemplo 3.2.1:
db1 = {a, b}, db2 = {a, ¬c} e db3 = {¬a, c}.
A fórmula ψ, derivada da integração das fontes db1 , db2 e db3 , é dada por:
CAPÍTULO 3. TRABALHOS RELACIONADOS
59
1
1
0
0
0
0
ψ =Bdb
a ∧ Bdb
b ∧ Bdb
c ∧ Bdb
¬a ∧ Bdb
¬b ∧ Bdb
¬c∧
1
1
1
1
1
1
1
0
0
0
0
1
Bdb2 a ∧ Bdb2 b ∧ Bdb2 c ∧ Bdb2 ¬a ∧ Bdb2 ¬b ∧ Bdb2 ¬c∧
0
0
1
1
0
0
Bdb
a ∧ Bdb
b ∧ Bdb
c ∧ Bdb
¬a ∧ Bdb
¬b ∧ Bdb
¬c
3
3
3
3
3
3
Da fórmula ψ, e aplicando-se os axiomas da lógica MF, temos os seguintes teoremas:
2
(1) `M F ψ → Bdb
a (de A4 )
1 +db2
2
(2) `M F ψ → B(db1 +db2 )+db3 a (de A4 e (1))
0
¬a (de A4 )
(3) `M F ψ → Bdb
1 +db2
1
(4) `M F ψ → B(db
¬a (de A4 e (3))
1 +db2 )+db3
De (2), (4) e A5 deduzimos que:
(5) `M F ψ → B(db1 +db2 )+db3 a.
Este teorema nos diz que a fonte de informação obtida pela integração das fontes db1 , db2
e db3 acredita a, pois de acordo com o critério da maioria duas fontes acreditam em a
enquanto que somente uma acredita em ¬a.
Do mesmo modo podemos provar:
(6) `M F ψ → B(db1 +db2 )+db3 b,
Outros teoremas deduzidos são mostrados a seguir:
0
(7) `M F ψ → Bdb
c (de A4 )
1 +db2
1
(8) `M F ψ → B(db
c (de A4 e (7))
1 +db2 )+db3
1
(9) `M F ψ → Bdb1 +db2 ¬c (de A4 )
1
(10) `M F ψ → B(db
¬c (de A4 e (9))
1 +db2 )+db3
(11) `M F ψ → ¬B(db1 +db2 )+db3 c (de A6 , (8) e (10))
(12) `M F ψ → ¬B(db1 +db2 )+db3 ¬c (de A6 , (8) e (10))
De (11), (12) e (A0 ) deduzimos que:
(13) `M F ψ → ¬B(db1 +db2 )+db3 c ∧ ¬B(db1 +db2 )+db3 ¬c.
Este teorema significa que a integração das fontes db1 , db2 e db3 não acredita em c e
nem ¬c, e desta forma a fonte de informação resultante da integração de db1 , db2 e db3 é
mantida consistente.
Discussão
Foi apresentada uma proposta de tratamento de inconsistências que surgem no processo
de integração de fontes de informação heterogêneas, baseada na abordagem de revisão de
crença, onde as inconsistências são eliminadas. No trabalho proposto por esta disssertação
assume-se que os dados já foram integrados, que as inconsistências foram identificadas e
armazenadas com o valor-verdade inconsistente, e não há a preocupação de como isso
foi conseguido. Em [dACM02], é apresentado um método baseado no esquema de prova
por tableau da lógica LFI1 [CM01] que executa a integração de fontes heterogêneas de
CAPÍTULO 3. TRABALHOS RELACIONADOS
60
dados, e os dados inconsistentes são identificados e armazenados com a indicação de que
são contraditórios, ao invés de descartados.
3.2.2
Abordagem paraconsistente na integração
Em [ABC99] é apresentada uma abordagem paraconsistente no tratamento de inconsistências que podem surgir no processo de integração de fontes de dados. O objetivo do
trabalho é fornecer respostas às consultas feitas a qualquer instância de banco de dados,
consistente ou não em relação ao conjunto de restrições de integridade.
A lógica base é a lógica clássica de primeira ordem [Sou02].
Noções básicas
Neste parágrafo são introduzidas algumas definições e termos que serão utilizados na
descrição do método para obtenção de respostas consistentes.
Uma instância r do banco de dados é consistente se r satisfaz o conjunto de restrições
de integridade IC, ou seja, r ² IC. A instância r é inconsistente caso contrário.
Definição 3.2.4 Seja a instância r do banco de dados. O conjunto de fórmulas {P (a)|r ²
P (a)}, onde P é um nome de relação e a uma tupla instanciada, é denotado por Σ(r).
Desta forma, o conjunto Σ(r) corresponde ao conjunto de fatos da instância r do banco
de dados.
Definição 3.2.5 A distância ∆(r, r0 ) entre as instâncias r e r0 é dada pela diferença
simétrica:
∆(r, r0 ) = |(Σ(r) − Σ(r0 )) ∪ (Σ(r0 ) − Σ(r))|.
Ou seja, a distância ∆(r, r0 ) corresponde ao número de fatos que estão em r e não estão
em r0 , somados ao número de fatos que estão em r0 e não estão em r.
A relação de ordem no conjunto de instâncias é definida a seguir.
Definição 3.2.6 A relação de ordem no conjunto de instâncias, denotada por 6r , é
definida da seguinte forma: fixada a instância r e dadas as instâncias r0 e r00 , temos que:
r0 6r r00 se ∆(r, r0 ) 6 ∆(r, r00 ).
Uma instância r0 é dita ser 6r minimal, se ∆(r, r0 ) 6 ∆(r, r00 ), para toda instância r00 .
Exemplo 3.2.3 Considere um esquema de banco de dados com duas relações unárias p
e q sobre o domı́nio D = {a, b, c}. Sejam as instâncias r, r0 e r00 , mostradas a seguir:
CAPÍTULO 3. TRABALHOS RELACIONADOS
61
Σ(r) = {p(a), p(b), q(a), q(c)}
Σ(r0 ) = {p(a), q(a), q(c)}
Σ(r00 ) = {p(a), p(b), p(c), q(a), q(b), q(c)}.
Temos que ∆(r, r0 ) = 1 e ∆(r, r00 ) = 2. Portanto, r0 6r r00 .
Uma vez definida a ordem entre as instâncias do banco de dados, é possı́vel definir o
que é um reparo de banco de dados. Intuitivamente, temos que um reparo do banco de
dados é uma instância que pertence ao conjunto das instâncias que satisfazem o conjunto
de restrições IC, e que possui a menor distância ∆ em relação à instância original do
banco de dados.
Definição 3.2.7 (Reparo) Sejam r e r0 duas instâncias do banco de dados. r0 é reparo
de r se r0 ² IC e r0 é 6r minimal entre as instâncias do banco de dados que satisfazem
IC.
Exemplo 3.2.4 Considere o esquema de banco de dados com as relações:
F ornecedor(IdF ornecedor, N ome, Item) e Classe(IdItem, ClasseItem),
e que possui a seguinte restrição de integridade IC: o fornecedor C é o único que fornece
itens da classe T 4, ou seja,
∀x∀y∀z(F ornecedor(x, y, z) ∧ Classe(z, T 4) → (x = C).
Seja a seguinte instância r do banco de dados, mostrada a seguir:
Fornecedor
C D1 I1
D D2 I2
Classe
I1 T 4
I2 T 4
A instância r é inconsistente, pois a restrição de integridade é violada pelo fornecerdor
D, que fornece o item I2 da classe T4 .
Os únicos reparos para esta instância r são mostrados a seguir:
Instância r0 :
Fornecedor
Classe
C D1 I1
I1 T 4
I2 T 4
Instância r00 :
Fornecedor
Classe
C D1 I1
I1 T 4
D D2 I2
CAPÍTULO 3. TRABALHOS RELACIONADOS
62
Note que ∆(r, r0 ) = ∆(r, r00 ) = 1. Isto é, tanto r0 quanto r00 são 6r minimais.
Definição 3.2.8 (Resposta) Uma tupla instanciada t é uma resposta à uma consulta
Q(X) expressa no cálculo relacional [AVH95], sobre a instância r se r ² Q(t). Uma tupla
instanciada t é uma resposta ao conjunto de consultas {Q1 , . . . , Qn } se r ² Q1 (t) ∧ . . . ∧ Qn (t).
Definição 3.2.9 (Resposta Consistente) Seja IC um conjunto de restrições de integridade. Uma tupla instanciada t é uma resposta consistente à consulta Q(X) sobre a
instância r, denotado por r ²c Q(t), se para todo reparo r0 de r, temos que r0 ² Q(t). Se
Q é uma sentença, então o valor-verdade verdadeiro (falso) é uma resposta consistente a
Q em r, denotado por r ²c Q (r 6²c Q), se para todo reparo r0 de r, r0 ² Q (r0 6² Q).
Exemplo 3.2.5 A única resposta consistente à consulta Classe(z, T 4) sobre a instância
r do exemplo 3.2.4 é I1 , pois r ²c Classe(I1 , T 4). Ou seja, para os reparos r0 e r00 de r,
temos que r0 ² Classe(I1 , T 4) e r00 ² Classe(I1 , T 4).
Método de obtenção de respostas consistentes
O método para calcular respostas consistentes a consultas é baseado na noção de resı́duos
desenvolvida no contexto da Otimização Semântica de Consultas (SQO)[CGM90]. SQO
é utilizada para otimizar o processo de construção de respostas a consultas através do
conhecimento semântico sobre o domı́nio subjacente às restrições de integridade. Assumese que as restrições de integridade são satisfeitas pelo banco de dados, ou seja, que o banco
de dados é consistente, e uma maneira de se obter uma resposta consistente é modificar
a consulta, isto é, considerar a fórmula Q(x) ∧ IC ao invés de somente Q(x). Entretanto,
quando a instância do banco de dados é inconsistente, a resposta será sempre falso. Então
é proposto em [ABC99], que a consulta Q seja iterativamente modificada usando-se os
resı́duos, que serão definidos no texto a seguir, resultando assim, em uma consulta Tω (Q)
que produz o conjunto de respostas consistentes de Q, mesmo quando a instância onde é
calculada é inconsistente. Desta forma, é possı́vel raciocinar na presença da inconsistência.
As restrições de integridade consideradas pela proposta [ABC99], são aquelas que
podem ser representadas no formato padrão descrito a seguir:
Definição 3.2.10 Uma restrição de integridade está no formato padrão se possui a
seguinte forma:
∀(
m
_
pi (x) ∨
i=1
n
_
¬qi (y) ∨ Ψ),
i=1
onde ∀ representa o fecho universal da fórmula, p e q são sı́mbolos de predicados, x e y
são tuplas não instanciadas e Ψ é uma fórmula que contém somente predicados built-in4 .
4
Predicados built-in são relações binárias correspondentes aos sı́mbolos de comparação usuais (=, 6,
>, . . .).
CAPÍTULO 3. TRABALHOS RELACIONADOS
63
Algumas restrições de integridade não podem ser reescritas neste formato padrão, como
as restrições do tipo ∀xp(x) → ∃yq(y). De fato, ∀xp(x) → ∃yq(y) ≡ ¬∀xp(x) ∨ ∃yq(y) ≡
∃x¬p(x) ∨ ∃yq(y) ≡ ∃x∃y(¬p(x) ∨ q(x)), que não corresponde ao formato padrão.
O exemplo seguinte mostra a idéia intuitiva da geração de resı́duos:
Exemplo 3.2.6 Considere a seguinte restrição de integridade: ∀x(¬p(x) ∨ q(x)). Neste
caso, se q(x) é falso, então ¬p(x) deve ser verdadeiro. Então, quando temos a consulta
¬q(x), a fim de encontrarmos as respostas consistentes, temos que garantir que ¬p(x) se
torne verdadeiro. Desta forma, é gerada a consulta modificada ¬q(x) ∧ ¬p(x), onde ¬p(x)
é o resı́duo adicionado à consulta.
A geração de resı́duos é baseado em cada ocorrência positiva ou negativa dos predicados
que aparecem nas restrições de integridade. Intuitivamente, temos que o resı́duo associado
a um predicado em uma dada restrição de integridade do conjunto IC, é dado pela mesma
restrição sem a presença do predicado em questão, como é descrito a seguir:
Para toda restrição de integridade do conjunto IC, no formato padrão, temos:
a) Para cada ocorrência positiva do predicado pj (x) em IC, é gerado um resı́duo R
para ¬pj (x):
j−1
R = Q̄(
_
pi (x) ∨
i=1
m
_
pi (x) ∨
i=j+1
n
_
¬qi (y) ∨ Ψ),
i=1
onde Q̄ corresponde a uma sequência de quantificadores universais sobre as variáveis que
não aparecem na tupla x.
Uma vez gerados todos os resı́duos R1 , . . . , Rr , correspondentes às ocorrências positivas
do predicado pj (x), para o predicado ¬pj (x), então é gerada a seguinte regra denotada:
¬pj (x) 7→ ¬pj (x){R1 , . . . , Rr }.
Se não há resı́duos, então é gerada a regra denotada ¬pj (x) 7→ ¬pj (x).
Esta regra denotada gerada será utilizada no processo de modificação da consulta
(definição 3.2.12). Intuitivamente, temos que uma consulta da forma ¬pj (x) deve garantir que os resı́duos {R1 , . . . , Rr } gerados para o predicado positivo pj (x) em IC também
sejam satisfeitos para que a resposta seja consistente. Esta mesma idéia se aplica aos
predicados negativos e seus resı́duos, como é descrito a seguir.
b) Para cada ocorrência negativa do predicado qj (y) em IC, é gerado um resı́duo R0
para cada qj (y):
0
R = Q̄(
m
_
j−1
pi (x) ∨
i=1
_
i=1
¬qi (y) ∨
n
_
¬qi (y) ∨ Ψ),
i=j+1
CAPÍTULO 3. TRABALHOS RELACIONADOS
64
onde Q̄ corresponde a uma sequência de quantificadores universais sobre as variáveis que
não aparecem na tupla y.
Uma vez gerados todos os resı́duos R10 , . . . , Rr0 , correspondentes às ocorrências negativas do predicado qj (y), para o predicado qj (y), então é gerada a seguinte regra denotada:
qj (y) 7→ qj (y){R10 , . . . , Rr0 }.
Se não há resı́duos, então é gerada a regra denotada qj (y) 7→ qj (y).
Desta forma, sempre é gerada uma nova regra denotada para todo predicado positivo
e para todo predicado negativo.
Exemplo 3.2.7 Considere o seguinte conjunto IC de restrições de integridade no formato
padrão:
IC = {∀x(r(x) ∨ ¬p(x) ∨ ¬q(x)), ∀x(p(x) ∨ ¬q(x))},
Calculando-se os resı́duos para cada predicado positivo e negativo de IC, são geradas
as seguintes regras denotadas:
p(x)
q(x)
r(x)
¬p(x)
¬q(x)
¬r(x)
7→
7→
7→
7→
7→
7→
p(x){r(x) ∨ ¬q(x)}
q(x){r(x) ∨ ¬p(x), p(x)}
r(x)
¬p(x){¬q(x)}
¬q(x)
¬r(x){¬p(x) ∨ ¬q(x)}
Note que o predicado negativo ¬q(x) aparece nas duas restrições de IC, e possui dois
resı́duos: R1 = r(x) ∨ ¬p(x) e R2 = p(x).
Os predicados built-in podem aparecer nos resı́duos mas não geram regras, pois não
podem ser modificados para tornar o conjunto IC verdadeiro, como mostra o próximo
exemplo.
Exemplo 3.2.8 Considere o conjunto IC mostrado a seguir:
∀x∀y∀z(¬p(x, y) ∨ ¬p(x, z) ∨ (y = z)),
e uma instância r do banco de dados tal que Σ(r) = {p(1, 2), p(1, 3)}. Se x = 1 , y = 2 e
z = 3, para que IC fosse verdadeiro deverı́amos ter 2=3.
Uma vez gerados os resı́duos associados ao conjunto de restrições IC, a seguir é definido
um método de modificação da consulta original Q, para uma consulta modificada Tω (Q)
que produz as respostas consistente de Q.
Em toda a abordagem de [ABC99], é assumido que todas as consultas estão na forma
normal disjuntiva, isto é, uma disjunção de conjunções de literais, como é formalizado na
seguinte definição:
CAPÍTULO 3. TRABALHOS RELACIONADOS
65
Definição 3.2.11 (Consulta) Uma fórmula Q é uma consulta se ela possui a seguinte
forma sintática:
nj
mi
s ^
_
^
Q̄ ( pi,j (ui,j ) ∧
¬q(vi,j ) ∧ Ψi ),
i=1 j=1
j=1
onde Q̄ é uma sequência de quantificadores e Ψ contém somente predicados built-in usuais.
Se s = 0, então temos uma consulta que consiste de uma cláusula vazia, denotada por
¤.
Se a sequência Q̄ contém somente quantificadores universais, então Q é uma consulta
universal. Se a sequência Q̄ contém algum quantificador existencial, então Q é uma
consulta não-universal.
A determinação de respostas consistentes a consultas em banco de dados consistentes
ou não, é obtida por uma famı́lia de operadores Tn :consulta → consulta, n > 0, e
Tω :consulta → conjunto de consultas.
Definição 3.2.12 A aplicação do operador Tn , n > 0, a uma consulta é definido de forma
indutiva, da seguinte maneira:
1. Tn (¤) = ¤, Tn (¬¤) = ¬¤, para todo n > 0 (¤ é uma cláusula vazia).
2. T0 (ϕ) = ϕ, para toda consulta ϕ.
3. Para toda consulta que corresponde ao predicado positivo p(x), se existe uma regra
p(x) 7→ p(x){R1 (x), . . . , Rr (x)}, então:
Tn+1 (p(x)) = p(x)
r
^
Tn (Ri (x)).
i=1
Se p(x) não possui resı́duos, então Tn+1 (p(x)) = p(x).
4. Para toda consulta que corresponde ao predicado negativo ¬q(x), se existe uma
regra ¬q(x) 7→ ¬q(x){R10 (x), . . . , Rs0 (x)}, então:
Tn+1 (¬q(x)) = ¬q(x)
s
^
Tn (Ri0 (x)).
i=1
Se ¬q(x) não possui resı́duos, então Tn+1 (¬q(x)) = ¬q(x).
5. Se a consulta ϕ é uma fórmula na forma normal disjuntiva prenex5 , tal que:
5
Uma fórmula está na forma prenex quando todos os seus quantificadores aparecem somente no inı́cio
da fórmula.
CAPÍTULO 3. TRABALHOS RELACIONADOS
66
nj
mi
s ^
_
^
ϕ = Q̄ ( pi,j (ui,j ) ∧
¬q(vi,j ) ∧ Ψi ),
i=1 j=1
j=1
onde Q̄ é uma sequência de quantificadores e Ψ contém somente predicados built-in usuais,
então, para todo n > 0:
nj
mi
s ^
_
^
Tn (ϕ) = Q̄ ( Tn (pi,j (ui,j )) ∧
Tn (¬q(vi,j )) ∧ Ψi ),
i=1 j=1
j=1
Finalmente, a aplicação do operador Tω sobre uma consulta é definido por
[
Tω (ϕ) =
{Tn (ϕ)}.
n<ω
Ou seja, Tω (ϕ) corresponde à consulta ϕ modificada.
Repare que Tω pode ser um conjunto infinito de fórmulas. As condições necessárias
para que este conjunto seja finito são apresentadas em [ABC99]. Se o conjunto Tω é
finito, então em um número finito de passo n, temos que Tn (ϕ) = Tn+1 (ϕ), como ocorre
nos exemplos seguintes.
Exemplo 3.2.9 Considere o exemplo 3.2.7. Seja a consulta ¬r(x). O cálculo da consulta
¬r(x) modificada é apresentado a seguir:
T0 (¬r(x)) = ¬r(x).
T1 (¬r(x)) = ¬r(x) ∧ (¬p(x) ∨ ¬q(x)).
T2 (¬r(x)) = ¬r(x) ∧ T1 (¬p(x) ∨ ¬q(x)) = ¬r(x) ∧ (T1 (¬p(x)) ∨ T1 (¬q(x))) = ¬r(x) ∧
((¬p(x) ∧ ¬q(x)) ∨ ¬q(x)) = T3
Portanto, a consulta ¬r(x) modificada é dada por:
Tω (¬r(x)) = {¬r(x), ¬r(x) ∧ (¬p(x) ∨ ¬q(x)), ¬r(x) ∧ ((¬p(x) ∧ ¬q(x)) ∨ ¬q(x))}.
Exemplo 3.2.10 Considere o exemplo 3.2.5. A restrição de integridade IC reescrita no
formato padrão (definição 3.2.10) é mostrado a seguir:
∀x∀y∀z∀w(¬F ornecedor(x, y, z) ∨ ¬Classe(z, w) ∨ w 6= T 4 ∨ x = C).
Para a consulta Classe(z, T 4), seguinte regra é gerada:
Classe(z, w) 7→ Classe(z, w){∀xy(¬F ornecedor(x, y, z) ∨ w 6= T 4 ∨ x = C)}.
A consulta Classe(z, T 4) executada sobre a instância inconsistente r1 obtém como
resposta I1 e I2 .
Vamos calcular a consulta modificada Tω :
T0 (Classe(z, T 4)) = Classe(z, T 4).
CAPÍTULO 3. TRABALHOS RELACIONADOS
67
T1 (Classe(z, T 4)) = Classe(z, T 4) ∧ T0 (∀xy(¬F ornecedor(x, y, z) ∨ x = C))
= Classe(z, T 4) ∧ ∀xy(¬F ornecedor(x, y, z) ∨ x = C).
T2 (Classe(z, T 4)) = Classe(z, T 4) ∧ T1 (∀xy(¬F ornecedor(x, y, z) ∨ x = C))
= Classe(z, T 4) ∧ ∀xy(T1 (¬F ornecedor(x, y, z)) ∨ T1 (x = C)) =
= Classe(z, T 4) ∧ ∀xy(¬F ornecedor(x, y, z) ∨ x = C).
Logo, T1 (Classe(z, T 4)) = T2 (Classe(z, T 4)), e portanto
Tω (Classe(z, T 4)) = {Classe(z, T 4), Classe(z, T 4)∧∀xy(¬F ornecedor(x, y, z)∨x = C)}.
A consulta Tω (Classe(z, T 4)) executada sobre a instância inconsistente r obtém como
resposta somente I1 , a única resposta consistente.
A próxima proposição mostra que a consulta definida pelo operador Tω obtém o mesmo
resultado que uma consulta aplicada a um banco de dados consistente.
Proposição 3.2.2 ([ABC99]) Seja r uma instância do banco de dados e um conjunto
IC de restrições de integridade, tal que r |= IC. Para toda consulta Q(x) e toda tupla
instanciada t: r |= Q(t) se e somente se r |= Tω (Q(t)).
Ou seja, se a tupla t é resposta da consulta Q aplicada a uma instância consistente r,
então t também é resposta da consulta modificada Tω (Q(t)) aplica à instância r.
O método de modificação de consultas é provado ser correto para certos tipos de
consultas, como é mostrado a seguir.
Teorema 3.2.1 (Corretude [ABC99]) Seja r uma instância do banco de dados, IC
um conjunto de restrições de integridade, e Q(x) uma consulta tal que r |= Tω (Q(t)).
Se Q é uma consulta universal, ou é uma consulta não-universal mas independente de
domı́nio, então t é uma resposta consistente de Q em r, isto é, r |=c Q(t).
A condição imposta pelo teorema exclui as consultas que são existenciais e dependentes
do domı́nio, como ∃x¬p(x). Para as outras consultas, o teorema da corretude garante que
as respostas obtidas pela consulta modificada são sempre respostas consistentes.
A completude do método é parcial: é válida somente para restrições de integridade
binárias, isto é, com somente dois literais, como é definido a seguir:
Definição 3.2.13 Uma restrição de integridade binária (denotada por BIC) é uma sentença da seguinte forma:
∀(L1 (x1 ) ∨ L2 (x2 ) ∨ Ψ(x)),
CAPÍTULO 3. TRABALHOS RELACIONADOS
68
onde L1 e L2 são literais, e Ψ é uma fórmula que contém somente predicados built-in
usuais.
Exemplos de restrições de integrigade binárias incluem dependências funcionais e restrições da forma ∀x(p(x) → q(x)).
Teorema 3.2.2 (Completude [ABC99]) Seja um conjunto de restrições de integridades binárias IC. Então, para todo literal instanciado L(t), se r |=c L(t) então r |=
Tω (L(t)).
Intuitivamente temos que, toda resposta consistente a uma consulta do tipo L(x) é
obtida pela consulta modificada definida pelo operador Tω .
Discussão
Foi apresentada uma proposta de tratamento de inconsistências em instâncias de banco
de dados sob a perspectiva paraconsistente. Segundo esta proposta, as inconsistências
do banco de dados são mantidas no banco de dados, mas são eliminadas das respostas
derivadas deste banco de dados possivelmente inconsistente. As respostas produzidas são
sempre respostas que um banco de dados consistente daria.
No caso de P-Datalog¬ , as inconsistências também são mantidas no banco de dados, devidamente identificadas como tal, e as respostas produzidas podem conter fatos
classificados como verdadeiros, falsos, indefinidos e inconsistentes.
Capı́tulo 4
P-Datalog¬
Neste capı́tulo inicia-se a apresentação da principal contribuição desta dissertação, com
a descrição da linguagem dedutiva de consultas P-Datalog¬ . Inicialmente é definida a
sintaxe de programas P-Datalog¬ , na seção 4.1, e em seguida, na seção 4.2, é apresentada
a sua lógica base: a lógica 4-valorada 4-LFI1, e são introduzidas as noções de instância
4-valorada e modelo de um programa P-Datalog¬ . Na seção 4.3, é feito um aparte onde
temos a definição de programa P-Datalog¬ estendido, o qual não apresenta literais negativos. Para este tipo de programa é definido um operador de consequência imediata, a
partir do qual é possı́vel obter a semântica destes programas. A peça chave da definição
da semântica bem-fundada de P-Datalog¬ é o conceito de modelo 4-estável, que é apresentado na seção 4.4. Finalmente, na seção 4.5 é definida a semântica bem-fundada de
P-Datalog¬ .
A terminologia utilizada é a tradicional de banco de dados, e pode ser encontrada em
[AVH95].
4.1
Sintaxe P-Datalog¬
Nesta seção é apresentada a sintaxe de programas P-Datalog¬ , através dos quais são feitas
as consultas ao banco de dados contendo inconsistências.
Definição 4.1.1 (Programas P-Datalog¬ ) Um programa P-Datalog¬ é um conjunto
finito de regras do tipo:
A ← L1 , ..., Ln
onde A é um átomo do tipo R(u), e Li são literais do tipo R(u), ∼ R(u), sendo que R é o
nome de relação, u é uma tupla não instanciada e ∼ é o sı́mbolo da negação por default.
O átomo A é chamado de cabeça da regra. Os literais L1 , ..., Ln são chamados de corpo
da regra.
69
CAPÍTULO 4. P-DATALOG¬
70
Os programas P-Datalog¬ assim como os programas Datalog¬ (definição 2.5.1), pertencem à classe dos programas lógicos padrões (definição 2.2.2); ou seja, são programas
lógicos que aceitam a negação por default somente no corpo de suas regras. Apesar de
P-Datalog¬ não permitir literais negativos na cabeça das regras, os programas P-Datalog¬
atuam sobre bancos de dados paraconsistentes, cujas instâncias podem conter fatos inconsistentes além dos fatos verdadeiros e falsos.
A recursão negativa ou, em outras palavras, a definição de uma dada relação que utiliza
o seu próprio complemento, é aceita nos programas P-Datalog¬ . O exemplo seguinte
mostra um programa P-Datalog¬ com recursão negativa.
Exemplo 4.1.1 O programa Pwin descrito abaixo é um programa P-Datalog¬ :
win(x) ← move(x, y), ∼ win(y).
O conjunto de relações que aparecem em P é denotado por sch(P ) , o conjunto de
constantes que aparecem em P por adom(P ), e o conjunto com todos os fatos obtidos a
partir de R(a1 , . . . , an ) onde R ∈ sch(P ) e a1 , . . . , an ∈ adom(P ), é denotado por B(P )
(base de Herbrand de P ).
Exemplo 4.1.2 (sch(P ), adom(P ), B(P )) Considere a mesma situação apresentada no
exemplo 1.0.1: o programa Pcargo e a instância 3-valorada I. Temos então que:
sch(P )={indicadoPor, cargo, devedor },
adom(P ) = {charles, john, james, joseph, paul, kevin}, e
B(P ) = {devedor(charles), devedor(joseph), indicadoPor(charles,joseph), . . .}.
4.2
Modelos de programas P-Datalog¬
Nesta seção, inicialmente é definida uma extensão das lógicas LFI1 e lógica 3-valorada de
Przymusinski [Prz90], para a lógica 4-valorada 4-LFI1, que é a lógica base da semântica
de programas P-Datalog¬ . Em seguida é introduzido o conceito de modelo 4-valorado de
programas P-Datalog¬ .
4.2.1
Lógica 4-valorada 4-LFI1: a lógica base de P-Datalog¬
Os bancos de dados tradicionais são representados por instâncias 2-valoradas: um fato
está, ou não está armazenado no banco de dados. Estas instâncias são conjuntos contendo
os fatos presentes no banco de dados. Entretanto, bancos de dados que armazenam fatos
identificados como seguros ou contraditórios, denotados por bancos de dados paraconsistentes, requerem uma representação de instância que diferencie um fato armazenado como
seguro, do fato armazenado como contraditório, e do fato que não está armazenado no
CAPÍTULO 4. P-DATALOG¬
71
t
i
u
f
Figura 4.1: Lógica 4-valorada 4-LFI1
banco de dados. Ou seja, são necessários pelo menos três valores distintos para se associar
aos fatos da instância: verdadeiro, falso e inconsistente.
A semântica de programas P-Datalog¬ , descrita na próxima seção, é uma extensão
da semântica bem-fundada de programas Datalog¬ (descrita na seção 2.5.3), onde é introduzido um novo valor associado aos fatos que representam a semântica de um dado
programa: o valor indefinido. Desta forma, a semântica bem-fundada de programas
P-Datalog¬ associa aos fatos um dos valores: verdadeiro, falso, indefinido, inconsistente.
É necessário então que a lógica base seja capaz de representar e raciocinar com esses
quatro valores-verdade, como a lógica 4-valorada 4-LFI1 descrita a seguir.
A lógica 4-LFI1 é uma extensão direta da lógica LFI1 (descrita na seção 2.3). Os
sı́mbolos proposicionais t, i, u e f que denotam os valores-verdade: verdadeiro, inconsistente, indefinido e falso, respectivamente, são adicionados ao alfabeto da lógica LFI1.
Desta forma, as matrizes dos conectivos (Figura 2.1) também são estendidas para as matrizes expostas na Figura 4.3. As outras definições de LFI1 são diretamente incorporadas
na lógica 4-LFI1.
4.2.2
Modelos 4-valorados
Os programas P-Datalog¬ são executados sobre instâncias de bancos de dados paraconsistentes, onde entre os fatos armazenados podem existir fatos identificados como inconsistentes. Desta forma, uma instância 2-valorada não é capaz de representar uma instância
de um banco de dados paraconsistente. A seguir é definida a instância 3-valorada que
representa uma instância de um banco de dados paraconsistente.
Definição 4.2.1 (Instâncias de Bancos de Dados Paraconsistentes) Seja R um esquema de banco de dados. Uma instância do banco de dados paraconsistente sobre R é
uma interpretação (definição 2.3.1) I tal que para cada R ∈ R o conjunto IR = {u :
I(R(u)) = t ou I(R(u)) = i} é finito. Assim, uma instância sobre R pode ser vista como
um conjunto finito de relações onde cada relação é um conjunto finito de tuplas (tuplas
cujo valor-verdade é t ou i). Uma tupla u sobre R tal que I(R(u)) = i é considerada
CAPÍTULO 4. P-DATALOG¬
◦A
•A
∼A
A
A
A
A
A
72
está no banco de dados e é uma informação segura.
está no banco de dados e é uma informação contraditória.
não está no banco de dados.
está no banco de dados como informação segura ou contraditória.
Figura 4.2: Sı́mbolos associados a um átomo A em P-Datalog¬
controversa, isto é, existe evidência a favor de R(u) e também existe evidência contrária
a R(u). Por outro lado, se I(R(u)) = t, então R(u) é uma informação segura.
A semântica bem-fundada de P-Datalog¬ introduz o valor-verdade indefinido associado
aos fatos, o que nos leva à noção de instância 4-valorada, isto é, uma instância na qual os
fatos assumem um dos quatro valores-verdade do conjunto V = {verdadeiro(t), falso(f ),
inconsistente(i), indefinido(u)}. O conjunto V possui uma ordem entre os seus elementos
que é mostrada a seguir:
f 6 u 6 i 6 t.
Intuitivamente, temos que o valor u (indefinido) é uma indicação mais fraca da presença de um fato no banco de dados do que o valor i (inconsistente). O conjunto V e a
ordem 6 formam um reticulado completo (Figura 4.1).
Definição 4.2.2 (Instância 4-valorada) Uma instância 4-valorada I sobre sch(P ) é
uma interpretação I : B(P ) → V. Denotamos por It ,If , Iu e Ii o conjunto de átomos em
que todos os elementos possuem valor-verdade t, f, u e i, respectivamente. Uma instância
4-valorada é total quando não possui átomos com valor-verdade igual a u. Neste caso,
esta instância equivale a uma instância 3-valorada.
As instâncias 4-valoradas são representadas como um conjunto contendo fatos verdadeiros, inconsistentes e falsos. Os fatos que não estão no conjunto são considerados
indefinidos. Lembramos que na representação de instâncias 2-valoradas, os fatos que não
se encontram no conjunto são fatos falsos, de acordo com a “hipótese do mundo fechado”
(veja observação 2.4.1).
A presença de sı́mbolos junto a um átomo A em P-Datalog¬ tem diferentes significados,
como é mostrado na Figura 4.2. Intuitivamente, temos que o sı́mbolo ∼ da negação por
default possui a propriedade de retornar sempre um valor seguro, isto é, seguramente falso
ou seguramente verdadeiro que um fato não se encontra no banco de dados. Desta forma,
a negação de um valor inconsistente resulta em falso, como mostra a matriz do conectivo
∼ na Figura 4.3.
Exemplo 4.2.1 (Instância 4-valorada) Seja I uma instância 4-valorada onde I(p)=t,
I(q)=i, I(r)=u e I(s)=f. A instância I pode ser representada da seguinte forma:
CAPÍTULO 4. P-DATALOG¬
t
i
u
f
∼
f
f
u
t
∨
t
i
u
f
t
t
t
t
t
i
t
i
i
i
u
t
i
u
u
73
f
t
i
u
f
∧
t
i
u
f
t
t
i
u
f
i
i
i
u
f
u
u
u
u
f
f
f
f
f
f
→
t
i
u
f
t
t
t
t
t
i
f
i
t
t
u
f
f
t
t
f
f
f
f
t
Figura 4.3: Matrizes dos conectivos de 4-LFI1
I = {◦p, •q, ∼ s}.
Existe uma ordem natural 4 entre instâncias 4-valoradas sobre sch(P ), definida por:
I 4 J se e somente se para todo A ∈ B(P ), I(A) 6 J(A).
Exemplo 4.2.2 Seja I = {◦p, ◦q, ∼ s} e J = {◦p, ◦q, •s}. Então, I 4 J.
O conjunto finito de instâncias 4-valoradas de um programa P-Datalog¬ P é denominado 4-InstP . É fácil verificar que (4-InstP , 4) forma um reticulado completo:
1. 4 é uma relação de ordem;
2. Dado X ⊆ 4 InstP , existe sup(X) e existe inf (X);
3. sup(4 InstP ) = >, onde > corresponde à instância 4-valorada máxima onde todos
os fatos são verdadeiros (It );
4. inf (4 InstP ) = ⊥, onde ⊥ corresponde à instância 4-valorada mı́nima onde todos
os fatos são falsos (If ).
Se F é o corpo de uma regra de um programa P-Datalog¬ , e I é uma instância 4valorada, denotamos por I(F ) o valor-verdade associado a F de acordo com a matriz do
connectivo ∧ (Figura 4.3).
Definição 4.2.3 (Modelo 4-valorado) Seja P um programa P-Datalog¬ e ground(P )
o conjunto de regras instanciadas1 de P . Uma instância 4-valorada I sobre sch(P ) satisfaz
uma fórmula α contendo átomos de B(P ) combinados com os conectivos booleanos ∼,
∧, ∨, →, se e somente se I(α) ∈ {t, i}. Um modelo 4-valorado de P é uma instância
4-valorada sobre sch(P ) que satisfaz toda regra em ground(P ), isto é, o valor-verdade de
toda regra em ground(P ) é t ou i (de acordo com a definição 2.3.2).
Exemplo 4.2.3 (Modelo 4-valorado) Considere o programa P-Datalog¬ Pcargo dado
no exemplo 1.0.1 e a instância J, descritos a seguir:
1
Uma regra instanciada é uma regra onde todas as variáveis são trocadas por constantes de adom(P ).
CAPÍTULO 4. P-DATALOG¬
cargo(x) ← ∼devedor(x), indicadoPor(x,y), ∼cargo(y)
verdadeiro
t
falso
inconsistente
indefinido
f
i
u
indicadoPor(charles,joseph),indicadoPor(joseph,charles),
indicadoPor(paul,james), indicadoPor(james,kevin),
devedor(james), cargo(paul)
cargo(james), cargo(kevin)
indicadoPor(john,kevin), cargo(john)
cargo(charles), cargo(joseph)
Vamos verificar se J é um modelo 4-valorado de ground(Pcargo ):
cargo(charles) ←∼ devedor(charles), indicadoPor(charles,joseph), ∼ cargo(joseph)
u ←∼ f, t, ∼ u
u ← t, t, u
u←u
t
cargo(joseph) ←∼ devedor(joseph), indicadoPor(joseph,charles), ∼ cargo(charles)
u ←∼ f, t, ∼ u
u ← t, t, u
u←u
t
cargo(paul) ←∼ devedor(paul), indicadoPor(paul,james), ∼ cargo(james)
t ←∼ f, t, ∼ f
t ← t, t, t
t←t
t
cargo(james) ←∼ devedor(james), indicadoPor(james,kevin), ∼ cargo(kevin)
f ←∼ t, t, ∼ f
f ← f, t, t
f←f
t
cargo(john) ←∼ devedor(john), indicadoPor(john,kevin), ∼ cargo(kevin)
i ←∼ f, i, ∼ f
i ← t, i, t
i←i
i
74
CAPÍTULO 4. P-DATALOG¬
75
A instância 4-valorada J satisfaz todas as regras de ground(Pcargo ) e portando J é um
modelo 4-estável de Pcargo .
Observação 4.2.1 (Conectivo implicação) A semântica da operação de implicação
na lógica 4-LFI1 difere da lógica LFI1. Intuitivamente temos que na lógica 4-LFI1, a
partir de um fato verdadeiro, é falso que se deduza um fato inconsistente. Por exemplo,
seja I uma instância tal que I(p) = t e I(q) = i. Seja F ≡ p → q. Na lógica 4-LFI1,
temos que I(F ) = f, ou seja, I não satisfaz F em 4-LFI1. Entretanto, na lógica LFI1,
temos que I(F ) = i, ou seja, I satisfaz F em LFI1.
4.3
Programas P-Datalog¬ Estendidos
Na seção 2.4 foi definido um operador de consequência imediata monotônico e contı́nuo,
cujo menor ponto fixo coincide com a semântica do programa Datalog sem negação. Nesta
seção é introduzida a noção de programa P-Datalog¬ estendido que, assim como os programas Datalog, são programas sem negação, mas que podem deduzir fatos verdadeiros,
inconsistentes, indefinidos e falsos.
Definição 4.3.1 (Programa Estendido) Um programa P-Datalog¬ estendido P é um
programa P-Datalog¬ onde:
(1) fatos negativos do tipo ∼ A não aparecem no corpo das regras; e
(2) valores-verdade t, f, u e i podem aparecer no corpo das regras.
Exemplo 4.3.1 (Programa estendido) O programa P descrito abaixo é um programa
P-Datalog¬ estendido:
p←i
p ← q, i
q ← p, r
q ← p, s
r←t
s←q
Observação 4.3.1 (Programas que incluem dados de entrada) Assim como no contexto de programação em lógica (veja observação 2.4.2), é suposto que os programas
P-Datalog¬ sempre incluem os seus fatos de entrada, da maneira descrita a seguir.
Seja P um programa P-Datalog¬ e I uma instância paraconsistente 3-valorada (definição
4.2.1). É denotado por PI o programa obtido de P com a adição a P de regras do tipo
A ← para cada A tal que I(A) = t; e A ← i para cada A tal que I(A) = i.
CAPÍTULO 4. P-DATALOG¬
76
Exemplo 4.3.2 (Programa PI ) Vamos considerar a mesma situação apresentada no
exemplo 1.0.1: o programa Pcargo e a instância 3-valorada J. Temos então que PJ é dado
por:
cargo(X) ←∼ devedor(X),indicadoPor(X,Y), ∼cargo(Y)
indicadoPor(paul, james) ←
indicadoPor(charles, joseph) ←
indicadoPor(joseph, charles) ←
indicadoPor(james, kevin) ←
indicadoPor(john, kevin) ← i
devedor(james) ←
4.3.1
Operador de consequência imediata 4-TP
Os programas P-Datalog¬ estendidos são programas sem negação, e desta forma não estão
sujeitos às implicações semânticas da negação (descritas na seção 2.5.1). Podemos então,
obter a semântica deste programas através da aplicação de um operador de consequência
imediata. Este operador é chamado de 4-TP , e sua definição é uma extensão da definição
do operador 3-TP de Datalog¬ (definição 2.5.10).
Definição 4.3.2 (Operador 4-TP ) Seja P um programa P-Datalog¬ estendido. O operador de consequência imediata associado a P , denotado por 4-TP , é um mapeamento
4-TP : 4-InstP → 4-InstP . Mais precisamente, seja I uma instância 4-valorada e A ∈
B(P ). O operador 4-TP é definido da seguinte forma:


 max{I(Fk )} se existem regras do tipo A ← Fk em ground(P),
4-TP (I)(A) =
para todo k, k > 0;


f
caso contrário
Exemplo 4.3.3 Seja P o mesmo programa P-Datalog¬ estendido do exemplo 4.3.1, isto
é,
p←i
p ← q, i
q ← p, r
q ← p, s
r←t
s←q
Seja I uma instância 4-valorada, onde I={•p, ∼ q, ◦r, ∼ s}. Então temos:
4-TP (I)(p) =max{I(i), I(q ∧ i)}=max{i, (f ∧ i)}=max{i, f }=i.
CAPÍTULO 4. P-DATALOG¬
77
4-TP (I)(q) =max{I(p ∧ r), I(p ∧ s)}=max{(i ∧ t), (i ∧ f)}=max{i, f }=i.
4-TP (I)(r) = t.
4-TP (I)(s) = f.
Portanto, 4-TP (I)= {•p, •q, ◦r, ∼ s}.
De forma análoga aos programas Datalog (seção 2.4), são apresentadas a seguir propriedades algébricas (descritas na seção 2.1) do operador 4-TP . Estas propriedades são
utilizadas para comprovar que o único menor ponto fixo de 4-TP pode ser obtido iterativamente a partir da instância ⊥, e este coincide com o modelo minimal do programa
positivo P-Datalog¬ estendido.
A seguir é mostrado que o operador 4-TP é monotônico e contı́nuo.
Proposição 4.3.1 Seja P um programa P-Datalog¬ estendido. O operador 4-TP associado a P é um operador monotônico.
Demonstração:
O operador 4-TP é monotônico se I 4 J então 4-TP (I) 4 4-TP (J).
Supondo que ∀A ∈ B(P ) I(A) 6 J(A), vamos mostrar que ∀A ∈ B(P ) 4-TP (I)(A) 6
4-TP (J)(A).
Para todo A de B(P ), em ground(P ) temos as seguintes possibilidades:
a) Não existe regra com A na cabeça. Neste caso temos que 4-TP (I)(A) = 4-TP (J)(A)=f.
b) Existem regras com A na cabeça, da forma A ← Fk , para todo k, k > 0. Neste
caso temos que:
4-TP (I)(A) = max{I(Fk )} e 4-TP (J)(A) = max{J(Fk )},
onde Fk corresponde a uma conjunção de átomos de B(P ) e sı́mbolos representando os
valores-verdade t, i, u, f.
Segundo a nossa hipótese, o valor-verdade de todos os átomos de B(P ) em I é sempre
menor ou igual ao valor em J. Desta forma, max{I(Fk )} 6 max{J(Fk )} e, portanto,
¤
4-TP (I)(A) 6 4-TP (J)(A).
Proposição 4.3.2 Seja P um programa P-Datalog¬ estendido. O operador 4-TP associado a P é um operador contı́nuo.
Demonstração:
Seja X um subconjunto direto do conjunto finito de instâncias 4-valoradas 4-InstP , onde:
X={In , In+1 , . . . , In+m }.
CAPÍTULO 4. P-DATALOG¬
78
Temos que sup(X) = Is , onde Is ∈ 4-InstP , Is ∈ X e Ij 4 Is , para todo Ij ∈ X,
n 6 j 6 n + m. Ou seja, sup(X) é uma instância de 4-InstP .
Vamos mostrar que 4-TP (sup(X)) = sup(4-TP (X)).
Como Ij 4 Is para todo Ij ∈ X, n 6 j 6 n + m, e 4-TP é monotônico, temos que:
4-TP (Ij ) 4 4-TP (Is ), para todo Ij ∈ X, n 6 j 6 n + m. Então, 4-TP (X) 4 4-TP (Is ).
Logo, sup(4-TP (X))=4-TP (Is ).
Como sup(X) = Is , então temos que 4-TP (sup(X)) = sup(4-TP (X)).
¤
4.3.2
Semântica do ponto fixo para programas P-Datalog¬ estendidos
Uma vez definido que o operador 4-TP é monotônico, então é garantido que existe um
único menor ponto fixo, e este é dado por:
lf p(4-TP ) = inf {I | 4-TP (I) 4 I} (proposição 2.1.4),
onde lf p denota o menor ponto fixo e inf denota o maior limitante inferior. Este resultado
é então utilizado com outro resultado: para todo modelo M de um programa P-Datalog¬
estendido P , temos que 4-TP (M ) 4 M . Logo, o modelo minimal de P é o menor ponto
fixo de 4-TP . A seguir estes resultados são formalizados.
Proposição 4.3.3 Seja P um programa P-Datalog¬ estendido e M uma instância de P .
A instância M é um modelo 4-valorado de P se e somente se 4-TP (M ) 4 M .
Demonstração:
Vamos mostrar que M é modelo de P se e somente se 4-TP (M ) 4 M .
M é modelo de P ⇐⇒
⇐⇒ ∀A ∈ B(P ), para toda regra de ground(P ) do tipo A ← Fk , temos M (A ← Fk ) ∈
{t, i} para todo k, k > 0.
⇐⇒ ∀A ∈ B(P ), para toda regra de ground(P ) do tipo A ← Fk , temos M (Fk ) 6 M (A)
para todo k, k > 0.
⇐⇒ ∀A ∈ B(P ), para toda regra de ground(P ) do tipo A ← Fk , temos max{M (Fk )} 6 M (A)
para todo k, k > 0.
⇐⇒ ∀A ∈ B(P ), 4-TP (M )(A) 6 M (A).
⇐⇒ 4-TP (M ) 4 M .
¤
Proposição 4.3.4 Seja P um programa P-Datalog¬ estendido e M uma instância de P .
Se M é ponto fixo de 4-TP então M é modelo de P .
CAPÍTULO 4. P-DATALOG¬
79
Demonstração:
Se M é ponto fixo de 4-TP então M é modelo de P .
M é ponto fixo de 4-TP =⇒
⇐⇒ 4-TP (M ) = M.
⇐⇒ ∀A ∈ B(P ), 4-TP (M )(A) = M (A).
⇐⇒ ∀A ∈ B(P ), existem regras em ground(P ) do tipo A ← Fk , onde max{M (Fk )} = M (A).
=⇒ ∀A ∈ B(P ), existem regras em ground(P ) do tipo A ← Fk , onde M (Fk ) 6 M (A).
=⇒ ∀A ∈ B(P ), existem regras em ground(P ) do tipo A ← Fk , onde M (A ← Fk ) ∈ {t, i}.
=⇒ M é modelo de P .
¤
Porém nem todo modelo de um programa P é ponto fixo de 4-TP , como mostra o
próximo exemplo.
Exemplo 4.3.4 (Modelo que não é ponto fixo) Considere o seguinte programa P ,
um programa P-Datalog¬ estendido:
p←q
p←i
q←f
Temos que M1 = {•p, •q} é modelo do programa P , porém 4-TP (M1 ) = {•p, ∼ q}. Ou
seja, M1 é modelo de P mas não é ponto fixo de 4-TP . Desta forma, o sentido inverso da
proposição 4.3.4 não é válido.
Seja a sequência {4-TPi (⊥)}i>0 ={I0 , I1 , I2 , . . . }, onde:
I0 = ⊥
I1 =4-TP (I0 )
I2 =4-TP (I1 )
...
Como o operador 4-TP é monotônico, e I0 4 Ij para todo j, j > 0, temos que:
I0 4 I1 ⇐⇒ 4-TP (I0 ) 44-TP (I1 ) ⇐⇒ I1 4 I2 .
I1 4 I2 ⇐⇒ 4-TP (I1 ) 44-TP (I2 ) ⇐⇒ I2 4 I3 .
...
Continuando este mesmo procedimento, é obtida a seguinte sequência:
I0 4 I1 4 I2 4 I3 . . ..
Portanto a sequência {4-TPi (⊥)}i>0 é crescente, e o seu menor limitante superior é
denotado por 4-TP ↑.
CAPÍTULO 4. P-DATALOG¬
80
O lema seguinte mostra que o modelo minimal único do programa P-Datalog¬ estendido P corresponde ao menor ponto fixo do operador 4-TP . Por ser um operador
contı́nuo, a proposição 2.1.5 nos indica que o menor ponto fixo de 4-TP pode ser obtido
construtivamente a partir da sequência {4-TPi (⊥)}i>0 .
Lema 4.3.1 Seja P programa P-Datalog¬ estendido. Então
1) O menor ponto fixo de 4-TP é dado por 4-TP ↑; e
2) P possui um único modelo minimal 4-valorado que coincide com o menor ponto
fixo de 4-TP .
Demonstração:
Seja M modelo do programa P-Datalog¬ estendido P , e MP o modelo minimal de P .
⇐⇒ MP = inf {M |M é modelo de P }.
⇐⇒ MP = inf {M | 4-TP (M ) 4 M } pela proposição 4.3.3.
⇐⇒ MP = lf p(4-TP ), pelas proposições 2.1.4 e 4.3.1.
⇐⇒ MP = 4-TP ↑, pelas proposições 2.1.5 e 4.3.2.
¤
Exemplo 4.3.5 (Cálculo do ponto fixo de 4-TP ) Considere o programa P-Datalog¬
estendido P :
p←i
p ← q, i
q ← p, r
q ← p, s
r←t
s←q
Temos a seguinte sequência de aplicações sucessivas de 4-TP , a partir da instância
⊥ = {∼ p, ∼ q, ∼ r, ∼ s}:
4-TP1 (⊥)= {•p, ∼ q, ◦r, ∼ s}
p←i
p ← q, i
q ← p, r
q ← p, s
r←t
s←q
4-TP2 (⊥)= {•p, •q, ◦r, ∼ s}=4-TP3 (⊥)
p←i
p ← f,i
q ← f,f
q ← f,f
r←t
s←f
p←i
p←f
q←f
q←f
r←t
s←f
CAPÍTULO 4. P-DATALOG¬
81
p←i
p ← q, i
q ← p, r
q ← p, s
r←t
s←q
p←i
p ← f,i
q ← i,t
q ← i,f
r←t
s←f
p←i
p←f
q←i
q←f
r←t
s←f
A instância {•p, •q, ◦r, ∼ s} é o menor ponto fixo de 4-TP e também o modelo minimal
4-valorado do programa P-Datalog¬ estendido P .
4.4
Modelos 4-estáveis
Definir a semântica de um programa Datalog¬ , é encontrar um modelo 3-valorado I apropriado para este programa. De acordo com Przymusinski [Prz90](seção 2.5.3), o modelo
3-valorado apropriado é um modelo 3-estável (definição 2.5.12). Nesta seção, o conceito
de 3-estabilidade é estendido para o contexto de P-Datalog¬ .
Seja I uma instância 4-valorada sobre sch(P ). A versão positiva instanciada de P
de acordo com I, denotado por pg(P, I), é o programa P-Datalog¬ obtido de ground(P )
através da substituição de cada literal negativo ∼ A por I(∼ A), isto é, por seu respectivo
valor-verdade: t, f, u, i.
Logo, pg(P, I) é agora um programa P-Datalog¬ estendido e, pelo lema 4.3.1, a sua
semântica coincide com o menor ponto fixo do operador de consequência imediata 4-TP .
Esta semântica contém todos os fatos que são deduzidos de P e I, assumindo-se os valores
dos átomos negados como os valores dados por I. O cálculo do menor ponto fixo do
programa P-Datalog¬ positivo instanciado P de acordo com I, é obtido através de um
operador de estabilidade chamado conseqP , formalmente definido a seguir.
Definição 4.4.1 (Operador de estabilidade) Seja pg(P, I) o programa P-Datalog¬
positivo instanciado, obtido do programa P-Datalog¬ P , e da instância 4-valorada I.
O operador de estabilidade, denotado por conseqP , associado ao programa P e instância
I, é um mapeamento conseqP : 4-InstP → 4-InstP , tal que:
conseqP (I) =4-Tpg(P,I) ↑,
onde 4-Tpg(P,I) ↑ corresponde ao menor ponto fixo do operador de consequência imediata
4-TP aplicado ao programa pg(P, I), a partir da instância ⊥.
Uma vez definido o operador de estabilidade conseqP , é possı́vel definir formalmente
o modelo 4-estável, que é a peça chave da semântica bem-fundada de P-Datalog¬ .
Definição 4.4.2 (Modelo 4-estável) Seja P um programa P-Datalog¬ . Uma instância
4-valorada I sobre sch(P ) é um modelo 4-estável de P se e somente se conseqP (I) = I.
CAPÍTULO 4. P-DATALOG¬
82
Intuitivamente, temos que o modelo 4-estável é aquele que é capaz de reproduzir a si
mesmo ao passar pelo operador de estabilidade conseqP .
O exemplo seguinte ilustra a noção de modelo 4-estável.
Exemplo 4.4.1 (Modelo 4-estável) Considere o programa P-Datalog¬ Pcargo dado no
exemplo 1.0.1 e a instância J descritos a seguir:
cargo(x) ← ∼devedor(x), indicadoPor(x,y), ∼cargo(y)
verdadeiro
t
falso
f
inconsistente i
indefinido
u
indicadoPor(charles,joseph),indicadoPor(joseph,charles),
indicadoPor(paul,james), indicadoPor(james,kevin),
devedor(james), cargo(paul)
cargo(james), cargo(kevin)
indicadoPor(john,kevin), cargo(john)
cargo(charles), cargo(joseph)
Vamos verificar se J é um modelo 4-estável de Pcargo . Para tal, temos que calcular
conseq(J) e mostrar que conseq(J) = J.
O programa positivado instanciado pg(Pcargo , J) é descrito a seguir:
cargo(charles) ← t,indicadoPor(charles, joseph), u
cargo(joseph) ← t,indicadoPor(joseph, charles), u
cargo(paul) ← t,indicadoPor(paul, james), t
cargo(john) ← t,indicadoPor(john, kevin), t
cargo(james) ← f,indicadoPor(james, kevin), t
indicadoPor(paul, james) ←
indicadoPor(charles, joseph) ←
indicadoPor(joseph, charles) ←
indicadoPor(james, kevin) ←
indicadoPor(john, kevin) ←i
devedor(james) ←
Vamos então calcular pg(Pcargo , J)(⊥). Os átomos indicadoPor e devedor serão omitidos nas instâncias produzidas pela aplicação do operador 4-TP mostradas a seguir, pois
os valores destes coincidem com os valores apresentados pela instância J.
1
4-Tpg(P
(⊥)= {∼ cargo(charles), ∼ cargo(james), ∼ cargo(john), ∼ cargo(joseph),
cargo ,J)
∼ cargo(kevin), ∼ cargo(paul)}
cargo(charles) ← t,f,u
cargo(joseph) ← t,f,u
cargo(paul) ← t,f,t
cargo(john) ← t,f,t
cargo(james) ← f,f,t
=⇒
=⇒
=⇒
=⇒
=⇒
cargo(charles) ← f
cargo(joseph) ←f
cargo(paul) ←f
cargo(john) ← f
cargo(james) ← f
CAPÍTULO 4. P-DATALOG¬
83
2
4-Tpg(P
(⊥)= {∼ cargo(james), • cargo(john), ∼ cargo(kevin), ◦ cargo(paul)}=
cargo ,J)
3
=4-Tpg(Pcargo ,J)
cargo(charles) ← t,t,u
cargo(joseph) ← t,t,u
cargo(paul) ← t,t,t
cargo(john) ← t,i,t
cargo(james) ← f,t,t
=⇒ cargo(charles) ← u
=⇒ cargo(joseph) ← u
=⇒ cargo(paul) ← t
=⇒ cargo(john) ← i
=⇒ cargo(james) ← f
Portanto, temos que :
conseqPcargo (J) =4-Tpg(Pcargo ,J) ↑= J,
e J é um modelo 4-estável de Pcargo .
4.5
Semântica bem-fundada de P-Datalog¬
Programas P-Datalog¬ , assim como os programas Datalog¬ podem ter vários modelos
4-estáveis (como mostra o exemplo 4.5.1), e cada programa P-Datalog¬ possui pelo
menos um modelo 4-estável (como será visto no teorema 5.1.2 do capı́tulo 5). Então
é razoável dizer que a resposta esperada para um programa P-Datalog¬ consiste dos fatos
verdadeiros, inconsistentes e falsos que pertençam a todos os modelos 4-estáveis do programa.
Definição 4.5.1 (Semântica bem-fundada de P-Datalog¬ ) Seja P um programa
P-Datalog¬ . A semântica bem-fundada P-Datalog¬ de P é uma instância 4-valorada consistindo de todos os fatos verdadeiros, inconsistentes e falsos que pertencem a todos os
modelos 4-estáveis de P . Tal instância é denotada por P 4wf .
Exemplo 4.5.1 (Programa P-Datalog¬ com vários modelos 4-estáveis) Considere
o seguinte programa P-Datalog¬ P :
p←i
q ← ∼r
r ← p, ∼q
s ← ∼ r, p, q
O programa possui três modelos 4-estáveis (os fatos indefinidos são omitidos):
M1 = {• p, •r, ∼q,∼s},
M2 = {• p, •s, ◦q, ∼r } e
M3 = {• p}.
Portanto, a semântica bem-fundada de P-Datalog¬ do programa P é P 4wf ={• p}.
CAPÍTULO 4. P-DATALOG¬
84
Discussão: Semântica bem-fundada P-Datalog¬ fraca
Um fato é dito ser inconsistente quando existe evidência de sua presença no banco de
dados e também quando existe evidência do contrário. Baseando-se nesta definição intuitiva, investigamos a possibilidade de uma definição da semântica bem-fundada fraca de
P-Datalog¬ , cujo modelo é denotado por wP 4wf . Em tal modelo os fatos inconsistentes
seriam os que são inconsistentes em pelo menos um dos modelos 4-estáveis do programa,
e os verdadeiros e falsos seriam os que são verdadeiros e falsos, respectivamente, em todos
os modelos 4-estáveis. Entretanto, como mostra o exemplo a seguir, esta definição produz
modelos não estáveis.
Exemplo 4.5.2 (Semântica bem-fundada fraca P-Datalog¬ ) Considere o programa
P-Datalog¬ P do exemplo 4.5.1. A definição de semântica bem-fundada fraca de PDatalog¬ wP 4wf produz o modelo wP 4wf = {• p, •r, •q}.
O programa positivado instanciado pg(P, wP 4wf ) é descrito a seguir:
p←i
q ←f
r ← p, f
s ← f, p, q
1
2
4-Tpg(P,wP
4wf ) (⊥)={• p, ∼r, ∼q, ∼ r }=4-Tpg(P,wP 4wf ) .
Temos então que conseqP (wP 4wf ) ={•p, ∼r, ∼q, ∼r }.
Ou seja, conseqP (wP 4wf ) 6= wP 4wf e wP 4wf não é modelo 4-estável.
Capı́tulo 5
Método de avaliação bottom-up
Neste capı́tulo é descrito um método construtivo de avaliação de programas P-Datalog¬ ,
baseado em um operador de ponto fixo. Na seção 5.1, é apresentado o algoritmo do ponto
fixo alternante, através do qual se obtém a semântica bem-fundada P-Datalog¬ . Em
seguida, na seção 5.2, são apresentados resultados que mostram que a semântica bemfundada P-Datalog¬ estende a semântica bem-fundada Datalog¬ . No final do capı́tulo,
na seção 5.3, são apresentadas considerações sobre a implementação do provador de programas P-Datalog¬ .
5.1
Algoritmo do ponto fixo alternante
A descrição da semântica bem-fundada de P-Datalog¬ , apresentada no capı́tulo 4, produz
um algoritmo para obtenção desta semântica que envolve, em primeiro lugar, a determinação dos modelos 4-estáveis dentre todas as instâncias 4-valoradas do programa, para
em seguida calcular a sua intersecção. A intersecção dos modelos 4-estáveis resulta na
semântica bem-fundada de P-Datalog¬ . Tal algoritmo apesar de eficaz é ineficiente. Um
algoritmo mais simples e mais eficiente para se obter, de forma construtiva, a semântica
bem-fundada de P-Datalog¬ , é proposto nesta seção. Este algoritmo é uma extensão do
algoritmo do ponto fixo alternante de Datalog¬ , apresentado em [AVH95], que por sua
vez é uma adaptação do algoritmo de Van Gelder [Van89] (descrito na seção 2.5.5).
O algoritmo do ponto fixo alternante de P-Datalog¬ consiste na construção de uma
sequência alternante de instâncias que converge para a semântica bem-fundada P-Datalog¬ ,
como é descrito a seguir.
5.1.1
Sequência alternante
Na definição da semântica bem-fundada de P-Datalog¬ , foi proposto um operador de
estabilidade, denotado por conseqP . Este operador conseqP é utilizado para definir uma
85
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
86
sequência de instâncias a partir da instância ⊥, na qual todos os átomos de B(P ) são
falsos.
Definição 5.1.1 (Sequência alternante) A sequência alternante {Ii }i>0 é definida da
seguinte forma:
I0 = ⊥
Ii+1 = conseqP (Ii ), i > 0
Exemplo 5.1.1 Considere o programa P-Datalog¬ P apresentado no exemplo 4.5.1, isto
é:
p
q
r
s
←i
← ∼r
← p, ∼q
← ∼ r, p, q
A partir do programa P e do operador conseqP obtemos a seguinte sequência alternante:
I0 ={∼p, ∼q, ∼r, ∼s}
I2 ={•p, ∼q, ∼r, ∼s}
I4 ={•p, ∼q, ∼r, ∼s}
I1 ={•p, ◦q, •r, •s}
I3 ={•p, ◦q, •r, •s}
Note que toda instância Ii pertencente à sequência alternante do exemplo anterior,
é uma instância total, isto é, não possui átomos com valor-verdade u. De fato, isto se
verifica em geral, como mostra a próxima proposição.
Proposição 5.1.1 Toda instância 4-valorada Ii , i > 0, pertencente à sequência alternante {Ii }i>0 é uma instância total.
Demonstração:
Isto decorre dos seguintes fatos:
• se I é total, então conseqP (I) é total; e
• Ii é construı́da a partir da instância total ⊥, pela aplicação repetida de conseqP .
De fato, no cálculo de conseqP são utilizados o operador negação ∼ e conjunção ∧,
e estes apenas resultam no valor-verdade u se aplicados a pelo menos um átomo cujo
valor-verdade também é u. Como a instância I é total, para todo A ∈ B(P ) temos que
I(A) 6=u. Logo, conseqP (I) também é uma instância total.
¤
O próximo resultado apresentado justifica a denominação de alternante para a sequência
{Ii }i>0 .
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
87
Teorema 5.1.1 O operador conseqP (I) é antimonotônico. Ou seja, se I 4 J, então
conseqP (J) 4 conseqP (I).
Demonstração:
Queremos mostrar que se I 4 J então conseqP (I) 4 conseqP (J).
Ou seja, se ∀A ∈ B(P ), I(A) 6 J(A) então ∀A ∈ B(P ), conseqP (J)(A) 6 conseqP (I)(A).
Sabemos que por definição conseqP (I) é o menor ponto fixo do programa positivo
instanciado, denotado por pg(P, I)(⊥), obtido por aplicações sucessivas do operador 4TP .
Temos, então, os seguintes casos:
1. conseqP (J)(A)=t. Vamos mostrar que conseqP (I)(A) =t.
Por indução em n vamos provar a seguinte asserção:
j
n
P(n)= “Se n é tal que 4-Tpg(P,J)
(⊥)(A) =t, e ∀j, j > n, 4-Tpg(P,J)
(⊥)(A) =t, então
conseqP (I)(A) =t.”
• Base da Indução: n=1
Vamos demonstrar que conseqP (I)(A) =t.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , onde Bk são átomos, J(Bk ) =f para todo k, 1 6 k 6 n.
De I 4 J temos que I(Bk ) =f para todo k, 1 6 k 6 n.
Logo conseqP (I)(A) =t.
Portanto a base da indução é verdadeira.
• Passo da indução: Supomos P(n) e vamos demonstrar P(n+1).
Vamos mostrar que conseqP (I)(A) =t.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , D1 , . . . , Dm , onde Bk , Dg são átomos, J(Bk ) =f para todo k,
n
1 6 k 6 n e 4-Tpg(P,J)
(⊥)(Dg ) =t, para todo g, 1 6 g 6 m.
De I 4 J temos que I(Bk ) =f para todo k, 1 6 k 6 n.
De P(n) temos conseqP (I)(Dg ) =t, para todo g, 1 6 g 6 m.
Logo conseqP (I)(A) =t.
Portanto a base e o passo da indução estão demonstrados e P(n) é válido para todo
n, n > 1.
2. conseqP (J)(A)=i. Vamos mostrar que conseqP (I)(A) > i.
Por indução em n vamos provar a seguinte asserção:
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
88
j
n
P(n)=“Se n é tal que 4-Tpg(P,J)
(⊥)(A) =i, e ∀j, j > n, 4-Tpg(P,J)
(⊥)(A) =i, então
conseqP (I)(A) >i.”
• Base da Indução: n=1
Vamos demonstrar que conseqP (I)(A) >i.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , c1 , . . . , cp , onde Bk são átomos e cg são valores-verdade,
J(Bk ) =f para todo k, 1 6 k 6 n, cg >i para todo g, 1 6 g 6 p, e existe um
w tal que cw =i, 1 6 w 6 p.
De I 4 J temos que I(Bk ) =f para todo k, 1 6 k 6 n.
Logo conseqP (I)(A) >i.
Portanto a base da indução é verdadeira.
• Passo da indução: Supomos P(n) e vamos demonstrar P(n+1).
Vamos mostrar que conseqP (I)(A) >i.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , D1 , . . . , Dm , onde Bk , Dg são átomos, J(Bk ) =f para todo k,
n
1 6 k 6 n e 4-Tpg(P,J)
(⊥)(Dg ) >i, para todo g, 1 6 g 6 m.
De I 4 J temos que I(Bk ) =f para todo k, 1 6 k 6 n.
De P(n) temos conseqP (I)(Dg ) >i, para todo g, 1 6 g 6 m.
Logo conseqP (I)(A) =i.
Portanto a base e o passo da indução estão demonstrados e P(n) é válido para todo
n, n > 1.
3. conseqP (J)(A)=u. Vamos mostrar que conseqP (I)(A) > u.
Por indução em n vamos provar a seguinte asserção:
j
n
P(n)=“Se n é tal que 4-Tpg(P,J)
(⊥)(A) =u, e ∀j, j > n, 4-Tpg(P,J)
(⊥)(A) =u, então
conseqP (I)(A) >u.”
• Base da Indução: n=1
Vamos demonstrar que conseqP (I)(A) >u.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , c1 , . . . , cp , onde Bk são átomos e cg são valores-verdade,
J(Bk ) ∈ {f,u} para todo k, 1 6 k 6 n, cg >u para todo g, 1 6 g 6 p, e existe um
w, 1 6 w 6 p, tal que cw =u ou existe y, 1 6 y 6 n, tal que J(By ) =u.
De I 4 J temos que I(Bk ) ∈ {f,u} para todo k, 1 6 k 6 n.
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
89
Logo conseqP (I)(A) >u.
Portanto a base da indução é verdadeira.
• Passo da indução: Supomos P(n) e vamos demonstrar P(n+1).
Vamos mostrar que conseqP (I)(A) >u.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , D1 , . . . , Dm , onde Bk , Dg são átomos, J(Bk ) ∈{f,u} para todo
n
(⊥)(Dg ) >u, para todo g, 1 6 g 6 m.
k, 1 6 k 6 n e 4-Tpg(P,J)
De I 4 J temos que I(Bk ) ∈ {f,u} para todo k, 1 6 k 6 n.
De P(n) temos conseqP (I)(Dg ) >u, para todo g, 1 6 g 6 m.
Logo conseqP (I)(A) >u.
Portanto a base e o passo da indução estão demonstrados e P(n) é válido para todo
n, n > 1.
4. conseqP (J)(A)=f. Neste caso temos que sempre conseqP (I)(A) > f.
¤
A instância I0 = ⊥ é a menor de todas as instâncias 4-valoradas relativas ao programa
P , ou seja, I0 4 In , ∀n > 0. Aplicando-se o operador conseqP à desigualdade anterior,
obtemos que conseqp (In ) 4 conseqP (I0 ). Então, In+1 4 I1 , ∀n > 0. Desta forma, as
instâncias I0 e I1 são, respectivamente, a menor e a maior das instâncias 4-valoradas da
sequência {Ii }i>0 .
Aplicando-se o operador conseqP sucessivamente à desigualdade I0 4 I2 , obtemos:
I0 4 I2
I3 4 I1
I2 4 I4
I5 4 I3
I4 4 I6
...
=⇒ conseqP (I2 ) 4 conseqP (I0 ) =⇒
=⇒ conseqP (I1 ) 4 conseqP (I3 ) =⇒
=⇒ conseqP (I4 ) 4 conseqP (I2 ) =⇒
=⇒ conseqP (I3 ) 4 conseqP (I5 ) =⇒
=⇒ conseqP (I6 ) 4 conseqP (I4 ) =⇒
E, de I0 4 I1 obtemos:
I0 4 I1
I2 4 I1
I2 4 I3
I4 4 I3
I4 4 I5
...
=⇒ conseqP (I1 ) 4 conseqP (I0 ) =⇒
=⇒ conseqP (I1 ) 4 conseqP (I2 ) =⇒
=⇒ conseqP (I3 ) 4 conseqP (I2 ) =⇒
=⇒ conseqP (I3 ) 4 conseqP (I4 ) =⇒
=⇒ conseqP (I5 ) 4 conseqP (I4 ) =⇒
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
90
A partir das desigualdades anteriores, obtemos a sequência alternante {Ii }i>0 , mostrada
a seguir:
I0 4 I2 4 I4 4 .. 4 I2i 4 I2i+2 4 .. 4 I2i+1 4 I2i−1 4 .. 4 I5 4 I3 4 I1
5.1.2
Instâncias I∗ , I∗ e I∗∗
Na sequência alternante, temos que a subsequência par está crescendo e a ı́mpar está
decrescendo. Como o conjunto de instâncias 4-valoradas sobre o universo de Herbrand
do programa P é finito, cada uma delas torna-se constante em algum ponto. Ou seja,
I2k = I2k+2 e I2j+1 = I2j+3 , para algum k > 0 e algum j > 0. Os limitantes da sequência
par e sequência ı́mpar são definidos a seguir.
Definição 5.1.2 O menor limitante superior da sequência crescente é denotado por I∗ ,
e definido da seguinte forma:
I∗ = sup{I2i }i>0 .
O maior limite inferior da sequência decrescente é denotado por I∗ , definido da
seguinte forma:
I∗ = inf {I2i+1 }i>0 .
Exemplo 5.1.2 As instâncias I∗ e I∗ para a sequência alternante do exemplo 5.1.1 são
mostradas a seguir:
I∗ ={•p, ∼q, ∼r, ∼s} e I∗ ={•p, ◦q, •r, •s}
Observe que I∗ 4 I∗ . De fato, na sequência {Ii }i>0 temos que uma instância par é
sempre menor ou igual a uma instância ı́mpar.
Vamos mostrar a seguir que o operador conseqP aplicado ao menor limite da sequência
par resulta no maior limite da sequência ı́mpar. Do mesmo modo, conseqP aplicado ao
maior limite da sequência ı́mpar resulta no menor limite da sequência par.
Proposição 5.1.2 Seja I uma instância 4-valorada e P um programa P-Datalog¬ . Temos
que:
conseqP (I∗ ) = I∗ e conseqP (I∗ ) = I∗ .
Demonstração:
Suponha que o limite da sequência par seja I∗ = I2k = I2k+2 , para algum k > 0.
Vamos mostrar que conseqP (I∗ ) = I∗ .
Sabemos que Ii+1 = conseqP (Ii ). Então, temos que:
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
91
I2k = conseqP (I2k−1 )
I2k+1 = conseqP (I2k )
I2k+2 = conseqP (I2k+1 )
I2k+3 = conseqP (I2k+2 )
Pela nossa suposição, I∗ = I2k = I2k+2 . Então , conseqP (I2k ) = conseqP (I2k+2 ). Logo,
I2k+1 = I2k+3 , o que define o limite I∗ da sequência ı́mpar. Portanto, conseqP (I∗ ) = I∗ .
De forma análoga mostramos que conseqP (I∗ ) = I∗ .
¤
A partir das instâncias I∗ e I∗ é definida uma instância 4-valorada I∗∗ , que coincide
com a semântica bem-fundada, como é enunciado no teorema 5.1.2.
Definição 5.1.3 (Instância I∗∗ ) Seja I∗∗ a instância 4-valorada consistindo de fatos contidos na intersecção de I∗ e I∗ , como é definido a seguir:

t se I∗ (A) = I∗ (A) = t



 i se I (A) = I∗ (A) = i
∗
∗
I∗ (A) =

f se I∗ (A) = I∗ (A) = f



u caso contrário
A próxima proposição mostra que a instância I∗∗ é uma instância que pode não ser
total, e portanto pode não pertencer à sequência alternante, mas que se encontra, em
termos de precedência, entre as instâncias totais I∗ e I∗ .
Exemplo 5.1.3 No exemplo 5.1.2 foram definidas as instâncias I∗ ={•p, ∼q, ∼r, ∼s} e
I∗ ={•p, ◦q, •r, •s}. A partir destas duas instâncias, obtemos a instância I∗∗ mostrada a
seguir:
I∗∗ ={•p}.
Observe que as instâncias I∗ e I∗ são instâncias totais, enquanto que I∗∗ não é uma
instância total.
Proposição 5.1.3 Seja I uma instância 4-valorada de um programa P-Datalog¬ , então:
I∗ 4 I∗∗ 4 I∗ .
Demonstração:
A demonstração deste resultado é direta da aplicação da definição de I∗∗ , onde temos
apenas um caso em que a desigualdade não é válida: quando I∗ (A)=i e I∗ (A)=t.
Vamos mostrar que este caso não ocorre, ou seja, se I∗ (A)=t então I∗ (A) ∈{f,t}.
Podemos reescrever I∗ (A) como conseqP (I∗ )(A) e I∗ (A) como conseqP (I∗ )(A). Supondo
conseqP (I∗ )(A)= t, vamos mostrar que neste caso conseqP (I∗ )(A) ∈{f,t}.
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
92
Vamos provar por indução em n a seguinte asserção:
j
n
P(n)=“Se n é tal que 4-Tpg(P,I
(⊥)(A) =t, então
(⊥)(A) =t, e ∀j, j > n, 4-Tpg(P,I
∗)
∗)
∗
conseqP (I )(A) ∈{f,t}.”
• Base da Indução: n=1
Vamos demonstrar que conseqP (I∗ )(A) ∈{f,t}.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , onde Bk são átomos, I∗ (Bk ) =f para todo k, 1 6 k 6 n.
De I∗ 4 I∗ temos que I∗ (Bk ) ∈{f,i,t} para todo k, 1 6 k 6 n.
Logo conseqP (I∗ )(A) ∈{t,f } e a base da indução é verdadeira.
• Passo da indução: Supomos P(n) e vamos demonstrar P(n+1).
Vamos mostrar que conseqP (I∗ )(A) ∈ {f,t}.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , D1 , . . . , Dm , onde Bk , Dg são átomos, I∗ (Bk ) =f para todo k,
n
1 6 k 6 n e 4-Tpg(P,I
(⊥)(Dg ) =t, para todo g, 1 6 g 6 m.
∗)
∗
De I∗ 4 I temos que I∗ (Bk ) ∈{f,i,t} para todo k, 1 6 k 6 n.
De P(n) temos conseqP (I∗ )(Dg ) ∈{f,t}, para todo g, 1 6 g 6 m.
Logo conseqP (I∗ )(A) ∈{f,t}. Portanto a base e o passo da indução são verdadeiros.
P(n) é válido para todo n, n > 1.
¤
Exemplo 5.1.4 Para as sequências definidas no exemplo anterior (exemplo 5.1.3), mostradas
novamente a seguir:
I∗ ={•p, ∼q, ∼r, ∼s},
I∗ ={•p, ◦q, •r, •s},
I∗∗ ={•p},
é verificada a desigualdade I∗ 4 I∗∗ 4 I∗ .
5.1.3
Cálculo da semântica bem-fundada de P-Datalog¬
A construção do ponto fixo alternante produz a semântica bem-fundada para programas
P-Datalog¬ , como mostra o próximo teorema. A prova do teorema indica que um programa P-Datalog¬ tem pelo menos um modelo 4-estável e, desta forma sua semântica
bem-fundada é sempre definida. Mostra também que o modelo obtido pela construção do
ponto fixo alternante é um modelo 4-estável.
Teorema 5.1.2 Para todo programa P-Datalog¬ P :
1. A instância I∗∗ é um modelo 4-estável de P .
2. A semântica bem-fundada P-Datalog¬ P 4wf coincide com a instância I∗∗
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
93
Demonstração:
I) Vamos mostrar que I∗∗ é modelo 4-estável de P .
Sabemos que I∗ 4 I∗∗ 4 I∗ , e conseqP (I∗ ) = I∗ , conseqP (I∗ ) = I∗ . Como conseqP é
antimonotônico, temos:
I∗ 4 I∗∗ 4 I∗
=⇒ conseqP (I∗ ) < conseqP (I∗∗ ) < conseqP (I∗ )
=⇒ I∗ < conseqP (I∗∗ ) < I∗
=⇒ I∗ 4 conseqP (I∗∗ ) 4 I∗
(5.1)
Vamos verificar cada um dos possı́veis valores de I∗∗ (A).
1) Se I∗∗ (A)=f
Pela definição de I∗∗ , temos que I∗ (A)=f e I∗ (A)=f. Trocando-se os valores de I∗ (A) e
I∗ (A) na desigualdade (5.1) temos que f 6 conseqP (I∗∗ )(A) 6 f.
Logo, conseqP (I∗∗ )(A)=f.
2) Se I∗∗ (A)=t
Pela definição de I∗∗ , temos que I∗ (A)=t e I∗ (A)=t. Trocando-se os valores de I∗ (A) e
I∗ (A) na desigualdade (5.1) temos que t 6 conseqP (I∗∗ )(A) 6 t.
Logo, conseqP (I∗∗ )(A)=t.
3) Se I∗∗ (A)=i
Pela definição de I∗∗ , temos que I∗ (A)=i e I∗ (A) = i. Trocando-se os valores de I∗ (A)
e I∗ (A) da desigualdade (5.1) temos que i 6 conseqP (I∗∗ )(A) 6 i.
Logo, conseqP (I∗∗ )(A)=i.
4) Se I∗∗ (A)=u
Pela definição de I∗∗ , temos os seguintes casos:
a) I∗ (A)=i e I∗ (A) =t.
Este caso não é possı́vel. É equivalente a conseqP (I∗ )(A) =i e conseqP (I∗ )(A) =t, e
se conseqP (I∗ )(A) =t então conseqP (I∗ )(A) ∈{f,t}, como foi mostrado na demonstração
da proposição 5.1.3.
b) I∗ (A)=f e I∗ (A) ∈{i,t}.
É equivalente a conseqP (I∗ )(A) =f e conseqP (I∗ )(A) >i.
Por definição, conseqP (I∗ ) é o menor ponto fixo de pg(P, I∗ )(⊥).
Vamos considerar a seguinte asserção:
j
n
n
P(n)=“Se n é tal que 4-Tpg(P,I
(⊥)(A) >i, e ∀j, j > n, 4-Tpg(P,I
(⊥)(A) =4-Tpg(P,I
(⊥)(A),
∗)
∗)
∗)
∗
então conseqP (I∗ )(A) =u.”
• Base da Indução: n=1
Vamos demonstrar que conseqP (I∗∗ )(A) =u.
Segundo a hipótese, existe em ground(P ) regra da forma:
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
94
A ←∼ B1 , . . . , ∼ Bn , c1 , . . . , cp , onde Bk são átomos e cg são valores-verdade, I∗ (Bk ) =f
para todo k, 1 6 k 6 n, cg >i para todo g, 1 6 g 6 p.
De I∗ 4 I∗ temos que I∗ (Bk ) ∈{f,i,t} para todo k, 1 6 k 6 n. Por conseqP (I∗ )(A) =f
então existe um l, 1 6 l 6 n tal que I∗ (Bl ) ∈{i,t}.
Da definição I∗∗ temos que I∗∗ (Bk ) ∈{f,u} para todo k, 1 6 k 6 n, e existe um l,
1 6 k, l 6 n tal que I∗∗ (Bl )=u.
Logo conseqP (I∗∗ )(A) =u.
Portanto a base da indução é verdadeira.
• Passo da indução: Supomos P(n) e vamos demonstrar P(n+1).
Vamos mostrar que conseqP (I∗∗ )(A) =u.
Segundo a hipótese, existe em ground(P ) regra da forma:
A ←∼ B1 , . . . , ∼ Bn , D1 , . . . , Dm , onde Bk , Dg são átomos, I∗ (Bk ) =f para todo k,
n
(⊥)(Dg ) >i, para todo g, 1 6 g 6 m.
1 6 k 6 n e 4-Tpg(P,I
∗)
∗
De I∗ 4 I temos que I∗ (Bk ) ∈{f,i,t} para todo k, 1 6 k 6 n. Segundo a hipótese
inicial, conseqP (I∗ )(A) =f então existe um l, 1 6 l 6 n tal que I∗ (Bl ) ∈{i,t}.
Da definição I∗∗ temos que I∗∗ (Bk ) ∈{f,u} para todo k, 1 6 k 6 n, e existe um l,
1 6 l 6 n, tal que I∗∗ (Bl )=u.
De P(n) temos conseqP (I∗∗ )(Dg ) =u, para todo g, 1 6 g 6 m.
Logo conseqP (I∗∗ )(A) =u.
Portanto a base e o passo da indução são verdadeiros. P(n) é válido para todo n,
n > 1.
II) Agora vamos demostrar que P 4wf = I∗∗ . Para todo A ∈ B(P ), temos:
(⇒) Se P 4wf (A) =t (i, f ) então I∗∗ (A) =t (i, f ).
Como P 4wf é a intersecção de todos os modelos 4-estáveis e I∗∗ é um modelo 4-estável,
então todos os fatos verdadeiros, falsos e inconsistentes de P 4wf também são verdadeiros,
falsos e inconsistentes, respectivamente em I∗∗ .
(⇐) Se I∗∗ (A) =t (i, f ) então P 4wf (A) =t (i, f ).
Vamos então mostrar por indução em i, que para todo modelo 4-estável M do programa
P , e para todo i > 0, temos que:
I2i 4 M 4 I2i+1 .
(5.2)
• Base da indução: i = 0.
Sabemos que I0 = ⊥. Logo I0 4 M.
Sabemos que conseqP é antimonotônico, então conseqP (M) 4 conseqP (I0 ). Como
conseqP (I0 ) = I1 e M é um modelo 4-estável (conseqP (M) = M) então temos que M 4 I1 ,
e portanto I0 4 M 4 I1 .
A base da indução é verdadeira.
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
95
• O passo da indução é similar.
De (5.2), temos que I∗ 4 M 4 I∗ e para cada A ∈ B(P ) temos os seguintes casos:
B Se I∗∗ (A)=t, então I∗ (A)=t, e de I∗ (A) 6 M(A), temos M(A)=t.
B Se I∗∗ (A)=i, então I∗ (A)=I∗ (A)=i, e de I∗ (A) 6 M(A) 6 I∗ (A), temos M(A) = i.
B Se I∗∗ (A)=f, então I∗ (A)=f, e de I∗ (A) > M(A), M(A)=f.
Portanto I∗∗ = P 4wf .
¤
O exemplo a seguir mostra passo a passo o cálculo da instância I∗∗ .
Exemplo 5.1.5 (Cálculo de I∗∗ ) Considere o programa P-Datalog¬ Pcargo e a instância
I, apresentados no exemplo 1.0.1. Vamos calcular a instância I∗∗ correspondente a partir da instância I0 = ⊥ onde todos os fatos são falsos. Os átomos indicadoPor e devedor
serão omitidos pois os valores destes coincidem com os valores apresentados pela instância
inicial I.
Vamos então calcular I1 = conseqP (I0 ).
O programa positivado instanciado pg(Pcargo , I0 ) é descrito a seguir:
cargo(charles) ← t,indicadoPor(charles, joseph), t
cargo(joseph) ← t,indicadoPor(joseph, charles), t
cargo(paul) ← t,indicadoPor(paul, james), t
cargo(john) ← t,indicadoPor(john, kevin), t
cargo(james) ← t,indicadoPor(james, kevin), t
indicadoPor(paul, james) ←
indicadoPor(charles, joseph) ←
indicadoPor(joseph, charles) ←
indicadoPor(james, kevin) ←
indicadoPor(john, kevin) ←i
devedor(james) ←
4-TP1 (⊥):
cargo(charles) ← t,f,t
cargo(joseph) ← t,f,t
cargo(paul) ← t,f,t
cargo(john) ← t,f,t
cargo(james) ← t,f,t
=⇒
=⇒
=⇒
=⇒
=⇒
cargo(charles) ← f
cargo(joseph) ← f
cargo(paul) ← f
cargo(john) ← f
cargo(james) ← f
4-TP1 (⊥)= {∼cargo(charles), ∼cargo(james), ∼cargo(john), ∼cargo(joseph), ∼cargo(kevin)}
4-TP2 (⊥):
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
cargo(charles) ← t,t,t
cargo(joseph) ← t,t,t
cargo(paul) ← t,t,t
cargo(john) ← t,i,t
cargo(james) ← t,t,t
=⇒
=⇒
=⇒
=⇒
=⇒
96
cargo(charles) ← t
cargo(joseph) ← t
cargo(paul) ← t
cargo(john) ← i
cargo(james) ← t
4-TP2 (⊥)= {◦cargo(charles), ◦cargo(joseph),◦cargo(james), •cargo(john), ∼cargo(kevin),
◦cargo(paul)}=4-TP3 (⊥)
Portanto, temos que :
I1 = conseqP (I0 ) ={◦cargo(charles), ◦cargo(joseph),◦cargo(james), •cargo(john),
∼cargo(kevin), ◦cargo(paul)}.
Vamos então calcular I2 = conseqP (I1 ).
O programa positivado instanciado pg(Pcargo , I1 ) é descrito a seguir:
cargo(charles) ← t,indicadoPor(charles, joseph), f
cargo(joseph) ← t,indicadoPor(joseph, charles), f
cargo(paul) ← t,indicadoPor(paul, james), f
cargo(john) ← t,indicadoPor(john, kevin), t
cargo(james) ← f,indicadoPor(james, kevin), t
indicadoPor(paul, james) ←
indicadoPor(charles, joseph) ←
indicadoPor(joseph, charles) ←
indicadoPor(james, kevin) ←
indicadoPor(john, kevin) ←i
devedor(james) ←
4-TP1 (⊥):
cargo(charles) ← t,f,f
cargo(joseph) ← t,f,f
cargo(paul) ← t,f,f
cargo(john) ← t,f,t
cargo(james) ← f,f,t
=⇒
=⇒
=⇒
=⇒
=⇒
cargo(charles) ← f
cargo(joseph) ← f
cargo(paul) ← f
cargo(john) ← f
cargo(james) ← f
4-TP1 (⊥)= {∼cargo(charles), ∼cargo(joseph), ∼cargo(paul), ∼cargo(john), ∼cargo(james),
∼cargo(kevin)}
4-TP2 (⊥):
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
cargo(charles) ← t,t,f
cargo(joseph) ← t,t,f
cargo(paul) ← t,t,f
cargo(john) ← t,i,t
cargo(james) ← f,t,t
=⇒
=⇒
=⇒
=⇒
=⇒
97
cargo(charles) ← f
cargo(joseph) ← f
cargo(paul) ← f
cargo(john) ← i
cargo(james) ← f
4-TP2 (⊥)= {∼cargo(charles), ∼cargo(joseph), ∼cargo(paul), •cargo(john), ∼cargo(james),
∼cargo(kevin)}=4-TP3 (⊥)
Portanto, temos que :
I2 = conseqP (I1 ) ={∼cargo(charles), ∼cargo(joseph), ∼cargo(paul), •cargo(john),
∼cargo(james), ∼cargo(kevin)}.
Vamos então calcular I3 = conseqP (I2 ).
O programa positivado instanciado pg(Pcargo , I2 ) é descrito a seguir:
cargo(charles) ← t,indicadoPor(charles, joseph), t
cargo(joseph) ← t,indicadoPor(joseph, charles), t
cargo(paul) ← t,indicadoPor(paul, james), t
cargo(john) ← t,indicadoPor(john, kevin), t
cargo(james) ← f,indicadoPor(james, kevin), t
indicadoPor(paul, james) ←
indicadoPor(charles, joseph) ←
indicadoPor(joseph, charles) ←
indicadoPor(james, kevin) ←
indicadoPor(john, kevin) ←i
devedor(james) ←
4-TP1 (⊥):
cargo(charles) ← t,f,t
cargo(joseph) ← t,f,t
cargo(paul) ← t,f,t
cargo(john) ← t,f,t
cargo(james) ← f,f,t
=⇒
=⇒
=⇒
=⇒
=⇒
cargo(charles) ← f
cargo(joseph) ← f
cargo(paul) ← f
cargo(john) ← f
cargo(james) ← f
4-TP1 (⊥)= {∼cargo(charles), ∼cargo(joseph), ∼cargo(paul), ∼cargo(john), ∼cargo(james),
∼cargo(kevin)}
4-TP2 (⊥):
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
cargo(charles) ← t,t,t
cargo(joseph) ← t,t,t
cargo(paul) ← t,t,t
cargo(john) ← t,i,t
cargo(james) ← f,t,t
=⇒
=⇒
=⇒
=⇒
=⇒
98
cargo(charles) ← t
cargo(joseph) ← t
cargo(paul) ← t
cargo(john) ← i
cargo(james) ← f
4-TP2 (⊥)= {◦cargo(charles), ◦cargo(joseph), ◦cargo(paul), •cargo(john), ∼cargo(james),
∼cargo(kevin)}=4-TP3 (⊥)
Portanto, temos que :
I3 = conseqP (I2 ) ={◦cargo(charles), ◦cargo(joseph), ◦cargo(paul),
•cargo(john), ∼cargo(james), ∼cargo(kevin)}=I5 .
Vamos então calcular I4 = conseqP (I3 ).
O programa positivado instanciado pg(Pcargo , I3 ) é descrito a seguir:
cargo(charles) ← t,indicadoPor(charles, joseph), f
cargo(joseph) ← t,indicadoPor(joseph, charles), f
cargo(paul) ← t,indicadoPor(paul, james), t
cargo(john) ← t,indicadoPor(john, kevin), t
cargo(james) ← f,indicadoPor(james, kevin), t
indicadoPor(paul, james) ←
indicadoPor(charles, joseph) ←
indicadoPor(joseph, charles) ←
indicadoPor(james, kevin) ←
indicadoPor(john, kevin) ←i
devedor(james) ←
4-TP1 (⊥):
cargo(charles) ← t,f,f
cargo(joseph) ← t,f,f
cargo(paul) ← t,f,t
cargo(john) ← t,f,t
cargo(james) ← f,f,t
=⇒
=⇒
=⇒
=⇒
=⇒
cargo(charles) ← f
cargo(joseph) ← f
cargo(paul) ← f
cargo(john) ← f
cargo(james) ← f
4-TP1 (⊥)= {∼cargo(charles), ∼cargo(joseph), ∼cargo(paul), ∼cargo(john), ∼cargo(james),
∼cargo(kevin)}
4-TP2 (⊥):
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
cargo(charles) ← t,t,f
cargo(joseph) ← t,t,f
cargo(paul) ← t,t,t
cargo(john) ← t,i,t
cargo(james) ← f,t,t
=⇒
=⇒
=⇒
=⇒
=⇒
99
cargo(charles) ← f
cargo(joseph) ← f
cargo(paul) ← t
cargo(john) ← i
cargo(james) ← f
4-TP2 (⊥)= {∼cargo(charles), ∼cargo(joseph), ◦cargo(paul), •cargo(john), ∼cargo(james),
∼cargo(kevin)}=4-TP3 (⊥).
Portanto, temos que :
I4 = conseqP (I3 ) = {∼cargo(charles), ∼cargo(joseph), ◦cargo(paul), •cargo(john),
∼cargo(james), ∼cargo(kevin)}=I6
I∗ = I4 = I6 ={∼cargo(charles), ∼cargo(joseph), ◦cargo(paul), •cargo(john), ∼cargo(james),
∼cargo(kevin)}.
I∗ = I3 = I5 ={◦cargo(charles), ◦cargo(joseph), ◦cargo(paul), •cargo(john), ∼cargo(james),
∼cargo(kevin)}.
Portanto I∗∗ = {∼ job(james), • job(john), ∼ job(kevin), ◦ job(paul)}. A instância I∗∗
corresponde à instância J do exemplo 1.0.1, e que no exemplo 4.4.1 foi mostrado ser um
modelo 4-estável.
Exemplo 5.1.6 (Cálculo de I∗∗ para programa com mais de um modelo 4-estável)
Considere o seguinte programa P-Datalog¬ P que possui mais de um modelo 4-estável
apresentado no exemplo 4.5.1:
p←i
q ← ∼r
r ← p, ∼q
s ← ∼ r, p, q
O algoritmo do ponto fixo alternate produz as seguintes instâncias:
I0 ={∼p, ∼q, ∼r, ∼s}
I1 ={•p, ◦q, •r, •s}
I2 ={•p, ∼q, ∼r, ∼s}
I3 ={•p, ◦q, •r, •s}
I4 ={•p, ∼q, ∼r, ∼s}
I∗ ={•p, ∼q, ∼r, ∼s}
I∗ ={•p, ◦q, •r, •s}
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
100
I∗∗ ={•p}.
Portanto, como era de se esperar, a instância I∗∗ coincide com a intersecção de todos
os modelos 4-estáveis de P apresentada no exemplo 4.5.1.
5.2
Resultados Comparativos
A semântica bem-fundada P-Datalog¬ é uma extensão da definição da semântica bemfundada Datalog¬ [Prz90] (descrita na seção 2.5.3), e portanto produz os mesmos resultados quando aplicada a instâncias consistentes, onde não existem fatos inconsistentes.
O exemplo mostrado a seguir é um clássico: foi discutido por Van Gelder [VRS91],
Przymusinski [Prz92] e por Gelfond e Lifschitz em [GL88]. É o exemplo de um programa
que não é suportado por algumas semânticas por conter recursão negativa (como no programa do exemplo seguinte, onde o predicado intencional win é definido recursivamente
pela sua negação) e, não ser estratificável [AVH95, Lif97]. O programa apresentado neste
exemplo também foi utilizado, com os identificadores dos predicados abreviados, nos exemplos 2.5.15 e 2.5.21.
Exemplo 5.2.1 (Programa Datalog¬ sobre instância sem inconsistências) O programa Pwin : win(X) ←move(X,Y), ∼win(Y), pode ser visto como um jogo entre dois
jogadores que movem sobre os vértices de um grafo direto G. As arestas do grafo são
especificadas pelo predicado move(X,Y). Um vértice X sobre o grafo G é considerado:
• uma posição vencedora: se um dado jogador pode mover de uma posição X para
uma posição Y a qual é uma posição perdedora para o jogador oponente, de forma que o
oponente perde o jogo.
• uma posição perdedora: se todos os movimentos possı́veis a partir desta posição
levam o jogador a uma posição em que o seu oponente é vencedor.
Normalmente, existe também um terceiro tipo de vértice, uma posição indeterminada
(empate), a partir da qual não é possı́vel determinar o resultado do jogo.
Vamos considerar a seguinte instância inicial: {◦ move(a,b), ◦ move(b,c), ◦ move(d,d)}.
Neste caso, o algoritmo do ponto fixo alternante resulta nas seguintes instâncias:
I0 ={∼win(a), ∼win(b), ∼win(c), ∼win(d)}
I1 ={◦win(a), ◦win(b), ∼win(c), ◦win(d)}
I2 ={∼win(a), ◦win(b), ∼win(c), ∼win(d)}
I3 ={∼win(a), ◦win(b), ∼win(c), ◦win(d)}
I4 ={∼win(a), ◦win(b), ∼win(c), ∼win(d)}
I5 ={∼win(a), ◦win(b), ∼win(c), ◦win(d)}.
I∗ ={∼win(a), ◦win(b), ∼win(c), ∼win(d)}.
I∗ ={∼win(a), ◦win(b), ∼win(c), ◦win(d)}.
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
101
I∗∗ ={∼win(a), ◦win(b), ∼win(c)}.
Tal resultado coincide com o resultado apresentado pela semântica bem-fundada [Prz92].
O modelo indica que c é uma posição perdedora porque não há aresta ligando-a a outra
possı́vel posição. Desta forma b é uma posição vencedora pois o jogador oponente somente
pode mover para a posição c que é uma posição perdedora. No caso da posição a, esta é
uma posição perdedora pois o jogador possui uma única possibilidade de movimentação:
posição b, uma posição vencedora (neste caso vencedora para o oponente). Entretanto,
a posição d não é vencedora nem perdedora, pois a única posição que se pode atingir a
partir de d é a própria posição d, a partir da qual não existe uma estratégia de vitória
para o jogador e nem o força a perder.
Para o mesmo programa apresentado no exemplo anterior, é introduzida uma inconsistência na instância do banco de dados, e os resultados obtidos são analisados.
Exemplo 5.2.2 (Instância com inconsistência) Vamos modificar a instância inicial
apresentada pelo exemplo anterior 5.2.1 para: {◦ move(a,b), • move(b,c), ◦ move(d,d)}
e o programa é o mesmo Pwin .
O algoritmo do ponto fixo alternante produz as seguintes instâncias:
I0 ={∼win(a), ∼win(b), ∼win(c), ∼win(d)}
I1 ={◦win(a), •win(b), ∼win(c), ◦win(d)}
I2 ={∼win(a), •win(b), ∼win(c), ∼win(d)}
I3 ={∼win(a), •win(b), ∼win(c), ◦win(d)}
I4 ={∼win(a), •win(b), ∼win(c), ∼win(d)}
I5 ={∼win(a), •win(b), ∼win(c), ◦win(d)}.
I∗ ={∼win(a), •win(b), ∼win(c), ∼win(d)}.
I∗ ={∼win(a), •win(b), ∼win(c), ◦win(d)}.
I∗∗ ={∼win(a), •win(b), ∼win(c)}.
Portanto a instância I∗∗ , que corresponde à semântica bem-fundada P-Datalog¬ , diz
que é seguro que a posição a não é uma posição vencedora (∼win(a)) apesar de que para
se chegar a tal conclusão usou-se um fato contraditório: •win(b).
Entretanto, em relação à posição b também é usado um fato inconsistente (•move(b,c))
na sua dedução, e esta inconsistência é propagada: é controverso que b é uma posição
vencedora (•win(b)).
O diferencial está no sı́mbolo que precede o fato inconsistente presente no corpo da
regra: o sı́mbolo ∼ da negação por default possui a propriedade de retornar sempre um
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
102
valor seguro, isto é, seguramente falso ou seguramente verdadeiro que um fato não se
encontra no banco de dados.
Logo, no caso da regra win(a) ← move(a,b),∼win(b), temos o sı́mbolo ∼ precedendo
o fato inconsistente win(b). Já no caso da regra win(b) ← move(b,c),∼win(c), o fato
inconsistente move(b,c) não possui nenhum sı́mbolo precedendo-o e a sua inconsistência
pode ser propagada.
5.3
Implementação do provador P-Datalog¬
Dentro do escopo desta dissertação, a implementação de P-Datalog¬ foi realizada isoladamente, sem a manipulação de grandes coleções de dados persistente, e gerou um provador
de programas P-Datalog¬ . A implementação do provador P-Datalog¬ é descrita a seguir
e no anexo A encontra-se a listagem da implementação.
5.3.1
A linguagem de programação OCaml
A linguagem de programação utilizada na implementação do provador P-Datalog¬ é uma
linguagem funcional que é uma extensão da famı́lia de linguagens ML (Meta-Language),
chamada Objective Caml (OCaml) [Ler02]. OCaml é uma linguagem de programação
desenvolvida pelo INRIA (Institut National de Recherche en Informatique et en Automatique), e é uma derivação da linguagem ML clássica projetada por Robin Milner em 1975
para o provador de teoremas LCF (Logic of Computable Functions). OCaml possui várias
caracterı́sticas comuns com outros dialetos do ML, e provê várias outras caracterı́sticas
próprias como os conceitos de orientação a objeto.
OCaml é uma linguagem funcional, onde funções podem ser encadeadas, podem ser
passadas como argumento de outras funções, e também podem ser armazenadas em estruturas de dados. OCaml é fortemente tipada: o tipo de toda variável e expressão
em um programa é determinado em tempo de compilação, o que reduz a taxa de erros
que ocorrem na execução do programa. Outras caracterı́sticas de OCaml são: suporte
a tipos polimórficos, gerenciamento de memória automático, tipos de dados algébricos,
casamento de padrão. Estas caracterı́sticas possibilitam o rápido desenvolvimento de sistemas, devido às baixas taxas de erro e inferência de tipos. Além disso, um número
pequeno de construtores simples e ortogonais, permite que o programador se concentre
nas dificuldades da aplicação, e desenvolva soluções sucintas e eficientes.
O compilador OCaml gera código comparável a C/C++ em velocidade, e inclui bibliotecas de uso geral para diversas plataformas, incluindo Unix e Windows.
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
5.3.2
103
Provador P-Datalog¬
A implementação do Provador P-Datalog¬ foi desenvolvida a partir do procedimento
de casamento de padrão “Match”, e do programa “Forward-chaining rule-based ” e suas
estruturas de dados, apresentados em [WH89].
As estruturas de dados utilizadas são fundamentadas em um elemento básico: tuplas do tipo ([lista de strings], valor ), onde lista de strings corresponde a uma lista
representado um átomo e valor corresponde ao valor-verdade do átomo. Por exemplo,
([“cargo”;“james”], t) representa o literal ◦ cargo(james). A partir deste elemento básico
são construı́das listas de tuplas e listas de listas de tuplas para representar as instâncias
do banco de dados e o programa P-Datalog¬ .
Outra estrutura de dados importante é a lista de asssociações de variáveis e constantes
do programa. O elemento básico desta lista é uma tupla do tipo (Variável ; Constante),
que associa uma variável com uma constante. A partir da lista de lista de associações as
regras são instanciadas.
O provador P-Datalog¬ pode ser dividido nos seguintes blocos:
1. Entrada e saı́da de dados;
2. Casamento de padrão e geração de listas de associações;
3. Operador de consequência imediata;
4. Corpo principal.
A entrada de dados é constituı́da por dois arquivos texto: um arquivo que contém o
programa P-Datalog¬ e um arquivo que contém a instância inicial do banco de dados.
O resultado consiste no conjunto de fatos verdadeiros, falsos, inconsistentes e indefinidos deduzidos.
O arquivo texto que contém o programa P-Datalog¬ , possui as seguintes caracterı́sticas:
• Cada linha do arquivo contém uma regra do programa P-Datalog¬ . As regras são
terminadas por “.” (ponto final), e os literais do corpo das regras são separados por
“;” (ponto e vı́rgula);
• Os identificadores de variáveis devem iniciar com letras maiúsculas;
• Os identificadores de constantes devem iniciar com letras minúsculas;
• Os caracteres “o”, “*”, “~”, “:-” denotam, respectivamente, os sı́mbolos “◦”, “•”,
“∼”, “←”;
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
104
O arquivo texto que contém a instância inicial do banco de dados, possui as seguintes
caracterı́sticas:
• Cada linha do arquivo contém um fato pertencente ao banco de dados;
• Todo fato é precedido dos caracteres “o” ou “*”, que representam respectivamente,
os sı́mbolos “◦” (verdadeiro), “•” (inconsistente);
O caracter “?” que precede fatos da saı́da produzida, denota que o valor-verdade do
fato é indefinido.
Os exemplos seguintes mostram a execução de programas P-Datalog¬ apresentados
anteriormente.
Exemplo 5.3.1 Considere o programa P-Datalog¬ Pwin e a instância inicial I dados no
exemplo 5.2.2.
Arquivo texto com o programa:
win(X):- move(X,Y); ~ win(Y).
Arquivo texto com a instância do banco de dados:
o move(a,b).
* move(b,c).
o move(d,d).
Resultado produzido:
~
~
~
o
move(a,a),
move(b,b),
move(c,c),
move(d,d),
o
*
~
~
move(a,b), ~ move(a,c), ~ move(a,d), ~ move(b,a),
move(b,c), ~ move(b,d), ~ move(c,a), ~ move(c,b),
move(c,d), ~ move(d,a), ~ move(d,b), ~ move(d,c),
win(a), * win(b), ~ win(c), ? win(d)
Exemplo 5.3.2 (Exemplo de motivação) Considere o programa P-Datalog¬ Pcargo e
a instância inicial I dados no exemplo 1.0.1.
Arquivo texto com o programa:
cargo(X):-~ devedor(X); indicadoPor(X,Y); ~ cargo(Y).
Arquivo texto com a instância do banco de dados:
o
o
o
*
o
o
indicadoPor(charles,joseph)
indicadoPor(joseph,charles)
indicadoPor(paul,james)
indicadoPor(john,kevin)
indicadoPor(james,kevin)
devedor(james)
CAPÍTULO 5. MÉTODO DE AVALIAÇÃO BOTTOM-UP
~
?
~
~
~
o
~
~
~
~
~
~
~
~
~
~
~
~
~
o
~
~
105
Resultado produzido:
cargo(james), * cargo(john), ~ cargo(kevin), o cargo(paul),
cargo(charles), ? cargo(joseph),
devedor(charles), o devedor(james), ~ devedor(john), ~ devedor(joseph),
devedor(kevin), ~ devedor(paul), ~ indicadoPor(charles,charles),
indicadoPor(charles,james), ~ indicadoPor(charles,john),
indicadoPor(charles,joseph), ~ indicadoPor(charles,kevin),
indicadoPor(charles,paul), ~ indicadoPor(james,charles),
indicadoPor(james,james), ~ indicadoPor(james,john),
indicadoPor(james,joseph), o indicadoPor(james,kevin),
indicadoPor(james,paul), ~ indicadoPor(john,charles),
indicadoPor(john,james), ~ indicadoPor(john,john),
indicadoPor(john,joseph), * indicadoPor(john,kevin),
indicadoPor(john,paul), o indicadoPor(joseph,charles),
indicadoPor(joseph,james), ~ indicadoPor(joseph,john),
indicadoPor(joseph,joseph), ~ indicadoPor(joseph,kevin),
indicadoPor(joseph,paul), ~ indicadoPor(kevin,charles),
indicadoPor(kevin,james), ~ indicadoPor(kevin,john),
indicadoPor(kevin,joseph), ~ indicadoPor(kevin,kevin),
indicadoPor(kevin,paul), ~ indicadoPor(paul,charles),
indicadoPor(paul,james), ~ indicadoPor(paul,john),
indicadoPor(paul,joseph), ~ indicadoPor(paul,kevin),
indicadoPor(paul,paul)
Capı́tulo 6
Conclusão e trabalhos futuros
O trabalho desta dissertação foi realizado sob a perspectiva da definição de uma linguagem
de consultas a um tipo especial de banco de dados, onde podem existir fatos armazenados
com a identificação de que são inconsistenstes, ou seja, um banco de dados paraconsistente.
Alguns objetivos foram plenamente alcançados, como:
1. A definição da linguagem de consultas P-Datalog¬ ;
2. A definição da semântica bem-fundada de P-Datalog¬ ;
3. A definição do método de avaliação bottom-up de programas P-Datalog¬ ;
4. Implementação do provador de programas P-Datalog¬ .
O desenvolvimento de um provador baseado em um Método de Resolução para programas P-Datalog¬ é deixado como um trabalho a ser futuramente desenvolvido.
Inicialmente a proposta era mais ambiciosa: a sintaxe de um programa P-Datalog¬
envolvia a ocorrência de literais do tipo •A e ◦A no corpo das regras. Os valores-verdade
destes literais seriam dados pelas matrizes da Figura 6.1.
Neste caso, o poder de expressão dos programas P-Datalog¬ seria incrementado com a
possibilidade de discernir entre fatos controversos, seguros ou simplesmente fatos presentes
no banco de dados como controversos ou seguros, como é mostrado no exemplo a seguir:
A
t
i
u
f
•A
f
t
u
f
◦A
t
f
u
f
Figura 6.1: Matriz dos valores-verdade associados aos literais •A e ◦A
106
CAPÍTULO 6. CONCLUSÃO E TRABALHOS FUTUROS
107
Exemplo 6.0.3 Suponha que no exemplo de motivação 1.0.1 da introdução, fosse adicionada às condições necessárias para que um candidato consiga o emprego, a condição
de que seja certo e seguro que o candidato tenha sido indicado por uma pessoa influente.
Não basta a evidência de que ele tenha sido indicado, esta condição deve ser seguramente
positiva. Neste caso, o predicado indicadoPor deveria ser precedido por “◦” na regra do
programa, como é mostrado a seguir:
cargo(x) ← ∼devedor(x), ◦indicadoPor(x,y), ∼cargo(y)
Entretanto, a tentativa de adaptar a semântica bem-fundada para programas que
incluı́ssem os literais ◦A e •A no corpo das regras não foi bem sucedida. Programas
P-Datalog¬ com estes novos literais não se enquadram em nenhum dos programas lógicos
classificados na seção 3.1. Desta forma, é possı́vel que a definição da semântica de programas P-Datalog¬ incrementados com estes novos literais, não seja simplesmente uma
extensão de uma das semânticas existentes, e esta definição é um trabalho a ser desenvolvido futuramente.
Referências Bibliográficas
[ABC99]
M. Arenas, L. Bertossi, and J. Chomicki. Consistent query answers in inconsistent databases. In Proceedings of ACM Symposium on Principles of Database
Systems-ACM PODS’99, Philadelphia, pages 68–79, 1999.
[ABC03]
M. Arenas, L. Bertossi, and J. Chomicki. Answer sets for consistent query answers in inconsistent databases. In Theory and Practice of Logic Programming,
volume 3 (4+5), pages 393–424, July 2003.
[ABK00]
M. Arenas, L. Bertossi, and M. Kifer. Applications of Annotated Predicate
Calculus to Querying Inconsistent Databases. In Computational Logic — CL
2000, First International Conference, London, UK, July 2000. Proceedings,
pages 926–941. Springer Verlag, 2000.
[APP96]
J. J. Alferes, L. M. Pereira, and T. C. Przymusinski. Strong and explicit
negation in non-monotonic reasoning and logic programming. In Logics in
Artificial Intelligence, European Workshop, JELIA, Évora, Portugal, September 30 - October 3, Proceedings, volume 1126 of Lecture Notes in Computer
Science, pages 143–163. Springer, 1996.
[Ari02]
O. Arieli. Paraconsistent declarative semantics for extended logic programs.
Annals of Mathematics and Artificial Intelligence, 36(4):381–417, 2002.
[AVH95]
S. Abiteboul, V. Vianu, and R. Hull. Foundations of databases. AddisonWesley, 1995.
[Bel77]
N. D. Belnap. A useful four-valued logic. In G. Epstein and J.M. Dunn,
editors, Modern Uses of Many-valued Logic. Reidel, 1977.
[BS87]
H. A. Blair and V. S. Subrahmanian. Paraconsistent logic programming. In
Proceedings of the seventh conference on Foundations of software technology
and theoretical computer science, pages 340–360. Springer-Verlag, 1987.
[Car87]
W. A. Carnielli. Systematization of the finite many-valued through the method
of tableaux. The Journal of Symbolic Logic, 52, pages 473–493, 1987.
108
REFERÊNCIAS BIBLIOGRÁFICAS
[CG01]
109
L. Cholvy and C. Garion. A logic to reason on contradictory beliefs with a
majority approach. Workshop IJCAI ”Inconsistency in Data and Knowledge”,
Seattle, August 2001.
[CGM90] U. S. Chakravarthy, J. Grant, and J. Minker. Logic-based approach to semantic query optimization. ACM Trans. Database Syst., 15(2):162–207, 1990.
[CGT90]
S. Ceri, G. Gottlob, and L. Tanca. Logic programming and databases (surveys
in computer science). Springer-Verlag, 1990.
[Che80]
B. F. Chellas. Modal logic, an introduction. Cambridge University Press,
1980.
[Cho98]
L. Cholvy. A general framework for reasoning about contradictory information and some of its applications. ECAI Workshop ”Conflicts among
agents”Brighton, August 1998.
[CM01]
W. A. Carnielli and J. Marcos. Tableau systems for logics of formal inconsistency. In Proceedings of the 2001 International Conference on Artificial
Intelligence - IC-AI, pages 848–852, 2001.
[CS89]
N. C. A. Costa and V. S. Subrahmanian. Paraconsistent logics as a formalism
for reasoning about inconsistent knowledge bases. Artificial Intelligence in
Medicine 1, pages 167–174, 1989.
[dACM00] S. de Amo, W. A. Carnielli, and J. Marcos. Formal inconsistency and evolutionary databases. Logic and Logical Philosophy, 8:115–152, 2000.
[dACM02] S. de Amo, W. A. Carnielli, and J. Marcos. A logical framework for integration
inconsistent information in multiple databases. 2nd Symposium on Foundations of Information and Knowledge Systems, FOIKS 2002, Salzau Castle,
Germany, February 2002, 2284:67–84, 2002.
[Dix96]
J. Dix. Semantics of Logic Programs: Their Intuitions and Formal Properties.
An Overview. In Andre Fuhrmann and Hans Rott, editors, Logic, Action and
Information. Proceedings of the Konstanz Colloquium in Logic and Information (LogIn ’92), pages 241–327. DeGruyter, 1996.
[DP98]
C. V. Damásio and L. M. Pereira. A survey on paraconsistent semantics for
extended logic programas. Handbook of Defeasible Reasoning and Uncertainty
Management Systems, 2:241–320, 1998.
[Fit96]
M. Fitting. First-Order Logic and Automated Theorem Proving. Graduate
Texts in Computer Science - Springer Verlag, second edition, 1996.
REFERÊNCIAS BIBLIOGRÁFICAS
110
[GH91]
D. Gabbay and A. Hunter. Making inconsistency respectable: A logical framework for inconsistency in reasoning. In P. Jorrand and J. Kelemen, editors, Proceedings of Fundamentals of Artifical Intelligence Research (FAIR’91),
pages 19–32. Springer-Verlag, 1991.
[GL88]
M. Gelfond and V. Lifschitz. The stable model semantics for logic programming. In Proceedings of the Fifth International Conference on Logic Programming, pages 1070–1080, 1988.
[KPP98]
S. Konieczny and R. Pino-Perez. On the logic of merging. Proceedings of the
Sixth International Conference of the Principles of Knowledge Representation
and Reasoning (KR’98), Trento, Italy., June 2-5 1998.
[Ler02]
X. Leroy. The objective caml system - release 3.06. Documentation and user´s
manual, August 2002.
[Lif97]
S. Lifschitz. Teoria e aplicações de bancos de dados dedutivos. In XVII Congresso da Sociedade Brasileira de Computação/XVI Jornada de Atualização
em Informática, pages 177–219, 1997.
[Llo93]
J. W. Lloyd. Foundations of logic programming. Springer-Verlag, 1993.
[NS97]
A. Nerode and R. A. Shore. Logic for Applications. Graduate Texts in Computer Science - Springer Verlag, second edition, 1997.
[PA92]
L. M. Pereira and J. J. Alferes. Well founded semantics for logic programs
with explicit negation. In European Conference on Artificial Intelligence, pages
102–106, 1992.
[Prz89]
T. C. Przymusinski. Every logic program has a natural stratification and an
iterated least fixed point model. In Proceedings of the eighth ACM Symposium
on Principles of Database Systems-ACM PODS’89, pages 11–21. ACM Press,
1989.
[Prz90]
T. C. Przymusinski. Well-founded semantics coincides with three-valued stable
semantics. Fundamentae Informaticae, XIII, pages 445–463, 1990.
[Prz92]
T. C. Przymusinski. Two simple characterizations of well-founded semantics.
In Mathematical Foundations of Computer Science, pages 451–462, 1992.
[RU95]
R. Ramakrishnan and J.D. Ullman. A survey of deductive database systems.
In J. Logic Programming, pages 125–149, 1995.
REFERÊNCIAS BIBLIOGRÁFICAS
111
[Sak92]
C. Sakama. Extended well-founded semantics for paraconsistent logic programs. In Proceedings of the International Conference on Fifth Generation
Computer Systems, pages 592–599. ACM, 1992.
[Sou02]
J. N. Souza. Lógica para ciência da computação: fundamentos da linguagem,
semântica e sistemas de dedução. Ed. Campus, 2002.
[Sub94]
V. S. Subrahmanian. Amalgamating knowledge bases. ACM Transactions on
Database Systems, 1994.
[Van89]
A. Van Gelder. The alternating fixpoint of logic programs with negation. In
Proceedings of the eighth ACM Symposium on Principles of Database SystemsACM PODS’89, pages 1–10, 1989.
[VRS91]
A. Van Gelder, K. Ross, and J. S. Schlipf. The well-founded semantics for
general logic programs. Journal of the ACM, 38(3):620–650, 1991.
[WH89]
P. H. Winston and B. K. P. Horn. Lisp. Addison-Wesley, 1989.
Apêndice A
Listagem da implementação do
provador P-Datalog¬
112
Apêndice A. Listagem da implementação do provador P-Datalog
A. 1
(* Definição de Constantes correspondentes aos símbolos*)
let f = 0;;
(*false = ~ *)
let u = 1;;
(*unknown*)
let i = 2;;
(*inconsistent = * *)
let t = 3;;
(*true*)
let anonymousVariable = "_";;
(* E N T R A D A
D E
D A D O S *)
(*======================================================================
função: valorVerdade
Retorna um caracter que representa o valor verdade correspondente ao
símbolo dado de entrada.
======================================================================*)
let valorVerdade e =
match (e) with
|("*") -> i;
|("~") -> f;
|(_)
-> t;
;;
(*======================================================================
função: trimEmptyString
Retira da lista de strings os strings vazios "".
======================================================================*)
let rec trimEmptyString l =
match l with
[] -> []
|x::xs -> if x = "" then
trimEmptyString xs
else
x::trimEmptyString xs
;;
(*======================================================================
funcao explode
Recebe uma string e retorna uma tupla com uma lista de strings onde
cada elemento da lista corresponde a uma palavra da string recebida,
ou seja, divide a string pelo caracter de espaco " ", e o valor verdade
correspondente.
Ex.: explode "o cargo X Y";;
-> (["cargo";"X";"Y"],t)
======================================================================*)
let explode string =
try
let pos = (Str.search_forward (Str.regexp "[^~^*^o]") string 0 )
in
if pos>0 then
let symbol = String.sub string 0 pos
in
(trimEmptyString (Str.split (Str.regexp "[,.()]")(String.sub
string (pos+1)((String.length string)-(pos+1)))), (valorVerdade symbol))
else
(trimEmptyString (Str.split (Str.regexp "[,.()]") string),t)
with
Not_found -> (trimEmptyString (Str.split (Str.regexp "[,.()]")
string),t);
;;
(*======================================================================
Apêndice A. Listagem da implementação do provador P-Datalog
A. 2
funcao trim
Retira os caracteres de espaço (" ") do inicio da string.
======================================================================*)
let trim string =
try
let pos = Str.search_forward (Str.regexp "[^ ]") string 0
in
String.sub string pos ((String.length string)-pos)
with
Not_found -> string;
;;
(*======================================================================
função: splitBody
Recebe um string contendo o corpo da regra e devolve uma lista de
tuplas correspondente.
Ex: splitBody "~ cargo(X,Y);o padrinho(X,Y)."
-> [(["cargo";"X";"Y"],f);(["padrinho";"X";"Y"],t)];
======================================================================*)
let rec splitBody body =
match body with
[] -> []
|x::xs -> (explode (trim x))::(splitBody xs)
;;
(*======================================================================
função explodeRegra
Recebe um string contendo uma regra P-datalog.
Retorna uma lista de tuplas (lista de strings,valor), once cada lista
de strings representa um literal.
A última tupla da lista é a cabeça da regra.
Ex: explodeRegra "cargo(X,Y):-~ deve(X,Y); padrinho(X,Y)."
->
[(["deve";"X";"Y"],f);(["padrinho";"X";"Y"],t);(["cargo";"X";"Y"],t)]
======================================================================*)
let explodeRegra string =
try
let pos = Str.search_forward (Str.regexp "[:]") string 0 in
let head = String.sub string 0 pos in
let body = Str.split (Str.regexp "[;.]") (String.sub string (pos+2)
((String.length string) - (pos+2))) in
(splitBody body)@[(explode (trim head))];
with
Not_found -> [(explode (trim string))];
;;
(*======================================================================
funcao armazenaFato
Entrada:
fato
- string representando uma asserção
baseFatos - lista de asserções (lista de tuplas (lista de strings,
valor), onde cada lista de strings representa um fato
e o valor representa o valor verdade associado a ele)
Efeito:
acrescenta a asserção "fato" na lista de asserções "baseFatos".
A string "fato" é primeiramente transformada em uma tupla (lista de
strings, valor).
Ex.: armazenaFato "o deve(a)" [(["deve";"b"],t)];;
Apêndice A. Listagem da implementação do provador P-Datalog
A. 3
-> [(["deve";"b"],t);(["deve";"b"],t)]
======================================================================*)
let armazenaFato fato baseFatos =
List.append (baseFatos) ((explode fato)::[])
;;
(*======================================================================
funcao armazenaRegra
Entrada:
regra
- lista de tuplas (lista de strings, valor), o ultimo
elemento da lista é uma lista que representa o
consequente da regra e os elementos intermediários são
tuplas que representam os antecedentes da regra.
baseRegras - lista de regras (lista de listas, onde
cada uma dessas representa uma regra)
Efeito: acrescenta a regra "regra" na lista de regras "baseRegras".
======================================================================*)
let armazenaRegra regra baseRegras =
List.append (baseRegras) (regra::[])
;;
(*======================================================================
funcao constroiListaFatos
Entrada:
canalEntrada - canal de entrada representando um "ponteiro" para o
arquivo de fatos que foi aberto pela função
carregaFatos.
Efeito: A função varre o arquivo linha por linha e monta uma lista
de listas, onde cada uma destas representa um fato.
======================================================================*)
let rec constroiListaFatos canalEntrada =
try
let
fato = input_line canalEntrada
in
List.append (armazenaFato (trim fato) []) (constroiListaFatos
canalEntrada)
with
End_of_file -> []
;;
(*======================================================================
funcao carregaFatos
Entrada:
arquivo - nome do arquivo contendo a base de fatos. O arquivo
deve possuir um fato em cada linha, em texto simples.
Efeito: A função carrega todos os fatos presentes no arquivo e retorna
uma lista de fatos. Cada fato é representado por uma lista de strings.
A função constroiListaFatos é utilizada para tal.
Ex.: Se o arquivo "baseFatos.txt" contem as seguintes linhas:
~ deve(a).
~ deve(b).
então a função retorna a lista:
-> [(["deve";"a"],f);(["deve";"b"],f)]
======================================================================*)
Apêndice A. Listagem da implementação do provador P-Datalog
A. 4
let carregaFatos arquivo =
let canalEntrada = open_in arquivo
in
constroiListaFatos canalEntrada
;;
(*======================================================================
funcao constroiListaRegras
Entrada:
canalEntrada - canal de entrada representando um "ponteiro" para o
arquivo de regras que foi aberto pela função
carregaRegras.
Efeito: Esta função é utilizada pela função "carregaRegras"
e é responsável por carregar do arquivo todas as regras presentes
no mesmo e montar uma lista dessas regras.
======================================================================*)
let rec constroiListaRegras canalEntrada =
try
let
regra = input_line canalEntrada
(* le a linha referente a
regra *)
in
print_string "Regra = "; print_string regra; print_newline();
(explodeRegra regra)::(constroiListaRegras canalEntrada)
with
End_of_file -> []
;;
(*======================================================================
funcao carregaRegras
Entrada:
arquivo - nome do arquivo contendo a base de regras.
Efeito: A função carrega todos as regras presentes no arquivo e retorna
uma lista de regras.
OBS: as regras são armazenadas no arquivo da sequinte forma:
======================================================================*)
let carregaRegras arquivo =
let canalEntrada = open_in arquivo
in
constroiListaRegras canalEntrada;
;;
(*======================================================================
Função equal
Parâmetros: i, j
Retorna true se i=j e false caso contrário.
È utilizada na função inter
======================================================================*)
let equal i j = (i=j)
;;
(*======================================================================
Função compare
Parâmetros: a b
Retorna o se a=b, 1 se a>b e -1 se a<b
È utilizada em List.sort
======================================================================*)
let compare a b =
if (a=b) then 0
else if (a>b) then 1
Apêndice A. Listagem da implementação do provador P-Datalog
A. 5
else -1
;;
(*======================================================================
Função inter
Parâmetros: l1, l2 -> duas listas
Retorna uma lista com a instersecção entre as duas listas de entrada
======================================================================*)
let rec inter l1 l2 =
match l1 with [] -> []
| x::xs ->
if (x=List.hd l2) then
[x]@inter xs (List.tl l2)
else match x with
(l,v) -> [(l, u)]@inter xs (List.tl l2);;
(*======================================================================
Função min
Parametros: v1, v2
Retorna no menor valor dado de entrada.
======================================================================*)
let min v1 v2 =
if (v1 < v2) then v1
else v2;;
(*======================================================================
FUNÇÃO: print_list
Imprime elementos de uma lista de strings
PARÂMETROS:
l: Lista de strings
======================================================================*)
let rec print_list l =
match l with
[] -> ();
| x::xs -> print_string x;
if xs <> [] then
begin
print_string ",";
print_list xs;
end
;;
(*======================================================================
Função print_truth_value
Concatena valor verdade v para caracter correspondente:
0=~, 1=U, 2=*, 3=o
Parametros: v
======================================================================*)
let print_truth_value v =
match (v) with
(0) -> print_string "~ ";
|(1) -> print_string "? ";
|(2) -> print_string "* ";
|(3) -> print_string "o ";
|(_) -> print_string "error"
;;
(*======================================================================
Função print_one_tupla
Parametros: b
Imprime uma tupla b. Usada em print_list_tupla
Apêndice A. Listagem da implementação do provador P-Datalog
A. 6
Por exemplo, se b=(["moves";"a";"b"],2) imprime "* moves a b"
======================================================================*)
let print_one_tupla b =
match b with
(l,v) -> print_truth_value v;
match l with
[] -> ()
|x::xs -> print_string x;
if xs<>[] then
begin
print_string "(";
print_list xs;
print_string ")";
end;
;;
(*======================================================================
Função print_list_tupla
Parametros: l
Imprime uma lista de tuplas (lista de strings, int).
Por exemplo, se l=[(["moves";"a";"b"],2);(["moves";"b";"c"],3)],
imprime "*moves a b, omoves b c"
======================================================================*)
let rec print_list_tupla l =
match l with
[] -> ();
|x::xs ->
print_one_tupla x;
if xs <> [] then
begin
print_string ", ";
print_newline();
print_list_tupla xs;
end
;;
(*======================================================================
FUNÇÃO: print_one_binding
Imprime elementos de uma lista de associações
PARÂMETROS:
b: Lista de associações
======================================================================*)
let rec print_one_binding b =
match b with
[] -> print_string "]";
|(a,b)::xs ->
print_string "(";print_string a;print_string ",";print_string
b;print_string ")";
print_one_binding xs;
;;
(*======================================================================
FUNÇÃO: print_bindings
Imprime elementos de uma lista de associações
PARÂMETROS:
b: Lista de lista de associações
======================================================================*)
let rec print_bindings b =
match b with
[] -> print_newline ();
Apêndice A. Listagem da implementação do provador P-Datalog
A. 7
|x::xs ->
print_string "[";
print_one_binding x;
print_string " ; ";
print_bindings xs;
;;
(*======================================================================
FUNÇÃO: limpalista
percorre lista l e retira elementos iguais a e
PARÂMETROS:
l: Lista de lista de strings
e: elemento da lista a ser retirado
======================================================================*)
let rec limpalista l e=
match l with
[] -> []
| x::xs -> if (x=e) then
limpalista xs e
else [x]@(limpalista xs e)
;;
(*======================================================================
FUNÇÃO: atom
Retorna true se p é uma lista que contém somente um string, senao
retorna false
PARÂMETROS:
p: Lista de strings
======================================================================*)
let atom p =
match p with []-> false
| x::xs -> (xs = [])
;;
(*======================================================================
FUNÇÃO: variable
Retorna true se p é uma lista que contém somente um string que
possui o 1º caracter está em maiúscula senao retorna false
PARÂMETROS:
p: Lista de strings
======================================================================*)
let variable p =
match p with
[] -> false
|x::xs -> ((((Char.code x.[0])>=(Char.code 'A'))&&((Char.code
x.[0])<=(Char.code 'Z')))
or (x=anonymousVariable)) && (xs = [])
;;
(*======================================================================
FUNÇÃO: listp
Retorna true se p é uma lista, senao retorna false
PARÂMETROS:
p: Lista de strings
======================================================================*)
let listp p =
match p with
[] -> false
|x::xs -> (xs <> [])
;;
Apêndice A. Listagem da implementação do provador P-Datalog
A. 8
(*======================================================================
FUNÇÃO: rule_ifs
Retorna lista tuplas contendo os antecedentes da regra.
Por exemplo:
[(["deve";X"],f);(["padrinho";"X";"Y"],t);(["cargo";"Y"],f)]
PARÂMETROS:
rule: tupla contendo a regra = (id_regra, lista_com_corpo_da_regra)
======================================================================*)
let rec rule_ifs rule =
match rule with [] -> []
| x::xs -> if (xs=[]) then []
else [x]@(rule_ifs xs)
;;
(*======================================================================
FUNÇÃO: rule_then
Retorna lista com a tupla que representa consequente da regra, a
ultima tupla da lista que representa a regra.
PARÂMETROS:
rule: tupla contendo a regra = (id_regra,
lista_com_corpo_da_regra)
======================================================================*)
let rec rule_then rule =
match rule with [] -> ([],0)
| x::xs -> if (xs=[]) then x
else (rule_then xs)
;;
(*======================================================================
FUNÇÃO: mymatch
Faz o casamento de padrao entre p e d, a partir de uma lista de
associações bindings, e retorna a lista de associações resultante
deste casamento de padrão. Se p é uma variável substuir p pelo
valor associado pela lista de bindings e tentar fazer o casamento
novamente. Note que "_" representa uma "anonymous variable".
PARÂMETROS:
p:
lista de strings que inicialmente representa um
antecedente da regra
bindings:
lista de associações
d:
lista de strings que inicialmente representa um
fato do mundo
======================================================================*)
let rec mymatch p bindings d=
if (variable p) then
let name_var = List.hd p in
if (List.mem_assoc name_var bindings) then
if (name_var = anonymousVariable) then (*new*)
bindings
else (*substitui o nome da variável pelo valor associado e
chama mymatch novamente *)
mymatch [(List.assoc name_var bindings)] bindings d
else
if (name_var = anonymousVariable) then
(*new*)
List.append [(name_var,anonymousVariable)] bindings
else
(* a variável não possui valor associado, então um
novo par é inserido*)
List.append (List.combine [name_var] d) bindings
Apêndice A. Listagem da implementação do provador P-Datalog
A. 9
else if (atom p) && (atom d) then
(* match_atoms *)
if (List.hd p) = (List.hd d) then
bindings
else
[("FAIL","FAIL")]
else if (listp p) && (listp d) then
(*match_pieces p d bindings*)
let result = mymatch [List.hd p] bindings
[List.hd d] in
if (result = [("FAIL","FAIL")]) then
[("FAIL","FAIL")]
else mymatch (List.tl p) result (List.tl d)
else [("FAIL","FAIL")];;
(*======================================================================
FUNÇÃO: try_assertion
Faz o casamento de padrão (MYMATCH) de pattern com assertion, a
partir de uma lista de associações, e retorna um lista de lista de
associações resultante:
[("EMPTY","EMPTY")]-> representa sucesso no match, porem não gerou
associações
[] -> representa falha no match
caso contrario -> representa sucesso no match e gera associações.
PARÂMETROS:
assertion
lista com um fato do mundo
pattern
lista com um antecedente de uma regra
bindings:
lista de associações
======================================================================*)
let try_assertion pattern bindings assertion =
let result = mymatch (fst pattern) bindings (fst assertion) in
if result = [] then
(* mymatch não falhou, apenas retornou e não gerou associação *)
List.append [("EMPTY","EMPTY")] bindings
else if (List.mem_assoc "FAIL" result) then
if (snd pattern)=f then
if bindings=[] then
[("EMPTY","EMPTY")]
else
bindings
else
(* mymatch falhou, então retorna lista vazia*)
[]
else
(* mymatch sucedeu e retornou uma lista de associações *)
result;;
(*======================================================================
FUNÇÃO: limpalistavazia
percorre lista l e retira elementos []
PARÂMETROS:
l: Lista de lista de strings
======================================================================*)
let rec limpalistavazia l =
match l with
[] -> []
| x::xs -> if (x=[]) then limpalistavazia xs
else [x]@(limpalistavazia xs);;
Apêndice A. Listagem da implementação do provador P-Datalog
A. 10
(*======================================================================
FUNÇÃO: match_pattern_to_assertion
Aplica TRY_ASSERTIONS a todos fatos da lista de fatos, e retorna um
lista de lista de associações
PARÂMETROS:
assertions lista com todos fatos do mundo
pattern
lista com um antecedente de uma regra
bindings:
lista de associações
======================================================================*)
let rec match_pattern_to_assertion assertions pattern resultbinding
bindings=
match assertions with
[] -> resultbinding
| x::xs -> let bind = try_assertion pattern bindings x
in
if (bind=[]) or (List.mem bind resultbinding) then
match_pattern_to_assertion xs pattern resultbinding
bindings
else
match_pattern_to_assertion xs pattern
(bind::resultbinding) bindings
;;
(*======================================================================
FUNÇÃO: filter_binding
Aplica MATCH_PATTERN_TO_ASSERTION a cada ambiente da lista de
associações, e retorna a lista de lista de associacoes.
PARÂMETROS:
assertions
lista com todos fatos do mundo
pattern
lista com um antecedente de uma regra
bindingslista
lista de lista de associações
======================================================================*)
let rec filter_binding assertions pattern bindingslist =
List.flatten(List.map (match_pattern_to_assertion assertions pattern
[]) bindingslist);;
(*======================================================================
FUNÇÃO: apply_filters
Aplica FILTER_BINDING a cada antecedente de uma regra,
e retorna a lista de lista de associações.
PARÂMETROS:
assertions
lista com todos fatos do mundo
patterns
lista com todos os antecedente de uma regra
bindingslista
lista de lista de associações
======================================================================*)
let rec apply_filters assertions patterns bindingslist =
match patterns with
[]-> bindingslist
| x::xs ->
let resultbindings = (filter_binding assertions x
bindingslist) in
apply_filters assertions xs resultbindings;;
(*======================================================================
FUNÇÃO: instantiate_variable
Verifica o consequente da regra para cada ambiente de associação da
lista, e retorna a lista contendo o fato deduzido.
PARÂMETROS:
pattern
lista com o consequente da regra
Apêndice A. Listagem da implementação do provador P-Datalog
A. 11
alista
lista de lista de associações
======================================================================*)
let rec instantiate_variable pattern alist =
if (variable pattern) then
let name_p = (List.hd pattern) in
if (List.mem_assoc name_p alist) then
[List.assoc name_p alist]
else
[] (*não tem valor associado em bindings *)
else if (atom pattern) then
pattern
else
(instantiate_variable [List.hd pattern] alist)
@(instantiate_variable (List.tl pattern) alist)
;;
(*======================================================================
FUNÇÃO: instantiate_body
Calcula o valor-verdade associado ao corpo da regra para uma dada
lista de associações
PARÂMETROS:
rule_ifs_list
bindinglist
assertions
lista com os literais do corpo da regra
lista de associações
lista com fatos do mundo que estão sendo
deduzido
oldassertions
lista com fatos do mundo a partir dos
quais é gerado a versão
instanciada positivada da regra.
value
valor-verdade do corpo da regra
======================================================================*)
let rec instantiate_body rule_ifs_list bindinglist assertions
oldassertions value =
match rule_ifs_list with
[] -> value
|x::xs ->
if ((fst x)=[anonymousVariable]) then
(* O valor verdade do corpo da regra eh o valor associado a
variavel anonima *)
(snd x)
else
let result = (instantiate_variable (fst x) bindinglist) in
if ((snd x) = f) then (* literal negativo *)
if (List.mem_assoc result oldassertions) then
let oldvalue = (List.assoc result oldassertions) in
if (oldvalue = f) then
instantiate_body xs bindinglist assertions
oldassertions (min value t)
else if (oldvalue = u) then
instantiate_body xs bindinglist assertions
oldassertions (min value oldvalue)
else f
else
(* este caso não deveria acontecer, uma vez que todos os
fatos sao explicitamente negados *)
instantiate_body xs bindinglist assertions oldassertions
(min value t)
else (* literal positivo *)
Apêndice A. Listagem da implementação do provador P-Datalog
A. 12
if (List.mem_assoc result assertions) then
let value_literal = (List.assoc result assertions) in
if (snd(x) = t) then
instantiate_body xs bindinglist assertions
oldassertions (min value_literal value)
else f
else f
;;
(*======================================================================
FUNÇÃO: assertion_remember
Inclui um novo fato se e somente se ele ainda não está presente na
lista original.
Retorna lista de fatos.
PARÂMETROS:
assertions
lista de fatos
newassertion
fato a ser inserido
======================================================================*)
let assertion_remember assertions newassertion =
if (List.mem_assoc (fst newassertion) assertions) then
(* novo fato já se encontra na lista *)
begin
let oldvalue = (List.assoc (fst newassertion) assertions)
in
if (oldvalue < (snd newassertion)) then
(* o valor do novo fato é maior que o do já existente*)
(* remover fato anterior e inserir o novo*)
List.sort compare ((List.remove_assoc (fst newassertion)
assertions)@[newassertion])
else
assertions
end
else
List.sort compare (assertions @ [newassertion]);;
(*======================================================================
Função: instantiate_consequents
Rotina auxiliar recursiva: testa consequentes com cada lista de
bindings. Quando é possivel instanciar o consequente, é necessario
então, calcular o valor-verdade resultante do corpo da implicação,
e atribuí-lo a tupla que representa o novo fato deduzido.
Parâmetros:
rule
tupla contendo uma regra
assertions
lista de tuplas que representam os fatos gerados
oldassertions
lista de tuplas que representam os fatos baseado
nos quais os literais negativos serao positivados
bindings
lista contendo ambientes de ligação
======================================================================*)
let rec instantiate_consequents rule assertions oldassertions bindinglist
=
match bindinglist with [] -> assertions
| x::xs ->
let result = instantiate_variable (fst (rule_then rule)) x in
if (result = []) then
assertions
else
let value = (instantiate_body (rule_ifs rule) x
Apêndice A. Listagem da implementação do provador P-Datalog
A. 13
assertions oldassertions t) in
let newassertions = (assertion_remember assertions
(result,value)) in
(* verifica o consequente da regra com outra lista de
associações *)
instantiate_consequents rule newassertions oldassertions
xs
;;
(*======================================================================
FUNÇÃO: use_rule
Aplica uma regra a uma lista de fatos do mundo.
Retorna a lista de fatos do mundo contendo os novos fatos
concluídos.
PARÂMETROS:
rule
lista contendo a regra
assertions
lista de fatos do mundo
oldassertions
======================================================================*)
let use_rule assertions oldassertions rule=
let blist = (apply_filters assertions (rule_ifs rule) [[]]) in
if (blist = []) then
assertions
else
instantiate_consequents rule assertions oldassertions blist;
;;
(*======================================================================
Função auxiliar: use_rulelist
Executa todas as regras da lista e retorna nova lista de fatos do
mundo.
Parâmetros:
assertions
lista de fatos do mundo
list
lista de regras
oldassertions
velha lista dos fatos do mundo
======================================================================*)
let rec use_rulelist assertions oldassertions list =
match list with [] -> assertions
| x::xs -> let newassertions = (use_rule assertions
oldassertions x) in
use_rulelist newassertions oldassertions xs;;
(*======================================================================
FUNÇÃO: conseqp
(Foward_chain)
Percorre a lista de regras e lista de fatos verificando se novos
fatos são deduzidos. Caso novos fatos sejam inseridos na lista de
fatos do mundo, executa novamente a lista de regras com estes
novos fatos até que nenhum novo fato seja concluído.
PARÂMETROS:
rulelist
lista de regras
assertions lista de fatos do mundo
======================================================================*)
let rec conseqp assertions oldassertions rulelist blist =
let newassertions = (use_rulelist assertions oldassertions
rulelist) in
if (newassertions = assertions) then
newassertions
else
conseqp newassertions oldassertions rulelist blist ;
Apêndice A. Listagem da implementação do provador P-Datalog
A. 14
;;
(*======================================================================
FUNÇÃO: i_star_star
Resulta a semântica de um dado programa (conjunto de regras)
P-datalog, que equivale a instancia I**.
PARÂMETROS:
rules
conjunto de regras do programa P-datalog
i
array de instâncias
n
instância anterior
blist
lista de bindings
======================================================================*)
let rec i_star_star rules i n blist assertions=
let ind =(n+1) mod 4 in
i.(ind)<-conseqp assertions i.(n mod 4) rules blist;
print_string "I"; print_int (n+1); print_string " = ";
print_list_tupla i.(ind); print_newline();
if ((i.(0)=i.(2))&&(i.(1)=i.(3))) then
inter i.(2) i.(3)
else if (i.(ind)=i.(n mod 4)) then
i.(ind)
else
i_star_star rules i (n+1) blist assertions
;;
(*======================================================================
FUNÇÃO: bindPair
Monta uma tupla (var,const) e a insere na lista binding.
PARÂMETROS:
binding var const
*======================================================================*)
let bindPair binding var const =
(var,const)::binding
;;
(*======================================================================
FUNÇÃO: bindVarToConst
Monta uma tupla com a variável var e cada uma das constantes da
lista const, e insere a tupla na lista binding.
PARÂMETROS:
consts var binding
*======================================================================*)
let bindVarToConst consts var binding =
List.map (bindPair binding var) consts
;;
(*======================================================================
FUNÇÃO: filterBind
Para cada lista de associações da lista bindlist, adiciona uma
nova tupla com a variável var e cada uma das constantes da lista
const.
PARÂMETROS: consts var bindlist
*======================================================================*)
let filterBind consts var bindlist =
List.flatten(List.map (bindVarToConst consts var) bindlist)
;;
(*======================================================================
FUNÇÃO: applyVar
PARÂMETROS: consts vars bindlist
*======================================================================*)
let rec applyVar consts vars bindlist =
match vars with
Apêndice A. Listagem da implementação do provador P-Datalog
A. 15
[] -> bindlist
|x::xs ->
let bindResult = filterBind consts x bindlist
in
applyVar consts xs bindResult
;;
(*======================================================================
FUNÇÃO: literalScanConstVar
Escaneia um literal de uma regra e retorna listas de constantes e
variáveis
PARÂMETROS:
l dom
*======================================================================*)
let rec literalScanConstVar l dom =
match l with
[] -> dom
| x::xs ->
if (variable [x]) then
if not (List.mem x (snd dom)) then
literalScanConstVar xs ((fst dom), x::(snd dom))
else
literalScanConstVar xs dom
else if not (List.mem x (fst dom)) then
literalScanConstVar xs (x::(fst dom), (snd dom))
else
literalScanConstVar xs dom
;;
(*======================================================================
FUNÇÃO: ruleScanConstVar
Escaneia uma regra r e retorna um par com listas de constantes e
variáveis
PARÂMETROS: r dom
*======================================================================*)
let rec ruleScanConstVar r dom=
match r with
[]-> dom
|((head::tail),_)::xs -> let domResult = literalScanConstVar tail dom
in
ruleScanConstVar xs domResult
|_ -> dom
;;
(*======================================================================
FUNÇÃO: programScanConstVar
Escaneia as regras do program p e retorna duas listas: uma de
constantes e outra de variáveis
PARÂMETROS:
p
lista contendo as regras do programa
dom ([constantes],[variáveis]) par contendo uma lista de
constantes e lista de variáveis encontradas no programa
EXEMPLO:
dom = (["kevin"; "john"; "james"; "paul"; "joseph"; "charles"],
["Y"; "X"]);
*======================================================================*)
let rec programScanConstVar p dom =
match p with
[] -> dom
|x::xs ->
let domResult = ruleScanConstVar x dom
in
Apêndice A. Listagem da implementação do provador P-Datalog
A. 16
programScanConstVar xs domResult
;;
(*======================================================================
FUNÇÃO: addFactsToProgram facts rules
adiciona facts positivos e inconsistentes como clausulas unitarias
do programa rules.
PARÂMETROS:
facts rules
*======================================================================*)
let rec addFactsToProgram facts rules=
match facts with
[] -> rules
|x::xs -> match (snd x) with
2 -> addFactsToProgram xs
(((["_"],2)::[(fst(x),3)])::rules)
|3 -> addFactsToProgram xs ([x]::rules)
|4 -> addFactsToProgram xs ([x]::rules)
|_ -> addFactsToProgram xs rules
;;
(*======================================================================
FUNÇÃO: instantiateOneRule
Produz uma lista com os átomos instanciados de uma regra.
PARÂMETROS:
assertions rule binding
======================================================================*)
let rec instantiateOneRule assertions rule binding =
match rule with
[] -> assertions
| x::xs ->
let result = instantiate_variable (fst x) binding in
if (result = []) then
instantiateOneRule assertions xs binding
else
let newassertions = (assertion_remember assertions
(result,0)) in
instantiateOneRule newassertions xs binding
;;
(*======================================================================
FUNÇÃO: instantiateRules
Produz uma lista com os átomos instanciados de uma lista de
regras.
PARÂMETROS:
assertions rules binding
======================================================================*)
let rec instantiateRules assertions rules binding =
match rules with
[] -> assertions
|x::xs ->
let newassertions = instantiateOneRule assertions x binding in
instantiateRules newassertions xs binding
;;
(*======================================================================
FUNÇÃO: instantiateProgramPredicates
Produz uma lista com os átomos instanciados de um programa
a partir de cada lista de bindings.
PARÂMETROS:
assertions rules blist
Apêndice A. Listagem da implementação do provador P-Datalog
A. 17
======================================================================*)
let rec instantiateProgramPredicates assertions rules blist =
match blist with
[] -> assertions
|x::xs ->
let newassertions = instantiateRules assertions rules x in
instantiateProgramPredicates newassertions rules xs
;;
(*======================================================================
Corpo principal
======================================================================*)
let mainloop =
print_newline();
print_newline();
print_string " ============= R E S U L T A D O =============== ";
print_newline();
print_newline();
let rules = (carregaRegras "C:/Meus
documentos/Mestrado/ocamlsources/regrasMulti.txt") in
let facts = (carregaFatos "C:/Meus
documentos/Mestrado/ocamlsources/fatosMulti.txt") in
let ruleslist = addFactsToProgram facts rules in
let (consts,vars) = programScanConstVar ruleslist ([],[]) in
let blist = applyVar consts vars [[]] in
(* Gera \neg B(P) *)
let initialAssertions = instantiateProgramPredicates [] rules blist
in
let i=Array.create 4 [] in
let l = i_star_star ruleslist i 0 blist initialAssertions in
print_newline();
print_string "I** = ";
print_newline();
print_list_tupla l;
print_newline();
print_newline();
print_newline();
print_string "DONE \n";
;;
let main() = mainloop;;

Documentos relacionados