逻辑值解释函数返回错误结果

2024-04-27 19:28:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我的任务是编写一个函数解释,它接受两个参数,一个有效表达式和一个解释,如果在这个特定的解释中整个表达式都是真的,则给出真值。逻辑常量和表达式应该作为字符串进行管理,因此您需要为布尔运算实现它们自己的函数。你知道吗

注意,函数应该返回“true”或“false”,而不是true或false。你知道吗

以下是一些可能的输入和输出:

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

下面是我的代码,它适用于上面显示的第一种和最后一种情况,但在所有其他情况下,我要么得到错误的输出,要么一个都没有。这里有什么问题,我该怎么解决?你知道吗

def and_operator(statement, values):
    if isinstance(statement[0], str) and isinstance(statement[2], str):
        statement[0] = (statement[0], values)
        statement[2] = (statement[2], values)
        return "true" if statement[0] == "true" and statement[2] == "true" else "false"

    if isinstance(statement[0], str):
        return and_operator()
    return interpret(statement[0], values), interpret(statement[2], values)


def or_operator(statement, values):
    if isinstance(statement[0], str) and isinstance(statement[2], str):
        statement[0] = (statement[0], values)
        statement[2] = (statement[2], values)
        return "true" if statement[0] == "true" or statement[2] == "true" else "false"


def not_operator(expr, value):
    if isinstance(expr[1], str):
        return "false" if expr[1] == "true" else "true"
    return interpret(expr[1:], value)


def real_values(element, interp):
    if element in interp:
        element = interp[element]
        return element


def item_is_list(e, i):
    return True if isinstance(e[i], list) else False


def interpret(statement, interpretation):
    length = len(statement)
    if item_is_list(statement, 0):
        return statement

    if length == 3:
        if statement[1] == "AND":
            return and_operator(statement, interpretation)
        elif statement[1] == "OR":
            return or_operator(statement, interpretation)
    elif len(statement) == 2:
        return not_operator(statement, interpretation)

Tags: andfalsetruereturnifdefnotoperator
1条回答
网友
1楼 · 发布于 2024-04-27 19:28:13

上面发布的代码的问题是它不处理子表达式,这在示例中似乎是允许的。在设计上,您似乎只允许二进制ANDOR,以及一元NOT。但是,and_operator没有实现,子表达式也没有求解(通过递归调用interpret()并处理它返回的值)。其他函数如real_values没有用处。最后,必须检查输入表达式和词典的语法有效性。你知道吗

如果你想了解口译的工作原理,你最好遵循一些教程,如thisthis、或this。否则,如果您只需要该函数可靠地工作,则可以利用现有的、经过测试的代码,例如parsepyparsing、甚至parser。你知道吗

相关问题 更多 >