Next: Espiral Up: Enunciados Previous: Compacta
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