Aula 12

1 Exercicios

Da aula 1 e 2 - use acumuladores quando necessario.

  • 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+1.
  • soma dos números pares de uma lista somap(+LISTA,-SOMA)
somap([],0).
somap([X|R],N) :- X mod 2 == 0, somap(R,NN), N is NN+X.
somap([X|R],N) :- somap(R,N). 
  • soma dos elementos nas posições pares da lista ( o primeiro elemento esta na posicao 1) somapares(+LISTA,-SOMA)
somapares([],0).
somapares([_],0).
somapares([A,B|R],S) :- somapares(R,SS), S is SS+B.
  • existe item na lista elem(+IT,+LISTA)
elem(X,[X|_]).
elem(IT,[_,R]) :- elem(IT,R).
  • posição do item na lista: 1 se é o primeiro, falha se nao esta na lista pos(+IT,+LISTA,-POS)
pos(IT,L,P) :- pos(IT,L,P,1).
pos(IT,[X|_],P,N) :- X=IT,P=N.
pos(IT, [_|R],P,N) :- NN is N+1, pos(IT,R,P,NN)

ou

pos(IT,[IT|_],P,P).
pos(IT, [_|R],P,N) :- NN is N+1, pos(IT,R,P,NN)

  • conta quantas vezes o item aparece na lista (0 se nenhuma) conta(+IT,+LISTA,-CONTA)
conta(_,[],0).
conta(X,[X|R],N) :- conta(X,R,NN), N is NN+1.
conta(X,[_|R],N) :- conta(X,R,N). 
  • maior elemento de uma lista - maior(+LISTA,-MAX)
# codigo exponencial 
# eu preciso de um 1F-then-else para fazer o codigo linear
# ou um acumulador 

maior([X],X).
maior([X|R],M) :- maior(R,MM), X>MM, M=X.
maior([_|R],M) :- maior(R,M).

Com acumulador

maior([X|R],M) :- maior(R,M,X).
maior([],M,M).
maior([X|R],M,Acc) :- X > Acc, maior(R,M,X).
maior([X|R],M,Acc) :- maior(R,M,Acc).
  • reverte uma lista -
rev([X|R],B) :- rev(R,B,[X]).
rev([],A,A).
rev([X|R],B,A) :- rev(R,B,[X|A]).
  • intercala 2 listas (intercala1 e intercala2)
intercala1([1,2,3], [4,5,6,7,8], X).
 X =  [1,4,2,5,3,6]
intercala1([],_,[]).
intercala1(_,[],[]).
intercala1([A|RA],[B|RB],[A,B|RR] ) :- intercala1(RA,RB,RR).
intercala2([1,2,3], [4,5,6,7,8], Y),
 Y =   [1,4,2,5,3,6,7,8]
  • a lista ja esta ordenada?
ordenada([]).
ordenada([_]).
ordenada([A,B|R]):- A =< B, ordenda([B|R]).
  • dado n gera a lista de 1 a n
gera(N,L) :- gera(N,L,1).
gera(N,[],N).
gera(N,L,X) :- XX is X+1, gera(N,LL,XX), L = [X|LL].
  • retorna o ultimo elemento de uma lista
ultimo([X],X).
ultimo([_|R],X) :- ultimo(R,X).
  • retorna a lista sem o ultimo elemento
semult(L,LS) :- rev(L,[_|LL]),rev(LL,LS).
  • 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)

2 Operadores NOT OR e IF-THEN-ELSE (1a versão)

Not

\+ (predicado)

OR

A ; B 

IF then else como OR

(teste, then);else
maximo([X],X).
maximo([X|R],M) :- maximo(R,MM), (MM > X, M = MM) ; M = X.

3 IF THEN ELSE (2 versão)

teste -> then ; else
maximo([X],X).
maximo([X|R],M) :- maximo(R,MM), (MM > X ->  M = MM ; M = X).

4 IF THEN ELSE (3a versão)

p :- teste, then.
p :- else.

Author: Jacques Wainer

Created: 2018-09-20 Thu 15:33

Validate