2010-08-17 4 views
1

표현식을 단순화 할 수있는 simplify (E, E1) 프로 시저를 작성하고 싶습니다. 하나의 연산 + 및 기호식 및 숫자 피연산자 만 있습니다. 이 절차의 예 :SWI 프롤로그 - 표현식 단순화

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 프롤로그 프로그램은 어쨌든입니다 :

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