prof. dr. silvio do lago pereira - ime.usp.brslago/pl-09.pdf · uma solução na base de dados...
TRANSCRIPT
Predicados dinâmicos
Prof. Dr. Silvio do Lago PereiraDepartamento de Tecnologia da Informação
Faculdade de Tecnologia de São Paulo
Predicados dinâmicos
Um predicado dinâmicoUm predicado dinâmico
é um predicado cuja definição pode ser alterada em tempo de execução, por meio da inclusão ou exclusão de cláusulas (fatos ou regras).é um predicado cuja definição pode ser alterada em tempo de execução, por meio da inclusão ou exclusão de cláusulas (fatos ou regras).
dynamic(p/n)dynamic(p/n)dynamic(p/n)dynamic(p/n): declara que a definição do predicado p/np/np/np/n pode mudar.
listing(p/n)listing(p/n)listing(p/n)listing(p/n): exibe a definição do predicado p/np/np/np/n.
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 2
listing(p/n)listing(p/n)listing(p/n)listing(p/n): exibe a definição do predicado p/np/np/np/n.
asserta(C)asserta(C)asserta(C)asserta(C): insere CCCC como primeira cláusula da definição do predicado.
assertz(C)assertz(C)assertz(C)assertz(C): insere CCCC como última cláusula da definição do predicado.
assert(C)assert(C)assert(C)assert(C): idem a assertz/1assertz/1assertz/1assertz/1.
retract(C)retract(C)retract(C)retract(C): exclui cláusula da definição que casa com CCCC.
retractall(C)retractall(C)retractall(C)retractall(C): exclui todas as cláusulas da definição que casam com CCCC.
abolish(p/n)abolish(p/n)abolish(p/n)abolish(p/n): remove a definição do predicado p/np/np/np/n.
Predicados dinâmicos
Exercício 1. Inclusão de cláusulasExercício 1. Inclusão de cláusulas
Faça as consultas a seguir e analise os resultados apresentados:
????---- assertz(assertz(assertz(assertz(p(a)p(a)p(a)p(a)), ), ), ),
assertz(assertz(assertz(assertz(p(b)p(b)p(b)p(b)), ), ), ),
assertz(assertz(assertz(assertz(p(c)p(c)p(c)p(c)), ), ), ),
listing(listing(listing(listing(p/1p/1p/1p/1).).).).
Faça as consultas a seguir e analise os resultados apresentados:
????---- assertz(assertz(assertz(assertz(p(a)p(a)p(a)p(a)), ), ), ),
assertz(assertz(assertz(assertz(p(b)p(b)p(b)p(b)), ), ), ),
assertz(assertz(assertz(assertz(p(c)p(c)p(c)p(c)), ), ), ),
listing(listing(listing(listing(p/1p/1p/1p/1).).).).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 3
listing(listing(listing(listing(p/1p/1p/1p/1).).).).
????---- asserta(asserta(asserta(asserta(p(1,a)p(1,a)p(1,a)p(1,a)), ), ), ),
asserta(asserta(asserta(asserta(p(2,b)p(2,b)p(2,b)p(2,b)), ), ), ),
asserta(asserta(asserta(asserta(p(3,c)p(3,c)p(3,c)p(3,c)), ), ), ),
listing(listing(listing(listing(p/2p/2p/2p/2).).).).
????---- listing(p). listing(p). listing(p). listing(p).
listing(listing(listing(listing(p/1p/1p/1p/1).).).).
????---- asserta(asserta(asserta(asserta(p(1,a)p(1,a)p(1,a)p(1,a)), ), ), ),
asserta(asserta(asserta(asserta(p(2,b)p(2,b)p(2,b)p(2,b)), ), ), ),
asserta(asserta(asserta(asserta(p(3,c)p(3,c)p(3,c)p(3,c)), ), ), ),
listing(listing(listing(listing(p/2p/2p/2p/2).).).).
????---- listing(p). listing(p). listing(p). listing(p).
Predicados dinâmicos
Exercício 2. Exclusão de cláusulasExercício 2. Exclusão de cláusulas
Faça as consultas a seguir e analise os resultados apresentados:
????---- retract(retract(retract(retract(p(b)p(b)p(b)p(b)).).).).
????---- listing(listing(listing(listing(p/1p/1p/1p/1).).).).
????---- retract(retract(retract(retract(p(2,b)p(2,b)p(2,b)p(2,b)).).).).
Faça as consultas a seguir e analise os resultados apresentados:
????---- retract(retract(retract(retract(p(b)p(b)p(b)p(b)).).).).
????---- listing(listing(listing(listing(p/1p/1p/1p/1).).).).
????---- retract(retract(retract(retract(p(2,b)p(2,b)p(2,b)p(2,b)).).).).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 4
????---- retract(retract(retract(retract(p(2,b)p(2,b)p(2,b)p(2,b)).).).).
????---- listing(listing(listing(listing(p/2p/2p/2p/2).).).).
????---- retractall(retractall(retractall(retractall(p(X)p(X)p(X)p(X)).).).).
????---- listing(p).listing(p).listing(p).listing(p).
????---- abolish(abolish(abolish(abolish(p/2p/2p/2p/2).).).).
????---- listing(p).listing(p).listing(p).listing(p).
????---- retract(retract(retract(retract(p(2,b)p(2,b)p(2,b)p(2,b)).).).).
????---- listing(listing(listing(listing(p/2p/2p/2p/2).).).).
????---- retractall(retractall(retractall(retractall(p(X)p(X)p(X)p(X)).).).).
????---- listing(p).listing(p).listing(p).listing(p).
????---- abolish(abolish(abolish(abolish(p/2p/2p/2p/2).).).).
????---- listing(p).listing(p).listing(p).listing(p).
Memoização
MemoizaçãoMemoização
É uma técnica bastante eficiente para resolver problemas cuja decomposição em subproblemas mais simples apresenta muita redundância. Esta técnica consiste em manter uma tabela com as soluções de subproblemas previamente resolvidos.
É uma técnica bastante eficiente para resolver problemas cuja decomposição em subproblemas mais simples apresenta muita redundância. Esta técnica consiste em manter uma tabela com as soluções de subproblemas previamente resolvidos.
Exemplo: Na sequência de Fibonacci, os dois primeiros termos são iguais a 1 F(5)F(5)F(5)F(5)
5
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 5
os dois primeiros termos são iguais a 1 e, a partir do terceiro, todo termo é igual à soma dos dois anteriores (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... ).F(1) = 1
F(2) = 1
F(3) = F(2) + F(1) = 2
F(4) = F(3) + F(2) = 3
F(5) = F(4) + F(3) = 5
...
F(n) = F(n-2) + F(n-1)
F(4)F(4)F(4)F(4)
F(3)F(3)F(3)F(3) F(2)F(2)F(2)F(2)
F(2)F(2)F(2)F(2)
F(3)F(3)F(3)F(3)
F(1)F(1)F(1)F(1)
F(2)F(2)F(2)F(2) F(1)F(1)F(1)F(1)
11
21
11
32
F(5)F(5)F(5)F(5)
Memoização
Exemplo 1. Sequência de Fibonacci sem memoizaçãoExemplo 1. Sequência de Fibonacci sem memoização
fibfibfibfib(N,1) :(N,1) :(N,1) :(N,1) :----N<3, !.N<3, !.N<3, !.N<3, !.
fibfibfibfib(N,F) :(N,F) :(N,F) :(N,F) :----A is NA is NA is NA is N----2, 2, 2, 2, fibfibfibfib(A,X),(A,X),(A,X),(A,X),B is NB is NB is NB is N----1, 1, 1, 1, fibfibfibfib(B,Y), (B,Y), (B,Y), (B,Y), F is X + Y.F is X + Y.F is X + Y.F is X + Y.
fibfibfibfib(N,1) :(N,1) :(N,1) :(N,1) :----N<3, !.N<3, !.N<3, !.N<3, !.
fibfibfibfib(N,F) :(N,F) :(N,F) :(N,F) :----A is NA is NA is NA is N----2, 2, 2, 2, fibfibfibfib(A,X),(A,X),(A,X),(A,X),B is NB is NB is NB is N----1, 1, 1, 1, fibfibfibfib(B,Y), (B,Y), (B,Y), (B,Y), F is X + Y.F is X + Y.F is X + Y.F is X + Y.
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 6
Exercício 3. Sequência de Fibonacci sem memoizaçãoExercício 3. Sequência de Fibonacci sem memoização
Digite o predicado definido no Exemplo 1 e faça a consulta a seguir:
????---- time(time(time(time(forall(forall(forall(forall(between(1,30,N)between(1,30,N)between(1,30,N)between(1,30,N),,,,(fib(N,F)(fib(N,F)(fib(N,F)(fib(N,F),writeln(N ,writeln(N ,writeln(N ,writeln(N ----> F)> F)> F)> F)))))))))).).).).
Digite o predicado definido no Exemplo 1 e faça a consulta a seguir:
????---- time(time(time(time(forall(forall(forall(forall(between(1,30,N)between(1,30,N)between(1,30,N)between(1,30,N),,,,(fib(N,F)(fib(N,F)(fib(N,F)(fib(N,F),writeln(N ,writeln(N ,writeln(N ,writeln(N ----> F)> F)> F)> F)))))))))).).).).
Memoização
Exemplo 2. Sequência de Fibonacci com memoizaçãoExemplo 2. Sequência de Fibonacci com memoização
::::---- dynamicdynamicdynamicdynamic fibmemofibmemofibmemofibmemo/2/2/2/2....
fibmemofibmemofibmemofibmemo(1,1).(1,1).(1,1).(1,1).fibmemofibmemofibmemofibmemo(2,1).(2,1).(2,1).(2,1).
fibmfibmfibmfibm(N,F) :(N,F) :(N,F) :(N,F) :----
fibmemofibmemofibmemofibmemo(N,F), !. (N,F), !. (N,F), !. (N,F), !.
fibmfibmfibmfibm(N,F) :(N,F) :(N,F) :(N,F) :----
::::---- dynamicdynamicdynamicdynamic fibmemofibmemofibmemofibmemo/2/2/2/2....
fibmemofibmemofibmemofibmemo(1,1).(1,1).(1,1).(1,1).fibmemofibmemofibmemofibmemo(2,1).(2,1).(2,1).(2,1).
fibmfibmfibmfibm(N,F) :(N,F) :(N,F) :(N,F) :----
fibmemofibmemofibmemofibmemo(N,F), !. (N,F), !. (N,F), !. (N,F), !.
fibmfibmfibmfibm(N,F) :(N,F) :(N,F) :(N,F) :----
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 7
fibmfibmfibmfibm(N,F) :(N,F) :(N,F) :(N,F) :----A is NA is NA is NA is N----2, 2, 2, 2, fibmfibmfibmfibm(A,X),(A,X),(A,X),(A,X),B is NB is NB is NB is N----1, 1, 1, 1, fibmfibmfibmfibm(B,Y), (B,Y), (B,Y), (B,Y), F is X + Y,F is X + Y,F is X + Y,F is X + Y,assertassertassertassert((((fibmemofibmemofibmemofibmemo(N,F)).(N,F)).(N,F)).(N,F)).
fibmfibmfibmfibm(N,F) :(N,F) :(N,F) :(N,F) :----A is NA is NA is NA is N----2, 2, 2, 2, fibmfibmfibmfibm(A,X),(A,X),(A,X),(A,X),B is NB is NB is NB is N----1, 1, 1, 1, fibmfibmfibmfibm(B,Y), (B,Y), (B,Y), (B,Y), F is X + Y,F is X + Y,F is X + Y,F is X + Y,assertassertassertassert((((fibmemofibmemofibmemofibmemo(N,F)).(N,F)).(N,F)).(N,F)).
Exercício 4. Sequência de Fibonacci com memoizaçãoExercício 4. Sequência de Fibonacci com memoização
Digite o predicado definido no Exemplo 2 e faça a consulta a seguir:
????---- time(time(time(time(forall(forall(forall(forall(between(1,30,N)between(1,30,N)between(1,30,N)between(1,30,N),,,,(fibm(N,F)(fibm(N,F)(fibm(N,F)(fibm(N,F),writeln(N ,writeln(N ,writeln(N ,writeln(N ----> F)> F)> F)> F)))))))))).).).).
Digite o predicado definido no Exemplo 2 e faça a consulta a seguir:
????---- time(time(time(time(forall(forall(forall(forall(between(1,30,N)between(1,30,N)between(1,30,N)between(1,30,N),,,,(fibm(N,F)(fibm(N,F)(fibm(N,F)(fibm(N,F),writeln(N ,writeln(N ,writeln(N ,writeln(N ----> F)> F)> F)> F)))))))))).).).).
Coleta de soluções
Exemplo 3. Coleta de soluções (idem a findallfindallfindallfindall/3/3/3/3)Exemplo 3. Coleta de soluções (idem a findallfindallfindallfindall/3/3/3/3)
::::---- dynamicdynamicdynamicdynamic solução/1solução/1solução/1solução/1....
coletacoletacoletacoleta(X,C,L) :(X,C,L) :(X,C,L) :(X,C,L) :---- forallforallforallforall(C,(C,(C,(C,assertzassertzassertzassertz((((soluçãosoluçãosoluçãosolução(X))), (X))), (X))), (X))), coletacoletacoletacoleta(L).(L).(L).(L).
coletacoletacoletacoleta([([([([X|RX|RX|RX|R]) :]) :]) :]) :---- retractretractretractretract((((soluçãosoluçãosoluçãosolução(X)), !, (X)), !, (X)), !, (X)), !, coletacoletacoletacoleta(R). (R). (R). (R).
coletacoletacoletacoleta([]).([]).([]).([]).
% dados para teste% dados para teste% dados para teste% dados para teste
::::---- dynamicdynamicdynamicdynamic solução/1solução/1solução/1solução/1....
coletacoletacoletacoleta(X,C,L) :(X,C,L) :(X,C,L) :(X,C,L) :---- forallforallforallforall(C,(C,(C,(C,assertzassertzassertzassertz((((soluçãosoluçãosoluçãosolução(X))), (X))), (X))), (X))), coletacoletacoletacoleta(L).(L).(L).(L).
coletacoletacoletacoleta([([([([X|RX|RX|RX|R]) :]) :]) :]) :---- retractretractretractretract((((soluçãosoluçãosoluçãosolução(X)), !, (X)), !, (X)), !, (X)), !, coletacoletacoletacoleta(R). (R). (R). (R).
coletacoletacoletacoleta([]).([]).([]).([]).
% dados para teste% dados para teste% dados para teste% dados para teste
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 8
p(a).p(a).p(a).p(a).
p(b).p(b).p(b).p(b).
p(c).p(c).p(c).p(c).
p(b).p(b).p(b).p(b).
p(a).p(a).p(a).p(a).
p(b).p(b).p(b).p(b).
p(c).p(c).p(c).p(c).
p(b).p(b).p(b).p(b).
Exercício 5. Coleta de todas as soluções de uma consultaExercício 5. Coleta de todas as soluções de uma consulta
Digite os predicados definidos no Exemplo 3.
Faça a consulta: ????---- coleta(X,p(X),L).coleta(X,p(X),L).coleta(X,p(X),L).coleta(X,p(X),L).
Digite os predicados definidos no Exemplo 3.
Faça a consulta: ????---- coleta(X,p(X),L).coleta(X,p(X),L).coleta(X,p(X),L).coleta(X,p(X),L).
Coleta de soluções
Exercício 6. Coleta de todas as soluções de uma consulta, sem repetiçãoExercício 6. Coleta de todas as soluções de uma consulta, sem repetição
Uma característica do predicado coleta/3coleta/3coleta/3coleta/3 que pode ser indesejável em algumas aplicações é que ele devolve uma lista de soluções contendo soluções repetidas.
Com base na definição deste predicado, crie um novo predicado coleta_sr/3coleta_sr/3coleta_sr/3coleta_sr/3, que devolve uma lista com todas as soluções de uma consulta, sem repetições.
Dica: em vez de usar assertz/1assertz/1assertz/1assertz/1 diretamente, crie um predicado anota/1anota/1anota/1anota/1 que inclui uma solução na base de dados dinâmica só se ela não foi incluída anteriormente.
Uma característica do predicado coleta/3coleta/3coleta/3coleta/3 que pode ser indesejável em algumas aplicações é que ele devolve uma lista de soluções contendo soluções repetidas.
Com base na definição deste predicado, crie um novo predicado coleta_sr/3coleta_sr/3coleta_sr/3coleta_sr/3, que devolve uma lista com todas as soluções de uma consulta, sem repetições.
Dica: em vez de usar assertz/1assertz/1assertz/1assertz/1 diretamente, crie um predicado anota/1anota/1anota/1anota/1 que inclui uma solução na base de dados dinâmica só se ela não foi incluída anteriormente.
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 9
uma solução na base de dados dinâmica só se ela não foi incluída anteriormente.uma solução na base de dados dinâmica só se ela não foi incluída anteriormente.
Exercício 7. Coleta de todas as soluções de uma consulta, sem repetiçãoExercício 7. Coleta de todas as soluções de uma consulta, sem repetição
Faça as consultas e analise os resultados apresentados:
????---- assert(assert(assert(assert(f(1,a)f(1,a)f(1,a)f(1,a)), assert(), assert(), assert(), assert(f(2,a)f(2,a)f(2,a)f(2,a)), assert(), assert(), assert(), assert(f(3,b)f(3,b)f(3,b)f(3,b)), ), ), ),
assert(assert(assert(assert(f(3,c)f(3,c)f(3,c)f(3,c)), listing(f).), listing(f).), listing(f).), listing(f).
????---- coleta_sr(coleta_sr(coleta_sr(coleta_sr(XXXX,f(X,Y),L).,f(X,Y),L).,f(X,Y),L).,f(X,Y),L).
????---- coleta_sr(coleta_sr(coleta_sr(coleta_sr(YYYY,f(X,Y),L).,f(X,Y),L).,f(X,Y),L).,f(X,Y),L).
Faça as consultas e analise os resultados apresentados:
????---- assert(assert(assert(assert(f(1,a)f(1,a)f(1,a)f(1,a)), assert(), assert(), assert(), assert(f(2,a)f(2,a)f(2,a)f(2,a)), assert(), assert(), assert(), assert(f(3,b)f(3,b)f(3,b)f(3,b)), ), ), ),
assert(assert(assert(assert(f(3,c)f(3,c)f(3,c)f(3,c)), listing(f).), listing(f).), listing(f).), listing(f).
????---- coleta_sr(coleta_sr(coleta_sr(coleta_sr(XXXX,f(X,Y),L).,f(X,Y),L).,f(X,Y),L).,f(X,Y),L).
????---- coleta_sr(coleta_sr(coleta_sr(coleta_sr(YYYY,f(X,Y),L).,f(X,Y),L).,f(X,Y),L).,f(X,Y),L).
Simulação de ambiente dinâmico
Um ambiente dinâmicoUm ambiente dinâmico
É um ambiente cujas propriedades se modificam ao longo do tempo.É um ambiente cujas propriedades se modificam ao longo do tempo.
Exemplo 4. Estado de uma lâmpadaExemplo 4. Estado de uma lâmpada
::::---- dynamicdynamicdynamicdynamic lâmpada/1lâmpada/1lâmpada/1lâmpada/1....
lâmpada(acesa).lâmpada(acesa).lâmpada(acesa).lâmpada(acesa).
::::---- dynamicdynamicdynamicdynamic lâmpada/1lâmpada/1lâmpada/1lâmpada/1....
lâmpada(acesa).lâmpada(acesa).lâmpada(acesa).lâmpada(acesa).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 10
apagaapagaapagaapaga ::::---- retractretractretractretract((((lâmpadalâmpadalâmpadalâmpada(acesa)), (acesa)), (acesa)), (acesa)), assertassertassertassert((((lâmpadalâmpadalâmpadalâmpada(apagada)).(apagada)).(apagada)).(apagada)).
acendeacendeacendeacende ::::---- retractretractretractretract((((lâmpadalâmpadalâmpadalâmpada(apagada)), (apagada)), (apagada)), (apagada)), assertassertassertassert((((lâmpadalâmpadalâmpadalâmpada(acesa)). (acesa)). (acesa)). (acesa)).
apagaapagaapagaapaga ::::---- retractretractretractretract((((lâmpadalâmpadalâmpadalâmpada(acesa)), (acesa)), (acesa)), (acesa)), assertassertassertassert((((lâmpadalâmpadalâmpadalâmpada(apagada)).(apagada)).(apagada)).(apagada)).
acendeacendeacendeacende ::::---- retractretractretractretract((((lâmpadalâmpadalâmpadalâmpada(apagada)), (apagada)), (apagada)), (apagada)), assertassertassertassert((((lâmpadalâmpadalâmpadalâmpada(acesa)). (acesa)). (acesa)). (acesa)).
Exercício 8. Estado de uma lâmpadaExercício 8. Estado de uma lâmpada
Digite os predicados definidos no Exemplo 4 e faça as consultas a seguir:????---- lâmpada(E).lâmpada(E).lâmpada(E).lâmpada(E).
????---- apaga, lâmpada(E).apaga, lâmpada(E).apaga, lâmpada(E).apaga, lâmpada(E).
????---- acende, lâmpada(E).acende, lâmpada(E).acende, lâmpada(E).acende, lâmpada(E).
Digite os predicados definidos no Exemplo 4 e faça as consultas a seguir:????---- lâmpada(E).lâmpada(E).lâmpada(E).lâmpada(E).
????---- apaga, lâmpada(E).apaga, lâmpada(E).apaga, lâmpada(E).apaga, lâmpada(E).
????---- acende, lâmpada(E).acende, lâmpada(E).acende, lâmpada(E).acende, lâmpada(E).
Simulação de ambiente dinâmico
Exemplo 5. Um agente que anda, pega e solta objetosExemplo 5. Um agente que anda, pega e solta objetos
::::---- dynamicdynamicdynamicdynamic pospospospos/2/2/2/2, , , , segsegsegseg/1/1/1/1....
pospospospos(agente,garagem).(agente,garagem).(agente,garagem).(agente,garagem).
pospospospos(micro,cozinha).(micro,cozinha).(micro,cozinha).(micro,cozinha).
pospospospos(rádio,quarto).(rádio,quarto).(rádio,quarto).(rádio,quarto).
andeandeandeande(L) :(L) :(L) :(L) :---- pospospospos(agente,L), (agente,L), (agente,L), (agente,L), !!!!....
andeandeandeande(L) :(L) :(L) :(L) :---- retractretractretractretract((((pospospospos(agente,P)), (agente,P)), (agente,P)), (agente,P)), assertaassertaassertaasserta((((pospospospos(agente,L)),(agente,L)),(agente,L)),(agente,L)),
::::---- dynamicdynamicdynamicdynamic pospospospos/2/2/2/2, , , , segsegsegseg/1/1/1/1....
pospospospos(agente,garagem).(agente,garagem).(agente,garagem).(agente,garagem).
pospospospos(micro,cozinha).(micro,cozinha).(micro,cozinha).(micro,cozinha).
pospospospos(rádio,quarto).(rádio,quarto).(rádio,quarto).(rádio,quarto).
andeandeandeande(L) :(L) :(L) :(L) :---- pospospospos(agente,L), (agente,L), (agente,L), (agente,L), !!!!....
andeandeandeande(L) :(L) :(L) :(L) :---- retractretractretractretract((((pospospospos(agente,P)), (agente,P)), (agente,P)), (agente,P)), assertaassertaassertaasserta((((pospospospos(agente,L)),(agente,L)),(agente,L)),(agente,L)),
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 11
formatformatformatformat('('('('~nAnda~nAnda~nAnda~nAnda de ~w até ~w',[P,L]), de ~w até ~w',[P,L]), de ~w até ~w',[P,L]), de ~w até ~w',[P,L]), !!!!....
peguepeguepeguepegue(O) :(O) :(O) :(O) :---- segsegsegseg(O), (O), (O), (O), !!!!....
peguepeguepeguepegue(O) :(O) :(O) :(O) :---- pospospospos(O,P), ande(P),(O,P), ande(P),(O,P), ande(P),(O,P), ande(P),
retractretractretractretract((((pospospospos(O,_)), (O,_)), (O,_)), (O,_)), assertassertassertassert((((segsegsegseg(O)), (O)), (O)), (O)),
formatformatformatformat('('('('~nPega~nPega~nPega~nPega ~w',[O]), ~w',[O]), ~w',[O]), ~w',[O]), !!!!. . . .
soltesoltesoltesolte(O) :(O) :(O) :(O) :---- notnotnotnot((((segsegsegseg(O)), (O)), (O)), (O)), !!!!....soltesoltesoltesolte(O) :(O) :(O) :(O) :---- pospospospos(agente,P),(agente,P),(agente,P),(agente,P),
retractretractretractretract((((segsegsegseg(O)), (O)), (O)), (O)), assertassertassertassert((((pospospospos(O,P)), (O,P)), (O,P)), (O,P)), formatformatformatformat('('('('~nSolta~nSolta~nSolta~nSolta ~w',[O]), ~w',[O]), ~w',[O]), ~w',[O]), !!!!. . . .
formatformatformatformat('('('('~nAnda~nAnda~nAnda~nAnda de ~w até ~w',[P,L]), de ~w até ~w',[P,L]), de ~w até ~w',[P,L]), de ~w até ~w',[P,L]), !!!!....
peguepeguepeguepegue(O) :(O) :(O) :(O) :---- segsegsegseg(O), (O), (O), (O), !!!!....
peguepeguepeguepegue(O) :(O) :(O) :(O) :---- pospospospos(O,P), ande(P),(O,P), ande(P),(O,P), ande(P),(O,P), ande(P),
retractretractretractretract((((pospospospos(O,_)), (O,_)), (O,_)), (O,_)), assertassertassertassert((((segsegsegseg(O)), (O)), (O)), (O)),
formatformatformatformat('('('('~nPega~nPega~nPega~nPega ~w',[O]), ~w',[O]), ~w',[O]), ~w',[O]), !!!!. . . .
soltesoltesoltesolte(O) :(O) :(O) :(O) :---- notnotnotnot((((segsegsegseg(O)), (O)), (O)), (O)), !!!!....soltesoltesoltesolte(O) :(O) :(O) :(O) :---- pospospospos(agente,P),(agente,P),(agente,P),(agente,P),
retractretractretractretract((((segsegsegseg(O)), (O)), (O)), (O)), assertassertassertassert((((pospospospos(O,P)), (O,P)), (O,P)), (O,P)), formatformatformatformat('('('('~nSolta~nSolta~nSolta~nSolta ~w',[O]), ~w',[O]), ~w',[O]), ~w',[O]), !!!!. . . .
Simulação de ambiente dinâmico
Exercício 9. Um agente que anda, pega e solta objetosExercício 9. Um agente que anda, pega e solta objetos
Digite o programa do Exemplo 5 e faça as consultas a seguir:????---- pegue(rádio), ande(sala), solte(rádio), ande(rua).pegue(rádio), ande(sala), solte(rádio), ande(rua).pegue(rádio), ande(sala), solte(rádio), ande(rua).pegue(rádio), ande(sala), solte(rádio), ande(rua).
????---- pegue(rádio), ande(cozinha), solte(rádio).pegue(rádio), ande(cozinha), solte(rádio).pegue(rádio), ande(cozinha), solte(rádio).pegue(rádio), ande(cozinha), solte(rádio).
Digite o programa do Exemplo 5 e faça as consultas a seguir:????---- pegue(rádio), ande(sala), solte(rádio), ande(rua).pegue(rádio), ande(sala), solte(rádio), ande(rua).pegue(rádio), ande(sala), solte(rádio), ande(rua).pegue(rádio), ande(sala), solte(rádio), ande(rua).
????---- pegue(rádio), ande(cozinha), solte(rádio).pegue(rádio), ande(cozinha), solte(rádio).pegue(rádio), ande(cozinha), solte(rádio).pegue(rádio), ande(cozinha), solte(rádio).
Exercício 10. Levar um objeto de um local para outroExercício 10. Levar um objeto de um local para outro
Defina o predicado leve(O,L)leve(O,L)leve(O,L)leve(O,L), que faz o agente levar o objeto OOOO para o local LLLL; em Defina o predicado leve(O,L)leve(O,L)leve(O,L)leve(O,L), que faz o agente levar o objeto OOOO para o local LLLL; em
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 12
Defina o predicado leve(O,L)leve(O,L)leve(O,L)leve(O,L), que faz o agente levar o objeto OOOO para o local LLLL; em seguida, faça as consultas a seguir:• ????---- leve(micro,quintal).leve(micro,quintal).leve(micro,quintal).leve(micro,quintal).
• ????---- leve(rádio,banheiro).leve(rádio,banheiro).leve(rádio,banheiro).leve(rádio,banheiro).
Defina o predicado leve(O,L)leve(O,L)leve(O,L)leve(O,L), que faz o agente levar o objeto OOOO para o local LLLL; em seguida, faça as consultas a seguir:• ????---- leve(micro,quintal).leve(micro,quintal).leve(micro,quintal).leve(micro,quintal).
• ????---- leve(rádio,banheiro).leve(rádio,banheiro).leve(rádio,banheiro).leve(rádio,banheiro).
Exercício 11. Descobrindo as posições de novos objetosExercício 11. Descobrindo as posições de novos objetos
Modifique o predicado pegue(O)pegue(O)pegue(O)pegue(O) de modo que, quando a posição do objeto for desconhecida, o agente pergunte ao usuário a sua localização; depois, faça a consulta:• ????---- leve(notebook,sala), ande(rua), leve(notebook,escritório).leve(notebook,sala), ande(rua), leve(notebook,escritório).leve(notebook,sala), ande(rua), leve(notebook,escritório).leve(notebook,sala), ande(rua), leve(notebook,escritório).
Modifique o predicado pegue(O)pegue(O)pegue(O)pegue(O) de modo que, quando a posição do objeto for desconhecida, o agente pergunte ao usuário a sua localização; depois, faça a consulta:• ????---- leve(notebook,sala), ande(rua), leve(notebook,escritório).leve(notebook,sala), ande(rua), leve(notebook,escritório).leve(notebook,sala), ande(rua), leve(notebook,escritório).leve(notebook,sala), ande(rua), leve(notebook,escritório).
Memória persistente
As informações armazenadas na base de dados do Prolog são voláteis, ou seja, são descartadas assim que o sistema finaliza a sua execução.
Assim, para que estas informações persistam de uma execução para outra, é necessário que elas sejam preservadas em um arquivo em disco.
As informações armazenadas na base de dados do Prolog são voláteis, ou seja, são descartadas assim que o sistema finaliza a sua execução.
Assim, para que estas informações persistam de uma execução para outra, é necessário que elas sejam preservadas em um arquivo em disco.
tell(A)tell(A)tell(A)tell(A): redireciona a saída padrão para o arquivo de nome AAAA.
toldtoldtoldtold: volta a enviar informações para a saída padrão (vídeo).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 13
toldtoldtoldtold: volta a enviar informações para a saída padrão (vídeo).
see(A)see(A)see(A)see(A): redireciona a entrada padrão para o arquivo de nome AAAA.
seenseenseenseen: volta a ler informações da entrada padrão (teclado).
Exercício 12. Redirecionamento de entrada/saída padrãoExercício 12. Redirecionamento de entrada/saída padrão
Faça as consultas a seguir e analise os resultados obtidos:
• ????---- telltelltelltell('('('('arqarqarqarq....plplplpl'), '), '), '), writelnwritelnwritelnwriteln('um.'), ('um.'), ('um.'), ('um.'), writelnwritelnwritelnwriteln('dois.'), ('dois.'), ('dois.'), ('dois.'), toldtoldtoldtold....
• ????---- seeseeseesee('('('('arqarqarqarq....plplplpl'), '), '), '), readreadreadread(X), (X), (X), (X), readreadreadread(Y), (Y), (Y), (Y), readreadreadread(Z), (Z), (Z), (Z), seenseenseenseen. . . .
Faça as consultas a seguir e analise os resultados obtidos:
• ????---- telltelltelltell('('('('arqarqarqarq....plplplpl'), '), '), '), writelnwritelnwritelnwriteln('um.'), ('um.'), ('um.'), ('um.'), writelnwritelnwritelnwriteln('dois.'), ('dois.'), ('dois.'), ('dois.'), toldtoldtoldtold....
• ????---- seeseeseesee('('('('arqarqarqarq....plplplpl'), '), '), '), readreadreadread(X), (X), (X), (X), readreadreadread(Y), (Y), (Y), (Y), readreadreadread(Z), (Z), (Z), (Z), seenseenseenseen. . . .
Memória persistente
Exemplo 6. Agente com memória persistenteExemplo 6. Agente com memória persistente
memorizememorizememorizememorize ::::----telltelltelltell('dados.('dados.('dados.('dados.plplplpl'), '), '), '), forallforallforallforall((((pospospospos(X,Y), (X,Y), (X,Y), (X,Y), formatformatformatformat('~w.~n',[('~w.~n',[('~w.~n',[('~w.~n',[pospospospos(X,Y)])),(X,Y)])),(X,Y)])),(X,Y)])),forallforallforallforall((((segsegsegseg(X), (X), (X), (X), formatformatformatformat('~w.~n',[('~w.~n',[('~w.~n',[('~w.~n',[segsegsegseg(X)])),(X)])),(X)])),(X)])),toldtoldtoldtold. . . .
relembrerelembrerelembrerelembre ::::----retractallretractallretractallretractall((((pospospospos(_,_)),(_,_)),(_,_)),(_,_)),retractallretractallretractallretractall((((segsegsegseg(_)),(_)),(_)),(_)),
memorizememorizememorizememorize ::::----telltelltelltell('dados.('dados.('dados.('dados.plplplpl'), '), '), '), forallforallforallforall((((pospospospos(X,Y), (X,Y), (X,Y), (X,Y), formatformatformatformat('~w.~n',[('~w.~n',[('~w.~n',[('~w.~n',[pospospospos(X,Y)])),(X,Y)])),(X,Y)])),(X,Y)])),forallforallforallforall((((segsegsegseg(X), (X), (X), (X), formatformatformatformat('~w.~n',[('~w.~n',[('~w.~n',[('~w.~n',[segsegsegseg(X)])),(X)])),(X)])),(X)])),toldtoldtoldtold. . . .
relembrerelembrerelembrerelembre ::::----retractallretractallretractallretractall((((pospospospos(_,_)),(_,_)),(_,_)),(_,_)),retractallretractallretractallretractall((((segsegsegseg(_)),(_)),(_)),(_)),
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 14
retractallretractallretractallretractall((((segsegsegseg(_)),(_)),(_)),(_)),seeseeseesee('dados.('dados.('dados.('dados.plplplpl'), '), '), '), repeatrepeatrepeatrepeat, , , , read(C), read(C), read(C), read(C), assertassertassertassert(C), (C), (C), (C), C=C=C=C=end_of_fileend_of_fileend_of_fileend_of_file, , , ,
retractretractretractretract((((end_of_fileend_of_fileend_of_fileend_of_file), !,), !,), !,), !,seenseenseenseen. . . .
retractallretractallretractallretractall((((segsegsegseg(_)),(_)),(_)),(_)),seeseeseesee('dados.('dados.('dados.('dados.plplplpl'), '), '), '), repeatrepeatrepeatrepeat, , , , read(C), read(C), read(C), read(C), assertassertassertassert(C), (C), (C), (C), C=C=C=C=end_of_fileend_of_fileend_of_fileend_of_file, , , ,
retractretractretractretract((((end_of_fileend_of_fileend_of_fileend_of_file), !,), !,), !,), !,seenseenseenseen. . . .
Exercício 13. Agente com memória persistenteExercício 13. Agente com memória persistente
Acrescente as definições acima no programa do robô e teste seu funcionamento.Acrescente as definições acima no programa do robô e teste seu funcionamento.
Bônus: interface gráfica
agenteagenteagenteagente ::::----
inicia,inicia,inicia,inicia,
newnewnewnew(D,(D,(D,(D,dialogdialogdialogdialog('Agente')),('Agente')),('Agente')),('Agente')),
sendsendsendsend(D,append,(D,append,(D,append,(D,append,bitmapbitmapbitmapbitmap((((imageimageimageimage('ambiente.bmp'))),('ambiente.bmp'))),('ambiente.bmp'))),('ambiente.bmp'))),
sendsendsendsend(D,display,(D,display,(D,display,(D,display,newnewnewnew(@o1,(@o1,(@o1,(@o1,boxboxboxbox(20,20))),(20,20))),(20,20))),(20,20))),
sendsendsendsend(@o1,fill_pattern,(@o1,fill_pattern,(@o1,fill_pattern,(@o1,fill_pattern,colourcolourcolourcolour(yellow)),(yellow)),(yellow)),(yellow)),
sendsendsendsend(@o1,move,(@o1,move,(@o1,move,(@o1,move,pointpointpointpoint(20,30)),(20,30)),(20,30)),(20,30)),
sendsendsendsend(D,display,(D,display,(D,display,(D,display,newnewnewnew(@o2,box(20,20))),(@o2,box(20,20))),(@o2,box(20,20))),(@o2,box(20,20))),
sendsendsendsend(@o2,fill_pattern,(@o2,fill_pattern,(@o2,fill_pattern,(@o2,fill_pattern,colourcolourcolourcolour(green)),(green)),(green)),(green)),
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 15
sendsendsendsend(@o2,fill_pattern,(@o2,fill_pattern,(@o2,fill_pattern,(@o2,fill_pattern,colourcolourcolourcolour(green)),(green)),(green)),(green)),
sendsendsendsend(@o2,move,(@o2,move,(@o2,move,(@o2,move,pointpointpointpoint(20,50)),(20,50)),(20,50)),(20,50)),
sendsendsendsend(D,display,(D,display,(D,display,(D,display,newnewnewnew(@o3,box(20,20))),(@o3,box(20,20))),(@o3,box(20,20))),(@o3,box(20,20))),
sendsendsendsend(@o3,fill_pattern,(@o3,fill_pattern,(@o3,fill_pattern,(@o3,fill_pattern,colourcolourcolourcolour(red)),(red)),(red)),(red)),
sendsendsendsend(@o3,move,(@o3,move,(@o3,move,(@o3,move,pointpointpointpoint(20,70)),(20,70)),(20,70)),(20,70)),
sendsendsendsend(D,append,(D,append,(D,append,(D,append,newnewnewnew(@a,(@a,(@a,(@a,bitmapbitmapbitmapbitmap((((imageimageimageimage('agente.bmp')))),('agente.bmp')))),('agente.bmp')))),('agente.bmp')))),
sendsendsendsend(@a,move,(@a,move,(@a,move,(@a,move,pointpointpointpoint(235,237)),(235,237)),(235,237)),(235,237)),
newnewnewnew(@t,(@t,(@t,(@t,timertimertimertimer(1)),(1)),(1)),(1)),
sendsendsendsend(@t,start),(@t,start),(@t,start),(@t,start),
sendsendsendsend(D,open).(D,open).(D,open).(D,open).
Bônus: interface gráfica
::::---- dynamicdynamicdynamicdynamic posição/2posição/2posição/2posição/2, , , , segurando/1segurando/1segurando/1segurando/1....
iniciainiciainiciainicia ::::----forallforallforallforall((((membermembermembermember(X,[@t,@a,@o1,@o2,@o3]),(X,[@t,@a,@o1,@o2,@o3]),(X,[@t,@a,@o1,@o2,@o3]),(X,[@t,@a,@o1,@o2,@o3]),freefreefreefree(X)),(X)),(X)),(X)),retractallretractallretractallretractall(posição(_,_)),(posição(_,_)),(posição(_,_)),(posição(_,_)),retractallretractallretractallretractall(segurando(_)),(segurando(_)),(segurando(_)),(segurando(_)),assertassertassertassert(posição(agente,9)),(posição(agente,9)),(posição(agente,9)),(posição(agente,9)),assertassertassertassert(posição (1,1)),(posição (1,1)),(posição (1,1)),(posição (1,1)),assertassertassertassert(posição (2,1)),(posição (2,1)),(posição (2,1)),(posição (2,1)),
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 16
assertassertassertassert(posição (3,1)).(posição (3,1)).(posição (3,1)).(posição (3,1)).
porta(1,4).porta(1,4).porta(1,4).porta(1,4).porta(2,5).porta(2,5).porta(2,5).porta(2,5).porta(3,6).porta(3,6).porta(3,6).porta(3,6).porta(4,5).porta(4,5).porta(4,5).porta(4,5).porta(4,7).porta(4,7).porta(4,7).porta(4,7).porta(5,6).porta(5,6).porta(5,6).porta(5,6).porta(5,8).porta(5,8).porta(5,8).porta(5,8).porta(6,9).porta(6,9).porta(6,9).porta(6,9).
Bônus: interface gráfica
passagem(X,Y) :passagem(X,Y) :passagem(X,Y) :passagem(X,Y) :---- porta(X,Y).porta(X,Y).porta(X,Y).porta(X,Y).
passagem(X,Y) :passagem(X,Y) :passagem(X,Y) :passagem(X,Y) :---- porta(Y,X).porta(Y,X).porta(Y,X).porta(Y,X).
rota(X,X,[X]) :rota(X,X,[X]) :rota(X,X,[X]) :rota(X,X,[X]) :---- !.!.!.!.
rota(X,Y,[X|R]) :rota(X,Y,[X|R]) :rota(X,Y,[X|R]) :rota(X,Y,[X|R]) :---- passagem(X,Z), rota(Z,Y,R).passagem(X,Z), rota(Z,Y,R).passagem(X,Z), rota(Z,Y,R).passagem(X,Z), rota(Z,Y,R).
% comandos para o agente% comandos para o agente% comandos para o agente% comandos para o agente
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 17
andaandaandaanda(L) :(L) :(L) :(L) :----
posição(agente,L), !.posição(agente,L), !.posição(agente,L), !.posição(agente,L), !.
andaandaandaanda(L) :(L) :(L) :(L) :----
retractretractretractretract(posição(agente,P)), (posição(agente,P)), (posição(agente,P)), (posição(agente,P)),
assertassertassertassert(posição(agente,L)), (posição(agente,L)), (posição(agente,L)), (posição(agente,L)),
lengthlengthlengthlength(R,_), (R,_), (R,_), (R,_),
rota(P,L,R), rota(P,L,R), rota(P,L,R), rota(P,L,R),
siga(R), !.siga(R), !.siga(R), !.siga(R), !.
Bônus: interface gráfica
pegapegapegapega(O) :(O) :(O) :(O) :----segurando(O), !.segurando(O), !.segurando(O), !.segurando(O), !.
pegapegapegapega(O) :(O) :(O) :(O) :----posição(O,P), posição(O,P), posição(O,P), posição(O,P), anda(P), anda(P), anda(P), anda(P), retractretractretractretract(posição(O,_)), (posição(O,_)), (posição(O,_)), (posição(O,_)), assertassertassertassert(segurando(O)),(segurando(O)),(segurando(O)),(segurando(O)),get(@a,position,X),get(@a,position,X),get(@a,position,X),get(@a,position,X),obj(O,No,_),obj(O,No,_),obj(O,No,_),obj(O,No,_),sendsendsendsend(No,move,X), !. (No,move,X), !. (No,move,X), !. (No,move,X), !.
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 18
sendsendsendsend(No,move,X), !. (No,move,X), !. (No,move,X), !. (No,move,X), !.
soltasoltasoltasolta(O) :(O) :(O) :(O) :----notnotnotnot(segurando(O)), !.(segurando(O)), !.(segurando(O)), !.(segurando(O)), !.
soltasoltasoltasolta(O) :(O) :(O) :(O) :----posição(agente,P), posição(agente,P), posição(agente,P), posição(agente,P), notnotnotnot((((membermembermembermember(P,[5,6])), (P,[5,6])), (P,[5,6])), (P,[5,6])), retractretractretractretract(segurando(O)), (segurando(O)), (segurando(O)), (segurando(O)), assertassertassertassert(posição(O,P)), (posição(O,P)), (posição(O,P)), (posição(O,P)), getgetgetget(@a,position,(@a,position,(@a,position,(@a,position,pointpointpointpoint(X,Y)),(X,Y)),(X,Y)),(X,Y)),obj(O,No,Yo), X1 obj(O,No,Yo), X1 obj(O,No,Yo), X1 obj(O,No,Yo), X1 isisisis XXXX----20, Y1 20, Y1 20, Y1 20, Y1 isisisis Y+Yo,Y+Yo,Y+Yo,Y+Yo,sendsendsendsend(No,move,(No,move,(No,move,(No,move,pointpointpointpoint(X1,Y1)), !.(X1,Y1)), !.(X1,Y1)), !.(X1,Y1)), !.
Bônus: interface gráfica
sigasigasigasiga([]).([]).([]).([]).sigasigasigasiga([S|R]) :([S|R]) :([S|R]) :([S|R]) :---- mova(S), mova(S), mova(S), mova(S), sendsendsendsend(@t,delay), (@t,delay), (@t,delay), (@t,delay), sigasigasigasiga(R).(R).(R).(R).
movamovamovamova(S) :(S) :(S) :(S) :----sala(S,X,Y), sala(S,X,Y), sala(S,X,Y), sala(S,X,Y), forallforallforallforall(segurando(O),(obj(O,No,_),(segurando(O),(obj(O,No,_),(segurando(O),(obj(O,No,_),(segurando(O),(obj(O,No,_),
sendsendsendsend(No,move,(No,move,(No,move,(No,move,pointpointpointpoint(X,Y)))),(X,Y)))),(X,Y)))),(X,Y)))),sendsendsendsend(@a,move,(@a,move,(@a,move,(@a,move,pointpointpointpoint(X,Y)).(X,Y)).(X,Y)).(X,Y)).
sala(1, 45, 47).sala(1, 45, 47).sala(1, 45, 47).sala(1, 45, 47).sala(2, 140, 47).sala(2, 140, 47).sala(2, 140, 47).sala(2, 140, 47).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 19
sala(2, 140, 47).sala(2, 140, 47).sala(2, 140, 47).sala(2, 140, 47).sala(3, 235, 47).sala(3, 235, 47).sala(3, 235, 47).sala(3, 235, 47).sala(4, 45, 142).sala(4, 45, 142).sala(4, 45, 142).sala(4, 45, 142).sala(5, 140, 142).sala(5, 140, 142).sala(5, 140, 142).sala(5, 140, 142).sala(6, 235, 142).sala(6, 235, 142).sala(6, 235, 142).sala(6, 235, 142).sala(7, 45, 237).sala(7, 45, 237).sala(7, 45, 237).sala(7, 45, 237).sala(8, 140, 237).sala(8, 140, 237).sala(8, 140, 237).sala(8, 140, 237).sala(9, 235, 237).sala(9, 235, 237).sala(9, 235, 237).sala(9, 235, 237).
obj(1, @o1, obj(1, @o1, obj(1, @o1, obj(1, @o1, ----20).20).20).20).obj(2, @o2, 0).obj(2, @o2, 0).obj(2, @o2, 0).obj(2, @o2, 0).obj(3, @o3, +20).obj(3, @o3, +20).obj(3, @o3, +20).obj(3, @o3, +20).