1

この問題で2日間苦労したので、私はあきらめました。あなたは2つの入力が与えられます。最初のものは命題を含むリストで、もう1つは辞書です。提案を受け取り、与えられた辞書キーに基づいて答えを返す、文字列インタプリタをPythonで作成するには?

例:

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

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

次は、可能な入力です:

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

私は問題は二重の再帰を使用せずに解決することが文句を言わないことに賭けています。これは問題を解決する私の試みです、私は入力が "フラットフラット"であるという基本ケースから始めました。これはリストの要素としてリストを持たない1Dリストを意味します。プログラムはブール値を返すべきではなく、trueまたはfalseを辞書に返します。

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"})) 

私の質問はここからどうやって進んでいくのですか?

+0

命題は何ですか? –

+0

出力はどのように見えますか?入力を出力に変換するためのルールは何ですか? –

+0

@HaiVuは、「真」または「偽」の形で、ブール値「真」または「偽」ではない –

答えて

0

再帰を使用する必要があります。命題を評価する関数eval(prop, keys)を定義します。命題とケースを一致させます。

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

return not eval(prop[1], keys) 

次のようになります。あなたは上記を参照した場合たとえば、

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

、あなたは、より複雑な例

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

としてそれを評価します実現すべきことは、それぞれ evalを呼び出すと、正確に1つの演算子が優先されます。あなたの仕事は、それがどのオペレータであるかを認識し、残りのリストを別の 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) 

また、あなたが返さなければならないという通知がブール値TrueFalseない文字列'True'と 'False'

+0

ここでのポイントはブール値ではなく '' true ''と' 'false" 'を返すことであり、あなたの疑似コードはそれを解決しませんでした –

関連する問題