Haskell - 实现一阶逻辑表达式

时间:2014-11-25 12:53:30

标签: haskell ghci first-order-logic

我正在尝试使用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’

3 个答案:

答案 0 :(得分:6)

您尝试多次使用Prop作为构造函数名称(第一个单词始终是构造函数名称)。您似乎想要为AndOr和其他人使用中缀构造函数。为了编写中缀,你需要将构造函数名称放在反引号中。

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
...

(同样适用于所有其他人)。构造函数名称必须首先