簡體   English   中英

檢查一個命題公式是否隱含另一個命題公式(在Haskell中)

[英]Checking if One Propositional Formula Implies Another (in Haskell)

假設我們有

data Exp = Prop String -- a proposition
         | And Exp Exp -- a conjunction of propositions
         | Or Exp Exp  -- a disjunction of propositions

然后有沒有辦法查看一個嵌套表達式是否暗含了另一個? 也就是說,我正在尋找以下內容:

implies :: Exp -> Exp -> Bool
implies = {- returns true if and only if the first expression 
               implies the second expression                    -}

implies
  (And (Prop "Apple") (Prop "Banana")) 
  (Or  (Prop "Apple") (Prop "Banana"))
-- => True, since "Apple and Banana" implies "Apple or Banana"

implies 
  (Or  (Prop "Apple") (Prop "Banana"))  
  (And (Prop "Apple") (Prop "Banana")) 
-- => False, since "Apple or Banana" does not imply "Apple and Banana"

有沒有辦法實現這一目標,或者有一些庫可以實現這一目標? 如果會有所不同:我只需要AndOr (即,我不需要實質性暗示)。

通常,您將使用SAT求解器(如另一個答案中所指出),但是對於您的特定示例,您還可以利用以下事實:一組文字U命題公式可以由U的子集表示。 這些“代表子集”是公式的模型。

在您的示例中, U = { Apple, Banana } 表達式(Apple AND Banana)僅由U的單個子集表示,即{ Apple, Banana } (Apple OR Banana)具有三種模型: { Apple }{ Banana }{ Apple, Banana }

如果命題pmodels(f)p為true,否則為false。 公式f AND g模型是U那些子集,它們是fg模型。 模型f OR g是任何一組是的模型f或模型g

在Haskell中,這看起來像(如果我們在頂部添加import qualified Data.Set as S ):

-- The powerset of `U = {Apple, Banana}`
u = [S.empty, S.singleton "Apple", S.singleton "Banana", S.fromList ["Apple", "Banana"]]

isModelOf :: S.Set String -> Exp -> Bool
isModelOf s = any ((==) s) . models

models :: Exp -> [S.Set String]
models e = case e of
  Prop s -> filter (s `S.member`) u
  And l r -> filter (flip isModelOf r) $ models l
  Or l r -> models l ++ models r

最后,式f意味着式g如果每一個模型f也是一個模型g

implies :: Exp -> Exp -> Bool
implies f g = all isGModel fModels where
  fModels = models f
  gModels = models g
  isGModel s = any ((==) s) gModels

請注意,這種方法效率極低,並且無法擴展到少量文字(因為模型是通過枚舉所有文字的子集來計算的)。 但是從集合的角度考慮問題可能具有教育意義。

這觸及了計算機科學中的關鍵問題之一。 對於布爾變量的AND和OR的表達式,我們能否確定該表達式是否可滿足? 還是表達總是假的?

一種簡單的算法是通過矛盾構造證明,然后迭代地應用分辨率

例如,第一個問題等同於證明APPLE && BANANA && NOT (APPLE || BANANA)無效。 好吧,該表達式等效於APPLE && BANANA && NOT APPLE && NOT BANANA並且該表達式無效,因此我們可以得出結論認為。

同樣,第二個問題等效於證明無效(APPLE || BANANA) && NOT (APPLE && BANANA) 這分為四個表達式: APPLE && NOT APPLEAPPLE && NOT BANANABANANA && NOT APPLEBANANA & NOT BANANA 可以證明第一個和最后一個子表達式無效,而其他子表達式不能。 解析算法意識到它被卡住了,因此含義不成立。

諸如此類的解決公式是否有效的算法屬於SAT求解器 布爾可滿足性問題比您要面對的問題更為普遍,解決該問題的軟件包(例如Hackage上的 增量式-sat-solverHackage上的funsat )采用了比此處概述的算法更為復雜的算法,但是您應該找到可能的方法將您的表達轉化為可滿足性的問題。 通常,系統會要求您使用變量以及AND與OR來創建一個與抽象數據類型相同的表達式。 這兩個軟件包都將吐出一個結果數據類型,告訴您表達式是不滿足要求的還是表達式可以滿足的,這就是所有變量的含義。 您的主張可以實現為變量,您已經知道其真值是真實的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM