x de um argumento
definido em Prolog pelas seguintes cláusulas:
x([]).
x([A]).
x([A,B|C]) :- A < B, x([B|C]).
?- x([1,2,4,8,5]).
é feita? A resposta é yes ou
no?
x vai ser
satisfeito?
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
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.
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.