我想知道是否有任何方法来追加一个字符串值到变量的值来创建一个新的变量。 我在想什么:sicstus序言:追加字符串到一个变量的值来创建一个新变量
V = 7,
foo(V) :-
NV = 'S'+V.
所以我想NV有到底S7值,S7是一个新的变量。 (V在前面的某个地方被赋值为7)。
我想知道是否有任何方法来追加一个字符串值到变量的值来创建一个新的变量。 我在想什么:sicstus序言:追加字符串到一个变量的值来创建一个新变量
V = 7,
foo(V) :-
NV = 'S'+V.
所以我想NV有到底S7值,S7是一个新的变量。 (V在前面的某个地方被赋值为7)。
我没有SICStus Prolog的,但这部作品在SWI-Prolog的6.2.6,B-Prolog的8.1和Eclipse CLP序言(加载lib(iso_light)
后):
V = 7, number_chars(V, N), atom_chars('S', A), append(A, N, X), atom_chars(NW, X).
它可以作为工作中SICStus,或者可能需要非常小的修改。
您也可以尝试atom_concat/3
,但是一些Prolog系统可以自动将数字转换为原子,而其他的则不然。
这工作在SWI-Prolog的,但不是在B-Prolog的或ECLIPSE CLP:
V = 7, atom_concat('S', V, NW).
你的示例使用原子而非串。一个原子可以是一个不加引号的空格或引用字,用撇号('
)分隔。例如:
foo
是一个原子。'This is a quoted atom'
也是原子其它类型的原子包括整数(1234
)和空列表[]
。原子的定义特征是它是原子(不可分割)。
甲序言串,在另一方面,是总是用双引号("
)界定,并且为字符的列表(整数代码点)的简写。一些例子:
""
是完全一样的空列表[]
(这恰好是一个原子)。[97,98,99]
完全一样。所以,你应该清楚你是否打算用原子或串。
从你的榜样,你在谈论原子...
在这两个Sicstus和SWI Prolog的假设,你应该能够使用name/2
。为了您的具体的例子,你应该能够简单地说:
foo(X , Y) :-
name('S' , [S]) ,
name(X , Codes) ,
name(Y , [S|Codes])
.
更一般地,你应该能够说:
foo(AtomicPrefix , NumericSuffix , Concatenation) :-
name(AtomicPrefix , Pfx ) ,
name(NumericSuffix , Sfx ) ,
append(Pfx , Sfx , Codes) ,
name(Concatenation , Codes)
.
然而,name/2
不符合ISO标准。相反,你可以以类似的方式使用atom_chars/2
和number_chars/2
:
foo(X, Y) :-
number_chars(X,Xs) ,
atom_chars(Y,['S'|Xs])
.
,或者更一般地说,
foo(AtomicPrefix , NumericSuffix , Concatenation) :-
atom_chars(AtomicPrefix , Pfx ) ,
number_chars(NumericSuffix , Sfx ) ,
append(Pfx , Sfx , Chars) ,
atom_chars(Concatenation , Chars)
.
或者你应该能够使用atom_concat\3
沿着这些线路:
foo(Atom , Number , Concatenation) :-
number_chars(Number, Ds) ,
atom_chars(Sfx , Ds) ,
atom_concat(Pfx , Sfx , Concatenation)
.