私は1つの問題のこれらのタイプのためにdcg可能な場合を使用する必要があります@matに同意します。
ここには別のルールがあります。
abs --> [a].
abs --> [a,b].
abs --> [a,b], abs.
?- phrase(abs, Ls).
Ls = [a] ;
Ls = [a, b] ;
Ls = [a, b, a] ;
Ls = [a, b, a, b] ;
Ls = [a, b, a, b, a] ;
Ls = [a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a] ;
Ls = [a, b, a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a, b, a]
興味深いことに、これらのルールは、あなたがDCGを使用しない場合は、その後、私はあること@matに同意すると示唆Using Definite Clause Grammars in SWI-Prolog
から演習の一つであり、この変化
abs2 --> [].
abs2 --> [a].
abs2 --> [a,b], abs2.
?- phrase(abs2, Ls).
Ls = [] ;
Ls = [a] ;
Ls = [a, b] ;
Ls = [a, b, a] ;
Ls = [a, b, a, b] ;
Ls = [a, b, a, b, a] ;
Ls = [a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a] ;
Ls = [a, b, a, b, a, b, a, b]
から開始標準のProlog構文でDCGを表示するにはlisting/1
を使用します。彼らはそのように使用することができ、通常のPrologルールとして
listing(abs).
abs([a|A], A).
abs([a, b|A], A).
abs([a, b|A], B) :-
abs(A, B).
listing(abs2).
abs2(A, A).
abs2([a|A], A).
abs2([a, b|A], B) :-
abs2(A, B).
:
abs(X,[]).
X = [a] ;
X = [a, b] ;
X = [a, b, a] ;
X = [a, b, a, b] ;
X = [a, b, a, b, a] ;
X = [a, b, a, b, a, b] ;
X = [a, b, a, b, a, b, a]
abs2(X,[]).
X = [] ;
X = [a] ;
X = [a, b] ;
X = [a, b, a] ;
X = [a, b, a, b] ;
X = [a, b, a, b, a] ;
X = [a, b, a, b, a, b]
ありがとう! それは面白いです、それ以前にそれにつまずくことはなかったし、私は確かに私の大学のコースでそれを学ぶことはありません、それは貴重な情報です! 私は再帰殺しを訓練してスクリプトを作成しています。私はDCGが私の試験で受け入れられるかどうかわかりませんので、伝統的な方法で解決策を探しています:) –
"伝統的な方法" 「読みにくい」という意味では、次のクエリを使用して、DCGに対応するプレーンなPrologコードを取得するだけです: '? - listing(abs // 0)、listing(abs_rest // 0)あなたのインストラクターにそれを渡して、おそらく同じことを表現するもっと複雑な方法があるときに、なぜ適合する形式を使用するのかという理由で、おそらくあなたが使えないより良い解決策があることを知っていますか? – mat
伝統は、私が必要とするものを記述するのに最適な言葉ではありませんでした。 私は、Head、Tail、およびリストの再帰プロパティを使用してのみ記述しています。そのような方法で: ab([a])。 ab([b、a | T]): - ab([a | T])。 ab([a、b | T]): - ab([b | T])。 –