2014-11-25 63 views
1

我想用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’ 
+1

請記住,您包含的數量詞如「ForAll」,但您不包含任何使用量化變量的方式,即謂語。我會爲謂詞添加'Pred String [Term]',其中'data Term = Var String | App String [Term]'。您也可能想要添加平等。 – chi 2014-11-25 14:38:43

+0

是的,那是我的第一個想法:現在獲得「Prop」類型值的唯一方法就像'let a = Not b; b =不是......,因爲這個公式缺少*原語*。 – 2014-11-25 20:42:47

回答

6

當你聲明一個代數數據類型時,聲明的右邊是這個類型的可能構造函數的「列表」。但是,構造函數只是函數,這意味着它們用於前綴符號。您嘗試使用例如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` bAnd a b都有效。

注意:你的數據類型是無限的,因爲所有的構造函數都帶有一個或多個Prop s。我認爲你還應該包括一些「原子」構造函數。

+0

你是對的原子常量,所以我試圖加入他們: 數據支柱 =不支持 | Prop'和'Prop | Obj'和'Obj | Prop'和'Obj | Obj'和'Prop |道具'或'道具| Obj'或'Obj | Prop'或Obj | Obj'或'Prop | Prop'Impl' Prop | Obj'Impl' Obj |支柱'Impl' Obj | Obj'Impl'支柱 | Prop'Equiv' Prop | Obj'Equiv' Obj |支柱'Equiv' Obj | Obj'Equiv'支柱 | ForAll String Prop | Exists String Prop 推導(Eq,Ord) data Obj = Var字符串 | Pred String [Prop] 派生(Eq,Ord) 但它說我正在做多個聲明。 – SalmaFG 2014-11-25 13:33:06

+3

'propAnd'實際上是多餘的:即使構造函數'And'是以非中綴方式聲明的,構造函數仍然可以像''a'和''b''中那樣使用反引號來使用中綴。 – chi 2014-11-25 13:52:58

+0

@SalmaFG現在你多次使用'And'(和所有其他構造函數)。我不知道你對軟件設計有什麼想法,所以我不知道我應該建議什麼。事實上,我確實知道 - 發表一個新的問題,與你正在掙扎的是什麼。 – zegkljan 2014-11-25 14:11:08

3

你說

... 
| Prop And Prop 
... 

什麼你需要說的是

... 
| And Prop Prop 
... 

(對所有其他人也是如此)。構造函數的名字必須先來第一個

6

您試圖多次使用Prop作爲構造函數名稱(第一個單詞始終是構造函數名稱)。看起來你想使用AndOr和其他的中綴構造函數。爲了將它們寫入中綴,你需要將構造函數名稱反引號。

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

這個反撥意味着什麼?這是否使'和'一個字符串? – SalmaFG 2014-11-25 13:16:23

+4

@SalmaFG反標將正常名稱變爲中綴運算符。 – MathematicalOrchid 2014-11-25 13:29:42