8/6/2019 Integrao PrologXoutras Ling
1/34
Arilson Rocha Integrao do Prlog com outras Linguagens
1
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 COMOUTRAS LINGUAGENS
8/6/2019 Integrao PrologXoutras Ling
2/34
Arilson Rocha Integrao do Prlog com outras Linguagens
2
1. IntroduoProlog 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
http://pt.wikipedia.org/wiki/Linguagens_de_programa%C3%A7%C3%A3ohttp://pt.wikipedia.org/wiki/Intelig%C3%AAncia_artificialhttp://pt.wikipedia.org/wiki/Ling%C3%BC%C3%ADstica_computacionalhttp://pt.wikipedia.org/wiki/Banco_de_dadoshttp://pt.wikipedia.org/wiki/Banco_de_dadoshttp://pt.wikipedia.org/wiki/Banco_de_dadoshttp://pt.wikipedia.org/wiki/Banco_de_dadoshttp://pt.wikipedia.org/wiki/Ling%C3%BC%C3%ADstica_computacionalhttp://pt.wikipedia.org/wiki/Intelig%C3%AAncia_artificialhttp://pt.wikipedia.org/wiki/Linguagens_de_programa%C3%A7%C3%A3o8/6/2019 Integrao PrologXoutras Ling
3/34
Arilson Rocha Integrao do Prlog com outras Linguagens
3
(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 alinguagem 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 PrologPara 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 PessoaisEsse 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.
8/6/2019 Integrao PrologXoutras Ling
4/34
Arilson Rocha Integrao do Prlog com outras Linguagens
4
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 FamliaO 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),
8/6/2019 Integrao PrologXoutras Ling
5/34
Arilson Rocha Integrao do Prlog com outras Linguagens
5
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 QueryRule-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).
8/6/2019 Integrao PrologXoutras Ling
6/34
Arilson Rocha Integrao do Prlog com outras Linguagens
6
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 umapessoa 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 sidoconcebido 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),
8/6/2019 Integrao PrologXoutras Ling
7/34
Arilson Rocha Integrao do Prlog com outras Linguagens
7
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 PrologComo 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.
8/6/2019 Integrao PrologXoutras Ling
8/34
Arilson Rocha Integrao do Prlog com outras Linguagens
8
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 objetosque 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/6/2019 Integrao PrologXoutras Ling
9/34
Arilson Rocha Integrao do Prlog com outras Linguagens
9
(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(); // Inicializa constructor
Prolog and loads program~ProGene(); // destructor Limpa
Prolog environment
// Manipular Banco de dados Familia
BOOL Open(const char *);
BOOL Save(); // Salva o arquivo actual
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); };
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
8/6/2019 Integrao PrologXoutras Ling
10/34
Arilson Rocha Integrao do Prlog com outras Linguagens
10
2.4.2. Usando a Classe ProGeneVamos 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 list-
box 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;
8/6/2019 Integrao PrologXoutras Ling
11/34
Arilson Rocha Integrao do Prlog com outras Linguagens
11
// 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)
{
8/6/2019 Integrao PrologXoutras Ling
12/34
Arilson Rocha Integrao do Prlog com outras Linguagens
12
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);
...
8/6/2019 Integrao PrologXoutras Ling
13/34
Arilson Rocha Integrao do Prlog com outras Linguagens
13
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)"); // colocar a consulta inicial
while(tf) {
GetArg(t, 1, cSTR, buf); // obtm a lista de resposta da
cosulta
lb->AddString(buf); // adiciona-o ao list-box
tf = Redo(); // refazer aconsulta at que
falha
}
return TRUE;
}
As relaes de caixa de lista, igualmente preenchido para obter a lista de todas asrelaes (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;
}
8/6/2019 Integrao PrologXoutras Ling
14/34
Arilson Rocha Integrao do Prlog com outras Linguagens
14
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 asituao 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);
8/6/2019 Integrao PrologXoutras Ling
15/34
Arilson Rocha Integrao do Prlog com outras Linguagens
15
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 + +.
Concluso
Esta 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 .
8/6/2019 Integrao PrologXoutras Ling
16/34
Arilson Rocha Integrao do Prlog com outras Linguagens
16
3. Integrao entre Prolog e alinguagem Java
3.1. Arquiteturas 1 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 camadaintermediria, que as repassam para a JVM
3.1.1. Arquitetura em 1 camadaPr-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: PrologCaf, LLPj
Extenso da linguagem Java, com construes para a definiode regras ex: Kiev
8/6/2019 Integrao PrologXoutras Ling
17/34
Arilson Rocha Integrao do Prlog com outras Linguagens
17
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).
8/6/2019 Integrao PrologXoutras Ling
18/34
Arilson Rocha Integrao do Prlog com outras Linguagens
18
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;
}
. . .
}
8/6/2019 Integrao PrologXoutras Ling
19/34
Arilson Rocha Integrao do Prlog com outras Linguagens
19
3.1.2. Arquitetura em 2 camadas Biblioteca de classes Java que implementam a funcionalidade do motor
de Prolog
Emulao do motor Prolog em Java
Exemplos
jProlog, JavaLog, LL
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); }
}
8/6/2019 Integrao PrologXoutras Ling
20/34
Arilson Rocha Integrao do Prlog com outras Linguagens
20
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 (geralmenteC) com Prolog. Interface com diversas, outras linguagens. Ex: Amzi LogicServer, BinProlog
Arquitetura em 3 camadas (ex.)
8/6/2019 Integrao PrologXoutras Ling
21/34
Arilson Rocha Integrao do Prlog com outras Linguagens
21
4. Integrao Eficiente dePROLOG 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,insero, remoo e modificao de forma controlada. A quantidade de dados tipicamente
8/6/2019 Integrao PrologXoutras Ling
22/34
Arilson Rocha Integrao do Prlog com outras Linguagens
22
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 RELACIONALConsidere 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
8/6/2019 Integrao PrologXoutras Ling
23/34
Arilson Rocha Integrao do Prlog com outras Linguagens
23
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:
8/6/2019 Integrao PrologXoutras Ling
24/34
Arilson Rocha Integrao do Prlog com outras Linguagens
24
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 COMPOSTASEm 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:
8/6/2019 Integrao PrologXoutras Ling
25/34
Arilson Rocha Integrao do Prlog com outras Linguagens
25
[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 programadesempenha o papel de um "meta-interpretador".
8/6/2019 Integrao PrologXoutras Ling
26/34
Arilson Rocha Integrao do Prlog com outras Linguagens
26
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 VIRTUAISUma 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
8/6/2019 Integrao PrologXoutras Ling
27/34
Arilson Rocha Integrao do Prlog com outras Linguagens
27
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 SIMBLICOSQuando 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).
8/6/2019 Integrao PrologXoutras Ling
28/34
Arilson Rocha Integrao do Prlog com outras Linguagens
28
4.3. ATUALIZAO DA BASE DE DADOSO 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) % Remove a classe T
memoriza(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).
8/6/2019 Integrao PrologXoutras Ling
29/34
Arilson Rocha Integrao do Prlog com outras Linguagens
29
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 DADOSUma 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 formalismoextremamente 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.
8/6/2019 Integrao PrologXoutras Ling
30/34
Arilson Rocha Integrao do Prlog com outras Linguagens
30
4.4.1. FORMAS NORMAISComo 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 RELACIONAISOutro 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.
PRIMEIRA FORMA NORMAL (1FN)
8/6/2019 Integrao PrologXoutras Ling
31/34
Arilson Rocha Integrao do Prlog com outras Linguagens
31
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
a normalizao recomenda que a relao acima sej a dividida em duas relaes
independentes:
8/6/2019 Integrao PrologXoutras Ling
32/34
Arilson Rocha Integrao do Prlog com outras Linguagens
32
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. ConclusoAo 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:
Modularidade
8/6/2019 Integrao PrologXoutras Ling
33/34
Arilson Rocha Integrao do Prlog com outras Linguagens
33
o Clusulas so fceis de codificar e adicionar em umsistema 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 usadoem outro domnio do problema simplesmente mudando as regras da
base.
8/6/2019 Integrao PrologXoutras Ling
34/34