Beruflich Dokumente
Kultur Dokumente
PROLOG
Prof. Reinaldo Augusto da Costa Bianchi
Profa. Anna Helena Reali Costa Rillo
Verso 2.1
- 1999 -
Sumrio
1.
INTRODUO...............................................................................................................................................2
0
1.1
1.2
1.3
2.
APLICAES...............................................................................................................................................2
PROLOG E OUTRAS LINGUAGENS................................................................................................................2
TURBO PROLOG E VISUAL PROLOG...........................................................................................................3
CONCEITOS BSICOS................................................................................................................................3
2.1
2.2
2.3
3.
FATOS.........................................................................................................................................................3
QUESTES..................................................................................................................................................4
UNIFICAO...............................................................................................................................................5
TURBO PROLOG..........................................................................................................................................5
3.1
3.2
3.3
3.4
3.5
4.
O RETROCESSO (BACKTRACKING).....................................................................................................9
5.
REGRAS........................................................................................................................................................11
5.1
5.2
5.3
6.
ENTRADA E SADA....................................................................................................................................14
7.
CONTROLE DO RETROCESSO..............................................................................................................16
7.1
7.2
7.3
8.
FALHA (FAIL)..........................................................................................................................................16
CORTE (CUT)..........................................................................................................................................17
MTODO DO CORTE E FALHA (CUT AND FAIL)........................................................................................19
RECURSO..................................................................................................................................................20
8.1
9.
LISTAS...........................................................................................................................................................21
1.
INTRODUO
Alguns fatos sobre Prolog:
O termo Prolog derivado da expresso Programming in Logic, uma vez que
baseado em Lgica de Predicados de 1a ordem.
Foi criado em 1973, na Universidade de Marseille, Frana.
1
1.1
APLICAES
Principais aplicaes se do na rea de computao simblica:
Lgica matemtica, prova automtica de teoremas e semntica;
Soluo de equaes simblicas;
Bancos de dados relacionais;
Linguagem Natural;
Sistemas Especialistas;
Planejamento Automtico de Atividades;
Aplicaes de General Problem Solving, como jogos (Xadrez, Damas, Jogo da
Velha, etc.);
Compiladores;
Anlise Bioqumica e projetos de novas drogas.
1.2
1.3
Turbo Prolog a linguagem que ser utilizada no curso. Foi criada pela Borland e hoje
desenvolvida e comercializada pelo Prolog Development Center, na Dinamarca.
Turbo Prolog diferente do Prolog padro assim com Turbo Pascal diferente do Pascal
e Turbo C diferente do C ANSI. O Visual Prolog uma implementao para Windows do
Turbo Prolog, tambm da PDC.
A maioria das diferenas est relacionada com programao avanada e visa facilitar a
compilao de programas. Ainda, o Turbo Prolog possui diversas bibliotecas prontas, como as
matemticas e grficas (BGI).
Existem outras implementaes de Prolog, sendo as mais conhecidas o ARITY Prolog e
o SWI Prolog.
2.
CONCEITOS BSICOS
2.1
FATOS
Exemplo 1:
Argumento do Predicado,
com vrios Objetos
3
2.2
QUESTES
Uma questo escrita da mesma maneira que um fato, sendo diferenciada pelo
interpretador ou por sua colocao em um local previamente definido e separado dos fatos,
como no Turbo Prolog, ou por possuir um ponto de interrogao na frente, como no Prolog
definido por Clocksin e Mellish.
Quando uma questo feita, o Prolog realiza uma busca na Base de Conhecimento,
procurando um Fato que seja igual ao da questo.
Dizemos que dois fatos (ou um fato e uma questo) so unificam (so iguais) se:
1. seus predicados so os mesmos,
2. eles possuem o mesmo nmero de argumentos e,
3. os argumentos so iguais.
Se o Prolog encontra um fato que se iguala a questo, ele retorna YES, indicando
que a questo tem resposta verdadeira; caso contrrio, ele retorna NO.
OBS: O Prolog retornar NO toda vez que no conseguir igualar a questo a um
fato da Base de Conhecimento. Isso implica que se nada for declarado sobre um
determinado problema, qualquer questo relacionada a ele retornara como NO.
2.3
UNIFICAO
Unificao o nome dado ao processo que tenta casar um objetivo (goal) com uma
clusula, que inclui a busca, o casamento de padres (pattern-matching) e as instanciaes
(Yin, 1987). A unificao o elemento bsico do interpretador ou compilador Prolog.
Basicamente, dizemos que a unificao teve resultado positivo se os objetos envolvidos
na comparao so idnticos ou se as clusulas possuem variveis que podem ser instanciadas.
Caso contrrio, dizemos que a unificao falhou.
3.
TURBO PROLOG
3.1
Um programa escrito em Turbo Prolog dividido em vrias partes, cada uma com um
propsito especfico. Estas partes so:
DOMAINS: parte onde so declaradas as diferentes classes dos objetos usados pelo
programa. A declarao das classes dos objetos pode ser vista como uma definio dos tipos
de todos os objetos a serem usados no programa.
Exemplo 2:
tipo_pessoa = symbol
Domnio
Valores
Exemplos:
char
todos os caracteres
a, b, @
integer
de -32768 32767
1, 2, -67, 7643
real
de 1e(-307) 1e(308)
6.02e(23), - 64556
string
symbol
uma seqncia de letras, dgitos, e traos, maria, jose, p1999, manoel, flores,
com o primeiro caracter em minsculo. maria_fumaa, Alice, Anna
Tambm pode ser uma seqncia entre Rillo, dia_d.
aspas duplas.
file
exer01.pro, teste.txt
/* um fato */
/* uma regra */
GOAL: a chamada meta, o objetivo do programa. uma questo que vai dar incio ao
programa. O objetivo pode ser interno ou externo. Ele interno se for definido dentro do
corpo do programa, e externo, quando definido interativamente, atravs da formulao de
questes na janela de dilogo.
Exemplo 5:
gosta (joo, maria).
DATABASE: parte usada para declarar os predicados usados por um banco de dados
dinmico em um programa. necessria somente quando se utiliza bancos de dados
dinmicos.
NOTA: Comentrios podem ser inseridos em um programa com os delimitadores /* e */.
As partes Domains, Predicates e Clauses so necessrias a todo programa e a
declarao do objetivo interno necessria somente quando se deseja compilar o programa.
O Turbo Prolog no diferencia letras maisculas de minsculas, a no ser em smbolos,
onde os iniciados por maiscula so considerados variveis. Para criar uma padronizao,
aconselha-se a escrever os programas usando sempre letra minscula, deixando as letras
maisculas somente para as variveis.
3.2
PRIMEIRO PROGRAMA
Abaixo, temos um exemplo de um programa simples em Prolog. Note que ele possui as 3
partes bsicas (Domains, Predicates e Clauses). Esse exemplo muito conhecido e foi
proposto no livro de Clocksin e Mellish (1984):
Exerccio 1: Exemplo de Clocksin e Mellish (1984).
/*
* EE - 097
* Exerccio 01
*/
domains
tipo_nome = symbol
predicates
gosta(tipo_nome, tipo_nome).
clauses
gosta
gosta
gosta
gosta
(jos, peixe).
(jos, maria).
(maria, livro).
(joo, livro).
Adicione outros predicados ao programa, como por exemplo fica, ama, odeia.
3.3
CONJUNES
Uma conjuno (E Lgico) feita colocando-se uma vrgula entre os goals.
Exerccio 2: Conjuno. Se quisermos saber se joo gosta de maria e maria gosta de joo,
fazemos a seguinte questo para o Prolog:
gosta (joo, maria), gosta (maria, joo).
Verifique a resposta.
A resposta programa ao goal total ser YES se toda a seqncia de goals for satisfeita.
NOTA: J podemos observar que o Prolog basicamente uma busca em uma Base de
Conhecimento por fatos que se igualem a questo.
3.4
VARIVEIS
Uma varivel em Prolog sempre comea com uma letra maiscula.
Uma varivel pode estar instanciada ou no-instanciada. Dizemos que ela est
instanciada quando estiver assumindo o valor de um objeto e, caso contrrio, no-instanciada.
Exemplo 6: Considere a seguinte Base de Conhecimento:
gosta (joo, flores).
gosta (joo, maria).
gosta (paulo, maria).
predicates
aluno(tipo_nome).
clauses
aluno(benedicte).
aluno(alice).
aluno(marcelo).
aluno(andr).
aluno(roberto).
3.5
ARIDADE
Aridade
4.
O RETROCESSO (BACKTRACKING)
(maria, comida).
(maria, vinho).
(joo, vinho).
(joo, maria).
realizada a questo:
gosta (maria, X), gosta (joo, X).
(maria, comida).
(maria, vinho).
(joo, vinho).
(joo, maria).
Inicialmente, a procura por uma soluo para o primeiro sub-goal bem sucedida, com a
varivel X sendo instanciada com o objeto comida.
Em seguida, o Prolog tenta encontrar um fato que satisfaa o segundo sub-goal. Como a
varivel X j est instanciada, o fato que ele procura : gosta (joo, comida)..
o Prolog procura outro valor para a varivel. No caso, ele encontra o valor vinho.
gosta (maria, X), gosta (joo, X).
10
gosta
gosta
gosta
gosta
(maria, comida).
(maria, vinho).
(joo, vinho).
(joo, maria).
5.
REGRAS
mulher
me
genitor
pai
genitor
homem
homem
genitor
genitor
homem
genitor
Z
av
genitor
irmo
Pai:
Av:
Av:
Irmo:
Irm:
Outros predicados: primo, prima, tio, filho, sobrinho, sogro, sogra, genro, etc.
5.1
/*
* EE - 097
* Exerccio 05
*/
domains
12
tipo_nome = symbol
predicates
homem (tipo_nome).
mulher (tipo_nome).
genitor(tipo_nome, tipo_nome).
irm (tipo_nome, tipo_nome).
Clauses
/* fatos */
genitor (jaques, benedicte).
genitor (miriam, benedicte).
genitor (jaques, carolina).
genitor (miriam, carolina).
mulher (miriam).
mulher (benedicte).
mulher (carolina).
homem (jaques).
/* regras */
irm (X, Y) :- genitor (Z, X),
genitor (Z, Y),
mulher (X),
X <> Y.
5.2
Nas regras tambm ocorre o retrocesso: caso um sub-goal no seja satisfeito, o Prolog
tenta modificar o valor das variveis instanciadas para procurar uma resposta vlida.
13
A diferena entre se fazer uma questo com valores especificados e uma questo com
variveis que no segundo caso as variveis da regra que correspondem s variveis no
instanciadas na questo, continuaro no instanciadas, permitindo o retrocesso.
Exerccio 6: Para a mesma Base de Conhecimento acima, faa as seguintes questes:
irm (benedicte, Quem).
5.3
DISJUNO (OU)
6.
ENTRADA E SADA
14
READLN: usado para ler uma string ou um smbolo do dispositivo padro de entrada,
geralmente o teclado, e guard-lo em uma varivel. O Turbo Prolog possui vrios predicados
de leitura, um para cada tipo de objeto a ser lido. Os outros predicados usados so:
READINT: para a leitura de um nmero inteiro.
READCHAR: para a leitura de um caracter.
READREAL: para a leitura de um nmero em ponto flutuante.
Exemplo 11:
readln (Nome).
readint (Dia).
Exerccio 9: Adicione ao programa do exerccio 03, uma regra que leia um nome digitado pelo
usurio, procure o nome na Base de Conhecimentos e imprima Encontrei ou No
encontrei.. Usar um goal interno para executar o programa.
15
7.
CONTROLE DO RETROCESSO
7.1
FALHA (FAIL)
fail.
7.2
CORTE (CUT)
de um corte no podem ser desfeitas aps a passagem da busca do Prolog para o lado direito
do corte.
Por exemplo, na regra
teste :- a, b, c, !, d, e, f.
o Prolog tenta satisfazer os sub-goals a, b e c, podendo realizar o backtracking entre
essas clausulas at que c seja satisfeita, o que causar a passagem da busca do Prolog da
esquerda para direita do corte. Depois dessa passagem, o Prolog pode tentar satisfazer as
clausulas d, e e f, tendo ou no que realizar o backtracking para isso, at o momento que a
clausula d falha. Nessa hora, no mais possvel voltar para escolher outra unificao para a
clausula c e toda a regra teste falha.
Os cortes so chamados de verdes quando no mudam o resultado da busca ou
vermelhos quando mudam o resultado. O corte verde usado para eliminar os marcadores
do backtracking, ponteiros que ocupam espao na memria.
Exerccio 13: Corte verde. Os predicados abaixo definem a funo:
0 se x < 3,
f (x) = 2 se x 3 e x < 6
4 se x 6
/*
* EE - 097
* Exerccio 13
*/
domains
tipo_numero = integer
predicates
f(tipo_numero, tipo_numero).
clauses
/* regras
f(X,0) :f(X,2) :f(X,4) :-
*/
X < 3,!.
3 <= X, X < 6,!.
6 <= X,!.
18
Exerccio 14: Corte vermelho. Para definir a mesma funo f(x) usada no exerccio anterior,
usamos os predicados abaixo:
/*
* EE - 097
* Exerccio 14
*/
domains
tipo_numero = integer
predicates
f(tipo_numero, tipo_numero).
clauses
/* regras */
f(X,0) :- X < 3,!.
f(X,2) :- X < 6,!.
f(X,4).
7.3
aluno(benedicte).
aluno(alice).
aluno(marcelo).
aluno(andre).
aluno(roberto).
/* regras */
escreve_ate (Nome_final) :aluno (Nome),
write (Nome),
nl,
controle_do_corte(Nome, Nome_final),
!.
/* A regra abaixo falha provocando o backtracking,
ate que o nome corrente da busca seja igual
ao final, dado pelo usurio. Assim, ela substitui
o predicado fail neste programa. */
controle_do_corte(Nome_2, Nome_final_2) :Nome_2 = Nome_final_2.
8.
RECURSO
Outra mtodo muito usado para causar a repetio em programas escritos em Prolog a
recurso. Toda recurso composta por duas regras: a primeira, que define a condio de
parada da recurso; e a segunda, onde feita a chamada funo recursiva.
Exerccio 16: Clculo do Fatorial de um nmero.
/*
* EE - 097
* Exercicio 16
*/
domains
tipo_numero = real
predicates
fatorial (tipo_numero, tipo_numero).
clauses
/* regras */
/* A regra abaixo e' o teste da recursao.*/
fatorial (0, Resultado) :- Resultado = 1,!.
/* A regra abaixo gera as chamadas recursivas. */
fatorial (Numero, Resultado) :Numero_menos_1 = Numero - 1,
fatorial(Numero_menos_1, Resultado_parcial),
Resultado = Numero * Resultado_parcial.
20
Formule uma questo e utilize o Trace para verificar o funcionamento deste programa.
Explique qual a finalidade do corte no final da primeira regra.
8.1
A VARIVEL ANNIMA _
O Prolog permite a definio de uma varivel annima (chamada _) que pode ser
usada quando uma regra necessita em sua cabea de uma varivel que no ser usada em seu
corpo. Essa varivel muito usada porque o Turbo Prolog avisa automaticamente quando uma
varivel usada somente uma vez, e pode ser trocada pela varivel annima _. Ao se
trabalhar com listas, a varivel annima til e deve ser usada.
9.
LISTAS
Uma lista um conjunto ordenado de objetos, todos sendo do mesmo tipo de domnio.
Exemplo 12:
[1,2,3,4,5,6,7,8,9,10]
[alfa, beta, gama, delta]
[]
comprimento = 10
comprimento = 4
lista vazia
Uma lista delimitada pelos colchetes e seus elementos so separados por virgulas.
No Turbo Prolog, para que um fato ou uma regra possa ter uma lista como argumento,
deve-se definir nos Domains quais listas sero usadas no programa e de que tipo de objetos
essas listas sero compostas.
Exemplo 13: para definir um tipo que uma lista de inteiros, escreve-se:
tipo_lista_de_inteiros = integer*
onde o * que indica que lista_de_inteiros uma lista, composta por elementos do tipo
inteiro.
Exemplo 14: Se desejarmos criar uma matriz de inteiros, usamos:
tipo_vetor_de_inteiros = integer*
tipo_matriz_de_inteiros = tipo_vetor_de_inteiros*
Uma lista guardada na memria como uma rvore binria, onde o primeiro elemento
guardado junto com um apontador para o resto da lista. Assim, uma lista composta por duas
partes: a primeira, que o primeiro elemento da lista, chamado de cabea; e a segunda, que o
resto da lista, chamado de cauda. A tabela abaixo apresenta algumas listas com suas cabeas e
caudas.
21
Lista
Cabea
Cauda
[]
erro
erro
[a, b, c, d]
[b, c, d]
[b, c, d]
[c, d]
[a]
[]
Varivel
Unificao
[a, b, c]
X = [a, b, c]
Durante uma unificao de duas listas, a cabea de uma lista pode ser separada de sua
cauda com o uso do | (o caracter barra vertical, ou pipe).
Usando-se a lista [Cabea | Cauda] (onde Cabea e Cauda so duas variveis) para
receber uma lista em um argumento de uma clusula, em vez de uma nica varivel, a varivel
Cabea fica com o primeiro elemento da lista e a varivel Cauda com o resto da lista. Essa
separao feita durante a unificao das duas listas (a que est sendo passada e a lista
[Cabea | Cauda]).
Exemplo 16: Unificao de duas listas.
Lista 1
Lista 2
Unificao
[a, b, c]
[X | Y]
X = a, Y = [b, c]
[casa, pata]
[ X|Y]
X = casa, Y = [pata]
[a, b, c]
[X, Y]
No unifica
Lista 2
[[a, b] | Y]
[H | T]
[a, b]
[X, Y | Z]
[X, Y]
Unificao
22
Exerccio 19: Crie uma regra que procura um elemento em uma lista.
/*
* EE - 097
* Exercicio 20
*/
domains
tipo_nome = symbol
tipo_lista_de_nomes = tipo_nome*
predicates
concatena_listas
(tipo_lista_de_nomes,tipo_lista_de_nomes,tipo_lista_de_nomes).
clauses
/* regras */
/* concatena a primeira lista + a segunda na terceira.*/
concatena_listas ([],L,L).
concatena_listas ([N|L1],L2,[N|L3]) :concatena_listas (L1,L2,L3).
Faa uma questo passando como argumentos duas listas de smbolos e uma varivel.
Como funciona a concatenao? Verifique com o Trace.
Exerccio 21: Resolva o Problema dos Missionrios e Canibais.
Outros Exerccios: Implemente regras para o tratamento de listas que:
10.
1.
1.
1.
1.
1.
1.
1.
1.
ESTRUTURAS COMPOSTAS
At agora foram vistos predicados do tipo:
gosta ( reinaldo, o_iluminado).
25
Nvel 0
Data
Dia
Ms
Nvel 1
Ano
Pessoa
Nvel 0
Data
Dia
Ms
Nvel 1
Ano
Nvel 2
11.
O Turbo Prolog permite a construo de bancos de dados dinmicos, isto , que podem
ser alterados e armazenados em disco para nova utilizao. Esses bancos de dados podem
conter somente fatos. Os predicados que definem os fatos usados no banco de dados dinmico
devem ser declarados na parte database do programa e no na predicates. Assim, um
mesmo programa pode ter fatos declarados na parte de predicates, que s podem ser
alterados com a modificao do cdigo fonte do programa, e fatos guardados em um arquivo
separado, que podem ser carregados, modificados e salvos.
O Turbo Prolog fornece ao programador os seguintes predicados para manipular bancos
de dados dinmicos:
ASSERTA: este predicado acrescenta um fato ao banco de dados armazenado na
memria do computador. Ele acrescenta o novo fato no incio das clusulas de mesmo
predicado.
asserta (gosta(maria, jose)).
ASSERTZ: este predicado similar ao asserta, porm adiciona o novo fato aps as
clusulas de mesmo predicado.
RETRACT: um predicado usado para retirar um fato do banco de dados. Ele retirar
o primeiro fato que for casado com o seu argumento.
retract (gosta( maria, jose)).
FINDALL: predicado que procura no banco de dados todos os fatos que combinem
com seu primeiro argumento no predicado passado pelo seu segundo argumento, e os coloca
em uma lista, que seu terceiro argumento.
findall (Nome, gosta(Nome,_), Lista_resultante).
O nome dado a um arquivo pode ser qualquer, desde que obedea o formato de 8 + 3
letras do DOS. A extenso do arquivo definida pelo usurio, mas geralmente se usa .dba.
Uma observao que deve ser feita que o consult carregar o banco de dados do disco
concatenando-o com o da memria. Por exemplo, se o usurio carregar duas vezes o mesmo
banco de dados, ele ficar na memria com duas cpias de todos os fatos carregados, uma
aps a outra.
27
SAVE: este predicado transfere todos os fatos existentes na memria para um arquivo.
Ele recebe como argumento um nome que seja vlido para um arquivo no DOS.
save (meu_b_d.dba).
clauses
/* Clausula que controla a interacao com o usuario. */
28
menu(Escolha):- Escolha = 6,
write ("Terminado!").
menu(_):- nl,
write("Escolha uma opcao: "),nl,
write("1. Adiciona um telefone ao Banco de Dados"),
nl,
write("2. Deleta um telefone do Banco de Dados"),
nl,
write("3. Procura um telefone"),nl,
write("4. Carrega o arquivo do Banco de Dados"),nl,
write("5. Salva o Banco de Dados em um arquivo"),
nl,
write("6. Termina. "),nl,
write(" "),nl,
readint(Escolha),
processa (Escolha), menu(Escolha).
/* Clausulas
processa (1)
processa (2)
processa (3)
processa (4)
processa (5)
/* deleta um telefone do BD */
deleta :write ("Deletando um telefone do B D."),
nl,
write ("Entre o nome: "),
readln (Nome),
write ("Entre o telefone dele: "),
readln (Telefone),
retract (agenda (Nome, Telefone)),
write ("Telefone retirado do B D."),
nl.
deleta :-
/* procura um telefone */
procura :- write ("Procurando um telefone no B D."),
nl,
write ("Entre o nome: "),
readln (Nome),
agenda (Nome, Telefone),
write ("O telefone do(a) ", Nome, " e' ",Telefone,"."),
nl.
procura :-
/* Inicia o programa */
goal
30
menu(0).
31
Exerccio 26: Implemente uma regra que imprima todos os telefones guardados na
agenda.
12.
BIBLIOGRAFIA
32
Projetos
Inicialmente, projetos propostos por Clocksin e Mellish:
1.
Escreva um programa que calcula o intervalo em dias entre duas datas,
expressas na forma Dia/Ms, assumindo que eles se referem ao mesmo ano. Por exemplo, a
questo intervalo (3, marco, 7, abril, 35). deve ser unificada com sucesso.
2.
Concordncia uma lista de palavras que so encontradas em um texto,
listadas em ordem alfabtica, cada palavra seguida pelo nmero de vezes que ela apareceu no
texto. Escreva um programa que produz uma concordncia de uma lista de palavras
representada como uma string do Prolog. (Dica: Strings so listas de cdigos ASCII).
3.
O problema das N-rainhas amplamente discutido em textos de programao.
Implemente um programa que encontre todas as maneiras de colocar 4 rainhas em um
tabuleiro de xadrez de 4 por 4 em posies que nenhuma rainha consiga atacar a outra.
4.
5.
Escreva um programa que compreenda sentenas simples em Portugus, que
possuam a seguinte forma:
______ um(a) ______ .
Um(a) ______ um(a) ______ .
______ um(a) ______ ?
O programa deve dar a resposta apropriada (sim, no, o.k. e desconheo), com base
nas sentenas apresentadas. Por exemplo, temos abaixo uma execuo do programa:
Joo um homem.
o.k.
Um homem uma pessoa.
o.k.
Joo uma pessoa?
sim
Maria uma pessoa?
Desconheo
Cada sentena deve ser transformada em uma clusula do Prolog, que deve ento ser
inserida no banco de dados (com asserta) ou executada. As tradues dos exemplos anteriores
deve ser:
homem(joo).
pessoa(X) :- homem(X).
? pessoa (joo).
? pessoa (maria).
3.
4.
5.
Crie um pequeno sistema especialista, que ajude uma pessoa a fazer uma
escolha de compra. Por exemplo, um programa que ajude uma pessoa a encontrar uma cidade
para viajar de frias, fazendo perguntas simples como Voc gosta de praia? (Sim/No),
Voc gosta de sair a noite? (Sim/No), etc.
6.
Crie um programa simples que utilize aprendizado, como o programa
Animais. Este programa tenta adivinhar em qual animal o usurio est pensando e, caso no
consiga descobrir pois desconhece o animal, aprende a diferena entre o novo animal e os que
ele conhece.
34