20
Predicados dinâmicos Prof. Dr. Silvio do Lago Pereira Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Prof. Dr. Silvio do Lago Pereira - ime.usp.brslago/pl-09.pdf · uma solução na base de dados dinâmica só se ela não foi incluída anteriormente. Prof. Dr. Silvio do Lago Pereira

Embed Size (px)

Citation preview

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

Fim