Universidade Federal de Uberlândia - FACOM GSI010 – Programação Lógica Exercícios de Revisão – 11/11/2015 Matrícula: Nome: Questão 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pontos Faça um predicado Prolog soma_maiores/3 que, dados uma lista L e um elemento X, determina a soma dos elementos de L que são maiores que X. Escreva duas versões desse código (a) (1 ponto) Sem acumuladores. (b) (1 ponto) Com acumuladores. As duas consultas deverão ser do tipo: ?- soma_maiores([8, 2, 3, 5, 1], 2, S). S = 16. Solução: % Item a) soma_maiores([],_,0). % caso base soma_maiores([Ca|Co],X,S) :Ca > X, soma_maiores(Co,X,S1), S is Ca + S1. % O próximo caso é necessário, pois, senão, ele interrompe a recursão. soma_maiores([Ca|Co],X,S) :Ca =< X, soma_maiores(Co,X,S). % Não faz nada, apenas ignora a cabeça. % Item b) soma_maiores_ac([],_,Ac,S) :- S = Ac. soma_maiores_ac([Ca|Co], X, Ac, S) :Ca > X, Ac1 is Ac + Ca, soma_maiores_ac(Co,X,Ac1,S). soma_maiores_ac([Ca|Co], X, Ac, S) :Ca =< X, soma_maiores_ac(Co,X,Ac,S). % Não faz nada, apenas ignora a cabeça. % Predicado fachada: soma_maiores(L,X,S) :- soma_maiores_ac(L,X,0,S). Questão 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pontos Considere o predicado maior/4 que considera três valores numéricos e devolve o maior entre eles. Por exemplo: ?- maior (3,1,5,M). M = 5. Implemente três versões desse predicado: (a) (1 ponto) Sem utilizar cortes; (b) (1 ponto) Usando corte verde; (c) (1 ponto) Usando corte vermelho. GSI010 Exercícios de Revisão - Continuação Solução: % Item a) maior(X,Y,Z,X) :- X >= Y, X >= Z. maior(X,Y,Z,Y) :- Y >= Z. maior(X,Y,Z,Z) :- X < Z, Y < Z. % Item b) maior(X,Y,Z,X) :- X >= Y, X >= Z, !. maior(X,Y,Z,Y) :- Y >= Z, !. maior(X,Y,Z,Z) :- X < Z, Y < Z. % Item a) maior(X,Y,Z,X) :- X >= Y, X >= Z, !. maior(X,Y,Z,Y) :- Y >= Z, !. maior(X,Y,Z,Z). Página 2 de 2 11/11/2015