2016-11-25 22 views
0

在终端中询问b序言时,成员函数似乎在将列表分配给变量并将该变量与构建在“成员”功能。我在使用变量时无法解释结果。谁能告诉我这是否是正确的行为,为什么是这样?使用分配给变量的列表时,b-prolog成员函数的行为可疑

B-Prolog Version 8.1, All rights reserved, (C) Afany Software 1994-2014. 
| ?- List = [a,b,c,d]. 
List = [a,b,c,d] 
yes 
| ?- member(a,List). 
List = [a|_14c] ?; 
List = [_148,a|_154] ?; 
List = [_148,_150,a|_15c] ?; 
List = [_148,_150,_158,a|_164] ?; 
List = [_148,_150,_158,_160,a|_16c] ? 
yes 

| ?- member(a,[a,b,c,d]). 

yes 
| ?- 

我使用bprolog v 8.1在Windows 10运行临(10.0.143393建设14393)

+3

顶级请求'member(a,List).'返回所有可能的成员为'a'的列表。这是正确的行为。 –

回答

1

顶级查询是独立的,不共享变量。如果您尝试改为:

| ?- List = [a,b,c,d], member(a,List). 

您将获得预期结果。

+0

好的,这很有道理,但是我如何解释我在第一次调用中看到的结果,看起来好像是无限的,如果成员调用中不存在List,那么奇怪的列表结构的响应是什么? – sbarnard

+1

查看Stanislav的评论。换句话说,在这种情况下,'member/2'谓词就像一个* generator *。即它会生成长度增加的包含原子“a”的列表。您可以将结果看作列表*模板*。因此,例如,任何在第一个位置带有“a”的列表都是一个解决方案。该列表由术语'[a |尾巴]'尾巴'可以是任何列表。请注意,以下划线开头的解决方案中的所有术语都是变量。 –