私は現在、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の使用に適した方法で改善するにはどうすればよいですか?この目的のために私の設計選択の批判をお寄せください。
正常に見えるが、これは、このようなよくある質問サイトの良い質問ではありません - 私が '型プログラム= [ProExp]'、 'タイプファクト= Head'、'タイプのルールを記述します – Carsten
ビット独断と思われます=(頭部、胴体) 'などとなります。すべてのデータを「データ」にすると、定型文が多く発生する可能性があります。 'type'と' data'の違いは、 'type'はシノニムを導入し、' data'は新しいデータ型を導入するということです。 'Program'が' type'で、 'data'では' Program'に 'map'を適用することができます。新しいデータ型が本当に必要な場合でも、ほとんどの 'data'は' newtype'sに置き換えなければなりません。 – user3237465
これがあまりにも有用かどうかはわかりません。結局のところ、あなたは言葉しか持っていません。 "ルール"は、例えば、ファンクタ「: -/2」を持つ項です。条件はモデル化するのに十分簡単です。しかし、あなたが必要とするのは、クエリを評価する意味を定義することです。たとえば、 '、(Term1、Term2)の意味は何ですか?結局のところ、このコンマで何をしていますか?これは制御述語ですが、これも用語構文の一部です。 –