我正在尝试使用Haskell实现FOL。一阶逻辑可以是与And和Or等连接词连接在一起的命题形式。还有一些量词在表达式中的范围有限。
到目前为止我所做的是:
导入Data.List
data Prop
= Not Prop
| Prop And Prop
| Prop Or Prop
| Prop Impl Prop
| Prop Equiv Prop
| ForAll String Prop
| Exists String Prop
deriving (Eq, Ord)
但是我收到了这个错误:
Multiple declarations of ‘Prop’
答案 0 :(得分:6)
您尝试多次使用Prop
作为构造函数名称(第一个单词始终是构造函数名称)。您似乎想要为And
,Or
和其他人使用中缀构造函数。为了编写中缀,你需要将构造函数名称放在反引号中。
data Prop
= Not Prop
| Prop `And` Prop
...
答案 1 :(得分:6)
当您声明代数数据类型时,声明的右侧是此类型的可能构造函数的“列表”。但是,构造函数只是函数,这意味着它们用于前缀表示法。您尝试使用例如{@ 1}}构造函数以中缀方式无效。
以下代码效果很好:
And
但是,您可以定义模仿构造函数的函数,例如 - 击>
data Prop
= Not Prop
| And Prop Prop
| Or Prop Prop
| Impl Prop Prop
| Equiv Prop Prop
| ForAll String Prop
| Exists String Prop
deriving (Eq, Ord)
并使用反引号以中缀方式使用这些:
正如评论中所建议的那样,这不是必需的,因为propAnd :: Prop -> Prop -> Prop
propAnd a b = And a b
。a `propAnd` b
已经可以在中缀方式中使用:And
另一个选择是以中缀方式定义构造函数:
a `And` b
然后data Prop
= Not Prop
| Prop `And` Prop
| Prop `Or` Prop
| Prop `Impl` Prop
| Prop `Equiv` Prop
| ForAll String Prop
| Exists String Prop
deriving (Eq, Ord)
和a `And` b
都有效。
注意:您的数据类型是无限的,因为所有构造函数都需要一个或多个And a b
。我认为你还应该包括一些“原子”构造函数。
答案 2 :(得分:3)
你说
...
| Prop And Prop
...
你需要说的是
...
| And Prop Prop
...
(同样适用于所有其他人)。构造函数名称必须首先 。