2014-03-30 46 views
0

如何在SWI Prolog中重命名变量?重命名SWI Prolog中的变量

我试图使用这样的numbervars谓词。

numbervars(Xs,1,_,[functor_name(name)]). 

所以,如果X 5是4个变量列表,它看起来是这样,当我犯“writeln(XS)”。

[name(1),name(2),name(3),name(4)] 

如何使用该函子,或任何其他方式去除括号,使其看起来像:

[name1,name2,name3,name4] 

在此先感谢。

回答

2

你可以编写自己的子集numbervars/4(或者如果你愿意,可以完全重写你自己的)。下面是执行您所描述的特定任务的一个子集:

build_atoms([Var|VarList], N, Prefix) :- 
    atom_number(Atom, N), 
    atom_concat(Prefix, Atom, Var), 
    N1 is N + 1, 
    build_atoms(VarList, N1, Prefix). 
build_atoms([], _, _). 

此接受变量的列表,并在Prefix给出contactenated与整数,开始N原子实例化它们的序列。

例如:

?- X = [A,B,C], build_atoms(X, 1, foo). 
X = [foo1, foo2, foo3], 
A = foo1, 
B = foo2, 
C = foo3. 

?- 

这可以很容易地扩展到包括在numbervars任何其他功能,你的愿望。

+0

谢谢,它的工作原理。 – Mockingbird

+0

还有一件事请。 看起来像我不能在使用build_atoms之后为那些变量赋值。那么,它毕竟是有意义的。 有什么办法可以使[Foo1,Foo2,Foo3]代替[foo1,foo2,foo3]。 这样当我运行?-foo(X)时,X = [0,1,1]。 其中foo(X): - 长度(X,3),build_atoms(X,1,)。 它会工作吗? 我的意思是,这些名称取代了我的程序中稍后将被赋值的真实值。我希望它只是当我将它打印到终端时的变量名称。 我希望我很清楚,再次感谢。 – Mockingbird

+0

@Mockingbird我明白了。如果你想要动态变量名称的效果,也许更典型的方法是使用键/值对。因此,您可以使用'build_atoms'来创建键名称,然后在列表中看起来像'[foo1-val1,foo2-val2,...]'的值。 – lurker