如何在 python 中创建一个字符串解释器,它根据给定的字典键接受命题和 return 答案?

How to create a string interpreter in python that takes propositions and return an answer based on a given dictionary keys?

所以在为这个问题苦苦挣扎了 2 天后,我放弃了。给你两个输入,第一个是包含命题的列表,第二个是字典。

示例:

arg= [<prop1>, "OPERATOR", <prop2>]

dicti= {<prop1>: key1, <prop2394>: key2394,<prop2>:key2}

以下是可能的输入:

    arg= [<prop1>, "OPERATOR (AND OR )",
[ "NOT" ,["NOT",<prop2>,"OPERATOR"[<prop2>, "OPERATOR", <prop3>]]]

我敢打赌,如果不使用双重递归,问题将无法解决。这是我解决问题的尝试,我从基本情况开始,输入是“flat”列表,这意味着没有列表作为列表元素的一维列表。程序不应该 return 布尔值,而是字典中给出的 return truefalse

def interpret(arg, keys ):
    if not arg :
        return "false"
    elif not arg and not keys:
        return "false"
    elif not keys and isinstance(arg,list):
        return "true"
    elif isinstance(arg[0],list):
        return interperter(arg[0:],keys)
    else:
        trueCnr=0
        for i in range(len(arg)):
            if arg[i] in keys and keys[arg[i]]=="true":
                if isinstance (arg[i], list):
                    if("NOT" in arg):
                        indx= arg.index("NOT")
                        keys[arg[indx+1]]= "true" if keys[arg[indx+1]]=="true" else "false"
                    trueCnr+=1
        print(trueCnr)
        if trueCnr==len(arg)-1 and "AND" in arg: return "true"
        elif trueCnr!= 0 and "OR" in arg: return "true"
        else: return "false"

print (interpret(["door_open", "AND", ["NOT","cat_gone"]], {"door_open" : "false", "cat_gone" : "true", "cat_asleep" : "true"} ))

我的问题是如何从这里开始。

你需要使用递归。定义一个函数 eval(prop, keys) 来评估命题。然后将命题与案例相匹配。例如,

['prop1', 'AND', 'prop2']

如果你看到上面的,你会评价为

return eval(prop[:1], keys) and eval(prop[1:], keys)

一个更复杂的例子:

[ "NOT" ,["NOT",'prop2',"OPERATOR"['prop2', "OPERATOR", 'prop3']]]

看起来像

return not eval(prop[1], keys)

需要注意的是,在每次调用 eval 时,只有一个运算符具有优先权。您的工作是识别是哪个运算符,然后将列表的其余部分传递给其他 eval 调用来处理。

在伪代码中:

def eval(prop, keys):
  if not prop:
    return False
  if prop is a key:
    return keys[prop]
  if prop has a binary operator:
    return eval(stuff before operator) operator eval(stuff after operator)
  if prop has unary operator:
    return operator eval(stuff after operator)

此外,请注意您必须 return 布尔值 TrueFalse 而不是字符串 'True' 和 'False'