2013-01-19 36 views
0

我有以下數據庫,其經由開關連接的街道:如何將Prolog數據庫更改爲動態?

對於實施例

switch(r2,w52=s). 
switch(w52=s,w53=d). 

怎樣纔可以算法確定,而不是通過在數據的基礎上明確的存款?? 有什麼建議嗎?

+1

你的意思是你的第一行代碼是'switch(r1,w52 = s)'? –

回答

0

您有幾個選項可以在Prolog中創建和諮詢動態生成的事實。

基本的是使用元謂語,如assertretract。謂詞添加和刪除程序中的事實。例如,assert(switch(w52=s,w53=d))將爲您的程序添加一個switch子句。您必須提前申報:- dynamic switch/2.。使用斷言的缺點是它不會回溯。也就是說,如果你在某個謂詞中斷言了一些事實並且它回溯了,事實並不會自動清理。

另一種選擇是積累這些事實列表裏面,然後用member/2memberchk/2檢查,而不是查詢程序,如果一個給定的事實是在該列表中。例如:

L = [switch(w52=s,w53=d), switch(w53=d,w54=d), ...] 
member(switch(w53=A, w54=B), L) % Unifies A=d, B=d 

與使用斷言不同,此方法與任何其他Prolog謂詞一樣工作。

最後,您可以運行一個兩階段程序。在第一階段,將您計算的條款打印到文件並希望成爲事實。這很容易,因爲Prolog支持編寫完整的術語,無需自己格式化。之後只需查閱文件。如果您更經常地閱讀事實而不是生成它們,這是最有效的方法,因爲Prolog會編譯您的文件。