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
.