2
我正在從C++ dll調用SWI Prolog引擎,我希望能夠訪問所有斷言/動態謂詞(類似於通常所做的列表)。在SWI Prolog中統一動態謂詞
在GNU Prolog中,我會用變量調用dynamic/1謂詞,Prolog會將它與所有動態謂詞指示符統一起來。在下一步中,我將用變量調用這些謂詞並獲取完整列表。
不幸的是,我不能在SWI Prolog中做到這一點(錯誤:參數沒有充分實例化)。 還有別的辦法嗎?
我正在從C++ dll調用SWI Prolog引擎,我希望能夠訪問所有斷言/動態謂詞(類似於通常所做的列表)。在SWI Prolog中統一動態謂詞
在GNU Prolog中,我會用變量調用dynamic/1謂詞,Prolog會將它與所有動態謂詞指示符統一起來。在下一步中,我將用變量調用這些謂詞並獲取完整列表。
不幸的是,我不能在SWI Prolog中做到這一點(錯誤:參數沒有充分實例化)。 還有別的辦法嗎?
爲什麼不推出自己的,例如:
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).
調用此回溯模塊M
頭H
綁定謂詞的情況下與身體B
和條款參考R
。如果您想要檢索的是動態謂詞的名稱,則可以調用它來檢索H
或其函子的所有綁定集合。
將謂詞屬性修改爲您更喜歡的(或者更好的是,將它們作爲參數傳遞);上面的定義將檢索所有用戶定義的動態謂詞,這就是我所猜測的。
謝謝。我最近的想法是用這樣的: myIndicators(名稱,元數): - predicate_property(頭,動態), \ + predicate_property(頭,BUILT_IN), 函子(頭,名稱,元數)。 – aLu 2012-03-13 10:30:51
這與我在這裏建議的非常接近;唯一的區別是我確保發現在不同模塊中聲明的動態謂詞。如果你不使用多個模塊,那麼你的建議似乎很好! – sharky 2012-03-14 01:58:22