1

私は明確な句の文法内での統一の概念を理解しようとしています.次のDCGから答えを得る方法を段階的に説明できる人です.

s --> symbols(Sem,a), symbols(Sem,b).

symbols(s(end),S) --> [S].
symbols(s(Sem),S) --> [S], symbols(Sem,S).

答えは生成aaabbbされますが、私は何年にもわたってウェブを検索して、この答えを得る方法を見つけようと試みてきました。何が起こっている。

同様の例は、DCG のウィキペディア ページで見つけることができますが、aaabbbccc.

ありがとう

4

2 に答える 2

2

考えられるすべての文について尋ねることから始めます。たとえば、最も一般的なクエリを使用できます。

?- phrase(s,L).
L = [a, b] ;
L = [a, a, b, b] ;
L = [a, a, a, b, b, b] ;      % this is your example
L = [a, a, a, a, b, b, b, b] ...

ただし、一般に、このメソッドは不当な方法で回答/ソリューションを列挙する可能性があります。これにより、短い例を非表示にします。長さ順に並べられたすべてのソリューションを確実に見つけるには、次のようにします。

?- length(L,N), phrase(s,L).

この場合、違いはありません。ただしsymbol(0,_) --> [].、他のすべてのルールの後にルールを追加することを考えてください。L = []最初のクエリには表示されず、「無限に多くのソリューションによって隠されています」が、2 番目のクエリでは最初のソリューションとして表示されます。

したがって、あなたが示したより複雑な例を理解しようとする前に[a, b]、それが最も単純な例であることを考慮してください。

もう 1 つのアプローチは、クエリを分析し、phrase(s, L)その各構成要素を検討することです。

?- phrase(symbols(Sem,a),L).
Sem = s(0),
L = [a] ;
Sem = s(s(0)),
L = [a, a] ;
Sem = s(s(s(0))),
L = [a, a, a] 

したがって、この部分と同じ withbが文全体を表します。

于 2014-06-18T09:01:27.380 に答える
1

述語symbolsは、リストからN時間を取得Sします。しかし、Nは「通常の」数値としてエンコードされず、ペアノ算術の数値のようにエンコードさends(N)ますN+1

条項

symbols(s(end),S) --> [S].

は 1 つの要素を取りますSs(end)ナンバーワンを表す用語として解釈できます。

条項

symbols(s(Sem),S) --> [S], symbols(Sem,S).

1 つの要素を取りS、同じ要素を持つシンボルを再帰的に呼び出します。ここでも、数値として解釈s(Sem)します: つまり、N+1( s(Sem)) 要素を取得するにはS、最初に要素を 1 つ取得し、次に要素Sを再帰的に取得します。NS

述語sは as の数を取り、次に同じ数の bs を取ります。

最初の解決策は、実際にはが最初の規則に一致し、 と一致するためabです。次にが呼び出され、一致するルールは最初のルールのみです。symbols(Sem,a)Sems(end)symbols(s(end),b)

于 2014-06-18T08:47:49.590 に答える