Aula 11
1 Numeros em Prolog
A coisa mais importante é que expressões matematicas só são calculadas em 2 contextos
- Os 2 lados de uma comparação:
X*4/Y > Z**2
- Do lado direito de um
is
X is Y+2
is
calcula o valor do lado direito e unifica com o lado esquerdo.
Expressões podem não dar certo em tempo de execução pois algumas variáveis podem não ter valor no momento da execução
Isso vai dar algo estranho:
X = 4, Y = X+2
Isso vai adar um erro
Y is X+2, X = 2
Isso é equivalente:
X = 2 X is 2
1.1 comparações
A > B A >= B A =< B A =:= B A =\= B
2 Listas
Heterogeneas, entre [ ]
[1, 2, [5,6], abobora, [] ]
Pattern matching:
[Cabeca|Resto] []
[X|R]
nao casa com a lista vazia
[1,2,3] = [X|R] X = 1, R = [2,3]
3 Exemplo
- tamanho de uma lista
tam([],0). tam([_|R],N) :- tam(R,NN), N is N+1.
tam(L,N) = tamx(L,N,0). tamx([],N,Acc) :- Acc=N. tamx([X|R],N,Acc) :- AA is Acc+1,tamx(R,N,AA).
3.1 Modo
quando vc programa tam
vc assume que vc recebe a lista (+) e vai
devolver o tamanho dela (-)
tam modo (+-)
3.2 Erros
tam([],0). tam([_|R],N) :- tam(R,N), N is N+1. tam([_|R],N) :- tam(R,NN), N = NN+1.
tamx([X|R],N,Acc) :- tamx(R,N,Acc+1). tamx([X|R],N,Acc) :-tamx(R,N,AA), AA is Acc+1,
4 Exercicios
Da aula 1 e 2 - use acumuladores quando necessario.
o append(+,+, -) append([],A,A). append([X|R],A,AA) :- append(R,A,RR), AA = [X|RR]. ou append([X|R], A, [X|RR]) :- append(R,A,RR),
- tamanho de uma lista
- soma dos elementos de uma lista soma(+LISTA,-SOMA)
soma([],0). soma([X|R],N) :- soma(R, NN), N is NN+X. ou soma(L,N) :- soma(L,N,0). soma([],Acc,Acc). soma([X|R],N,Acc) :- NAcc is Acc+x, soma(R,N,NAcc)
- soma dos números pares de uma lista somap(+LISTA,-SOMA)
somap([],0). somap([X|R],N) :- X mod 2 =:= 0, soma(R,NN), N is NN+X. somap([_|R],N) :- soma(R,N).
- soma dos elementos nas posições pares da lista ( o primeiro elemento esta na posicao 1) somapares(+LISTA,-SOMA)
- existe item na lista elem(+IT,+LISTA)
- posição do item na lista: 1 se é o primeiro, falha se nao esta na lista pos(+IT,+LISTA,-POS)
- conta quantas vezes o item aparece na lista (0 se nenhuma) conta(+IT,+LISTA,-CONTA)
- maior elemento de uma lista - maior(+LISTA,-MAX)
- reverte uma lista -
- intercala 2 listas (intercala1 e intercala2)
intercala1([1,2,3], [4,5,6,7,8], X). X = [1,4,2,5,3,6]
intercala2([1,2,3], [4,5,6,7,8], Y), Y = [1,4,2,5,3,6,7,8]
- a lista ja esta ordenada?
- dado n gera a lista de 1 a n
- retorna o ultimo elemento de uma lista
- retorna a lista sem o utlimo elemento
- shift right
shiftr([1,2,3,4],X) X = [4,1,2,3]
- shiftr n lista (shift right n vezes)
- shift left
- shift left n vezes
- remove item da lista (1 vez so)
- remove item da lista (todas as vezes)
- remove item da lista n (as primeiras n vezes)
- remove item da lista (a ultima vez que ele aparece) **
- troca velho por novo na lista (1 so vez)
- troca velho por novo na lista (todas vezes)
- troca velho por novo na lista n (as primeiras n vezes)