3

私はプロローグに不慣れです。

オープンブレースとクローズブレース内のコマ区切り値の形式で指定された変数であるプロローグ入力を、形式の(a,z,b)プロローグリストに変換する必要があり[a,z,b]ます。

誰か助けてもらえますか?

4

2 に答える 2

4

シーケンスの主な関手は、/ 2であり、リストの主な関手は./2です。したがって、

% call: convert(+Sequence,-List)
convert(','(A,B), [A|B1]) :- !, convert(B,B1).
convert(A,[A]).

シーケンスの要素は変換されるべきではないと思います:

?- convert((1,2,3),L).
L = [1, 2, 3].

?- convert((1,(2,3),4),L).
L = [1, (2, 3), 4].
于 2012-05-01T06:10:57.833 に答える
2

アレクサンダーが上で書いたことに加えて:リストを説明するときによくあることですが、この場合、特にタプル内のタプルをフラット化する場合は、DCGが適しています。

tuple_list((A,B)) --> !, tuple_list(A), tuple_list(B).
tuple_list(A)     --> [A].

アレクサンダーが言及した2番目のケースは現在機能しています(これが必要な場合に備えて):

?- phrase(tuple_list((1,(2,3),4)), Ls).
Ls = [1, 2, 3, 4].

ユースケースではこれは必要ないと思いますが、必要な場合は、このDCG表記の使用を検討してください。それ以外は、このタプル表現は、処理するために「デフォルト」の場合(2番目のルール)が必要なため「デフォルト」と呼ばれます。これは、述語を両方向で使用できないため、あまり良くありません。専用のファンクターを使用してさまざまなケースを説明する方がクリーンです。たとえば、(a、b、c)の代わりにtriple(a、b、c)のような用語を使用してトリプルを表し、リストを使用して任意の長さのシーケンスを表すなど、変換述語はさらに多くなります。宣言的で、あらゆる方向で使用できます。

于 2012-05-01T18:41:55.207 に答える