2013-11-14 107 views
1

我執行Prolog的解釋,我想包括一些內置的數學函數(SUM,產品等)。例如,我想能夠使使用知識基礎這樣一個計算:實現算法的Prolog的

NetForce(F) :- Mass(M), Acceleration(A), Product(M, A, F) 
Mass(10) :- [] 
Acceration(12) :- [] 

於是我應該能夠作出查詢,如?NetForce(X)。我的問題是:在我的解釋器中構建這樣的功能的正確方法是什麼?

特別是,我遇到的問題是,爲了評估SumProduct等,必須先評估它們的所有參數(即綁定到數字常量)。例如,雖然以上面的代碼應該正確評價,對置換後的規則:

NetForce(F) :- Product(M, A, F), Mass(M), Acceleration(A) 

不會,因爲MA未綁定時Product項處理。我目前的做法是簡單地重新排列這些術語,以便最後出現數學表達式。這在簡單的情況下起作用,但看起來很詭異,而且我希望在多個數學術語或遞歸的情況下會出現問題。有更好的解決方案嗎?

+1

我會建議:使用現有的Prolog系統來構建您的擴展作爲元解釋器。 – false

+0

請參閱http://stackoverflow.com/questions/14527682/implementing-prolog-in-c-or-c/14536068#14536068 – false

+0

是的,我認爲這是有道理的,但我不確定它是否會在我的項目的大背景。我會研究它。 – user1604015

回答

2

您正在描述的功能作爲約束擴展存在於現有系統中。有CLP(Q)超過合理性,CLP(R)超過實際 - 實際上是浮動的,最後是CLP(FD),通常延伸到CLP(Z)。參見例如 library(clpfd)

在任何情況下,從頭開始使用Prolog實現將是一項不小的工作,您將沒有時間調查要實現的內容,因爲您將被更低級別的細節淹沒。所以你將不得不使用更經濟的方法,並澄清你實際上想要做什麼。

你可以研究,在現有的系統實現約束語言。或者您可能需要use a meta-interpreter based approach。或者,也許你想從頭開始實施Prolog系統。但不要指望你全部成功。

而且節省您的另一項努力:重用現有的標準語法。您使用的語法將需要您構建額外的解析器。

+1

明白了。我想我會開始至少考慮實施所需的約束機制。你有這方面的資源建議嗎? – user1604015

+1

SWI-Prolog(opensrc)和SICStus(商業)擁有這一切+ CHR,等等。 – false

0

謂詞不會條款順序無關,這是非常重要的。您需要確定謂詞的使用模式 - NetForce()的使用模式是什麼?如果我喜歡的設計力量謂語,我會做類似

force(Mass,Acceleration,Force):- Force is Mass * Acceleration. 

這有+,+,使用模式 - 這意味着你給我的質量和加速度,我會給你力量。

否則,你根據你定義了統一的變量的事實,如果你把它們傳遞給產品首先,他們將繼續統一和統一,你將永遠不會停止。

+0

那麼,使用模式 - 大致 - 就像確定評估順序一樣嗎? – user1604015

+0

那麼你的查詢?NetForce(X)是一個生成器,它試圖生成值來分配X。這是你的意圖嗎?我的意思是,因爲從字面上看,任何整數值都是正確的統一。 –

1

你可以使用coroutining推遲產品的評價:

product(X, A, B) :- freeze(A, freeze(B, X is A*B)) 

freeze/2延遲其第二個參數的賦值,直到第一個參數是地面。這樣使用嵌套,它只在AB綁定到實際條件之後評估X is A*B。(免責聲明:我不是高級Prolog主題的專家,可能會有更簡單的方法來執行此操作 - 例如,我認爲SICStus Prolog具有「塊聲明」,它們以更簡潔的方式做了幾乎相同的事情方式和概括所有謂詞的聲明)

+0

(when)/ 2 -claclarations是最適合的,如果你想從字面上重用(是)/ 2。但限制要好得多。 – false

+0

@false AFAIK SICStus塊聲明是改進的when聲明,並且主要用於實現約束求解。所以如果OP試圖實施他自己的約束系統,他們可能會有所幫助。 – l4mpi

+0

而AFAIK,'block'聲明是在內建'when/2'之前出現的,在此之前,'wait'聲明以SICStus 0.7爲特色。在任何情況下,僅基於任何這些構造實施約束**系統**都會導致**弱**一致性,並且不能被推薦。 – false