考えられるすべての文について尋ねることから始めます。たとえば、最も一般的なクエリを使用できます。
?- 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
が文全体を表します。