Когда вы объявляете алгебраический тип данных, правая часть объявления представляет собой «список» возможных конструкторов для этого типа. Однако конструкторы - это просто функции, то есть они используются в префиксной нотации. Вы пытаетесь использовать, например, 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
.
Примечание: ваш тип данных бесконечен, поскольку все конструкторы занимают один или несколько Prop
. Я думаю, вам следует также включить некоторые «атомарные» конструкторы.
person
zegkljan
schedule
25.11.2014
ForAll
, но не включаете какой-либо способ использования количественных переменных, то есть предикатов. Я бы добавилPred String [Term]
для предикатов, гдеdata Term = Var String | App String [Term]
. Вы также можете добавить равенство. - person chi   schedule 25.11.2014Prop
прямо сейчас - это что-то сумасшедшее, напримерlet a = Not b; b = Not a in ...
, потому что в этой формуле отсутствуют примитивы. - person CR Drost   schedule 25.11.2014