2012-02-09 81 views
1

我想解決一個算術表達式在prolog(實現 - eclipse prolog)。要解決的算術表達式是這樣的:如何在序言中進行算術表達式評估?

A * (C + B * X) + D * X = E 

X是要被計算的值,和所有其他(A,B,C,d,E)是所有數字。

例如:5×(3 + 2 * X)+ 2 * X = 39,在計算應與值2

查詢(目標)將被輸入到分配的Prolog X將採取形式:

?- compute(5*(3+2*X)+2*X = 39, Result). 

'結果'和'X'的值應該綁定(分配)在一起。 如何編寫prolog程序來做到這一點..?

謝謝。

回答

4

我假設你使用fd而不是ic。它簡化了一些事情。

:-lib(fd). 

進一步假設你只有方程,而不是不平等,只有一個變量X,那麼你可以做的兩個步驟:

compute(L=R, X) :- 
    term_variables(L, [X]), 
    L #= R. 

首先,從左側提取變量,然後發佈一個計算公式的約束。如果方程是有效的,這將實例化你的變量。

編輯

隨着ic庫,使用eval(L)#=R

+0

感謝您的摘錄,我測試過它的工作。然而,我對序言很陌生,無法理解X如何計算價值。我假設#=是一個延遲約束。你能指導我解決計算方法嗎?謝謝。 – kallakafar 2012-02-09 10:48:09

+1

是的,'#=/2'表示一個整數約束。參見ECLiPSe的約束庫手冊中的3.1節,它解釋了ic解算器。裏面發生的事情是約束傳遞算法在約束被髮布時開始。這將更新連接到約束的變量的域,以使它們一致。在這種情況下,這足以獲得解決方案。 Marriott/Stuckey的「用約束編程」是一本很好的教科書,就像Apt/Wallace的「使用Eclipse進行約束邏輯編程」一樣。 – twinterer 2012-02-09 11:33:02

+0

感謝這個方向,它確實有幫助!謝謝。 – kallakafar 2012-02-09 15:56:16