Функция предназначена для вычисления произвольно структурированного выражения со ссылками на список переменных. (Я знаю этот вопрос существует, но его ответ плохо написан, и я не могу его понять.)
Моя работа на данный момент ниже:
lookup(X, Env, V) :-
member(val(X,V),Env). //finds the value of a variable in the "environment".
eval(S, Env, V):-
lookup(S,Env,V). //if expression is a single variable name/key, return the value of the pair.
eval(H+T, Env, V):- //if expression is in the form of head+tail...
lookup(H,Env,HVal), //first, make sure that the head can be looked up;
eval(T, Env, V - HVal). //then, treat the tail as its own expression while expecting a modified value.
eval(F+S, Env, V):- //if expression is contains two atoms, evaluate their sum.
lookup(F, Env, FVal),
lookup(S, Env, SVal),
V is FVal + SVal.
... % minus, times etc. implemented similarly
В данный момент код работает нормально для однозначного поиска:
?- eval(a, [val(a,1),val(b,2),val(c,3)], V).
V = 1 .
А также "двухатомные" выражения:
?- eval(a+b, [val(a,1),val(b,2),val(c,3)], V).
V = 3 .
, но более того (т.е. a+b+a
) код мгновенно возвращает false.
.
Что не так с моей реализацией? Как я могу это исправить?