2012-05-01 17 views

答えて

4

シーケンスの主ファンクタは、リストの/ 2です./2です。

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

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

実際には、( '、')/ 2と '。'/2です。 – false

+0

はい、もちろんです。 –

2

アレクサンダーは、上記の書いたものに加えて:として、多くの場合、リストを記述する際、DCGsはこの中にもぴったりですしたがって、

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

私は、シーケンスの要素を変換してはならないことを前提とし

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

アレクサンダーは、今述べた作品第二ケース(念のためにあなたはこれが欲しい):あなたはまた、タプル内のタプルを平らにしたい場合は特に場合、

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

私はこれをあなたのユースケースでは必要ないと思いますが、そうした場合、このDCG表記の使用を検討してください。それ以外の場合、このタプル表現は "defaulty"と呼ばれます。なぜなら、それを処理するための "デフォルト"のケース(第2のルール)が必要であり、これは両方向で述語を使用できないためです。異なるケースを記述するために専用のファンクタを使用する方がよりクリーンです。たとえば、(a、b、c)の代わりにtriple(a、b、c)のような項を使用して、トリプルを表す、任意の長さのシーケンスを表すリストなどを使用して、変換述部はもっと多くなります宣言的であり、すべての方向で使用可能です。

関連する問題