2013-03-02 63 views
0

這是一個測試複習問題,我遇到了麻煩。你如何編寫一種方法來評估代數表達式,用運算符'plus','minus'和'times'來表示。下面是一些測試查詢:Prolog - 評估代數表達式

簡化(表達式,結果列表)

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

所有我得到了這些樣本查詢,沒有其他的解釋。但我很確定該方法應該剖析第一個參數,即代數表達式,用第三個參數(List)中的x和y代替它們的值。第二個參數應該是評估表達式後的結果。我認爲其中一種方法應該是簡化(V,Val,L): - 成員(V:Val,L)。理想情況下,應該只有4種方法...但我不知道如何去做這件事。

我有什麼事這麼遠,但我不知道身體應該是什麼:

simplify(Var, Value, Lst) :- member(Var:Value, Lst). 
simplify(plus(Var), Value, Lst) :- 
simplify(minus(Var), Value, Lst) :- 
simplify(times(Var), Value, Lst) :- 

我不知道第五方法應該是什麼。

+0

當然好像和[this one]類似(http://stackoverflow.com/questions/15150232/evaluating-an-algebraic-expression);) – 2013-03-02 04:46:42

回答

2

我懷疑你已經允許自己下雪了複雜的例子。你只是缺少一個基本案例,所有的歸納案例都非常簡單。你只需要一些簡單的例子。對於初學者來說,這個回報是什麼?

?- simplify(3, Val, []). 

是的,Val = 3。因此,讓我們添加缺少的基本情況:

simplify(Num, Num, _) :- number(Num). 

的關鍵洞察力電感casess是plusminustimes都具有相同的遞歸二元結構。您可以遞歸地將simplify應用於雙方以實現評估。讓我們試試另一個簡單的例子:

?- simplify(times(3, 3), Val, []). 

我們想要。我們需要做的就是弄清楚左值和右值是什麼,並將它們相乘。因此,它會風這樣看:

simplify(times(Left, Right), Value, Lst) :- 
    simplify(Left, LeftVal, Lst), 
    simplify(Right, RightVal, Lst), 
    Value is LeftVal * RightVal. 

要傳遞Lst到遞歸調用,使他們能夠查找變量太多。從這裏你應該可以推斷出plusminus個案的樣子。你真的不應該需要看起來像plus(X)的案例,因爲它只有一個參數。

Prolog的神奇之處在於,這完全是你所要做的。只要你有簡單的例子,遞歸將會照顧你複雜的例子。嘗試一下。 :)

希望這有助於!