2010-08-17 4 views
1

Я хочу упростить процедуру (E, E1), которая упрощает выражения. У меня есть только одна операция +, а также символьные и числовые операнды. Примеры этой процедуры:SWI Prolog - Упрощение выражений

simplify(a + 1 + b + 5, E) ------> E = a + b + 6 

simplify(1 + b + 9 + a + 5 + c, E) ------> E = b + a + c + 15 

Все символы, которые мы переводим в начало. Затем мы вычисляем сумму числовых операндов и добавляем ее в конец выражения.

Как написать процедуру?

ответ

4

Ну, это, очевидно, домашнее задание вопрос, но вот программа SWI Prolog все равно:

:- op(500, xfy, user:(+)). 

simplify(Expr, Simplified) :- 
    split(Expr, Syms0, Nums0), 
    sumlist(Nums0, Nums), 
    append(Syms0, [Nums], Syms), 
    unparse(Syms, Simplified). 

split(X+Y, [X|Syms], Nums) :- atom(X), split(Y, Syms, Nums). 
split(X+Y, Syms, [X|Nums]) :- integer(X), split(Y, Syms, Nums). 
split(X, [X], [])   :- atom(X). 
split(X, [], [X])   :- integer(X). 

unparse([X], X). 
unparse([X|Xs], X+Y)  :- unparse(Xs, Y). 

:- simplify(a+1+b+5, a+b+6). 
:- simplify(1+b+9+a+5+c, b+a+c+15). 
+2

Большое спасибо! И это не моя домашняя работа, это мое хобби))) – George

+0

Какую реализацию пролога вы используете? – Sergey