/**
 * Mini Erlang like Interpreter.
 *
 * Uses only ISO predicates.
 *
 * Copyright 2012, XLOG Technologies GmbH, Switzerland
 * Jekejeke Prolog 0.9.3 (a fast and small prolog interpreter)
 */

% eval(+Expr,-Value)
eval(X,_) :- var(X), !, sys_throw_error(instantiation_error).
eval(X+Y,Z) :- !, eval(X,U), eval(Y,V), Z is U+V.
eval(X=Y,Z) :- !, eval(Y,Z), X=Z.
eval((X,Y),Z) :- !, eval(X,_), eval(Y,Z).
eval(C,C).

% find_value(+Assoc,+Name,-Value)
find_name(N,[N=V|_],V) :- !.
find_name(N,[_|A],V) :- find_name(N,A,V).

% merge_names(+Assoc,+Assoc,-Assoc)
merge_names([],A,A).
merge_names([N=V|A],B,C) :- find_name(N,B,V), !, merge_names(A,B,C).
merge_names([N=V|A],B,[N=V|C]) :- merge_names(A,B,C).

% loop(+Assoc)
loop(M) :-
   write('> '),
   flush_output,
   read_term(I,[variable_names(N)]),
   merge_names(N,M,L),
   eval(I,R),
   write(R),
   nl,
   loop(L).

% erlang
erlang :-
   loop([]).
