Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การแยกวิเคราะห์นิพจน์บูลีนใน Python


สมมติว่าเรามีนิพจน์บูลีน เราต้องหาผลลัพธ์หลังจากประเมินนิพจน์นั้น

นิพจน์สามารถเป็นได้ทั้ง −

  • "t" ประเมินเป็น True;

  • "f" ประเมินเป็นเท็จ

  • "!(นิพจน์)" ประเมินตรรกะไม่ใช่ของนิพจน์ภายใน

  • "&(expr1,expr2,...)" ประเมินตรรกะ AND ของนิพจน์ภายใน 2 ตัวขึ้นไป

  • "|(expr1,expr2,...)" ประเมินเป็นตรรกะ OR ของนิพจน์ภายใน 2 ตัวขึ้นไป

ดังนั้น หากอินพุตเป็นแบบ "|(!(t),&(t,f,t))" ผลลัพธ์จะเป็นแบบ fasle นั่นเป็นเพราะ !(t) เป็นเท็จ ดังนั้น &(t,f, t) เป็นเท็จเช่นกัน ดังนั้น OR ของค่าเท็จทั้งหมดจะเป็นเท็จ

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนด Solve() นี้จะใช้เวลา e, i

  • ถ้า e[i] เหมือนกับ "f" แล้ว −

    • ผลตอบแทน (เท็จ ผม + 1)

  • มิฉะนั้นเมื่อ e[i] เหมือนกับ "t" −

  • กลับ (จริงฉัน + 1)

  • op :=e[i], i :=i + 2

  • กำหนดหนึ่งกอง

  • ในขณะที่ e[i] ไม่ได้ปิดวงเล็บ ให้ทำ -

    • ถ้า e[i] เหมือนกับ "," แล้ว −

      • ผม :=ผม + 1

      • ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป

    • res,i :=แก้ (e, i)

    • ดัน res ลงใน stack

  • ถ้า op เหมือนกับ "&" แล้ว −

    • คืนค่า จริง เมื่อองค์ประกอบทั้งหมดเป็นจริงในสแต็ก มิฉะนั้น เท็จ i + 1

  • มิฉะนั้นเมื่อ op เหมือนกับ " OR " −

    • คืนค่า จริง เมื่อองค์ประกอบอย่างน้อยหนึ่งรายการเป็นจริงในสแต็ก มิฉะนั้น เท็จ i + 1

  • กลับ (ผกผันของ stack[0], i + 1)

  • จากวิธีหลัก ให้ทำดังนี้ −

  • s,y :=แก้ (นิพจน์, 0)

  • ผลตอบแทน s

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

class Solution(object):
   def parseBoolExpr(self, expression):
      s,y = self.solve(expression,0)
      return s
   def solve(self,e,i):
      if e[i] =="f":
         return False,i+1
      elif e[i] == "t":
         return True,i+1
      op = e[i]
      i = i+2
      stack = []
      while e[i]!=")":
         if e[i] == ",":
            i+=1
            continue
         res,i = self.solve(e,i)
         stack.append(res)
      if op == "&":
         return all(stack),i+1
      elif op == "|":
         return any(stack),i+1
      return not stack[0],i+1
ob = Solution()
print(ob.parseBoolExpr("|(!(t),&(t,f,t))"))

อินพุต

"|(!(t),&(t,f,t))"

ผลลัพธ์

False