無限の解があるにもかかわらず、解を制限するのを助ける方法としてこれを書きました。しかし、最初に短い結果が得られるようにルールを再構成する方法があることに気付きました。
beforeを満たそうとするad --> a, ad, d.
前に評価されるから です。前に置きます。andルールについても同様です。ad --> bc.
ad --> a, ad, a.
ad --> bc.
ad --> bc.
ad --> a, ad, a.
bc --> b, b, bc, c, c.
bc --> [].
アリアンが指摘したように、終了ルールを最初に適用すると、より短いソリューションが最初に見つかるようになります。
[]
また、 s と s -> ad -> bc -> [] に は 2 つの解決策があることも指摘したいと思いs --> [].
ます。これは冗長なので削除します。
全体として、私はこの解決策を試します:
s --> ad.
a --> [a].
b --> [b].
c --> [c].
d --> [d].
ad --> bc.
bc --> [].
ad --> a, ad, d.
bc --> b, b, bc, c, c.
元の投稿:
数え方を調べる必要がありました (prolog を行ってからしばらく経ちました) しかし、無限の数があり、prolog はすべての解を見つけようとするため、検索が停止することはありません。その前にフローまたはいくつかのエラー:)。
結果の数を制限する 1 つの方法は、ソリューションのサイズを制限することです。
phrase(s, X), length(X, 4).
ちょうど 4 つの値を持つすべてのソリューションを取得します。
X = [a, a, d, d]
X = [b, b, c, c]
6 に増やすと、次のようになります。
X = [a, a, a, d, d, d]
X = [a, b, b, c, c, d]
または範囲を使用します。
phrase(s, X), length(X, Y), Y >= 4 , Y < 10, Y != 6.