Next: Diamante Up: Enunciados Previous: Gera Código
O meu canalizador deixou a canalização da minha casa num estado verdadeiramente deplorável. A rede de canos comporta-se como uma colecção de canos aleatoriamente ligados (ainda não consegui perceber a lógica, se é que existe). Felizmente, ele ligou --de uma ou mais maneiras-- cada torneira ao depósito central de abastecimento de água e instalou válvulas em alguns canos, de maneira que eu posso evitar o fluxo de água (em qualquer das direcções) através desse cano. Esta manhã, uma torneira estava a pingar e antes de sair de casa, quis fechar um número suficiente de válvulas de modo a prevenir aquela torneira de pingar, mas não muitas, de modo a ter um número máximo de outras torneiras ainda capazes de dar água. Isto pareceu-me elementar: conhecendo a (planta da) minha casa como conheço, pensei numa solução, e fechei as válvulas que calculei a partir do meu plano. A torneira, essa continuou a pingar ... e mais uma vez cheguei atrasado às minhas aulas! Resulta que algumas válvulas não fecham correctamente :-( significando que não posso confiar no meu plano. Ajudem-me, por favor. Para isso escrevam um programa em Prolog que dada uma ``planta da casa'', como um conjunto de factos descrevendo a rede de canos:
Os argumentos de todos estes factos são constantes, representando um nó da rede, a
entrada, ou uma torneira. Também pode usar um predicado daAgua/2, que é chamado
dando no primeiro argumento uma torneira e no segundo argumento uma lista de válvulas que
quer fechadas. A chamada ao predicado daAgua/2 tem sucesso se, e sómente se, o
fechar das válvulas não evita o fluxo de água da entrada para a torneira. Digamos que
é o análogo de eu andar a correr, escadas acima, escadas abaixo, fechando válvulas
(andar de baixo) e verificando se a torneira (andar de cima) ainda está activa. A
diferença é que eu fico mais cansado ...
Escreva um predicado fechaValvulas/1 que é chamado com uma variável livre (por
instanciar) e que a unifica com uma lista de válvulas que precisam de ser fechadas de
modo a que a torneira que pinga deixe de pingar e de modo que o número de outras
torneiras ainda capazes de deitar água seja máximo. Oh, o meu canalizador talvez tenha
sido tão desajeitado, que seja impossível parar a torneira de pingar! Nesse caso o
predicado fechaValvulas/1 pode falhar --em tempo finito, claro! Mais uma coisa:
eu não tenho a certeza de que todas as torneiras estão ligadas à entrada ... o meu
canalizador foi mesmo muito mau!
Next: Diamante Up: Enunciados Previous: Gera Código