我有一些字典,例如:
my_dictionary = {'A': '?(p)', 'B': '→(q, ∧(?(p), ∨(y, z)))', 'Aim': ['p', '→(p, q)']}
它們是替換出現在 form→(q, ∧(?(p), ∨(y, z)))或→(p, q)by字典值中的所有字串的簡單方法嗎(q→(?(p)∧(y∨z)))?(p→q)
uj5u.com熱心網友回復:
最簡單的方法可能是使用任何可用的字串插值方法或正則運算式。從您在 prolog 中的背景來看,要正確處理一階邏輯,您可能需要考慮使用FOL 決議或完整的求解引擎,如pyprover、pyPL、PyLog或pythogic。
uj5u.com熱心網友回復:
我自己使用一些序言找到了一些解決方案:
Prolog 檔案(稱為“ logic.pl ”)必須包含以下代碼:
:-op(800, fx, ~).
:-op(801, xfy, ∧).
:-op(802, xfy, ∨).
:-op(803, xfy, →).
:-op(804, xfy, ?).
m_Proposition_Binary_x_y(X ∨ Y, X, Y).
m_Proposition_Binary_x_y(X ∧ Y, X, Y).
m_Proposition_Binary_x_y(X → Y, X, Y).
m_Proposition_Binary_x_y(X ? Y, X, Y).
現在我們可以定義一些函式:
from pyswip import Prolog
def normalize(collection):
interface = Prolog()
interface.consult("Prolog/logic.pl")
if type(collection) is str:
proposition = collection
try:
rest = list(interface.query(f"m_Proposition_Binary_x_y({proposition},A,B)".replace("'","")))[0]
return f"({normalize(rest['A'])}{proposition[0]}{normalize(rest['B'])})"
except:
return proposition
elif type(collection) is list:
return [normalize(x) for x in collection]
elif type(collection) is dict:
old_dict = collection
new_dict = {}
for key in old_dict:
new_dict[key] = normalize(old_dict[key])
return new_dict
在這種背景下,可以很容易地規范化字典:
my_dictionary = {'A': '~(p)', 'B': '→(q, ∧(~(p), ∨(y, z)))', 'Aim': ['p', '→(p, q)']}
print(m_str.normalize(my_dictionary))
輸出:
{'A': '~(p)', 'B': '(q→(~(p)∧(y∨z)))', 'Aim': ['p', '(p→q)']}
唯一的問題,由于某種原因,我不能使用 ? 而不是 ~ 與 pyswip 庫(版本:0.2.11),因為 ? 我得到了 curios 錯誤:
U ffffffac is not in range [U 0000; U 10ffff]
其中 ? 具有 unicode U 00AC ..
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410053.html
標籤:
上一篇:Ansible變數插值
