Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Prolog - 1001 exercicios resolvidos, Exercícios de Informática

Prolog para todas as ocasiões: 1001 exercícios resolvidos de programação em lógica usando SWI-Prolog

Tipologia: Exercícios

2016

Compartilhado em 16/06/2016

gu-de-aguiar-2
gu-de-aguiar-2 🇧🇷

4.9

(25)

20 documentos

1 / 80

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Prolog para todas as ocasiões:
1001 exercícios resolvidos de programação em
lógica usando SWI-Prolog
Alexsandro Santos Soares
Marcelo Cupertino
©Versão preliminar desenvolvida em 9 de dezembro de 2010
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50

Pré-visualização parcial do texto

Baixe Prolog - 1001 exercicios resolvidos e outras Exercícios em PDF para Informática, somente na Docsity!

Prolog para todas as ocasiões:

1001 exercícios resolvidos de programação em

lógica usando SWI-Prolog

Alexsandro Santos Soares

Marcelo Cupertino

© Versão preliminar desenvolvida em 9 de dezembro de 2010

Sumário

1 Processamento simbólico

1.1 Árvore genealógica

Ex. 1 — (Sexo dos personagens da série Os Simpsons ) Escrever uma banco de dados sobre o sexo de cada personagem integrante da família Simpson e também sobre a relação de progenitor.

Solução:

% Fatos.

homem( abraham). homem( clancy). homem( herbert). homem( homer). homem( bart).

mulher( mona). mulher( jacqueline). mulher( abbie). mulher( marge). mulher( patty). mulher( selma). mulher( lisa). mulher( maggie). mulher( ling).

progenitor( abraham, homer). progenitor( abraham, abbie). progenitor( abraham, herbert). progenitor( mona, homer).

progenitor( clancy, marge). progenitor( clancy, patty ). progenitor( clancy, selma). progenitor( jacqueline, marge). progenitor( jacqueline, patty ). progenitor( jacqueline, selma).

3

Árvore genealógica 4

progenitor( homer, bart). progenitor( homer, lisa). progenitor( homer, maggie). progenitor( marge, bart). progenitor( marge, lisa). progenitor( marge, maggie).

progenitor( selma, ling ).

Uso: SWI ?- mulher(Quem). % Quem são as mulheres da família? Quem = mona ; Quem = jacqueline ; Quem = abbie ; Quem = marge ; Quem = patty ; Quem = selma ; Quem = lisa ; Quem = maggie ; Quem = ling.

?- progenitor(Quem,selma). % Quem são os progenitores de Selma? Quem = clancy ; Quem = jacqueline ; false.

PComentário O banco de dados desenvolvido aqui será reutilizado nos exercícios seguin- tes.

Ex. 2 — (Relações de parentesco: pai, mãe, filho, filha e irmãos) Como de- terminar quem é pai, mãe, filho, filha ou irmãos em uma família?

Solução:

pai( P, F):− homem( P), progenitor( P, F). mae( M, F):− mulher( M), progenitor( M, F).

filho ( F, P):− homem( F), progenitor( P, F). filha ( F, P):− mulher( F), progenitor( P, F).

Árvore genealógica 6

homem( T), irmaos( T, P), progenitor( P, S).

tia ( T, S) :− mulher( T), irmaos( T, P), progenitor( P, S).

primo( A, B) :− homem( A), progenitor( X, A), irmaos( X, Y), progenitor( Y, B).

prima( A, B) :− mulher( A), progenitor( X, A), irmaos( X, Y), progenitor( Y, B).

avo( A, B) :− pai( A, X), progenitor( X, B). avoh( A, B) :− mae( A, X), progenitor( X, B).

Uso: SWI ?- tio(Tio,Quem). % Quem é tio de quem? Tio = herbert, Quem = bart ; Tio = herbert, Quem = lisa ; Tio = herbert, Quem = maggie ; false.

?- tia(patty,Quem). % De quem Patty é tia? Quem = bart ; Quem = lisa ; Quem = maggie ; Quem = ling ; Quem = bart ;

Árvore genealógica 7

Quem = lisa ; Quem = maggie ; Quem = ling ; false.

?- primo(bart,Quem). % De quem Bart é primo? Quem = ling ; Quem = ling ; false.

?- prima(A,B). % Quem é primo de quem? A = lisa, B = ling ; A = lisa, B = ling ; A = maggie, B = ling ; A = maggie, B = ling ; A = ling, B = bart ; A = ling, B = lisa ; A = ling, B = maggie ; A = ling, B = bart ; A = ling, B = lisa ; A = ling, B = maggie ; false.

?- avo(Avo,Quem). % Quem é avô de quem? Avo = abraham, Quem = bart ; Avo = abraham, Quem = lisa ; Avo = abraham, Quem = maggie ; Avo = clancy, Quem = bart ; Avo = clancy, Quem = lisa ; Avo = clancy,

Desafios lógicos 9

tocaAntes( Y, Z, S), nome( Y, john), toca( Y, sax), pais( Z, australia ), tocaAntes( Y1, Z1, S), nome( Y1, mark), pais( Y1, eua), toca( Z1, violino ), membros( U, S), pais( U, japao), membros( V, S), nome( V, sam).

banda_solista( banda( solista( N1, P1, I1), solista ( N2, P2, I2), solista ( N3, P3, I3 ))).

nome( solista( N,,), N).

pais( solista (, P, ), P).

toca( solista (,, I ), I ).

primeiro( X, banda( X,,)).

tocaAntes( X, Y, banda( X, Y, Z)). tocaAntes( X, Z, banda( X, Y, Z)). tocaAntes( Y, Z, banda( X, Y, Z)).

membros( X, banda( X, Y, Z)). membros( Y, banda( X, Y, Z)). membros( Z, banda( X, Y, Z)).

Uso: SWI ?- solucao_musicos(Sol). Sol = banda(solista(mark, eua, piano), solista(john, japao, sax), solista(sam, australia, violino)).

PComentário Podemos reescrever o problema dado de uma forma mais lógica: S é uma solução para o problema dos músicos se S é uma banda com três solistas,

Desafios lógicos 10

na qual o primeiro membro X de S toca piano, e existem dois membros ordenados Y, Z de S tal que o nome de Y é John, Y toca saxofone e Z vem da Austrália, e existem dois membros ordenados Y1, Z1 de S tal que o nome de Y1 é Mark, Y1 vem dos Estados Unidos, e Z1 toca violino, e existe um membro U de S que vem do Japão, e existe um membro V de S cujo nome é Sam.

Agora precisamos criar uma forma para a solução. Cada solista possui um nome, um país de origem e um instrumento. Podemos respresentá-lo usando o termo solista ( N, P, I), no qual:

N: é o nome do solista;

P: é o país de origem; e

I: é o instrumento que o solista toca.

Com este termo em mãos, a solução para o problema será representada pelo termo banda( solista( N1, P1, I1), solista ( N2, P2, I2), solista ( N3, P3, I3))

Ex. 5 — (Problema do jantar) Num fim de semana chuvoso (sexta, sá- bado e domingo), três mulheres tiveram a mesma ideia: fazer uma sopa para o jantar da família. As sopas foram de agrião, cebola e ervilha. Uma das mulheres se chama Nádia. Conforme as informações a seguir, descubra seus nomes, em que dia da semana cada uma fez sopa e que tipo de sopa preparou para o jantar:

1.Ana Lúcia fez sopa de ervilha. 2.A sopa de cebola foi preparada para o jantar de domingo. 3.Dalva resolveu fazer sopa na sexta-feira.

Solução:

solucao_jantar( S):− solucao( S), membros( X, S), nome( X, ana), sopa( X, ervilha), membros( Y, S), dia( Y, domingo), sopa( Y, cebola),

Desafios lógicos 12

membros( X, S), nome( X, nelson), membros( Y, S), local( Y, floresta ), membros( Z, S), entidade( Z, dragao), membros( T, S), nome( T, roberto), entidade( T, unicornio), membros( U, S), entidade( U, bruxo), local( U, pantano), membros( V, S), nome( V, juliano), local( V, castelo).

garotos( aventura( garoto( N1, E1, L1), garoto( N2, E2, L2), garoto( N3, E3, L3))).

membros( X, aventura( X,,)). membros( X, aventura(, X,)). membros( X, aventura(,, X)).

nome( garoto( N,,), N). entidade( garoto(, E,), E). local ( garoto(,, L), L).

Uso: SWI solucao_aventura(Sol). Sol = aventura(garoto(nelson, bruxo, pantano), garoto(roberto, unicornio, floresta), garoto(juliano, dragao, castelo)).

** Ex. 7 — (Barcos pesqueiros) Assim que escurece, cinco barcos pesquei- ros saem do porto em busca da pescaria. Com as informações que seguem, descubra o nome e o número de registro de cada barco, o nome de seus mestres arrais e o que foram pescar.

1.O E34 pescará sardinhas. 2.O “Marina” é o E18, enquanto o “Gaivota” navega sob o comando do mestre Benedito. 3.A tripulação do “Jangada” está pegando siris. O “Rei dos Mares” não está a procura de badejos e seu mestre não é Wanderson. 4.Nem a tripulação do “Netuno” nem o mestre Bernardo e sua tripula- ção pegarão lagostas. 5.O barco do mestre Hélio, E60, não é o “Jangada” nem o “Rei dos Ma- res”.

Desafios lógicos 13

6.O mestre Fernando espera pescar muitos dourados em um barco cujo nome começa com “M”. 7.O registro do “Gaivota” não é E56. 8.Dois registros são E42 e E60.

Solução:

resolve( S):− solucao( S), membros( A, S), registro( A, e34), pesca( A, sardinhas), membros( B, S), nome( B, marina), registro( B, e18), membros( C, S), nome( C, gaivota), mestre( C, benedito), membros( D, S), nome( D, jangada), pesca( D, siris), membros( E, S), nome( E, rei_dos_mares), membros( F, S), nome( F, netuno), membros( G, S), mestre( G, bernardo), membros( H, S), mestre( H, helio), registro( H, e60), membros( I, S), mestre( I, fernando), pesca( I , dourados), nome( I, NI), comeca_com( NI, m), membros( J, S), nome( J, gaivota), membros( K, S), registro( K, e42), membros( L, S), registro( L, e60), membros( M, S), mestre( M, wanderson), membros( N, S), pesca( N, lagostas), membros( O, S), pesca( O, badejos), membros( P, S), registro( P, e56), pesca( E, PE), PE == badejos, mestre( E, ME), ME == wanderson, pesca( F, PF), PF == lagostas, pesca( G, PG), PG == lagostas, nome( H, NH), NH == jangada, NH == rei_dos_mares, registro ( J, RJ), J == e56.

solucao( pescaria( barco( N1, R1, M1, P1), barco( N2, R2, M2, P2), barco( N3, R3, M3, P3), barco( N4, R4, M4, P4), barco( N5, R5, M5, P5))).

Desafios lógicos 15

7.Um dos Tê Vês se chama Gegê.

Solução:

resolve( S):− solucao( S), membros( A, S), nome( A, luna), cor( A, amarelo), membros( B, S), nome( B, didi), cor( B, CB), membros( C, S), cor( C, verde), roupa( C, RC), funcao( C, FC), membros( D, S), funcao( D, cozinheiro), roupa( D, avental), membros( E, S), roupa( E, chapeu), cor( E, CE), funcao( E, FE), membros( F, S), cor( F, lilas ), funcao( F, lavador), roupa( F, RF), membros( G, S), nome( G, dada), funcao( G, faxineiro), roupa( G, RG), membros( H, S), nome( H, bica), roupa( H, sueter), membros( I, S), cor( I, vermelho), roupa( I, casaco), membros( J, S), nome( J, gege), membros( K, S), cor( K, rosa), membros( L, S), funcao( L, jardineiro), membros( M, S), funcao( M, motorista), membros( N, S), roupa( N, calcao), CB == verde, CB == rosa, RC == avental, FC == jardineiro, CE == rosa, FE == motorista, FE == lavador, RF == calcao, RG == chapeu.

solucao( criaturas( tv( N1, C1, R1, F1), tv( N2, C2, R2, F2), tv( N3, C3, R3, F3), tv( N4, C4, R4, F4), tv( N5, C5, R5, F5))).

nome( tv( N,,,_), N).

Desafios lógicos 16

cor( tv(, C,,_ ), C). roupa( tv(,, R,), R). funcao( tv(,,, F), F).

membros( X, criaturas( X,,,,)). membros( X, criaturas(, X,,,)). membros( X, criaturas(,, X,,)). membros( X, criaturas(,,, X,)). membros( X, criaturas(,,,, X)).

Uso: SWI ?- resolve(S). S = criaturas(tv(luna, amarelo, chapeu, jardineiro), tv(didi, vermelho, casaco, motorista), tv(dada, verde, calcao, faxineiro), tv(gege, rosa, avental, cozinheiro), tv(bica, lilas, sueter, lavador)).

PComentário Note que todos os predicados com negação foram colocados no final do programa, depois que todas as variáveis já foram instanciadas.

*** Ex. 9 — (Fazendeiros e suas fazendas) Cinco fazendeiros de uma re- gião resolveram trocar os rebanhos tradicionais por criações exóticas. Com as dicas que seguem, diga o nome de cada fazendeiro, quando ele comprou a sua propriedade, sua medida em acres e o animal exótico que cria.

1.Josué entrou para vida de fazenda mais tarde que o homem que agora cria jacarés, cuja fazenda é menor que a de Josué. 2.A fazenda com 3250 acres foi comprada em 1980. 3.As lhamas são criadas na fazenda comprada logo a seguir à maior fa- zenda. 4.2500 acres é a medida da fazenda onde são criados javalis, que não foi adquirida em 1956. 5.Yago cuida de veados; ele fez sua estréia no mundo das fazendas em uma ano posterior ao que hoje é criador de avestruzes. 6.Tadeu é o dono da fazenda com 3500 acres (que não cria avestruzes).

Recursão 18

nome( fazendeiro( N,,,), N). data( fazendeiro(, D,, ), D). medida( fazendeiro(,, M,), M). animal( fazendeiro(,,, A), A).

membros( X, fazendas( X,,,,)). membros( X, fazendas(, X,,,)). membros( X, fazendas(,, X,,)). membros( X, fazendas(,,, X,)). membros( X, fazendas(,,,, X)).

Uso: SWI ?- resolve(Sol). Sol = fazendas(fazendeiro(josue, 1956, 3600, avestruz), fazendeiro(tadeu, 1949, 3500, jacare), fazendeiro(yago, 1980, 3250, veado), fazendeiro(mariano, 1963, 2750, lhama), fazendeiro(damiao, 1972, 2500, javali)).

PComentário Fizemos uso do predicado == que é verdadeiro sempre que seus argumen- tos não são os mesmos números.

1.3 Recursão

Ex. 10 — (Labirinto) Imagine que a base de conhecimentos seguinte descreva um labirinto. Os fatos determinam quais pontos estão conectados, ou seja, os pontos que se pode alcançar com exatamente um passo. Além disto, imagine que todos os caminhos são ruas de mão única, tal que você somente pode caminhar por elas em uma direção. Assim, você poderá ir do ponto 1 para o ponto 2, mas não poderá ir de 2 para 1.

conectado(1,2). conectado(3,4). conectado(5,6). conectado(7,8). conectado(9,10). conectado(12,13).

Recursão 19

conectado(13,14). conectado(15,16). conectado(17,18). conectado(19,20). conectado(4,1). conectado(6,3). conectado(4,7). conectado(6,11). conectado(14,9). conectado(11,15). conectado(16,12). conectado(14,17). conectado(16,19).

Escreva um predicado caminho/2 que diga até onde se pode chegar par- tindo de um determinado ponto, seguindo as conexões na base de conhe- cimento. Pode-se ir do ponto 5 para o ponto 10? Em quais outros pontos se pode chegar partindo do ponto 1? E quais pontos podem ser alcançados saindo do ponto 13?

Solução:

caminho( X, Y) :− conectado( X, Y). % conexão direta caminho( X, Y) :− conectado( X, Z), % conexão indireta caminho( Z, Y).

Uso: SWI ?- caminho(5,10). true.

?- caminho(1,Y). Y = 2 ; false.

?- caminho(13,Y). Y = 14 ; Y = 9 ; Y = 17 ; Y = 10 ; Y = 18 ;