簡體   English   中英

haskell中的命題邏輯

[英]Propositional logic in haskell

我有以下數據類型

data Prop =
  Var Name
  | Neg Prop
  | Conj Prop Prop
  | Disy Prop Prop
  | Impl Prop Prop
  | Syss Prop Prop deriving Show -- if and only if

-- And the following

type Name = String

type State = (Name, Bool) -- The state of a proposition, Example ("P", True), ("Q", True)

type States = [State] -- A list of states, [("P", True), ("Q", False), ...]

type Row = (States, Bool) -- A row of the table. ([("P", True), ("Q", False), ...], True)

type Table = [Row]

案例是我想生成一個命題的所有可能狀態

P, Q, R

1 1 1

1 1 0

1 0 1

...

為此,我創建了輔助函數來逐步構建狀態

-- Get all the atoms of a proposition
varList :: Prop -> [Name] 
varList (Var p) = [p]
varList (Neg p) = varList p
varList (Conj p q) = varList p ++ varList q
varList (Disy p q) = varList p ++ varList q
varList (Impl p q) = varList p ++ varList q
varList (Syss p q) = varList p ++ varList q

--Power set to get all values 
conjPoten :: Eq a => [a] -> [[a]]
conjPoten []     = [[]]
conjPoten (x:xs) = map (x: ) pt `union` pt
  where
    pt = conjPoten xs


-- Give value to a proposition, "P" -> True, "" -> False 
giveValue:: Name -> Bool
giveValue p = p /= []

-- Generate a State, "P" -> ("P",True), "" -> ("",False)
generateState :: Name -> State
generateState p = (p , daValor p)


-- The function that I want
generateStates:: [Name] -> States
generateStates p = [(a,True) | a <-p]

當然,這是驗證“有效”的測試,因為如果 generateStates ["P","Q", "R"] = [("P",True),("Q",True), (“R”,真)]

我這樣做是想在冪集中我們會遇到像 ["P","Q","R"] 和 ["P","Q"] 這樣的情況,也就是說,不會有“ R”。 所以意圖是 ["P","Q","R"] 給我們 [("Q",True),("P",True),("R",True)] 和 ["P" ,"Q"] 給我們 [("Q",True),("P",True),("R",False)]

但是從這里我有兩個問題第一個是,我必須修改元組的第二個元素,所以我想到的是

generateStates :: [Name] -> States
generateStates p = [ (a, b) | a<- p, a<- giveValue p]

前奏給我的主要錯誤是:Couldn't match type '[Char]' with 'Char'

據我所知,因為 p 是一個列表並且 giveValue 與名稱一起使用,而不是與名稱列表一起使用

  • 所以我的問題是:如何從名稱中獲取 p? 並且它不會保留為名稱列表

我試着這樣做

generateStates :: [Name] -> States
generateStates [p] = [ (p, b) | a<- giveValue p]

但這告訴我: Couldn't match expected type '[Bool]' with actual type 'Bool' 現在我不明白,而且它告訴我沒有足夠的模式

  • 為什么會這樣?

另一個問題是,有

generateStates :: [Name] -> States
generateStates p = [ (a, True) | a<-p]

並嘗試使用 generateStates ["P","Q"] 只會給我 [("Q",True),("P",True)] 但我們有 P、Q 和 R,所以我錯過了("R", False) 但是由於它在我們傳遞的 arguments 中,所以無法將其添加到列表中

  • 我從哪里得到 R? 那些缺失的變量?

謝謝!

要更改元組,您實際上需要創建一個新元組,因為它們是不可變的。 您可以使用模式匹配創建一個 function。 下面的 function 適用於成對(具有兩個元素的元組)。

modTuple (firstValue, secondValue) updatedValue = (firstValue, updatedValue)

或者,您可以使用內置的fstsnd訪問元組的成員以訪問第一個和第二個元素,並創建一個新的元組。

您可以使用模式匹配來訪問列表的各個元素,並遞歸地構建狀態。 IE

generateStates [] = []
generateStates (p:ps) = (p, giveValue p):(generateStates ps)

暫無
暫無

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

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