2013-03-01 2 views
0

Это вопрос проверки, с которым у меня возникают проблемы. Как вы пишете метод оценки алгебраического выражения с операторами «плюс», «минус» и «раз». Вот некоторые тестовые запросы:Оценка алгебраического выражения

simplify(Expression, Result, List)

?- simplify(plus(times(x,y),times(3 ,minus(x,y))),V,[x:4,y:2]). V = 14

?- simplify(times(2,plus(a,b)),Val,[a:1,b:5]). Val = 12

?- simplify(times(2,plus(a,b)),Val,[a:1,b:(-5)]). Val = -8 .

Все, что я получил были эти примеры запросов и нет другого объяснения. Но я уверен, что метод должен рассекать первый аргумент, который является алгебраическим выражением, подставляя x и y для своих значений в третьем аргументе (List). Второй аргумент должен быть результатом после вычисления выражения.

Я думаю, что один из методов должен быть simplify(V, Val, L) :- member(V:Val, L). В идеале должно быть только 4 метода ... но я не уверен, как это сделать.

+2

Вы написали код, который вы можете отобразить?Это не практика этого сообщества писать код для людей. – Brad

+0

@Brad Кроме того, что я написал, нет. Это вопрос проверки и все еще тупик относительно того, как это сделать. Я становлюсь все более и более запутанным, поскольку я думаю об этом ... Толкание в правильном направлении было бы высоко оценено. – user2121487

+1

Вам захочется рекурсивно вызывать упрощение с помощью левого и правого деревьев выражений и соответствующим образом объединить эти значения с использованием имени структуры (times, plus и т. Д.). Вы передадите список переменных по каждому из этих вызовов. Это все намеки, которые я могу дать из пределов поля комментариев. –

ответ

1

Начните с малого, напишите, что вы знаете.

simplify(plus(times(x,y),times(3 ,minus(x,y))),V,[x:4,y:2]):- V = 14. 

- отличное начало: (+ (* 4 2) (* 3 (- 4 2))) = 8 + 3*2 = 14. Но тогда, конечно,

simplify(times(x,y),V,[x:4,y:2]):- V is 4*2. 

еще лучше. Кроме того,

simplify(minus(x,y),V,[x:4,y:2]):- V is 4-2. 
simplify(plus(x,y),V,[x:4,y:2]):- V is 4+2. 
simplify(x,V,[x:4,y:2]):- V is 4. 

все совершенно хорошо код пролога. Но, конечно, что мы на самом деле означает, становится очевидным, является

simplify(A,V,L):- atom(A), getVal(A,L,V). 
simplify(C,V,L):- compound(C), C =.. [F|T], 
    maplist(simp(L), T, VS),  % get the values of subterms 
    calculate(F, VS, V).   % calculate the final result 

simp(L,A,V):- simplify(A,V,L). % just a different args order 

и т.д. getVal/3 нужно будет получить значения каким-то образом из L списка и calculate/3 на самом деле выполнить расчет, учитывая символическое имя операции и список вычисленных значений.

Исследование maplist/3 и =../2.

(не завершено, не проверено).


OK, maplist был излишним, как это было =..: все ваши условия, вероятно, будет в форме op(A,B). Таким образом, определение может быть упрощенным в

simplify(plus(A,B),V,L):- 
    simplify(A,V1,L), 
    simplify(B,V2,L), 
    V is V1 + V2.   % we add, for plus 

simplify(minus(A,B),V,L):- 
    % fill in the blanks 
    ..... 
    V is V1 - V2.   % we subtract, for minus 

simplify(times(A,B),V,L):- 
    % fill in the blanks 
    ..... 
    V is .... .   % for times we ... 

simplify(A,V,L):- 
    number(A), 
    V = .... .   % if A is a number, then the answer is ... 

и последняя возможность есть, x или y и т.д., которые удовлетворяют atom/1.

simplify(A,V,L):- 
    atom(A), 
    retrieve(A,V,L). 

Так последний вызов из приведенного выше пункта может выглядеть retrieve(x,V,[x:4, y:3]), или это может выглядеть retrieve(y,V,[x:4, y:3]). Это должно быть простым делом.

Смежные вопросы