Next: Diamante Up: Enunciados Previous: Gera Código

Fecha Válvulas

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


1999-04-01