Haskell-实现一阶逻辑表达式

Haskell-实现一阶逻辑表达式,haskell,ghci,first-order-logic,Haskell,Ghci,First Order Logic,我正在尝试使用Haskell实现FOL。一阶逻辑可以是命题的形式,与And和Or等连接词连接在一起。表达式中还有一些限定范围的量词 到目前为止,我所做的是: 导入数据。列表 data Prop = Not Prop | Prop And Prop | Prop Or Prop | Prop Impl Prop | Prop Equiv Prop | ForAll String Prop | Exists String Prop d

我正在尝试使用Haskell实现FOL。一阶逻辑可以是命题的形式,与And和Or等连接词连接在一起。表达式中还有一些限定范围的量词

到目前为止,我所做的是:

导入数据。列表

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’
你说

...
| Prop And Prop
...
你需要说的是

...
| And Prop Prop
...
其他人也是如此。构造函数名称必须放在第一位。

你说过

...
| Prop And Prop
...
你需要说的是

...
| And Prop Prop
...
其他人也是如此。构造函数名称必须放在第一位。

您多次尝试使用Prop作为构造函数名称,第一个单词始终是构造函数名称。似乎您希望为And、Or和其他对象使用中缀构造函数。为了把它们写成中缀,你需要把构造器的名字放在后面

data Prop
    = Not Prop
    | Prop `And` Prop
    ...
您多次尝试将Prop用作构造函数名称,第一个单词始终是构造函数名称。似乎您希望为And、Or和其他对象使用中缀构造函数。为了把它们写成中缀,你需要把构造器的名字放在后面

data Prop
    = Not Prop
    | Prop `And` Prop
    ...

当您声明代数数据类型时,声明的右侧是该类型的可能构造函数列表。然而,构造函数只是函数,这意味着它们在前缀表示法中使用。您试图以中缀方式使用例如And构造函数,但这种方式不起作用

以下代码运行良好:

数据道具 =不是道具 |和道具 |还是道具 |Impl-Prop-Prop |等效支柱 |全绳道具 |存在字符串属性 推导公式 但是,您可以定义模仿构造函数的函数,例如-

propAnd::道具->道具->道具 P和AB=和AB 并以中缀的方式使用反引号:a`propAnd`b。 正如评论中所建议的,这是不必要的,因为已经可以用中缀的方式:a`和b`使用

另一个选项是以中缀方式定义构造函数本身:

数据道具 =不是道具 |道具`和`道具 |道具`或`道具 |Prop`Impl`Prop |道具'Equiv'道具 |全绳道具 |存在字符串属性 推导公式 然后a`和b以及a和b都工作


注意:您的数据类型是无限的,因为所有构造函数都使用一个或多个道具。我认为您还应该包括一些原子构造函数。

当您声明代数数据类型时,声明的右侧是该类型的可能构造函数列表。然而,构造函数只是函数,这意味着它们在前缀表示法中使用。您试图以中缀方式使用例如And构造函数,但这种方式不起作用

以下代码运行良好:

数据道具 =不是道具 |和道具 |还是道具 |Impl-Prop-Prop |等效支柱 |全绳道具 |存在字符串属性 推导公式 但是,您可以定义模仿构造函数的函数,例如-

propAnd::道具->道具->道具 P和AB=和AB 并以中缀的方式使用反引号:a`propAnd`b。 正如评论中所建议的,这是不必要的,因为已经可以用中缀的方式:a`和b`使用

另一个选项是以中缀方式定义构造函数本身:

数据道具 =不是道具 |道具`和`道具 |道具`或`道具 |Prop`Impl`Prop |道具'Equiv'道具 |全绳道具 |存在字符串属性 推导公式 然后a`和b以及a和b都工作


注意:您的数据类型是无限的,因为所有构造函数都使用一个或多个道具。我认为您还应该包括一些原子构造器。

这倒勾的确切含义是什么?这是一个字符串吗?@SalmaFG反勾号将一个普通名称转换成中缀运算符。这个反勾号到底是什么意思?这是一个字符串吗?@SalmaFG backtick把一个普通的名字变成了中缀操作符。你对原子结构的看法是对的,所以我试着添加它们:data Prop=Not Prop | Prop和Prop | Obj和Obj | Prop和Obj | Prop或Prop | Obj或Obj | Obj或Prop | Prop Impl Prop | Obj|Prop Impl Obj | Obj Impl Prop | Prop Equiv Prop | Obj Equiv Obj | Prop Equiv Obj | Obj Equiv Prop | for all String Prop | Exists String Prop派生Eq,Ord data Obj=Var String | Pred String[Prop]派生Eq,但是它说我在做多个声明。propAnd实际上是多余的:即使构造函数和是以非中缀的方式声明的,构造函数仍然可以使用backticks中缀,就像在a`And`b中一样。@SalmaFG现在您正在使用And和所有其他构造函数多次。我不知道你对软件设计的想法是什么,所以我不知道我应该提出什么建议。事实上,我确实知道——发布一个新问题,问你在挣扎什么
关于原子结构我是对的,所以我试着把它们加起来:数据Prop=Not Prop | Prop和Prop | Obj和Obj | Prop和Obj | Prop或Prop | Obj或Obj | Obj或Prop | Prop Impl PropProp | ForAll String Prop | Exists String Prop派生Eq,Ord data Obj=Var String | Pred String[Prop]派生Eq,Ord,但它说我正在进行多个声明。propAnd实际上是冗余的:即使构造函数是以非中缀方式声明的,构造函数仍然可以在中缀中使用backticks,如a`And`b.@SalmaFG现在您多次使用And和所有其他构造函数。我不知道你对软件设计的想法是什么,所以我不知道我应该提出什么建议。事实上,我知道-发布一个新的问题,问你在做什么。请记住,你包括了诸如ForAll之类的量词,但没有包括任何使用量化变量的方法,即谓词。我将为谓词添加Pred String[Term],其中data Term=Var String | App String[Term]。你可能还想添加相等。是的,这是我的第一个想法:现在获得Prop类型值的唯一方法是让a=Not b;b=不在……中。。。因为这个公式缺少原语。请记住,您包括了诸如ForAll之类的量词,但没有包括任何使用量化变量的方法,即谓词。我将为谓词添加Pred String[Term],其中data Term=Var String | App String[Term]。你可能还想添加相等。是的,这是我的第一个想法:现在获得Prop类型值的唯一方法是让a=Not b;b=不在……中。。。因为这个公式缺少基元。