別のリストの既存のアトムに基づいて、リストに新しいアトムを生成する方法を知りたいです。指定されたリスト:
L=[a,b,c,d]
たとえば、新しいリストを作成したいと思います。
P=[a_,b_,c_,d_]
つまり、文字列の追加に似たものです。
String str1 = str2 + "_";
別のリストの既存のアトムに基づいて、リストに新しいアトムを生成する方法を知りたいです。指定されたリスト:
L=[a,b,c,d]
たとえば、新しいリストを作成したいと思います。
P=[a_,b_,c_,d_]
つまり、文字列の追加に似たものです。
String str1 = str2 + "_";
atom_concat/3
ここで使用するのはISOビルトインです。
?-atom_concat(a、'_'、A)。 A=a_。
しかし、リスト全体を要素ごとにマッピングするにはどうすればよいでしょうか。maplist/3
この目的を果たし、
?-maplist(atom_concat('_')、[a、b、c、d]、Xs)。% 間違い! Xs = ['_a'、'_b'、'_c'、'_d']。
...またはほとんど。前にアンダースコアを追加しました!maplist/3
他の多くの高階述語と同様に、最後に追加の引数を追加します。関数型プログラミング言語では、これは部分適用と呼ばれます。しかし、私たちの場合、前に1つ、最後に1つの引数を追加すると便利です。あなたは次のようなあなた自身の定義を作ることができます
Supplement_prefix_concat(S、P、C):- atom_concat(P、S、C)。
これはうまく機能しますが、
?-maplist(suffix_prefix_concat('_')、[a、b、c、d]、Xs)。 Xs = [a_、b_、c_、d_]。
...それ自体に欠点があります。新しい定義を作成するのは非常に面倒なことがよくあります。考えてみてください。1回の使用で新しい名前を見つけなければなりません。これに対する一般的な解決策library(lambda)
は、YAPにプリインストールされているもので、SWI用にダウンロードすることもできます。GNU、B、SICStusなどのISO準拠システムで機能する一般的なISO定義については、リンクを参照してください。
?-maplist(\ P ^ C ^ atom_concat(P、'_'、C)、[a、b、c、d]、Xs)。 Xs = [a_、b_、c_、d_]。
そして、suffix_prefix_concat
上記と同様に最後の引数を回避できるので、よりコンパクトに書くことができます。
?-maplist(\ P ^ atom_concat(P、'_')、[a、b、c、d]、Xs)。 Xs = [a_、b_、c_、d_]。
すべての Prolog システムで利用できるかどうかはわかりませんが、うまくいくconcat_atom/2
でしょう:
?- concat_atom([a,'_'], A).
A = a_.