Prática (8) Prolog declarativo – recursividade em listas, aritmética,
computação simbólica, validação de dados
Exercícios de definição recursiva de predicados que processam listas
Usando um interpretador Prolog, define e experimenta os seguintes predicados:
a) inteiros/2, tal que inteiros(Lista, Inteiros) significa que Inteiros é a lista dos
elementos de Lista que são números inteiros. O predicado deve certificar-se
que Lista é uma lista, e que Inteiros é uma variável ou uma lista.
b) media/2, tal que media(Lista, Media) significa que Média é a média dos
valores da lista Lista. O predicado deve certificar-se que Lista seja uma lista e
que cada um dos seus elementos seja um valor numérico; e que Media seja
uma variável ou um número.
c) expansao/2 tal que expansão(L, E) significa que E é a expansão de L. Cada
elemento de L tem a forma de um par (N, X) em que N tem de ser um inteiro
não negativo. Na lista expandida, o par (N, X) da lista original é substituído
por N elementos X.
Exemplo
?- expansao([(3, a), (1, b), (6, c)], L).
L = [a, a, a, b, c, c, c, c, c, c]
d) Escreve o predicado max/2, tal que max(Lista, Max) significa que Max é o
maior elemento da lista Lista.
e) [Menos importante] Escreve uma nova versão do predicado para determinar o
maior elemento de uma lista. Agora, os elementos da lista são estruturas com a
forma t(X, Y, Z) (em que X, Y e Z são os argumentos numéricos da estrutura).
A selecção do maior elemento da lista é feita com base na comparação do
argumento nº N dos elementos da lista. Assim sendo, o predicado a criar tem
os seguintes argumentos: Lista de estruturas, número do argumento que serve
de termo de comparação, e maior elemento, o qual deve ser determinado pelo
predicado max/3.
Exemplos
?- max([t(1, 2, 3), t(3, 2, 1), t(1, 3, 2)], 2, Max).
Max = t(1, 3, 2)
?- max([t(1, 2, 3), t(3, 2, 1), t(1, 3, 2)], 1, Max).
Max = t(3, 2, 1)
?- max([t(1, 2, 3), t(3, 2, 1), t(1, 3, 2)], 3, Max).
Max = t(1, 2, 3)
O predicado arg/3 do Prolog permite aceder ao argumento nº N de uma
estrutura: arg(N, Estrutura, Arg)
f) Escreve o predicado insertion_sort/2, tal que insertion_sort(L1, L2) significa
que L2 é o resultado de ordenar a lista L1, por ordem crescente. O algoritmo
usado deve ser o insertion sort: para ordenar uma lista, basta inserir
ordenadamente o seu primeiro elemento no resultado de ordenar o resto da
lista. O resultado de ordenar uma lista vazia é uma lista vazia.
?- insertion_sort([3, 7, 1], L).
L = [1, 3, 7]
Download

Prática (8) Prolog declarativo – recursividade em listas, aritmética