Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String sicstus prolog:将字符串附加到变量';s值以创建新变量_String_Variables_Prolog - Fatal编程技术网

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]
    完全相同
所以你应该清楚你是想用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\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 )
  .