我遇到了一个奇怪的问题。我想编写一个Haskell程序,它可以打印给定的逻辑公式,即:
print (showFormula (I (N (Z 'p')) (A (C (Z 'p') (Z 'q')) (Z 'r'))))
应该打印出类似这样的内容:(其中I表示蕴含,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'))
,并且在使用某些扩展公式时会崩溃。我知道问题是将一个公式参数传递给showFormula函数,而不是字符串,但我不知道如何更改。请给我一些建议,如何修复它。
:
开头,你也可以编写它们,因此你可以使用Formula :&: Formula
、Formula :|: Formula
和Formula :=> Formula
代替C
、A
和I
。(然后您可能需要固定声明 - 也许是infixr 3 :&&:
、infixr 2 :|:
和infixr 4 :=>
。) - Antal Spector-Zabusky