Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
26/09/2011
1
Erick Galani MazieroEstagiário PAE
SCC-230 Inteligência Artificial
Pode-se desejar programar “proceduralmente”
Interação com o usuário
Informação explícita
Conhecimento inferido ou deduzido (máquina prolog)
26/09/2011
2
mae(ana,joao).
mae(ana,pedro).
maede :- mae(X,Y),write('A mae de '),write(Y),write(' é '),write(X),nl.
Usar ; para obter todas as mães
Pergunta :- read(X),write(X).
prolog.
26/09/2011
3
Faça um programa que peça do usuário o nomede uma estado brasileiro e retorne o nome de
sua capital. Crie uma base de dados com apenasalgumas capitais.
pergunta :- write('Digite o nome de um estado
brasileiro: '),
read(Estado),
capital_de(Estado,Cidade),
nl,write('A capital de '),
write(Estado),write(' é '), write(Cidade),nl.
capital_de(mato_grossodo_sul,campo_grande).
capital_de(espirito_santo,vitoria).
capital_de(pernambuco, recife).
capital_de(sao_paulo,sao_paulo).
26/09/2011
4
• Útil, pois não precisa ser implementado
• Pode causar ineficiência em um programa
O controle do backtracking pode tornar um programa mais rápido e fazer com que ocupe
menos memória
extenso(1) :- write(‘Um').
extenso(2) :- write(‘Dois').
extenso(3) :- write(‘ Três').
extenso(_) :- write(‘Fora de intervalo').
?- extenso(1).
26/09/2011
5
extenso(1) :- write(‘Um').
extenso(2) :- write(‘Dois').
extenso(3) :- write(‘ Três').
extenso(_) :- write(‘Fora de intervalo').
extenso(1) :- write(‘Um').extenso(2) :- write(‘Dois').extenso(3) :- write(‘ Três').extenso(X) :- X<1, write(‘Fora de intervalo').extenso(X) :- X>3, write(' Fora de intervalo ').
extenso(1) :- write(‘Um').extenso(2) :- write(‘Dois').extenso(3) :- write(‘ Três').extenso(X) :- X<1, write(‘Fora de intervalo').extenso(X) :- X>3, write(' Fora de intervalo ').
extenso(1) :- write(‘Um').
extenso(2) :- write(‘Dois').
extenso(3) :- write(‘ Três').
extenso(_) :- write(‘Fora de intervalo').
?- extenso(1).
26/09/2011
6
extenso(1) :- write(‘Um'), !.
extenso(2) :- write(‘Dois') , !.
extenso(3) :- write(‘ Três') , !.
extenso(_) :- write(‘Fora de intervalo').
?- extenso(1).
Operador que indica ao Prolog que não devebuscar outras soluções pelo backtracking
Torna o programa mais rápido e eficiente
Utilizado quando as regras são mutuamenteexclusivas
26/09/2011
7
Cortes verdes (!): caso seja removido do
programa, as soluções encontradas continuamsendo corretas
Cortes vermelho (!): caso seja removido, o
programa tem seu comportamento alterado
f(X,0) :- X<3. % Regra 1
f(X,2) :- 3 =< X, X<6. % Regra 2
f(X,4) :- 6 =< X. % Regra 3
?- f(1,Y), 2 < Y.
26/09/2011
8
f(X,0) :- X<3, !. % Regra 1
f(X,2) :- 3 =< X, X<6, !. % Regra 2
f(X,4) :- 6 =< X. % Regra 3
?- f(1,Y), 2 < Y.
f(X,0) :- X<3, !. % Regra 1
f(X,2) :- X<6, !. % Regra 2
f(X,4). % Regra 3
?- f(1,Y).
26/09/2011
9
f(X,0) :- X<3. % Regra 1
f(X,2) :- X<6. % Regra 2
f(X,4). % Regra 3
?- f(1,Y).
Usado para forçar o backtracking
pai(joao, pedro).
pai(joao, ana).
pai(pedro, maria).
pais :- pai(X,Y),write(X),write(' pai de '), write(Y),nl,fail.
?-pais.
26/09/2011
10
Falha um predicado e evita o backtracking
% base de dados, com estrutura filho(Filho,Mae,Pai) ou filha(Filha,Mae,Pai):
filho(pedrinho,maria,joao). filho(joaozinho,maria,joao). filho(mariozinho,ana,marcos). filha(aninha,ana,marcos). pai(P, Filho) :- filho(Filho, _, P). pai(P, Filha) :- filha(Filha, _, P). mae(M, Filho) :- filho(Filho, M, _). mae(M, Filha) :- filha(Filha, M, _). irmao(A, A) :- !, fail.
irmao(A, B) :- filho(A, M, _), mae(M, B). irmao(A, B) :- filho(A, _, P), pai(P, B).
?- irmao(pedrinho,joaozinho).
Falha um predicado e evita o backtracking
% base de dados, com estrutura filho(Filho,Mae,Pai) ou filha(Filha,Mae,Pai):
filho(pedrinho,maria,joao). filho(joaozinho,maria,joao). filho(mariozinho,ana,marcos). filha(aninha,ana,marcos). pai(P, Filho) :- filho(Filho, _, P). pai(P, Filha) :- filha(Filha, _, P). mae(M, Filho) :- filho(Filho, M, _). mae(M, Filha) :- filha(Filha, M, _). irmao(A, A) :- !, fail.
irmao(A, B) :- filho(A, M, _), mae(M, B). irmao(A, B) :- filho(A, _, P), pai(P, B).
?- irmao(pedrinho,pedrinho).
26/09/2011
11
Como dizer que maria gosta de todos os animais, exceto de cobras?
gosta(maria, X) :- X = cobra, !, fail.
gosta(maria, X) :- animal(X).
animal(coelho).
animal(cobra).
animal(passaro).
26/09/2011
12
É um predicado utilizado para inserir fatos na base de dados
Pode ser asserta ou assertz, inserindo antes ou após o respectivo fato na base de dados
É um predicado utilizado para inserir fatos na base de dados
Asserta(gosta(joao,maria)).
Insere o fato
gosta(joao,maria) no início
da base de dados
Assertz(gosta(joao,maria)).Insere o fato
gosta(joao,maria) no final da base de dados
26/09/2011
13
É um predicado utilizado para remover fatos na base de dados
retract(gosta(joao,maria)).
remove o fato
gosta(joao,maria) da base
de dadosretract(gosta(joao,maria)).
Remove o fato
gosta(joao,maria) da base
de dados
gosta(maria, X) :- X = cobra, !, fail.
gosta(maria, X) :- animal(X).
animal(coelho).
animal(cobra).
animal(passaro).
?-asserta(animal(anta)).
26/09/2011
14
:- dynamic animal/1., X) :- X = cobra, !, fail.
gosta(maria, X) :- animal(X).
animal(coelho).animal(cobra).
animal(passaro).
?-assert(animal(anta)).?-gosta(maria,anta).
?-retract(animal(coelho)).?-gosta(maria,coelho).
Findall (O, G, L)
Constrói uma lista L contendo todos os objetos O tais que a meta G é satisfeita
26/09/2011
15
?- findall(Crianca,idade(Crianca,Idade),L).
L = [pedro,ana,alice,tomaz]
?- findall(Crianca/Idade,idade(Crianca,Idade),L).
L = [pedro/7, ana/5, alice/8, tomaz/5]
?-findall(Crianca/Idade,
(idade(Crianca,Idade),Idade>5),L).
L = [pedro/7, alice/8]
idade(pedro,7).idade(ana,5).idade(alice,8).
idade(tomaz,5).
Crie uma base de dados de distâncias fictícias entre a USP-SC e outras universidades, depois
realize uma pesquisa que retorne uma lista com universidades que distem no máximo uma
distância pré-definida, informando a universidade destino e a distância.
26/09/2011
16
dist(usp_sc,unicep,3).
dist(usp_sc,ufscar,5).
dist(usp_sc,oxford,5000).
dist(usp_sc,harvard,3000).
?- findall(U/D,(dist(usp_sc,U,D),D>1000),L).
setof (O, G, L)
Colocando em ordem alfanumérica e evitando duplicações
Retorna um conjunto ordenado
26/09/2011
17
Converte uma estrutura em uma lista ou vice-versa
a(b,c,d) =.. X.X = [a,b,c,d].
X =.. [w,x,y,z].X = w(x,y,z).
f(x,y,z) =.. [f|Args].Args = [x,y,z].
mae(ana,pedro).pai(joao,pedro).
pergunta :-write('mae ou pai?'),read(X),
write('de quem? '),read(Y),
Q =.. [X,Quem,Y],call(Q),
write(Quem),nl.
26/09/2011
18
ficha(joao,X,Y,Z) :-
X =.. [mae,maria],
Y =.. [pai,pedro],
Z =.. [profissao,estudante].
?-ficha(A,B,C,D).
Escreva um predicado de aridade 2, que recebaum Funtor e uma Lista (de argumentos do
funtor) e faça a sua execução.
26/09/2011
19
executa(Functor,List) :-
E =.. [Functor|List],
call(E).
Qual a diferença entre os predicados:
findall
setof
bagof
26/09/2011
20
setof e bagof buscam instâncias que casam com as variáveis livres do objetivo O.
Findall busca soluções que não envolvam o mesmo valor para as variáveis livres
parentes(ana,joao).
parentes(ana,joao).
parentes(ana,pedro).
parentes(claudia,manoel).
findall(X,parentes(X,Y),L).
bagof(X,parentes(X,Y),L).
setof(X,parentes(X,Y),L).