71
Universidade Federal do Maranhão Curso de Pós-Graduação em Engenharia de Eletricidade Área de Concentração: Ciência de da Computação Linguagens e Ferramentas para a IA Programação Lógica : A Linguagem PROLOG Por Prof. Dr. Sofiane Labidi 2004

Universidade Federal do Maranhão Curso de Pós … · Observação: Nada impede a definição de fatos que não são mais corretos. ... Prolog usa o conceito de regras para representar

  • Upload
    dothuan

  • View
    216

  • Download
    2

Embed Size (px)

Citation preview

Universidade Federal do Maranhão

Curso de Pós-Graduação em Engenharia de Eletricidade

Área de Concentração:

Ciência de da Computação

Linguagens e Ferramentas para a IA

Programação Lógica : A Linguagem PROLOG

Por

Prof. Dr. Sofiane Labidi

2004

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Sumário

PARTE I. INTRODUÇÃO ..........................................................................................................................4

1.LINGUAGENS DA INFORMÁTICA..................................................................................................................5

2.PROGRAMAÇÃO MULTI-PARADIGMAS........................................................................................................6

3.HISTÓRICO..................................................................................................................................................8

4.CARACTERÍSTICAS E APLICAÇÕES..............................................................................................................9

5.PROGRAMAÇÃO LÓGICA...........................................................................................................................10

PARTE II. PRINCÍPIOS DA PROGRAMAÇÃO EM PROLOG......................................................11

6.FATOS.......................................................................................................................................................12

7.CONSULTA................................................................................................................................................14

7.1Uso das Variáveis..............................................................................................................................14

7.2Conjunção..........................................................................................................................................16

8.TÉCNICA DE BUSCA DO MOTOR PROLOG.................................................................................................18

9.USO DAS REGRAS.....................................................................................................................................19

PARTE III. ESTRUTURAS DA LINGUAGEM.......................................................................................22

10.CONSTITUINTES ELEMENTARES..............................................................................................................23

10.1Termos.............................................................................................................................................23

10.1.1Átomos.......................................................................................................................................2310.1.2Variável......................................................................................................................................24

10.2Relações...........................................................................................................................................25

11.CLÁUSULAS.............................................................................................................................................26

12.REPRESENTAÇÃO DOS OBJETOS PROLOG...............................................................................................28

13.ALGORITMO DE UNIFICAÇÃO DE ROBINSON..........................................................................................29

14.PACOTE (PACKAGES)..............................................................................................................................31

15.ESTRUTURA DE UM PROGRAMA PROLOG................................................................................................32

16.ALGUMAS DEFINIÇÕES...........................................................................................................................33

17.SIGNIFICAÇÃO OPERACIONAL.................................................................................................................34

18.UMA VISÃO PROCEDURAL DE PROLOG..................................................................................................35

PARTE IV. CONTROLE..........................................................................................................................36

19.INTRODUÇÃO...........................................................................................................................................37

20.O CUT......................................................................................................................................................38

20.1Busca determinística (green cut).....................................................................................................38

20.2Otimização (green cut)....................................................................................................................39

20.3Modificação da semântica (red cut)............................................................................................39

21.O FAIL....................................................................................................................................................40

22.OUTRAS ESTRUTURAS DE CONTROLE......................................................................................................41

2

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

23.NEGAÇÃO................................................................................................................................................42

PARTE V. OPERAÇÕES..........................................................................................................................44

24.OPERAÇÕES RELACIONAIS.....................................................................................................................45

25.OPERAÇÕES ARITMÉTICAS.....................................................................................................................47

26.EXERCÍCIOS.............................................................................................................................................48

PARTE VI. ESTRUTURA DAS LISTAS................................................................................................49

27.LISTAS.....................................................................................................................................................50

28.OPERAÇÕES BÁSICAS SOBRE AS LISTAS:.................................................................................................52

29. EXERCÍCIOS............................................................................................................................................55

PARTE VII. ENTRADAS E SAÍDAS......................................................................................................56

30.ENTRADAS..............................................................................................................................................57

31.SAÍDAS....................................................................................................................................................59

PARTE VIII. ESTRUTURAS DE REPETIÇÃO......................................................................................61

32.REPEAT...................................................................................................................................................62

PARTE IX. MANIPULAÇÃO DE ARQUIVOS......................................................................................63

33.SAÍDA PADRÃO.......................................................................................................................................64

34.ENTRADA PADRÃO..................................................................................................................................66

35.CONSULTA DE BANCOS DE DADOS.........................................................................................................68

36.DEFINIÇÃO..............................................................................................................................................70

PRTE X. PROJETOS...................................................................................................................................71

3

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE I. INTRODUÇÃO

4

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

1. Linguagens da Informática

São formalismos que permitem de resolver problemas escrevendo

"Programas"!

Basicamente, existe dois tipos de linguagens: Imperativa, Declarativa, etc.

5

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

2. Programação Multi-Paradigmas

Existem vários paradigmas de programação:

• Programação Procedural / Imperativa (ou Convencional)Instrução = Ordem (nos dois sentidos: ordem para a máquina eordem nos enunciados).Especificação da solução em termos de comportamento da máquina.

• Programação Orientada a ObjetoInstrução básica = Envio de mensagem.Especificação da solução em termos de interações entre objetosInstâncias de uma hierarquia de classes (categorias de objetos).

• Programação FuncionalInstrução = Função (que calcula e retorna um valor: a solução).Especificação da solução em termos de valores calculados.

• Programação Lógica (Declarativa)Instrução = RelaçãoEspecificação da solução em termos de relações entre entidades.

• Programaçõa Visual;

• Programação Paralela; Distribuída, Concorrente, etc.

Cada paradigma tem suas vantagens e inconvenientes. Será que é

interessante combinar os paradigmas? É interessante desenvolver linguagens que

suportem diferentes paradigmas? Existem tentativas de combinar a orientação a

objeto as categorias de linguagens. Por exemplo, as linguagens: ObjLog, CLOS,

etc.

6

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

A IA usa muito a Programação Funcional (Lisp, Scheme, ML, etc.) e a

Programação Lógica (principalmente PROLOG).

7

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

3. Histórico

• Muitos séculos atrás apareceu a lógica tradicional com Aristóteles.

• A formalização da lógica começou apenas no século 19, com

DeMoragan e Boole (Lógica Booleana).

• No século 20, tivemos o desenvolvimento de muitos princípios da

lógica como a teoria de demonstração por refutação de Herbrand (1930), o

princípio de resolução de Robinson (1965), a SLD resolution de Kowalski

(1971), etc.

• Em 1973, tivemos o desenvolvimento do primeiro interpretador

Prolog (escrito em Fortran) pela equipe GIA (Grupo de Inteligência

Artificial) de Colmerauer da Universidade de Marselha. Prolog é a primeira

linguagem de programação baseada na lógica.

• Prolog se desenvolveu bastante no meio universitário. A partir de

1981, Prolog comecou a ter algumas aplicações na indústria.

• O primeiro compilador foi desenvolvido pela equipe de David

Warren na Universidade de Edinburgh (em Borland Turbo-Pascal) em 1982:

o que significou uma grande virada!

• Em 1992, inicio a definição de uma norma ISO para Prolog, além

do desenvolvimento de vários ambientes de programação em Prolog: Prolog

de Marselha, LPA Prolog, DELPHI Prolog, etc.

8

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

4. Características e Aplicações

Prolog é uma linguagem declarativa baseada nos princípios da lógica.

Mesmo não respeitando inteiramente estes princípios.

É uma linguagem simples: o usuário especifica o conhecimento sem se

preocupar com a sua aplicação. Isto é feito pelo motor do Prolog (baseado no

algoritmo de unificação de Robinson).

Um programa Prolog é uma especificação executável.

O sucesso do Prolog fez com que ele fosse escolhido pelos japoneses como a

linguagem da máquina de quinta geração.

As principais aplicações de Prolog são:

• Tratamento da liguagem natural;

• Banco de dados;

• Automação de projetos;

• Sistemas especialistas, etc.

9

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

5. Programação Lógica

Programar em lógica ⇒ Descrever o universo do problema.

Um programa Prolog é um conjunto de:

• Propriedades; e

• de relações.

Um programa Prolog é, portanto, um conjunto de afirmações. Ela não é uma

descrição da solução do problema.

Um problema é um conjunto de perguntas sobre os objetos do universo da

aplicação.

A execução de um programa implica a dedução de novas relações a partir

das afirmações do programa.

10

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE II. PRINCÍPIOS DA PROGRAMAÇÃO EM PROLOG

11

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

6. Fatos

Os fatos são afirmações corretas sobre os objetos do universo da aplicação.

Cada fato exprime um relacionamento entre os objetos envolvidos. Por exemplo, o

fato “João gosta de cinema” é um relacionamento entre os objetos

“joão” e “flores”.

Em Prolog, os fatos são representados de uma maneira simples, baseados na

lógica:

gosta(joao,flores).% afirmação que João gosta de flores.

pai(roberto,joao). % afirmação que Roberto é o pai de João.

Observação.

• Os nomes dos relacionamentos e dos objetos devem começar por uma letra

minúscula. Estes relacionamentos são chamados predicados.

• O relacionamento é escrito primeiro e os objetos em seguida. Os objetos são

separados por uma vírgula e agrupados entre parênteses. Os objetos são

chamados argumentos do predicado.

• A representação termina por um ponto (.).

Deve-se prestar atenção na ordem pela qual os objetos são expressos, pois

pai(roberto,joao) e pai(joao,roberto) não têm o mesmo

significado.

Os predicados podem ter um número arbitrário de objetos. Isto define o grau

do predicado ou a aridade. Por exemplo, gostar é um fato binário, mas podemos

ter relacionamentos unários, ternários, etc.

12

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

homem(joao). % João é um homemmulher(marci).capital(paris,franca). % Paris é a Capital da França

da(marcia,maria,livro). % Márcia deu um livro para Maria

Em um mesmo programa podemos ter um mesmo predicado com aridades

diferentes:

pais(brasil). % Brasil é um paíspais(brasil,brasilia,portugues,real).

% mais informações sobre o Brasil.

Observação: Nada impede a definição de fatos que não são mais corretos.

Prolog funciona de modo monótono.

capital(brasil,rio). % Para Prolog isto é um fato verdadeiro.

O conjunto de fatos Prolog é geralmente chamado Base de Dados.

13

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

7. Consulta

A consulta é uma pergunta sobre os fatos da base de dados.

Em Prolog, a pergunta é similar sintaticamente aos fatos:

?- capital(paris,franca).yes % a resposta é sim

?- homem(marcia).no % a resposta é não

Para responder à pergunta, Prolog tentar fazer um pattern matching entre a

pergunta e os fatos da base de dados. A pergunta é um objetivo que Prolog tenta

verificar como verdadeiro ou satisfazer.

O não (a resposta no) não deveria ser interpretado como a não verdadeira (o

false), pois significa que não é provável, uma vez que pode por exemplo faltar

informações na base de dados.

7.1 Uso das Variáveis

As últimas perguntas não são muito interessantes. Um outro tipo de pergunta

à base pode ser por exemplo: “Quem gosta de flores?”

Para exprimir tal pergunta é preciso usar uma variável, a qual Prolog vai

tentar identificar:

?- gosta(X,flores).

Esta é uma indicação a Prolog de procurar na base de dados todas as

instâncias possíveis (os objetos) de X que satisfaçam esta afirmação.

14

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Para fazer a diferença entre os nomes dos objetos e as variáveis, Prolog usa a

convenção de que cada variável deve começar por uma letra maiúscula e (ao

contrário) o nome dos objetos deve começar por uma letra minúscula.

Exemplos de consulta:

%% Base de Fatos:

gosta(carlos,dançar).gosta(joao,maria).gosta(roberto,flores).gosta(roberto,dançar).

% Do que gosta João? ?- gosta(joao,X).X=maria

% Quem gosta de dançar??- gosta(X,dancar).X=carlos ;X=roberto

% Quais objetos ligados pelo predicado gostar?(quem gosta de que ?)

?- gosta(X,Y).X = carlos ,Y = dancar ;

X = joao ,Y = maria ;

X = roberto ,Y = flores ;

15

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

X = roberto ,Y = dançar

Essas perguntas vão procurar na base todos os objetos que são ligados pelo

relacionamento (predicado) indicado.

7.2 Conjunção

Podemos combinar objetivos na mesma pergunta. Para exprimir a conjunção

é preciso separar os objetivos por uma vírgula (,).

Exemplo:

Suponhamos que temos a seguinte base de dados:

%% Base de Fatos

gosta(adriana,nadar).gosta(silvio,nadar).gosta(rodrigo,nadar).gosta(roberto,flores).gosta(joao,maria).gosta(juliano,flores).gosta(roberto,dancar).

mora(adriana,fortaleza).mora(silvio,sao_luis).mora(mauro,recife).mora(juliano,sao_luis).mora(roberto,belem).mora(sara,sao_luis).

Figura 1. Exemplo de Base de Dados Prolog

16

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Para responder a pregunta : “Quem são os ’ludovicentes’ que gostam de flores?”, escrevermos:

?- gosta(X,flores), mora(X,sao_luis).X = juliano

Para responder a tal pergunta Prolog tenta satisfazer todos os objetivos, em

ordem.

17

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

8. Técnica de Busca do Motor Prolog

Para simular o trabalho do motor Prolog respondendo à pergunta: “Quem

gosta de flores e mora em São Luís?” mostramos a seguinte árvore:

| ?- gosta(X,flores), mora(X,sao_luis).X = juliano

Figura 2. Simulação de uma busca em Prolog

Qual é a estratégia de busca aplicada por Prolog?

18

gosta(X,flores)mora(X,sao_luis)

X=robertomora(X,sao_luis)

X=robertoX=silvio

X=robertoX=juliano

X=robertoX=sara

X=julianomora(X,sao_luis)

X=julianoX=silvio

X=julianoX=juliano

X=robertoX=sara

fail fail fail fail sucesso fail

Backtracking(retrocesso)

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

9. Uso das Regras

Os fatos definem relacionamentos entre objetos específicos.

Sejam os seguintes fatos:

cerveja(antarctica).cerveja(kaiser).cerveja(brahma).cerveja(cerpa).cerveja(heinecken).

pessoa(leonardo).

Suponhamos agora que nós queremos exprimir o fato que Leonardo gosta de

todos os tipos de cerveja :

Uma solução seria de introduzir os fatos um a um :

gosta(leonardo,antartica).gosta(leonardo,kaiser).gosta(leonardo,brahma).gosta(leonardo,cerpa).gosta(leonardo,heinecken).

No entanto, esta solução não é muito prática.

Prolog usa o conceito de regras para representar esse tipo de informação.

Uma regra é uma generalização das afirmações sobre os objetos do universo da

aplicação.

19

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Exemplo:

Na linguagem natural, para exprimir uma regra usamos a palavra “Se”:

X é um pássaro se X é um animal que tem asas.X e Y são irmãos se eles tem os mesmos pais.

Leonardo gosta de Y se Y é uma cerveja.

Em Prolog, o se (o if) é representado pelo símbolo :-

Escrevemos, então:

gosta(leonardo,X) :- cerveja(X).passaro(X) :- animal(X), tem(X,asas).

avo(X,Y) :- pai(X,Z), pai(Z,Y). % usando a conjunção

Semântica:

X é o avô de Y, se existe uma pessoa Z, tal que X é o pai de Z e Z é o pai de Y.

Uma regra pode ser expressa em termos da disjunção dos fatos:pais(X,Y) :- pai(X,Y);

mãe(X,Y). % usando a disjunção

% X é pai de Y, se X é a mãe de X ou X é o pai de Y.

Atenção: A disjunção é geralmente expressa, dividindo-se

a regra em duas:

pais(X,Y) :- pai(X,Y).pais(X,Y) :- mae(X,Y).

As regras são chamadas cláusulas, eles permitam de inferir novos fatos.

20

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Aplicação:

Exprima as seguintes relações e clausulas em Prolog.

1. Chirac é o presidente da França.2. Irmão.3. Primo.4. O inimigo de um amigo é um inimigo.5. Sara gosta de todos os gaúchos.6. Os professores ficam satisfeitos quando seus alunos são dedicados.7. Onde moram todos os que gostam da música ?

21

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE III. ESTRUTURAS DA LINGUAGEM

22

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

10. Constituintes elementares

Temos os termos e as relações.

10.1 Termos

Um termo da linguagem Prolog representa um objeto do universo do

problema. Um termo pode ser um objeto desconhecido:

- uma variável ou um objeto concreto

- ou um átomo.

10.1.1 Átomos

Um átomo (ou constante) representa, portanto, um objeto específico do

universo do problema.

Existem os átomos numéricos, alfanuméricos, quotados e especiais:

Átomos Numéricos:Os inteiros: 125 -30 425 +24 0NB. Em LPA Prolog os inteiros são representados em 4 bytes ⇒ ∈ [-2147483648..2147483647].

E os reais: 3.14159 -10.8 5.003E3 -2.5e24NB. Em LPA Prolog os reais são representados em 8 bytes ⇒

∈ [2.2e-308..1.7e308].

Átomos Alfanuméricos:

Começa por uma letra minúscula e é composto por letras (maiúsculas ou minúsculas), dígitos numéricos (0-9), o underscore e alguns caracteres especiais.

23

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Exemplos: pai imposto_de_Renda mora amar nome2

Átomos Quotados:

Universidade' '524' 'Olho d''Agua' 'urbano'

Átomos Especiais:

! ; , [] {}

10.1.2 Variável

Uma variável é um átomo representando um objeto desconhecido do universo

do problema. O nome de uma variável é uma seqüência de alfanuméricos que

começa por uma letra maiúscula (de A até Z) ou um underscore ( _ ).

Exemplos: Pessoa Disciplina_2 X var A1, _altura

Variável anônima:

É o underscore (_) usado sozinho.

Quando usamos a variável anônima, Prolog não vai tentar instanciá-la.

A noção de variável é muito importante, pois em uma pergunta o motor

Prolog tenta buscar os valores que satisfaçam as variáveis da relação.

| ?- homem(X).X = joao ;X = roberto

24

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Observação:

Prolog não tenta buscar os valores de uma variável anônima.

| ?- gostar(X,_). % quem gosta de alguma coisa?

X = joao ; % sem precisamos saber do que é?X = joao

10.2 Relações

Uma relação (ou termo funcional ou regra) possui a forma:

f(t1, t2, t3, ..., tn)

onde: - f é um símbolo funcional e

- t1, ..., tn um conjunto de termos e/ou relações.

Exemplos: idade(karine,24) homem(ricardo) g(X,_,10) aridade (grau) 2 aridade 1

Relações compostas: pessoa(carlos, 22, (cohama, sao_luis)).

pessoa(roberto,21,endereco(8,’rua 1’,centro)).

25

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

11. Cláusulas

Uma cláusula é uma afirmação da forma:

T :- Q1, ..., Qn.

Onde: T é a cabeça da cláusula, e

Q1, ..., Qn o corpo da cláusula.

Uma cláusula pode ser uma afirmação certa ou condicional (regra):

Afirmação condicional:

Uma cláusula é uma afirmação condicional (ou regra) se:

T ≠ ∅ e {Q1, ..., Qn} ≠ ∅

Exemplo: mesmo_pai(X,Y) :- pai(P,X), pai(P,Y).

A semântica informal dessa é: se todos os termos funcionais do corpo são

verificados (verdadeiros) então o átomo da cabeça é verdadeiro.

:- é a implicação lógica, é o AND lógico.; é o OR lógico.

Afirmação incondicional (certa):

Uma cláusula é uma afirmação incondicional (ou certa) se:

T ≠ ∅ e {Q1, ..., Qn} = ∅ exemplo: gosta(juliano,cantar).

Pergunta:

Quando a cabeça é vazia (T=∅), então a cláusula é uma pergunta.

26

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

exemplo: ?- gosta(X, cantar). % quem gosta de cantar?X=juliano

gosta(X,nadar), pai(Y,X). % Quais os pais das pessoas quem gostam de nadar ?

X = joao , Y = roberto ;

27

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

12. Representação dos Objetos Prolog

A estrutura básica que Prolog utiliza para representar seus objetos é a

estrutura de árvore.

Qualquer cláusula Prolog pode ser representada sob a forma de uma árvore.

T :- Q1, ..., Qn.

é representada da seguinte maneira:

Q2

T

Q1 Qn...

Tal árvore é chamado árvore de prova (proof tree).

28

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

13. Algoritmo de Unificação de Robinson

Para solucionar uma pergunta, o motor Prolog é baseado no algoritmo de

unificação de Robinson.

Para unificar dois termos T1 e T2, o motor calcula o unificador mais genérico

de T1, T2.

Exemplo: Para responder a pergunta: “Quem é a mãe de João?”, escrevemos:

mae(X, joao). % e a resposta de Prolog é:

X=maria

Isto é o resultado da unificação dos duas árvores:

maria joao X joao

mae mae

A unificação dessas duas arvores implicaque X deve ser igual a maria

Versão Simplificada do Algoritmo de Robinson:

Unificar (E1, E2)Se E1 ou E2 é um átomo, então seja E1 o átomo (trocar E1 e E2 se precisa)

Se E1 = E2 então retornar yes

29

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Se E1 é uma variável, Retornar E1=E2Se E2 é uma variável, retornar E2=E1Senão retornar no (insucesso)

Senão Seja F1 o 10 elemento de E1 e T1 o resto F2 o 10 elemento de E2 e T2 o resto

Z=unificar(F1,F2)Se Z=no, retornar noSenão unificar (T1,T2).

30

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

14. Pacote (packages)

Um Programa Prolog é uma conjunto de cláusulas ordenadas em pacotes.

Pacote:

conjunto de cláusulas que compartilham:

• o mesmo símbolo de predicado (a cabeça das clásulas) e

• a mesma aridade (o grau das cláusulas).

Duas regras do mesmo pacote são ligadas pelo ou lógico (o OR).

exemplo: pais(X,Y) :- pai(X,Y).pais(X,Y) :- mae(X,Y).

Observação:

p :- a1, a2, a3.P :- b1, b2,.

Isto significa:

(a1 and a2 and a3) or (b1 and b2) ⇒ p

31

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

15. Estrutura de um programa Prolog

Um programa Prolog é organizado da seguinte forma:

Programa: conjunto de pacotes

Pacote: conjunto de cláusulas (do mesmo predicado, mesma aridade)

Cláusula: átomo_lógico.

| átomo_lógico :- átomo_lógico,..., átomo_lógico.

Átomo_lógico: símbolo_de_predicado

| símbolo_de_predicado(termo,..., termo)

Termo: átomo (ou constante)

| variável

| símbolo_funcional (termo, ..., termo) % ou relação

32

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

16. Algumas Definições

SubstituiçãoÉ a função:

{variáveis} → {conjunto dos termos}

Instância

Imagem de um termo (átomo, cláusula) por uma substituição.

(é o resultado da substituição das variáveis).

Unificação

Dois termos T1 e T2 são unificáveis se existe uma substituição s tal

que s(T1)=s(T2).

exemplo: f(X,b) e f(a,Y) são unificáveis quando

s={X=a,Y=b}

Denotação de um programa

A significação lógica de um programa Prolog P é definida por sua

denotação DEN(P).

DEN(P) é o conjunto de átomos que são derivados logicamente de

P. Isto é (geralmente) um conjunto infinito.

Uma resposta Prolog a uma pergunta A é o conjunto S das instâncias

de A pertencendo a denotação de P: DEN(P).

33

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

17. Significação Operacional

Dado um objetivo a demostrar, o motor Prolog tenta calcular todas suas

instâncias pertencentes à denotação do programa.

Princípio:

Percorrer em profundidade, da esquerda para direta, a árvore de busca.

Escolher as regras a partir do primeiro pacote do programa.

Escolher as folhas a partir da esquerda.

Observação:

A ordem das regras nos pacotes e a ordem dos átomos nas cláusulas é

muito significativa.

34

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

18. Uma Visão Procedural de Prolog

Podemos fazer um “mapeamento” entre a estrutura de um programa Prolog e

a programação Procedural:

Pergunta: é uma chamada a um procedimento (procedure call)

Unificação: é a transmissão de parâmetros

Pacote: Procedimento (procedure)

Cláusulas: Definição dos procedimentos.

35

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE IV. CONTROLE

36

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

19. Introdução

O custo de percorrer toda árvore de busca é muito elevado. Portanto, é

necessário definir mecanismos para delimitar a busca, objetivando a eficiência, ou

seja, economizar tempo e espaço.

Um outro objetivo que motivou a definição das estruturas de controle é o

problema da expressão da negação.

Embora a escolha da ordem das cláusulas nos pacotes e da ordem dos átomos

nas cláusulas implique em um certo controle sobre a busca, temos a definição de

estruturas especiais de controle, principalmente o corte (o cut).

37

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

20. O cut

Notação: !

A chamada do cut sempre tem sucesso (nunca falha).

O cut não tem uma significação lógica. Mas tem como conseqüência a

modificação da árvore de busca: a chamada do cut proibia toda tentativa de busca

nos outros galhos da árvore de busca (as outras cláusulas do pacote).

Objetivos do uso do cut:

O cut é usado para delimitação do campo de busca e pode ter como objetivo:

• a busca determinística e a otimização (green cut) ou

• a modificação da semântica do programa (red cut).

20.1 Busca determinística (green cut)| ?- gosta(joao,X).X = nadar ;X = ia % neste caso a busca não é determinística.

| ?- gosta(joao,X),!.X = nadar

O cut aqui faz com que Prolog pare na primeira ocorrência de uma solução (é

a busca determinística).

Observação: Existe um predicado de LPA Prolog que faz isso: one.

exemplo: one(homem(X)). % é equivalente a: homem(X),!.X=joao

38

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

20.2 Otimização (green cut)

Para evitar a busca inútil ou infinita.

herdar(X,Y) :- ako(X,Y), !.herdar(X,Y) :- ako(X,Z), herdar(Z,Y).

é melhor do que escrever:

herdar(X,Y) :- ako(X,Y).herdar(X,Y) :- ako(X,Z), herdar(Z,Y).

20.3 Modificação da semântica (red cut)

min(X,Y,X) :- =<(X,Y), !.min(X,Y,Y).

% se X é ≤ a Y então o min é X senão o min é Y.

39

akoako

...

akoako

lazeres

esporte

música

pPop

cinema

artes_marciais

isa

...

...

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

21. O Fail

O predicado predefinido fail, encontra a falha da busca e provoca o

backtracking (retrocesso) para reavaliação do objetivo, ou seja, para procurar

novas soluções.

O fail é usado, geralmente, com o cut.

Exemplo:

Para representar esta afirmação: “João não gosta de artes marciais”

escreve-se:gosta(joao,X) :- isa(X,C),

herdar(C,a_marciais), !, fail.

gosta(joao,X).

40

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

22. Outras estruturas de controle

Objetivo1 -> objetivo2 % se objetivo 1, então objetivo 2.

Esta estrutura permite representar as regras de produção.

Ela é definida como seguinte:

o1 -> o2 :- o1, !, o2.

Exemplo:

read(N), >=(N,0), =<(N,10) -> write('Nota valida').

Objetivo1 -> objetivo2; objetivo3.

Para exprimir a estrutura “Se ... Senão ... ” :

Se objetivo 1 é verdadeiro, então objetivo 2, senão objetivo 3.

Exemplo: Cálculo do mínimo entre dois números.

min(X,Y,M) :- X =< Y -> M is X; M is Y.

Tal estrutura é definida da seguinte maneira:

o1 -> o2; o3 :- o1, !, o2.o1 -> o2; o3 :- o3.

41

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

23. Negação

Infelizmente, em Prolog, podemos somente definir a sentença verdadeira.

Todo fato exprimido é considerado como verdadeiro: jovem(sandra).

não(A) ∉ DEN(P)

Um solução para definição da negação é a negação por falha: uma

propriedade que não podemos demonstrar é considerada como falsa (hipótese do

mundo incluso ou mundo fechado).

nao(P) :- P, !, fail. % para qualquer termo Pnao(P).

Prolog implementa este operador: not.A negação não aceita variáveis ⇒ não podemos escrever: not(homem(X)).

Exemplo de uso:

homem(joao).yes

nao(homem(joao)).no

nao(nao(homem(joao))).yes

Críticas:

42

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

• Trabalha em um mundo incluso (fechado).

• O not não possui uma semântica clara:

Exemplo:

homem(joao).homem(roberto).adulto(roberto).

?- homem(X), not(adulto(X)).X=joao

?- not(adulto(X)), homem(X).no

43

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE V. OPERAÇÕES

44

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

24. Operações Relacionais

< menor 2<3. yes ou <(2,3).=< menor ou igual *

> maior

>= maior ou igual

= igualdade 7=7. yes ou =(7,7).

Para as expressões:

=:= igualdade de expressões (3*2)=:=(5+1). yes(3*2)=(5+1). no7=:=7. ?

=\= diferente(ou \=, e az vezes <>)

Exemplos: a cláusula maior:

maior (X,Y) :- X > Y.

maior(7,5). yes

a cláusula nota_valida:

nota_valida(X) :- (X>=0), (X=<10).

nota_valida(10.5). no

45

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Comparação dos termos:

Podemos também comparar termos (expressões), basta preceder o operador

relacional do átomo especial @ :

bernardo @> adriano. yes

bernardo == bernardo. yesbernardo \= adriano. yes

Para as listas também:

[a,b,c] @>= [a,b,c]. yes[a,e] @> [a,b,2]. yes[a] @> [1]. yes

[a,b,c] = = [a,b,c]. yes

A comparação é feita sobre os códigos (ASCII) entre os elementos dos

termos da esquerda para a direita.

46

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

25. Operações Aritméticas

+ adição

- subtração

* multiplicação

/ divisão

mod resto da divisão inteira

(exp. 7 mod 2 = 1 e 7 / 2 = 3.5)

X is Expressão Atribuição dos valor da expressão para variável local X.Expressão é uma expressão aritmética.

Exemplo: a cláusula média:

media (X1,X2,M) :- M is (X1 + X2) / 2.media(6,8,Res). Res=7.

Exemplos de implementação de funções matemáticas:

f(x)=2*X2 +3*X –1f(A,Res) :- Res is 2*A*A+3*A-1.

f(-1,X)X=-2

47

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

26. Exercícios

1. Defina a função fatorial.

fat(0,1) :-!. % caso N=0 não é preciso explorar a regra 2fat(N,F) :- N1 is N-1, fat(N1,Y), F is Y*N.

fat(5,X).X=120

Esta solução é melhor do que escrever:

fat(0,1).fat(N,F) :- N \= 0, N1 is N-1,

fat(N1,Y), F is Y*N.

2. Defina a função fib:

fib(0)=1;fib(1)=1;fib(n)=fib(n-1) + fib (n-2).

48

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE VI. ESTRUTURA DAS LISTAS

49

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

27. Listas

É a melhor forma, em Prolog, para estruturação e manipulação de dados.

A notação da base é um pouco complicada:

.(termo, lista)

Mas existe uma notação simplificada:

[t1, t2, t3, ..., tn] n>=0

exemplos: [a,b,c,i,h] [5,2,8,0,1]

Quando n =0, a lista é vazia: []

Uma lista tem duas partes:

• A cabeça e

• O corpo (o resto).

Como conseqüência, existe uma outra notação:

[X|Y] onde X é a cabeça e Y é o corpo.

exemplo: lista([2,3,8,1]).

?- lista([A|B]).A=2, B=[3,8,1]

Listas compostas:

[[uma,lista,composta],a,b,[4,6,9],c]]

50

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Cabeça e Corpo:

Como acabamos de mostrar, uma lista pode ser anotada como: [X|Y]Onde X é a cabeça e Y o resto (o corpo).

Por exemplo: A lista [A|B] pode ser unificada com a lista [4,3,2,1,9,0]

Dando: A=4 e B=[3,2,1,9,0]

Existe uma outra notação derivada:

[X,Y,Z|L]unificada com uma lista, retorna seu primeiro termo (X), segundo (Y), terceiro (Z) e o resto da lista (L).

Exemplo:lista([4,3,2,1,9,0]).

lista([A,B,C|L]).A=4, B=3, C=2 e L=[1,9,0]

51

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

28. Operações básicas sobre as listas:

Concatenação de listas:

append append(L1,L2,L).Concatena duas listas.

append([a,b,c],[1,2],X).X=[a,b,c,1,2]

Geração:

append(A,B,[a,b,c]).A = [] ,B = [a,b,c] ;

A = [a] ,B = [b,c] ;

A = [a,b] ,B = [c] ;

A = [a,b,c] ,B = []

Tamanho de uma lista

length(termo, comprimento)

retorna o comprimento de uma lista.

52

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

length([1,3,5,2],C)C=4

length([5,[a,b,c],2],C)C=3

Atenção: Não confundir length e len, len retorna o comprimento de

um termo.len(sarah, C).C = 5

Membro

member(Elemento, Lista).

member(2,[3,2,4,1]).yes

Remoção

remove(Elemento, Lista, Resto)removeall(Elemento, Lista, Resto)

para remover uma ocorrência de um elemento ou todas as ocorrências.

| ?- remove(4,[3,4,1,5,4],L).L = [3,1,5,4] ;L = [3,4,1,5] ;

53

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

removeall(4,[3,4,1,5,4],L).L = [3,1,5]

Reverter

reverse(Lista, List_Invertida)Para reverter uma lista.

reverse([2,3,1],L).L = [1,3,2]reverse([1,2,[a,b,c],3],X).X = [3,[a,b,c],2,1]

54

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

29. Exercícios

1. Implementar em Prolog todos esses predicados.

2. Definir o predicado palindromo sobre as listas.

3. Ordenar uma lista de diferentes maneiras.

55

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE VII. ENTRADAS E SAÍDAS

56

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

30. Entradas

A principal

read(X) ler uma entrada a partir do teclado e atribuir a ela a variável X.read(X).|: 5.X=5

Observe que a entrada deve terminar com um ponto (.).

Para entrar uma frase é preciso delimitá-la por apóstrofos:| ?- read(X).|: 'A via e boa'.X = ' A via e boa '

read(termo) ler uma entrada a partir do teclado e comparar com o

termo.read(domingo).|: domingo.yes

Outras

get(X) ler um caractere a partir do teclado e atribuir seu código ASCII a X.

| ?- get(X).|: AX = 65 % o código ascii do caractere A é 65

57

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

(o get0 faz a mesma coisa, só que o get não considera os caracteres em branco)

58

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

31. Saídas

A principal

write('Tchau!'). % Imprimi uma mensagem na tela .write(tchau).

Se a mensagem é composta, é preciso usar os apóstrofos.

write(A). % Imprimi na tela o conteúdo da variável A.

Outras

put(X) pega um inteiro X (entre 0 e 255) e imprimi os

caracteres correspondentes ao código ascii X.

| ?- put(65).A

display(X) | ?- write(2-1).2 - 1

| ?- display(2-1).(-)(2,1)

Diferente do write (que aguarda a ordem da

expressão para imprimir), o display imprimi uma

expressão na ordem de execução do Prolog.

skip(X) ler a partir do teclado até encontrar o caracter de

código ascii especificado: o inteiro X.

| ?- skip(65).

59

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

|: 6|: .|: a|: Ayes

Formatações:nl nl (new line) para pular uma linha.

tab(X) para pular X brancos.

Exemplo:

go :- write('Seu nome? '), read(Nome), nl, write('Oi'), tab(2), write(Nome),

nl.

| ?- go.Seu nome? |: samy.

Oi samy

60

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE VIII. ESTRUTURAS DE REPETIÇÃO

61

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

32. Repeat

O repeat provoca a repetição da execução da próxima cláusula até que a

condição seja verificada.

Exemplo:

leia :- repeat, read(N), N=5.% neste caso a condição é N=5.

Isto implica que leia vai ser repetida até que o usuário entre com o valor 5.

Repeat é definido como seguinte:

repeat.

repeat :- repeat.

62

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PARTE IX. MANIPULAÇÃO DE ARQUIVOS

63

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

33. Saída Padrão

Um arquivo pode ser usado para leitura:

• arquivo de entrada

• ou para escrever arquivo de saída.

Criação e Abertura de arquivos de saída

tell(arq). Abre um arquivo de saída. Se o arquivo não existe,

então o tell irá criá-lo.

tell(meu_arq).yes

?- tell('exemp.dat').yes

telling(X). Retorna o nome do último arquivo de saída aberto (a

saída atual).

| ?- telling(X).X = 'c:\pro386w\meu_arq'

telling(arq). Verifica se o arquivo é o arquivo de saída atual.

| ?- telling('c:\pro386w\meu_arq').yes

| ?- telling(meu_arq).no

64

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

Por defaut, a saída padrão é o monitor, chamada user:

| ?- telling(X).X=user

Dicionário dos arquivos abertos

fdict(X). Retorna o dicionário (a lista) dos arquivos abertos.

| ?- fdict(X).X=['c:\pro386w\meuarq', 'c:\pro386w\exemp.dat']

Fechar os arquivos de saída abertos

told. O told retorna à saída padrão (user).

Portanto ele fecha o último arquivo de saída aberto.

told.telling(X).X=user

65

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

34. Entrada Padrão

see(arq). Abre um arquivo arq para entrada.

see(meu_arq).yes

seeing(X). retorna o nome do último arquivo de entrada aberto (a

entrada atual).

| ?- seeing(X).X = 'c:\pro386w\meu_arq'

seeing(arq). Verifica se o arquivo é o arquivo de entrada atual.

| ?- seeing('c:\pro386w\meu_arq').yes

| ?- seeing(meu_arq).no

Por defaut, a entrada padrão é o teclado, chamada

user:

| ?- telling(X).X=user

Fechar os arquivos de entrada abertos:

seen. Retorna à entrada padrão. Portanto, fecha o último

arquivo de entrada aberto.

66

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

seen.seeing(X).X=user

Fechar qualquer arquivo:

close(arq). Fechar um arquivo, seja de entrada ou de saída.

close(meu_arq).yes

close('exemp.dat').yes

67

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

35. Consulta de Bancos de Dados

Carregar arquivos de dados

Os fatos de um problema podem ser armazenados em um arquivo específico

de dados, por exemplo 'familia.dat'.

Para carregar tal arquivo na memória:

consult('familia.dat'). % por default a extensão do % arquivo é .pl

Quando o arquivo é modificado é preciso carregá-lo de novo. Um novo

consult carrega uma nova cópia na memória do computador (perto da

memória).

Por isso existe um outro predicado reconsult que carrega o novo arquivo

sem precisar ter uma nova cópia dele:

reconsult('familia.dat').

Listagem de pacotes:

listing(X). lista todas as relações de predicado X.

listing(homem)./* homem/1 */homem( joao ).homem( roberto ).yes

listing(avoo)./* avoo/2 */ avo( X, Y ) :-

68

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

pai( X, Z ), pai( Z, Y ).

Inserir novos fatos:

assert(X). Para inserir um novo fato X ou uma nova Regra.

assert(homem(juliano)).yes

assertz(homem(junior)).yes % inserir no final do pacote

homem

asserta(homem(adriano)).yes % inseri no início do pacote homem

listing(homem)./* homem/1 */homem( adriano ).homem( joao ).homem( roberto ).homem( juliano ).homem( junior ).yes

Remover fatos:

retarct(X). remova o fato X da base.

69

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

36. Definição

Extensão das gramáticas algébricas, objetivando fornecer uma linguagem de

especificação de gramáticas da linguagem.

A DCG é uma classe de programas Prolog que tem a vantagem de fornecer

um especificação executável.

A implementação é muito simples em Prolog, graças a unificação.

70

A Linguagem Prolog - Prof. Dr. Sofiane Labidi

PRTE X. PROJETOS

71