[英]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"
有沒有辦法實現這一目標,或者有一些庫可以實現這一目標? 如果會有所不同:我只需要And
和Or
(即,我不需要實質性暗示)。
通常,您將使用SAT求解器(如另一個答案中所指出),但是對於您的特定示例,您還可以利用以下事實:一組文字U
命題公式可以由U
的子集表示。 這些“代表子集”是公式的模型。
在您的示例中, U = { Apple, Banana }
。 表達式(Apple AND Banana)
僅由U
的單個子集表示,即{ Apple, Banana }
。 (Apple OR Banana)
具有三種模型: { Apple }
, { Banana }
和{ Apple, Banana }
。
如果命題p
在models(f)
則p
為true,否則為false。 公式f AND g
模型是U
那些子集,它們是f
和g
模型。 模型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 APPLE
, APPLE && NOT BANANA
, BANANA && NOT APPLE
, BANANA & NOT BANANA
。 可以證明第一個和最后一個子表達式無效,而其他子表達式不能。 解析算法意識到它被卡住了,因此含義不成立。
諸如此類的解決公式是否有效的算法屬於SAT求解器 。 布爾可滿足性問題比您要面對的問題更為普遍,解決該問題的軟件包(例如Hackage上的 增量式-sat-solver和Hackage上的funsat )采用了比此處概述的算法更為復雜的算法,但是您應該找到可能的方法將您的表達轉化為可滿足性的問題。 通常,系統會要求您使用變量以及AND與OR來創建一個與抽象數據類型相同的表達式。 這兩個軟件包都將吐出一個結果數據類型,告訴您表達式是不滿足要求的還是表達式可以滿足的,這就是所有變量的含義。 您的主張可以實現為變量,您已經知道其真值是真實的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.