Download - Integração PrologXoutras Ling

Transcript
  • 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%A3o
  • 8/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