20
26/09/2011 1 Erick Galani Maziero Estagiá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)

Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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)

Page 2: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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.

Page 3: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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).

Page 4: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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).

Page 5: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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).

Page 6: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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

Page 7: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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.

Page 8: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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).

Page 9: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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.

Page 10: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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).

Page 11: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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).

Page 12: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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

Page 13: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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)).

Page 14: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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

Page 15: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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.

Page 16: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligê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

Page 17: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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.

Page 18: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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.

Page 19: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

26/09/2011

19

executa(Functor,List) :-

E =.. [Functor|List],

call(E).

Qual a diferença entre os predicados:

findall

setof

bagof

Page 20: Pode-se desejarprogramar“proceduralmente” Interaçãocom o ...wiki.icmc.usp.br/images/5/5b/Aula7-230t.pdf · 26/09/2011 1 Erick Galani Maziero Estagiário PAE SCC-230 Inteligência

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).