簡體   English   中英

Haskell中的Prolog類型層次結構

[英]Prolog type hierarchy in Haskell

我目前正在努力使用Parsec在Haskell中構建Prolog。 盡管我對Haskell的了解充裕,但Parsec的承諾和強大的字體系統足以吸引我。

我先從類型層次結構上映射語言開始,從文字原語(原子,變量)到抽象(規則,標題,子句)。

infix 6 :-
data Program   = Program [ProExp]
data ProExp    = ProExp Fact | Rule
data Fact      = Fact Head
data Rule      = Rule Head Body
data Body      = Clauses [Clause] | Link Char
data Head      = Head Clause
data Clause    = Clause Predicate Terms
data Goals     = Goals [Predicates]
data Predicate = Predicate String
data Terms     = Terms [Term]
data Term      = Constant String
               | Variable String

使用的術語遵循Clocksin的條款和效果

如何以有利於使用Parsec的方式改進這種類型的系統? 為此,請分享對我的設計選擇的任何批評。

總體而言,該方法非常好。 實際上,Haskell和其他函數式語言非常適合此用途。 一些警告:

  1. 有些類型的似乎不是真的有用,例如,如果我定義的Terms在所有這將是作為一個類型同義詞type Terms = [Term] ,而不是data ,我只想用喜歡[Term]

  2. 對於單字段單構造函數類型,通常使用newtype代替data ,除非您確實需要額外的惰性。

  3. Prolog中的“子句”是指您所說的ProExp :事實或規則。 與1一樣,我不會將FactRule分離為單獨的類型,而只是將Clause構造函數:

     data Clause = Fact Head | Rule Head Body 

    (甚至只是data Clause = Fact { head :: Callable } | Rule { head :: Callable, body :: [Callable] } ,但是Head在實際實現Prolog時很有用)。 或完全刪除Fact ,因為一旦您着手實現事情,它基本上只是一個空着的Rule

  4. 通常,您可能希望刷新內存,而不是“盡力而為”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM