Lista 1 - Prolog

  1. Escreva cláusulas Prolog (fatos, regras, ou perguntas) que expressem as seguintes sentenças. Há mais de uma solução em alguns casos.
    1. O patinho é feio.
    2. Eu sou legal.
    3. O vento levou.
    4. Quem não chora, não mama.
    5. Todo homem é mortal, exceto o super-homem.
  2. Considere o seguinte predicado misterioso x de um argumento definido em Prolog pelas seguintes cláusulas:
              x([]).
              x([A]).
              x([A,B|C]) :- A < B, x([B|C]).
    
  3. Minha base de dados contém tudo o que comprei neste mês e quanto custou cada coisa:
        comprei(calca,50).
        comprei(tenis,90).
        comprei(chiclete,1).
        comprei(tv,2000).
        comprei(chiclete,2).
    
    Faça um predicado total(X) que me diga quanto dinheiro gastei no mês. No exemplo acima, teremos
    	?- total(X).
    	X = 2142 ;
    	no
    
  4. Escreva um predicado Prolog reversa(X,Y) que é satisfeito quando as listas X e Y são uma o reverso da outra. De novo, pode ser gerador ou verificador, mas especifique em sua solução. Se precisar de predicados auxiliares, defina-os também, mesmo que tenham sido dados em classe, pois estes predicados podem ter comportamento diferente dependendo da existência de cortes, etc.
  5. Escreva um predicado que verifica se um número N é quadrado perfeito.

Soluções

As soluções dos problemas 1, 2 e 3 foram feitas em aula.

4.
reversa([],[]).
reversa([X|Y],Z) :-
    reversa(Y,W), append(W,[X],Z).

Em Prolog, assim como em LISP, há muita facilidade em lidar com o começo de uma lista, mas não com o final dela.

Neste exemplo tem que ser usado append, pois é a maneira mais fácil de colocar algo no final de uma lista. A chamada append(W,[X],Z) instancia Z com a lista W com o elemento X colocado no final dela. Por exemplo, se W = [1,2,3,4] e X = a, fica Z = [1,2,3,4,a].

Observe que Z = [W|X] não funciona. Nem Z = [W|[X]] funciona, pois isto dá Z = [[1,2,3,4],a].

5.
qperf(N) :- X is sqrt(N), R is trunc(X+0.5), N is R*R.

Não basta fazer X is sqrt(N), integer(X) pois o resultado de sqrt nunca é inteiro mas sim um número real. Portanto é necessário arredondá-lo e ver se o quadrado dá N.


Joao Meidanis
Last modified: Tue Oct 21 23:33:12 EDT 1997 by JM