Melhor Prolog
Melhor Prolog
Melhor Prolog
Universidade Federal do
Paran
Departamento de Informtica
Disciplina:
Tcnicas Alternativas de
Programao
Alexandre I. Direne
E-mail: [email protected]
Web: http://www.inf.ufpr.br/~alexd
Lgica
Bloco 01
Pgina 1
BIBLIOGRAFIA
- Ulf Nilsson and Jan Maluszynski. Logic, Programming and Prolog (2ed).
Previously published by John Wiley & Sons Ltd. Now available free at:
http://www.ida.liu.se/~ulfni/lpp/
- William F. Clocksin and C. S. Mellish. Programming in Prolog. Springer-Verlag,
1987.
- Elaine Rich, Kevin Knight. Artificial Intelligence. McGraw Hill, 1993.
- Patrick H. Winston, Artificial Intelligence, Second Edition, Addison-Wesley,
1993.
- Flvio Soares Corra da Silva, Marcelo Finger e Ana Cristina Vieira de Melo.
Lgica
para
Computao.
1993.
http://www.thomsonlearning.com.br/detalheLivro.do?id=104261
SOFTWARE
Compilador Prolog (Poplog). Endereo para obteno:
http://www.cs.bham.ac.uk/research/poplog/freepoplog.html
Lgica
Bloco 01
Pgina 2
~a
NO chove
Conjuno Lgica
Ex.:
ab
nublado E chove
Disjuno Lgica
Ex.:
ab
nublado OU chove ( onde OU um conectivo lgico)
Implicao Lgica
Ex.:
ab
SE chove ENTO nublado
Equivalncia Lgica
Ex.:
ab
eleitor SE SOMENTE SE vota
Observao: uma linguagem FORMAL ou seja, apenas FORMA (ou SINTAXE) importam.
Exemplo:
aab
SE chove ENTO chove
nublado.
bab
SE nublado ENTO chove
Logo, a a b no retrata uma realidade. Porm, se tal enunciado constar em uma Base de
Conhecimento, o mesmo ser considerado como uma equivalncia verdadeira, pois sua FORMA (ou
sintaxe) est correta.
Lgica
Bloco 01
Pgina 3
a a
Contradio: Enunciado sempre falso para qualquer variao de valor-verdade dos enunciados simples
que o compem.
Exemplo: a
a (chove E NO chove)
Tabela de valores verdade:
a a
Contingncia: Enunciado cujo valor-verdade s pode ser decidido mediante fatos, ou seja, os
valor-verdade dos enunciados simples que o compem.
Exemplo: a b (SE chove ENTO nublado)
Tabela de valores verdade:
Lgica
a b
Bloco 01
Pgina 4
ab
a
ab
ab
~a
~b
Exemplos:
(DADO)
ef
(DADO)
ge
feriado E chove
(DEDUO)
nublado
Modus Tolens
ab
Exemplo:
(DADO)
~b
(DADO)
j ~h
~a
(DEDUO)
~j
Silogismo Hipottico
ab
(DADO)
~h f
bc
(DADO)
f ~e
a c
(DEDUO)
~h ~e
Exemplo:
Silogismo Disjuntivo
ab
(DADO)
~(c d) (h g)
~a
(DADO)
cd
(DEDUO)
hg
Exemplo:
Simplificao (2 formas)
ab
ab
Exemplo:
Lgica
(DADO)
(a b) c
(DEDUO)
(DEDUO)
ab
(DEDUO)
(DEDUO)
b
Bloco 01
Pgina 5
a b
Exemplo:
(DADO)
ab
(DADO)
(DADO)
(DEDUO)
ec
(DEDUO)
(a b) (e c)
(DADO)
~h
(DEDUO)
~h ~(a n)
Adio
a
a b
Exemplo:
Lgica de Predicados
Termos : Constituem expresses que descrevem ou nomeiam entidades ou objetos.
Variveis:
Em x poeta romntico, x uma VARIVEL e pode ser substituda por qualquer
constante durante a avaliao de um predicado.
Constantes:
Em Colombo descobriu a Amrica, Colombo uma CONSTANTE.
Funes:
Em Idade(x), Idade uma FUNO que retorna uma valor inteiro resultante de um
calculo especifico.
Aridade de Predicados:
chove
Lgica
- Aridade 0
Bloco 01
Pgina 6
- Aridade 2
Bloco 01
Pgina 7
x (criana(x) alegre(x))
x (criana(x) alegre(x))
x (criana(x) ~alegre(x))
x (criana(x) ~alegre(x))
onde:
1 e 3 so contrrios
1 e 4 so contraditrios
2 e 3 so contraditrios
2 e 4 so subcontrrios
Lgica
Bloco 01
Pgina 8
sobre OBJETOS
Lgica
sobre SENTENAS
C2 ... Cn P1 P2 ... Pm
Clausulas de HORN
Para n = 1 e m = 0 , resultando em FATOS.
C1
Para n = 1 e m 1 , resultando em REGRAS.
C1 P1
P2 ... Pm
Variveis em Prolog: So lacunas de memria que podem ou no ser instanciadas durante os ciclos
do interpretador.
SINTAXE: Qualquer composio que inicie com uma letra maiscula.
Ex.: Nome, X, Alberto
Constantes em Prolog: So pores fixas de memria que guardam valores.
SINTAXE: Qualquer composio que seja numrica, envolvida por aspas simples, ou que inicie
com uma letra minscula.
Ex.: alberto, x, 'Alberto'
Estruturas em Prolog: So elementos que, quando processados, devolvem um valor de um dado tipo
(e no um valor verdade).
SINTAXE: Qualquer composio que inicie por letra maiscula, minscula, ou smbolos
especiais, seguido de parnteses e seus COMPONENTES.
Ex.: livro('Inteligncia Artificial', autor('Elaine', 'Rich'))
Lgica
Bloco 01
Pgina 9
Bloco 01
Pgina 10
Bloco 01
Pgina 11
Bloco 01
Pgina 12
Bloco 01
Pgina 13
Bloco 01
Pgina 14
Bloco 01
Pgina 15
Bloco 01
Pgina 16
Bloco 01
Pgina 17
Bloco 01
Pgina 18
Bloco 01
Pgina 19
Bloco 01
Pgina 20
Bloco 01
Pgina 21
4. Construir um predicado em Prolog, denominado "todas_antes", o qual relaciona uma lista de palavras
com uma sub-lista de todas as palavras da lista que precedem uma dada palavra. Seu
comportamento o expresso abaixo:
todas_antes(Palavra, [], []).
todas_antes(Palavra, [ Palavra | _ ], []).
todas_antes(Palavra, [ Cabeca | Cauda ], [Cabeca | Sub_Lista_1]) :todas_antes(Palavra, Cauda, Sub_Lista_1).
?- todas_antes(casaco, [], L).
** (1) Call : todas_antes(casaco, [], _1)?
** (1) Exit : todas_antes(casaco, [], [])?
L = [] ?
yes
?- todas_antes(casaco, [ casaco ], L).
** (1) Call : todas_antes(casaco, [casaco], _1)?
** (1) Exit : todas_antes(casaco, [casaco], [])?
L = [] ?
Lgica
Bloco 01
Pgina 22
Bloco 01
Pgina 23
OBS.: Vrios dos predicados propostos necessitam da definio prvia de outros predicados, alguns
dos quais j foram resolvidos em outras transparncias.
Bloco 01
Pgina 24
item (I), uma lista ordenada (L1 possivelmente vazia) de itens da mesma natureza
de I, e uma lista ordenada (L2 no vazia). A lista L2 contem todos os itens de L1 e
ainda o item I em uma posio que mantenha L2 de forma ordenada. Seu
comportamento o expresso abaixo:
?- insercao_ord( 6, [], Z).
Z = [6] ?
yes
?- insercao_ord( 6, [5], Z).
Z = [5, 6] ?
yes
?- insercao_ord( 6, [3 ,4 , 5 , 8 , 9, 10], Z).
Z = [3, 4, 5, 6, 8, 9, 10] ?
yes
?- ordenada([ ], Z).
Z = [] ?
yes
?- ordenada([11 , 10, 9], Z).
Z = [9, 10, 11] ?
yes
Lgica
Bloco 01
Pgina 25
EXERCCIO 5: Suponha que existam 10 (dez) pessoas em uma cidade, e seus nomes so: "a", "b",
"c", "d", "e", "f", "g", "h", "i", "j". Tambm conhecido o fato de que os seguintes pares
de pessoas se comunicam freqentemente:
[[a f] [f e] [g i] [h b] [c h] [j d] [g j] [b h] [d i]]
Claramente, "a", "e" e "f" formam uma sub-cultura na qual seus membros se comunicam
mutuamente, porm no se comunicam com nenhuma outra sub-cultura da cidade. Quantas
sub-culturas existem no conjunto acima (ou em qualquer conjunto semelhante ao conjunto dado) ?
Para ajudar a responder pergunta acima, construir um predicado em Prolog, denominado
"subcultura", o qual relaciona duas listas (L1 e L2 possivelmente vazias), as quais englobam
sub-listas de apenas 1 (um) nvel de profundidade. Cada sub-lista de L1 composta de um par de itens
(nomes de pessoas) ao passo que cada sub-lista de L2 representa um grupo com todas as pessoas de
uma sub-cultura. Seu comportamento o expresso abaixo:
?- subcultura([[a, b], [b, c], [d, e], [e, f]], S).
S = [[a, b, c], [d, e, f]] ?
yes
?- subcultura([[a, e], [b, f], [c, g], [d, g]], S).
S = [[a, e], [b, f], [c, g, d]] ?
yes
?- subcultura([[a, f], [f, e], [g, i], [h, b], [c, h], [j, d], [g, j], [b, h], [d, i]], S).
S = [[b, c, h], [d, g, i, j], [a, e, f]] ?
yes
Voc pode ver algum propsito especifico para um predicado como este? Caso negativo,
considere uma lista de pares de cidades ligadas por uma linha telefnica ou de transporte com as quais
se pretende fazer estudos de ampliao do sistema de interligao. Ou mesmo, imagine que a lista de
pares seja de nmeros com um fator comum.
Lgica
Bloco 01
Pgina 26
Pergunta:
?- esta_emprestado(alberto, Livro, ... ).
De Forma Estruturada:
esta_emprestado(alberto, livro( autor("J. A.", "da Silva"),"Programao Prolog", 287, "A37.64")).
A partir da podemos escrever termos mais complexos para predicados, como no exemplo
abaixo:
esta_emprestado(alberto, livro( autor("J. A.", "da Silva"), "Programao Prolog", 287, "A37.64")).
Ou mesmo fazer perguntas mais complexas como:
Quais os sobrenomes e ttulos dos livros emprestados a alberto ?
?- esta_emprestado(alberto, livro( autor( _ , Sobrenome), Titulo, _ , _ )).
H algum livro do autor "Rich" emprestado a alberto ? (R: Sim/No)
?- esta_emprestado(alberto, livro( autor( _ , "Rich"), _ , _ , _ )).
Lgica
Bloco 01
Pgina 27
salada_de_tres_frutas
banana
laranja
pessego
autor
J.A
Programao Prolog
287
A37.64
da Silva
Estruturas podem ser usadas para casamento de padro complexo. Como exemplo podemos
citar a identificao de frases em linguagem natural. Seja a frase "joao jogou bola". Em forma de rvore,
sua visualizao seria:
frase
sujeito
joao
predicado
verbo
objeto
jogou
bola
Lgica
Bloco 01
Pgina 28
Listas podem ser representadas como casos especiais de rvores. Por exemplo, a lista em
forma de estrutura que consiste de um elemento (o elemento 'a') poderia ser escrita como (a, []) e
visualizada como:
[]
-[]
[]
**** OU ****
[]
[]
Um exemplo
Construir uma estrutura de dados, em PROLOG, que seja capaz de armazenar informaes de
nome, endereo e idade em uma rvore binaria, ordenada, onde os nodos mais a esquerda esto com
os nomes em ordem alfabtica mais baixa.
/* INSERE */
/* Insere um nodo em uma rvore VAZIA ou em um nodo FOLHA.
insere(Descritor, vazia, nodo(vazia, Descritor, vazia)).
Lgica
Bloco 01
*/
Pgina 29
Clculo de um exemplo:
?- insere(descritor(alex, e1, 10), vazia, A1), insere(descritor(blex, e2, 11),
A1 , A2),
insere(descritor(clex, e3, 12), A2 , A3), insere(descritor(aalx, e4, 13), A3 , A4), write(A4).
nodo(nodo(vazia, descritor(aalx, e4, 13), vazia), descritor(alex, e1, 10), nodo(vazia, descritor(blex, e2,
11), nodo(vazia, descritor(clex, e3, 12), vazia)))
/* VISUALIZAO GRFICA DO EXEMPLO */
alex
aalx
[]
blex
clex
[]
/* ELIMINA */
/* Elimina um nodo FOLHA, ou nodo NICO da rvore, cujo nome no descritor coincide com o nome
procurado. */
elimina(descritor(Nome, _ , _ ), nodo(vazia, descritor(N1, _ , _ ), vazia), vazia) :N1 = Nome.
/* Caminha na rvore a ESQUERDA se o nome a ser inserido for alfabaticamente ANTERIOR ao do
nodo corrente. */
elimina(descritor(Nome, E, I), nodo(AE, descritor(N1, E1, I1), AD), nodo(AE1, descritor(N1, E1, I1),
AD)):Nome < N1,
elimina(descritor(Nome, E, I), AE, AE1).
/* Caminha na rvore a DIREITA se o nome a ser inserido for alfabaticamente POSTERIOR ao do nodo
corrente. */
Lgica
Bloco 01
Pgina 30
pai(joao, jose).
pai(joao, paulo).
pai(alberto, joao).
pai(fabricio, alberto).
pai(jonatas, fabricio).
?- pai(X, _ ).
X = joao ? ;
X = joao ? ;
X = alberto ? ;
X = fabricio ? ;
X = jonatas ? ;
no
filho(X, Y) :pai(Y, X).
?- filho(F, P).
F = jose P = joao ? ;
F = paulo P = joao ? ;
F = joao P = alberto ? ;
F = alberto P = fabricio ? ;
F = fabricio P = jonatas ? ;
no
filho(X, Y) :pai(Y, X), !.
?- filho(F, P).
F = jose P = joao ? ;
no
Lgica
Bloco 01
Pgina 31
soma_dos_int_de_1_a(1, 1).
soma_dos_int_de_1_a(N, Soma) :N1 is N - 1,
soma_dos_int_de_1_a(N1, Tmp_soma),
Soma is Tmp_soma + N.
?- soma_dos_int_de_1_a(3, X).
** (1) Call : soma_dos_int_de_1_a(3, _1)?
** (2) Call : soma_dos_int_de_1_a(2, _2)?
** (3) Call : soma_dos_int_de_1_a(1, _3)?
** (3) Exit : soma_dos_int_de_1_a(1, 1)?
** (2) Exit : soma_dos_int_de_1_a(2, 3)?
** (1) Exit : soma_dos_int_de_1_a(3, 6)?
X=6?;
** (1) Redo : soma_dos_int_de_1_a(3, 6)?
** (2) Redo : soma_dos_int_de_1_a(2, 3)?
** (3) Redo : soma_dos_int_de_1_a(1, 1)?
** (4) Call : soma_dos_int_de_1_a(0, _4)?
** (5) Call : soma_dos_int_de_1_a(-1, _5)?
** (6) Call : soma_dos_int_de_1_a(-2, _6)?
** (7) Call : soma_dos_int_de_1_a(-3, _7)?
** (8) Call : soma_dos_int_de_1_a(-4, _8)?
** (9) Call : soma_dos_int_de_1_a(-5, _9)?
** (10) Call : soma_dos_int_de_1_a(-6, _10)?
soma_dos_int_de_1_a(1, 1) :!.
soma_dos_int_de_1_a(N, Soma) :N1 is N - 1,
soma_dos_int_de_1_a(N1, Tmp_soma),
Soma is Tmp_soma + N.
Lgica
Bloco 01
Pgina 32
O uso do "FAIL"
O predicado "FAIL" aquele que, quando includo no corpo de uma clusula qualquer, o valor-verdade
da clusula ser "falso" (no necessariamente o do predicado). Isto provoca retroao (backtraching) e,
consequentemente, combinaes automticas de valores instanciveis nas variveis da clusula.
nomes_de_mulheres:mulher(X),
write(X),
nl,
fail.
?- nomes_de_mulheres.
claudia
silvia
clara
angela
maria
marcia
no
A combinao "CUT-FAIL":
Quando o FAIL encontrado depois de um CUT (!), o comportamento esperado do "backtracking"
sempre alterado devido presena do CUT. Na verdade, a combinao CUT-FAIL se torna til em
diversas condies prticas por razes variadas. Exemplo:
fatorial(X, _) :- X < 0, !, fail.
fatorial(0,1) :- !.
fatorial(X, FX) :- Y is X-1, fatorial(Y, FY), FX is X * FY.
Lgica
Bloco 01
Pgina 33