我有以下數據庫,其經由開關連接的街道:如何將Prolog數據庫更改爲動態?
對於實施例
switch(r2,w52=s).
switch(w52=s,w53=d).
怎樣纔可以算法確定,而不是通過在數據的基礎上明確的存款?? 有什麼建議嗎?
我有以下數據庫,其經由開關連接的街道:如何將Prolog數據庫更改爲動態?
對於實施例
switch(r2,w52=s).
switch(w52=s,w53=d).
怎樣纔可以算法確定,而不是通過在數據的基礎上明確的存款?? 有什麼建議嗎?
您有幾個選項可以在Prolog中創建和諮詢動態生成的事實。
基本的是使用元謂語,如assert
和retract
。謂詞添加和刪除程序中的事實。例如,assert(switch(w52=s,w53=d))
將爲您的程序添加一個switch子句。您必須提前申報:- dynamic switch/2.
。使用斷言的缺點是它不會回溯。也就是說,如果你在某個謂詞中斷言了一些事實並且它回溯了,事實並不會自動清理。
另一種選擇是積累這些事實列表裏面,然後用member/2
或memberchk/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會編譯您的文件。
你的意思是你的第一行代碼是'switch(r1,w52 = s)'? –