0

我有一些字典,例如:

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)

4

2 回答 2

1

最简单的方法可能是使用任何可用的字符串插值方法或正则表达式。从您在 prolog 中的背景来看,要正确处理一阶逻辑,您可能需要考虑使用FOL 解析或完整的求解引擎,例如pyproverpyPLPyLogpythogic

于 2022-01-09T10:49:54.553 回答
0

我自己使用一些序言找到了一些解决方案:

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 ..

于 2022-01-09T21:06:12.067 回答