Olhe para o seguinte exemplo (do Tutorial Java; cópia local do programa aqui). Um "echo server" é um programa que ecoa fielmente a informação que lhe chega.
Revisões Java à volta de um programa de "CHAT" (projecto internet). Acerca de testes automáticos.
inspirado no exemplo de Pereira e Porto, referido no "PROLOG by Example", de Coelho e Cotta, Springer Verlag 1988, ISBN: 0387183132
Arranjar uma combinação de côres (quatro chegam !) para o seguinte mapa da União Europeia (http://www.geog.fu-berlin.de/eurocis/eu/eu.html):
...escrevendo um golo para o seguinte programa que especifica as côres compatíveis entre regiões adjacentes (pista: baptizar as variáveis com os nomes dos países):
compativel(vermelho,verde).
compativel(vermelho,azul).
compativel(vermelho,amarelo).
compativel(verde,azul).
compativel(verde,amarelo).
compativel(azul,amarelo).
vizinho(R1,R2) :- compativel(R1,R2).
vizinho(R1,R2) :- compativel(R2,R1).
Escrever um predicado derivada(E,V,D) que determina a derivada D da expressão E em ordem à variável V para as quatro operações aritméticas. Por exemplo:
?- derivada(2*y+x,x,D).
D=1
Uma solução básica e outra com melhorias para simplificação de algumas expressões
Escrever um predicado ordenada(L) que sucede se a lista de inteiros L estiver ordenada. Por exemplo:
?- ordenada([1,5,9,13]).
Yes
Seguidamente escrever um predicado ordenar(L,O) que dada uma lista L constroi
uma lista O com os mesmos elementos ordenados. Neste exercício despreocupe-se
com a eficiência: use o predicado permutation/2 (cap.3) e o
predicado anterior...
Definir um predicado seEntãoSenão(Se,Então,Senão), que simula a construção sintáctica se...então...senão... de outras linguagens. Por exemplo:
?- NotaPrática=11, NotaTeórica=10, NotaTP=10,
seEntãoSenão(NotaPrática<=8.5,Nota='NA',Nota is
NotaPrática*0.4+NotaTeórica*0.5+NotaTP*0.1).
Nota = 10.4
Enquanto noutras linguagens é possível ilustrar a execução considerando dois pontos em cada procedimento/função/método - CALL, EXIT - no Prolog há necessidade de considerar mais dois: REDO, quando um golo é atingido em retrocesso à procura de mais soluções; e FAIL, quando um golo esgota as soluções. Os debuggers Prolog costumam mostrar estas 4 portas.
?- itrace(membro(X,[a,b])).
CALLing membro(X,[a,b])
EXITing membro(a,[a,b])
X=a ; % utilizador pede mais soluções
REDOing membro(a,[a,b])
CALLing membro(X,[b])
EXITing membro(b,[b])
EXITing membro(b,[a,b])
X=b ;
REDOing membro(b,[a,b])
REDOing membro(b,[b])
CALLing membro(b,[])
FAILing membro(b,[])
FAILing membro(X,[b])
FAILing membro(X,[a,b])