There are two approaches to concatenation. One is to provide a concatenation function that takes some number of text objects and yields their concatenation. The other is to provide a concatenation relation.
Quintus Prolog provides a built-in concatenation relation
for lists, namely append/3. This concatenation
relation can perforce be applied to lists of character codes.
| ?- ensure_loaded(library(printchars)).
| ?- append("app", "end", X).
X = "append"
| ?- append(X, "end", "intend").
X = "int"
| ?- append(_, [C|_], "to be written"),
| put(C), fail.
to be written
no
library(strings) contains a concatenation relation for text objects.
This relation was inherited from the DEC-10 Prolog library. The
original code was written to support gensym/2 (described in lib-txp-ato)
and then generalized.
concat(?Text1, +Constant2, ?Text3)
name(Text1, Name1),
name(Constant2, Name2),
name(Text3, Name3),
append(Name1, Name2, Name3)
is true. It can be used to solve for Text1 given the
other two arguments or to solve for Text3 given the
other two arguments, but unlike append/3 it cannot be used to
solve for Constant2.
This definition is retained for backwards
compatibility with the DEC-10 Prolog and C-Prolog libraries, and with
earlier versions of the Quintus library. concat/3 may be
removed from future versions of the Quintus library.
There is a proper concatenation relation that is exactly
analogous to append/3:
string_append(?A, ?Z, ?AZ)
name(A, NameA),
name(Z, NameZ),
name(AZ, NameAZ)
append(NameA, NameZ, NameAZ)
is true. It can be used to solve for any one of its arguments given the other two.
As a point of interest, string_append/3 could have been defined
using midstring/4, which is defined below.
append_strings(A, Z, AZ) :-
midstring(AZ, A, Z, 0).
Examples:
| ?- concat(app, end, X).
X = append
| ?- string_append(app, end, X).
X = append
| ?- concat(X, end, append).
X = app
| ?- string_append(X, end, append).
X = app
| ?- concat(app, X, append). % SURPRISE!
no
| ?- string_append(app, X, append).
X = end
| ?- concat(app, 137, X).
X = app137
| ?- string_append(app, 137, X).
no
| ?- concat(X, Y, ab). % SURPRISE!
no
| ?- string_append(X, Y, ab).
X = '', Y = ab ;
X = a, Y = b ;
X = ab, Y = '' ;
no