Aula 11

Prolog interativo

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)