2012-03-06 57 views
1

我想追加到一个变量,N,这是绑定到一个数字的列表。序言追加变量列表

N = 1. 

append([N], [2,3,4], Z). 

Z = [N,2,3,4]. //Wrong output! 

我想Z = [1,2,3,4]

如何追加一个变量,而不是实际的变量本身的数量一部分?

回答

4

恐怕Prolog没有像你习惯的变量赋值,只是变量绑定。因此, “声明”

N = 1. 
append([N], [2,3,4], Z). 

实际上构成两个完全不相关的查询。幸运的是,你想要的效果可以通过结合你的查询来实现:

N = 1, append([N], [2,3,4], Z). 

如果你真的需要一个全局变量,你总是可以使用一个事实或asserta/1动态定义之一。

另请注意:未来,您可能需要确保在处理数字时使用is而不是=

+1

魔鬼的细节。 “” vs“,”所有的区别。 – CyberShot 2012-03-06 04:09:41

+0

@ daniel-lyons:使用'is'慢于'=',因为右边被评估,即使它只是一个简单的数字。显然,这可能取决于特定的Prolog系统,效果很小,但对于原始速度,使用统一。 – twinterer 2012-03-06 12:22:56

+0

@twinterer我对'is'的评论与那些输入'N = 1 + Y'的初学者通常希望添加发生的事实有关。 :) – 2012-03-06 16:23:06

2

您正在使用哪个Prolog?我知道的所有序言,将首先产生一个N = 1的答案。这应该清楚地表明,Prolog首先回答了询问N = 1N = 1,这可能起初看起来有点奇怪。例如,这里是GNU:

| ?- N = 1. 

N = 1 

yes 
| ?- 
append([N], [2,3,4], Z). 

Z = [N,2,3,4] 

yes