Aula 10

Prolog

prolog interativo online

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

Author: Jacques Wainer

Created: 2018-04-02 Mon 14:46

Validate