2014-03-28 29 views

回答

0

我没有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). 
1

你的示例使用原子而非。一个原子可以是一个不加引号的空格引用字,用撇号(')分隔。例如:

  • 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/2number_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) 
    . 
相关问题