2016-04-14 12 views
1

私は現在、Parsecを使用してHaskellでPrologを構築しています。ハスケルに関する私の知識はせいぜい控えめですが、Parsecと強力な型システムの約束は、私を引き込むのに十分なものでした。HaskellのProlog型階層

私は、文字通りのタイプ階層原始(Atoms、Variables)を要約(Rule、Head、Clause)に変換する。使用

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の使用に適した方法で改善するにはどうすればよいですか?この目的のために私の設計選択の批判をお寄せください。

+0

正常に見えるが、これは、このようなよくある質問サイトの良い質問ではありません - 私が '型プログラム= [ProExp]'、 'タイプファクト= Head'、'タイプのルールを記述します – Carsten

+1

ビット独断と思われます=(頭部、胴体) 'などとなります。すべてのデータを「データ」にすると、定型文が多く発生する可能性があります。 'type'と' data'の違いは、 'type'はシノニムを導入し、' data'は新しいデータ型を導入するということです。 'Program'が' type'で、 'data'では' Program'に 'map'を適用することができます。新しいデータ型が本当に必要な場合でも、ほとんどの 'data'は' newtype'sに置き換えなければなりません。 – user3237465

+1

これがあまりにも有用かどうかはわかりません。結局のところ、あなたは言葉しか持っていません。 "ルール"は、例えば、ファンクタ「: -/2」を持つ項です。条件はモデル化するのに十分簡単です。しかし、あなたが必要とするのは、クエリを評価する意味を定義することです。たとえば、 '、(Term1、Term2)の意味は何ですか?結局のところ、このコンマで何をしていますか?これは制御述語ですが、これも用語構文の一部です。 –

答えて

4

全体として、このアプローチは完全に良好です。実際、Haskellやその他の関数型言語は、これに適していることでよく知られています。いくつかの警告:

  1. これらのタイプのいくつかは本当に有用ではないようです。 Termsを定義しても、dataではなく、タイプ同義語type Terms = [Term]となります。[Term]を使用することをお勧めします。

  2. 実際に余分な怠惰を必要としない限り、newtypeは、dataの代わりに通常newtypeの代わりに使用されます。

  3. Prologの "Clause"は、ProExpと呼ばれるファクトまたはルールのことです。

    data Clause = Fact Head | Rule Head Body 
    

    (多分ちょうどdata Clause = Fact { head :: Callable } | Rule { head :: Callable, body :: [Callable] }、実際のP​​rologを実装する際Headがよく有用である可能性がある):1のように、私はFactRule別々の種類、Clauseだけのコンストラクタをすることはないだろう。 を完全に削除してください。基本的には空のボディを持つRuleだからです。

  4. 一般的に、あなたの記憶をリフレッシュするのではなく、あなたの記憶をリフレッシュすることをお勧めします。

+2

私は、事実とルールの区別を含めて、このすべてについてはあまりよく分かりません。結局のところ、あなたは用語を持っているだけです。例えば、 ':-(foo(X)、bar(X))'のように、 ''ルールは ': -/2'という言葉です。用語が事実であるか述語の節であるかは、それが評価されるかどうかに依存する。 –