append/3
は非常に強力な述語です。 SWI-Prologの文字列の場合と同じように動作する述語が必要だとします。SWI-Prologの可逆述語と文字列
私が見る最も簡単なアプローチは、でリストに変換してからappend/3
を適用し、次にを使用します。このアプローチの大きな問題は、両方の変数が統合されていない場合、が機能しないことです。ここで
は私が必要なときを適用するために統一されている文字列をチェックする、思い付いた非常に醜いソリューションです:
?- append_strings("test","auie","testauie").
true.
?- append_strings("test",A,"testauie").
A = "auie".
?- append_strings(A,"auie","testauie").
A = "test" ;
false.
?- append_strings(A,B,"testauie").
A = "",
B = "testauie" ;
A = "t",
B = "estauie" ;
A = "te",
B = "stauie" ;
A = "tes",
B = "tauie" ;
A = "test",
B = "auie" ;
A = "testa",
B = "uie" ;
A = "testau",
B = "ie" ;
A = "testaui",
B = "e" ;
A = "testauie",
B = "" ;
false.
:
append_strings(S1, S2, S3) :-
nonvar(S1),
nonvar(S2),!,
string_codes(S1, A),
string_codes(S2, B),
append(A,B,C),
string_codes(S3, C).
append_strings(S1, S2, S3) :-
nonvar(S1),
nonvar(S3),!,
string_codes(S1, A),
string_codes(S3, C),
append(A,B,C),
string_codes(S2, B).
append_strings(S1, S2, S3) :-
nonvar(S2),
nonvar(S3),!,
string_codes(S2, B),
string_codes(S3, C),
append(A,B,C),
string_codes(S1, A).
append_strings(S1, S2, S3) :-
nonvar(S3),
string_codes(S3, C),
append(A,B,C),
string_codes(S1, A),
string_codes(S2, B).
これは、次のような場合のために正しい結果が得られ
これより簡単にする方法はありませんか?私はリストと同じように文字列を扱う述語をたくさん作成したいと考えています。私は明らかにそれらのすべてのためにappend/3
のために行ったことを書く必要はありません。しかし、コード・ストリングで作業したくないのは、通常のリストを操作しているのか実際にストリングを操作しているのかを知る方法がないからです。
最も簡単な方法は、文字列を直接使用しないことです。代わりに['chars'を使う](http://stackoverflow.com/a/36645725/772868)。 – false
'append_strings(Xs、Ys、Zs)'の定義が失敗します。むしろインスタンス化エラーを生成するはずです。 – false
@falseしかし、私はリストと文字列を区別することはできません。リストを転置する述語転置が必要だとしますが、文字列に対しては改行に従って転置します。文字のリストでは、文字列で作業しているかどうかを知る方法がありません。 – Fatalize