[英]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和其他函數式語言非常適合此用途。 一些警告:
有些類型的似乎不是真的有用,例如,如果我定義的Terms
在所有這將是作為一個類型同義詞type Terms = [Term]
,而不是data
,我只想用喜歡[Term]
。
對於單字段單構造函數類型,通常使用newtype
代替data
,除非您確實需要額外的惰性。
Prolog中的“子句”是指您所說的ProExp
:事實或規則。 與1一樣,我不會將Fact
和Rule
分離為單獨的類型,而只是將Clause
構造函數:
data Clause = Fact Head | Rule Head Body
(甚至只是data Clause = Fact { head :: Callable } | Rule { head :: Callable, body :: [Callable] }
,但是Head
在實際實現Prolog時很有用)。 或完全刪除Fact
,因為一旦您着手實現事情,它基本上只是一個空着的Rule
。
通常,您可能希望刷新內存,而不是“盡力而為”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.