我在 Haskell 中编写了一些代码来建模命题逻辑
data Formula = Prop {propName :: String}
| Neg Formula
| Conj Formula Formula
| Disj Formula Formula
| Impl Formula Formula
| BiImpl Formula Formula
deriving (Eq,Ord)
但是,由于数据类型是封闭的,因此没有自然的方法可以将其扩展到模态逻辑。因此,我认为我应该改用类。这样,我以后可以很容易地在不同的模块中添加新的语言特性。问题是我不完全知道如何写它。我想要类似下面的东西
type PropValue = (String,Bool) -- for example ("p",True) states that proposition p is true
type Valuation = [PropValue]
class Formula a where
evaluate :: a -> Valuation -> Bool
data Proposition = Prop String
instance Formula Proposition where
evaluate (Prop s) val = (s,True) `elem` val
data Conjunction = Conj Formula Formula -- illegal syntax
instance Formula Conjunction where
evaluate (Conj φ ψ) v = evaluate φ v && evaluate ψ v
错误当然在于连词的定义。但是,我不清楚如何重写它以使其工作。