Next: Espiral Up: Enunciados Previous: Compacta

Troca

Pretende-se implementar o predicado troca/2 que é chamado com o primeiro argumento instanciado com uma lista de inteiros positivos e com o segundo argumento livre (por instanciar). O predicado deve unificar o segundo argumento com o valor máximo do primeiro argumento. O valor básico de uma lista de inteiros, é obtido aplicando, alternadamente, as operações de diferença e soma aos seus elementos. Por exemplo

         ?- valor([9,8,2],V). % V = 9-8+2 = 3
V = 3

         ?- valor([1,4,89,12],V). % V = 1-4+89-12 = 74
V = 74

Qualquer outro valor da lista é o valor básico de uma lista que se obtém trocando a posição dos números na lista. Esta operação de troca de números é um bocado peculiar. Primeiro de tudo, ela funciona na representação decimal dos inteiros na lista. Em segundo lugar, ela só é possível em números que estejam em posições vizinhas na lista. Eis alguns exemplos de mudanças entre dois elementos vizinhos numa lista:

         17,34    transforma-se em    43,71

         123,45   transforma-se em    54,321

Percebido? Mais uma restrição: os números não poderão mover-se mais longe do que as posições vizinhas na lista. Assim,

         [12,34,56]  em  [43,65,12]

não é possível, uma vez que o número 12 foi movido duas posições na lista.
Seguem-se dois exemplos mostrando o comportamento desejado do predicado troca/2:

         ?- troca([1,2],V).
            V = 1

         ?- troca([12,56,34],V).
            V = 78




1999-04-01