Você está na página 1de 30

UPE – UNIVERSIDADE DE PERNAMBUCO PROF.

MSC ROBERTA ANDRADE

Lógica de Programação e Algoritmo II

Sistema de Informação
Prof. Dr. Roberta Andrade
raafupe@gmail.com

1 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Índice

 Listas
 Definição
 Operações

 Predicados

2 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog
 Estruturas de dados suportadas
nativamente em Prolog

 Sequência de qualquer número de itens

 Podem conter itens de mesmo tipo ou de


tipos diferentes

3 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog
 Lista é uma das estruturas mais simples em
Prolog, muito comum em programação não
numérica
 Ela é uma sequência ordenada de elementos
 Uma lista pode ter qualquer comprimento

 Por exemplo uma lista de elementos tais como


ana,tênis, pedro pode ser escrita em Prolog
como:
 [ana, tênis, pedro]

4 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog
 No exemplo [ana, tênis, pedro]
 ana é a Cabeça da lista
 [tênis, pedro] é a Cauda da lista

 A cabeça de uma lista pode ser qualquer


objeto (inclusive uma lista); a cauda tem que
ser uma lista
 A Cabeça e a Cauda são então combinadas
em uma estrutura: (Cabeça, Cauda)

5 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog
 Como a Cauda é uma lista, ela é vazia ou
ela tem sua própria cabeça e sua cauda:
 hobbies1([tênis, música]).
 hobbies2([esqui, comida]).

 Lista([ana,Hobbies1,pedro,Hobbies2]).

 Saída
 ? - Hobbies1 = [tênis,música].
 ?- Hobbies2 = [esqui,comida].
 ?- L = [ana, [tênis,música], pedro, [esqui,comida]].

6 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog
 Em geral, é comum tratar a cauda como um
objeto simples
 Por exemplo, L = [a,b,c] pode ser escrito como
 Cauda = [b,c]

 L = [a,Cauda]

 Para expressar isso, Prolog fornece uma


notação alternativa, a barra vertical, que
separa a cabeça da cauda
 L = [a | Cauda]

7 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog
 L = [a | Cauda]
 A notação é geral por permitir que qualquer
número de elementos seja seguido por ‘|’ e o
restante da lista:
 [a,b,c] = [a | [b,c]] = [a,b | [c]] = [a,b,c | [ ]].
 ? - [Cabeca|Cauda] = [maria, vicente, julia, yolanda].
 Cabeça =maria
 Cauda=[vicente, julia, yolanda]
 ?- [X1,X2,X3|Cauda] = [maria, vicente, marcelo, josy,
yolanda].
 [maria, vicente, marcelo,[ josy, yolanda]].

8 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Lista Prolog – Operações


 Frequentemente, é necessário realizar operações
em listas, por exemplo, buscar um elemento que
faz parte de uma lista
 Para isso, a recursão é o recurso mais amplamente
empregado

 Questão: como verificar se um elemento está em


uma lista?
 Para verificar se um elemento está na lista, é preciso
verificar se ele está na cabeça ou se ele está na cauda da
lista
 Se o final da lista for atingido, o elemento não está na lista

9 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Lista Prolog - Operações


 Recursão
 isto é, criar definições que fazem referência a si
próprias. Toda regra recursiva é composta de
duas partes:
 o caso base, que é um caso simples que produz
uma resposta sem usar recursão, e um conjunto
de regras que reduzem todos os outros casos
para o caso base, fazendo referência à própria
regra.
 Nunca se esqueça de escrever o caso base, caso
contrário o resultado será uma recursão infinita.

10 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Lista Prolog - Introdução


 Construção de lista
 %fato X = cabeça e Y = cauda
 lista(X,Y,[X|Y]).
 Consulta
 ? – lista(a,b,Z).
 ? – lista(1,2,W).
 ? - lista(a,[],R), write("A lista final é: "),write(R).
 ?- lista(2,[10,20],A),write("A lista final é: "),write(A).
 ?- lista(a,X,[a,b,c]), write (“A cauda da lista é:),write(X).
 ?- lista([a,b,c],[d,e,f],Z).

11 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Lista Prolog - Introdução


 Construção de lista
 %fato X = cabeça e Y = cauda
 listas([10,20,30]).
 listas([teste,gato,magro]).

 listas([1,2,3,4,5,6]).

 listas([a,b,c,d,e,f]).

 Consulta
 ? – listas(P).
 ?- [Parte1|Parte2] = [brasil, urugai,argentina,paraguai].

12 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Exemplo de Listas – Operações


 1)  adiciona(X,L1,L2):
 L2 é a lista resultante, que contém o elemento
X;
 L1 é a lista L1 inicial sem o elemento X.

 Testar este predicado no interpretador Prolog,


executando:
 %Regras
 adiciona(X,L,[X|L]).
 %Perguntas
 ?- adiciona(1,[2,3],L).
 ?- adiciona(X,[2,3],[1,2,3]).

13 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Exemplo de Listas – Operações


 2)  apaga(X,L1,L2):
 L2 é a lista resultante sem o elemento X;

 L1 é a lista com o elemento X;

 %Regras

 apaga(X,[X|R],R). %X=cabeça %R=Cauda %caso


base
 apaga(X,[Y|R1],[Y|R2]):- apaga(X,R1,R2).

 %caso o elemento X para ser removido não esteja na


cabeça e [Y|R2] seria minha lista resultante.
 %Perguntas:

 ?- apaga(a,[a,b,c,d],L).

 ?- apaga(1,[1,2,3,4,c],L).

14 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Exemplo de Listas – Operações


 3)  membro(X,L) – que é verdadeiro se
X pertencer à lista L.
 %regras

 membro( X, [X|_] ).
membro( X, [_|R] ) :- membro( X, R ).
 %perguntas
 ?- membro(b,[a,b,c]).
 ?- membro(X,[a,b,c]).

15 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Exemplo de Listas – Operações


 4)  concatena(L1,L2,L3)
 L1 primeira lista;
 L2 segunda lista;

 L3 lista resultante.

 %regras
 concatena([],L,L).
 concatena([X|L1],L2,[X|L3]):-
concatena(L1,L2,L3).
 %Perguntas
 ?- concatena([1,2,3],[a,b,c],L).
16 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023
UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Exemplo de Listas – Operações


 5)  comprimento(X,L) – onde X é o número
de elementos da lista L.
 %regras
 comprimento(0,[]).
 comprimento(N,[_|R]):- comprimento(N1,R), N is 1 + N1.
 %perguntas
 ?- comprimento(X,[a,b,c]).

17 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Exemplo de Listas – Operações


 6)  somatorio(X,L) – onde X é o valor do
somatório dos elementos da lista L (assumir
que L contém somente números).
 %regras
 somatorio(0,[]).
somatorio(X,[Y|R]):- somatorio(S,R), X is S+Y.
 %perguntas

 ?- somatorio(X,[1,2,3,4,5]).

18 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Exemplo de Listas – Operações


 7)  media(X,L) – onde X é o valor médio da
lista L (assumir que L contém somente
números).
 %regras
 media(X,L):-comprimento(N,L),
somatorio(S,L), X is S/N.
 %perguntas

 ?- media(X,[1,2,3,4,5]).

19 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog - Predicados

 Predicados já prontos no Prolog


 Só usar

20 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog – Predicados


 member(?Elem, ?List): verdadeiro se Elem é
membro da lista List.
 ?- member(ele,[eu,tu,ele]).

 ?- member(4,[2,4,6]).

 ?-member(vincent,[yolanda,trudy,vincent,jules]).

 ?-member(zed,[vincent,jules]).

 ?-member(zed,[]).

 ?- member(a,[c,b,a,y]).

 ?- member(x,[a,b,c]).

 ?- member(X,[a,b,c]).

21 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog - Predicados


 length(?List, ?Int): verdadeiro se Int representa o
número de elementos da lista List
 length([a,b], X).

 length([’eu’,’tu’,’ele’],Z).

 sort(+List,-Sorted): verdadeiro se Sorted é


equivalente à lista List ordenada; elementos
duplicados são removidos do resultado.
 sort([a,z,b], X).

 sort([8,3,3,816], Y).

 sort([marcia,camila,ana], Z).

22 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog - Predicados


 reverse(X, Y).
 Unifica a lista X com a reversa da lista Y.
Novamente, existe liberdade em escolher quem
será input e quem será output:
 reverse(X, [1, 2, 3]).

 reverse([a, b, c], Y).

 last(?List,?Elem)
 Quem é o último elemento da lista
 last([1, 2, 3],Y).

 last([’eu’, ’tu’, ’ele’],Y).

23 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog - Predicados


 Maplist
 Ainda existe o predicado maplist que mapeia
um predicado aritmético, no exemplo, plus/3,
para todos os elementos de uma lista,
retornando uma nova lista;
 ?- plus(4,5,X).
 X =9
 ?- maplist(plus(2),[1,2,3],L).
 L = [3, 4, 5]
 ?- sumlist([10,8,9],Z).
 Z=27
24 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023
UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog - Predicados


 merge(+List1, +List2, -List3)
 Concatena duas lista gerando uma terceira lista.
 merge([10,8,9],[1,2,3],Z).
 Z=[1,2,3,10,8,9]
 list_to_set(+List,+List)
 remove os elementos repetidos de uma lista
 list_to_set([1,2,2,3,3,3,3,3],Z)

 sumlist(?List, ?Int)
 Soma os elementos de uma lista
 ?- sumlist([10,8,9],Z).
 Z=27
25 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023
UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog - Predicados


 Findall (O, G, L)
 Constrói uma lista L contendo todos os objetos
O tais que a meta G é satisfeita
 idade(pedro,7).
 idade(ana,5).
 idade(alice,8).
 idade(tomaz,5).
 findall(Nome,idade(Nome,Idade),L).
 findall(Nome/Idade,idade(Nome,Idade),L).
 findall(Nome/Idade,(idade(Nome,Idade),Idade>5),L).

26 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog: Exercício Classe


 01.Crie uma base de dados de distâncias fictícias
entre a UPE/Recife e outros campus dessa
universidade (Caruaru(120km),
Garanhuns(210km), Serra Talhada(380km),
Salgueiro(480km)), depois realize uma pesquisa
que retorne uma lista com universidades que
distem no máximo uma distância de 250 km,
informando a universidade de destino e a
distância.

27 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog
 Exercício_Resposta_01
 dist(recife,caruaru,120).
 dist(recife,serratalhada,380).
 dist(recife,salgueiro,480).
 dist(recife,garanhus,210).

 findall(Campus/Distancia,
(dist(recife,Campus,Distancia),Distancia=<250),L).
 findall(Campus/
Distancia,dist(recife,Campus,Distancia),L).

28 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog: Exercício Classe


 02.Crie uma base de dados de nome,
nota1,nota2 da disciplina de lógica de 10
alunos. Adicione o campo média para cada
aluno e exiba uma lista com o nome dos
alunos aprovados.
 Paulo, 5,10; Guto 8,8; Leo,9,9; Joao 6,5 e
Luna,4,8
 Lara, 5,9; Fabio 2,8; Lucas,8,9; Janaina 6,8 e
Lena,4,2

29 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023


UPE – UNIVERSIDADE DE PERNAMBUCO PROF. MSC ROBERTA ANDRADE

Listas Prolog – Resposta_Exercício_02


 aluno(paulo,5,10,7.5).
 aluno(guto,8,8,8).
 aluno(leo,9,9,9).
 aluno(joao,6,5,5.5).
 aluno(luna,4,8,6).
 aluno(lara,5,9,7).
 aluno(fabio,2,8,5).
 aluno(lucas,8,9,8.5).
 aluno(janaina,6,8,7).
 aluno(lena,4,2,3).
 ?- findall(Nome/Media,
(aluno(Nome,Nota1,Nota2,Media),Media>=7),L),write("
Lista de Aprovados"),nl,write(L).

30 AULA 7 – LPA II quinta-feira, 9 de fevereiro de 2023

Você também pode gostar