Aula 10
Prolog
1 numeros
- operacoes matematicas tradicionais
- contas sao feitas apenas nos 2 lados de uma comparação ou no lado direito do operador "is
X is Y/5
faz a conta do lado direito e unifica com o lado esquerdo
X + 3 < Y* 3.4
faz as 2 contas e verifica que a comparação vale.
- comparações são: >, <,
>=
,=<
,=:=
,=\=
- na hora de fazer as contas todas as variavies tem que ter valor
- extensão do prolog para constaint programming permite que algumas variavies nao tenham valor na hora da operacao matemática e a lingaugen unifica tais variavies com a resolucao das equacoes!!
=
NAO FAZ AS CONTAS!!
Y=2, X = Y+10.
2 listas
- itens entre chaves [ ] separados por ,
[1,2,3,[5,6], [7], [] ] []
2.1 duas representações de listas
[1, 2, 3] [1 | [2, 3]]
muito útil na unificação - pattern matching
[X|Y] = [1, 2, 3] [X|Y] = [ 1 ] [X|Y] = [ ]
2.2 predicado em listas
- tamanho de uma lista (modo +-)
tamanho(L,T) :- L=[],T=0. tamanho(L,T) :- L=[_ | RESTO], tamanho(RESTO, TR), T is TR+1.
versao mais elegante - coloque os testes na cabeca da regra!
tamanho([],0). tamanho([_|R],T) :- tamanho(R,TR), T is TR+1.
versao elegante com otimizacao de ultima chamada
tamanho(L,T):- tamanho(L,T,0). tamanho([],Acc,Acc). tamanho([_|R],T,Acc) :- ACCX is Acc+1, tamanho(R,T,ACCX).
ERRO COMUM
% ERRADO tamanho([],0). tamanho([_|R],T) :- tamanho(R,T), T is T+1.
2.3 modos
Eu programei o tamanho no modo +- , voce me da a lista e eu te devolvo o tamanho
mas funciona em outros modos
tamanho([5,6,7],X). tamanho([5,6,7],2). tamanho(X,3).
veja quao surpreendente é o ultimo query!!
3 Exercicios
Se possivel faça as 2 versoes de cada um desses exercicios
- maior elemento de uma lista: maior(L,M) +-
- ultimo elemento de uma lista ultimo(L,U) +-
- lista sem o ultimo elemento semultimo(L, LS) +-
- apenas os elementos nas posicoes 1, 3. 5 etc da lista
- apenas os elementos positivos de uma lista de numeros
- a soma dos elementos positivos de uma lista de numeros
- da certo se a lista estiver ordenada crescentemente
- shift right (1 2 3 4) -> (4 1 2 3)
- shift left (1 2 3 4) -> (2 3 4 1)
- revere uma lista (1 2 3 4) -> (4 3 2 1)
- conta quantas vezes um item aparece numa lista (conta item lista) (0 caso nao apareça)
- em que posição um item aparece numa lista (-1 se nao aparece)
- (remove item list) retorna a lista sem o item - em todas as vezes que ele aparece
- (replace item novo lista) retorna lista onde todos os items foram trocado por novo