Exercícios / Paradigma lógico / Listas

  1. [pp99 1.01] Defina um predicado ultimo(L, X) que é verdadeiro se X é o último elemento da lista L.

  2. [pp99 1.03] Defina um predicado elemento_em(L, K, N) que é verdadeiro se N é o K-ésimo elemento de L.

  3. [pp99 1.06] Defina um predicado palindromo(L) que é verdadeiro se a lista L é palíndromo.

  4. [p99 1.07] Defina um predicado flatten(L, F) que é verdadeiro se F é uma versão não aninhada de L. Exemplo

    ?- flatten([a, [b, [c, d], e]], F).
    F = [a, b, c, d, e].
    

    Dica: use os predicados pré-definidos is_list/1 e append/3.

  5. [p99 1.08] Defina um predicado comprimido(L, C) que é verdadeiro se C contém os elementos de L mas não contém elementos consecutivos iguais. Exemplo

    ?- comprimido([a, a, a, a, b, c, c, a, a, d, e, e, e, e], C).
    C = [a, b, c, a, d, e].
    
  6. [p99 1.14] Defina um predicado duplicado(L, D) que é verdadeiro se D tem os elementos de L duplicados. Exemplo

    ?- duplicado([a, b, c, c, d], D).
    D = [a, a, b, b, c, c, c, c, d, d].
    
  7. [p99 1.18] Defina um predicado sub_lista(L, I, J, S) que é verdadeiro se S é uma sub lista de L com os elementos das posições de I a J (inclusive). Exemplo

    ?- sub_lista([a, b, c, d, e, f, g, h, i, k], 3, 7, S).
    S = [d, e, f, g, h].
    
  8. [p99 1.19] Defina um predicado rotacionado(L, N, R) que é verdadeiro se R contém os elementos de L rotacionados N posições a esquerda. Exemplo

    ?- rotacionado([a, b, c, d, e, f, g, h], 3, R).
    R = [d, e, f, g, h, a, b, c].
    
  9. [p99 2.02] Defina um predicado fatores_primo(N, F) que é verdadeiro se F é uma lista com os fatores primos de N.

    ?- fatores_primos(315, F).
    F = [3, 3, 5, 7].
    
  10. Defina um predicado mergesort(A, S) que é verdeiro se S é os mesmos elementos que A em ordem crescente. Implemente a ordenação usando o algoritmo de ordenação mergesort.

    ?- mergesort([7, 3, 6, 1, 2, 5, 4], S).
    S = [1, 2, 3, 4, 5, 6, 7].
    
  11. [p99 1.20] Defina um predicado remove_em(L, X, I, R) que é verdadeiro se R é a lista L com o elemento X removido da posição I.

    ?- remove_em([a, b, c, d], X, 2, R).
    X = c,
    R = [a, b, d].
    
  12. [p99 1.21] Defina um predicado insere_em(L, X, I, R) que é verdadeiro se R é a lista L com o elemento X inserido da posição I.

    ?- insere_em([a, b, d], c, 2, R).
    R = [a, b, c, d].
    
  13. [lpn 6.1] Vamos chamar uma lista de dobrada se ele é constituída de dois blocos consecutivos de elementos iguais. Escreva um predicado dobrada(L) que é verdadeiro se L é uma lista dobrada.

    ?- dobrada([a, b, c, a, b, c]).
    true.
    ?- dobrada([a, b, a]).
    false.
    
  14. [lpn 6.6] Existe uma rua com três casas vizinhas com cores diferentes (vermelho, azul e verde). Em cada casa vive uma pessoa de uma nacionalidade diferente e que têm uma animal de estimação diferente. Mais alguns fatos sobre as casas:

    • O inglês vive na casa vermelha.
    • O espanhol tem como animal de estimação um jaguar.
    • O japonês vive ao lado de quem tem uma cobra.
    • Quem tem um cobra vive a esquerda da casa azul.

    Defina um predicado zebra(N) que é verdadeiro se a pessoa com nacionalidade N tem como animal de estimação uma zebra.

  15. Defina um predicado que resolva o problema de lógica descrito em http://rachacuca.com.br/teste-de-einstein/.

Referências