簡體   English   中英

Haskell中的邏輯公式打印

[英]Logic formula printing in Haskell

我正在處理一些奇怪的問題。 我想編寫一個Haskell程序,它將打印給定的邏輯公式,即

print (showFormula (I (N (Z 'p')) (A (C (Z 'p') (Z 'q')) (Z 'r'))))

(我的意思是,A - 替代,N - 否定,C - 連詞和Z - 字符)

應該印這樣的東西:

"(~p => ((p & q) | r))"

到目前為止,我的代碼看起來像這樣:

data Formula
    = Z Char
    | V Bool
    | N Formula
    | C Formula Formula
    | A Formula Formula
    | I Formula Formula
    | Join Formula Formula

showFormula :: Formula -> String
showFormula (Z c) = [c]
showFormula (Join a b) = (showFormula a) ++ (showFormula b)

showFormula (N a) = '~':(showFormula a)
showFormula (C a b) = "("++(showFormula a)++" & "++(showFormula b)++")"
showFormula (A a b) = "("++(showFormula a)++" | "++(showFormula b)++")"
showFormula (I a b) = "("++(showFormula a)++" => "++(showFormula b)++")"

它確實打印了正確的字符串,但只有當您輸入簡單的公式(C (Z 'a') (Z 'b'))(C (Z 'a') (Z 'b'))並且它與某些擴展公式崩潰時。 我知道問題是將一個Formula參數而不是String傳遞給showFormula函數,但我不知道如何更改它。 請給我一些建議如何解決這個問題。

如果使用-Wall標志編譯代碼,它將顯示以下警告:

fml.hs:4:1: Warning:
    Pattern match(es) are non-exhaustive
    In an equation for `showFormula': Patterns not matched: V _

你忘了為showFormula編寫V case,所以如果它達到那個就會崩潰,類似於如果用空列表調用head函數崩潰的話。

看起來你錯過了模式匹配中的(V b)情況。

data Formula
    = Z Char
    | V Bool
    | N Formula
    | C Formula Formula
    | A Formula Formula
    | I Formula Formula
    | Join Formula Formula

showFormula :: Formula -> String
showFormula (V b) = show b
showFormula (Z c) = [c]
showFormula (Join a b) = (showFormula a) ++ (showFormula b)

showFormula (N a) = '~':(showFormula a)
showFormula (C a b) = "("++(showFormula a)++" & "++(showFormula b)++")"
showFormula (A a b) = "("++(showFormula a)++" | "++(showFormula b)++")"
showFormula (I a b) = "("++(showFormula a)++" => "++(showFormula b)++")"

main :: IO ()
main = do
  print (showFormula (I (N (Z 'p')) (A (C (Z 'p') (Z 'q')) (Z 'r'))))
  -- "(~p => ((p & q) | r))"

暫無
暫無

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

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