私はプロローグに不慣れです。
オープンブレースとクローズブレース内のコマ区切り値の形式で指定された変数であるプロローグ入力を、形式の(a,z,b)
プロローグリストに変換する必要があり[a,z,b]
ます。
誰か助けてもらえますか?
シーケンスの主な関手は、/ 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].
アレクサンダーが上で書いたことに加えて:リストを説明するときによくあることですが、この場合、特にタプル内のタプルをフラット化する場合は、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)のような用語を使用してトリプルを表し、リストを使用して任意の長さのシーケンスを表すなど、変換述語はさらに多くなります。宣言的で、あらゆる方向で使用できます。