INTEGRAÇÃO DO PROLOG COM OUTRAS LINGUAGENS

Embed Size (px)

Citation preview

UNIVERSIDADE DE CABO VERDE DEPARTAMENTO DE ENGENHARIAS E CINCIAS DO MAR LICENCIATURA EM ENGENHARIA INFORMTICA E DE COMPUTADORES

Elaborado por: Arilson Jorge Santos Rocha

INTEGRAO DO PROLOG COM OUTRAS LINGUAGENS

1

1.

Introduo

Prolog uma linguagem de programao que se enquadra no paradigma de Programao em Lgica Matemtica. uma linguagem de uso geral que especialmente associada com a inteligncia artificial e lingustica computacional. Consiste numa linguagem puramente lgica, que pode ser chamada de Prolog puro, e numa linguagem concreta, a qual acrescenta o Prolog puro com componentes extra lgicos. O Prolog uma linguagem declarativa, significando que em vez de o programa estipular a maneira de chegar soluo, passo a passo, (como nas linguagens procedimentais ou imperativas), limita-se a fornecer uma descrio do problema que se pretende computar. Usa uma coleo base de dados de fatos e de relaes lgicas (regras) que exprimem o domnio relacional do problema a resolver. Um programa pode rodar num modo interativo, a partir de consultas (queries) formuladas pelo usurio, usando a base de dados (os 'fatos') e as regras relacionais

2

(essencialmente implicaes lgicas: se.. ento), e o mecanismo de unificao para produzir (por uma cadeia de dedues lgicas) a soluo.

2.

Integrao entre Prolog e a

linguagem C++

Utilizaremos um exemplo clssico de programao Prolog para ilustrar como os servios back-end Prolog podem ser integrados com C + front-end + cdigo da interface do usurio. O aplicativo de exemplo a genealogia , com Prolog estabelecendo regras para as relaes familiares e C ++ a interface grfica para o aplicativo. A conexo entre os dois encapsulada em uma classe C ++ que fornece servios de aplicativos especficos do Prolog para o restante do aplicativo C ++.

2.1.

O Cdigo Prolog

Para esta aplicao o cdigo do Prolog fornece quatro tipos de servios lgica do aplicativo host. Os dois primeiros so basicamente o mesmo tipo de servio de um banco de dados pode fornecer. Eles so: 1) acessar e manipular os atributos de uma pessoa, e 2) fornecerem a integridade semntica sobre os dados inseridos e actualizados. Vamos ver para esses quatros seces. 2.1.1. Dados Pessoais

Esse cdigo de exemplo de genealogia foi escrito varias vezes para muitos livros iniciais do Prolog. Embora todos eles tm os mesmos tipos de regras para os relacionamentos, essas regras so sempre baseadas em alguma informao fundamental. A escolha do que fundamental e o que derivado varia de programa para programa. Para esta verso do programa, foi decidida que o facto primitivo ser pessoa/5, onde os cincos argumentos so: Nome, Gnero, Me, Pai, Spouse (Cnjuge). Porque esta deciso que pode mudar no futuro, apenas poucas regras primitivas de relacionamento so definidas usando o conhecimento da informao bsica da pessoa.

3

Estas relaes so as seguintes:person(X) :person(X,_,_,_,_). male(X) :person(X,male,_,_,_). female(Y) :person(Y,female,_,_,_). mother(M,C):person(C,_,M,_,_). father(F,C) :person(C,_,_,F,_). parent(P,C) :(mother(P,C) ; father(P,C)). spouse(S,P) :person(P,_,_,_,S), S \= single.

O desenvolvimento de todas as outras regras sobre estes blocos basicos de construo, torna-se mais fcil adicioanar ou modificar a estrutura de dados bsicos. Por exemplo, se quisermos manter a data de nascimento para uma pessoa, essa mudana teria impacto apenas nas definies bsicas.

2.1.2.

Banco de Dados Famlia

O prximo serviofornecido pelo programa Prolog manuteno do conjunto de pessoas em uma familia. Esses insere uma nova pessoa, excluir uma pessoa, carrega o banco de dados pessoal do arquivo, e salv-lo de volta no arquivo. O predicado insere / 5 projectado para voltar com uma actualizao em backtracking, de modo que elepode ser facilmente utilizado pela verificao de integridade semntica do predicado adicionar_pessoa / 5.

add (Name,Gender,Mother,Father,Spouse):assert(person(Name,Gender,Mother,Father,Spouse)). add(Name,_,_,_,_):delete(Name), fail. delete(Name) :retract(person(Name, _, _, _, _)). save(FileName) :tell(FileName),

4

listing(person), told. open(FileName) :consult(FileName).

Como as regras de acesso dados de pessoas individuais, essas regras fornecem acesso ao banco de dados da famlia. Para este exemplo, os dados de pessoas so armazenados no banco de dados Prolog, usando assert e retracts.

2.2.

Relacionamento Pesquisa Regra-Base (Relationship Query

Rule-Base)Vamos comear agora a parte da base de regras de aplicao. Essas regras de pesquisa (query) permitem informaes mais complexas a ser derivada a partir dos dados. Essas so as regras clssicas dos avs, irmos, tios, tias pais, etc. Alguns exemplos dessas regras so mostrados aqui. Note que toda a construo no mesmo conjunto de informaes primitivas de modo que as mudanas na estrutura subjacente dos dados no aplicativo no afectar a relao regra-base.ancestor(A,P):parent(A,P. ancestor(A,P):parent(X,P), ancestor(A,X). full_sibling(S1, S2):mother(M,S2), mother(M,S1), S1 \= S2, father(F,S1), father(F,S2). uncle(U,X) :parent(P,X), brother(U,P). aunt(A,X) :parent(P,X), sister(A,P).

5

A pesquisa regra-base tem um facto adicional que pode ser usado pelo progrma de acolhimento. Ele contm uma lista de todas as relaes definidas.relations([parent, wife, husband, ancestor, .....]).

Pode ser usado em uma de relao genrica que pode descobrir como duas pessoas esto relacionadas, entre outras coisas.relation(R, X,Y):relations(Rs), member(R,Rs), Q =.. [R,X,Y], call(Q).

Integridade semtica regra-base

O servio final do mdulo Prolog fornece a verificao da integridade semntica. Isto significa a verificao de uma actualizao ou alterao para o banco de dados contra o resto do banco de dados para garantir que ele faz sentido. Exemplos incluem a verificao: me de uma pessoa e pai o sexo certo, algum que no seu prprio antecessor, e o cnjuge (spouse) no so parentes de sangue.

Aqui est algumas das regras a partir da poro base de regras, a integridade do cdigo Prolog. Como esse cdigo Prolog projectado para ser para ser passivamente em um aplicativo host, mensagens de erro so simplesmente afirmado que o banco de dados para o programa de acolhimento para recuperar em uma actualizao falhar. (Como alternativa ele poderia ter sido concebido para ter um papel mais activo na aplicao, chamando o programa do host diretamente quando ocorre um erro).

add_person(Name,Gender,Mother,Father,Spouse) :retractall(message(_)), dup_check(Name), add(Name,Gender,Mother,Father,Spouse), ancestor_check(Name),

6

mother_check(Name, Gender, Mother), father_check(Name, Gender, Father), spouse_check(Name, Spouse). ancestor_check(Name) :ancestor(Name,Name), assert(message($Person is their own ancestor/descendent$)), !, fail. ancestor_check(_). spouse_check(Name, Spouse) :spouse(Name, X), X \= Spouse, assert(message($Person is already someone else's spouse$)), !, fail. spouse_check(Name, Spouse) :blood_relative(Name, Spouse), assert(message($Person is a blood relative of spouse$)), !, fail. spouse_check(_,_). blood_relative(X,Y) :- (ancestor(X,Y); ancestor(Y,X)). blood_relative(X,Y) :- sibling(X,Y). blood_relative(X,Y) :- cousin(X,Y). blood_relative(X,Y) :- (uncle(X,Y); uncle(Y,X)). blood_relative(X,Y) :- (aunt(X,Y); aunt(Y,X)).

2.3.

Resumindo o Cdigo Prolog

Como ns podemos ver da anterior discusso, o cdigo Prolog para esta aplicao est em quatro seces distintas. Duas seces se comportam claramente como objetos. Estes so o objeto pessoa individual, e a coleo de pessoas, ou objeto familiar. As regras que manipulam estes objetos esto todos localizados no cdigo. As outras duas seces so regra-base que argumentam em cima dos objetos. A pessoa prov Perguntas (queries) que procuram relaes na coleo, e o outro prov Perguntas que verificam relaes entre pessoas so como elas deveriam ser.

7

2.4. Chamando Servios Prolog do C + +

Para este exemplo, os servios do Prolog sero acessados a partir de um Windows C + + programa que fornece uma interface grfica para o usurio. A interface do GUI deixar o

usurio carregar e salvar bancos de dados da famlia usa list-boxes de seleo para representar as perguntas (queries) de relacionamento, e usa caixa de dilogos para actualizar o banco de dados famlia. C + + bem adequado a programao de GUI, pois permite o encapsulamento natural dos vrios objetos que compem a interface. Neste exemplo, existem objetos que correspondem a cada uma das janelas do aplicativo com o usurio. C++ tambm bem apropriado para conectar com Prolog, pois permite ao programador de aplicao programar um objeto que encapsula os servios de Prolog. Desta forma a interface C + + para servios do Prolog bem definida, e a implementao pode ser mantida, sem afectar o resto da aplicao.

2.4.1.

Os Cabealhos (headers) de Informao C+ +

Um arquivo cabealho define a interface para classes C + +. Porque o programa traa informao de pessoa entre C+ + e Prolog, o programa C+ + primeiro define uma estrutura chamada a Person (Pessoa).struct Person { CString name; CString mother; CString father; CString spouse; CString genderS; };

Ele ser usado para armazenar e transmitir informaes de pessoa em C+ + parte do programa.

8

(CString uma classe String definida no MFC. C+ + e outros fornecedores oferecem classes semelhantes).

Consideremos a classe que define a interface para a poro de cdigo Prolog. chamado ProGene, e neste caso derivado de um fornecedor de classe, desde que fornece servios genricos ao Prolog. A classe ProGene estende os servios genricos com funes particulares para este programa do Prolog especificamente.class ProGene : public CLSEngine { public: ProGene(); Prolog and loads program ~ProGene(); Prolog environment // Manipular Banco de dados Familia BOOL Open(const char *); BOOL Save(); familia // Map Prolog gerou informaes ao list-box BOOL Persons(CList-box *); BOOL Relationships(CList-box *); BOOL Answers(CList-box *, char * relation, char * name); // Fornece service de Atualizao BOOL PersonData(Person *); BOOL AddPerson(); BOOL DelPerson(char *); BOOL SaveValid(Person *); // Processa erros Prolog private: void PrologError(char * s, RC rc = 0); }; // Salva o arquivo actual // destructor Limpa // Inicializa constructor

Porque os servios do Prolog podem estar disponveis para um numero de outras classes, um objeto global criado ao objeto Prolog. Quando o aplicativo inicializado, o objeto criado, e quando o aplicativo for fechado, o objeto destrudo. Tudo isto feito automaticamente por uma linha de cdigo no inicio do programa.ProGene proGene; / / Interface com o Programa Prolog

9

2.4.2.

Usando a Classe ProGene

Vamos agora observar alguns cdigos que faz uso desta interface. Primeiro um arquivo famlia (family) precisa der aberto. Isto feito usando File/Open opo do menu do aplicativo que faz com o seguinte cdigo seja executado. O cdigo usa um arquivo familiar de dilogo aberto para permitir o usurio selecionar um arquivo contendo uma rvore genealgica. Este nome do arquivo transmitido para o servidor Prolog, que abre o arquivo.void GeneWnd::OnFileOpen() { CString sFile; // Use o arquivo de dilogo abertas para receber um nome de arquivo CFileDialog fileDlg(TRUE, ".fam", NULL,.... ... if (fileDlg.DoModal() != IDOK) return; sFile = fileDlg.GetPathName(); // Chma o servidor Prolog para abrir ficheiro de BD familia bOpen = proGene.Open((const char *)sFile); }

Uma vez que o banco de dados aberto, ele est pronto para ser consultado sobre as relaes familiares. A caixa de dilogo consulta contm os trs list-boxes. A primeira listbox inicializado com os nomes dos indivduos na famlia, e o a segunda com as relaes possveis. A terceira list-box preenchida com os resultados das consultas construdo a partir das escolhas na primeira e na segunda list-box.

Em cada caso a caixa de dilogo consulta passa simplesmente um ponteiro para a uma list-box para o objeto servidor ProGene, que esto preenche a list-box com as afirmaes adequadas.BOOL QueryDlg::OnInitDialog() { CList-box *lb; // Obtm ponteiro primeira list-box lb = (CList-box*)GetDlgItem(IDC_LIST1); // Preencherthe list-box if (!proGene.Persons(lb)) return FALSE;

10

// second list-box pointer lb = (CList-box*)GetDlgItem(IDC_LIST2); // fill it as well if (!proGene.Relationships(lb)) return FALSE; ...}

As consultas so decorrentes de escolher um nome e o relacionamento das duas primeiras List-boxes. Esses dados so passados para o servidor Prolog, que em seguida, preenche a terceira list-box com as respostas. Com todas a informao para as list-boxes derivado do programa Prolog, quaisquer alteraes aos dados Prolog , adicionamento de novos relacionamentos, etc. , tudo feito em Prolog.afx_msg void QueryDlg::OnDoQuery() { CList-box *lbNames, *lbRelations, *lbAnswers; char name[NAMELEN]; char relation[NAMELEN]; ... // Extrair relao eo nome das duas primeiras List-boxes // e passa a informao ao servidor proGene.Answers(lbAnswers, relation, name);

O ltimo ponto de interesse a Actulizao do Dilogo. Depois que usurio tenha entrado no campo de um registro de nova pessoa, essa funo mapeia os dados da caixa de dilogo para variveis C+ +, neste caso a estrutura Struct Person anteriormente definida.

A verificao de integridade completa semntica fornecida pela funo 'SaveValid' do servidor Prolog proGene. Esta funo passa o registro de novas propostas para o Prolog para adicionar ao banco de dados, ou relatar um erro fazendo com que o usurio tenta de novo.void EditDlg::DoDataExchange(CDataExchange *pDX) {

11

DDX_Text(pDX, IDC_EDIT1, m_person.name); DDV_MaxChars(pDX, m_person.name, NAMELEN); ... // call Prolog to verify and update if (! proGene.SaveValid(&m_person)) // use MFC failure mechanism if integrity checks failed pDX->Fail();

Note que estes fragmentos de cdigos simplesmente os Widgets da interface do usurio da aplicao. Colocar as list-boxes, responder aos botes, obter os valores selecionados da list-box. Esta informao fornecida exclusivamente pela parte Prolog.

Por outro lado, o cdigo Prolog no tem entendimento do tipo de interface de usurio que est sendo empregado. Ele fornece os servios que lhe foram solicitados.

O cdigo da interface do usurio C+ + e regras baseado de cdigo Prolog esto completamente isolados um do outro, com o servidor proGene objeto fornecendo a comunicao entre eles.

2.5.

O servidor Prolog

Finalmente vamos observar dentro do servidor Prolog para ver como ele conecta ao C+ + ao cdigo Prolog genealgico. Este exemplo em particular utiliza o Amzi! Logic Server API para chamar Prolog do C, mas um cdigo parecido pode ser implementado com qualquer Prolog que fornece uma interface C. A abertura realizada pelo envio de uma 'consulta' mquina do Prolog com o nome do arquivo (contendo uma rvore de famlia) para ser aberta.

BOOL ProGene::Open(const char * sFile) { // Construir uma seqncia de consulta sprintf(buf, "consult('%s')", sFile); // Chamada de Prolog com a seqncia tf = CallStr(&t, buf); ...

12

As pessoas em list-box so preenchidas por encontrar todas as respostas a pessoa (X) a consulta Prolog e adicionando as respostas para a lista-box.BOOL ProGene::Persons(CList-box *lb) { tf = CallStr(&t,"person(X)"); while(tf) { GetArg(t, 1, cSTR, buf);cosulta // obtm a lista de resposta da

// colocar a consulta inicial

lb->AddString(buf); tf = Redo(); falha } return TRUE; }

// adiciona-o ao list-box // refazer aconsulta at que

As relaes de caixa de lista, igualmente preenchido para obter a lista de todas as relaes (a partir das relaes / fato 1 vimos anteriormente) e estalando os elementos da lista para a lista-box.

BOOL ProGene::Relationships(CList-box *lb) { TERM tList; tf = CallStr(&t, "relations(X)"); // Colocar consulta if (tf) { GetArg(t, 1, cTERM, &tList); // obter lista de resposta while (OK == PopList(&tList, cSTR, buf)) // pop each element lb->AddString(buf); } return TRUE; }

13

As respostas list-box funciona de forma semelhante list-box das pessoas. Neste caso, uma consulta mais complexa se coloca, e, em seguida, refeita at que todas as respostas foram recuperados e colocados na caixa de lista de respostas.BOOL ProGene::Answers(CList-box *lb, char * relation, char * name) { sprintf(buf, "%s(X,'%s')", relation, name); // build the query tf = CallStr(&t, buf); //pose the query while (tf) { GetArg(t, 1, cSTR, buf); // get the first argument answer lb->AddString(buf); // add it to the list-box tf = Redo(); // get the next answer } return TRUE; }

E por ltimo veremos o cdigo que faz a verificao da integridade semntica e aactualizao do banco de dados. Ele tambm cria uma consulta Prolog que chama add_person / 5, que adiciona um registro ou envia uma mensagem de erro. Este cdigo pega a mensagem de erro se a integridade verificada falhar, exibe ela ao usurio e permite que o usurio lidar com a situao de erro.BOOL ProGene::SaveValid(Person *p) { char errmsg[BUFLEN]; sprintf(buf,"add_person('%s', '%s', '%s', '%s', '%s')", (const char *)p->name, (const char *)p->genderS, (const char *)p->mother, (const char *)p->father, (const char *)p->spouse); tf = CallStr(&t, buf); if (tf == FALSE) { CallStr(&t, "message(X)"); GetArg(t, 1, cSTR, errmsg); sprintf(buf, "Semantic Integrity Error:\n%s", errmsg);

14

AfxMessageBox(buf); return FALSE; } return TRUE; }

Estes so os destaques da interface do servidor Prolog que fornecem uma camada isolante entre o cdigo do Prolog com a lgica bsica do aplicativo e o cdigo da interface do usurio escrita em C + +.

ConclusoEsta aplicao de exemplo ilustra como as capacidades de orientao a objetos de C++ podem ser utilizadas para criar uma ponte clara entre cdigo C++ e cdigo do Prolog. O projeto resultante permite utilizar C++ para ser utilizado para aqueles aspecto da aplicao que melhor encapsulam, e Prolog para aqueles aspectos que melhor tratam. C++ utilizado como ferramentas Microsoft GUI para desenvolver um Windows front end, enquanto Prolog utilizada como ambos um banco de dados e um regra-base. A arquitetura permite isso facilmente para manter a regra lgica da aplicao, codificada em Prolog.

15

3.

Integrao entre Prolog e a

linguagem Java

3.1.

Arquiteturas1 camada (tier) o Um programa Prolog transformado em um programa Java 2 camadas o Emulao de um motor Prolog emulado em Java 3 ou mais camadas o Programas Java fazem chamadas a uma camada intermediria,

que por sua vez invoca o motor Prolog o Programas Prolog fazem chamadas a uma camada intermediria, que as repassam para a JVM

3.1.1.

Arquitetura em 1 camada

Pr-compilao de regras Prolog em classes Java, que implementam o mecanismo de busca e inferncia Prolog. Tem duas estratgias: Pr-compilao de regras Prolog em classes Java ex: Prolog Caf, LLPj Extenso da linguagem Java, com construes para a definio de regras ex: Kiev

16

Programa Prolog (Familia.pl) avo(X,Z) :- pai(X,Y), pai(Y,Z). avo(X,Z) :- pai(X,Y), mae(Y,Z). avo(X,Z) :- mae(X,Y), pai(Y,Z). avo(X,Z) :- mae(X,Y), mae(Y,Z). mae(marta, joao). mae(maria, silvia). pai(jose, joao). pai(joao, marcos). mae(sandra, jose).

pai(pedro, jose).

17

Programa Java (Familia.java) public class Familia { private static Set fatos = new HashSet(); static { fatos.add(new Fato(Mae, Marta, Joao)); fatos.add(new Fato(Mae, Maria, Silvia)); fatos.add(new Fato(Pai, Jose, Joao)); ... } public static boolean Avo(String x, Sting y) { return (Avo_1(x,y) || Avo_2(x,y) || Avo_3(x,y) || Avo_4(x,y)); } private static boolean Avo_1(String x, String y) { for (Iterator i = fatos.iterator(); i.hasNext(); ) { Fato f = (Fato) i.next(); if (f.getPredicateName().equals(Pai) && g.getParam(1).equals(x) { Fato aux = new Fato(Pai, f.getParam(2), y); if (fatos.contains(aux)) return true; } } return false; } ... }

18

Exemplo de regra Kiev String[] strArray = {one, two, three}; public static rule check(pvar String s) { s ?= hello ; s @= strArray } public static void main(String[] args) { PVar s = new PVar(); foreach (check(s)) { System.out.println(s.$var); } }

3.1.2.de Prolog

Arquitetura em 2 camadas

Biblioteca de classes Java que implementam a funcionalidade do motor Emulao do motor Prolog em Java

Exemplos jProlog, JavaLog, LL

19

3.1.3. Arquitectura em 3 camadasBiblioteca de classes Java que serve como ponte para alguns sistemas j existentes. Estratgias: Comunicao da JVM com o runtime Prolog via sockets (ou similar), ex: InterProlog Ponte Java para algum sistema integrado de alguma linguagem (geralmente C) com Prolog. Interface com diversas, outras linguagens. Ex: Amzi Logic Server, BinProlog

Arquitetura em 3 camadas (ex.)

20

4.

Integrao Eficiente de

PROLOG e Bancos de dados de Relacionais

4.1. BASES DE DADOS RELACIONAISUma "base de dados" pode ser entendida como uma coleo de dados interrelacionados, armazenada de modo independente do programa que a utiliza, permitindo a recuperao,

21

insero, remoo e modificao de forma controlada. A quantidade de dados tipicamente grande e o contedo muda ao longo do tempo. Em Prolog, uma base de dados definida como um conjunto de fatos, no havendo, entretanto, nada que impea a linguagem de trabalhar diretamente com bases de dados convencionais. Alm disso, a linguagem Prolog possui caractersticas que a tornam uma excelente interface para lidar com bases de dados relacionais. Diferentemente de outros modelos de bases de dados, o modelo relacional no possui o conceito de "pointer", de modo que a associao entre diferentes tabelas feita atravs da identidade explcita de valores de atributos. Este princpio concentra o esforo de implementao em obter maior velocidade de acesso, ao passo que a vantagem natural a grande flexibilidade e fcil entendimento do processo de modelagem de dados. 4.1.1. EXEMPLO DE UMA BASE DE DADOS RELACIONAL

Considere as seguintes relaes: pessoa/4, contendo nome, sexo, pai e me; carro/4, contendo a placa, o fabricante, o proprietrio e a cor. Tais relaes podem originar tabelas como as apresentadas abaixo:Tabela 1 Relao Pessoa/4

22

Tabela 2 Relao Carro/4

Uma base de dados Prolog, formada a partir das tabelas 1 e da tabela 2, seria representada atravs dos seguintes factos: pessoa(marcelo, m, luiz, gilda). pessoa(luiz, m, alfredo, lina) pessoa(gilda, f, miguel, ana). pessoa(lcia, f, luiz, gilda). pessoa(paulo, m, miguel, ana). pessoa(lina, f, francisco, jlia).

carro(abc-4590, vw, alfredo, azul). carro(xyz-1211, ford, lina, branco). carro(rtc-9004, fiat, luiz, vermelho). carro(llz-7533, gm, gilda, prata).

Um ou mais atributos em cada relao possui a propriedade especial de serem nicos na tabela. Tais atributos so denominados "chaves" e identificam os obj etos acerca dos quais armazenamos informaes. Usualmente se costuma sublinhar os atributos que so chaves, por exemplo:

23

pessoa: nome sexo pai me 4.1.2. RELAES BINRIAS

As relaes mais simples que existem so as relaes binrias, que associam um nico atributo a cada chave. A relao pessoa/4, que possui a chave "Nome", seria assim dividida em trs relaes:

O mesmo se aplica relao carro/4, cuja chave "Placa":

Entretanto, por questes de convenincia e economia, toda a informao relacionada reunida em uma nica relao. Uma situao de exceo ocorre quando necessrio manipular informao

incompleta no modelo relacional. Em uma relao binria, a tupla correspondente desprezada, por exemplo,um carro sem um proprietrio. Entretanto, no caso em que formada uma tupla com diversos atributos, um smbolo especial "nil" empregado para representar tal informao. Por exemplo: carro(ajk-6712, honda, nil, verde)

4.1.3.

CHAVES COMPOSTAS

Em uma estratgia de implementao simples, assume-se que h uma nica chave em cada classe, normalmente ocupando a posio do primeiro argumento. Para chaves compostas assumiremos aqui uma conveno ad-hoc, representando-as como uma lista de argumentos:

24

[ch1, ch2, ch3] que possui o seu prprio nome, mantendo entretanto em separado os atributos individuais ch1, ch2 e ch3.

4.2. RECUPERAO DE INFORMAESRecuperar informaes significa combinar e apresentar o contedo da base de dados em uma forma que satisfaa nossas necessidades. Em bases de dados convencionais isto executado por um programa que atua sobre a base de dados. Em Prolog isto feito atravs da definio das condies de soluo em lgica. Por exemplo: Quem possui um fiat? ?-carro(_, fiat, Prop, _). Prop = luiz Quem fabrica os carros preferidos pelas mulheres? ?-pessoa(N, f, _, _), carro(_, Fabr, N, _). N = lina Fabr = ford; N = gilda Fabr = gm; No

4.2.1.

RECUPERAO EFICIENTE

Os sistemas Prolog permitem a representao de informao relacional e a sua recuperao facilmente formulada. Grandes bases de dados, entretanto, devem ser tratadas com cuidado, principalmente quando da combinao de classes distribudas em duas ou mais tabelas. Assim, sistemas Prolog destinados a tais actividades normalmente devem possuir um "optimizador de consultas", que um programa escrito em Prolog que manipula consultas como se fossem dados de entrada expressos sob forma de termos, isto , tal programa desempenha o papel de um "meta-interpretador".

25

Uma estratgia possvel a empregar seria seleccionar primeiro a condio que apresentasse o menor nmero de solues possveis, supondo que todas as variveis estivessem instanciadas. Suponha, por exemplo, que um crime tenha sido cometido e est sendo procurado um homem em um ford azul. A base de dados da polcia possui duas tabelas: uma com 3000 carros e outra com 10000 pessoas suspeitas. Lembre-se que uma pessoa pode possuir mais de um carro. Vamos imaginar que haja dez fords azuis e que metade das pessoas na base de dados seja homens. H duas formas de formular a questo:

?-carro(Placa, ford, X, azul), pessoa(X, m, _, _). e ?-pessoa(X, m, _, _), carro(Placa, ford, X, azul).

Supondo que haja um acesso directo quando se dispe da chave da tabela, fcil verificar que, no primeiro caso, sero realizadas 3000 tentativas de unificao na tabela de carros, dais quais apenas 10 sero bem sucedidas (s h 10 fords azuis), produzindo 10 acessos directos tabela de pessoas para verificar o sexo, num total de 3010 unificaes. No segundo caso, entretanto, sero realizadas primeiras 10000 tentativas de unificao na tabela de pessoas, das quais 5000 sero bem sucedidas. Para cada uma dessas unificaes bem sucedidas, 3000 acessos devero ser feitos tabela de carros, uma vez que no se dispe da chave, que "Placa". O nmero de tentativas de unificao realizadas aqui ser portanto 5000 x 3000 + 10 = 15 000 010. Isso mostra porque as condies com o menor nmero de solues possveis devem ser colocadas em primeiro lugar na formulao de consultas.

4.2.2.

TABELAS VIRTUAIS

Uma das facilidades proporcionadas pelo Prolog no tratamento do modelo relacional a possibilidade de definir novas tabelas sem ter de cri-las, empregando a implicao lgica. Tais tabelas so denominadas "tabelas virtuais". Por exemplo, uma tabela corDoCarro/2 que

26

contm como argumentos somente a placa e a cor de um carro pode ser definida da seguinte maneira: corDoCarro(X, Y) carro(X, _, _, Y). O conceito de tabelas virtuais uma adaptao das "relaes extractoras" introduzidas no captulo anterior. Um subconjunto do Prolog convencional, sem os smbolos funcionais e o tratamento de listas, denominado Datalog, foi proposto com essa finalidade. Na verdade o uso de Prolog para representar bases de dados relacionais, introduz novos conceitos e regras, ampliando o nvel da informao. Considere por exemplo a questo: Quem tem uma av que possui um ford branco? Em Prolog as regras para definir as relaes av/2, corDoCarro/2, etc. so facilmente construdas e incorporadas base de dados, transcendendo o modelo relacional. A questo apropriada poderia ser construda assim: ?-av(X, P), carro(_, ford, X, branco).

4.2.3.

NOMES SIMBLICOS

Quando as tabelas Prolog so acessadas, o programa usa a posio do argumento na relao para acessar a coluna correspondente. Isso se torna difcil, quando o nmero de argumentos muito grande. Alm disso, constrange o programa a realizar concretamente as relaes. O que se necessita, portanto uma representao mais abstracta que permita ao programa lidar com modificaes na modelagem dos dados. Uma soluo empregar tabelas virtuais binrias, contendo o nome do atributo como argumento explcito. No caso de tabelas com muitos argumentos, esta tcnica pode se tornar uma necessidade. Um predicado geral, atributo/4 pode ser definido para todos os nomes de atributos: atributo(carro, P, placa, P) :- carro(P, _, _, _). atributo(carro, P, fabricante, F) :- carro(P, F, _, _). atributo(carro, P, proprietrio, X) :- carro(P, _, X, _). atributo(carro, P, cor, C) :- carro(P, _, _, C).

27

4.3.

ATUALIZAO DA BASE DE DADOS

O modelo relacional impe a restrio de que certos campos devem ser campos chaves, cujo valor deve ser nico em uma tabela. Assim, "Nome " a chave na relao na relao pessoa/4, enquanto que na relao carro/4 a chave "Placa". Em Prolog, um sistema para o gerenciamento de bases de dados relacionais pode ser implementado de forma muito natural. As operaes bsicas so: esquece(T) memoriza(T) % Remove a classe T % Insere a classe T, se j no estiver l

atualiza(V, N) % Remove a velha e insere a nova classe

Por exemplo: ?-esquece(carro(_, _, gilda, _)). Ir remover da base de dados todos os carros que pertencem a Gilda. Da mesma forma memoriza(carro(flt-5455, honda, gilda, cor-de-rosa)). Ir introduzir o novo - e nico - carro de Gilda na base de dados. Na construo dos predicados esquece/1 e memoriza/1, emprega-se a chave originalmente definida como elemento de referncia, devendo-se preserv-la nica em qualquer circunstncia. Assim tais predicados devem ser construdos na forma abaixo: esquece(X) :esquece1(X), fail. esquece(X). esquece1(X) :retract(X). esquece1(X).

28

memoriza(X) :esquece(X), assert(X). memoriza(X) :assert(X). O predicado esquece(X) ir excluir da base de dados todas as sentenas que unificam com X. Se for desejada a excluso somente da primeira ocorrncia, deve ser usado o predicado esquece1(X). Ambos, esquece/1 e esquece1/1 so sempre bem sucedidos, garantindo o primeiro, com sua execuo, que no h mais na base de dados nenhuma sentena que unifique com X e o segundo que a primeira sentena encontrada unificando com X foi removida. Por outro lado o predicado memoriza(X) inicia com uma chamada a esquece/1, preservando assim a unicidade da chave estipulada em X. Deve ser tambm notado que esses predicados so extremamente poderosos e devem ser usados com absoluto cuidado para evitar "acidentes". Um cuidado interessante seria restringir a execuo de esquece/1, esquece1/1 e memoriza/1 a argumentos que possussem uma instanciao explcita para a chave da classe a esquecer ou memorizar.

4.4.

MODELAGEM DE DADOS

Uma base de dados no somente uma coleco de dados ou entidades, mas tambm as associaes ou relacionamentos entre eles. Tais associaes constituem o denominado "modelo de dados". A tecnologia de bases de dados vem oferecendo mtodos e ferramentas para a soluo de problemas em ambientes complexos e de grande porte. O projecto de modelos lgicos de dados um importante objetivo nas reas de representao e aquisio de conhecimento. O que se verifica que a pura lgica de predicados um formalismo extremamente poderoso, de expressividade ou capacidade de representao virtualmente ilimitada, de modo que frequentemente temos que impor restries linguagem empregada na modelagem, retornando porm lgica de predicados para explicar a semntica ou projectar extenses no convencionais.

29

4.4.1.

FORMAS NORMAIS

Como em toda modelagem, as nicas coisas importantes a serem modeladas so os invariantes fundamentais do domnio do problema. A mais importante propriedade dos invariantes que os objetos pertencem a classes que podem ser armazenadas uniformemente como relaes. Um outro princpio bsico aqui a evidncia de que um determinado dado em uma certa relao funcionalmente dependente de outro. Um conjunto de dados B dito "funcionalmente dependente" de um outro conjunto de dados A se para todo elemento a em A h um nico elemento b em B tal que b est relacionado com a. As notaes mais empregadas so as seguintes: A ---> B A, B ---> C significando respectivamente: "B funcionalmente dependente de A" e "C funcionalmente dependente da combinao de A e B". Por exemplo: trabalhador ---> empregador Devido ao fato de que as chaves so nicas, segue automaticamente que todos os atributos de uma entidade so funcionalmente dependentes de sua chave.

4.4.2.

FORMAS NORMAIS RELACIONAIS

Outro importante princpio da boa modelagem de dados evitar redundncias. A mesma pea de informao deve ser armazenada uma nica vez. Assim, para qualquer modificao em seus valores, a base de dados necessitar ser actualizada em um nico ponto. Em bases de dados relacionais, tais princpios so definidos por meio de um processo denominado "normalizao". As diferentes formas normais so denominadas: "primeira forma normal", "segunda forma normal", etc., e abreviadas respectivamente por 1FN, 2FN, etc. Aqui introduzimos as trs primeiras delas.

30

PRIMEIRA FORMA NORMAL (1FN)

Evita repetir grupos, como no exemplo: Empregador empregado1 , empregado2 , ..., empregadon No usar a representao: empregados(joo, [jos, jlia, jorge, josefina, jane]). mas sim a representao empr(jos, joo). empr(jlia, joo). empr(jorge, joo). SEGUNDA FORMA NORMAL (2FN)

Esta forma relevante para tuplas com chaves compostas:

empregado nomeEmpregado empregado projeto nomeProjeto horas

Neste caso, cada empregado possui um nmero (a chave "empregado") e um nome (nomeEmpregado). O empregado trabalha em um conjunto de projetos com nmeros (a chave "projeto") e nomes (nome-Projeto), dedicando a cada um certo nmero de "horas".

TERCEIRA FORMA NORMAL (3FN)

Um bom exemplo da 3FN ocorre quando a informao sobre uma pessoa, seu empregador e o endereo de seu empregador so armazenados. Se a relao empregado empregador endereoEmpregador existe, ento a entidade endereoEmpregador no funcionalmente dependente da chave "empregado" sozinha, mas na verdade de

"empregador", que por sua vez dependente de "empregado". Como nos casos anteriores, problemas de redundncia e de mltiplas atualizaes surgem, de modo que

31

a normalizao recomenda que a relao acima sej a dividida em duas relaes independentes:

empregado empregador empregador endereoEmpregador

Os princpios da normalizao podem ser aplicados manualmente para modelos pequenos, entretanto, para grandes modelos a normalizao deve preferencialmente ser apoiada por ferramentas de engenharia de software.

5.

Concluso

Ao longo de trabalho tentei demonstrar como a linguagem Prolog e interage com outras linguagens de Programao. Programao em lgica pode ser vista como uma tentativa de dispor parte da lgica matemtica a servio da programao, sendo largamente usada para aplicaes onde no se tem uma ideia exata de qual a direo do sistema, mas as relaes entre os conceitos de domnio so claras. Este o caso de algumas tarefas de Inteligncia Artificial. Programao em lgica a melhor forma de representar logicamente relaes entre entidades, e tem uma vantagem clara da recursividade pode ser facilmente definida dentro de regras. a forma mais comum de arquitetura usada em sistemas baseado em conhecimento e um importante tipo de padro de sistemas de inferncia. Fornece um meio natural de expressar situaes, meio de representao do conhecimento, e aces heursticas, manipulao desse conhecimento, na soluo de problemas emulando o comportamento humano. A ideia de um programador poder codificar o conhecimento de um especialista em um conjunto de regras que permitem ao sistema fazer as mesmas concluses desse especialista. Algumas vantagens de um sistema baseado em regras so:

32

Modularidade o Clusulas so fceis de codificar e adicionar em um sistema baseado em regras. Elas podem ser adicionadas numa base de dados sem mudar outras regras. Naturalidade e simplicidade Conhecimento intensivo o Um sistema especialista pode ser adaptado para ser usado em outro domnio do problema simplesmente mudando as regras da base.

33

34