2017-10-07 93 views
0

我的任務是編寫一個函數解釋,其中包含兩個參數,一個有效的表達式和一個解釋,如果整個表達式在此特定解釋中爲真,則給出真值。邏輯常量和表達式應該作爲字符串進行管理,因此您需要爲布爾操作實現它們自己的函數。邏輯值解釋函數返回不正確的結果

請注意,函數應該返回「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) 
+0

我從你在問題中顯示的內容中得到不同的(也是不正確的)結果。無論如何,在幾乎沒有描述代碼的作用或它在內部如何操作(除了錯誤代碼本身)的情況下,很難調試別人的代碼。它試圖實現什麼算法? – martineau

+1

不知道任何額外的細節,從閱讀你的代碼我可以告訴你的兩個函數有一個問題隱式地返回'None'當他們一直執行到最後(因爲沒有以前的條件語句是「真」所以沒有之前的'return'語句遇到並執行)。 – martineau

回答

0

上面貼出的代碼的問題是,它不處理子表達式,您似乎在示例中允許使用子表達式。您似乎只允許通過設計使用二進制ANDOR以及一元NOT。但是,and_operator未實現,並且子表達式未解決(通過遞歸調用interpret()並處理它返回的值)。其他功能如real_values沒有用處。最後,必須檢查輸入表達式和字典的句法有效性。

如果您想了解口譯的工作方式,最好按照this,thisthis的一些教程進行操作。否則,如果您只需要該功能可靠地工作,則可以利用現有的經過測試的代碼,如parsepyparsing或甚至parser