2012-12-16 235 views
1

我的應用程序我有許多代理商,每個代理商都有自己的知識庫。
我最初的想法是有多個引擎實例,但swi prolog最多隻允許一個實例。
另一種方法是在每個事實和規則中添加一個表示代理ID的附加項,但它看起來非常麻煩。SWI Prolog多知識庫

例如,而不是:

position(10, 20). 
do(action(X)):-... 

我會到處寫:

position(agent0, 10, 20). 
do(Agent, action(X)):-... 

因爲我將在同一時間更新一劑,連保存和恢復一切每次可能好的,即使我不知道該怎麼做。或者使用模塊?
什麼是分離不同知識庫的好方法?

+1

看到[Logtalk](http://logtalk.org/) – CapelliC

+0

謝謝,我正在調查它... –

回答

3

我認爲你給你的事實添加一個原子ID來標識它所對應的代理的建議是一個很好的建議,但同意這可能是麻煩的添加到你的代碼回顧。

這裏有一些其他的建議,大致在我的優先順序...

  1. 使用recorded database。有了這個,你實際上可以用原子鍵記錄事實,所以假設你可以使用recorda/3等謂詞來分別用代理ID記錄每個代理的事實,然後使用recorded/2,3來檢索它們。幾乎正是你想要的。
  2. 使用modules。大概你可以簡單地爲每個代理創建新的模塊名稱,從而爲每個代理分離事實,就像名稱空間的使用方式一樣。例如,聲稱agent0:position(10,20)
  3. 使用返回子句引用的assert/2保持顯式跟蹤您爲每個代理聲明的事實。通過保留一份參考文獻清單,其中列出了針對特定代理商的所有事實,您可以使用erase/1快速收回它們。請注意,使用子句引用和clause/3的組合以通過引用檢索子句以及retract/1可能會收回屬於其他代理的類似子句。
  4. 根據程序結構的不同,您可以簡單地在列表中爲每個代理程序傳遞一個大數據結構,如下所示:[agent0-[fact1(..), fact2(..), ...], agent1-[...], ...]並隨時更新此術語。請注意,這不像使用數據庫本身那樣高效,因爲它需要對特定事實進行大量的線性掃描;散列查找無法使用。
+0

關於模塊:問題是,需要(例如)位置/ 2 *必須*使用agent0限定它:即,您需要將模塊標識符傳遞給每個此類規則,完全符合OP的抱怨。我真的很希望看到一個可行的解決方法,因爲我寫了(25年前!)一個面向對象的Prolog解釋器與這些功能可用.... – CapelliC

+0

謝謝你的替代品。 Logtalk看起來像是一個非常強大的工具,對於像我這樣第一次使用prolog的人來說,有一些面向對象的元素讓人放心。我沒有注意到記錄的數據庫,這看起來很容易和快速的使用。 –