我想知道是否有任何方法可以将字符串值附加到变量的值来创建新变量。 我在想什么:
V = 7,
foo(V) :-
NV = 'S'+V.
所以我希望NV最后得到S7值,S7是一个新变量。 (V先前在某处分配了值7。)
答案 0 :(得分:1)
您的示例使用 atom 而不是字符串。原子是一个未加引号的 bareword 或一个引用的词,用撇号('
)分隔。例如:
foo
是一个原子。'This is a quoted atom'
也是一个原子其他类型的原子包括整数(1234
)和空列表[]
。原子的定义特征是原子(不可分割)。
另一方面,prolog 字符串 总是用双引号("
)分隔,并且是字符列表的简写(整数代码)点)。一些例子:
""
与空列表[]
(恰好是原子)完全相同。"abc"
与列表[97,98,99]
完全相同。因此,您应该清楚是否要使用 atom 或 string 。
从你的例子中假设你在谈论原子......
在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 )
.
答案 1 :(得分:0)
我没有SICStus Prolog,但这适用于SWI-Prolog 6.2.6,B-Prolog 8.1和ECLiPSe CLP Prolog(加载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).