[update 2014-05-25]
Faglia nostra: o programador Prolog e criador da linguagem Erlang é Joe Armstrong. Simon Thompson é o mantenedor e um dos resposáveis pela reescrita em C.
[/update]
Apesar de ser uma linguagem funcional, Erlang traz muita herança de Prolog e suporta o paradigma declarativo. Para demonstrar essa similaridade, vou colocar o código de fatorial: em Erlang e em Prolog, implementação simples (e ruim) e usando tail-call optimization.
Código Q&D
Vamos ao rápido e sujo, primeiro em Prolog:
fact(0, 1) :- !.
fact(N, F) :- N > 0,
N1 is N - 1,
fact(N1, F1),
F is N * F1.
Agora em Erlang:
fact(0) -> 1;
fact(N) when N > 1 -> N * fact(N - 1).
A intenção é mostrar como os códigos são parecidos.
Tail call optimization
Tanto Prolog quanto Erlang têm sistemas inteligentes de esvaziamento de pilha e usar um acumulador ajuda a tornar o programa mais eficiente.
O fatorial em Prolog fica assim:
O fatorial em Prolog fica assim:
fact(N, F) :- N >= 0,
fact(N, 1, F).
fact(0, F, F) :- !.
fact(N, A, F) :- N1 is N - 1,
A1 is N * A,
fact(N1, A1, F).
Agora em Erlang:
fact(N) when N >= 0 -> fact(N, 1).
fact(0, A) -> A;
fact(N, A) -> fact(N-1, A*N).
Bônus
Tente adivinhar em qual linguagem é este código:
fact(N, F) :- N >= 0, fact(N, 1, F).
fact(0) --> { ! }, '='.
fact(N) --> { N1 is N - 1 }, mul(N), fact(N1).
mul(N, A, R) :- R is N * A.
[]’s
ℭacilhας, ℒa ℬatalema