Пролог - оценка выражений произвольного размера - PullRequest
0 голосов
/ 07 ноября 2018

Функция предназначена для вычисления произвольно структурированного выражения со ссылками на список переменных. (Я знаю этот вопрос существует, но его ответ плохо написан, и я не могу его понять.)

Моя работа на данный момент ниже:

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..

Что не так с моей реализацией? Как я могу это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...