2012-02-03 115 views
2

我正在從C++ dll調用SWI Prolog引擎,我希望能夠訪問所有斷言/動態謂詞(類似於通常所做的列表)。在SWI Prolog中統一動態謂詞

在GNU Prolog中,我會用變量調用dynamic/1謂詞,Prolog會將它與所有動態謂詞指示符統一起來。在下一步中,我將用變量調用這些謂詞並獲取完整列表。

不幸的是,我不能在SWI Prolog中做到這一點(錯誤:參數沒有充分實例化)。 還有別的辦法嗎?

回答

2

爲什麼不推出自己的,例如:

get_dynamic_predicates(M, H, B, R) :- 
    current_predicate(_, P), 
    strip_module(P, M, H), 
    predicate_property(P, dynamic), 
    \+ predicate_property(P, built_in), 
    \+ predicate_property(P, imported_from(_)), 
    clause(P, B, R). 

調用此回溯模塊MH綁定謂詞的情況下與身體B和條款參考R。如果您想要檢索的是動態謂詞的名稱,則可以調用它來檢索H或其函子的所有綁定集合。

將謂詞屬性修改爲您更喜歡的(或者更好的是,將它們作爲參數傳遞);上面的定義將檢索所有用戶定義的動態謂詞,這就是我所猜測的。

+0

謝謝。我最近的想法是用這樣的: myIndi​​cators(名稱,元數): - predicate_property(頭,動態), \ + predicate_property(頭,BUILT_IN), 函子(頭,名稱,元數)。 – aLu 2012-03-13 10:30:51

+0

這與我在這裏建議的非常接近;唯一的區別是我確保發現在不同模塊中聲明的動態謂詞。如果你不使用多個模塊,那麼你的建議似乎很好! – sharky 2012-03-14 01:58:22