2011-06-29 7 views
9

私はPrologのDCGに非常に感銘を受けています。Prolog:DCG文法を他の制限と組み合わせる

しかし、私はこの検索を他の制約と組み合わせたいと思います。たとえば、複雑な文法を定義し、Prologに10語以下のすべての文を生成するように依頼します。または、同じ単語を2度繰り返さないすべての文章。

このような余分な制約をDCG文法に追加することは可能ですか?あるいは、私は基本的にDCGを通常のProlog句に変換して修正する必要がありますか?

答えて

8

あなただけ生成されているすべての文章を見たい場合は、次のように使用することは非常に便利である:すべての文章を生成し、もちろん

?- length(Xs, N), phrase(mynonterminal, Xs). 

。しかし、それは非常に便利であり、具体的な限界を考える時間を節約します。それ以上に制限したい場合は、先に目標between(0,10,N)を追加してください。

あなたが特定の非端末が一定の長さを取る必要があることを、文法の中に言いたい場合は、それが明示的にこれを言うのが最善です:

seq([]) --> []. 
seq([E|Es]) --> [E], seq(Es). 

a --> {length(Es,10)}, seq(Es), {phrase(mynonterminal,Es)}. 

あなたはまだ満足していない場合、あなたがしたいです2つの非終端記号の交差を表現する。これは、一般的には決めることのできない2つの文脈自由言語の交わりを尋ねることと同じです。しかし、はるか早期に、あなたは終了に問題があります。そこで、以下においてその点に注意してください。

:- op(950, xfx, &). 

(NT1 & NT2) --> 
    call(Xs0^Xs^(phrase(NT1,Xs0,Xs),phrase(NT2,Xs0,Xs))). 

次あなたがlibrary(lambda)を使用しない場合にのみ必要とされている:

^(V0, Goal, V0, V) :- 
     call(Goal,V). 

^(V, Goal, V) :- 
    call(Goal). 

だから、これは二つの非端末の交差点を表現するために、今を許可します。しかし、終了は非常に脆弱であることにご注意ください。特に、第1の非端末の終了は必ずしも第2の端末を制限するものではない。

+0

"seq"を扱うこれの初期の部分は、私が必要とするものです(つまり、1つの非終端記号は有限リストです)。しかし、私は理解していないのでおそらくおそらくそれを働かせていません。最初の例では「フレーズ」とは何ですか? – interstar

+0

'(&)// 2'の定義を理解する前に、DCGがPrologでどのようにコード化されているかを理解してください。これに関する良い本はPereiraとShieberのProlog and Natural Language Analysisです。 http://www.mtome.com/Publications/PNLA/pnla.html(無料です) – false

+0

こんにちは、本の参考になりました。便利です。 あなたの解決策は「a - > {length(Es、10)}、seq(Es)、{phrase(mynonterminal、Es)}」と思う。私が欲しいものをほぼ正確に見ています。私のプログラムで、あなたが "フレーズ"を書いたところを書いておかなければならないことは分かりません。私は、その部分の目的は、シーケンスがmynonterminalsで作られていると言うことです。しかし、その "フレーズ"述語自体は何ですか? – interstar

5

だけでなく、あなたは常に{}使用することができますし、例えば、イン間のプロローグ述語のいずれかの種類を記述します。

foo(X)--> 
    { valid(X) }, 
    [a]. 
foo(X)--> 
    [b]. 

ますので、ワードカウンタのいくつかの並べ替えを追加することができます。もちろん、各トークンが単語であれば、length(L、N)、N < 11、start(L、[])のように書くことができます。一方、制約の複雑さに応じて、異なる部分にエンコードするほうが良いかもしれません。コンパイラの中のparser-> semantic checkerのようなものです。

関連する問題