String sicstus prolog:将字符串附加到变量';s值以创建新变量
我想知道是否有任何方法可以将字符串值附加到变量的值以创建新变量。 我在想:String sicstus prolog:将字符串附加到变量';s值以创建新变量,string,variables,prolog,String,Variables,Prolog,我想知道是否有任何方法可以将字符串值附加到变量的值以创建新变量。 我在想: 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 Prolog中有效(加载lib(iso_light)): 它可以像SICStus一样工作,或者可能需要非常小的修改 您也可以尝试atom\u con
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 Prolog中有效(加载
lib(iso_light)
):
它可以像SICStus一样工作,或者可能需要非常小的修改
您也可以尝试atom\u concat/3
,但有些Prolog系统可以自动将数字转换为atom,而其他系统则不能
这适用于SWI Prolog,但不适用于B-Prolog或ECLiPSe CLP:
V = 7, atom_concat('S', V, NW).
您的示例使用原子而不是字符串。原子可以是一个不带引号的单词,也可以是一个带引号的单词,用撇号(“
)分隔。例如:
是一个原子foo
也是一个原子“这是一个带引号的原子”
1234
)和空列表。原子的定义特征是它是原子的(不可分割)
另一方面,序言字符串总是用双引号(“
)分隔,是字符列表(整数代码点)的简写形式。一些示例:
与空列表”
(恰好是一个原子)完全相同[]
与列表“abc”
完全相同[97,98,99]
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\u chars/2
和number\u 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\u concat\3:
foo( Atom , Number , Concatenation ) :-
number_chars( Number, Ds ) ,
atom_chars( Sfx , Ds ) ,
atom_concat( Pfx , Sfx , Concatenation )
.
foo( Atom , Number , Concatenation ) :-
number_chars( Number, Ds ) ,
atom_chars( Sfx , Ds ) ,
atom_concat( Pfx , Sfx , Concatenation )
.